diff --git a/.sconf_temp/conftest_1.c b/.sconf_temp/conftest_1.c new file mode 100644 index 0000000000000000000000000000000000000000..0a5694faf5309e4deb48bfb053aa11b0ed083ea9 --- /dev/null +++ b/.sconf_temp/conftest_1.c @@ -0,0 +1,3 @@ + +#include "sys/xattr.h" + diff --git a/.sconf_temp/conftest_2.c b/.sconf_temp/conftest_2.c new file mode 100644 index 0000000000000000000000000000000000000000..fb155adbba464d4cf8dd90c1074e06a275776b65 --- /dev/null +++ b/.sconf_temp/conftest_2.c @@ -0,0 +1,3 @@ + +#include "xos_ams.h" + diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index a7ff75344d1d009f47c3d7c7b09108301ef10d64..0000000000000000000000000000000000000000 --- a/AUTHORS +++ /dev/null @@ -1,7 +0,0 @@ -Eugenio Cesario -Juan Gonzalez -Felix Hupfeld -Björn Kolbeck -Felix Langner -Christian Lorenz -Jan Stender diff --git a/COPYING b/COPYING deleted file mode 100644 index 5b6e7c66c276e7610d4a73c70ec1a1f7c1003259..0000000000000000000000000000000000000000 --- a/COPYING +++ /dev/null @@ -1,340 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/ChangeLog b/ChangeLog deleted file mode 100644 index 36c0401bc8b9be7facea4e5319c750b6310de28e..0000000000000000000000000000000000000000 --- a/ChangeLog +++ /dev/null @@ -1,106 +0,0 @@ -13-AUG-2009 version 1.0 release - * read-only replication working - -24-AUG-2009 - * fcntl lock support (on OSD) - * switched to MRC supplied inode/dev numbers by default - Some applications (e.g. Dovecot) use the inode number to - identify fds pointing to the same file. This does not work - with "local" inode numbers assigned by fuse. - * updated the BabuDB release - fixed a problem with manual checkpoint creation - * hostname used by MRC can be set with hostname property in config file - Necessary if the FQDN is not set/returned correctly on that host. - * OSDs run on Windows - -03-SEP-2009 - * DIR service uses new on-disk format which is independent of the - protocol version. - * MRC database format changed (USE DUMP/RESTORE WHEN UPDATING FROM 1.0) - compeletely redesigned the policies. There is now only one type of - policies for OSD selection and replica creation/selection - -15-SEP-2009 - * added on-close replication support - Replicas can now be automatically created when a file is closed - after having been written the first time. This causes the file - to become read-only. The behavior of on-close replication can - be controlled via the xtfs_repl tool. - * fixed SSL problems on Windows - * added support for user authentication based on gridmap files - * improved client performance by eliminating unnecessary system calls - * data cache now uses stripe size instead of system page size - * fixed bugs #38, #41, #42, #43, #45, #49 - -16-SEP-2009 version 1.1 release - * fixed bugs #51, #52, #53 - * added notification mechanism to DIR that sends notification mails to - an admin if an OSD or MRC has failed - -26-OCT-2009 - * Linux binaries for mounting, creating, removing and listing volumes have - been renamed, in order to be more consistent with Linux conventions - -04-NOV-2009 - * If an admin password is set, server status pages are now password-protected. - -05-NOV-2009 - * added GRID SSL mode - When enabled (requires SSL to be enable too), XtreemFS will fall back to - plain TCP after a successful SSL handshake. Enabled in services with - "ssl.grid_ssl=true" in the config file. Client requires certificates - and oncrpcg:// scheme when mounting. - -25-NOV-2009 - * MRC and OSD wait up to 30s (or as long as defined in startup.wait_for_dir) - for the DIR during start-up. - * added xctl: a script to start and stop the XtreemFS services - * mount.xtreemfs checks for successfull mount before going into background - * fixed the return value for xattr calls which caused problems with the - Mac OS X Finder - -27-NOV-2009 - * client caches file size updates by default (flushed on close, fsync) - * OSD and MRC status pages can be used to get full stack traces (/strace) - -03-DEC-2009 - * capability timeout is now a config option for the MRC - (capability_timeout), default is 600s. - * MRC dump/restore are now asynchronous. Backups of the MRC can be done - without interrupting regular operations. - * closest replicas of a file can now be selected based on Vivaldi - coordinates (see User Guide) - * fixed bugs #36, #54, #57, #58, #59, #60, #64, #66, #77, #78, #80, #81, - #82, #83 #96, #97 - -07-DEC-2009 - * java client for XtreemFS (interface is still unstable!) in package org.xtreemfs.common.clients - * experimental hadoop FileSystem driver for XtreemFS (in trunk/contrib/hadoop) - -08-DEC-2009 - * added web-based admin console (in trunk/contrib/console) - -09-DEC-2009 - * added per-file block size (st_blksize) to struct Stat; - used by cp to determine I/O buffer sizes on Linux - -11-DEC-2009 - * version 1.2. release - -16-DEC-2009 - *fixed issue #109 - -08-JAN-2010 - * status of servers can now be set by admins (online, offline, etc.) - * scrubber now removes dead replicas and creates new ones, marks full replicas as complete if needed - -13-JAN-2010 - * fixed issues #55 and #75 - * added UUID-based OSD selection policy to default policies - -22-JAN-2010 - * added client support for Fedora 12 - -9-FEB-2010 - * when deciding which OSD to contact to recalculate their position, nodes now choose - more frequently the OSDs that are closer. diff --git a/Makefile b/Makefile deleted file mode 100644 index da46b41e1104ea944a22eb79ad3e9a306a7a7190..0000000000000000000000000000000000000000 --- a/Makefile +++ /dev/null @@ -1,183 +0,0 @@ -ifeq "$(JAVA_HOME)" "" - JAVAC_BIN = /usr/bin/javac -else - JAVAC_BIN = $(JAVA_HOME)/bin/javac -endif - -ifeq "$(ANT_HOME)" "" - ANT_BIN = /usr/bin/ant -else - ANT_BIN = $(ANT_HOME)/bin/ant -endif - -WHICH_GPP = $(shell which g++) - -SHELL=/bin/bash - -XTREEMFS_JAR_DIR=$(DESTDIR)/usr/share/java -XTREEMFS_CONFIG_PARENT_DIR=$(DESTDIR)/etc/xos -XTREEMFS_CONFIG_DIR=$(XTREEMFS_CONFIG_PARENT_DIR)/xtreemfs -XTREEMFS_INIT_DIR=$(DESTDIR)/etc/init.d -BIN_DIR=$(DESTDIR)/usr/bin -MAN_DIR=$(DESTDIR)/usr/share/man/man1 -DOC_DIR_SERVER=$(DESTDIR)/usr/share/doc/xtreemfs-server -DOC_DIR_CLIENT=$(DESTDIR)/usr/share/doc/xtreemfs-client -DOC_DIR_TOOLS=$(DESTDIR)/usr/share/doc/xtreemfs-tools - -TARGETS = client server -.PHONY: clean distclean - -# Some toplevel configuration -XTFS_BINDIR = $(shell pwd)/bin -export XTFS_BINDIR - -all: check_server check_client check_test $(TARGETS) - -clean: check_server check_client $(patsubst %,%_clean,$(TARGETS)) - -distclean: check_server check_client $(patsubst %,%_distclean,$(TARGETS)) - -install: install-client install-server install-tools - -install-client: - - @if [ ! -f bin/mount.xtreemfs ]; then echo "PLEASE RUN 'make client' FIRST!"; exit 1; fi - - @mkdir -p $(DOC_DIR_CLIENT) - @cp COPYING $(DOC_DIR_CLIENT) - - @mkdir -p $(BIN_DIR) - @cp -at $(BIN_DIR) \ - bin/*.xtreemfs \ - bin/xtfs_*mount \ - bin/xtfs_vivaldi - - @mkdir -p $(XTREEMFS_CONFIG_DIR) - @cp etc/xos/xtreemfs/default_dir $(XTREEMFS_CONFIG_DIR) - - @mkdir -p $(MAN_DIR) - @cp -R man/man1/*.xtreemfs* $(MAN_DIR) - -install-server: - - @if [ ! -f src/servers/dist/XtreemFS.jar ]; then echo "PLEASE RUN 'make server' FIRST!"; exit 1; fi - - @mkdir -p $(DOC_DIR_SERVER) - @cp COPYING $(DOC_DIR_SERVER) - - @mkdir -p $(XTREEMFS_JAR_DIR) - @cp src/servers/dist/XtreemFS.jar $(XTREEMFS_JAR_DIR) - @cp src/servers/lib/BabuDB*.jar $(XTREEMFS_JAR_DIR) - @cp src/servers/lib/yidl.jar $(XTREEMFS_JAR_DIR) - - @mkdir -p $(XTREEMFS_CONFIG_DIR) -# @cp etc/xos/xtreemfs/*config.properties $(XTREEMFS_CONFIG_DIR) - # delete UUID from config-files - @grep -v '^uuid\W*=\W*\w\+' etc/xos/xtreemfs/dirconfig.properties > $(XTREEMFS_CONFIG_DIR)/dirconfig.properties - @grep -v '^uuid\W*=\W*\w\+' etc/xos/xtreemfs/mrcconfig.properties > $(XTREEMFS_CONFIG_DIR)/mrcconfig.properties - @grep -v '^uuid\W*=\W*\w\+' etc/xos/xtreemfs/osdconfig.properties > $(XTREEMFS_CONFIG_DIR)/osdconfig.properties - - @cp packaging/generate_uuid $(XTREEMFS_CONFIG_DIR) - @cp packaging/postinstall_setup.sh $(XTREEMFS_CONFIG_DIR) - @chmod a+x $(XTREEMFS_CONFIG_DIR)/postinstall_setup.sh - - @mkdir -p $(XTREEMFS_INIT_DIR) - @cp etc/init.d/xtreemfs-* $(XTREEMFS_INIT_DIR) - @chmod a+x $(XTREEMFS_INIT_DIR)/xtreemfs-* - - @echo "to complete the server installation, please execute $(XTREEMFS_CONFIG_DIR)/postinstall_setup.sh" - -install-tools: - - @if [ ! -f src/servers/dist/XtreemFS.jar ]; then echo "PLEASE RUN 'make server' FIRST!"; exit 1; fi - - @mkdir -p $(DOC_DIR_TOOLS) - @cp COPYING $(DOC_DIR_TOOLS) - - @mkdir -p $(XTREEMFS_JAR_DIR) - @cp src/servers/dist/XtreemFS.jar $(XTREEMFS_JAR_DIR) - @cp src/servers/lib/BabuDB*.jar $(XTREEMFS_JAR_DIR) - @cp src/servers/lib/yidl.jar $(XTREEMFS_JAR_DIR) - - @mkdir -p $(BIN_DIR) - @cp -at $(BIN_DIR) \ - `ls bin/xtfs_* | grep -v xtfs_.*mount` - - @mkdir -p $(MAN_DIR) - @cp -R man/man1/xtfs_* $(MAN_DIR) - -uninstall: - - @rm -rf $(DOC_DIR_SERVER) - @rm -rf $(DOC_DIR_CLIENT) - @rm -rf $(DOC_DIR_TOOLS) - - @rm -rf $(BIN_DIR)/xtfs_* - @rm -rf $(BIN_DIR)/*.xtreemfs - - @rm -f $(XTREEMFS_JAR_DIR)/XtreemFS.jar - @rm -f $(XTREEMFS_JAR_DIR)/BabuDB*.jar - @rm -f $(XTREEMFS_JAR_DIR)/yidl.jar - - @rm -f $(XTREEMFS_INIT_DIR)/xtreemfs-* - - @rm -rf $(MAN_DIR)/xtfs_* - @rm -rf $(MAN_DIR)/*.xtreemfs* - - @echo "uninstall complete" - -purge: - - @rm -rf $(DOC_DIR_SERVER) - @rm -rf $(DOC_DIR_CLIENT) - @rm -rf $(DOC_DIR_TOOLS) - - @rm -rf $(BIN_DIR)/xtfs_* - @rm -rf $(BIN_DIR)/*.xtreemfs - - @rm -f $(XTREEMFS_JAR_DIR)/XtreemFS.jar - @rm -f $(XTREEMFS_JAR_DIR)/BabuDB*.jar - @rm -f $(XTREEMFS_JAR_DIR)/yidl.jar - - @rm -rf $(XTREEMFS_CONFIG_DIR) - @rm -f $(XTREEMFS_INIT_DIR)/xtreemfs-* - - @rm -rf $(MAN_DIR)/xtfs_* - @rm -rf $(MAN_DIR)/*.xtreemfs* - - @echo "purge complete" - -check_server: - @if [ ! -e $(JAVAC_BIN) ]; then echo "javac not found! Make sure a JDK is installed and set JAVA_HOME."; exit 1; fi; - @if [ $(shell $(JAVAC_BIN) -version 2>&1 | head -n1 | cut -d" " -f2 | cut -d. -f2) -lt 6 ]; then echo "java version >= 1.6.0 required!"; exit 1; fi; - @echo "java ok" - - @if [ ! -e $(ANT_BIN) ]; then echo "ant not found! Make sure ant is installed and set ANT_HOME."; exit 1; fi; - @echo "ant ok" - -check_client: - @if [ ! $(WHICH_GPP) ]; then echo "g++ not found";exit 1; fi; - @echo "g++ ok" - -check_test: - @if [[ $(shell python -V 2>&1 | head -n1 | cut -d" " -f2 | cut -d. -f2) -lt 3 && $(shell python -V 2>&1 | head -n1 | cut -d" " -f2 | cut -d. -f1) -lt 3 ]]; then echo "python >= 2.4 required!"; exit 1; fi; - @echo "python ok" - -.PHONY: client client_clean client_distclean -client: check_client - python share/scons.py -client_clean: check_client - python share/scons.py -c -client_distclean: check_client - python share/scons.py -c - -.PHONY: server server_clean server_distclean -server: check_server - $(ANT_BIN) -D"file.encoding=UTF-8" -f src/servers/build.xml jar -server_clean: check_server - $(ANT_BIN) -D"file.encoding=UTF-8" -f src/servers/build.xml clean || exit 1; -server_distclean: check_server - $(ANT_BIN) -D"file.encoding=UTF-8" -f src/servers/build.xml clean || exit 1; - -test: check_test client server - $(XTFS_BINDIR)/xctl --autotest diff --git a/README.XOS b/README.XOS deleted file mode 100644 index a80e27771dd66d9f5134e00dd00278f811c1621b..0000000000000000000000000000000000000000 --- a/README.XOS +++ /dev/null @@ -1,12 +0,0 @@ -The ams_module is required for XtreemOS installations to allow grid users to access their home volumes. - -1. build the XtreemFS client -> make client - -2. create the policies directory -> mkdir -p /lib/xtreemfs/policies/ - -3. copy the .so file -> cp lib/libxos_ams_flog.so /lib/xtreemfs/policies/ - -The client (xtfs_mount) will automatically load the library and use the AMS for account mappings. diff --git a/SConstruct b/SConstruct deleted file mode 100644 index 5340c9c227c3db99c2f4adc6eaf801705afe31d3..0000000000000000000000000000000000000000 --- a/SConstruct +++ /dev/null @@ -1,14 +0,0 @@ -SConscript( "proj/lsfs.xtreemfs/lsfs.xtreemfs.SConscript" ) -SConscript( "proj/mkfs.xtreemfs/mkfs.xtreemfs.SConscript" ) -SConscript( "proj/mount.xtreemfs/mount.xtreemfs.SConscript" ) -SConscript( "proj/nettest.xtreemfs/nettest.xtreemfs.SConscript" ) -SConscript( "proj/rmfs.xtreemfs/rmfs.xtreemfs.SConscript" ) - -Import( "build_env", "build_conf" ) - -build_env.SharedLibrary( "lib/gridmap_flog", "src/policies/gridmap_flog.c" ) - -if build_conf.CheckCHeader( "xos_ams.h" ): - build_env.SharedLibrary( "lib/xos_ams_flog", "src/policies/xos_ams_flog.c" ) - - diff --git a/bin/generate_src_and_proj.py b/bin/generate_src_and_proj.py deleted file mode 100755 index 65b6d9f75d7047f165ce4da3f34d16048874ec43..0000000000000000000000000000000000000000 --- a/bin/generate_src_and_proj.py +++ /dev/null @@ -1,444 +0,0 @@ -# Copyright (c) 2010 NEC HPC Europe -# All rights reserved -# -# This source file is part of the XtreemFS project. -# It is licensed under the New BSD license: -# -# 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 the XtreemFS project nor the -# names of its contributors may be used to endorse or promote products -# derived from this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -import sys -from os import chdir, listdir, sep as os_sep -from os.path import abspath, dirname, exists, join, splitext -from optparse import OptionParser - - -# Constants -MY_DIR_PATH = dirname( abspath( sys.modules[__name__].__file__ ) ) - -GOOGLE_BREAKPAD_DIR_PATH = join( MY_DIR_PATH, "..", "share", "google-breakpad" ) -GOOGLE_BREAKPAD_INCLUDE_DIR_PATHS = ( join( GOOGLE_BREAKPAD_DIR_PATH, "src" ), ) -GOOGLE_BREAKPAD_OUTPUT_FILE_PATH = join( MY_DIR_PATH, "..", "lib", "google-breakpad" ) - -YIDL_DIR_PATH = abspath( join( MY_DIR_PATH, "..", "..", "yidl" ) ) -YIELD_DIR_PATH = abspath( join( MY_DIR_PATH, "..", "..", "yield" ) ) -YIELDFS_DIR_PATH = abspath( join( MY_DIR_PATH, "..", "..", "yieldfs" ) ) - -XTREEMFS_DIR_PATH = abspath( join( MY_DIR_PATH, ".." ) ) - - -DEFINES = ( "YIELD_PLATFORM_HAVE_OPENSSL", ) - -INCLUDE_DIR_PATHS = \ -( - join( XTREEMFS_DIR_PATH, "include" ), - join( XTREEMFS_DIR_PATH, "share", "yidl", "include" ), - join( XTREEMFS_DIR_PATH, "share", "yield", "include" ), - join( XTREEMFS_DIR_PATH, "share", "yield", "src" ), - join( XTREEMFS_DIR_PATH, "share", "yieldfs", "include" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src" ) -) - -IMPORTS = \ -[ - "import java.io.StringWriter;", - "import org.xtreemfs.foundation.oncrpc.utils.*;", - "import org.xtreemfs.foundation.buffer.ReusableBuffer;", - "import yidl.runtime.PrettyPrinter;", -] - -INTERFACES_DIR_PATH = join( XTREEMFS_DIR_PATH, "src", "interfaces", "org", "xtreemfs", "interfaces" ) - -LIB_DIR_PATHS = ( join( XTREEMFS_DIR_PATH, "lib" ), ) - - -try: - import yidl -except ImportError: - sys.path.append( join( YIDL_DIR_PATH, "src", "py" ) ) - -import yidl.compiler -from yidl.generators import generate_proj, generate_SConscript, generate_vcproj -from yidl.generators import generate_yield_cpp -from yidl.utilities import copy_file, format_src, indent, pad, write_file - - -assert __name__ == "__main__" - - -option_parser = OptionParser() -option_parser.add_option( "-f", "--force", action="store_true", dest="force" ) -options, ignore = option_parser.parse_args() - - -copy_file_paths = {} -# yidl -copy_file_paths[join( YIDL_DIR_PATH, "include", "yidl.h" )] = join( XTREEMFS_DIR_PATH, "share", "yidl", "include", "yidl.h" ) -# yunit -copy_file_paths[join( YIDL_DIR_PATH, "include", "yunit.h" )] = join( XTREEMFS_DIR_PATH, "share", "yidl", "include", "yunit.h" ) -# yield/main.h -copy_file_paths[join( YIELD_DIR_PATH, "include", "yield", "main.h" )] = join( XTREEMFS_DIR_PATH, "share", "yield", "include", "yield", "main.h" ) -# Yield sub-project umbrella includes -for file_stem in ( "concurrency", "ipc", "platform" ): - copy_file_paths[join( YIELD_DIR_PATH, "include", "yield", file_stem + ".h" )] = join( XTREEMFS_DIR_PATH, "share", "yield", "include", "yield", file_stem + ".h" ) - copy_file_paths[join( YIELD_DIR_PATH, "src", "yield", file_stem + ".cpp" )] = join( XTREEMFS_DIR_PATH, "share", "yield", "src", "yield", file_stem + ".cpp" ) -# yield/platform _test.h's -for test_h_file_prefix in ( "channel", "directory", "file", "volume" ): - copy_file_paths[join( YIELD_DIR_PATH, "src", "yield", "platform", test_h_file_prefix + "_test.h" )] = join( XTREEMFS_DIR_PATH, "share", "yield", "src", "yield", "platform", test_h_file_prefix + "_test.h" ) - -# YieldFS -copy_file_paths[join( YIELDFS_DIR_PATH, "include", "yieldfs.h" )] = join( XTREEMFS_DIR_PATH, "share", "yieldfs", "include", "yieldfs.h" ) -copy_file_paths[join( YIELDFS_DIR_PATH, "src", "yieldfs.cpp" )] = join( XTREEMFS_DIR_PATH, "share", "yieldfs", "src", "yieldfs.cpp" ) - -for source_file_path, target_file_path in copy_file_paths.iteritems(): - if exists( source_file_path ): - copy_file( source_file_path, target_file_path ) - - -# Generate .h interface definitions from .idl -for interface_idl_file_name in listdir( INTERFACES_DIR_PATH ): - if interface_idl_file_name.endswith( ".idl" ): - if interface_idl_file_name == "nettest_interface.idl": - generate_yield_cpp( - join( INTERFACES_DIR_PATH, interface_idl_file_name ), - join( XTREEMFS_DIR_PATH, "src", "nettest.xtreemfs", "nettest_interface.h" ), - force=options.force - ) - else: - generate_yield_cpp( - join( INTERFACES_DIR_PATH, interface_idl_file_name ), - join( XTREEMFS_DIR_PATH, "include", "xtreemfs", "interfaces", splitext( interface_idl_file_name )[0] + ".h" ), - force=options.force - ) - - -# Add copyright notices to the source, strip white space on the right -format_src( - author="NEC HPC Europe", - force=options.force, - project="XtreemFS", - src_paths=( - join( XTREEMFS_DIR_PATH, "bin", "generate_src_and_proj.py" ), - join( XTREEMFS_DIR_PATH, "include" ), - join( XTREEMFS_DIR_PATH, "include", "xtreemfs" ), - join( XTREEMFS_DIR_PATH, "src", "libxtreemfs" ), - join( XTREEMFS_DIR_PATH, "src", "lsfs.xtreemfs" ), - join( XTREEMFS_DIR_PATH, "src", "mkfs.xtreemfs" ), - join( XTREEMFS_DIR_PATH, "src", "mount.xtreemfs" ), - join( XTREEMFS_DIR_PATH, "src", "nettest.xtreemfs", "nettest.xtreemfs.cpp" ), - join( XTREEMFS_DIR_PATH, "src", "nettest.xtreemfs", "nettest_proxy.h" ), - join( XTREEMFS_DIR_PATH, "src", "rmfs.xtreemfs" ), - ) -) - - -# Generate project files -chdir( join( XTREEMFS_DIR_PATH, "proj", "libxtreemfs" ) ) -generate_proj( - "libxtreemfs", - defines=DEFINES, - force=options.force, - include_dir_paths=INCLUDE_DIR_PATHS, - lib_dir_paths=LIB_DIR_PATHS, - libs_win=( "libeay32.lib", "ssleay32.lib" ), - libs_unix=( "crypto", "fuse", "ssl", ), - output_file_path=join( XTREEMFS_DIR_PATH, "lib", "xtreemfs" ), - src_paths=( - join( XTREEMFS_DIR_PATH, "include" ), - join( XTREEMFS_DIR_PATH, "share", "yield" ), - join( XTREEMFS_DIR_PATH, "share", "yieldfs" ), - join( XTREEMFS_DIR_PATH, "src", "interfaces" ), - join( XTREEMFS_DIR_PATH, "src", "libxtreemfs" ), - ) -) - -for binary_name in ( "lsfs.xtreemfs", "mkfs.xtreemfs", "mount.xtreemfs", "nettest.xtreemfs", "rmfs.xtreemfs", "xtfs_vivaldi" ): - chdir( join( XTREEMFS_DIR_PATH, "proj", binary_name ) ) - generate_proj( - binary_name, - dependency_SConscripts=( - join( XTREEMFS_DIR_PATH, "proj", "libxtreemfs", "libxtreemfs.SConscript" ), - join( XTREEMFS_DIR_PATH, "proj", "google-breakpad", "google-breakpad.SConscript" ), - ), - defines=DEFINES, - include_dir_paths=INCLUDE_DIR_PATHS, - force=options.force, - lib_dir_paths=LIB_DIR_PATHS, - libs=( "xtreemfs_d.lib", ), - output_file_path=join( XTREEMFS_DIR_PATH, "bin", binary_name ), - src_paths=( join( XTREEMFS_DIR_PATH, "src", binary_name ), ), - type="exe", - ) - - -chdir( join( XTREEMFS_DIR_PATH, "proj", "google-breakpad" ) ) - -generate_SConscript( "google-breakpad", force=options.force ) - -generate_SConscript( - "google-breakpad_linux", - force=options.force, - include_dir_paths=GOOGLE_BREAKPAD_INCLUDE_DIR_PATHS, - output_file_path=GOOGLE_BREAKPAD_OUTPUT_FILE_PATH, - src_paths= - ( - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "client", "minidump_file_writer.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "client", "linux" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "*.c" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "*.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "dwarf" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "linux" ), - ) -) - -generate_SConscript( - "google-breakpad_windows", - defines=( "UNICODE", ), - force=options.force, - include_dir_paths=GOOGLE_BREAKPAD_INCLUDE_DIR_PATHS, - output_file_path=GOOGLE_BREAKPAD_OUTPUT_FILE_PATH, - src_paths= - ( - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "client", "windows", "crash_generation", "*.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "client", "windows", "handler", "*.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "convert_UTF.c" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "*.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "windows", "*.cc" ), - ) -) - -generate_vcproj( - "google-breakpad", - defines=( "UNICODE", ), - force=options.force, - include_dir_paths=GOOGLE_BREAKPAD_INCLUDE_DIR_PATHS, - output_file_path=GOOGLE_BREAKPAD_OUTPUT_FILE_PATH, - src_paths= - ( - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "client", "windows", "crash_generation", "*.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "client", "windows", "handler", "*.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "convert_UTF.c" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "*.cc" ), - join( GOOGLE_BREAKPAD_DIR_PATH, "src", "common", "windows", "*.cc" ), - ) -) - - -# The java_target import * must be here to avoid interfering with generate_cpp above -from yidl.compiler.targets.java_target import * - - -class XtreemFSJavaBufferType(JavaBufferType): - def get_java_name( self ): - return "ReusableBuffer" - - def get_unmarshal_call( self, decl_identifier, value_identifier ): - return value_identifier + """ = ( ReusableBuffer )unmarshaller.readBuffer( %(decl_identifier)s );""" % locals() - - -class XtreemFSJavaExceptionType(JavaExceptionType): - def generate( self ): - XtreemFSJavaStructType( self.get_scope(), self.get_qname(), self.get_tag(), ( "org.xtreemfs.foundation.oncrpc.utils.ONCRPCException", ), self.get_members() ).generate() - - def get_factory( self ): - return "case %i: return new %s();" % ( self.get_tag(), self.get_name() ) - - -class XtreemFSJavaInterface(JavaInterface, JavaClass): - def generate( self ): - class_header = self.get_class_header() - constants = indent( INDENT_SPACES, pad( "\n", "\n".join( [repr( constant ) for constant in self.get_constants()] ), "\n\n" ) ) - prog = 0x20000000 + self.get_tag() - version = self.get_tag() - out = """\ -%(class_header)s%(constants)s - public static long getProg() { return %(prog)ul; } - public static int getVersion() { return %(version)u; } -""" % locals() - - exception_factories = indent( INDENT_SPACES * 3, "\n".join( [exception_type.get_factory() for exception_type in self.get_exception_types()] ) ) - if len( exception_factories ) > 0: - out += """ - public static ONCRPCException createException( int accept_stat ) throws Exception - { - switch( accept_stat ) - { -%(exception_factories)s - default: throw new Exception( "unknown accept_stat " + Integer.toString( accept_stat ) ); - } - } -""" % locals() - - request_factories = indent( INDENT_SPACES * 3, "\n".join( [operation.get_request_type().get_factory() for operation in self.get_operations()] ) ) - if len( request_factories ) > 0: - out += """ - public static Request createRequest( ONCRPCRequestHeader header ) throws Exception - { - switch( header.getProcedure() ) - { -%(request_factories)s - default: throw new Exception( "unknown request tag " + Integer.toString( header.getProcedure() ) ); - } - } -""" % locals() - - response_factories = indent( INDENT_SPACES * 3, "\n".join( [operation.get_response_type().get_factory() for operation in self.get_operations() if not operation.is_oneway()] ) ) - if len( response_factories ) > 0: - out += """ - public static Response createResponse( ONCRPCResponseHeader header ) throws Exception - { - switch( header.getXID() ) - { -%(response_factories)s - default: throw new Exception( "unknown response XID " + Integer.toString( header.getXID() ) ); - } - } -""" % locals() - - out += self.get_class_footer() - - write_file( self.get_file_path(), out ) - - for operation in self.get_operations(): - operation.generate() - - for exception_type in self.get_exception_types(): - exception_type.generate() - - def get_imports( self ): - return JavaClass.get_imports( self ) + IMPORTS - - def get_package_dir_path( self ): - return os_sep.join( self.get_qname() ) - - def get_package_name( self ): - return ".".join( self.get_qname() ) - - -class XtreemFSJavaMapType(JavaMapType): - def get_imports( self ): - return JavaMapType.get_imports( self ) + IMPORTS - - def get_other_methods( self ): - return """\ -// java.lang.Object -public String toString() -{ - StringWriter string_writer = new StringWriter(); - string_writer.append(this.getClass().getCanonicalName()); - string_writer.append(" "); - PrettyPrinter pretty_printer = new PrettyPrinter( string_writer ); - pretty_printer.writeMap( "", this ); - return string_writer.toString(); -}""" - - -class XtreemFSJavaSequenceType(JavaSequenceType): - def get_imports( self ): - return JavaSequenceType.get_imports( self ) + IMPORTS - - def get_other_methods( self ): - return """\ -// java.lang.Object -public String toString() -{ - StringWriter string_writer = new StringWriter(); - string_writer.append(this.getClass().getCanonicalName()); - string_writer.append(" "); - PrettyPrinter pretty_printer = new PrettyPrinter( string_writer ); - pretty_printer.writeSequence( "", this ); - return string_writer.toString(); -}""" - - -class XtreemFSJavaStructType(JavaStructType): - def get_imports( self ): - return JavaStructType.get_imports( self ) + IMPORTS - - def get_other_methods( self ): - return """\ -// java.lang.Object -public String toString() -{ - StringWriter string_writer = new StringWriter(); - string_writer.append(this.getClass().getCanonicalName()); - string_writer.append(" "); - PrettyPrinter pretty_printer = new PrettyPrinter( string_writer ); - pretty_printer.writeStruct( "", this ); - return string_writer.toString(); -}""" - -class XtreemFSJavaOperation(JavaOperation): - def generate( self ): - self.get_request_type().generate() - self.get_response_type().generate() - - def get_request_type( self ): - try: - return self.__request_type - except AttributeError: - request_type_name = self.get_name() + "Request" - request_params = [] - for in_param in self.get_in_parameters(): - if not in_param in self.get_out_parameters(): - request_params.append( in_param ) - self.__request_type = self._create_construct( "RequestType", XtreemFSJavaRequestType, self.get_qname()[:-1] + [request_type_name], self.get_tag(), None, request_params ) - return self.__request_type - - def get_response_type( self ): - return self._get_response_type( "returnValue" ) - - -class XtreemFSJavaRequestType(XtreemFSJavaStructType): - def get_factory( self ): - return "case %i: return new %s();" % ( self.get_tag(), self.get_name() ) - - def get_other_methods( self ): - response_type_name = self.get_name()[:self.get_name().index( "Request" )] + "Response" - return XtreemFSJavaStructType.get_other_methods( self ) + """ - -// Request -public Response createDefaultResponse() { return new %(response_type_name)s(); }""" % locals() - - def get_parent_names( self ): - return ( "org.xtreemfs.foundation.oncrpc.utils.Request", ) - - -class XtreemFSJavaResponseType(XtreemFSJavaStructType): - def get_factory( self ): - return "case %i: return new %s();" % ( self.get_tag(), self.get_name() ) - - def get_parent_names( self ): - return ( "org.xtreemfs.foundation.oncrpc.utils.Response", ) - - -class XtreemFSJavaTarget(JavaTarget): pass - - -# Generate .java interfaces from .idl -chdir( join( MY_DIR_PATH, "..", "src", "servers", "src" ) ) -for interface_idl_file_name in listdir( INTERFACES_DIR_PATH ): - if interface_idl_file_name.endswith( ".idl" ): - target = XtreemFSJavaTarget() - yidl.compiler.parse( join( INTERFACES_DIR_PATH, interface_idl_file_name ), target ) - target.generate() diff --git a/bin/umount.xtreemfs b/bin/umount.xtreemfs deleted file mode 100755 index e5c41c3caaf100aa82b4d5175702e28db90af5e9..0000000000000000000000000000000000000000 --- a/bin/umount.xtreemfs +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -# a simple wrapper around fusermount -u, now passes all args to fusermount - -if [ $# -lt 1 -o $1 == "--help" -o $1 == "-h" ] -then - echo "usage: xtfs_umount " - echo "" - exit 1 -fi - -fusermount -u $@ -exit $? diff --git a/bin/xctl b/bin/xctl deleted file mode 100755 index 3827815d6de81429475ce0d80d069609acb504a0..0000000000000000000000000000000000000000 --- a/bin/xctl +++ /dev/null @@ -1,849 +0,0 @@ -#!/usr/bin/env python - -import os.path, shutil, subprocess, signal, sys, traceback, unittest -from optparse import OptionParser -from time import sleep - - -# Constants -DEBUG_ME = True -CLIENT_DEBUG_LEVEL_DEFAULT = "ERR" -SERVER_DEBUG_LEVEL_DEFAULT = "6" -SERVER_STOP_TRIES = 3 - -# Paths -DIR_CONFIG_FILE_PATH_DEFAULT = "/etc/xos/xtreemfs/dirconfig.properties" -MRC_CONFIG_FILE_PATH_DEFAULT = "/etc/xos/xtreemfs/mrcconfig.properties" -MY_DIR_PATH = os.path.dirname( os.path.abspath( sys.modules[__name__].__file__ ) ) -OSD_CONFIG_FILE_PATH_DEFAULT = "/etc/xos/xtreemfs/osdconfig.properties" -SERVER_RUN_DIR_PATH_DEFAULT = "run" - -# Ports -DIR_HTTP_PORT_DEFAULT = 30638 -DIR_ONCRPC_PORT_DEFAULT = 32638 -MRC_HTTP_PORT_DEFAULT = 30636 -MRC_ONCRPC_PORT_DEFAULT = 32636 -OSD_HTTP_PORT_DEFAULT = 30640 -OSD_ONCRPC_PORT_DEFAULT = 32640 - -# URIs -DIR_URI_DEFAULT = "oncrpc://localhost:%u/" % DIR_ONCRPC_PORT_DEFAULT -MRC_URI_DEFAULT = "oncrpc://localhost:%u/" % MRC_ONCRPC_PORT_DEFAULT -OSD_URI_DEFAULT = "oncrpc://localhost:%u/" % OSD_ONCRPC_PORT_DEFAULT - -# Misc -STRIPE_SIZE_DEFAULT = 128 -STRIPING_POLICY_TYPE_DEFAULT = "RAID0" - - -class Autotest: - def __init__( - self, - osd_count=3, - server_uri="oncrpc://localhost" - ): - - self.__osd_count = osd_count - self.__server_uri = server_uri - - def clean( self, ): - for dir_name in ( "config", "data", "log", "mnt" ): - try: shutil.rmtree( dir_name ) - except: pass - - def __get_servers( self ): - dir = DIR( config_file_path=os.path.join( "config", "dir.config" ) ) - mrc = MRC( config_file_path=os.path.join( "config", "mrc.config" ) ) - osds = [OSD( config_file_path=os.path.join( "config", "osd"+str( osd_i )+".config" ) ) for osd_i in xrange( self.__osd_count )] - return dir, mrc, osds - - def __get_volumes( self ): - volumes = [] - for osd_i in xrange( self.__osd_count ): - volume_name = "test_" + str( osd_i ) - for direct_io in ( False, True ): - mount_point_dir_path = os.path.join( "mnt", volume_name ) - if not direct_io: - mount_point_dir_path += "_nondirect" - volume = Volume( name=volume_name, mount_point_dir_path=mount_point_dir_path ) - volumes.append( volume ) - return volumes - - def start_clients( - self, - debug_level=CLIENT_DEBUG_LEVEL_DEFAULT, - mount_options=None, - replicate_on_close=False - ): - - for dir_name in ( "log", "mnt" ): - try: os.mkdir( dir_name ) - except: pass - - certs_dir_path = os.path.abspath( os.path.join( MY_DIR_PATH, "..", "tests", "certs" ) ) - if self.__server_uri.startswith( "oncrpcs://" ) or self.__server_uri.startswith( "oncrpcg://" ): - if os.path.exists( certs_dir_path ): - pkcs12_file_path = os.path.join( certs_dir_path, "Client.p12" ) - pkcs12_passphrase = "passphrase" - else: - raise ValueError, "specified oncrpcs server URI, but cannot find certificate directory at " + certs_dir_path - else: - pkcs12_file_path = pkcs12_passphrase = None - - volumes = self.__get_volumes() - - # Create volumes - for volume_i in xrange( 0, len( volumes ), 2 ): - volume = volumes[volume_i] - try: - volume.create( - debug_level=debug_level, - mrc_uri=self.__server_uri, - pkcs12_file_path=pkcs12_file_path, - pkcs12_passphrase=pkcs12_passphrase, - stripe_width=( replicate_on_close and ( ( volume_i / 2 ) + 1 ) or 1 ), - ) - except: - if DEBUG_ME: - print "xctl: error creating volume", volume.get_name() - traceback.print_exc() - - # Mount volumes - try: - for volume_i in xrange( len( volumes ) ): - volume = volumes[volume_i] - volume.mount( - debug_level=debug_level, - direct_io=( volume_i % 2 == 1 ), # Or have volume.get_direct_io()? - dir_uri=self.__server_uri, - log_file_path=os.path.join( "log", "client"+str( volume_i )+".log" ), - other_options=mount_options, - pkcs12_file_path=pkcs12_file_path, - pkcs12_passphrase=pkcs12_passphrase, - replication_factor=( replicate_on_close and ( ( volume_i / 2 ) + 1 ) or 0 ), - ) - except: - if DEBUG_ME: - print "xctl: caught exception trying to start autotest clients:" - traceback.print_exc() - - self.stop_clients() - raise - - def start_servers( - self, - debug_level=SERVER_DEBUG_LEVEL_DEFAULT - ): - for dir_name in ( "config", "data", "log" ): - try: os.mkdir( dir_name ) - except: pass - - certs_dir_path = os.path.abspath( os.path.join( MY_DIR_PATH, "..", "tests", "certs" ) ) - if self.__server_uri.startswith( "oncrpcs://" ) or self.__server_uri.startswith( "oncrpcg://" ): - if os.path.exists( certs_dir_path ): - enable_ssl = True - enable_gridssl = self.__server_uri.startswith( "oncrpcg://" ) - else: - raise ValueError, "specified oncrpcs server URI, but cannot find certificate directory at " + certs_dir_path - else: - enable_ssl = enable_gridssl = False - - try: - dir, mrc, osds = self.__get_servers() - - dir.configure( - database_dir_path=os.path.join( "data", "dir" ), - debug_level=debug_level, - enable_ssl=enable_ssl, - enable_gridssl=enable_gridssl, - pkcs12_file_path=os.path.join( certs_dir_path, "DIR.p12" ), - pkcs12_passphrase="passphrase", - trusted_certs_jks_file_path=os.path.join( certs_dir_path, "trusted.jks" ), - trusted_certs_jks_passphrase="passphrase", - uuid="test-env-DIR" - ) - dir.start( log_file_path=os.path.join( "log", "dir.log" ) ) - - - mrc.configure( - database_dir_path=os.path.join( "data", "mrc" ), - debug_level=debug_level, - enable_ssl=enable_ssl, - enable_gridssl=enable_gridssl, - pkcs12_file_path=os.path.join( certs_dir_path, "MRC.p12" ), - pkcs12_passphrase="passphrase", - trusted_certs_jks_file_path=os.path.join( certs_dir_path, "trusted.jks" ), - trusted_certs_jks_passphrase="passphrase", - uuid="test-env-MRC" - ) - mrc.start( log_file_path=os.path.join( "log", "mrc.log" ) ) - - - for osd_i in xrange( len( osds ) ): - osd = osds[osd_i] - osd.configure( - debug_level=debug_level, - enable_ssl=enable_ssl, - enable_gridssl=enable_gridssl, - http_port=OSD_HTTP_PORT_DEFAULT+osd_i, - object_dir_path=os.path.join( "data", "osd" + str( osd_i ) ), - oncrpc_port=OSD_ONCRPC_PORT_DEFAULT+osd_i, - pkcs12_file_path=os.path.join( certs_dir_path, "OSD.p12" ), - pkcs12_passphrase="passphrase", - trusted_certs_jks_file_path=os.path.join( certs_dir_path, "trusted.jks" ), - trusted_certs_jks_passphrase="passphrase", - uuid="test-env-OSD" + str( osd_i ) - ) - osd.start( log_file_path=os.path.join( "log", "osd"+str( osd_i )+".log" ) ) - except: - if DEBUG_ME: - print "xctl: caught exception trying to start autotest servers:" - traceback.print_exc() - - self.stop_servers() - raise - - def run( self ): - failed_test_count = 0 - for volume in self.__get_volumes(): - failed_test_count += volume.test() - return failed_test_count - - def save_server_status_pages( self ): - dir, mrc, osds = self.__get_servers() - dir.save_status_page( "/tmp/dir_status.html" ) - mrc.save_status_page( "/tmp/mrc_status.html" ) - for osd_i in xrange( len( osds ) ): - osds[osd_i].save_status_page( "/tmp/osd" + str( osd_i ) + ".html" ) - - def stop_clients( self ): - for volume in self.__get_volumes(): - volume.unmount() - - def stop_servers( self ): - dir, mrc, osds = self.__get_servers() - dir.stop() - mrc.stop() - for osd in osds: - osd.stop() - - -class Server: - def __init__( self, config_file_path ): - self.__config_file_path = config_file_path - - def _get_ssl_config( - self, - enable_gridssl=False, - enable_ssl=False, - pkcs12_file_path=None, - pkcs12_passphrase=None, - trusted_certs_jks_file_path=None, - trusted_certs_jks_passphrase=None - ): - - if enable_ssl: - if enable_gridssl: - gridsslcfg = "ssl.grid_ssl = true\n" - else: - gridsslcfg = "ssl.grid_ssl = false\n" - - return """\ -ssl.enabled = true -ssl.service_creds = %(pkcs12_file_path)s -ssl.service_creds.pw = %(pkcs12_passphrase)s -ssl.service_creds.container = PKCS12 -ssl.trusted_certs = %(trusted_certs_jks_file_path)s -ssl.trusted_certs.pw = %(trusted_certs_jks_passphrase)s -ssl.trusted_certs.container = JKS -""" % locals() + gridsslcfg - else: - return """\ -ssl.enabled = false -""" - - def get_config_file_path( self ): - return self.__config_file_path - - def __get_config_property( self, key ): - for line in open( self.__config_file_path ).readlines(): - line_parts = line.split( "=", 1 ) - if len( line_parts ) == 2: - if line_parts[0].strip() == key: - return line_parts[1].strip() - - raise ValueError, key + " = not found in " + self.__config_file_path - - def __get_pid_file_path( self, run_dir_path ): - return os.path.join( run_dir_path, self.get_uuid() + ".pid" ) - - def get_http_port( self ): - return int( self.__get_config_property( "http_port" ) ) - - def get_oncrpc_port( self ): - return int( self.__get_config_property( "listen.port" ) ) - - def get_uuid( self ): - return self.__get_config_property( "uuid" ) - - def is_running( self, run_dir_path=SERVER_RUN_DIR_PATH_DEFAULT ): - pid_file_path = self.__get_pid_file_path( run_dir_path ) - if os.path.exists( pid_file_path ): - pid = int( open( pid_file_path ).read().strip() ) - - if DEBUG_ME: - print "xctl: checking if", self.__class__.__name__, "server is running with pid", pid - - try: - pid, exitvalue = os.waitpid( pid, os.WNOHANG ) - if pid != 0 and exitvalue != 0: - return False - else: - return True - except OSError: - return False - else: - return False - - def save_status_page( self, to_file_path ): - http_port = self.get_http_port() - os.system( "wget -O %(to_file_path)s http://localhost:%(http_port)u" % locals() ) - - def start( - self, - log_file_path=None, - run_dir_path=SERVER_RUN_DIR_PATH_DEFAULT - ): - - if sys.platform == "win32" or not self.is_running( run_dir_path ): - try: os.mkdir( run_dir_path ) - except: pass - pid_file_path = self.__get_pid_file_path( run_dir_path ) - - java_args = [os.path.join( os.environ["JAVA_HOME"], "bin", "java" )] - java_args.append( "-ea" ) # Enable assertions - - # Construct the -cp classpath - XtreemFS_jar_file_path = os.path.abspath( os.path.join( MY_DIR_PATH, "..", "src", "servers", "dist", "XtreemFS.jar" ) ) - if os.path.exists( XtreemFS_jar_file_path ): - classpath = ( - XtreemFS_jar_file_path, - os.path.abspath( os.path.join( MY_DIR_PATH, "..", "src", "servers", "lib", "BabuDB.jar" ) ), - os.path.abspath( os.path.join( MY_DIR_PATH, "..", "src", "servers", "lib", "yidl.jar" ) ), - os.path.abspath( os.path.join( MY_DIR_PATH, "..", "src", "servers", "lib", "Flease.jar" ) ), - os.path.abspath( os.path.join( MY_DIR_PATH, "..", "src", "servers", "lib", "Foundation.jar" ) ), - ) - if sys.platform.startswith( "win" ): - classpath = ";".join( classpath ) - else: - classpath = ":".join( classpath ) - java_args.extend( ( "-cp", classpath ) ) - - # Name of the class to start - java_args.append( "org.xtreemfs." + self.__class__.__name__.lower() + "." + self.__class__.__name__.upper() ) - - # .config file - java_args.append( self.get_config_file_path() ) - - # Don't .join java_args, since Popen wants a sequence when shell=False - - if log_file_path is None: - stderr = sys.stderr - stdout = sys.stdout - else: - # Redirect stderr and stdout to a log file - stderr = stdout = open( log_file_path, "a" ) - - if DEBUG_ME: - print "xctl: starting", self.__class__.__name__, "server with UUID", self.get_uuid(), "on port", self.get_oncrpc_port(), "with", " ".join( java_args ) - - p = subprocess.Popen( java_args, stdout=stdout, stderr=stderr ) # No shell=True: we only want one process (java), not two (/bin/sh and java) - open( pid_file_path, "w+" ).write( str( p.pid ) ) - - if DEBUG_ME: - print "xctl: started", self.__class__.__name__, "server with UUID", self.get_uuid(), "on port", self.get_oncrpc_port(), "with pid", p.pid - - sleep( 2.0 ) - - if not self.is_running( run_dir_path ): - raise RuntimeError, self.get_uuid() + " failed to start" - else: - print "xctl:", self.__class__.__name__, "server with UUID", self.get_uuid(), "is already running" - - def stop( self, run_dir_path=SERVER_RUN_DIR_PATH_DEFAULT ): - pid_file_path = self.__get_pid_file_path( run_dir_path ) - if os.path.exists( pid_file_path ): - pid = int( open( pid_file_path ).read().strip() ) - - if sys.platform.startswith( "win" ): - subprocess.call( "TASKKILL /PID %(pid)u /F /T" % locals() ) - killed = True - else: - killed = False - for signo in ( signal.SIGTERM, signal.SIGKILL ): - for try_i in xrange( SERVER_STOP_TRIES ): - if DEBUG_ME: - print "xctl: stopping", self.__class__.__name__, "server with pid", pid, "with signal", str( signo ) + ", try", try_i - - try: os.kill( pid, signo ) - except: pass - - sleep( 1 ) - - try: - if os.waitpid( pid, os.WNOHANG )[0] != 0: - killed = True - break - except OSError: - killed = True - break - except: - if DEBUG_ME: - traceback.print_exc() - - if killed: - break - - if killed: - os.unlink( pid_file_path ) - - elif DEBUG_ME: - print "xctl: no pid file for", self.__class__.__name__, "server" - - -class DIR(Server): - def configure( - self, - database_dir_path, - uuid, - debug_level=SERVER_DEBUG_LEVEL_DEFAULT, - http_port=DIR_HTTP_PORT_DEFAULT, - oncrpc_port=DIR_ONCRPC_PORT_DEFAULT, - **kwds - ): - - try: os.mkdir( database_dir_path ) - except: pass - - open( self.get_config_file_path(), "w+" ).write( """\ -uuid = %(uuid)s -babudb.debug.level = %(debug_level)s -babudb.logDir = %(database_dir_path)s -babudb.baseDir = %(database_dir_path)s -babudb.sync = FSYNC -babudb.worker.maxQueueLength = 250 -babudb.worker.numThreads = 0 -babudb.maxLogfileSize = 16777216 -babudb.checkInterval = 300 -babudb.pseudoSyncWait = 200 -debug.level = %(debug_level)s -listen.port = %(oncrpc_port)u -http_port = %(http_port)u -database.dir = %(database_dir_path)s -database.log = %(database_dir_path)s -authentication_provider = org.xtreemfs.common.auth.NullAuthProvider -""" % locals() + self._get_ssl_config( **kwds ) ) - - -class MRC(Server): - def configure( - self, - database_dir_path, - uuid, - debug_level=SERVER_DEBUG_LEVEL_DEFAULT, - dir_uri=DIR_URI_DEFAULT, - http_port=MRC_HTTP_PORT_DEFAULT, - oncrpc_port=MRC_ONCRPC_PORT_DEFAULT, - **kwds - ): - - try: os.mkdir( database_dir_path ) - except: pass - - dir_service_host = "localhost" - dir_service_port = DIR_ONCRPC_PORT_DEFAULT - - open( self.get_config_file_path(), "w+" ).write( """\ -uuid = %(uuid)s -debug.level = %(debug_level)s -listen.port = %(oncrpc_port)u -http_port = %(http_port)u -dir_service.host = %(dir_service_host)s -dir_service.port = %(dir_service_port)u -babudb.debug.level = %(debug_level)s -babudb.logDir = %(database_dir_path)s -babudb.baseDir = %(database_dir_path)s -babudb.sync = ASYNC -babudb.worker.maxQueueLength = 250 -babudb.worker.numThreads = 0 -babudb.maxLogfileSize = 16777216 -babudb.checkInterval = 300 -babudb.pseudoSyncWait = 0 -osd_check_interval = 300 -no_atime = true -no_fsync = true -local_clock_renewal = 50 -remote_time_sync = 60000 -database.dir = %(database_dir_path)s -database.log = %(database_dir_path)s -database.checkpoint.interval = 1800000 -database.checkpoint.idle_interval = 1000 -database.checkpoint.logfile_size = 16384 -authentication_provider = org.xtreemfs.common.auth.NullAuthProvider -capability_secret = testsecret -""" % locals() + self._get_ssl_config( **kwds ) ) - - -class OSD(Server): - def configure( - self, - object_dir_path, - uuid, - debug_level=SERVER_DEBUG_LEVEL_DEFAULT, - dir_uri=DIR_URI_DEFAULT, - http_port=OSD_HTTP_PORT_DEFAULT, - oncrpc_port=OSD_ONCRPC_PORT_DEFAULT, - **kwds - ): - - try: os.mkdir( object_dir_path ) - except: pass - - dir_service_host = "localhost" - dir_service_port = DIR_ONCRPC_PORT_DEFAULT - - open( self.get_config_file_path(), "w+" ).write( """\ -uuid = %(uuid)s -debug.level = %(debug_level)s -listen.port = %(oncrpc_port)u -http_port = %(http_port)u -dir_service.host = %(dir_service_host)s -dir_service.port = %(dir_service_port)u -object_dir=%(object_dir_path)s -local_clock_renewal = 50 -remote_time_sync = 60000 -report_free_space = true -checksums.enabled = false -capability_secret = testsecret -""" % locals() + self._get_ssl_config( **kwds ) ) - - -class Volume: - def __init__( self, name, mount_point_dir_path=None ): - if mount_point_dir_path is not None: - self.__mount_point_dir_path = os.path.abspath( mount_point_dir_path ) - else: - self.__mount_point_dir_path = None - self.__name = name - - def create( - self, - debug_level=CLIENT_DEBUG_LEVEL_DEFAULT, - mrc_uri=MRC_URI_DEFAULT, - pkcs12_file_path=None, - pkcs12_passphrase=None, - stripe_width=1, - ): - - mkfs_xtreemfs_file_path = os.path.abspath( os.path.join( MY_DIR_PATH, "mkfs.xtreemfs" ) ) - if not os.path.exists( mkfs_xtreemfs_file_path ): - mkfs_xtreemfs_file_path = "mkfs.xtreemfs" # Assume it's in the global path - - mkfs_xtreemfs_args = [mkfs_xtreemfs_file_path] - mkfs_xtreemfs_args.extend( ( "-d", str( debug_level ) ) ) - mkfs_xtreemfs_args.extend( ( "-p", str( STRIPING_POLICY_TYPE_DEFAULT ) ) ) - if pkcs12_file_path is not None: mkfs_xtreemfs_args.extend( ( "--pkcs12-file-path", pkcs12_file_path ) ) - if pkcs12_passphrase is not None: mkfs_xtreemfs_args.extend( ( "--pkcs12-passphrase", pkcs12_passphrase ) ) - mkfs_xtreemfs_args.extend( ( "-s", str( STRIPE_SIZE_DEFAULT ) ) ) - mkfs_xtreemfs_args.extend( ( "-w", str( stripe_width ) ) ) - - if not mrc_uri.endswith( "/" ): - mrc_uri += "/" - mkfs_xtreemfs_args.append( mrc_uri + self.get_name() ) - - mkfs_xtreemfs_args = " ".join( mkfs_xtreemfs_args ) - - if DEBUG_ME: - print "xctl: creating volume", self.get_name(), "with", mkfs_xtreemfs_args - - subprocess.call( mkfs_xtreemfs_args, shell=True ) - - def get_mount_point_dir_path( self ): - return self.__mount_point_dir_path - - def get_name( self ): - return self.__name - - def mount( - self, - debug_level=CLIENT_DEBUG_LEVEL_DEFAULT, - dir_uri=DIR_URI_DEFAULT, - direct_io=False, - log_file_path=None, - other_options=None, - pkcs12_file_path=None, - pkcs12_passphrase=None, - replication_factor=0, - ): - - try: os.mkdir( self.get_mount_point_dir_path() ) - except: pass - - mount_xtreemfs_file_path = os.path.abspath( os.path.join( MY_DIR_PATH, "mount.xtreemfs" ) ) - if not os.path.exists( mount_xtreemfs_file_path ): - mount_xtreemfs_file_path = "mount.xtreemfs" # Assume it's in the global path - - mount_xtreemfs_args = [mount_xtreemfs_file_path] - mount_xtreemfs_args.append( "-f" ) # So we can redirect stdout and stderr - mount_xtreemfs_args.extend( ( "-d", str( debug_level ) ) ) - if direct_io: mount_xtreemfs_args.extend( ( "-o", "direct_io" ) ) - if other_options is not None: - assert isinstance( other_options, list ) - for other_option in other_options: - mount_xtreemfs_args.append( other_option ) - if pkcs12_file_path is not None: mount_xtreemfs_args.extend( ( "--pkcs12-file-path", pkcs12_file_path ) ) - if pkcs12_passphrase is not None: mount_xtreemfs_args.extend( ( "--pkcs12-passphrase", pkcs12_passphrase ) ) - - volume_uri = dir_uri - if not volume_uri.endswith( "/" ): volume_uri += "/" - volume_uri += self.get_name() - mount_xtreemfs_args.append( volume_uri ) - - mount_xtreemfs_args.append( self.get_mount_point_dir_path() ) - - if log_file_path is None: - stdout = sys.stdout - stderr = sys.stderr - else: - stderr = stdout = open( log_file_path, "a" ) - - if DEBUG_ME: - print "xctl: mounting volume", self.get_name(), "at", self.get_mount_point_dir_path(), "with", " ".join( mount_xtreemfs_args ) - - # Use subprocess.Popen instead of subprocess.call to run in the background - subprocess.Popen( mount_xtreemfs_args, stderr=stderr, stdout=stdout ) - - sleep( 2.0 ) - - if replication_factor > 0: - for setfattr_command in \ - ( - "/usr/bin/setfattr -n xtreemfs.repl_factor -v " + - str( replication_factor ) + " " + self.get_mount_point_dir_path(), - "/usr/bin/setfattr -n xtreemfs.rsel_policy -v 3000 " + - self.get_mount_point_dir_path() - ): - if DEBUG_ME: - print "xctl: calling setfattr to enable replication:", setfattr_command - subprocess.call( setfattr_command, shell=True ) - - def test( - self, - verbose=False - ): - - failed_test_count = 0 # The return value - original_cwd = os.getcwd() - - tests_dir_path = os.path.abspath( os.path.join( MY_DIR_PATH, "..", "tests" ) ) - assert os.path.exists( tests_dir_path ), "xtreemfs/tests directory does not exist!" - sys.path.append( tests_dir_path ) - - - try: - test_suite_factories = {} - test_module_names = [os.path.splitext( file_name )[0] for file_name in os.listdir( tests_dir_path ) if file_name.endswith( ".py" )] - test_module_names.sort() - for test_module_name in test_module_names: - if DEBUG_ME: - print "xctl: trying to import test module", test_module_name - - try: - test_module = __import__( test_module_name ) - except ImportError: - if DEBUG_ME: - print "xctl: could not import test module", test_module_name, "from tests" - traceback.print_exc() - continue - - try: - test_suite_factories[test_module_name] = getattr( test_module, "createTestSuite" ) - except AttributeError: - if DEBUG_ME: - print "xctl: test module", test_module_name, "does not have a createTestSuite global function" - - test_module_names = test_suite_factories.keys() - test_module_names.sort() - for test_module_name in test_module_names: - test_suite_factory = test_suite_factories[test_module_name] - test_suite = test_suite_factory( direct_io=( not "nondirect" in self.get_mount_point_dir_path() ) ) - if test_suite is not None: - test_run_dir_path = os.path.join( self.get_mount_point_dir_path(), test_module_name ) - try: - os.mkdir( test_run_dir_path ) - except KeyboardInterrupt: - raise - except: - pass # The directory may already exist because of direct/nondirect volume sharing - os.chdir( test_run_dir_path ) - print "xctl: running", test_module_name, "in", test_run_dir_path - - result = unittest.TextTestRunner( verbosity=( verbose and 2 or 1 ) ).run( test_suite ) - if not result.wasSuccessful(): failed_test_count += 1 - - os.chdir( original_cwd ) # Change back so we can rmtree test_run_dir_path - try: - shutil.rmtree( test_run_dir_path ) - except KeyboardInterrupt: - raise - except: - if DEBUG_ME: - print "xctl: error cleaning up test directory", test_run_dir_path - traceback.print_exc() - - except KeyboardInterrupt: - os.chdir( original_cwd ) - raise - except: - traceback.print_exc() - - os.chdir( original_cwd ) - return failed_test_count - - def unmount( self ): - for mounts_line in open( "/proc/mounts" ).readlines(): - mounts_line_parts = mounts_line.split() - test_device = mounts_line_parts[0] - test_mount_point_dir_path = mounts_line_parts[1] - if test_device == "xtreemfs" and test_mount_point_dir_path.endswith( self.get_mount_point_dir_path() ): - fusermount_args = " ".join( ["fusermount", "-u", "-z", self.get_mount_point_dir_path()] ) - if DEBUG_ME: - print "xctl: unmounting volume", self.get_name(), "with", fusermount_args - subprocess.call( fusermount_args, shell=True ) - - -if __name__ == "__main__": - # Re-open stdout and stderr for unbuffered output - sys.stderr = os.fdopen( sys.stderr.fileno(), 'w', 0 ) - sys.stdout = os.fdopen( sys.stdout.fileno(), 'w', 0 ) - - option_parser = OptionParser( "usage: %prog [options] [oncrpc://][:server_port]" ) - option_parser.add_option( "--autotest", action="store_true", help="start autotest clients and servers, run autotests, stop clients and servers" ) - option_parser.add_option( "--autotest-osd-count", action="store", dest="autotest_osd_count", type="int", default=3 ) - option_parser.add_option( "-c", "--config-file-path", action="store", dest="config_file_path" ) - option_parser.add_option( "--clean-autotest", action="store_true", dest="clean_autotest", help="delete autotest directories" ) - option_parser.add_option( "--client-debug-level", action="store", dest="client_debug_level", default=None ) - option_parser.add_option( "-d", "--debug-level", action="store", dest="debug_level", default=None ) - option_parser.add_option( "-l", "--log-file-path", action="store", dest="log_file_path", default=None ) - option_parser.add_option( "-o", "--mount-option", action="append", dest="mount_options", help="pass options to mount.xtreemfs" ) - option_parser.add_option( "--run-autotest", action="store_true", dest="run_autotest", help="run autotests (assumes clients and servers are already started and will be stopped manually" ) - option_parser.add_option( "--replicate-on-close", action="store_true", dest="replicate_on_close" ) - option_parser.add_option( "--server-debug-level", action="store", dest="server_debug_level", default=None ) - option_parser.add_option( "--start-autotest-clients", action="store_true", dest="start_autotest_clients" ) - option_parser.add_option( "--start-autotest-servers", action="store_true", dest="start_autotest_servers" ) - option_parser.add_option( "--dir", "--start-dir", action="store_true", dest="start_dir" ) - option_parser.add_option( "--mrc", "--start-mrc", action="store_true", dest="start_mrc" ) - option_parser.add_option( "--osd", "--start-osd", action="store_true", dest="start_osd" ) - option_parser.add_option( "--stop-autotest-clients", action="store_true", dest="stop_autotest_clients" ) - option_parser.add_option( "--stop-autotest-servers", action="store_true", dest="stop_autotest_servers" ) - option_parser.add_option( "--stop-dir", action="store_true", dest="stop_dir" ) - option_parser.add_option( "--stop-mrc", action="store_true", dest="stop_mrc" ) - option_parser.add_option( "--stop-osd", action="store_true", dest="stop_osd" ) - - options, positional_args = option_parser.parse_args() - - if options.client_debug_level is not None: - client_debug_level = options.client_debug_level - elif options.debug_level is not None: - client_debug_level = options.debug_level - else: - client_debug_level = CLIENT_DEBUG_LEVEL_DEFAULT - - if options.server_debug_level is not None: - server_debug_level = options.server_debug_level - elif options.debug_level is not None: - server_debug_level = options.debug_level - else: - server_debug_level = SERVER_DEBUG_LEVEL_DEFAULT - - if len( positional_args ) > 0: - server_uri = positional_args[0] - if not "://" in server_uri: - server_uri = "oncrpc://" + server_uri - else: - server_uri = "oncrpc://localhost" - - if options.autotest or \ - options.clean_autotest or \ - options.run_autotest or \ - options.start_autotest_clients or \ - options.start_autotest_servers or \ - options.stop_autotest_clients or \ - options.stop_autotest_servers: - - autotest = Autotest( osd_count=options.autotest_osd_count, server_uri=server_uri ) - - if options.clean_autotest: - autotest.clean() - else: - ret = 0 - interrupted = False - - if options.start_autotest_servers or options.autotest: - autotest.start_servers( debug_level=server_debug_level ) - - if options.start_autotest_clients or options.autotest: - autotest.start_clients( - debug_level=client_debug_level, - mount_options=options.mount_options, - replicate_on_close=options.replicate_on_close - ) - - if options.run_autotest or options.autotest: - try: - ret = autotest.run() - except KeyboardInterrupt: - interrupted = True - - if options.stop_autotest_clients or options.autotest: - autotest.stop_clients() - - if options.autotest and not interrupted: - autotest.save_server_status_pages() - - if options.stop_autotest_servers or options.autotest: - autotest.stop_servers() - - sys.exit( ret ) - elif options.start_dir or options.stop_dir: - if not options.config_file_path: - options.config_file_path = DIR_CONFIG_FILE_PATH_DEFAULT - - dir = DIR( config_file_path=options.config_file_path ) - - if options.start_dir: - dir.start( log_file_path=options.log_file_path ) - else: - dir.stop() - elif options.start_mrc or options.stop_mrc: - if not options.config_file_path: - options.config_file_path = MRC_CONFIG_FILE_PATH_DEFAULT - - mrc = MRC( config_file_path=options.config_file_path ) - - if options.start_mrc: - mrc.start( log_file_path=options.log_file_path ) - else: - mrc.stop() - elif options.start_osd or options.stop_osd: - if not options.config_file_path: - options.config_file_path = OSD_CONFIG_FILE_PATH_DEFAULT - - osd = OSD( config_file_path=options.config_file_path ) - - if options.start_osd: - osd.start( log_file_path=options.log_file_path ) - else: - osd.stop() - else: - option_parser.print_help() diff --git a/bin/xtfs_chstatus b/bin/xtfs_chstatus deleted file mode 100755 index fae7f58db553a408c0ab961016059c8343a45e81..0000000000000000000000000000000000000000 --- a/bin/xtfs_chstatus +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -check_xtreemfs() { - if [ -z "$XTREEMFS" ]; then - if [ -d src -a -d share ]; then - #echo "Looks like you are in an XtreemFS base directory..." - XTREEMFS=`pwd` - elif [ -d ../src -a -d ../share ]; then - #echo "XTREEMFS base could be the parent directory..." - XTREEMFS=`pwd`/.. - fi - fi - if [ ! -e "$XTREEMFS/src/servers/dist/XtreemFS.jar" -a ! -d "$XTREEMFS/src/servers/lib" -a ! -f "/usr/share/java/XtreemFS.jar" ]; - then - echo "XtreemFS jar could not be found!" - exit 1 - fi -} - -check_java() { - if [ -z "$JAVA_HOME" -a ! -f "/usr/bin/java" ]; then - echo "\$JAVA_HOME not set, JDK/JRE 1.6 required" - exit 1 - fi - - if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=/usr - fi - - JVERS=`$JAVA_HOME/bin/java -version 2>&1 | grep "java version" | \ - cut -d " " -f 3` - perl -e " exit 1 if ($JVERS < \"1.6.0\");" - if [ $? -eq 1 ]; then - echo "Java version is $JVERS. You need JAVA 1.6!!!" - exit 1 - fi - - #echo "Java version $JVERS found under $JAVA_HOME" -} - - -check_xtreemfs -check_java - -exec $JAVA_HOME/bin/java -ea -cp $XTREEMFS/src/servers/dist/XtreemFS.jar:$XTREEMFS/src/servers/lib/*:/usr/share/java/XtreemFS.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar:. \ - org.xtreemfs.utils.xtfs_chstatus $* diff --git a/bin/xtfs_cleanup b/bin/xtfs_cleanup deleted file mode 100755 index fb43701c54b310274e213832fa91ead6b04c13ca..0000000000000000000000000000000000000000 --- a/bin/xtfs_cleanup +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -check_xtreemfs() { - if [ -z "$XTREEMFS" ]; then - if [ -d src -a -d share ]; then - echo "Looks like you are in an XtreemFS base directory..." - XTREEMFS=`pwd` - elif [ -d ../src -a -d ../share ]; then - echo "XTREEMFS base could be the parent directory..." - XTREEMFS=`pwd`/.. - fi - fi - if [ ! -e "$XTREEMFS/src/servers/dist/XtreemFS.jar" -a ! -d "$XTREEMFS/src/servers/lib" -a ! -f "/usr/share/java/XtreemFS.jar" ]; - then - echo "XtreemFS jar could not be found!" - exit 1 - fi -} - -check_java() { - if [ -z "$JAVA_HOME" -a ! -f "/usr/bin/java" ]; then - echo "\$JAVA_HOME not set, JDK/JRE 1.6 required" - exit 1 - fi - - if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=/usr - fi - - JVERS=`$JAVA_HOME/bin/java -version 2>&1 | grep "java version" | \ - cut -d " " -f 3` - perl -e " exit 1 if ($JVERS < \"1.6.0\");" - if [ $? -eq 1 ]; then - echo "Java version is $JVERS. You need JAVA 1.6!!!" - exit 1 - fi - - #echo "Java version $JVERS found under $JAVA_HOME" -} - - -check_xtreemfs -check_java - -exec $JAVA_HOME/bin/java -ea -cp $XTREEMFS/src/servers/dist/XtreemFS.jar:$XTREEMFS/src/servers/lib/*:/usr/share/java/XtreemFS.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar:. \ - org.xtreemfs.utils.xtfs_cleanup_osd $* \ No newline at end of file diff --git a/bin/xtfs_lsvol b/bin/xtfs_lsvol deleted file mode 120000 index 9ac38a77052d908ea039af520cabfbe247867cb8..0000000000000000000000000000000000000000 --- a/bin/xtfs_lsvol +++ /dev/null @@ -1 +0,0 @@ -lsfs.xtreemfs \ No newline at end of file diff --git a/bin/xtfs_mkvol b/bin/xtfs_mkvol deleted file mode 120000 index 2745fc77702b87aaf1a968541d649e04ffee3651..0000000000000000000000000000000000000000 --- a/bin/xtfs_mkvol +++ /dev/null @@ -1 +0,0 @@ -mkfs.xtreemfs \ No newline at end of file diff --git a/bin/xtfs_mount b/bin/xtfs_mount deleted file mode 120000 index 8d8424eca75d5dc2647ddcfbfa08b52accd03759..0000000000000000000000000000000000000000 --- a/bin/xtfs_mount +++ /dev/null @@ -1 +0,0 @@ -mount.xtreemfs \ No newline at end of file diff --git a/bin/xtfs_mrcdbtool b/bin/xtfs_mrcdbtool deleted file mode 100755 index 50226bcc4d1e26c185f3a6a5cac1f0b921827ff6..0000000000000000000000000000000000000000 --- a/bin/xtfs_mrcdbtool +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -check_xtreemfs() { - if [ -z "$XTREEMFS" ]; then - if [ -d AL -a -d java ]; then - echo "Looks like you are in an XtreemFS base directory..." - XTREEMFS=`pwd` - elif [ -d ../AL -a -d ../java ]; then - echo "XTREEMFS base could be the parent directory..." - XTREEMFS=`pwd`/.. - fi - fi - if [ ! -e "$XTREEMFS/src/servers/dist/XtreemFS.jar" -a ! -d "$XTREEMFS/src/servers/lib" -a ! -f "/usr/share/java/XtreemFS.jar" ]; - then - echo "XtreemFS jar could not be found!" - exit 1 - fi -} - -check_java() { - if [ -z "$JAVA_HOME" -a ! -f "/usr/bin/java" ]; then - echo "\$JAVA_HOME not set, JDK/JRE 1.6 required" - exit 1 - fi - - if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=/usr - fi - - JVERS=`$JAVA_HOME/bin/java -version 2>&1 | grep "java version" | \ - cut -d " " -f 3` - perl -e " exit 1 if ($JVERS < \"1.6.0\");" - if [ $? -eq 1 ]; then - echo "Java version is $JVERS. You need JAVA 1.6!!!" - exit 1 - fi - - #echo "Java version $JVERS found under $JAVA_HOME" -} - - -check_xtreemfs -check_java - -exec $JAVA_HOME/bin/java -ea -cp $XTREEMFS/src/servers/dist/XtreemFS.jar:$XTREEMFS/src/servers/lib/*:/usr/share/java/XtreemFS.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar:. \ - org.xtreemfs.utils.xtfs_mrcdbtool $* diff --git a/bin/xtfs_repl b/bin/xtfs_repl deleted file mode 100755 index 0fe6c663d6331574e92aaabe4724ebd9c2ec9392..0000000000000000000000000000000000000000 --- a/bin/xtfs_repl +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -check_xtreemfs() { - if [ -z "$XTREEMFS" ]; then - if [ -d src -a -d share ]; then - #echo "Looks like you are in an XtreemFS base directory..." - XTREEMFS=`pwd` - elif [ -d ../src -a -d ../share ]; then - #echo "XTREEMFS base could be the parent directory..." - XTREEMFS=`pwd`/.. - fi - fi - if [ ! -e "$XTREEMFS/src/servers/dist/XtreemFS.jar" -a ! -d "$XTREEMFS/src/servers/lib" -a ! -f "/usr/share/java/XtreemFS.jar" ]; - then - echo "XtreemFS jar could not be found!" - exit 1 - fi -} - -check_java() { - if [ -z "$JAVA_HOME" -a ! -f "/usr/bin/java" ]; then - echo "\$JAVA_HOME not set, JDK/JRE 1.6 required" - exit 1 - fi - - if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=/usr - fi - - JVERS=`$JAVA_HOME/bin/java -version 2>&1 | grep "java version" | \ - cut -d " " -f 3` - perl -e " exit 1 if ($JVERS < \"1.6.0\");" - if [ $? -eq 1 ]; then - echo "Java version is $JVERS. You need JAVA 1.6!!!" - exit 1 - fi - - #echo "Java version $JVERS found under $JAVA_HOME" -} - - -check_xtreemfs -check_java - -exec $JAVA_HOME/bin/java -ea -cp $XTREEMFS/src/servers/dist/XtreemFS.jar:$XTREEMFS/src/servers/lib/*:/usr/share/java/XtreemFS.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar:. \ - org.xtreemfs.utils.xtfs_repl $* diff --git a/bin/xtfs_rmvol b/bin/xtfs_rmvol deleted file mode 120000 index 287c8d754ff4a4e20df52a9fcf251a861f245991..0000000000000000000000000000000000000000 --- a/bin/xtfs_rmvol +++ /dev/null @@ -1 +0,0 @@ -rmfs.xtreemfs \ No newline at end of file diff --git a/bin/xtfs_scrub b/bin/xtfs_scrub deleted file mode 100755 index 7b31a9b68beeff1fc8fe0e01556c8de01ffb6cd5..0000000000000000000000000000000000000000 --- a/bin/xtfs_scrub +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -check_xtreemfs() { - if [ -z "$XTREEMFS" ]; then - if [ -d src -a -d share ]; then - #echo "Looks like you are in an XtreemFS base directory..." - XTREEMFS=`pwd` - elif [ -d ../src -a -d ../share ]; then - #echo "XTREEMFS base could be the parent directory..." - XTREEMFS=`pwd`/.. - fi - fi - if [ ! -e "$XTREEMFS/src/servers/dist/XtreemFS.jar" -a ! -d "$XTREEMFS/src/servers/lib" -a ! -f "/usr/share/java/XtreemFS.jar" ]; - then - echo "XtreemFS jar could not be found!" - exit 1 - fi -} - -check_java() { - if [ -z "$JAVA_HOME" -a ! -f "/usr/bin/java" ]; then - echo "\$JAVA_HOME not set, JDK/JRE 1.6 required" - exit 1 - fi - - if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=/usr - fi - - JVERS=`$JAVA_HOME/bin/java -version 2>&1 | grep "java version" | \ - cut -d " " -f 3` - perl -e " exit 1 if ($JVERS < \"1.6.0\");" - if [ $? -eq 1 ]; then - echo "Java version is $JVERS. You need JAVA 1.6!!!" - exit 1 - fi - - #echo "Java version $JVERS found under $JAVA_HOME" -} - - -check_xtreemfs -check_java - -exec $JAVA_HOME/bin/java -ea -cp $XTREEMFS/src/servers/dist/XtreemFS.jar:$XTREEMFS/src/servers/lib/*:/usr/share/java/XtreemFS.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar:. \ - org.xtreemfs.common.clients.simplescrubber.Scrubber $* diff --git a/bin/xtfs_sp b/bin/xtfs_sp deleted file mode 100755 index bc3800109708bdb5be3e02b418771282364cfd0d..0000000000000000000000000000000000000000 --- a/bin/xtfs_sp +++ /dev/null @@ -1,129 +0,0 @@ -#! /usr/bin/python -# -# Copyright (c) 2009 Konrad-Zuse-Zentrum fuer Informationstechnik Berlin. -# -# This file is part of XtreemFS. XtreemFS is part of XtreemOS, a Linux-based -# Grid Operating System, see for more details. -# The XtreemOS project has been developed with the financial support of the -# European Commission's IST program under contract #FP6-033576. -# -# XtreemFS 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. -# -# XtreemFS 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 XtreemFS. If not, see . -# -# -# AUTHORS: Bjoern Kolbeck (ZIB) -# -import subprocess -import sys -import json -from optparse import OptionParser - -spxattr = "xtreemfs.default_sp" - -def createCliParser(): - usage = "usage: %prog [options] directory" - parser = OptionParser(usage=usage) - parser.add_option("--get", - action="store_true", dest="get", - help="get the default striping policy") - parser.add_option("--set", - action="store_true", dest="set", - help="set the default striping policy") - parser.add_option("-p", "--striping-policy", dest="policy", - help="striping policy", metavar="NONE|RAID0") - parser.add_option("-s", "--striping-policy-stripe-size", dest="size", - help="size of stripes in kB", metavar="n") - parser.add_option("-w", "--striping-policy-width", dest="width", - help="number of OSDs to use", metavar="n") - parser.add_option("-v","--verbose", - action="store_true", dest="verbose", - help="print more information") - - return parser; - - -def doGet(filename, options): - (success, value) = readxattr(filename,spxattr) - if (success == False): - print "error: "+value - return 1 - else: - if (value == ""): - print "no default striping policy set" - return 2 - else: - try: - sp = json.loads(value) - printSP(filename,sp) - except ValueError, arg: - print "cannot decode server response: ",arg - return 2 - return 0 - -def doSet(filename, options): - if (options.size == None or options.width == None or options.policy == None): - print "must specify polciy, width and size!" - return 1 - - tmp = {"pattern":"STRIPING_POLICY_RAID0","width":int(options.width),"size":int(options.size)} - newsp = json.dumps(tmp); - (success, error) = setxattr(filename,spxattr,newsp) - if (success == False): - print "cannot set striping policy:",error - return 1 - else: - print "changed default striping policy for",filename - if options.verbose: - printSP(filename,tmp) - return 0 - -def printSP(filename,sp): - print "file: ",filename - print "policy: ",sp['pattern'] - print "stripe-size (kB): ",sp['size'] - print "width: ",sp['width'] - -def readxattr(filename, attr): - cmd = ["getfattr","--absolute-names","--only-values","-n",attr,filename] - process = subprocess.Popen(cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE) - (out,err) = process.communicate() - if (process.returncode != 0) or (err != ""): - return (False, err) - return (True, out) - -def setxattr(filename, attr, value): - cmd = ["setfattr","-n",attr,"-v",value,filename] - process = subprocess.Popen(cmd, stdout=subprocess.PIPE,stderr=subprocess.PIPE) - (out,err) = process.communicate() - if (process.returncode != 0) or (err != ""): - return (False, err) - return (True, None) - -def main(argv): - parser = createCliParser() - (options, args) = parser.parse_args() - if len(args) != 1: - parser.error("must specify a directory name") - return 1 - if ( options.get == True ): - return doGet(args[0],options); - elif ( options.set == True ): - return doSet(args[0],options); - else: - parser.error("must either specify --get or --set") - return 1 - - -if __name__ == "__main__": - returnvalue = main(sys.argv) - sys.exit(returnvalue) diff --git a/bin/xtfs_stat b/bin/xtfs_stat deleted file mode 100755 index 962d949f333207b1971813910a937faf9eedc651..0000000000000000000000000000000000000000 --- a/bin/xtfs_stat +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -check_xtreemfs() { - if [ -z "$XTREEMFS" ]; then - if [ -d src -a -d share ]; then - #echo "Looks like you are in an XtreemFS base directory..." - XTREEMFS=`pwd` - elif [ -d ../src -a -d ../share ]; then - #echo "XTREEMFS base could be the parent directory..." - XTREEMFS=`pwd`/.. - fi - fi - if [ ! -e "$XTREEMFS/src/servers/dist/XtreemFS.jar" -a ! -d "$XTREEMFS/src/servers/lib" -a ! -f "/usr/share/java/XtreemFS.jar" ]; - then - echo "XtreemFS jar could not be found!" - exit 1 - fi -} - - -check_java() { - if [ -z "$JAVA_HOME" -a ! -f "/usr/bin/java" ]; then - echo "\$JAVA_HOME not set, JDK/JRE 1.6 required" - exit 1 - fi - - if [ -z "$JAVA_HOME" ]; then - JAVA_HOME=/usr - fi - - JVERS=`$JAVA_HOME/bin/java -version 2>&1 | grep "java version" | \ - cut -d " " -f 3` - perl -e " exit 1 if ($JVERS < \"1.6.0\");" - if [ $? -eq 1 ]; then - echo "Java version is $JVERS. You need JAVA 1.6!!!" - exit 1 - fi - - #echo "Java version $JVERS found under $JAVA_HOME" -} - - -check_xtreemfs -check_java - -exec $JAVA_HOME/bin/java -ea -cp $XTREEMFS/src/servers/dist/XtreemFS.jar:$XTREEMFS/src/servers/lib/*:/usr/share/java/XtreemFS.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar:. \ - org.xtreemfs.utils.xtfs_stat $* diff --git a/bin/xtfs_umount b/bin/xtfs_umount deleted file mode 120000 index 99938178842582ea53fe45d1f9ea4760f02ce9c1..0000000000000000000000000000000000000000 --- a/bin/xtfs_umount +++ /dev/null @@ -1 +0,0 @@ -umount.xtreemfs \ No newline at end of file diff --git a/contrib/console/README.txt b/contrib/console/README.txt deleted file mode 100644 index f0268cdabde7f455ad93c78e9ec3aa375caabd18..0000000000000000000000000000000000000000 --- a/contrib/console/README.txt +++ /dev/null @@ -1,46 +0,0 @@ -This is a web based admin console for XtreemFS (release 1.2). -It requires Java 1.6+ and a Tomcat 5.x+. - -The console includes Google's GWT which is copyright by Google and -licensed under the apache license 2.0 (see -http://code.google.com/webtoolkit/terms.html for details). - -XtreemFS is copyright by ZIB, NEC, BSC and CNR and licensed -under GPLv2. For details see http://www.xtreemfs.org - -This console is copyright by Bjoern Kolbeck, ZIB. - - -INSTALLATION ------------- -Install with Tomcat's manager. - -CONFIGURATION -------------- -You have to edit 'config.properties' and 'users.properties' -which are both located in the root directory of the webapp. - -In 'users.properties' add a line with = -for each user. - -In 'config.properties' you should add a list of directory -services you would like to access with this console. Usually, -this is only a single DIR, e.g. -dir_servers = oncrpc://myDIRmachine:32638 - -If you use SSL or GridSSL you have to use oncrpcs or oncrpcg instead. -In addition, you have to configure which client certificate and -which trusted certificates to use: -ssl.service_creds = /etc/xos/xtreemfs/client.p12 -ssl.service_creds.pw = passphrase -ssl.service_creds.container = pkcs12 - -ssl.trusted_certs = /etc/xos/xtreemfs/trusted.jks -ssl.trusted_certs.pw = passphrase -ssl.trusted_certs.container = jks - -If you want to use google maps, you have to get a -key from Google for your site and store it in -google_maps_key = ABCDEFG... -You don't need a key if you run the console on your local machine -only. diff --git a/contrib/console/XtreemFSConsole.war b/contrib/console/XtreemFSConsole.war deleted file mode 100644 index 1df0088d9af8c5ab3a898e275d84a081e331d45d..0000000000000000000000000000000000000000 Binary files a/contrib/console/XtreemFSConsole.war and /dev/null differ diff --git a/contrib/hadoop/build.xml b/contrib/hadoop/build.xml deleted file mode 100644 index 9ee471869a8d4668885950a02f5ee820c1233cf5..0000000000000000000000000000000000000000 --- a/contrib/hadoop/build.xml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - - Builds, tests, and runs the project HadoopClient. - - - diff --git a/contrib/hadoop/manifest.mf b/contrib/hadoop/manifest.mf deleted file mode 100644 index 328e8e5bc3b7f1f7bad2bc0751a933e00c801983..0000000000000000000000000000000000000000 --- a/contrib/hadoop/manifest.mf +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -X-COMMENT: Main-Class will be added automatically by build - diff --git a/contrib/hadoop/nbproject/build-impl.xml b/contrib/hadoop/nbproject/build-impl.xml deleted file mode 100644 index f37f902c337d606a6556fd748e6ff2fa76a35b07..0000000000000000000000000000000000000000 --- a/contrib/hadoop/nbproject/build-impl.xml +++ /dev/null @@ -1,704 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set src.dir - Must set test.src.dir - Must set build.dir - Must set dist.dir - Must set build.classes.dir - Must set dist.javadoc.dir - Must set build.test.classes.dir - Must set build.test.results.dir - Must set build.classes.excludes - Must set dist.jar - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - - - - - - java -cp "${run.classpath.with.dist.jar}" ${main.class} - - - - - - - - - - - - - - - - - - - - - - - To run this application from the command line without Ant, try: - - java -jar "${dist.jar.resolved}" - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set run.class - - - - Must select one file in the IDE or set run.class - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set debug.class - - - - - Must select one file in the IDE or set debug.class - - - - - Must set fix.includes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select some files in the IDE or set javac.includes - - - - - - - - - - - - - - - - - - - - Some tests failed; see details above. - - - - - - - - - Must select some files in the IDE or set test.includes - - - - Some tests failed; see details above. - - - - - Must select one file in the IDE or set test.class - - - - - - - - - - - - - - - - - - - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - Must select one file in the IDE or set applet.url - - - - - - - - - - - - - - - - - - - - - diff --git a/contrib/hadoop/nbproject/genfiles.properties b/contrib/hadoop/nbproject/genfiles.properties deleted file mode 100644 index cd6ee53fb1554acd2c208f914db2d342cb7ed38a..0000000000000000000000000000000000000000 --- a/contrib/hadoop/nbproject/genfiles.properties +++ /dev/null @@ -1,8 +0,0 @@ -build.xml.data.CRC32=025f174c -build.xml.script.CRC32=306b2296 -build.xml.stylesheet.CRC32=958a1d3e@1.26.2.45 -# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. -# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=025f174c -nbproject/build-impl.xml.script.CRC32=495ad5c3 -nbproject/build-impl.xml.stylesheet.CRC32=5c621a33@1.26.2.45 diff --git a/contrib/hadoop/nbproject/project.properties b/contrib/hadoop/nbproject/project.properties deleted file mode 100644 index 1e4b50b943afcf7058653b675995213b533dd7b6..0000000000000000000000000000000000000000 --- a/contrib/hadoop/nbproject/project.properties +++ /dev/null @@ -1,72 +0,0 @@ -build.classes.dir=${build.dir}/classes -build.classes.excludes=**/*.java,**/*.form -# This directory is removed when the project is cleaned: -build.dir=build -build.generated.dir=${build.dir}/generated -build.generated.sources.dir=${build.dir}/generated-sources -# Only compile against the classpath explicitly listed here: -build.sysclasspath=ignore -build.test.classes.dir=${build.dir}/test/classes -build.test.results.dir=${build.dir}/test/results -# Uncomment to specify the preferred debugger connection transport: -#debug.transport=dt_socket -debug.classpath=\ - ${run.classpath} -debug.test.classpath=\ - ${run.test.classpath} -# This directory is removed when the project is cleaned: -dist.dir=dist -dist.jar=${dist.dir}/HadoopClient.jar -dist.javadoc.dir=${dist.dir}/javadoc -excludes= -file.reference.hadoop-0.20.1-core.jar=../../../hadoop-0.20.1/hadoop-0.20.1-core.jar -file.reference.yidl.jar=../../src/servers/lib/yidl.jar -file.reference.Foundation.jar=../../src/foundation/dist/Foundation.jar -includes=** -jar.compress=false -javac.classpath=\ - ${file.reference.yidl.jar}:\ - ${file.reference.Foundation.jar}:\ - ${reference.XtreemFS.jar}:\ - ${file.reference.hadoop-0.20.1-core.jar} - -# Space-separated list of extra javac options -javac.compilerargs= -javac.deprecation=false -javac.source=1.5 -javac.target=1.5 -javac.test.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir}:\ - ${libs.junit.classpath}:\ - ${libs.junit_4.classpath} -javadoc.additionalparam= -javadoc.author=false -javadoc.encoding=${source.encoding} -javadoc.noindex=false -javadoc.nonavbar=false -javadoc.notree=false -javadoc.private=false -javadoc.splitindex=true -javadoc.use=true -javadoc.version=false -javadoc.windowtitle= -main.class= -manifest.file=manifest.mf -meta.inf.dir=${src.dir}/META-INF -platform.active=default_platform -project.XtreemFS=../../src/servers -reference.XtreemFS.jar=${project.XtreemFS}/dist/XtreemFS.jar -run.classpath=\ - ${javac.classpath}:\ - ${build.classes.dir} -# Space-separated list of JVM arguments used when running the project -# (you may also define separate properties like run-sys-prop.name=value instead of -Dname=value -# or test-sys-prop.name=value to set system properties for unit tests): -run.jvmargs= -run.test.classpath=\ - ${javac.test.classpath}:\ - ${build.test.classes.dir} -source.encoding=UTF-8 -src.dir=src -test.src.dir=test diff --git a/contrib/hadoop/nbproject/project.xml b/contrib/hadoop/nbproject/project.xml deleted file mode 100644 index 0b717b56cc6c4466ed8362fc50b89fa6b7f35c48..0000000000000000000000000000000000000000 --- a/contrib/hadoop/nbproject/project.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - org.netbeans.modules.java.j2seproject - - - HadoopClient - - - - - - - - - - XtreemFS - jar - - jar - clean - jar - - - - diff --git a/contrib/hadoop/src/org/xtreemfs/common/clients/hadoop/XtreemFSFileSystem.java b/contrib/hadoop/src/org/xtreemfs/common/clients/hadoop/XtreemFSFileSystem.java deleted file mode 100644 index 56b9ea0ce675ea1ea8430ce9191d1b98586d3e3f..0000000000000000000000000000000000000000 --- a/contrib/hadoop/src/org/xtreemfs/common/clients/hadoop/XtreemFSFileSystem.java +++ /dev/null @@ -1,336 +0,0 @@ -/* Copyright (c) 2009 Konrad-Zuse-Zentrum fuer Informationstechnik Berlin. - - This file is part of XtreemFS. XtreemFS is part of XtreemOS, a Linux-based - Grid Operating System, see for more details. - The XtreemOS project has been developed with the financial support of the - European Commission's IST program under contract #FP6-033576. - - XtreemFS 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. - - XtreemFS 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 XtreemFS. If not, see . -*/ -/* - * AUTHORS: Björn Kolbeck (ZIB) - */ - -package org.xtreemfs.common.clients.hadoop; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.OutputStream; -import java.net.InetSocketAddress; -import java.net.URI; -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.fs.FSDataInputStream; -import org.apache.hadoop.fs.FSDataOutputStream; -import org.apache.hadoop.fs.FSInputStream; -import org.apache.hadoop.fs.FileStatus; -import org.apache.hadoop.fs.FileSystem; -import org.apache.hadoop.fs.Path; -import org.apache.hadoop.fs.permission.FsPermission; -import org.apache.hadoop.util.Progressable; -import org.xtreemfs.common.clients.Client; -import org.xtreemfs.common.clients.File; -import org.xtreemfs.common.clients.RandomAccessFile; -import org.xtreemfs.common.clients.Volume; -import org.xtreemfs.foundation.logging.Logging; -import org.xtreemfs.foundation.logging.Logging.Category; -import org.xtreemfs.interfaces.Constants; -import org.xtreemfs.interfaces.DirectoryEntry; -import org.xtreemfs.interfaces.Stat; -import org.xtreemfs.interfaces.StringSet; -import org.xtreemfs.interfaces.UserCredentials; - -/** - * A XtreemFS driver for hadoop - * URI format: xtreemfs://dirAddr:port/path... - * required configuration: - *
- * 
- * xtreemfs.volumeName
- * volumeName
- * Name of the volume to use within XtreemFS.
- * 
- * 
- * 
- * fs.xtreemfs.impl
- * org.xtreemfs.common.clients.hadoop.XtreemFSFileSystem
- * The FileSystem for xtreemfs: uris.
- * 
- * 
- * @author bjko - */ -public class XtreemFSFileSystem extends FileSystem { - - private Client xtreemfsClient; - - private Volume volume; - - private URI fsURI; - - private Path workingDirectory; - - - @Override - public void initialize(URI uri, Configuration conf) throws IOException { - super.initialize(uri, conf); - int logLevel = Logging.LEVEL_WARN; - if (conf.getBoolean("xtreemfs.client.debug",false)) { - logLevel = Logging.LEVEL_DEBUG; - } - - String volumeName = conf.get("xtreemfs.volumeName"); - if (volumeName == null) - throw new IOException("You have to specify a volume name at the" + - " core-site.xml! (xtreemfs.volumeName)"); - - Logging.start(logLevel, Category.all); - Logging.logMessage(Logging.LEVEL_DEBUG, this,"init : "+uri); - InetSocketAddress dir = new InetSocketAddress(uri.getHost(), uri.getPort()); - xtreemfsClient = new Client(new InetSocketAddress[]{dir}, 30*1000, 15*60*1000, null); - try { - xtreemfsClient.start(); - } catch (Exception ex) { - throw new IOException("cannot start XtreemFS client", ex); - } - - UserCredentials uc = null; - if ( (conf.get("xtreemfs.client.userid") != null) - && (conf.get("xtreemfs.client.groupid") != null) ){ - StringSet grps = new StringSet(); - grps.add(conf.get("xtreemfs.client.groupid")); - uc = new UserCredentials(conf.get("xtreemfs.client.userid"), grps, ""); - } - if (uc == null) { - //try to guess from env - if (System.getenv("USER") != null) { - StringSet grps = new StringSet(); - grps.add("users"); - uc = new UserCredentials(System.getProperty("user.name"), grps, ""); - } - } - - fsURI = uri; - workingDirectory = getHomeDirectory(); - volume = xtreemfsClient.getVolume(volumeName, uc); - Logging.logMessage(Logging.LEVEL_DEBUG, this,"file system init complete: "+uri.getUserInfo()); - } - - @Override - public URI getUri() { - return fsURI; - } - - @Override - public FSDataInputStream open(Path file, final int buffSize) throws IOException { - final String path = file.toUri().getPath(); - File f = volume.getFile(path); - final RandomAccessFile raf = f.open("r",0); - - return new FSDataInputStream(new FSInputStream() { - - @Override - public void seek(long pos) throws IOException { - raf.seek(pos); - } - - @Override - public long getPos() throws IOException { - return raf.getFilePointer(); - } - - @Override - public boolean seekToNewSource(long arg0) throws IOException { - return false; - } - - @Override - public int read() throws IOException { - byte[] b = new byte[1]; - int numRead = raf.read(b,0,1); - if (numRead == 0) - return -1; - return b[0]; - } - - @Override - public int read(byte[] b, int off, int len) throws IOException { - int nbRead = raf.read(b,off,len); - if ((nbRead == 0) && (len > 0)) - return -1; - else - return nbRead; - } - - @Override - public int read(byte[] b) throws IOException { - return raf.read(b,0,b.length); - } - }); - - } - - @SuppressWarnings("deprecation") - @Override - public FSDataOutputStream create(Path file, FsPermission permissions, - boolean overwrite, int bufferSize, short replication, long blockSize, Progressable prog) throws IOException { - final String path = file.toUri().getPath(); - File f = volume.getFile(path); - String openMode = "rw"; - if (overwrite) - openMode += "t"; - - final RandomAccessFile raf = f.open(openMode,permissions.toShort()); - - return new FSDataOutputStream(new OutputStream() { - - @Override - public void write(byte[] b, int off, int len) throws IOException { - raf.write(b,off,len); - } - - @Override - public void write(byte[] b) throws IOException { - raf.write(b,0,b.length); - } - - @Override - public void write(int b) throws IOException { - raf.write(new byte[]{(byte)b},0,1); - } - - @Override - public void close() throws IOException { - raf.close(); - } - }); - } - - @Override - public FSDataOutputStream append(Path arg0, int arg1, Progressable arg2) throws IOException { - throw new UnsupportedOperationException("Not supported yet."); - } - - @Override - public boolean rename(Path src, Path dest) throws IOException { - final String srcPath = src.toUri().getPath(); - final String destPath = dest.toUri().getPath(); - - File srcFile = volume.getFile(srcPath); - File destFile = volume.getFile(destPath); - srcFile.renameTo(destFile); - return true; - } - - @Override - public boolean delete(Path file) throws IOException { - return delete(file,false); - } - - @Override - public boolean delete(Path file, boolean recursive) throws IOException { - try { - final String path = file.toUri().getPath(); - return delete(path); - } catch (FileNotFoundException f) { - Logging.logMessage(Logging.LEVEL_WARN, this, "'%s' could not be " + - "deleted, because it is not available.", file.toString()); - return false; - } - } - - protected boolean delete(String path) throws IOException { - Logging.logMessage(Logging.LEVEL_DEBUG, this,"getattr: "+path); - File f = volume.getFile(path); - if (f.isDirectory()) { - - //delete all entries - String[] entries = volume.list(path); - for (String e : entries) { - if (delete(path+"/"+e) == false) - return false; - } - f.delete(); - - return true; - } else { - //file - f.delete(); - return true; - } - } - - @Override - public FileStatus[] listStatus(Path hdPath) throws IOException { - if (hdPath == null) return null; - - final String path = hdPath.toUri().getPath(); - Logging.logMessage(Logging.LEVEL_DEBUG, this,"ls: "+path); - DirectoryEntry[] list = volume.listEntries(path); - if (list == null) return null; - - FileStatus[] fslist = new FileStatus[list.length]; - for (int i = 0; i < list.length; i++) { - final DirectoryEntry e = list[i]; - final Stat s = e.getStbuf().get(0); - final boolean isDir = (s.getMode() & Constants.SYSTEM_V_FCNTL_H_S_IFDIR) > 0; - fslist[i] = new FileStatus(s.getSize(), isDir , 1, 1,(long) (s.getMtime_ns() / 1e6), - (long) (s.getAtime_ns() / 1e6), new FsPermission((short)s.getMode()), - s.getUser_id(), s.getGroup_id(), new Path(hdPath,e.getName())); - } - return fslist; - } - - @Override - public void setWorkingDirectory(Path arg0) { - this.workingDirectory = arg0; - } - - @Override - public Path getWorkingDirectory() { - return this.workingDirectory; - } - - @Override - public boolean mkdirs(Path path, FsPermission perm) throws IOException { - final String pathStr = path.toUri().getPath(); - final String[] dirs = pathStr.split("/"); - String tmpPath = ""; - for (String dir : dirs) { - tmpPath += dir+"/"; - File d = volume.getFile(tmpPath); - if (d.exists()) { - if (!d.isDirectory()) - return false; - } else { - d.mkdir((int)perm.toShort()); - } - } - return true; - } - - @Override - public FileStatus getFileStatus(Path file) throws IOException { - final String path = file.toUri().getPath(); - Logging.logMessage(Logging.LEVEL_DEBUG, this,"getattr: "+path); - File f = volume.getFile(path); - Stat s = f.stat(); - final boolean isDir = (s.getMode() & Constants.SYSTEM_V_FCNTL_H_S_IFDIR) > 0; - return new FileStatus(s.getSize(), isDir , 1, 1,(long) (s.getMtime_ns() / 1e6), - (long) (s.getAtime_ns() / 1e6), new FsPermission((short)s.getMode()), - s.getUser_id(), s.getGroup_id(), file); - } - - public void close() { - xtreemfsClient.stop(); - } -} diff --git a/doc/BabuDBMetadataMapping.txt b/doc/BabuDBMetadataMapping.txt deleted file mode 100644 index 1405dbf593d6e6302dde6526043e53447c65b306..0000000000000000000000000000000000000000 --- a/doc/BabuDBMetadataMapping.txt +++ /dev/null @@ -1,207 +0,0 @@ -This document describes how XtreemFS metadata in the MRC is mapped to BabuDB -database indices. - - -1 VERSIONING -============================================================================== - -The current version of the MRC is stored in a database named 'V'. There is -only one index containing a single key-value pair (numbers indicate entry -sizes in bytes): - -VERSION (BabuDB index #0) - - The version index only contains one key-value pair that indicates the current - version of the database. -|----------------------------------------------------------------------------| -|key | version | -| | 1 ('v') | -|----------------------------------------------------------------------------| -|value | currentVersionNumber | -| | 4 | -|----------------------------------------------------------------------------| - - -2 FILE SYSTEM METADATA -============================================================================== - -File system metadata of a volume is stored in a BabuDB database with the name -of the volume ID. The following indices exist, with the following types (the -numbers define different value types): - -FILE_INDEX XATTR_INDEX FILE_ID_INDEX --------------- ------------- ------------------- -atime 0 XAttrs parentID + fileName -ctime 0 -mtime 0 -size 0 -type 1 -id 1 -permissions 1 ACL_INDEX LAST_ID_INDEX -linkCount 1 ---------- ------------------ -epoch 1 ACLEntries lastAssignedFileID -issuedEpoch 1 -readOnlyFlag 1 -fileName 1 -owner 1 -group 1 -xLocList 1 - - -Indices are structured as follows (numbers indicate entry sizes in bytes): - - FILE_INDEX (BabuDB index #0) - - The file index stores the primary metadata of a file or directory. This - encapsulates most of the metadata returned by the 'stat' system call. To - reduce the size of log entries, metadata has been grouped according to their - types: type-0 metadata reflects frequently-changed metadata like time stamps - and the file size, while less frequently-changed metadata like access - permissions and ownership are defined as type-1 metadata. X-Locations lists - which are frequently accessed w/ I/O operations but rarely changed are - defined as type-3 metadata. Each such type has its own key in the index. -|----------------------------------------------------------------------------| -|key | parentID filename type | -| | 8 var 1 | -|----------------------------------------------------------------------------| -|value | frequentlyChangedMetadata | -|type=0| 20 (files), 12 (directories) | -|----------------------------------------------------------------------------| -|value | rarelyChangedMetadata | -|type=1| var (files & directories), 9 (link targets) | -|----------------------------------------------------------------------------| - - - XATTR_INDEX (BabuDB index #1) - - The extended attribute index contains any user-defined extended attributes - assigned to files or directories. Softlink targets and default striping - policies are mapped to extended attributes -|----------------------------------------------------------------------------| -|key | fileID hash(owner) hash(attrKey) collisionCount | -| | 8 4 4 2 | -|----------------------------------------------------------------------------| -|value | keyOffset valueOffset attrOwner attrKey attrValue | -| | 2 2 var var var | -|----------------------------------------------------------------------------| - - - ACL_INDEX (BabuDB index #2) - - The ACL index stores optional access control lists for files. -|----------------------------------------------------------------------------| -|key | fileID entityName | -| | 8 var | -|----------------------------------------------------------------------------| -|value | rights | -| | 2 | -|----------------------------------------------------------------------------| - - - FILE_ID_INDEX (BabuDB index #3) - - The file ID index is used to retrieve file metadata by means of its ID. It - may either map a file ID to a key in the file index, or directly to the three - different types of primary file metadata (i.e. types 0-1). The former kind of - mapping is used to retrieve file metadata by means of file IDs, which is - necessary with some operations that provide a file ID instead of a path. The - latter sort of mapping is used to retrieve a file's metadata if the file is - referenced by multiple hard links (type 2). In this case, the file's entries - in the file index map to the corresponding prefix key in the file ID index. -|----------------------------------------------------------------------------| -|key | fileID type | -| | 8 1 | -|----------------------------------------------------------------------------| -|value | frequentlyChangedMetadata | -|type=0| 20 (files), 12 (directories) | -|----------------------------------------------------------------------------| -|value | rarelyChangedMetadata | -|type=1| var | -|----------------------------------------------------------------------------| -|value | parentID fileName | -|type=2| 8 var | -|----------------------------------------------------------------------------| - - -VOLUME_INDEX (BabuDB index #4) - - The 'VOLUME_INDEX' index stores single key-value pairs that contain volume- - related information, including the last ID assigned to a file, the current - number of files and directories in the volume, as well as the current size of - the volume in bytes. -|----------------------------------------------------------------------------| -|key | type | -| | 1 (one of {'i', 's', 'f', 'd'}) | -|----------------------------------------------------------------------------| -|value | longValue | -| | 8 | -|----------------------------------------------------------------------------| - - -Complex data types are mapped as follows: - - -frequentlyChangedMetadata - comprises file/directory metadata that is - frequently changed - - files: -|----------------------------------------------------------------------------| -|atime ctime mtime size | -|4 4 4 8 | -|----------------------------------------------------------------------------| - - directories: -|----------------------------------------------------------------------------| -|atime ctime mtime | -|4 4 4 | -|----------------------------------------------------------------------------| - - -rarelyChangedMetadata - comprises file/directory metadata that is rarely - changed - - files: -|----------------------------------------------------------------------------| -|type id permissions linkCount w32attrs epoch issuedEpoch readOnlyFlag| -|1 8 4 2 8 4 4 1 | -| | -|groupOffset xLocOffset owner group xLocList | -|2 2 var var var | -|----------------------------------------------------------------------------| - - directories: -|----------------------------------------------------------------------------| -|type id permissions linkCount w32attrs groupOffset owner group | -|1 8 4 2 8 2 var var | -|----------------------------------------------------------------------------| - - link targets: -|----------------------------------------------------------------------------| -|type id | -|1 8 | -|----------------------------------------------------------------------------| - - -xLocList - represents an X-Locations list of a file -|----------------------------------------------------------------------------| -|version numReplicas replUpdPolOffs repl1Offs ... replNOffs | -|4 4 4 4 4 | -| | -|xLoc1 ... xLocN replUpdPol | -|var var var | -|----------------------------------------------------------------------------| - -xLoc - represents a single replica in an X-Locations list -|----------------------------------------------------------------------------| -|osdListOffset replFlags stripingPolicy numOSDs osd1ofs ... osdnofs | -|2 4 var 2 2 2 | -| | -|osd1 ... osdn | -|var var | -|----------------------------------------------------------------------------| - -stripingPolicy - represents a striping policy -|----------------------------------------------------------------------------| -|stripeSize width pattern | -|4 4 var | -|----------------------------------------------------------------------------| diff --git a/doc/dev-guide/bib.bib b/doc/dev-guide/bib.bib deleted file mode 100644 index 37f547799215436bd529f80e752867829b7102ee..0000000000000000000000000000000000000000 --- a/doc/dev-guide/bib.bib +++ /dev/null @@ -1,133 +0,0 @@ -@inproceedings{StripingLasco, - author = {Stender,, Jan and Kolbeck,, Bj\"{o}rn and Hupfeld,, Felix and Cesario,, Eugenio and Focht,, Erich and Hess,, Matthias and Malo,, Jes\'{u}s and Mart\'{\i},, Jonathan}, - title = {Striping without sacrifices: maintaining POSIX semantics in a parallel file system}, - booktitle = {LASCO'08: First USENIX Workshop on Large-Scale Computing}, - year = {2008}, - pages = {1--8}, - location = {Boston, MA}, - publisher = {USENIX Association}, - address = {Berkeley, CA, USA}, -} - -@article{dabek2004vdn, - title={{Vivaldi: A decentralized network coordinate system}}, - author={Dabek, F. and Cox, R. and Kaashoek, F. and Morris, R.}, - journal={ACM SIGCOMM Computer Communication Review}, - volume={34}, - number={4}, - pages={15--26}, - year={2004}, - publisher={ACM New York, NY, USA} -} -@inproceedings{itzkovitz1999multiview, - author = {Ayal Itzkovitz and Assaf Schuster}, - title = {MultiView and Millipage -- fine-grain sharing in page-based DSMs}, - booktitle = {OSDI '99: Proceedings of the third symposium on Operating systems design and implementation}, - year = {1999}, - isbn = {1-880446-39-1}, - pages = {215--228}, - location = {New Orleans, Louisiana, United States}, - publisher = {USENIX Association}, - address = {Berkeley, CA, USA}, -} -@techreport{xos:ossuserguide, - author = {{XtreemOS} consortium}, - institution = {{XtreemOS} consortium}, - title = {Deliverable {D3.4.3}: {XtreemFS and Object Sharing Service: Second Prototype}}, - year = 2009, -} -@techreport{xos:xossaga, - author = {{XtreemOS} consortium}, - institution = {{XtreemOS} consortium}, - title = {Deliverable {D3.1.5}: {Third Draft Specification of Programming Interfaces}}, - year = 2009, -} - -@PHDTHESIS{kroeger1996pfs, - author = {Kroeger, T.M.}, - title = {{Predicting File System Actions From Reference Patterns}}, - school = {University of California}, - year = {1996}, - file = {:home/jmarti/Grids/ReplicaPrediction/Papers/Predicting File System - Actions From Reference Patterns.pdf:PDF}, - owner = {jmarti}, - timestamp = {2008.05.30} -} - -@ARTICLE{kroeger2001dai, - author = {Kroeger, T.M. and Long, D.D.E.}, - title = {{Design and Implementation of a Predictive File Prefetching Algorithm}}, - journal = {Proceedings of the General Track: 2002 USENIX Annual Technical Conference - table of contents}, - year = {2002}, - pages = {105--118}, - file = {:home/jmarti/Grids/ReplicaPrediction/Papers/Design and Implementation - of a Predictive File Prefetching Algorithm.pdf:PDF}, - owner = {jmarti}, - publisher = {USENIX Association Berkeley, CA, USA}, - timestamp = {2008.05.30} -} - -@inproceedings{XtreemFS, - author = {Felix Hupfeld and Toni Cortes and Bjoern Kolbeck and Jan Stender and Erich Focht and Matthias Hess and Jesus Malo and Jonathan Marti and Eugenio Cesario}, - title = {Xtreem{FS}: a case for object-based storage in {G}rid data management}, - booktitle = {3rd VLDB Workshop on Data Management in Grids, co-located with VLDB 2007}, - year = {2007}, - location = {Vienna, Austria} -} - -@article{ mesnier03objectbased, - author = "M. Mesnier and G. Ganger and E. Riedel", - title = "Object-based Storage", - journal = "IEEE Communications Magazine", - volume = {8}, - issue = {41}, - pages = {84-90}, - publisher = "IEEE", - year = "2003", - url = "citeseer.ist.psu.edu/mesnier03objectbased.html" } - -@inproceedings{objStore, - author = {Michael Factor and Kalman Meth and Dalit Naor and Ohad Rodeh and Julian Satran}, - title = {Object Storage: The Future Building Block for Storage Systems}, - booktitle = {2nd International IEEE Symposium on Mass Storage Systems and Technologies}, - location = {Sardinia, Italy}, - year = {2005} -} - -@inproceedings{gfarm2, - author = {Osamu Tatebe and Noriyuki Soda and Youhei Morita and Satoshi Matsuoka and Satoshi Sekiguchi}, - title = {Gfarm v2: A Grid file system that supports high-performance distributed and parallel data computing}, - booktitle = {Proceedings of the 2004 Computing in High Energy and Nuclear Physics ({CHEP04})}, - year = {2004}, - location = {Interlaken, Switzerland}, -} - -@rfc{RFC1831, - author = {Srinivasan,, R.}, - title = {RPC: Remote Procedure Call Protocol Specification Version 2}, - year = {1995}, - publisher = {RFC Editor}, - address = {United States}, - } - -@article{SEDA, - author = {Matt Welsh and David Culler and Eric Brewer}, - title = {SEDA: an architecture for well-conditioned, scalable internet services}, - journal = {SIGOPS Oper. Syst. Rev.}, - volume = {35}, - number = {5}, - year = {2001}, - issn = {0163-5980}, - pages = {230--243}, - doi = {http://doi.acm.org/10.1145/502059.502057}, - publisher = {ACM Press}, - address = {New York, NY, USA}, - } - -@conference{ledlie2007ncw, - title={{Network coordinates in the wild}}, - author={Ledlie, J. and Gardner, P. and Seltzer, M.}, - booktitle={Proc. of NSDI}, - year={2007} -} diff --git a/doc/dev-guide/dev-guide.pdf b/doc/dev-guide/dev-guide.pdf deleted file mode 100644 index 6f809be211a6135137d8932fb04e42e1f4d8fe1d..0000000000000000000000000000000000000000 --- a/doc/dev-guide/dev-guide.pdf +++ /dev/null @@ -1,23592 +0,0 @@ -%PDF-1.4 -% -5 0 obj -<< /S /GoTo /D (chapter.1) >> -endobj -8 0 obj -(Introduction) -endobj -9 0 obj -<< /S /GoTo /D (subsection.1.0.1) >> -endobj -12 0 obj -(Document Structure) -endobj -13 0 obj -<< /S /GoTo /D (chapter.2) >> -endobj -16 0 obj -(XtreemFS Servers) -endobj -17 0 obj -<< /S /GoTo /D (section.2.1) >> -endobj -20 0 obj -(DIR - Directory Service) -endobj -21 0 obj -<< /S /GoTo /D (section.2.2) >> -endobj -24 0 obj -(MRC - Metadata and Replica Catalog) -endobj -25 0 obj -<< /S /GoTo /D (section*.2) >> -endobj -28 0 obj -(Architecture) -endobj -29 0 obj -<< /S /GoTo /D (section*.3) >> -endobj -32 0 obj -(Processing Stage) -endobj -33 0 obj -<< /S /GoTo /D (section*.4) >> -endobj -36 0 obj -(Database Backend) -endobj -37 0 obj -<< /S /GoTo /D (section*.5) >> -endobj -40 0 obj -(Metadata for Volume Management) -endobj -41 0 obj -<< /S /GoTo /D (section*.6) >> -endobj -44 0 obj -(Metadata for Files and Directories) -endobj -45 0 obj -<< /S /GoTo /D (section.2.3) >> -endobj -48 0 obj -(OSD - Object Storage Device) -endobj -49 0 obj -<< /S /GoTo /D (section*.7) >> -endobj -52 0 obj -(Striping) -endobj -53 0 obj -<< /S /GoTo /D (section*.8) >> -endobj -56 0 obj -(Read-only replication) -endobj -57 0 obj -<< /S /GoTo /D (chapter.3) >> -endobj -60 0 obj -(Client) -endobj -61 0 obj -<< /S /GoTo /D (subsection.3.0.1) >> -endobj -64 0 obj -(Architecture) -endobj -65 0 obj -<< /S /GoTo /D (section*.9) >> -endobj -68 0 obj -(FUSE) -endobj -69 0 obj -<< /S /GoTo /D (subsection.3.0.2) >> -endobj -72 0 obj -(Implementation) -endobj -73 0 obj -<< /S /GoTo /D (section*.10) >> -endobj -76 0 obj -(Generated interfaces) -endobj -77 0 obj -<< /S /GoTo /D (section*.11) >> -endobj -80 0 obj -(Lines of code) -endobj -81 0 obj -<< /S /GoTo /D (chapter.4) >> -endobj -84 0 obj -(RMS - Replica Management Service) -endobj -85 0 obj -<< /S /GoTo /D (subsection.4.0.3) >> -endobj -88 0 obj -(Choosing the best replica) -endobj -89 0 obj -<< /S /GoTo /D (section*.12) >> -endobj -92 0 obj -(Vivaldi Algorithm) -endobj -93 0 obj -<< /S /GoTo /D (section*.13) >> -endobj -96 0 obj -(Vivaldi in XtreemFS) -endobj -97 0 obj -<< /S /GoTo /D (section*.14) >> -endobj -100 0 obj -(Vivaldi in the OSDs) -endobj -101 0 obj -<< /S /GoTo /D (section*.15) >> -endobj -104 0 obj -(Vivaldi in clients) -endobj -105 0 obj -<< /S /GoTo /D (section*.16) >> -endobj -108 0 obj -(Replica Selection with Vivaldi) -endobj -109 0 obj -<< /S /GoTo /D (subsection.4.0.4) >> -endobj -112 0 obj -(Replica creation) -endobj -113 0 obj -<< /S /GoTo /D (section*.17) >> -endobj -116 0 obj -(Reactive replica creation with Vivaldi) -endobj -117 0 obj -<< /S /GoTo /D (section*.18) >> -endobj -120 0 obj -(Proactive replica creation with Oraculo) -endobj -121 0 obj -<< /S /GoTo /D (section*.19) >> -endobj -124 0 obj -(Integration of Oraculo with OSDs) -endobj -125 0 obj -<< /S /GoTo /D (subsection.4.0.5) >> -endobj -128 0 obj -(Replica deletion) -endobj -129 0 obj -<< /S /GoTo /D (subsection.4.0.6) >> -endobj -132 0 obj -(Interaction with the Application Execution Management) -endobj -133 0 obj -<< /S /GoTo /D (chapter.5) >> -endobj -136 0 obj -(Testing) -endobj -137 0 obj -<< /S /GoTo /D (subsection.5.0.7) >> -endobj -140 0 obj -(Testing POSIX compliance of XtreemFS) -endobj -141 0 obj -<< /S /GoTo /D (section*.20) >> -endobj -144 0 obj -(How to execute the tests) -endobj -145 0 obj -<< /S /GoTo /D (section*.21) >> -endobj -148 0 obj -(Results) -endobj -149 0 obj -<< /S /GoTo /D (subsection.5.0.8) >> -endobj -152 0 obj -(Regression Tests) -endobj -153 0 obj -<< /S /GoTo /D (chapter.6) >> -endobj -156 0 obj -(Protocol and Interactions) -endobj -157 0 obj -<< /S /GoTo /D (subsection.6.0.9) >> -endobj -160 0 obj -(Constants) -endobj -161 0 obj -<< /S /GoTo /D (subsection.6.0.10) >> -endobj -164 0 obj -(Types) -endobj -165 0 obj -<< /S /GoTo /D (section*.22) >> -endobj -168 0 obj -(Globally Shared Types) -endobj -169 0 obj -<< /S /GoTo /D (section*.23) >> -endobj -172 0 obj -(struct UserCredentials) -endobj -173 0 obj -<< /S /GoTo /D (section*.24) >> -endobj -176 0 obj -(struct VivaldiCoordinates) -endobj -177 0 obj -<< /S /GoTo /D (section*.25) >> -endobj -180 0 obj -(Types Shared between MRC and OSD) -endobj -181 0 obj -<< /S /GoTo /D (section*.26) >> -endobj -184 0 obj -(struct NewFileSize) -endobj -185 0 obj -<< /S /GoTo /D (section*.27) >> -endobj -188 0 obj -(struct OSDtoMRCData) -endobj -189 0 obj -<< /S /GoTo /D (section*.28) >> -endobj -192 0 obj -(struct OSDWriteResponse) -endobj -193 0 obj -<< /S /GoTo /D (section*.29) >> -endobj -196 0 obj -(struct StripingPolicy) -endobj -197 0 obj -<< /S /GoTo /D (section*.30) >> -endobj -200 0 obj -(struct Replica) -endobj -201 0 obj -<< /S /GoTo /D (section*.31) >> -endobj -204 0 obj -(struct XLocSet) -endobj -205 0 obj -<< /S /GoTo /D (section*.32) >> -endobj -208 0 obj -(struct XCap) -endobj -209 0 obj -<< /S /GoTo /D (section*.33) >> -endobj -212 0 obj -(struct FileCredentials) -endobj -213 0 obj -<< /S /GoTo /D (section*.34) >> -endobj -216 0 obj -(sequence FileCredentialsSet) -endobj -217 0 obj -<< /S /GoTo /D (section*.35) >> -endobj -220 0 obj -(Exceptions) -endobj -221 0 obj -<< /S /GoTo /D (section*.36) >> -endobj -224 0 obj -(exception ProtocolException) -endobj -225 0 obj -<< /S /GoTo /D (section*.37) >> -endobj -228 0 obj -(exception errnoException) -endobj -229 0 obj -<< /S /GoTo /D (section*.38) >> -endobj -232 0 obj -(exception RedirectException) -endobj -233 0 obj -<< /S /GoTo /D (section*.39) >> -endobj -236 0 obj -(exception ConcurrentModificationException) -endobj -237 0 obj -<< /S /GoTo /D (section*.40) >> -endobj -240 0 obj -(exception InvalidArgumentException) -endobj -241 0 obj -<< /S /GoTo /D (subsection.6.0.11) >> -endobj -244 0 obj -(Directory Service Interface) -endobj -245 0 obj -<< /S /GoTo /D (section*.41) >> -endobj -248 0 obj -(struct AddressMapping) -endobj -249 0 obj -<< /S /GoTo /D (section*.42) >> -endobj -252 0 obj -(sequence AddressMappingSet) -endobj -253 0 obj -<< /S /GoTo /D (section*.43) >> -endobj -256 0 obj -(struct Service) -endobj -257 0 obj -<< /S /GoTo /D (section*.44) >> -endobj -260 0 obj -(void xtreemfs\137address\137mappings\137get\( string uuid, out AddressMappingSet address\137mappings \)) -endobj -261 0 obj -<< /S /GoTo /D (section*.45) >> -endobj -264 0 obj -(void xtreemfs\137address\137mappings\137remove\( string uuid \)) -endobj -265 0 obj -<< /S /GoTo /D (section*.46) >> -endobj -268 0 obj -(uint64\137t xtreemfs\137address\137mappings\137set\( AddressMappingSet address\137mappings \)) -endobj -269 0 obj -<< /S /GoTo /D (section*.47) >> -endobj -272 0 obj -(void xtreemfs\137checkpoint\(\)) -endobj -273 0 obj -<< /S /GoTo /D (section*.48) >> -endobj -276 0 obj -(uint64\137t xtreemfs\137global\137time\137s\137get\(\)) -endobj -277 0 obj -<< /S /GoTo /D (section*.49) >> -endobj -280 0 obj -(void xtreemfs\137service\137get\137by\137type\( uint16\137t type, out ServiceSet services \)) -endobj -281 0 obj -<< /S /GoTo /D (section*.50) >> -endobj -284 0 obj -(void xtreemfs\137service\137get\137by\137uuid\( string uuid, out ServiceSet services \)) -endobj -285 0 obj -<< /S /GoTo /D (section*.51) >> -endobj -288 0 obj -(void xtreemfs\137service\137get\137by\137name\( string name, out ServiceSet services \)) -endobj -289 0 obj -<< /S /GoTo /D (section*.52) >> -endobj -292 0 obj -(uint64\137t xtreemfs\137service\137register\( Service service \)) -endobj -293 0 obj -<< /S /GoTo /D (section*.53) >> -endobj -296 0 obj -(void xtreemfs\137service\137deregister\( string uuid \)) -endobj -297 0 obj -<< /S /GoTo /D (section*.54) >> -endobj -300 0 obj -(void xtreemfs\137service\137offline\( string uuid \)) -endobj -301 0 obj -<< /S /GoTo /D (section*.55) >> -endobj -304 0 obj -(void xtreemfs\137shutdown\(\)) -endobj -305 0 obj -<< /S /GoTo /D (subsection.6.0.12) >> -endobj -308 0 obj -(Metadata and Replica Catalog Interface) -endobj -309 0 obj -<< /S /GoTo /D (section*.56) >> -endobj -312 0 obj -(struct Stat) -endobj -313 0 obj -<< /S /GoTo /D (section*.57) >> -endobj -316 0 obj -(struct DirectoryEntry) -endobj -317 0 obj -<< /S /GoTo /D (section*.58) >> -endobj -320 0 obj -(struct StatVFS) -endobj -321 0 obj -<< /S /GoTo /D (section*.59) >> -endobj -324 0 obj -(struct Volume) -endobj -325 0 obj -<< /S /GoTo /D (section*.60) >> -endobj -328 0 obj -(const DEFAULT\137ONCRPC\137PORT) -endobj -329 0 obj -<< /S /GoTo /D (section*.61) >> -endobj -332 0 obj -(const DEFAULT\137ONCRPCS\137PORT) -endobj -333 0 obj -<< /S /GoTo /D (section*.62) >> -endobj -336 0 obj -(const DEFAULT\137HTTP\137PORT) -endobj -337 0 obj -<< /S /GoTo /D (section*.63) >> -endobj -340 0 obj -(exception MRCException) -endobj -341 0 obj -<< /S /GoTo /D (section*.64) >> -endobj -344 0 obj -(boolean access\( string path, uint32\137t mode \)) -endobj -345 0 obj -<< /S /GoTo /D (section*.65) >> -endobj -348 0 obj -(void chmod\( string path, uint32\137t mode \)) -endobj -349 0 obj -<< /S /GoTo /D (section*.66) >> -endobj -352 0 obj -(void chown\( string path, string user\137id, string group\137id \)) -endobj -353 0 obj -<< /S /GoTo /D (section*.67) >> -endobj -356 0 obj -(void create\( string path, string user\137id, string group\137id \)) -endobj -357 0 obj -<< /S /GoTo /D (section*.68) >> -endobj -360 0 obj -(void ftruncate\( XCap write\137xcap, out XCap truncate\137xcap \)) -endobj -361 0 obj -<< /S /GoTo /D (section*.69) >> -endobj -364 0 obj -(void getattr\( string path, out Stat stbuf \)) -endobj -365 0 obj -<< /S /GoTo /D (section*.70) >> -endobj -368 0 obj -(void getxattr\( string path, string name, out string value \)) -endobj -369 0 obj -<< /S /GoTo /D (section*.71) >> -endobj -372 0 obj -(void link\( string target\137path, string link\137path \)) -endobj -373 0 obj -<< /S /GoTo /D (section*.72) >> -endobj -376 0 obj -(void listxattr\( string path, out StringSet names \)) -endobj -377 0 obj -<< /S /GoTo /D (section*.73) >> -endobj -380 0 obj -(mkdir\( string path, uint32\137t mode \)) -endobj -381 0 obj -<< /S /GoTo /D (section*.74) >> -endobj -384 0 obj -(open\( string path, uint32\137t flags, uint32\137t mode, out FileCredentials file\137credentials \)) -endobj -385 0 obj -<< /S /GoTo /D (section*.75) >> -endobj -388 0 obj -(readdir\( string path, out DirectoryEntrySet directory\137entries \)) -endobj -389 0 obj -<< /S /GoTo /D (section*.76) >> -endobj -392 0 obj -(void removexattr\( string path, string name \)) -endobj -393 0 obj -<< /S /GoTo /D (section*.77) >> -endobj -396 0 obj -(void rename\( string source\137path, string target\137path, out FileCredentialsSet file\137credentials \)) -endobj -397 0 obj -<< /S /GoTo /D (section*.78) >> -endobj -400 0 obj -(rmdir\( string path \)) -endobj -401 0 obj -<< /S /GoTo /D (section*.79) >> -endobj -404 0 obj -(void setattr\( string path, Stat stbuf \)) -endobj -405 0 obj -<< /S /GoTo /D (section*.80) >> -endobj -408 0 obj -(void setxattr\( string path, string name, string value, int flags \)) -endobj -409 0 obj -<< /S /GoTo /D (section*.81) >> -endobj -412 0 obj -(void statvfs\( string volume\137name, out StatVFS stbuf \)) -endobj -413 0 obj -<< /S /GoTo /D (section*.82) >> -endobj -416 0 obj -(void symlink\( string target\137path, string link\137path \)) -endobj -417 0 obj -<< /S /GoTo /D (section*.83) >> -endobj -420 0 obj -(void unlink\( string path, out FileCredentialsSet file\137credentials \)) -endobj -421 0 obj -<< /S /GoTo /D (section*.84) >> -endobj -424 0 obj -(void utimens\( string path, uint64\137t atime\137ns, uint64\137t mtime\137ns, uint64\137t ctime\137ns \)) -endobj -425 0 obj -<< /S /GoTo /D (section*.85) >> -endobj -428 0 obj -(void utimens\( string path, uint64\137t atime\137ns, uint64\137t mtime\137ns, uint64\137t ctime\137ns \)) -endobj -429 0 obj -<< /S /GoTo /D (section*.86) >> -endobj -432 0 obj -(xtreemfs\137checkpoint\(\)) -endobj -433 0 obj -<< /S /GoTo /D (section*.87) >> -endobj -436 0 obj -(void xtreemfs\137check\137file\137exists\( string volume\137id, StringSet file\137ids, out string bitmap \)) -endobj -437 0 obj -<< /S /GoTo /D (section*.88) >> -endobj -440 0 obj -(void xtreemfs\137dump\137database\( string dump\137file \)) -endobj -441 0 obj -<< /S /GoTo /D (section*.89) >> -endobj -444 0 obj -(void xtreemfs\137get\137suitable\137osds\( string file\137id, out StringSet osd\137uuids \)) -endobj -445 0 obj -<< /S /GoTo /D (section*.90) >> -endobj -448 0 obj -(void xtreemfs\137lsvol\( out VolumeSet volumes \)) -endobj -449 0 obj -<< /S /GoTo /D (section*.91) >> -endobj -452 0 obj -(void xtreemfs\137mkvol\( Volume volume \)) -endobj -453 0 obj -<< /S /GoTo /D (section*.92) >> -endobj -456 0 obj -(void xtreemfs\137renew\137capability\( in XCap old\137xcap, out XCap renewed\137xcap \)) -endobj -457 0 obj -<< /S /GoTo /D (section*.93) >> -endobj -460 0 obj -(void xtreemfs\137replica\137add\( string file\137id, Replica new\137replica \)) -endobj -461 0 obj -<< /S /GoTo /D (section*.94) >> -endobj -464 0 obj -(void xtreemfs\137replica\137list\( string file\137id, out ReplicaSet replicas \)) -endobj -465 0 obj -<< /S /GoTo /D (section*.95) >> -endobj -468 0 obj -(xtreemfs\137replica\137remove\( string file\137id, string osd\137uuid, out XCap delete\137xcap \)) -endobj -469 0 obj -<< /S /GoTo /D (section*.96) >> -endobj -472 0 obj -(xtreemfs\137restore\137database\( string dump\137file \)) -endobj -473 0 obj -<< /S /GoTo /D (section*.97) >> -endobj -476 0 obj -(xtreemfs\137restore\137file\( string file\137path, string file\137id, uint64\137t file\137size, string osd\137uuid, int32\137t stripe\137size \)) -endobj -477 0 obj -<< /S /GoTo /D (section*.98) >> -endobj -480 0 obj -(void xtreemfs\137rmvol\( string volume\137name \)) -endobj -481 0 obj -<< /S /GoTo /D (section*.99) >> -endobj -484 0 obj -(void xtreemfs\137shutdown\( \)) -endobj -485 0 obj -<< /S /GoTo /D (section*.100) >> -endobj -488 0 obj -(void xtreemfs\137update\137file\137size\( XCap xcap, OSDWriteResponse osd\137write\137response \)) -endobj -489 0 obj -<< /S /GoTo /D (subsection.6.0.13) >> -endobj -492 0 obj -(Object Storage Device Interface) -endobj -493 0 obj -<< /S /GoTo /D (section*.101) >> -endobj -496 0 obj -(struct InternalGmax) -endobj -497 0 obj -<< /S /GoTo /D (section*.102) >> -endobj -500 0 obj -(struct ObjectData) -endobj -501 0 obj -<< /S /GoTo /D (section*.103) >> -endobj -504 0 obj -(exception OSDException) -endobj -505 0 obj -<< /S /GoTo /D (section*.104) >> -endobj -508 0 obj -(void read\( FileCredentials file\137credentials, string file\137id, uint64\137t object\137number, uint64\137t object\137version, uint32\137t offset, uint32\137t length, out ObjectData object\137data \)) -endobj -509 0 obj -<< /S /GoTo /D (section*.105) >> -endobj -512 0 obj -(void truncate\( FileCredentials file\137credentials, string file\137id, uint64\137t new\137file\137size, out OSDWriteResponse osd\137write\137response \)) -endobj -513 0 obj -<< /S /GoTo /D (section*.106) >> -endobj -516 0 obj -(void unlink\( FileCredentials file\137credentials, string file\137id \)) -endobj -517 0 obj -<< /S /GoTo /D (section*.107) >> -endobj -520 0 obj -(void write\( FileCredentials file\137credentials, string file\137id, uint64\137t object\137number, uint64\137t object\137version, uint32\137t offset, uint64\137t lease\137timeout, ObjectData object\137data, out OSDWriteResponse osd\137write\137response \)) -endobj -521 0 obj -<< /S /GoTo /D (section*.108) >> -endobj -524 0 obj -(ObjectData xtreemfs\137check\137object\( FileCredentials file\137credentials, string file\137id, uint64\137t object\137number, uint64\137t object\137version \)) -endobj -525 0 obj -<< /S /GoTo /D (section*.109) >> -endobj -528 0 obj -(InternalGmax xtreemfs\137internal\137get\137gmax\( FileCredentials file\137credentials, string file\137id \)) -endobj -529 0 obj -<< /S /GoTo /D (section*.110) >> -endobj -532 0 obj -(uint64\137t xtreemfs\137internal\137get\137file\137size\( FileCredentials file\137credentials, string file\137id \)) -endobj -533 0 obj -<< /S /GoTo /D (section*.111) >> -endobj -536 0 obj -(void xtreemfs\137internal\137truncate\( FileCredentials file\137credentials, string file\137id, uint64\137t new\137file\137size,out OSDWriteResponse osd\137write\137response \)) -endobj -537 0 obj -<< /S /GoTo /D (section*.112) >> -endobj -540 0 obj -(InternalReadLocalResponse xtreemfs\137internal\137read\137local\( FileCredentials file\137credentials, string file\137id, uint64\137t object\137number, uint64\137t object\137version, uint64\137t offset, uint64\137t length \)) -endobj -541 0 obj -<< /S /GoTo /D (section*.113) >> -endobj -544 0 obj -(void xtreemfs\137cleanup\137start\(boolean remove\137zombies,boolean remove\137unavail\137volume, boolean lost\137and\137found \)) -endobj -545 0 obj -<< /S /GoTo /D (section*.114) >> -endobj -548 0 obj -(void xtreemfs\137cleanup\137stop\(\)) -endobj -549 0 obj -<< /S /GoTo /D (section*.115) >> -endobj -552 0 obj -(void xtreemfs\137cleanup\137status\( out string status \)) -endobj -553 0 obj -<< /S /GoTo /D (section*.116) >> -endobj -556 0 obj -(void xtreemfs\137cleanup\137is\137running\( out boolean is\137running \)) -endobj -557 0 obj -<< /S /GoTo /D (section*.117) >> -endobj -560 0 obj -(void xtreemfs\137cleanup\137get\137results\( out StringSet results \)) -endobj -561 0 obj -<< /S /GoTo /D (section*.118) >> -endobj -564 0 obj -(void xtreemfs\137cleanup\137shutdown\(\)) -endobj -565 0 obj -<< /S /GoTo /D (subsection.6.0.14) >> -endobj -568 0 obj -(Interactions) -endobj -569 0 obj -<< /S /GoTo /D (section*.119) >> -endobj -572 0 obj -(delete) -endobj -573 0 obj -<< /S /GoTo /D (section*.120) >> -endobj -576 0 obj -(read) -endobj -577 0 obj -<< /S /GoTo /D (section*.121) >> -endobj -580 0 obj -(write) -endobj -581 0 obj -<< /S /GoTo /D (section*.122) >> -endobj -584 0 obj -(fsync) -endobj -585 0 obj -<< /S /GoTo /D (section*.123) >> -endobj -588 0 obj -(mkvol) -endobj -589 0 obj -<< /S /GoTo /D (section*.124) >> -endobj -592 0 obj -(rmvol) -endobj -593 0 obj -<< /S /GoTo /D (section*.125) >> -endobj -596 0 obj -(removeReplica) -endobj -597 0 obj -<< /S /GoTo /D [598 0 R /Fit ] >> -endobj -601 0 obj << -/Length 188 -/Filter /FlateDecode ->> -stream -xuO 0 9v$z9ћXDO9~;DT/%AHNQ8˵A 8Ln7E+Ջ>/z%e~9igS0~ -\\!4嬛rYD=cp~^nuDtypFPqbRd+IczaD -endstream -endobj -598 0 obj << -/Type /Page -/Contents 601 0 R -/Resources 600 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 606 0 R ->> endobj -599 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/final_logo.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 607 0 R -/BBox [0 0 192 56] -/Resources << -/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> -/Length 608 0 R ->> -stream -0.8 0 0 -0.8 0 56 cm -q -1 0 0 1 0 0 cm -q -1 0 0 1 -100.84152 -759.30717 cm -q -0.441941 0 0 0.441941 154.35506 536.04966 cm -q -0.19215687 0.30588236 0.49411765 rg -264.85608 638.39467 m -266.91831 634.0015 272.84253 633.23285 277.09198 634.0065 c -280.66651 634.82514 285.36589 637.66102 283.65362 641.98533 c -281.55389 646.15328 275.94213 646.89343 271.80517 646.25189 c -268.16815 645.52936 263.2313 642.85196 264.85608 638.39467 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -290.04028 643.06431 m -292.06501 639.10833 297.26433 637.95848 301.3263 638.54215 c -304.62586 639.17957 308.45036 641.72461 306.73809 645.53574 c -304.68836 649.2535 299.7765 650.33636 295.86451 649.92328 c -292.48996 649.4151 288.40299 647.04091 290.04028 643.06431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.24986 646.23389 m -314.17461 642.79822 318.54904 641.30279 322.29854 641.69636 c -325.33565 642.1748 328.02279 644.51774 326.38551 647.71807 c -324.44826 650.93003 320.3238 652.30237 316.74927 652.10172 c -313.63718 651.7795 310.68757 649.60545 312.24986 646.23389 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.44613 613.61667 m -247.69583 608.90854 253.84503 608.16489 258.38193 609.2585 c -262.4439 610.44584 267.0433 613.98663 265.30602 618.75225 c -263.13131 623.43664 257.05711 624.19779 252.5577 623.17917 c -248.39574 622.03432 243.62137 618.49103 245.44613 613.61667 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -272.26761 620.45203 m -274.34234 615.94012 280.11658 614.97774 284.516 615.94262 c -288.39049 616.99498 292.58994 620.29205 290.99015 624.77521 c -288.97792 629.19463 283.36615 630.18075 279.04172 629.35461 c -275.04225 628.38724 270.59283 625.09517 272.26761 620.45203 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -297.33932 626.15753 m -299.20158 622.03557 304.27591 620.75199 308.38787 621.56813 c -311.9999 622.48051 315.41195 625.54386 313.94964 629.55833 c -312.12488 633.53906 307.26302 634.82764 303.25104 634.19397 c -299.47654 633.40283 295.82702 630.34823 297.33932 626.15753 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -319.44892 630.60944 m -321.0987 626.99367 325.33565 625.36888 329.09765 626.03129 c -332.39722 626.80619 334.8344 629.67832 333.50957 633.11287 c -331.87229 636.57241 327.83532 638.15095 324.1858 637.70226 c -320.72375 637.08234 318.11159 634.20647 319.44892 630.60944 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.85753 594.66791 m -256.18222 590.166 262.09394 589.49359 266.51836 590.63969 c -270.49284 591.87328 274.81728 595.40781 273.105 600.02846 c -270.93029 604.6416 264.95607 605.36526 260.51915 604.2729 c -256.43219 603.05431 251.92028 599.40854 253.85753 594.66791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -279.84162 601.87321 m -281.84135 597.48004 287.40312 596.67015 291.61507 597.74626 c -295.45207 598.9286 299.43904 602.32441 297.98923 606.75382 c -296.13948 611.17074 290.6277 612.06438 286.44075 611.10075 c -282.42878 609.97215 278.20433 606.46886 279.84162 601.87321 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -304.16342 608.38361 m -305.8382 604.3004 310.71257 603.20554 314.63705 604.18791 c -318.24908 605.29527 321.54864 608.53359 320.3363 612.58181 c -318.76151 616.61503 314.01213 617.79987 310.13764 616.97373 c -306.32564 615.95512 302.8136 612.60931 304.16342 608.38361 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.6981 613.94913 m -327.07292 610.31586 331.13489 608.86605 334.72191 609.74343 c -338.04648 610.7583 340.49616 613.84164 339.45879 617.38993 c -338.13397 620.92571 334.23448 622.43927 330.70994 621.75186 c -327.1854 620.85447 324.58574 617.65364 325.6981 613.94913 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -343.93321 618.48603 m -345.07056 615.37519 348.30763 613.57168 351.54471 614.33658 c -354.53182 615.25146 356.11911 618.19857 355.20673 621.19068 c -354.09437 624.19029 350.99478 626.00005 347.83269 625.45137 c -344.64561 624.68147 343.00833 621.59438 343.93321 618.48603 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -262.35641 576.93274 m -264.63111 572.80703 270.24288 572.44958 274.31734 573.56068 c -277.94187 574.72928 282.19131 577.9751 280.59152 582.28703 c -278.51679 586.62647 272.73005 587.03391 268.63059 585.95155 c -264.88108 584.77421 260.40667 581.35716 262.35641 576.93274 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -286.97818 584.18679 m -288.84044 580.07607 294.13974 579.65863 297.96424 580.74724 c -301.53877 581.94458 305.47575 585.15416 304.22592 589.36736 c -302.56363 593.5993 297.22683 594.12673 293.37734 593.11061 c -289.65283 591.93577 285.45338 588.55996 286.97818 584.18679 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -310.11264 591.15462 m -311.56245 587.25263 316.24934 586.59522 319.79887 587.64133 c -323.21093 588.83368 326.54799 591.97076 325.58561 595.9065 c -324.28578 599.83598 319.67389 600.64588 316.11186 599.7085 c -312.51233 598.56365 308.9503 595.26408 310.11264 591.15462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -330.74744 597.50629 m -331.87229 593.96675 335.75928 592.95064 339.03385 593.94301 c -342.20843 595.10035 344.79559 598.13995 344.03319 601.67699 c -343.02083 605.17153 339.25882 606.35013 335.98425 605.49649 c -332.62219 604.41038 329.87255 601.2008 330.74744 597.50629 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -348.38262 603.05431 m -349.24501 599.97971 352.3321 598.55115 355.30671 599.48478 c -358.18134 600.58338 360.0186 603.513 359.39368 606.58885 c -358.56879 609.57845 355.63167 611.137 352.68206 610.3721 c -349.60746 609.36598 347.70771 606.25014 348.38262 603.05431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.93071 607.73869 m -363.61812 605.17153 365.96781 603.34427 368.64246 604.21041 c -371.19213 605.23652 372.31698 608.05365 371.77955 610.65081 c -371.10464 613.12424 368.86743 615.01774 366.23028 614.34658 c -363.50564 613.43295 362.38079 610.40709 362.93071 607.73869 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.57918 611.58694 m -375.14161 609.51596 376.90388 607.35625 379.27857 608.14489 c -381.49078 609.09102 382.00321 611.79691 381.50328 613.93288 c -380.94085 615.92512 379.25357 618.07234 376.94137 617.49741 c -374.56669 616.68252 374.11675 613.74291 374.57918 611.58694 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -247.29589 554.86438 m -249.83305 551.43108 255.03237 551.26735 258.80688 552.23098 c -261.88147 553.15086 266.08092 555.86925 264.19367 559.59876 c -261.83148 563.36202 256.28221 563.48325 252.44521 562.48713 c -249.29562 561.51976 244.98369 558.60764 247.29589 554.86438 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.30537 561.38228 m -272.46758 557.72151 277.72939 557.7665 281.31642 558.77637 c -284.47851 559.80748 288.76544 562.62087 287.31564 566.5241 c -285.39089 570.46234 279.86661 570.42859 276.24209 569.42747 c -273.01751 568.37886 268.44311 565.37175 270.30537 561.38228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -293.27735 568.39261 m -294.97713 564.6631 300.00147 564.73059 303.33853 565.74795 c -306.51312 566.87031 310.48759 569.73118 309.45023 573.61692 c -307.98792 577.53641 302.8386 577.56265 299.47654 576.58278 c -296.20197 575.46418 291.90253 572.41708 293.27735 568.39261 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -314.987 575.46043 m -316.22434 571.83341 320.73625 571.72967 323.81085 572.73829 c -326.92294 573.91938 330.33499 576.78151 329.62258 580.48852 c -328.57272 584.20928 324.07331 584.48425 320.97372 583.53437 c -317.72414 582.37202 314.03713 579.32867 314.987 575.46043 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -334.52194 582.22329 m -335.40932 578.85374 339.20883 578.42004 342.04595 579.41616 c -344.99557 580.61725 347.73271 583.44688 347.25777 586.85893 c -346.49537 590.23474 342.82085 590.88716 339.94623 589.97103 c -336.83414 588.79993 333.89702 585.78908 334.52194 582.22329 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.43222 588.42998 m -352.05714 585.43662 355.05675 584.57048 357.6814 585.55536 c -360.39355 586.74395 362.46827 589.50984 362.10582 592.55944 c -361.56839 595.4928 358.71877 596.58516 356.06911 595.70402 c -353.19449 594.55917 351.00728 591.60456 351.43222 588.42998 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.56787 593.93926 m -366.01781 591.39709 368.26751 590.06351 370.6797 591.03214 c -373.10438 592.18449 374.55419 594.86288 374.26673 597.52254 c -373.84178 599.97096 371.74206 601.49826 369.31738 600.65712 c -366.73021 599.56602 365.25541 596.68265 365.56787 593.93926 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.04136 598.70613 m -377.37882 596.6414 379.0036 594.86538 381.20332 595.80526 c -383.31554 596.90387 384.21542 599.47978 383.94046 601.75323 c -383.603 603.72047 382.0907 605.62522 379.91598 604.83908 c -377.65378 603.81546 376.7789 601.01958 377.04136 598.70613 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -256.10723 542.52975 m -258.51941 539.61513 263.29379 539.76886 266.61835 540.59126 c -269.11802 541.30616 273.47995 543.51462 271.71768 546.7592 c -269.50547 550.01752 264.31865 549.76505 260.96909 548.91391 c -258.41943 548.16151 253.90752 545.76183 256.10723 542.52975 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -277.36694 548.38523 m -279.35418 545.2194 284.26604 545.63809 287.35313 546.51673 c -289.99028 547.37412 294.35221 549.72756 293.06488 553.1721 c -291.34011 556.64665 286.10329 556.18171 283.0037 555.30308 c -280.34155 554.43194 275.64217 551.88352 277.36694 548.38523 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -298.60165 554.94687 m -300.10146 551.64731 304.87583 552.16849 307.68796 553.06462 c -310.4376 554.05699 314.43708 556.51042 313.61218 560.00246 c -312.37485 563.53824 307.4005 563.05831 304.57587 562.17967 c -301.78874 561.1873 297.40181 558.5464 298.60165 554.94687 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -318.77401 561.82222 m -319.81137 558.53015 324.1858 558.96509 326.74796 559.86623 c -329.5101 560.96608 332.98464 563.4795 332.5097 566.87906 c -331.69731 570.31611 327.28539 570.01989 324.68573 569.14376 c -321.83611 568.0489 318.0366 565.35926 318.77401 561.82222 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -337.1466 568.65757 m -337.80901 565.51299 341.55852 565.68546 343.92071 566.59659 c -346.60785 567.76519 349.46998 570.29861 349.23251 573.49944 c -348.73258 576.69527 345.07056 576.74526 342.64587 575.86413 c -339.84624 574.70303 336.74665 571.99838 337.1466 568.65757 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.24448 575.17172 m -353.64443 572.30209 356.64404 572.07088 358.86875 573.0045 c -361.38092 574.2031 363.64312 576.72027 363.54313 579.65238 c -363.23067 582.49451 360.39355 582.99569 358.10635 582.10456 c -355.46919 580.91721 353.05701 578.22507 353.24448 575.17172 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.90519 581.17718 m -367.14266 578.67876 369.39237 577.9601 371.49209 578.92123 c -373.76679 580.11857 375.46657 582.587 375.42907 585.21415 c -375.2291 587.63133 373.15437 588.6262 371.00465 587.72632 c -368.59247 586.54773 366.8177 583.89682 366.90519 581.17718 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.16621 586.57272 m -378.31619 584.49924 379.90349 583.27441 381.86573 584.25678 c -383.89046 585.43037 385.09031 587.82256 385.05281 590.13725 c -384.90283 592.10075 383.47802 593.5718 381.49078 592.67442 c -379.34106 591.52957 378.12872 588.94616 378.16621 586.57272 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.24002 591.32585 m -387.35251 589.68856 388.40237 587.99379 390.20213 588.98116 c -391.95191 590.11476 392.7268 592.41196 392.66431 594.42294 c -392.53933 595.95024 391.57695 597.8275 389.78969 596.95261 c -387.93993 595.85775 387.19003 593.36433 387.24002 591.32585 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.27115 528.66657 m -247.80832 526.53685 251.84529 526.56185 254.91989 527.13677 c -256.71965 527.53672 260.85661 529.10151 258.85687 531.53869 c -256.43219 533.97712 251.97027 533.8134 248.85818 533.18723 c -246.95843 532.73854 242.89646 531.01751 245.27115 528.66657 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -263.88121 532.72479 m -266.13091 530.29886 270.48034 530.70005 273.37996 531.38746 c -275.32971 531.91739 279.81662 533.68591 278.22933 536.44305 c -276.19209 539.20144 271.39272 538.65276 268.5056 537.9441 c -266.55586 537.39293 261.84398 535.43943 263.88121 532.72479 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -283.40365 537.89661 m -285.21591 535.21321 289.75282 535.91812 292.38997 536.65802 c -294.53969 537.34293 298.92661 539.27643 297.82676 542.25104 c -296.28946 545.24565 291.3651 544.437 288.76544 543.6971 c -286.64072 543.01219 281.86635 540.88497 283.40365 537.89661 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -302.91359 543.89082 m -304.23841 541.0337 308.75032 541.90858 311.08752 542.66348 c -313.41221 543.50712 317.42418 545.5656 316.79927 548.63895 c -315.7619 551.74979 310.97503 550.85491 308.66283 550.11126 c -306.35064 549.27387 301.91372 547.03291 302.91359 543.89082 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -321.58614 550.37372 m -322.43603 547.45286 326.68547 548.32899 328.7602 549.08639 c -331.18488 550.07001 334.67192 552.21973 334.40946 555.27183 c -333.80953 558.37142 329.46011 557.57903 327.36038 556.82788 c -324.9107 555.848 321.04871 553.53331 321.58614 550.37372 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -338.75888 557.02035 m -339.22132 554.15323 342.97083 554.85438 344.87058 555.62678 c -347.28277 556.71539 350.20738 558.92385 350.19488 561.85722 c -349.90742 564.81933 346.22041 564.30064 344.25816 563.52825 c -341.77099 562.43839 338.57141 560.0737 338.75888 557.02035 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -354.00688 563.55324 m -354.20686 560.85485 357.29395 561.22355 359.09372 562.03219 c -361.40591 563.18704 363.7806 565.4205 363.90559 568.16639 c -363.8181 570.87853 360.89348 570.7698 359.00623 569.95865 c -356.60654 568.7988 354.04438 566.41162 354.00688 563.55324 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -367.15516 569.76118 m -367.20515 567.3365 369.55484 567.25276 371.29212 568.11764 c -373.44183 569.30249 375.31659 571.52595 375.49156 574.04437 c -375.50406 576.41406 373.35435 576.804 371.52958 575.94287 c -369.29238 574.75302 367.29264 572.37459 367.15516 569.76118 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.19121 575.50792 m -378.16621 573.43445 379.816 572.83078 381.51577 573.7569 c -383.44052 574.94425 384.86533 577.12646 385.02781 579.40241 c -385.07781 581.37465 383.6155 582.28828 381.86573 581.38215 c -379.84099 580.19231 378.36619 577.85262 378.19121 575.50792 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.22752 580.71974 m -387.19003 579.03871 388.26489 577.91136 389.86468 578.88873 c -391.56446 580.05858 392.60182 582.17205 392.7268 584.20178 c -392.7643 585.76283 391.83942 587.16764 390.20213 586.23652 c -388.42737 585.06917 387.37751 582.79572 387.22752 580.71974 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -394.47657 585.37413 m -394.45158 584.0818 395.08899 582.48701 396.5638 583.48938 c -398.00111 584.61423 398.75101 586.66146 398.80101 588.44998 c -398.826 589.63107 398.23858 591.42958 396.78877 590.50721 c -395.26397 589.37735 394.57656 587.19514 394.47657 585.37413 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.44508 521.71248 m -255.79477 519.98771 259.4193 520.17518 262.15644 520.65012 c -263.45627 520.91259 267.7682 522.12493 265.95594 524.11217 c -263.70623 526.11191 259.65676 525.74945 256.93212 525.24952 c -255.5573 524.96206 251.25787 523.59974 253.44508 521.71248 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.56783 525.12454 m -272.63006 523.1373 276.57954 523.69972 279.09171 524.27465 c -280.57902 524.6496 285.10343 526.07441 283.71611 528.35911 c -281.86635 530.65631 277.45443 529.91016 274.97975 529.32648 c -273.52994 528.94153 268.74307 527.33675 270.56783 525.12454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -288.45299 529.64269 m -290.07777 527.39924 294.27722 528.29287 296.50193 528.90654 c -298.2267 529.43772 302.58863 531.02001 301.67625 533.53968 c -300.32643 536.0706 295.70203 535.03448 293.55232 534.42706 c -291.90253 533.90838 287.11566 532.13112 288.45299 529.64269 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -306.35064 535.02699 m -307.48799 532.59855 311.76243 533.70591 313.67468 534.32333 c -315.63692 535.02199 319.5864 536.72676 319.13646 539.38891 c -318.29907 542.06606 313.69967 540.88497 311.83742 540.28005 c -309.93767 539.59889 305.52575 537.71288 306.35064 535.02699 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -323.57338 541.0037 m -324.24829 538.46778 328.37275 539.64763 330.03503 540.2588 c -332.14725 541.11494 335.5843 542.92345 335.50931 545.61935 c -335.09687 548.34774 330.80993 547.18914 329.16014 546.58172 c -327.07292 545.73558 323.22342 543.77084 323.57338 541.0037 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.58378 547.28913 m -339.87124 544.73696 343.62075 545.83182 345.10805 546.44924 c -347.27027 547.43411 350.19488 549.32511 350.36986 551.96601 c -350.26987 554.64441 346.52037 553.67079 344.99557 553.04212 c -342.80835 552.05475 339.58378 550.02627 339.58378 547.28913 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.99439 553.62705 m -354.00688 551.15362 357.19397 552.00601 358.59378 552.65842 c -360.7185 553.73578 363.14319 555.68178 363.45564 558.20269 c -363.56813 560.72986 360.50603 560.08995 359.01873 559.41129 c -356.85651 558.32268 354.20686 556.2467 353.99439 553.62705 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.59273 559.80373 m -366.46775 557.50529 368.96742 557.98022 370.35474 558.69763 c -372.35448 559.83123 374.32922 561.80097 374.70417 564.16066 c -374.90414 566.44411 372.59195 566.25164 371.11714 565.50174 c -369.04241 564.35064 366.93019 562.25216 366.59273 559.80373 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.35382 565.66672 m -377.15385 563.62823 378.97861 563.62698 380.36593 564.42813 c -382.20318 565.58798 383.77798 567.54772 384.14043 569.72493 c -384.3529 571.69217 382.75311 572.01463 381.27831 571.18474 c -379.37855 570.00615 377.71627 567.91642 377.35382 565.66672 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -386.34014 571.116 m -386.14017 569.39873 387.34001 568.87379 388.71483 569.76118 c -390.35211 570.92353 391.57695 572.84577 391.88941 574.83176 c -392.07689 576.4378 391.07702 577.28644 389.63971 576.38781 c -387.93993 575.20546 386.6776 573.15448 386.34014 571.116 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -393.67668 576.0966 m -393.5142 574.72928 394.21411 573.69191 395.53893 574.64929 c -396.95125 575.78414 397.91362 577.66389 398.12609 579.45491 c -398.28857 580.70224 397.70115 582.01332 396.36383 581.08094 c -394.87652 579.9161 393.95164 577.93136 393.67668 576.0966 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -260.48166 516.47567 m -262.65637 515.10085 265.89345 515.40081 268.31813 515.77576 c -269.2555 515.93824 273.56744 516.92561 271.99265 518.48791 c -269.91792 520.11269 266.2809 519.62526 263.86871 519.22531 c -262.90634 519.03783 258.56941 517.92548 260.48166 516.47567 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -276.22959 519.35029 m -278.11684 517.738 281.66638 518.38792 283.87859 518.86286 c -284.99094 519.12532 289.45285 520.30017 288.26551 522.13743 c -286.59073 524.03718 282.56626 523.17479 280.44154 522.69985 c -279.39167 522.43739 274.6548 521.07507 276.22959 519.35029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -292.60244 523.26228 m -294.06475 521.41252 297.92674 522.39989 299.814 522.91233 c -301.20131 523.31227 305.46325 524.6246 304.72585 526.71183 c -303.5635 528.8228 299.22657 527.6617 297.43931 527.17427 c -296.17697 526.78682 291.46509 525.28701 292.60244 523.26228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -309.01279 528.0454 m -309.98766 526.01192 314.02463 527.24926 315.59942 527.73669 c -317.24921 528.31287 321.0862 529.71893 320.79874 531.99363 c -320.13633 534.24959 315.72441 532.91351 314.2371 532.43233 c -312.6998 531.8899 308.37537 530.30011 309.01279 528.0454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -324.9107 533.47094 m -325.41064 531.31872 329.42261 532.66605 330.73494 533.14598 c -332.5722 533.88089 335.92176 535.38444 335.99675 537.73913 c -335.75928 540.07632 331.53483 538.70275 330.26 538.23032 c -328.48523 537.51416 324.71073 535.86188 324.9107 533.47094 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.80875 539.30018 m -339.94623 537.09047 343.68324 538.42154 344.82059 538.89648 c -346.75784 539.77261 349.61996 541.36865 349.94492 543.71835 c -350.01991 546.06929 346.2329 544.79695 345.07056 544.31077 c -343.14581 543.43713 339.95873 541.71986 339.80875 539.30018 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -353.38197 545.30439 m -353.25698 543.10468 356.53155 544.28452 357.59391 544.78321 c -359.53116 545.76808 361.94334 547.44036 362.41828 549.72131 c -362.68075 552.00976 359.50616 550.97614 358.36881 550.44621 c -356.40657 549.44759 353.75692 547.66783 353.38197 545.30439 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.44288 551.28485 m -365.15542 549.17013 367.83007 550.06876 368.87993 550.62619 c -370.75469 551.68605 372.76692 553.40707 373.29185 555.58054 c -373.65431 557.72276 371.16713 557.05035 370.01728 556.44543 c -368.10503 555.36182 365.93032 553.53581 365.44288 551.28485 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -375.89151 557.08284 m -375.54156 555.1331 377.56629 555.63678 378.66615 556.28295 c -380.40342 557.38655 382.0657 559.12757 382.59063 561.16856 c -382.96558 563.08705 381.16582 562.86958 379.96598 562.16967 c -378.17871 561.03607 376.41644 559.19256 375.89151 557.08284 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -384.77785 562.58462 m -384.42789 560.87234 385.81521 560.90234 386.96506 561.65099 c -388.53985 562.77584 389.87718 564.50687 390.36461 566.40412 c -390.68957 568.03515 389.52722 568.32512 388.30238 567.52647 c -386.6776 566.37037 385.27778 564.53686 384.77785 562.58462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -392.16438 567.71645 m -391.87691 566.29163 392.7143 565.8167 393.86415 566.66658 c -395.25147 567.77894 396.36383 569.49121 396.73878 571.23598 c -397.02624 572.55456 396.33883 573.33071 395.15149 572.46207 c -393.70168 571.30473 392.61432 569.50871 392.16438 567.71645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -295.9895 518.40042 m -297.30182 516.88812 300.83886 517.90048 302.47615 518.32543 c -303.576 518.62539 307.70046 519.72524 307.11304 521.43752 c -306.11317 523.17479 302.0637 521.97495 300.5764 521.575 c -299.60152 521.30004 295.06462 519.98771 295.9895 518.40042 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -311.06252 522.61236 m -311.88741 520.93758 315.69941 522.19992 316.99924 522.61236 c -318.38656 523.0748 322.08607 524.23715 321.92359 526.1619 c -321.41116 528.02041 317.19921 526.63684 316.01187 526.26189 c -314.76203 525.83694 310.57508 524.48712 311.06252 522.61236 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.7231 527.49922 m -326.09805 525.71196 329.97254 527.11177 331.0099 527.47423 c -332.63469 528.10664 335.83427 529.34648 336.03424 531.38746 c -335.93426 533.33346 331.8223 531.88365 330.83492 531.5237 c -329.31012 530.92127 325.6731 529.53771 325.7231 527.49922 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.59627 532.82602 m -339.60877 530.97252 343.30829 532.39608 344.17067 532.75353 c -345.92045 533.52718 348.67008 534.86076 349.13252 536.93174 c -349.32 538.92772 345.54549 537.51416 344.68311 537.15171 c -342.95833 536.38306 339.88374 534.9445 339.59627 532.82602 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -352.3821 538.42029 m -352.13213 536.53054 355.45669 537.87911 356.24409 538.24781 c -358.01886 539.13895 360.38105 540.56001 360.98097 542.60349 c -361.36842 544.60198 358.10635 543.33715 357.25646 542.9397 c -355.46919 542.03732 352.88203 540.52751 352.3821 538.42029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -363.88059 544.0958 m -363.46814 542.22104 366.28027 543.38214 367.06767 543.79709 c -368.80494 544.77321 370.81718 546.26426 371.46709 548.239 c -371.95453 550.18 369.30488 549.17513 368.42999 548.71269 c -366.65522 547.71032 364.49301 546.13928 363.88059 544.0958 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.00426 549.70131 m -373.51682 547.90405 375.74153 548.77143 376.57892 549.26387 c -378.22871 550.29873 379.91598 551.82978 380.5659 553.71578 c -381.07833 555.52555 379.07859 554.88313 378.14122 554.32945 c -376.45394 553.25959 374.65417 551.64731 374.00426 549.70131 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -382.74061 555.1181 m -382.26568 553.46832 383.87796 553.94575 384.77785 554.54193 c -386.30265 555.61053 387.71496 557.15658 388.32738 558.93635 c -388.78982 560.54739 387.415 560.34616 386.41513 559.68375 c -384.86533 558.5764 383.37803 556.95036 382.74061 555.1181 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -390.15214 560.25992 m -389.7272 558.82011 390.77706 558.84761 391.73943 559.55627 c -393.08926 560.62738 394.3016 562.17467 394.81403 563.84195 c -395.22648 565.20428 394.36409 565.46549 393.33922 564.70934 c -391.93941 563.58574 390.72707 561.9722 390.15214 560.25992 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.61232 518.43791 m -313.31222 517.07559 316.89925 518.31293 317.98661 518.63789 c -319.17395 519.01284 322.69849 519.97521 322.6485 521.6 c -322.26105 523.0998 318.24908 521.74998 317.2867 521.46252 c -316.26184 521.11256 312.24986 519.96271 312.61232 518.43791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -326.17304 522.79984 m -326.423 521.35003 330.16001 522.71235 330.97241 522.99981 c -332.42222 523.53724 335.45932 524.54961 335.75928 526.31188 c -335.75928 527.88667 331.7848 526.46186 331.0224 526.19939 c -329.69757 525.68696 326.22303 524.53711 326.17304 522.79984 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -339.08384 527.62421 m -339.00885 526.1244 342.62088 527.52422 343.28329 527.79918 c -344.87058 528.48034 347.48274 529.58395 348.03267 531.40246 c -348.30763 533.0285 344.60812 531.61243 343.9582 531.34122 c -342.4209 530.66881 339.48379 529.47521 339.08384 527.62421 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.10726 532.78103 m -350.79481 531.22373 354.09437 532.5973 354.6818 532.86977 c -356.33158 533.67216 358.58128 534.87076 359.28119 536.68677 c -359.74363 538.36405 356.46906 537.02047 355.84414 536.72676 c -354.20686 535.91437 351.71968 534.64829 351.10726 532.78103 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.05583 538.09283 m -361.58089 536.49679 364.44301 537.76663 365.03044 538.07034 c -366.65522 538.96522 368.61747 540.24505 369.36737 542.02482 c -369.94229 543.7146 367.19265 542.53225 366.54274 542.1873 c -364.89296 541.26867 362.78073 539.92759 362.05583 538.09283 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -371.82955 543.42213 m -371.26712 541.83234 373.61681 542.9072 374.25423 543.2734 c -375.81652 544.23328 377.5038 545.57185 378.2537 547.29288 c -378.86612 548.93641 376.69141 548.01278 375.979 547.59034 c -374.37921 546.59672 372.59195 545.1969 371.82955 543.42213 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -380.39092 548.65645 m -379.816 547.1304 381.62826 547.91779 382.32817 548.37273 c -383.77798 549.37635 385.22779 550.74867 385.95269 552.39596 c -386.52762 553.92826 384.94033 553.35208 384.15293 552.82965 c -382.65313 551.78604 381.14082 550.35123 380.39092 548.65645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.77745 553.70454 m -387.24002 552.30472 388.50236 552.72716 389.27726 553.28959 c -390.60208 554.30696 391.87691 555.69802 392.50183 557.26532 c -393.03926 558.62514 391.95191 558.44766 391.11451 557.82649 c -389.7397 556.75413 388.47736 555.31057 387.77745 553.70454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg --87.686408 585.51161 m --101.65891 605.54773 l --85.394209 605.54773 l --78.571354 592.40446 l --71.231067 605.54773 l --53.874595 605.54773 l --67.956497 585.51161 l --54.856966 566.49286 l --70.629896 566.49286 l --76.880326 578.01385 l --82.692064 566.49286 l --99.966797 566.49286 l --87.686408 585.51161 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --12.796235 566.49286 m --52.887224 566.49286 l --52.887224 578.01385 l --40.100152 578.01385 l --40.100152 605.54773 l --25.579558 605.54773 l --25.579558 578.01385 l --12.796235 578.01385 l --12.796235 566.49286 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --8.4293081 605.54773 m -6.1012853 605.54773 l -6.1012853 592.23073 l -9.4570949 592.23073 l -10.420718 592.23073 11.258109 592.34072 11.966766 592.56069 c -12.675423 592.81815 13.247848 593.37558 13.68529 594.23547 c -14.030245 594.80289 14.312708 595.57154 14.530179 596.54266 c -14.712655 597.53128 14.858886 598.5824 14.966372 599.6985 c -15.130101 600.77836 15.266333 601.84947 15.376318 602.91183 c -15.485054 603.9192 15.612537 604.79783 15.758768 605.54773 c -31.336724 605.54773 l -30.661812 603.56424 30.174376 601.27079 29.874416 598.66988 c -29.524462 596.06773 28.812055 593.70179 27.749695 591.57207 c -27.09978 590.49846 26.274888 589.60607 25.262521 588.89617 c -24.262652 588.15127 22.959073 587.64133 21.368032 587.36887 c -21.368032 587.25888 l -24.100173 586.58397 26.299885 585.42537 27.949668 583.78434 c -29.561957 582.14205 30.37435 579.84486 30.411845 576.89024 c -30.37435 573.16823 29.087019 570.48733 26.549852 568.84505 c -23.950193 567.27775 20.365664 566.49286 15.778765 566.49286 c --8.4293081 566.49286 l --8.4293081 605.54773 l -h -5.4388722 575.16047 m -9.7695539 575.16047 l -11.40184 575.12422 12.835402 575.35294 14.07024 575.84913 c -15.247585 576.32657 15.855005 577.45517 15.8925 579.23494 c -15.8925 580.17231 15.731272 580.91471 15.408814 581.46589 c -15.066359 582.07206 14.582672 582.53075 13.955255 582.84321 c -12.684171 583.35564 11.213114 583.59436 9.5420838 583.55812 c -5.4388722 583.55812 l -5.4388722 575.16047 l -f* -Q -q -0.19215687 0.30588236 0.49411765 rg -36.948488 605.54773 m -70.094138 605.54773 l -70.094138 596.15272 l -51.134126 596.15272 l -51.134126 590.83216 l -68.894296 590.83216 l -68.894296 581.43215 l -51.134126 581.43215 l -51.134126 575.88787 l -69.719187 575.88787 l -69.719187 566.49286 l -36.948488 566.49286 l -36.948488 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -76.380813 605.54773 m -109.52646 605.54773 l -109.52646 596.15272 l -90.566452 596.15272 l -90.566452 590.83216 l -108.32662 590.83216 l -108.32662 581.43215 l -90.566452 581.43215 l -90.566452 575.88787 l -109.15151 575.88787 l -109.15151 566.49286 l -76.380813 566.49286 l -76.380813 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -116.26308 605.54773 m -128.61146 605.54773 l -128.77394 574.82426 l -129.01141 574.82426 l -136.21046 605.54773 l -148.32137 605.54773 l -155.7329 574.82426 l -155.84539 574.82426 l -156.08286 605.54773 l -169.01866 605.54773 l -169.01866 566.49286 l -147.62147 566.49286 l -142.7596 587.83506 l -142.64712 587.83506 l -137.71027 566.49286 l -116.26308 566.49286 l -116.26308 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -180.8921 605.54773 m -190.8283 605.54773 l -190.8283 589.88104 l -202.62675 589.88104 l -202.62675 582.16455 l -190.8283 582.16455 l -190.8283 574.20934 l -203.17668 574.20934 l -203.17668 566.49286 l -180.8921 566.49286 l -180.8921 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -209.28837 604.69284 m -210.31324 604.96531 211.70056 605.26527 213.46283 605.59273 c -215.1876 605.97393 217.19984 606.18265 219.52453 606.21889 c -224.11143 606.21889 227.76095 605.11779 230.4481 602.91433 c -233.17274 600.74711 234.56006 597.54253 234.59755 593.30184 c -234.59755 591.84453 234.44757 590.5697 234.14761 589.47734 c -233.83515 588.43873 233.36021 587.52885 232.7478 586.74645 c -231.51046 585.21665 229.99816 584.0968 228.21089 583.38564 c -223.574 581.25592 l -221.88672 580.50977 220.72437 579.81861 220.09946 579.18119 c -219.47454 578.56127 219.16208 577.76013 219.16208 576.77776 c -219.19957 574.35558 220.87435 573.12574 224.19892 573.09074 c -225.67372 573.09074 227.13603 573.28197 228.57334 573.66442 c -229.94816 574.06436 231.08551 574.5293 231.9854 575.05673 c -232.43534 567.37899 l -230.84804 566.72283 229.19826 566.29538 227.49848 566.09541 c -225.79871 565.91293 224.19892 565.8217 222.68662 565.8217 c -218.53716 565.8217 215.1876 566.81406 212.65043 568.80005 c -210.02578 570.80479 208.70095 573.67316 208.66346 577.40767 c -208.62596 580.12232 209.25088 582.39952 210.51321 584.23803 c -211.73805 586.09778 213.91277 587.66383 217.03736 588.93866 c -219.32456 589.84104 l -220.11195 590.09601 220.79936 590.35098 221.41178 590.60594 c -222.0492 590.87966 222.54913 591.17962 222.91159 591.50707 c -223.69898 592.14449 224.08643 593.07437 224.08643 594.29546 c -224.08643 595.53405 223.69898 596.52642 222.91159 597.27257 c -222.08669 598.09371 220.69938 598.50366 218.72464 598.50366 c -217.83725 598.50366 216.91237 598.39367 215.975 598.17495 c -215.07511 597.97498 214.22523 597.765 213.40033 597.54628 c -211.80054 596.98261 210.6382 596.51767 209.88829 596.15272 c -209.28837 604.69284 l -f -Q -Q -Q -Q -endstream -endobj -607 0 obj -<< -/Title (final_logo.pdf) -/Author (Bj\303\266rn Kolbeck) -/Creator (www.inkscape.org) -/Producer (Inkscape inkscape 0.45.1) -/CreationDate (D:20070525075700Z) ->> -endobj -608 0 obj -31868 -endobj -602 0 obj << -/D [598 0 R /XYZ 81.963 735.021 null] ->> endobj -603 0 obj << -/D [598 0 R /XYZ 81.963 715.221 null] ->> endobj -600 0 obj << -/Font << /F18 604 0 R /F17 605 0 R >> -/XObject << /Im1 599 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -614 0 obj << -/Length 666 -/Filter /FlateDecode ->> -stream -xڅTMo0 Wa20e㺭)mC'VoqJ&YR#HJdI8AD,YSɘI)ȼ n9yE8ENvL%5?>$;M -8HHp&\*9ԝs첍j7:PtPcMDJ`R1){>P, )krKoѺL(mz/k ޾kxݮtx_^#{_r 7a$(m]>.TBFI,R'*/}0"#$QY#Y8 8-cfKouvUYoѮ]x/i2~m{m>)GROZw[3VjۡMHMn;PQZ09 -Zxo"8 N -i>8)|kls+[?um=?$Z0-RX˄S:(Ln=*K>`O1I)ުf]ڻk=?wǙ݀o+Ua: ʕҺs3oݝȩla|s(>rvxs$YFj ʀCŜǸsΑVw6ۖ7,9-6 %^K -endstream -endobj -613 0 obj << -/Type /Page -/Contents 614 0 R -/Resources 612 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 606 0 R -/Annots [ 610 0 R 611 0 R ] ->> endobj -609 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/xtreemos_neu_logo.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 618 0 R -/BBox [0 0 841.89 595.276] -/Resources << -/XObject << -/Im0 619 0 R ->>/Shading << -/Sh16 620 0 R -/Sh17 621 0 R -/Sh18 622 0 R -/Sh19 623 0 R -/Sh150 624 0 R -/Sh151 625 0 R -/Sh152 626 0 R -/Sh153 627 0 R -/Sh154 628 0 R -/Sh155 629 0 R -/Sh156 630 0 R -/Sh157 631 0 R -/Sh158 632 0 R -/Sh159 633 0 R -/Sh20 634 0 R -/Sh21 635 0 R -/Sh22 636 0 R -/Sh23 637 0 R -/Sh24 638 0 R -/Sh25 639 0 R -/Sh26 640 0 R -/Sh27 641 0 R -/Sh28 642 0 R -/Sh29 643 0 R -/Sh160 644 0 R -/Sh161 645 0 R -/Sh162 646 0 R -/Sh163 647 0 R -/Sh164 648 0 R -/Sh165 649 0 R -/Sh166 650 0 R -/Sh167 651 0 R -/Sh168 652 0 R -/Sh169 653 0 R -/Sh30 654 0 R -/Sh31 655 0 R -/Sh32 656 0 R -/Sh33 657 0 R -/Sh34 658 0 R -/Sh35 659 0 R -/Sh36 660 0 R -/Sh37 661 0 R -/Sh38 662 0 R -/Sh39 663 0 R -/Sh170 664 0 R -/Sh171 665 0 R -/Sh172 666 0 R -/Sh173 667 0 R -/Sh174 668 0 R -/Sh175 669 0 R -/Sh176 670 0 R -/Sh177 671 0 R -/Sh178 672 0 R -/Sh179 673 0 R -/Sh40 674 0 R -/Sh41 675 0 R -/Sh42 676 0 R -/Sh43 677 0 R -/Sh44 678 0 R -/Sh45 679 0 R -/Sh46 680 0 R -/Sh47 681 0 R -/Sh48 682 0 R -/Sh49 683 0 R -/Sh200 684 0 R -/Sh201 685 0 R -/Sh202 686 0 R -/Sh203 687 0 R -/Sh204 688 0 R -/Sh205 689 0 R -/Sh206 690 0 R -/Sh180 691 0 R -/Sh181 692 0 R -/Sh182 693 0 R -/Sh183 694 0 R -/Sh184 695 0 R -/Sh185 696 0 R -/Sh186 697 0 R -/Sh187 698 0 R -/Sh188 699 0 R -/Sh189 700 0 R -/Sh50 701 0 R -/Sh51 702 0 R -/Sh52 703 0 R -/Sh53 704 0 R -/Sh54 705 0 R -/Sh55 706 0 R -/Sh56 707 0 R -/Sh57 708 0 R -/Sh58 709 0 R -/Sh59 710 0 R -/Sh190 711 0 R -/Sh191 712 0 R -/Sh192 713 0 R -/Sh193 714 0 R -/Sh194 715 0 R -/Sh195 716 0 R -/Sh196 717 0 R -/Sh197 718 0 R -/Sh198 719 0 R -/Sh199 720 0 R -/Sh60 721 0 R -/Sh61 722 0 R -/Sh62 723 0 R -/Sh63 724 0 R -/Sh64 725 0 R -/Sh65 726 0 R -/Sh66 727 0 R -/Sh67 728 0 R -/Sh68 729 0 R -/Sh69 730 0 R -/Sh70 731 0 R -/Sh71 732 0 R -/Sh72 733 0 R -/Sh73 734 0 R -/Sh74 735 0 R -/Sh75 736 0 R -/Sh76 737 0 R -/Sh77 738 0 R -/Sh78 739 0 R -/Sh79 740 0 R -/Sh80 741 0 R -/Sh81 742 0 R -/Sh82 743 0 R -/Sh83 744 0 R -/Sh84 745 0 R -/Sh85 746 0 R -/Sh86 747 0 R -/Sh87 748 0 R -/Sh88 749 0 R -/Sh89 750 0 R -/Sh100 751 0 R -/Sh101 752 0 R -/Sh102 753 0 R -/Sh103 754 0 R -/Sh104 755 0 R -/Sh105 756 0 R -/Sh90 757 0 R -/Sh106 758 0 R -/Sh91 759 0 R -/Sh107 760 0 R -/Sh92 761 0 R -/Sh108 762 0 R -/Sh93 763 0 R -/Sh109 764 0 R -/Sh94 765 0 R -/Sh95 766 0 R -/Sh96 767 0 R -/Sh97 768 0 R -/Sh98 769 0 R -/Sh99 770 0 R -/Sh110 771 0 R -/Sh111 772 0 R -/Sh112 773 0 R -/Sh113 774 0 R -/Sh114 775 0 R -/Sh115 776 0 R -/Sh116 777 0 R -/Sh117 778 0 R -/Sh118 779 0 R -/Sh119 780 0 R -/Sh120 781 0 R -/Sh121 782 0 R -/Sh122 783 0 R -/Sh123 784 0 R -/Sh124 785 0 R -/Sh125 786 0 R -/Sh126 787 0 R -/Sh127 788 0 R -/Sh128 789 0 R -/Sh129 790 0 R -/Sh130 791 0 R -/Sh131 792 0 R -/Sh132 793 0 R -/Sh133 794 0 R -/Sh134 795 0 R -/Sh135 796 0 R -/Sh136 797 0 R -/Sh137 798 0 R -/Sh138 799 0 R -/Sh139 800 0 R -/Sh0 801 0 R -/Sh1 802 0 R -/Sh2 803 0 R -/Sh3 804 0 R -/Sh4 805 0 R -/Sh5 806 0 R -/Sh6 807 0 R -/Sh7 808 0 R -/Sh8 809 0 R -/Sh9 810 0 R -/Sh140 811 0 R -/Sh141 812 0 R -/Sh142 813 0 R -/Sh143 814 0 R -/Sh144 815 0 R -/Sh145 816 0 R -/Sh146 817 0 R -/Sh147 818 0 R -/Sh148 819 0 R -/Sh149 820 0 R -/Sh10 821 0 R -/Sh11 822 0 R -/Sh12 823 0 R -/Sh13 824 0 R -/Sh14 825 0 R -/Sh15 826 0 R ->>/ColorSpace << -/CS0 827 0 R -/CS1 827 0 R ->>/ProcSet [ /PDF /ImageC ] -/Properties << -/MC0 << -/Metadata 828 0 R ->> ->>/ExtGState << -/GS0 829 0 R -/GS1 830 0 R ->>>> -/Length 117748 -/Filter /FlateDecode ->> -stream -xڜۮ$v:NV7@~%d8FDf--5 g/FEfry??.}>~#}̖??Z_w9}RyM#|>~?ӿ??ӯ_ZGmG3QG}#=T|x2gs{7OEԺ>ԞߓgN|g\ITlI-{w_㏒g=',nM[I3y=s?Oj|$}f|zؔ=v򹧆an1䏟?'i~13qx~?94;3<^{Q~XlŽ's'_ݟ1 rHycνegJIo8Vp9αi,/O-6>>x2ʶgפ՞q@c>AP'^D-烽 q_Gٯތ}Js߳_\8>G[_|/ -sMRu>MFFL6T+ٟ(_p@ONpT|e=O7ssrq~m/z~{z7fB&>e^#c3?~vs۫FzuNqtc9۾y/>Iy?t,qgaY?{O{;j7Ks-}+fe؂BluX&Df76<bҮ'{#O=U~>Oj XMH) >yRa -r 9`}os(׸ſ5BnnEWv'14q&/Ԅ33.1t6*/g_o-xɖj.'?v@Ǜ H'܇``eM -II? 䙺@n< .`h&k}|c %c3|?)]d~`d3]D2Oy^9 !O`w|>_ˆ>^=6OO&9an߂Jʚͫ(ՖA=ysse7 nXI /͉{<bYny* so -dj %`r^[oԪj dzPi=i|gx/9Pp3S)uµ|ho{7ԞB1Rba, -gw'f<NBi)_W<хq2z o1:O6?{@6߱_Skvq7½Lϳp/nyk۵o7F.aO!*oAPK&BM -6l$Do' 烽xȔ.E &z}76eL~jCy"[ߔiRE4O>(&z? %[*[R }#(7li,& 'Թ7A!TqZGX=bes'[mǧ"g?M;=)*G}=\)P?:C mE_-0 ]Cϵ'NО~ C -W˞H$373yBe3 j Bt*0|1vTRŎV_0Ϭ*?ciC;&XQAR2ȀX?~2?I%.ˀڧgN.x *m\_(*U=)'-PX !U'bs=WIOi.Խ^ |  |xkY * p8ϵ#umpћ1ڭQ_=oG?TZ?QN@rz=~ 5QjP$cR:3 Ԗ_~v1~qUzbg N$Fhgx & ̆V?EJHb_^7ܐ"E j[b [4s=ǛdfhFf/D-4[5'KBn .Xc]Gf7tao&@=h4U1 O' "lvcMSrۀЖd͠!Ά| :t -x^4iѝ.-q{dKItޘn7\ĘS~`Nz#O>XT=E\ D73lz͐Z|׃*o!CVO~Gb ʦՄ_t#^o+Yh[ ,`{%L8D#:HI>BA;OV{~.Sۖ-h2hSV3X7niyȁK&Dg6#ȴSOOZ)/OarQyO1 h-GO$0n[9dܽn/K4dAo)ϱDߐ%m6`΋9m$ -eނY%0iu PwmS[ԸmesȢ/^~[/:MVpZ2+mn$o;' -[漤;h#I=l(nb> ,UZx>.)@ xq; -/y^YY р_tԟ2C đ怵| -sƯ |"Ol2;^zWTpa 1%c0ĞyO_!PBFl<ʥ0 -:yKVO!3q`_(ݔxY07c|>i?PLOtO~Vh Xcs r.uUedOoN -_sS'`X$gɇE__/cpU d0nDR%xIhEo6p]NZ/|Rܙ=k0{W Rz{}`(߿zLRb һk\+M꽌~3p>âCNGO?2z\vrN9eTcKa 抻ج3AwMW@bGa7[ \/~x[3HT"?qr7q?٘ y"c-3"Ut*k; k8)47.p p-9ˎ‚ 6E^(~C!!b20d1]$' J/$piJ̔ncJs{G\fZŠ<:fDDD!ޒᆶǓga݆7? SV}f۬Ǖ7yBuYKbnk.VC"\Xb2|XU qlo.aO6$_ФkxEAzc1Ej^rMDT1a5ԇ0jDo=VAy{AGe ]/dz x -Wg񔞳c8&^nLVE=1?dƎaˠZt<{poʱZ0(GN^[0w̼O"3 qh^JZ0L[Y 5Xz܇'eNO^c`JP'!{V 67`bZFHƿ 6L𤮏Crؼ}\2y,`NAW>%`Xy=A>241j]FpڶǿhÕk05ր8gcT&Fc:1̷ٟ@J -O1Ӂkobm Œmn1n~bcGN>Q?m@0p.ij˛ B- @P^䁟ҥ1H_9+c~b6Em^Ewyf2"x =dB~:ޔ0 ol߉s kW6U@<{_ Lҽ6(~Dž]kJozVZ8꿯d߿19H=[_EE[!z!T8xv6ۅ=-_?k~? z0$g%+RJD8=U+cor2nz|ZB1\A2x# kKqN@>X3uJŤP0>n a=CGft (Wjϵ][s2GAq?`\ۉ>x o@@/:#yd]hJL̙l/O Y Ka0z+MǺ?F~p;ڽ;ڼLtyQp;3C2a>4Lpކ_kLjغ-ܬ Ģܙ9FcᙣHmDw -yϿ&1<ɶ SeZWb{a`&WtH~ df .YwVZ X[N[8s'C.S>\)'0g/JO" &hjћYl*m7'(5LO~P:-:A5C1%@WnM6i"ԒyT$lY@-L-#F11ک8.fIjjNPLV)rغݘ"n 4F;E"v*`YLmNSx 6&\hFK z?DEne0RIɝI-AO,"H':Em)BgC@79&CCR]F@AB6,r\({ &[$>=d,Svps:lnM&B!SH,PY@&6(c[Y7`(hVg ׇ*+\KNbEbn}1ިֹSXIUd( 1@&onU( Ap&y&g驘IG{'7Ҫ-t_|eSutiXn&sbwQg7VKNoo2\;êPq#,uœ[ý){J>*ay͎` )2%";L wΟ -A)ŽNv .O+`TI9Ыe\d6v$`ʟ+z5G  N0$ݡO`ڹPbB@nt -wO2Lq![F_3 BF䦘pNE3[|f)f7O-![Ҩ`6lᛳwEHoqe2Zp0l˒DkCDE˴ϓ7ḱair}yZ]a -f{|.*8E#)pfT+>xRaY :{;(!)'G2iYŠb]xr}Q9Rg13jDFI-npX`eg<; vJ0Ze;4xt,&µYN| >ŲCp{$ǒi!YK ))f1.>ީ8S,Ԟ^L.b0mc}\D]Kd&.j󒭀R{͋aI}j&QM.p`Z'Ei-UxD4.#U3ԖltY ءVX"6ZAonyv*V;&x0}DI0RL77Yhf(xyQl(&KǷ7g"ٻ6HpRlTJDVTxPaG*MIY37z[4+ֿt4Sʐ˳:D]xç#}#*Twg md ^Ě)ߙ*y$v(>&u;^*voR(5j*?$Ef̔q4Bm\Z7D؁ǰaAqg0|3]`rlI!8`{ۻ^LmD?WtjWg`"fZ}`Ž,Q53&w̲ wȭJh:CPCUJ;&Z)n7fy= g82$x ܭsZIٴOzs9Yd1%ʔDUDprw@9k S\`_g/Hdm8,z$W9}ȶ Y)hݨI  h-I@c&Y.XiH.( 96\d='nl - -e!Oҭ%cb+Ι/Luhrc4J;E*\/XM ".K<8F=2xA"g f bzm&W%*@nwbD\zc-f 25QێMY_N.J0ufkɹ4vLj%]*t!˰D(AM)FC;bJrEq+>- U_tI&wN[K {Yw#u!T$YpW(#K^ >wI8E(6FmMY>rǬ1"wZvL0蝿K}x|:Y, uHt]V3'&X V^Uq-Be|ޢ+1`XjX5~kՏv՝Y_@3֕BxUq2L/ lDS -Ays0+ "<j^pgYn_aLr2 .1#^w}ћ.'A^`no,0g!0deL,JnwWuY.f/XbeAyuzYs 924XT4 ٞ-+P^/J+3K00_% =*M\+&Wy?m] f-c4_v^Hh֓n=Uo:vlC0Rȃh@&Hjd8nQ0'~ớ.pŃ閤HA:DP1lf+RQ\lyYp)B-1e7L[M˛sIsy٬T7 -$k:(ҿ,˦VL &w8PY]P5_O8}=_^FPv,=MOFcOJt9۾Խ,opo ƫX \*YJZ ScǴ-+9i]kۧbF ~gTGz|n6&!e[m]ӀdDS MIL,8С5[M4k&ґ⊆f)F%J'7js T,Ϩ}tccuɆ&[ʙ,"'͔|:0@|>\;Of0=ʒ )|ŕl$#xSֵ%$Aw({,Ҏf s%M6v+`PtəUMxʺ(dwVP5þO;:@@BL!yӦ5_AWZWI ,u֋ĸxI|o"%o*5:n3m6$.YA\DP' J`$#QM\!oΡ $-+ΗKJmDDM^|{U&) -_gbX -:БiTN;wTWpQ*U>I)o~ >lu! F(n6ՉḩXv$q(g_mL6F3,z^ݦ85vso0ޗN;opvO^J7\wP)vFjU;zïsۛ+w]Z"5܇CU{vǿ:vlFj!X c@ߦ vcB:`OWF4%9ru½$@q;CLߴ=JO>$ QmV%,1n6Yuᨧ21$s,:# )(i˦lQP͗1:6w|v z?)'6HH)+)]7i_fpS(IF1 Ɍt<@^lc>D[wSjkA^⣻%F@|7z -.ժ=LkZxL9]dAPn/ f2]V}d΃bQ2C4"KVceDa!B+b^ - -kcS5'9 }x2{M5ڧMKR2 xw. &b } -Fۻ|יі(c<|1} d<'%]٢CnNjC9u3:3}$ \qOG^qmҗD|>dص9j5\~mg/ ;--vkx7åd SG⚍ Ʌd]oPTLN;=(TN,Tw_؝u?T/dḺL]4P!uM 8071˦{L;>D*,u0}=08N0l<[o1)66q=ؖ;Tkax*Փ@k3iw%'UAW:[aO7_GUYJ\M]Zш#NB&6. 4,'Ч.3%8ԢmM9| Θ@8=K x,g^( -cg5t6HsbȢS0.&3Ajͬ3èmI>Gݰ]\teH`9RW -NPM9/eEA~!<c)YIA 4$Hkgf٠T& CshDUeu+jU:p&eŏeX]׬$n'項>6V,$j IQX jB5!w'CoC1g,:U>b0wb,-*t**I8J _`%M!&lm}I(O8l-Z0m' kPnΠQ6M;n޲[$N!+;#wnۜ_ ݠtܲ]7kWuqfڟr-'*^ut&g,.%Y|q3ZOw1Q:G&OyctDr3ϸGHrPHLz* B=6k= ӌHLdn9Dsܠ-Aos,qn C PV=Vl@$"Se֒0X`fCʪU Lj"[Su8Pާo_ys9Ũ)|z$Mwq zjӥ@i)=Lfժmf(K(@" ?ft^]&o~5P7taM_F ?Aaru̒ϥx2. wT$O -$2˛AT<9w6 -}Ёj -}DzqB>#(J-R%YU mu"2BE).wVKm:wcT^cP'`xsw\]De=;;,RroBĿCR?i]<$АE(}j҃"D[?aq #4@M1W8sNSxL+6QJ6 -뢯5@ -G.j -cZͦPBV=W* ;'FY72ݡ#PY㭼~5Sk*y- *A̮zԽCwsN"GGjEC\ZJ"phTYtU+#ji($ɮu?[TVJC]o3cw7J_}<' -#dәp81R#$J~2 J \GJ|Sdk>*j=Xyh%qatgl ;eiHMRbaE&4E*%LcA.XovO %ԝþˍ;}= TvjWk -'j~:TwoiU9rkBŚ -Љ-a,BNo39VU7mU@c.)숒V?pObd^;~g'P%RԣUAcGf2P'5NT>.]`d^.%t!A袋)KDWQFX0Dr2>t5UU*ǞqR_pKO -sBMacjQoz Xr@J#5pd -UԳV= d!Mٲ_s7DV3Z"Z̈́[@kn7Z[ le7Zl'jbeŹpbJϼHV c+Ob]({qcrUT ss2bxHQq`k:̖Tr$*`٭2T&19*wjVh \Z>B01a/t_3}LkPri_(|E;b׆Q)/4|߽'H- ^GnNTJ/?l- ]fB a<C[˳{Ug#H6s ,'$xav5CȃCiX% -o Xq1HxI B"*,K*j>5ڵ8FEM l+C5!dW5U@;kE -QB Uid>\0/Yd Q޺y!|=UZP-qB@k ;VEVWؿ@|l6ZdM -FZs YY +~wr#Ry瞉-r7` El*[MvIƓnFf_ @PN%㤠kwP5$Z Ԇ@!oB+V([+!z7`/8Cwe -{{gc1]m-&xD]9^/Se~ uZ=_,74c]hNti!F4X|$cR&X'.Տd$+dDIpalt.iКU_5L@#pIaY}4;+khREu[إcIEm:}VP;܋P@o -5c.Cڭgj++7 0R-*!`[iķlNL,p6q/w6]6Oe&sU8ӝ78P )B"./ރg;Z^ϪH.vv5FxR-6Fx) Y:妄]DnQzU$^JuhЄL, x#X7 5s/<aN{‹{f}2X? E][xqZ66(4y.x/~WP"Yu}Tn|Ȗ>_4/ia[VF% XRPWSt"\̾pR6RΉ/P]jJy@yRXZjS(u;, t#{ ۡ) µAP*t?etԼ~}ƽkk񧜅&_(ekcBߏw:/"G,A 4A`z)T?j=&0sibz|[E]_ E:Ռ&pĵbWP$]VWL+IJ{VϘZpOu^®SbWZF -alژ5'p/vE'a- a@XJ_CLՋ-_*G|}#1ǘkhBGM"_+ S[ڱa$}0M䑍IEUVWt%*Җ:KN&Sڭ ͇G*u3fynb0h(|Qڡd_YQVI#'$"[U \VP!]Y}Xth/<}O|xoTO9 `yۂ[p_ށ4='uknm7SYwdTF6Ba܀0v 3HWUv0`EUa#`Ce8˔V΢SVjk58lָIezϧY"?CV -a-U7M ,IrB_F ztF0ŠU0s Wm΂sZ4!?O&x ˧ l}H Ieep -cT0 0vwC:S%&l ꉱ^&Ʀzaz$2 -9n6ix#OꆓqbHaL*kuM# A0%RQcJW)MK"!6yiVH*BD?crcJx=!FCՑ!B[ߏwY/K9أ b >&`h3N Jb n`-GO]TC~ -VϫAUK1SA!\\²e'De!l#3J*D 13N86'A:Kca>QvÊ~02]e x -²XcY{e F|߽b&[@rb#}h: i=;s!lH쮀:Gb{'Wce?@Xc ]Hu촓BNѕutoyxz1J?zSA+ɊTөvx.@ג7Na ԡ.쨞r`Gד^AD2%JUa^z};dteÿ'kf 8P --T†M̄=}ŧH\X+B -R[G6p~Cw׽{U~biQM]p}n$hthaMe>@"(]^ll)/PejՓMXdc*OMPs*U.ZLJO@Yer;T!@Й"[HV݄EW!XQ -FUissݳ@ ֦m"ڌB@;z+fY1Y}wWn5gj8N[E|Q |uӢ*|5 -*%b]aBkrxT#$_i Za  W e<|!@R[TC%D"B7=J%.ϸuP"{E@E/{jRq˱J!,`%CB|1u+*Wq}qË{40RVMkdRͽ˹T%aüšE9T`jgIp;=P4 WW.0O)(JgUm+:G*Wox/;/ş ^ADfԎVi]t݇aYf##€|c.5'ֺ԰!H al<kZrG75.$]!X:S$8Ğ -jxIt^O GlxIԹX?w/z?l«O5_ynRz,P+d%vXAH>,}/EgJnY1آOPt1*-55$V"ɐrB(x ejuP{`aRWW%_w麭]V+V,1 V?~կEߪ.+d9,b#$+8d] .Ma V蜟YC- F}tVĴR |߾'t=P;A W+~exz'P.k[^>%:Xش 瞨EAXㅔ1BrK2]q FPNڋX1Ċdwa0T[FՃ&Ċd^v/ƂWF܍Z,\scr^x=TzITӄڎ3l1A=Z* =2D%c-K=, +߶ 1R-: -1#`5Vk{NgnH&}*%1c0yȊT` E't:61DV? `LV##1:V=.Ub,찘 yW:;к3$o)Үӣ7l "ܒU(`zRi`4#V1 0Ul8Wȼ\CY}X2:WRh6DFt0`VbbWΏ{"{`>_B_[Pp^~әW޲aofK_͑' ٳtoFdC]*QL LQP\5tuőp`DSu*ꖻǑJ}˜vd& 1FG9!QzxJ@30V18W`U̸UL'f* ջ}^jRp,Xs^5uUEA z߳`~wuX8',ŖnsyIX"lV-dv5[ j0yCܱU;߷ \ׂ/"?'FAݒ}<" K|/Hb\^M -ebE B#>DXסe6zҽ9[5W9!j,HUʙAƷ``USgp2'ĸɵ!B;I -QcBp:,k8S!c`4%Bv큀 (͞_W'?yO C!CjV`}x6xm1KR^`C\ʝ`BV]f'"b(5VoRI.K4P"LNV-=<#L.EEFz^wK_) \B%V}If:Ol+e-9j3xM&B7FUԪq{W ءZ Z!b\ o/1=qU/ʈW\A^熛痿N%515ZbK/U 4撂mvK(|B5j-0 YOy%~y F{P-bGw*rv$cr^M#Mo#謌7Mm4`'J5`X"r}_UvdIjXYYB F M/>T|FSv 0R=00T~G6V&AY9\LF Շg<5RST@>L)a19+fKtNPx~Kbj<1!.?!)<'w1VmwLBL I9gaq!lY8! ^"?lj嶜 -'@2} -ݐhTu;&òycU`7GpBf%(q Y9Yۭ|ۺxr-?1 -ᅟ[!!;ASZUqOh`bwM}M.Bʣ_LEU7F( p;<`]PG5|HLGdzŨU ]]x6@c789y9ȱTQEk_Lk> ݚb ډQ*f6Td~2AVTEY~L[$XxW^ -^ş|߻'Hw`(xwM:V,:V?鬭;/ n|/M) (QKIKimP>f~@X+ّʰĮ*UtBs;Ud9>G~JoB^~A˞i : VcxT"իYXX>RrSa=5. IЊOlRbFam& [Q b`ex{O~P;N^b -XCO;ݔGf;87k)"SRe!7`E~GׅlaYdu)a)"| U;m&KcIvDIa 0$^׫8&>JF,qZck1r̺AcCU:3_ke\[3[9ӒjM< -4ԯaH$D   y+5qnv;]Xr m[(W |) -Z ł7@|QKPd$ ]钑#ic5Ǒ,% W!CTFC8b`-$ŒI4s"F{ fĐ -#R -{uϗd$ѥlH\# -`QEEk?!wW5B{L&򎫀%Ee]d"ult~/Uel$>Rt!xIōpQ\UhF>]Iԉ6<}!9,KW G$*]pePPJK X85NpzlV]Ǽ.ëg (j2˺btR*W -c{bcP9ۉ^wU` ):+^~YEMdԦv]_` ZڙeI6͚t(ɫEeUy0e㚈Ɨ"rF1t xu&8s@\ɼ\XԬc, ۡKbA;z$tfțDnU6K\I5,EQBT5sw$쬃,W 8e"[ V T^NHeVw3zjĸ`2; kje0ӱ -Q!RrOUWhZS{<=Nvj -=U z^+q`ldže ׀VZԖ0HBzZx^b[;Z6A+؋,gP&lKrqram>\.ҩ:FyHy8Uèq|߼'Hw2_~ur|V@R>CTLJ`"+bw/1;NceYɰXrnYR0WX#T0 ,.%1jd+[B; k :%R@$51]Ļo1:ڧ J*cIU5htQ*^x߹'HpنG=DBX18Ͽ^f:j_D/4ajaBPI, t) u "w^'IEvs^R*D&ʟjTB u<8!hͪh FhLТEX|&:7Ļk9j!@T 4pZ/"{P?a9պB;gi%ޕ2eߞ -[X-`6BMi,#?By/cVJe /pU"0qҒV}Fpk=3uUi7lи`-+e0X2bW5'9%\/U#Jٖ1ΧySJ,ۢ}$eK)TEwb<k f<7u-he*S: -8Ώ]{{GTw#l$Ft6|'?Bŷ9t `|ŷO: Y5+(d1(ҕ[qxxfZ@sOrqU?W`%0@؃Z3BGIŽŽ V4個A0@pgwK>Z:UPɠ{"&5[j֌8̪'M/XI=/UĔyi* kO5LSs#ށ@"GvPSTߏw:cz{V-|w}ֽ=S~,،0B@ȉZFKu$_DMv=HhRW5a:1WH*הcn4[(z7կD9dOLj)0TCs HXs=pUX.I_|!: +/X[ 19zʏ{L21Acu| -^o?~ +[gj/j@[#5;b0Dp ` 2IWo`rn)ػ]aWjv$ΘRc @$Z7i]ؔt>!֥N%Vy11G%͌vTȚ)iٷ!&ubvt6ȋ좪nP A}u7L7!Y}'d?#+3; -r`׏/0X[06AcabM]*G}YHvn eP^bKF+,NG-9Bw@XaURV3";kMiX^ `aƪOv`*ᅝϩ-)z&`"e?ҁߋ- $kVAu.*@E6&8u}r2>.ω,߼#k=4;]uv3EcAgRxNE/gn.l*LĖru>Ҹ|ksE͋d`k&c+aLA ϔ6|uZT 3YfB5'(VNJ[w5c+-ĺ1U*@:,E}3u=$%^{қQZJxB}LO'w7RvG \HG $X߳ RɣLC@c+DzDBp@K86i_&'P#<]ŪWT5Y+EOnz439X'~3]*LL/ɫJF)v:Wh_C)/21_iÐ(1\\`Ru-w /'Wc/S`5QG)R[ NlMz=vg9+b, ->vv_Y-eB,DZyICڽ|єė:u$_K+luVY %xQ#̪wO_{^3߱XHvJW8Ҿ69,Thac݋3f}C'E?wb+_{B5!ַ*P{|[dV4|C`/ Sdrw=UѺ~Uvt'ybE{c.D0kmblޜ -%Ɔ0 b,\Aa^$ 9axR$p",GBX ǖe>re _釰dwuQ[fS ॅˌhb4~cx߹'HW&ES۳[ !sdCHX9?0o}hOݾi<P>5!a@,fɞt}v׫EI~Z!Ԓ}qK^m&Va92V llU=E6}$o'l߻ƙ*ц'(\kl X3, neNp"j7:EFF(#Spol"؝"WY,14.XwCy/ޙ2^1X 5 pTP!Z<'(Ө*V舘q5.:nƼwooxv6[wHMz&W0J~q>gq:(jԨכ5l%rFFQvjw8lTQl[*+2[ݹCQr6J[#ɠ/:мVAƵ lc̪qix׎=& &0mОM{js"^ q]unyZ*j#{KPE'B ~)U ҩ6>6G}d7% Z W?d/zU P1{El%͂vb/]QN(Je/$p6N&YC};%pfuW'4${5/$^KHb1Gt5cneIP Z) =_ssLŋn(]i4%%|3 'ZNzv1=um7yjvFC -':Z]"PvO. sPk\Cv "=—U|=@ AKe2hVR5qʕ /4wk}` .uph-N6sFnx/Sg6!˝.HKUed-ICd [ -xmP1`Í+3:Rk2hێtIX?h;Y6/aZ6`]}QOp}G< EWVVtDlUɌty\_sF,u;5]a%ڄe %h`ꨉz>_pt(V 0 -t`t;vXGK@zMnW64*]qԥrQPojb!e"iKSI0Y`ȷbh2"hœ|ns1>RgBx.XJؒ Iؓ>!\uO $Lm,qDnMi!1gma6o 'F |q !֖QHTbl)S !PkD yh'djeOd,Ky܃`Iqzٷ Lm _?Y':sU60|`;WĺnzVWyB2V:ė5bqtZC!+a|vt] -'k|>.!Įuɓ/!5]V8X-nՅ0Nx,`LDR2Γ3$j6ABNj4U  ,+"LZB /lb#c]R,4`&錬޶;Ό߇"v$c;]:8;H⹃0'0 ~k">:|+FGD'AaBg _N T &?v4D,]-|T0ix-Ea 7v`n|<oUk2iBkl -StvU{ O2e㣁Uhrr톗: &:Rab^7Gg -T ?v6/zqAt Z5NHӑtC3~;\ӭuާʓ/uD%b@UNZNQΎ5V8F{SዢY<%>vT> -5慫ΐJdӾʴU六TxqRK~z9i˴dq67rna^yh%sep~mѠzա9# jE2cq/de-lR5+z9 2 d؋XuaߪHZT ·F"а A*z@4 NuY]ۗŶėӏ植kž2.xP,+?˲PxU~|qC<%)4l~c-േ[{5V}Gse3)^.TyۆCѲnQ2uv/Kqmxa8b_33'Xaˆݛ$ -ߥ_ȴl]߷R޿bFYs~gMMMK=מæ%:_Ivb&{2lwuK22Yᓶ!u:R~]E4g -]7s +2Pn0Ls^9pdNx_9)O]TInO]-iq ֊Z KPƜY iݳ`5l U6kja'drx 2+Kːӗ֛'8A=L ʺV5O\"o79+pPchaq610O?bW@,8NYbSt5{*6`>uwģ`ڛ4!"UALsp?ʈ - b:Nc? SxiiL}mEY DXɜ,'ܞQyI ^cZE!e尋}e"lhCWYlz+kLW+2AkE34rئpR2<Ďc2z6Cs'Zj/C'>Y -LfF蜟uII^;?h\gMJ_Х<1 t:3U;;CtH xoۧndY][jX 1>uSBz Dq uA]4׳?sϐ3őǂQe &F2 -73l ^f-޽!dQ ֏;A0 f7r[\г,`v$O|E\c"r:MӴq vO0qZUaS_^! Y-v$V#L;yD˒d/` ,P%'s ; L$84RМӕ39nV>hYla֗Ϻ$p ^AZx-@?Hʉ#D <#Qa)KUכ肃A~i)Eq"+!9! -7qCW eol !+V kPtcOaRd} ,` UE@$f!̧'Asa9 =K _ '4w`HsVh7=;!W8XqY>KK<0- @|yXdƘ:(Ɔ nU^+F_#yĄ-I5 A"GJhLtJ4d|/TT\Aa -P #wQQ,3;WXSb&A%jVa/ZpU1Nw3R'7'Xi kNCnM yjd,qDĕ١U{eؠMy'J:~YO /#=K>օ%13cwliΓ?*k"64-/BV,iYG}*1lv(y",5dVVԔ 7Ćb`piOaC0ĆXլiV Kp1bU10QDfE8'sv ,MT1+q(H<;qYW Gb+[D1 -6[Dn3xK!{S߉1/+!򁱁Fm\S9??Wv!j`x(Z2† NTWSLexjsf$g`aZgZ>4=`x_IGalb}1 -&9*(!bmV>w,!\"5|ȵtA -Q<90U٢Q#댴*⎡k+W3 -Ct4#>뒒]ɐ JLx/"+ ٕ}dy{^ca?W\+c0s"jk|AW"*ۺ/a߯C@K,`'=NP[c #fYKGCJou=, "rI U`_"?hfմu5ZYUVf{ǜWk{tn-Qoq×EJ-aQُ݉,gMdx||;u-D#"'oh{~AVOM#bkgahWKwc0.2pJ꒥?mE\JOg&6[;նB_hOleEv|wߎDaZs{VWxb#hWWս\Sڶ>zrAC"yRMm(<Ѻ~U\.؊h룽^k*Ყ+ZwKvX#q$bZ¾x@؃t.F 23_ -ճloJfFВp8&tcx$V1fM;] 6 Þ~vG0̇kcX6奉HQ#!]nMM%BH΀|4Gc x0cUXPKɡϻg~<-'.M z|\R q_ VU L6tWf1;{I -(z@YEVdڷ\Pܳ -gWV'ԹN-I~lh*9 -i˳bE'dazeRW:0B(=H ;ƚ5~3T+b, -1o)ƊF% I'ٟJ =MCql>wB?Ah}t4,]'+]6j |\Q+&_{:rJ_0X>&cS=z5jѦmo/hX@Il(c. urJaMV ㈫fqÍPt7Y|RKJ1j/"o=iKFF&L]r/ŽgOdj4-9ՓwlS,kCsꢄ,A65avEMMOFњy>`^ ʈ;.ƆmC}'Z/ T{sV ^S/K4. -pHs { uуs XxpE f͂Ofb: !<|[} \^8fsS$$Iujٗdtm"s؛^4%90YDK­Iw!t7I 8Clué>lZj؛a}'rG%6Su0=LtcE/>0K:+:^YU78͠evSu]9c)'[B~*Ј=iۋ}9 JM[UV^IˆZw{8 aȉԛܚ>T* mGeФUٓ c ?4kBT ̟`Dr&*:(&& (O|tZ%JiK'|M+`XN%@@@?׿azC\G -=!_{W -&w\ "ǿacޒqTd:܏%K$=?W/_o+0 <3F=_.C*" C !6G5rq@ul_^ L=KV(%GdVDbG>5I0[8#o)B[:Ξx7e]ZH?Y6C` mMEYzŸ n_h\9UvԷXzJ0;7 F.B={I\XmI8ӂϧ~^|,e>hW=!9xBw`!5B!w=6q!,< -= -K|&%&Bn\?B0,x,Ů@$(gd&e] K|%1S-eX(Q-An*Wl@-I &UN%L6"U[LJxQ;&HxiOt(DM%~wq,~i(.Pl$M(.møC2HLn@#15!rH饴4/Yc ^iLpX?Y$n F$KJXn-s9w,,!*56LKBJuu_ʧFGa&uw]/LvAI@GhXC -Ura%^!?E{=fĂ2| O+_!qS_MJƻl҆6DH4CqD3;ȃ"wO}5kvXU% +(Б:Y ȡIܴJN_'>x8MSUV , -RX2M,G)ϯCie,aR,W!mCh7)شtN<,!OHiv;;$nı=QþRl<l -| ,@b)ŵx=q"!%,n6|7cgI-։Dps7ϡ5B!,/,Dz;/b7 -ܵ}ؐ9o/I;c,[aZR M5Iay^z4yYXh~x - lt'p.C#+K_$$Qop.sG#RǮaiBWn#qa;W>PEM )>b OScP5!E؆swh 0%n~1,;'^JnJJX$[ EA %q3@iy$iHE!"ӡ4%i\4V1, o1 - nullxڐB I)/)/x?\O>nסcX!o;oдT۽BH^Wvpù7biiOoIPBv6[_%ZK~kQ%-2;48] \+U7Nye&,qίX ->)HuJlw|\!_*P3'Jܵp5Msj.i]a[頩Ob'1 ?qjؘl{'}v|^-%%SZ7V#ihZӴԬW^qvv_Q< lO -0xb;Jt"))?BX^Z!`O*Xj2KIHڤW::5ҦfqGB6C.Y=qC` -~ޅ`]Co6׍gYz,;`Kl8u2E -Biڱjb9NU =4,;Y-pkGR'OzNTmQ5"0#:fuэ#NJ+W$@1,1MKjH ]-=B^y)!ne]ju oS( Hve5ĝ?2X\ڕѻ~Wź@AHkFeh T -<-I?{6ֲյؕ%Oo-k;36;TzʬAxaiVW;Y6J=ދ XkiGj[5< GDam>UY3H/ov3[ -`9iLj&oH3]ŗ30얞4f/$]DU#'ChdM - D95?wvO)$p5 $r7AoN+mxY 'mq#_%vhk;TYm:N=Sl#`O;ޥu5q#-tK4X@ȭJt l.aJ^qT6Z(x1%q1,1聜X|KWmgђ?I+gE#8~X*Zߧ9By>.ijU[Q2Ljy: -O#^[ - ~W_wk˘vt8fܡ@wqmM%.%0-ُUYD7!,AyOh[2I,xG9UA[WJfev{wy9m7:e~syv>J_a'E뷳E*5`M+ߔ.kci2v4;刁MIeF `q+\dћ[K)W\}.K@KʍiVMajWڟkUdan?] KܳU~$ᅘ%䚂Nf: =&=,o-5 $]뼣qm98[؎ciijyR0 <>#"ix14*M^:qߖ_j{b8wPv$76O!,fE{]2tANN6k>(W,Pxp=ūO;,58]u5c۽F#k2XZ5&SRمC$ĵ< U_nGH[we;_T뾡ےifKaAzǑB`g,5p,7 -o~X8g:\m ̈́|5IX@~= -3w|?|y`"LPK+WYY yCg -m'RH<"'kC3I!)7L˛ƭo=,~R>ƛée-:$6Uݨ6қjqzOq2X\)vPah`Y^"*i%5@j6AN2e'eqX#i;i:ۼ'<(k&dM$<{{UGN5Ded%|pD>ǹi yY/:Pz`$=wlϻ$>Csd&ߪhF.q;;~Q臬&:W9F߫2_Hޟ阷¦Ogpu>y:EB >e34e읆 V[3EYp"ENv2'ݼWig@;aɜI.fj\}p0wuUJ<0I7c֯C2jdbdZBXNyg@G^ .g6G4v=,Xm]ͼI6khgW2+k-wŔM --dG\L7LqasNEZ j>M ;߽9E()6f{;n 6ucI\Y9&w_LژV|| Cz# ȍj -L>_=l5j6;J+)zZhU!ؒA)zQ?mp>9Y$\HU%8H<&vj?`0Tty[k,*^2dIT+E89DUMg)Z2:h)DV04[o};-U]k bСW_H,W-r*x0pi@ILS6w X.\]. -ؘaF)_cM sU;L̖w pj\cUum;,,@& UCe+aZ6C:Ǩ D90`5t49) Lg+G~QXrY[Rmv*9\ h.5?#KAݎh&V#ZC2utBVo !,n&d[I0.=E2# Uy_oEJQa楳_4׮vSQ ][ ?CceW[9.5] l P" e8w1l`\~w/qߨE-_7Oodp${~ݝzl>bdW%ǥzYd*N-3z?9"Vir3֯;v⹈\~MhN28ώ̀~S'SUzx=N]oF}\oz\:9'= 95뽬ʶ5bfaAnO {<lG}V'FTI2C艝}`ߡ)cqك;ߦ-ZP WXo wڈ.;Ja%kwU,hU'~3WuE$& -@<d,m9h{]o|u\ꂘl_v౯y.k7Ρ͚>d|-7N|[os\mp/Q"ǿQ!W!;݆e]JDNx}5loD1س<ڢωW d'cqZi4VG77ISmjla# _Xr+4 u# =|Wodۊb(4sBOJfM~xR3!=Cuƍ$}6+nTiMzqW#y%6ښjH۸ԅeM$Wf[PGg)[w>!@M[}{%<31oO rEY;p.GVsRGmzL?cE0q+{ϱ/)N - Vߖc9ͽxljt/;sV[ .(56:r[]fBcXL6r{#]ۢ~!.p {W90O⫝V/ -H"cRbA0rle,d\܈Ӫ94}~36*Qn ks;:+{&uE/ձѸ f=іCg3> n#*PkDb a~c R{iu{ǧr~JRu]ViüXo_\> -nP"A'*cSգ!,9,hl|]o]\Cէ xb;5aw\aËΥG^#)uQrh2:ݘۡ=dQ o)vDעgqG3q.~V {)N,P~qݑܸb݁T{-b𘽕'QUcIe'ā"E{<,n8r-kv6j+D`~=:wXv^دljcSG3mdKHnv9-OK:զ6m2~ -/?gaz吝?3kY5[Fˎ؛?kZ_Q,Ԍo|` '7#,]98hXZ_hl꼩Xhi p#=@* 7tcŏG9"ܞ:Etn+^Zga)/nўk?l#p(ݏIDCm_W5|KYeSm(IǪ~Jo`mfz7Z"iNCxmCrΏ;磏sA_ڶ@Q(/'w{LNPv. %Zf6U=6}G 6(C@Ɂ\r`~l^oWh酆o=؃XPan2pci@r颶U5G뮼U/\67QkGs*Y.CCCG,8??WH})b'"vo|Q ja;Ho1kx|68B}1z!}R HH@|X -Bf&u;R{!< ߾N(fZ{˳sd{$ۓyg,KC3*L*lOᯡqBxf2q"vo~QSHP>zB}@1I+mX{j:ޞsk/YZ{eP{kfۦfq9#=kAZReY \N  \`hapN RBP!1>TX.usf].q Ux=4>NyCgBH*̼ LV,j;vo%m|WWDy=%qq=7t?&є%a LCImu8WfgMɲ%9-Gdv4jXhNR@ׁP`\ -άL:%T`uFҥа*1n X+{$W -tdIcm1l.!My{*窛,qh1^.BH&wj-힓|[Sޔ.C2twY[ Gw9} ,Ohx <1 TEuK}!]yjNnq ԇxRӤP^ޝoQ{/j6|k> -*^+gwerh2jSw]|>.Jf׮5$Xǹp~~& Y{"<+ʫ^Rعv@1Y6tjq݌Sh΢C?w@s7M 5inQmz9"b֜޳2hnW Mxb1Ş*f>1 ϳA9{,c{m呚E4W;/XyIM;ͱ[L7X`uW1ɡ Q3 ggr1GhTM63'2 oT޴a -|<<7qXZoo].1@Y"^hTcXW*N@ -2Sfʻp!tau(/'PbqGtZy?o\'S{ԪjC{2X:dVԪ aho53 8_̣=KgYΗk;,]~A?܊/|\B].] e_Ǯ+#gDo-诳T_ t-4!=@K!󈳏&]Q{(Jh"7r$OC]e.1ԇXu^㎄cjuP/R\NQ6K4 C{;ioljoL:lʹãpK啳A)XcF)L E, B::Gw1R}@ƣBM׉6~OVu.@_unqqUHr0,6*YlvшT8M ?8.\ 9CD+a%ﲱ[_aR_~nF)Z\±vPGBE{.f@v׃뎦5PJ#XCU?ytѠA=p)؉%i U0k`NQ:(kC{-6&̒¬8._t'R4x6lTUND7J8W,p-d-Mg|䦋uI#/{guٗ4DS ʝ~S.2m͑kWAβIMinrEZh?>zk3A4Q 譤/zc{UzKtWxS~R\huOǝݷ M:]Vli./0~/VX-.r75v7g ^uZ -8EC+<@KU!X,Y'] Ĺ]1vw*S{xE/6c5uȦ09~ޞͩ95ݟXj>/4*^2_>HЖ?C-/AeȽ.z'l})yX7C -$÷W1-R:`SQٽQ:ORt7=@)PL`ꞌ\R=T(̅"Ij'hY/j ]hURz+NЖg^,[$Xt1s;,>I]ǧl1X!Ws 7+[O9?Un -ǭ*zj8k2շcyQՎQ΢x#ԬNy8 -)ā'575eI]He|>.}fA [`ApU)I,Fm=(|;&Y̶@'A6[A뎸Dd9ATdui@SZI9t{.Vu!=lN'gs*Ya8tm{hMB%b&i0Yڿhp95647{^,DRDqBGsbV%olH3`+bo ~ZpY{x74k/r~)=S`ʫAi%)lLXǏ?}saKpw =/ӮlNQ>KÚcP^+͌!;Z +XNrt͵Dܑd.Cgɀ)]vBS5}1'q'$Vߚ+;Mck]c'coqy>-\ґ̚qƒyV¨Ƌ8PMs*P8CNf_kKG 9>P뒢+]s5]T mn-OJ&+tIԃ? G$b3kX.hz({Wmǚ0a!! tyO*>Y'[}Ц]-moNumMa 5ѴkU>:vT VB0̹x($D˸x]GpɜxM?txhs= -V.qAA;A~`Vw G,$= S?E#; *Nj ո.}v)r3I*ZJ-& XHEbOQ}]PYMG9IBѠ4MM "qȄ)ϺD ^R_a=OZh`cBEPVHl -:}}cg&485 TkhpBGqW[hm< -5PV QlSdsK{{:)!^&fZ>c\q -h>/*9YB,$8= x=ЬxjBQ[l5:סjG_{,nnRfֲ>ő`b,B`hBU;̩H(:U^-PY{`k5ѽR}Q~U~#&e#6?[ g}1l, uo/e,#+R{RBFcI*I׹Ai1F=_Hdiw>G w?KkN2{+ |>..OvoEygf1Ps'mTQѦrVYײՇ2+wѱN`QahOʓMj;ouT[p_w>SҸT:ۇjY5p@}|>.-:m ]m z<.i{֓bQLw :bNפ?&J綫R**g4fFpX-w] -[Цl71~̩>ga,Pߵ9]a^k:Ϻda84՗3]JՈ!l rIKV W>~{@n.g}Q'un-`]mSN)bz3Au~JGZϦUI ,.~ˣ;KgalCwh7zS}WlY$Dˈk/*uѝ2L 嵦J6IebOɪXj},KB]\st>fKUzH X⸩xM`ZcA] o),OEt\ D95H -OCޙe4)]^q8V(}F__9~ CZ.]GpvcN;c__ssގ64AFR9nCTmp9#h4T >|}(gDPRg%ɜڣ|f+g'CoC:ֆꈣ/>Ү|h"N H NIR{#{>+,5.o{qh) -ta޶(2A#RR&}Qu >歉;U߃6L⎧r+.D pHdQ{]cR;?뒌0 ȧuu,?|pLz͉OH|o֭c^gQ{ɒ[YM&(l -BC5]B}ǧtгkfpQh پD9o(*}9#Lky#Y0Y.-U14-8^V6wl.̝?wNw8kmٟ[`cd军 so8,V%BƱX֤!#0u)pG ^G֐è-T 8n'kn߇ zwRbLc/kA|]cxHbΈd&mu.y{Ȭ8%9uzL 4nLӦowh?yH&eZ{2;b}z`GYl>twg_ y 6{@{d^~H_G* c[};+&:(剼4K{qMtua r-PgXs78S}XĤFl{HKHgIB^DDq̩S{TQI4ixlʻ_%jY;7(oOjB.Ṩ*Y:[jKڢUѤn}$I} cƱ7TxdBVWX1ɴqL.D]~WIҐYڧFyh -XkQuuĹ zpiq4x}r.kԗhp' sPwAVڎ~7swĪ14Ytxu"UQˣA{3FvCӬIijzq㜮 % -M;̩洳zi/k@bv|<.p܄NT^ZyQG4ߢ%VW֚/Ǡ0ǡ)| o90?z|u ‡ni&E~eׄa_%mMlMod9BL -Ͽ=S{Ҡ(Ry΁T^Q-V@??P{e klzk/ګf4G9cpMR6ڵzyջD93S# 8݋Xf'qCftdc3MB| -QP1֨@vG(ZL -쟡2lc.px\@樭Ťڋf"@ -dp<ЖvJ'Ěe8ԃ>,:3[6[tsE|_YMf Y߰`Ӡ{N<Nۭ?S}Q9ՏBlye6{>S2Ѩ}<<ܓD. ˣI+ U-XL UW '?SLyf2|(/&$+ ?> ܉; -.D\1iJK8x^5eQɉIU/*ji -[!+lEWa׏N?67mR[}N7WKiQ}1刧jJ2VݢGYpOP>a@g8x-@gǝ-TU^.1=1w.ˢހ?r|V4kiNPVmn8!I6 `4xYUFtP A2ܖ \NGa$Gg8,=oW{)XCkR;Hk?AI^ZhPa^z.2}QH_}EXVIM[ _0ˠ47зc&+*",I6= *hLƌd -*1K 6an;d>Xno PcJ"bCcCc4f-C'1"CƠ.c-n z-??f:pf_C0uKR_a4$iUpSF-KpLV"䅿} ?>5f}*3vP,FgjLȱ#F=[6QP16fk!TӸJǠ1,h -CcUۑƟ1dx:#2s1_[eF׫'RQ'`&3{M95܍.v$⾬VBjDBD21R֣Q_,""[;7_#k&|>uoyFÐO&{/5f[aa@}0d/mZ_sMR 6|$՞ES -:ꋈ׈"dE{,TiuҖkP0' D߿h kN1IbUeZXe9>8m q&%'L첫,ݺ -_,Y>_,d-V{=֖{&3P. 7*E)7NYɇP:zMu5a(m `Y15B(ߥ3 ",QYkr`X1DSҕ{]!$ t_tyӈY3n+= z_\hfV+%WB"g,m)x x˙,1+CUHX[%}a^%w}˹Sjf}"^.S,,g^Jո5o_И<~x|ݒE׿5:^-̈́|ޥ39J~~n܏Cettq*3y@+%3۾l>vi ?3,Xhb"T) dR$U+L,160_9c -S;FmòG%u Kq+ ߧ)Hy?Kd˝lR_"!ӿ5(Jk]'0l,̀ -IMC1&REgSu nJ!h: -(R0nMAT^to( /<2ґf;Y< δs lTRL!OpIf[|ΰ. (z£\[gF=/°ƼDKKإq j8# O-:T;uƸ!jL 1MjY P#aL j{k|tJmᢌNxoSmO51햘TFkҖ&I -B&uR[ĥG`O(K)bΛe@vr6*^L*NtSF+RT߰}{AgDUD(п SwaMQXimQ^id"!h -;Q5}2t 3BT‚/ĭ-|N[/tkJDFAz__CCd$#pI]3u):֬֗%w$F<&+F"i:j7T+>BHp_eoeF/`a?]fhc($eSiiBYca.T&&:uVԄP=:vF]{gg|ӈӥ\[eFRʴdFm\@R+YkTͅ^Py4~Q̓] ]pSxf#A ,4irLq`USQqSjլ_TP"D[iSq ^3h֘*5ưRmYcj*CK e%"tr.R;*̹O*c Hy2DbQ$50ދq _*;VR{B-w6/CCL2MkHP/ZCcdd^A{ -N]yDY6Lk[M,~U.=W'w4,L:vk\DbT #0j+QάЙl fO !U *3E}ZgX .~>0akE kc9nθ{M (MGېii -￯!&4qܚsG,EA0ەm'I`̘afN$]' S2:gdkAHVFgWtrp'ty =*ΰ:Ӭ3VB (w#ϣw/((& -y=6]P60Y -SFT!NE!}8B?p^}БehB}9G$jl+zE_v̲b=h}Z_TKyfF~gֵj|]el~bzlpc_v!H]-{NVg0b%7hcե՜U<#Mx~KQe=Bx;|@&\2—4RLN_C+{;8)WUGs9&:Fv!;[[FZN[Ifܙ.n^pY\\շh <uq DcS,"Ci] VbuSLs9]O[WRe\26"0أs%nu -J .̗9-j!:GRb_El0iA[ֺs f+KA}-qGČaL7"?S4:T9Dlſk~))`Lj]Y֕xw!<XshvkX?R拉b\t/gDvb[wM: e -k$qRnG,䘤U rjuu֑r -L(1xQAe܏AT+3ni7nBB嬺Ts~`Lf@媩9bR36UdW \)dǘ$MZ ttZh Yڲ5"38|%TH^Oணj`!d.ziJ\+NKW/†+f鷵 ЖlBsgrqxqT/ϩjrjPY[\BPNDOQk}6y|^pz [ڒW!8jK,QYüT٧<ʲU SZ<.U_5FdSC[*xO| lD-RtU3_0 Ka/ -nPCܳ#2'۬u3qס1#"Ga[vSME"Id̀O/RUvE8z0)B>\9òuڲy,Ub./) +cQ3>%zpfZ[QTqoRO~B"iNpN} 2RTf'`&jR#TE]C|ВvEW 4*VCIP -!vОgg'pEIZ.u'eZYD'A#{e17ɞ'&2,ICQڢR%?֗mݩ01a)kɼn2(߳Fs1laz[cznx;m(eBDTx6MGQĢh2a\n7L͐E}n0nGPg.vTjh:p("RL e6L %&`ևtЙ)3'¬|ukc[}.h_b4ʴ*K艿n`YPi^j8zuf3-uFh,3j_3Qe03@`>>a:èXkjfc.UvpN,aplw8BT@ -Y׷3-4gҴPB$" Ci(TUKL֙]B,!rGC=l6qL#A_<םi325,bS~FPcNXz_TcV6N9u,4ވ_͊ףdLSt{p2edp`)CD1PnwUc<#25fɋjBaFD]VlPNl0 -3ld"2mmSW9FUci$(}N.v˩Mx;kqKC^2&FJ0P^Za&y KMӼ1m$teIn>jIe?> TD;zm8M=܄{RzeXY++1_2;VY+yXWvʐOta)j*O$ɋUlݷ6]T)r+8nMt0 =kq -ߧĔLUivJCj{1>KQGn>J˒bV鋚춰#@e!J,wfup:9YkQXk YY(L5 fq>Ka Tӕu:Gh̴ƘgTi ȡ1=RFQa/9sJ3DZ;jS0,?YK,!bM ;aq˛k5]-A Ӥ&yLU^_C؆A[2mǷ%kf)RTof#\\{\Fèv S`C-$YN9R50.1nձR3U[-}^͵/=d`ݗS/?1>6/D #`HݺJ`C@ܙ`攔*ٽ -?*y!ԗcD.ne_$hk1HLSo({'-z]#- -LrebOҘbiqkG)i< -v(L \B~qJAИn: -\ucTK 4nQ7 E ӨR34Kejt\q ߨ.LX FXˈ^Sf-Hc8wQ ĥ/{I,`tN%Iz9bXG JXmURn\|uBbpQMTICFs J;Bg8p7glFPn ق3B.`4߼9f0k5nTGU -9~LJ/6Kg^&7frδ_tY&]}ƭ<K_"񻺥e`>L5wLwq=:t9|K T81PLCepe{Mۙ*L_4G3]YGx#zX6B tpi|8(A8,u%݋_ljvgJ:Z x*XNe/BT$F^n*MHұOm:7``p*[uM"%H`,)AiJPPCayZas$,yK`XVpeN S%w4g=9Β.;=̱I͝b5@]SLvj5o:[a/ -_:~E5R_d-xÄ&onЖs^VKQi9 VM^i?K_䈱t;T8iF/|-`:ԗ Fnf/m؟37֫*+|_ - -4%tA>,QGTrWꯑjM*ז Cy<\k5&^/ n L32)a ) 2=}Ю׀1<:C]]dNFӾR֯TMzP-A] IM5'pc~\5#9\P‡bM!,AVf2@-R2|Yڲ|Fv^[]>=fEu?S.}aB}@,ͷ*~Qn͡<ԅP42/R2}C%0q${y[n f*J]%K( QG[&VafT5(Kl8q՘eC|Z+Ś(R>L~HR{nUйIEA*'[*h*xyk8yH|ӔT@l7CX:CSt$eKwuz"..Tìm;yˤLv|0']XWgr?]QnK0g,b9\H&9 #3hjgKOTj0zCYGQ"=g -[22$lKYIYwEIxzpJ'IAX-(RXç4* 4&^fLՐ|fX8#)x-W## -]ҕbk&݁o5_gs+ˎ)92zhKꢪ%+&ψ,n64u݋q+K/A6 -P)eΟ]B}P㮓}gHv:}ڐhS+ib?.e"vꁳԦ=:^G+uN8x%?#*ǩ/M:fi/3b.g6êۨ7֗d}@}E2pA<^.˚UfD}6<|aIm1nu>F'R]f_))nYhJ$=_Cx\{p.( -qC4hL6jStMI/5uUiaP? -gU&ˁ #VK6GʸWs&EznBOG2I\1A,)-٘.xSrՓl[/|ܥJ<JAջ49kfEHNuwC i2x 2N[B97bY(`ZF6n4@S]{ *p14ku>Kkrj\inS,Pkb3x*fZ(ً6<ɝ!hq -H@}CWna]NqLjWTݽkw* ?&w|ٖ]D_@u[o41fL/E1+ - J-MۃΩ^YȢ*tA/ᵙO;Y*ìbʸuvmFmŕDէTMPaAơ|!3mq!%CqQUXʾHwA0 d$ p+R - X]-#aB]|(wZݗ_tE%Q) -i+ -BWd.( Bv Ͱ&zgFiËYxt(;EQUMuq]vkMO_\0lɾ l%ّs-Vjs+P&_ȟן%mn3r:3{F,_ME 55Jsbn ;(M܄ڜ&N%]g;)45N%V', -cGX/fKWJ qYJ"FPievٽ[JQkjli1;\${3qiLf*jv.δ=W Yяw"kXa[f>E}I?1xA;HoG{ַ!ltؽ0җLU6#'uɬؓ[j@-)Tvf a}^BWw%U`YRAeqsV8Pb5Pi`R(Oô4lGLEa&]Eeq?Z54r ;ڄһ{!my*7Fcr$ `NC5]5Vq ^Җ bmWP튄 /ԘRº,ߔf]KHjk<:B_) t|\gf,)l ΢"`hh Q1; 1Yúh5F -Sg!$3s|2h2Y:Sk*#3\ b.[Aխ1&X&<Oe&{)̘l) c*[|6UHʥ{!Jǥ/JRuk0%ڂR]m!#5_[˃i/l b?(n Q>┇y.2B$pr(.#.fji]1]) m>i_WHiZQz$91'6,dGo`wI.n't%BKOZ'>e )Xڬ'.Iv /*)M"3ʽ!Rz?_eG2MHY@}W+|5" ;.hbVet]h8 S *^CceH2#$5 ֛:֩/Sfa2 2v_'C_B[0.d&r>kgVoz J2ݪ͸bpD^ڭ75.H:.B{җn#ЧCaxd`_s*u4zi s+B&s^-SbcLUf0[N7#ToR\ID_׽~䯪)Y\yLY,\O>w2ϥ8'"V4$B $kѐGI$qɁ^!z^1FUQhr9`,-X.*hY]kb80?'qY8~kxJk~#t_ۡ̽r Em/L³%$tEZ)(3K^)ÜǵPnO//[qc34&zw%w lݏvs|-n")M?f?8q'<$_wtU ^̆J~yЂI5 1kGsP1-UO_N/֫*޵Kox'pCErj%pmtl&+ƩFviz|oDG7!N/ղ9٩Bx:9m~oO4V+2ٛ9‑|'~Cy8>}n)Z>]灰1/iXD<{s~#hn}rë6rBe?O\p:۸Ӈ˜!{省ë^~6w˯#(^YüϮ;\A<;7V|:^ 2U -'A;%y(MfI$:Qbht?7xtx CBtG ޜço+g~2}FKS[ԑxzh0&]H/c͍31~8 t-&y}njOrۙ۶,ӻ~Ŵ)>[;9Zr2]u\Iv~E?=gʖx+÷B{<ܯR ""Uh8YgV>Ǵ yz J^ǛO24^i&m)]ϳg8kqKns?\(.Ǒ|,(I?d/ ṯJڼf?\il_cEV{S2)4>$ks]e`Ztd^b6IOٶk.-1BS6&`.#zٙxtΰmV'`%;pKZ7^HSxLu -&#=h(,x#tÛ~z~A㺪dCr{0[E -2=q~wM?k-pI͒H?G+=',?Ӭ4,m^o)$*…k x|~|һӏX7}j$,.%͟W^å[x/ TY64BEHD# -UV}^Β=!%$lG g4#G2j3]J$Bڤ*9Ғa5])ضcdFm= {y彤'i !!pї{:g6gVyp^8!"7- sJYxWgK1kdjC/M  -lR[_=T\@ds`'vW "(!:Dn'QDNWm[;1(ro׈)R6-.=sK4["_rHs9V"wmx^]l,YoL дQSDK Y# r=D>ݴWRTXKoIq4=Tr/oƳ{M<ͤopV/@LyyĮL H-%}4N^}yF5c&V/$.5Xܬ+C]ĨugA˖8J# 1n֧`[*XUzKaT\ -^S,s#φjq%mjDnŧS\is<qA!7y6{O5]q'p0 䍔u=N@Y޾A*Jqk{6K7AZcki/!,-}+GgkÏƙY7?,_2iZ>6@\-I"&0YByy?lzSKmvi^ƈ WRBSЛEqz)[es$"o^Hdzo]Qu"[`2x9jVCofE|,o2jyVwD首䨐Wy8׀iÜRܸuK[Z-_>:ܺN.K%ߪ;p2qݻܸ0֬""9.+dv1Uf| ^Gsv Q_luo},9ϩ i{mcEKf0gw/1uub#Qe4Ļܝg'E$tTvY,%Wj-3AL($1Hh;{( yC9;F߷ K Iܞ}/jׅ' lJQFގ!$޺:6vF[,*ۚ]Uկ[x&+{Hd2y>2kj!nAL0ŵY,o\򥢓hگlgHn]}lis\򉮾đJq5%engvmé!B o$xY`9vc`8(-5.YBh@aưsb5\U#~S._}?RH`8F.^.{ͱ!z( a%Q.E `(.K3JN{M+AE50'-eTn8*mY - (lBY:v;ۦE6aMiӈKO~#UՇnux0yKː;a!\;/g^m:5~u"2N (t^|ef>>Wh0ɅGpXeI0ĬEnr|'orlt(5WX '&o ܯSwMi*{i/7K Gx7\440:b#:RWl)b~K.W6C;LD}<FmH%iV4x5ZњN׮~x A^WGU#LJYqΪPz@\k"O7. SIK; 'a]Qrxz]vc<$@:r]jQ[y-E 155b]EeDq6W6&28u)JCCY -p ߎCPԙ$x8zڱ]Q/FLI1XgwbkJiE?İ͓ٮ)%D$.KHbio<~ĤѳO$Vr)1@ -]|w;xlXfaf4yJ'0* :%meIz,v+o -^>p؊jFL&COa}w |aY=yOFzm[]>%^WD,gggs/}rjdTWjQ9 ph#MbSYם۽)#ja]:Sղ8!k~XVql5` -EAN&،tx Sʒ<[$p,tjaySTeQeKg٦TbL'N4#+ 7)$}|X8R'TTSZqSu*v)}jg?j=eⶸz.clc{٪>2XZf&ݎǟDu ゎѬ\:KvbܥW 9N|euN.2/ 9[KK#(z%eWmDEV+ -+ʡ/j6g.r%JSoXҩ>}˽Lv/-ej1eLmt;AD߶_yUYS=DҙzўUy):d/TѴYM -`?PX>D 5H8bc )(FS*M^*(U374?S(H5GyjVjV)ǷN@wu˙/'!a{ʎb)>y"N 0Iꬺդt5nc/}Dک]E+Co -SAܼ -".-L#r@憡Ħۮ5$^Vki@ &sȿ_ˊ7(0"Gb|kXnQoDĄTj#efCQV!E/ U+XT5B,Bdn |3[ҷ"oVr|kXUDl<ٛ5YD>A yN~v>Jb#A,1$TC[uN1y]o -jo+ W?&\wqM;]yʈIe)s<% } -?Q`QGi]9(3s?&[`^z Żna{~{9 G6š=Ĝ߆UfLnT CmSoM -9lh.,' !;w<k@T'ʼnYe)T 8rMqbw'Z^_^]Xy!ŷFpvia+F̧*W>LhrtАxE[Z-3S&r$@ϴp)Vb,[o -3REd=]ؿ8%o#Bl'Gyj#dS牖7ynxDҩPk`rU^$!cDz+ozˢ$Lp5o[u ~d> J1K+$_ -2-ŷV YFZLMP`nnA)&^^m;8 -MfvYV[,g}qE֩@ri2[Hz$)8mn[ڮn%sl(`H&D(O$.mSo -9axVTz3]֘]#vN#5N.,cKOZ((Ƃ@Xի;,-/ ԟ2|SpuZ0V=,傼My{= ^9͟9gvwJNvjR:HV0!ǷF aFo{J}_as \/I?n<˅Z&ch !<9qrdQ>d} -9**k5vvd)x67^vv&vS>VhV9;_Wy@AQ ,CMP re+,v5јfbQIa"U}5Z-͂rwWz$$vfqKO! H alxkO۹*.*+b?vy.jbS)os8Wԕw'yĜ]u} -(;UUCZ֬ǐҶ縥&b5G2Dx%uj[R5,'S:[B,{Q!h RFn yQ!r$kTUӇ) y=!HTlD~E!+6tK=\U|I;jgAuF(@עJju݋`Oh֣]Pe[ Q{M`w7Bm—2,"{XyYbuỦB -<5泲$֦>PHd6C`;V|I-ŷ~pxtwF("K+l\,o d̞y.{E:d@UR*мUWbJ _XAk4c(5G_㣍ӘVxJHt~n<]? >4do)u-d{ UFnƱKv1αw"FplPq:YD$Mvh:AZ 128@~oh%X&+[b;)2-o 9g0XF);(zi]yUM<^ss!Gkq;[S*E]`OYCnh)pϖ˶RT77@D;SVt$M quL6]ݻ:iq\F. iq՛Dˌf[0E}YW.Q;_t MdymRqPs n1.d3-;;c,}&ܪ}'*P)jz\Q~C ,#=V;aoM~Hu!?!TXZ]]=gVNxK}7O SB&Fȏ'CiLt`. ML/ɥb|]@@/<$E#b^Nq+Zl닲k'f|Y9JG`,,֤KsQHΚm& -yI+lՆL zٽPf_‹SDϨ^z9R{|^n6(6à-UG[iI _2 C 5R'!cWJߝAX6)pdx_ *zfA{L~!wٮ9ɿeScKJV0]TI*,~풷_Y:I]hK-%r!aC)\*ʈrƠNyXr7@qF7zT/,tBuq@rʫzƦ+[& \B4h؞xCuvC{F@48!V Z7~[+͂9rԡU/8ېjUII"J .X,@~<إ@qgE-t#XH -%|ac+Bcp -CT0cIIXeM1"HLe!]8\Ek@#R\k2YaV]b|%YhahI45]<ʛS$I[0 -Z% ([RY(pgcL7ix a1Ρ30?JZ-o(%䆇 MĚU{ -d)-~cЎ$V -æLR`d_)xUY8;&KU) [ix;, -YrSs7yŠD>E4J/YlR|YhMPA _DoxkRV :;^BYG`s"W5+S'iL wƖzAt?ʳHjC7Gʲ—T@MoýJ^!%6C^^ryfyG&-#F,`2nsj6FHő#4u-/j(B !n n &HQ,OV,W -\K-ݶX2» _YC%y4 5KD<n -`|®mVf%nawX6`t1+ɂP8tHA_^\Ej)[ev@`5+вHөeP$*l5$ܼ |DF%r ̪-9,41Bz' (qfd$sWӼ -P/R y*[ݘ6iV}9HI9r?(~H$qbh$o;>Iޮ x8EAm=L$M]ه[/ m:gLUEYX(Q9\WfVC9 /9hI:h x;^ xQT{O%Yo,4*(REP#҈JSʷC>57qΘ6;uim*Ɩㅌ1ezٻKʊbALkbC Xڊu/i^vQd pcJGySwM(7w.4SqKc9|SRѪL, -\{+E o~6X`G1͸.XzoYǖRL9_YL9!ww΃/as8Ѳ/%ޒشص<+&5w9o:,tzU9_9uN^J'p1Z}:l܄Cޙ!mOuIThU@AKvhʶچϟP!PJOJsYz'%^[pL}f^L"v'ѶLkY@y/)x8(nw9-4Wq/{aM9Kh{soݐay$›P(,j+m=q6ir|\Pa֛#ޤЭ;5,F/Em7y¾-Zx -/][_SAm4ñtoKS-Wȏl+M-,>N: %nMOsd.Ѷ%G˖xcaYޑrh: g vyAB##zt4exh)g\aL!^bYw.&=!:E:=RX|xB}+B=2&KqمڭX\[ϙENA"dwt> 9}<)WR0.N.Zfo];CGnnN84}h3r#z70JNtp #S6T8J͔[/!/T<* -wn9?GlqͷŒo4^tnT^7U^ʾPš;9% ;qd=Eu L[L[vuX#ȜCywF[m}iF>Q/17Be I}X-[my𛙄>MqLoa͇ G |ڼzc;3e޼ݻ5 +yYnhYgpOJ܀e VvّT9fp֡ͥ;&i%0毂6\B|`5qWg' >VmunaW@^s&O<V6Hw<}n 7lo!0ȕu -}vx#r2}54KZs3iޥ`@wl:ީlp#s{O&L`O)b}~2ʡ#yn6ƏuRmv,W8}G2JFWu탔H-Qhmc0Mq ~@1Pfk#de^WߒW2e9fP0QmK?dݲLi >V):,2^R|!`v[%n%癫ӏ>j>W&_3KF\v;k1_dضnG#VNX|`3ĭۙK{񕀡WuH .ƞJlvr;QbΤ>]:ֽov_Gv3i\֋UqR|%`9vEKZ:e1:,{TdPD.Z6Oy1ȡr.;g_b-9Tp$%u"8*2^y:~hRUA8SnѰC?89fV1C Б:lيMkDuu=H )rA}w4rB!0uō&͛40 -pP#CS"ϪyhXOlSYKefdogk!?w☱ _*\&6ko+;=m,1.Lz{IPZs=3+)6pu9":y:z| -񍁡$jr1նaGhDj[Nedb |nb<D.XA'2(K[>BPq)[[um6hS0Cp/1vHp=A Tjl^`yDʿU |a_ִq5j̩68oW' -iA)[1GV[{տ/r$]] 9B^ {[]AC \uOy!pI_fU'h6.nNO[# -~j.Ece j N'Љ<"(I|@]ҷa Uw*~{j0<7i0yt9ɳܫVu;zŒN'd]L%N=?G`fCeId1uEvG' *\f%a!@f W s[=#8-FUK3V'ԕcs;Y PWM[ZsohbD łA`ez#mUs(Z1bd`N9oìTU $%]1 6rO+ "(U1A&Q."3笾ӂaz-eͅ]ԩ  mV ?@CU+,+:ͫ>&R~i)UT^M`Ns@o'n˒5})ф`i&MUHvUa*+\I -wݏ934+zJ=}BlLMI}+b Ⱦ<}$*yBxξijo#';'^|=,aL BR+5pҠșٙ6d°[ 'SK2'sۓ/1"p4|_Ԇ,#o?=ltHc|3> GVnkO,f*\;N'(.*?&\=MǵgmβD5fif Fg_)ӟZ"zzwqӷo桥vaan3jp$FRAޅ>FqLD-4iSɬ?g͟Ǥrh~:s;3]-"tO>k5܋4Ϛ5oeٴ]Csld/̦6.aPX=y1/9!# j$tPobe9]gT9B=a˚J:.fA%9mQ߂۵qawSzI})WHY -Z)DPBOT|̿lOoVBb Evn{A cV_꠱M0۬lB36w `S]u9wkuJ - _(_c=]Yۖ/ Y!"^ᭋ*vKY6yz釺.~[2vCW3ܜ(Oӷb"wabWڌ7F MpS\'0۷Gei*W+:B#?/]V]*Ceq;D[U^oW2Oup,}x$;}$ǤBej -!:tGD@F'Y۫~̞~ۚf٨qܷ|3`Ss&Pz.R5wuѠ|6,84:gYL`{Mӯ^iϘ韐SX,/1o5CIZbI!kHbeuDN$ixS eNH92'Q|F!MY}>_G10{ri`&6/UWCG)t>^R4FBj`֡6/ԷjP`7ghfmcAG؟"7mE*6Ǥgm'm<!i^XqZd.2ԻKklOwK4>gHcs['?Jh0'rőMrsX>"h68E6zmגDV}"9tջgدa0 ;%=osX3])3O]v(Ofaj 7?Q5^0M'4rʀCk(PwPuF}zXϕ/)eq'T&n!] -=I})uJ:茵D]] >e6<N9Y:$C 8[o7U􈸙?8jfוBcri[,m`s\.jq;㢞8*"S63Agd0Zd"Q-=eKfзi'uGȥ+A\){⽌R!mUǸoh@>tUtUK\tOB*s>2Jŋi8̞R[C=rXdɃXuEЁIs8 /P_iXkw$Bu]<ˉIH?JՏK-s]Z(+SJ{s`bE P'c=G&·iX@4$\e-ݳw!s48tN$xD2:@ -hz@l!PYo t^xqâ>2T12StH+(WCPAc|y3m\.45|smSF8 Y4q5^8ҕ)v@[yx6=!xIYu.uw鰦@9jJ*JVdG3J(2m!JeH"T -s$?duRU=#`g˜s*e.G(B2UViMi3k:3.ke3By(K,3vVy U@qh[/[{5㊲$2 Zio9v{"#k[ET}zQ5G0T+yf?_Ex󾲒hɡ!/?mm5]Lˢ?l]zl3#mϼ#^_۳{mϲz6؟t(ߧţQS-|(`sܞ޶A;.nH̏϶=k;%hwfֆY_Yvg#}|kK??؛}n ۍ= {i]š5@&QC K ȀrŒ0=?glGJZq\ n7DZn34GpO#,Bf_E<?lRM;}#.C#ub56C!/&Vbg-"5ش.LU]\+͍/4Cs\3 F~J-f|KMWUpL+Qܝ91 lb 60mod^ 8~vx@)"w%fhVy> MfLBxC#(a8R1.C.$Y;wGgThfSɩOY)0ê)ϷY^"u%@rglcx:iw-Eb (ɀ$5t>S ;Iytb?!Aޓ6Wt45!P؝RZL, Wt1 dUϓi<=4"?zAx\!|!Ο4v-+sPpD끹$I i3"ȴ=_$Ss&06Oq`% 4]Ѭ17s$BC ZzML+"| ʋe]=c{ށTD˪?@헭J з F/wɂՕ=Fp?^댢lF)UvQg3̐ -n:HF5? 1S] =9ǽu%J kx PT_Ɏi+Y -eC0 bg r΢ėaIX07Z6)g˹Y, 7r;';H q鐞=if0tA$#>")R"mt!SWGIcz7f+78"^3D468sVؽcͰ F~CtX'tEɫv,_/|wqoLz!Q(DDɬuُP <$.x:'?GD3=־BՓDZ+`UjdXx@y jY)? n(oSryBܶCl^o VhZ삟P+6F᝜Ú?q)wGhpL^8$r9~ϤJ~퐥:A,boONnPv PYiX.FzQs'0HмS4嵵D9Qm$6 OCLN6G3c2VG`ÃgD/R;(mJbfQn"}*Eô *sW&{2b$njE,Ky-'Au3 L?A:Anc!t#ۍ;IL4(_Su.ɷtBeS - \H8W{^*nR~++;cNOEd"ڪ(θ{ХPgmJ}ڟĴ*:;~P‥]CM.*jz&jSkfhtWf琴s} 64=.bg* -SR֒ضD>۴.K}-wԂOJ,`i0!XXK%XKZq>άrt:߸|{;&cb -ɕQ~\)fE^Kc)Y(\T+I>;YU-ֲM?.>Z -2ZjiXMIzWTP$P -ۖSG['βVF r>O9'ml -([DVCd`,k-O)$׉$1[ᛍZ?ڹlsbyW-~yħ|6R@|R }Gd3|X>"+KYI6Ze8DrǕ?" @ZJ V?fmnd/~2V@sS~WFyBR`bIb)Kܲ[ŸQ.xX<0W%;!p!ot"2 3>G,h6Vj)WӸ(F0lV&pN fW])_e-'O:b3)Ɋ: ¹mSg) P~fZr2%S>ɟ̊f I;F -xYN*CT 0kZ]|s$12y}kI41*me!qa6?3c))á3E4^$.*i-Er'v*_Z%9 -#ح`~bpq~IP)eY%@JdOgh%&jεȆ#)R"|J?VW!d`47wԓaj5hhٯP*1¡'iS=+Khv1~;>91XeL@ic[H'يȤoV3 -Any§D_6҇3O 徠)TU8x -1WVb$;O4ԪH&G8PT#;;_2``xa(M57LSe{.rlhCG`00>j6.kC0SZm;ψ~3=gNp> lҾuXz86a,6ݍXg_7z YOEhoE vdF3 /`+Gi.#dNaQ5U%G #.1 -Ez s̿]vK+~9 3 ,?USq*l{Yg~33 ح-5qC kjv[Fp #U$!&2V'Ġ(ێt{0<@b$X_Qmd@debN0@?0ޕG^=g1'VM 'd˿z~`gX-`DlnNm{d9 C2fzz7sF3gNp=B\xnbp|]VRFs$ad>7O! sny5:bz~ 7ag8D f\9 3 C'ij١ >smm_9EQ3^)#-=SO-" ڕcXgN v;w닊Gp=bQUS"Q5|˜vcfEL#>E=HYVRt:6bQ:v?ۃ_PѳJ {^#mۘm`HznMp,*,EO_Xt%& 0}!&M? Us^g3ɓ\csCZV܍f*gyT'7>+h#sLVUs ^\ bYSd=(Ba/[lv$*F0Jlax@IMNY\SWSيEe-iMg0 -m8B=X1e.I8Pc"ثLv% w {C> iWX'qYv YfP}V if+E`nt'"qHԎAs| EOЌ )C_%bgNCJY"!e>Re3k95&Nr\% bB@ -2@Uѫ:*iIt^ 9>|M>Q?MMx~COd+,Teq:j&6@&zvV9M~?q (,(QgTH' lI_p@Ԯu _xF#;MJm -*]>VdAO*CFmÈu\``# -&CoF6~|3zz&`m+L{XgU@ڧYtP@,nh&?:baxW 9 4em`sOO&'0b̙~O{A޸Hd&z%趦UQc`0KߏΓ+z*~2M)+Α0>zY/S;H-tlmu2pYOV:LI9m#R9G3 Sڲ(n'GhQzٓ'e.Oz\Џ(V>- G c}>9y3y.N-ב[#@m~UOYhW8i#r3K"k@O͈ucr4LW Iȡ'ߍXf&;p5nuF\  nGfIDy=f'w f^9w@-y0Onwn&f蓖'X+cS=]|"%^'y;>~F;=>l 3ce.d N3#GGg]L0q_~"BDRA_+ȷQQ"M E[O1]z 3o= -QDbn=q v?;Lp33mAaYL=-Kf3;LW1wy?=&xތ`+oMR:2lXfܱ/iC*FO-㛳yqD cOk6ٔ$L {m=?:dQr%7e ^ȓȮ/@x_4;T,gBSqvFJ>M"M -܂f=33C[~wӵ" -!"~~4f ĉD1S=@xkGؤ>g%M'&GN=i-opFw`T=#{cyFkGo7 Gcw|s̙_*t [|X8N]zB -= E6r~\Gl3S>u -A][s\G,~xP9(~) ̻䔁"TpI %nmTgn#FЩ:`Bla>Xfq~P= Qm X'6pBr>#ﶅM#42shZ[@ ⅷ(5@]&ѧ~P!;a<3;LǮLS=u@ -d4EmSXSi\&|S#d -a"0cw6T=u{~C>Xf D̜#誣>5 #UO@z\""rf85':DT4D5®w(_?hQYq7hescP!'&vDĨ>C0zRn)'0~Qg`g 8'7 G *Q.45MH;/9K΍mfy~NJ}m`Ou. G|js/풟3dߪGqsײOr -5#6 - -?0GK~z9@WsC%ֱR֘IFg8ەe z:i*2'(3YC6b`4diŭb$ c$]xF3lCKaU=E!E!.dr53LKb,z z6b(m9tT%#Lh, & fc&zcV I6lq!tCC8h+@V5M6=z l0i3ճE m:Zv,'2 m*/f& :1#ڵYFf~EpNKH4[cti\`an3o(b5W Ke hmEfᩖkE1o~~lٷbw{)o9#ǙҙH_@!] -ITo|hC}1/1U[.vYȬDC8yy8?!k(M'B@Qfk-5Φkʇ-c,|/D}ṵ~Cqh:FG"Dxΰ,+A5 -T]WE x`M_7HB}aa+ɣ]ڃہ}oi.bU?&̲o%`T2KI`PCV0J=A0;J&Gu4%B ~T%K-2)tt[SWE=Acg6HřRRCo|5wI^U'c )(˘wy(cAgL%3IXGA'ѥÿ'G!qyn8UeOl=YGik5$̂MÎ8Mxl5cw9_!{= ژ832]'?LGU4VVwB7fxv|M I٣dŵvI,a5ҙ2G(uI=A,{yQ It8e|n[k|m͐ p3_G)6|{ zpTVI 1xma}0/;0 -LNJ!X^z^c=4;gL+/h/x=+<==)0;z8*klŌd 'IIjϴB4>$2J`ݜ1vfg~O s o2h̡:=•;Ffk͈u%gHu˜4WoYn#ַ. -#`mǟƫo#<?+1:)ޫ(!qAvpNPnsE+0TŊgq?u~=O̊fSTT&(a8 cGe|7=^EG FS}^C' wXnyH?a\=Ҧr2!~v 5:W=ۙG(Ss7M[HdntP:CZ+ߤ\6Q_C#>/_ A̿=Up ,+P){HWr;g3p>Oy( jY'q X9&WAQr`pIl \3;>7[1}7~ ے6& -[{;x|Gs\vG뭹܌O& JU1?fUqsw ί6Ǧ@L/`£3q5gB9%.q_{bF!7{=Vz#(=i Vgb$[,QE3Jz7KԔs/d\lb p󅠽ڃn>sWEoYݕ[xS7zWw5}WGu=00Ƅ`}dN|K9A{m `!,av@7HH Q8вP/[g :CF&sF`JP'fd[[*.dD)2ɖiS5r[OA=)=Yhf -jsE *%Gh^U%0 -{sY@G ;z'|FR$f.%q`2"^l:(<z$?d6rCAؚVB{L4aԁ> a8 8:IpѦ㻉3s?t$7CA4*>ft,I$` ­-XfrƘ#` I &eρ'4/݇ѭ#5B=A8 EڛS-ؚ!K٘ls6xRS! YP<n3Q,͞θv3 -*y-x5_кЇȐF@a߁f Bg<0@e"%Aat < -DC?D }C'У=E~5YEǰ|'+L1:4fQ 9  w$۞WYA{р́bO/DG@BALd6lOg sԳ3&S݋R+?aTp'9ōFY,q26VΒZV{ܝnꍖ?J{pۼT^Ֆ#jzmd 6;bW76 %_<hRҫHj|o`<_i#`SDjr\w F0?HvHNnH>=Xj^ YI0, -Id=0 #_ٵ.D;@Ȏ}n̿amGߣz<__LWt:7 RƲ٘۾&emNŔ9:&g̮CM'2^ESxkNN -Mξh4B1YKc^q`K}zXByH7&kG #*tM8s1' qQ*vV,ȥtCLCH=A,Y h"t -6s鞆mdnW%WN4[JUaXG yq vtʨ}F*T"؇1ɝN:BX~ )o -9;}!^0? &+ ~F}bO-}cFYכֿz,pݪpy$,xm=zgG&O}ky"i#k`Ig%r" cq S<Y?z"eK\4ƔY @-iM x,Șխr0mQݲMY -L  0Y? KQZ(zX; _8Hﬔ77mu{9ޓEp8#(z-ium.''[t3 -n>/GڵjmtxIռ.= دLz@hNnnmĉ0.]w1:lh_;h×LJbu0xY4Vn7wݻk~u\͎7L}/=ar~7j8gYɴ?r?XCn뻳6ݮxcz\rp~+CZ1ǫ-+.UfN[%oh4Y-3)>mU8VoDyKVooimAv`QW¿TwS3y5'tnz]u3>n>_j=7l#w;I\ZU~Ic5GI)44_ -^}6GgwA뢺8jTYi%!jm&Ҩ/?r9:3+IY.U}(rSH-{ԗ]4+xGй7^z<(-ǝ^R90'!+Cd(1 Ɇd86>Ý# RUH2tk,V)'5N;/QOK|'.)]^[bzX,clsA=!2g"-t9p '1+@I,9]!a;by%"(D@Dz{[86 *q,7㮳c?G~ßWc`>ɿoand˘EGO -$$}Tɓ>zS}hzǞS ecفiնATv;83$zL;lHB${c;yۃM9g[xqe^ǻ7gF% no)%VkO:E'T+i.QcwtI!S-H'oA.Rsug - 511/*9=rrKpH&MJ#/]e8B7Ly~P„P9'^6αBF{zjԭ@@ea6zp_lq=:S?ތH#Gٕ?5]q;m6ßVxԎ;qW,wsQtgΟU9( EHa_-_OV[+W -B6Hmō|=RT7WZλzm@2wޝ<ߐ q]\;(d-̣̎ߘW3^)n6D4􇜔Yv&ۀsd~I7ؓ}y±,n6κZbl9wn:`wl~Zo ڳ{wl}w6οVS|yu3_A5YO>ȓӺwDxToϞTVKZci87NIM:;Wt/p>G#e=?&)΀FnKFoBVr|K$fݱ7F%_t1Ph#-o(c@7d*pFfu3aPzgzR;zu)o.  >Wa"SCnrf:h<6_=>> -0wMW Z={:(q8ʩ$AMޔB]I1-wj|5CJpcIܡRS݆Fój%؁0!hU`WPzY 6M|fͱ< l8t g^#O=7 \y_P\"P2+IYwjY\&w.2{dV#*^rq]25Vaک"X4ҭZ0|B%Rnu.DN?"\K\=5ڞzӪJH/eU?{x┦/)'E.hF'μ̜m TYlY-xh7'vJvvF]'j Jv-DCF#''ͥ+?4^9+|r`o,SWt=+_;JX,GϏ>df|T7pM!A{;9_QO1Zaƿ-Ǭy𣖱٪},u ؏l7=٧% 6[=wc!' ߖ.h(Xt_t(,{umճ3ae=~Vm>' A=K|1iՑ!3U6ת}=x8#mJ a&UՋT"-󐵃4IOS -f]sW(UX6VjDQB̌ _BUgXɴmŵeN gwԪ,{jm+ǵ^üٗWd3$d'31NVIf||ښfydeRζgd9_?VjZg^`$/zLpN)Xe4=+yy.œm6c4uwpJ 8d1tQ4;3ܢ{ӊ┢6"+ͻh6f$>ɾxD۫\6>yW6ťgW;b&[ im5/NCb77X#VOфE`ӘricFJ6 %$,R\=alE -_yX-y6u'z7G%a{_U=AAiqgN6!ANs/+v]K̊,@keQ.O)l2Ɵh~e!Xе9j8Gbޭ&= dmf݌XBZ=5x -]={V2 ?.o|N3=a cF%yߘ,(G0`Uއ(GgE.9,j\̞YtTR9kR O|_h;3$fic !EjV}[}QE6)*`&HW9Al޾hג*v; -F2h -iUX<ٝ>8[ގHpD RK_P tH7\.W}1ozR3gw c^r.njVoHtz.h`αA5/_j>c uYɣXL2ϣ|99d{+GP\>ٖ ƅkDω %7i̚m!pQ2ǾL1;2 .%Gb3W b}(n2ɢR2D9-J' kյ@P2ɇtV@ FUܑ`*zoR}j`F2+!T5/Tuf7`|K .ٞ*[%%Io8)oհ6AJ"\>V^x|ug#\mhUUi8Zuw|{'h ٗ aGlբ1:jsd Hz gz\!>zD\f hg&+k~*F)%VYk6|}mA2}ڐc\__"2ݙ۹I[O㿟5:sq]=,4Ul:@d֣9jwRCiwzFiLᔳ?yOl'!n~# Gy$lnղ6o,d׃\r#,հ&wMyFPZVܜ_Ok eUBak?sGj?Z˥_h)ʘX=ڜ1c)-cO{%> -tзf[}ړk|5Yvŵ][]0!`\>aPb]Q7z(ԡ׃ʴiUڵ+f+x*Jv0-g6v?^C +V/Yfj44~ֈ)=_[7{<;ro3:5a=l Cc"<-'4P J?lO>*eZp^у -UӴ琖CuYߛdۛOvє`i5Ftf̶VItɖT7z-1ml -"UvwwiB>F&=:7f!"_# 3xd!1=1_LJ$X"VժAK|ڙj[dϝ&ζ6k߽=[ Wfs V{c]B䳰݊l _iG3az?hWR.*E{*$̩2peINjvKYd%i\Ͼ奆^7մa醇Y=W -I_ V#¬ j={2Jξgo zcκ̷ue:5md_Zb&j7- _Sek`-+@/q` -ͶCfHngh}M)}Nydsg$WO.9LExM?уRn/Ν kN>i_݊Mma%\/~o={.g3 ; ׿DX Ii|m~S80UBAح>?\᭲)7q}1Wt6 0ҭ1!Y+Y5mYdׯ{vWzP-:K%]zuL%TUIY,Ki?d]!Y4b]?AXarfg~j>ГpW޿mKV{ -k$V;go|P0•Tv%}>ꩈ+'UfV{^,xLfwDds7IKzgo8[r^?vRUݹ_S/F"w@Yʤ(!FAO59 ^j^ByWY{|OcUcTqΞ'96cZ:!^j<,B< ke˒IΝn=3BS358_z1cQ&c:D[K |-j} yFp:3px3|RLVG6KD9 鱁YGA@=H}"M Tewexob\|w=D}cz -[OPݐoQyPcy\X^[ş:zy>ˈ#$#j^8xeK^Rwg,phgID>hkLiSwD%'V?onؼ ltIOJ 0*ʀ&Qq -gj>qrC  I/O(}4ÂzpeZJVbH:A\ IuLZ;kvZAUaiW4TD[࡞Xx~B)9 Qz+cN&.o,:հJPX1/-۟EP"DIx9KS$omr*}Dla -zr7mZUq2 - v -"5.Lu3.qV1kĔS4DE\ -,ΪYK֍* K|l|K:1"mJ<]\ٯmO_ܯ|-l$!2\}Sre\ @5wruqB-=lASϲ=O {cZG*Aڟ]qg=#2a S\VzYcX#)w:cUvڹ'6d+ =SAkEO2DC܎Iζs'0g\=VÎ@!ߓ!5usZG=^2U%P^f (}{j{8Ǝ[Peξ?}s|G<{*ܣv%0yVM=ygi=T:HӐ^!qqS8}+?]9PA -7~@;6\S@L¬^cSKu'y!,;l~]0$>AozI!ÜW=i)B?H]vXe]"Ң֎lsGpO$hڢp nʙV,=Ok+Hy%)p5ӫS*K*"6 }TB(X$zHݾuo8򝞾Oo}l=lM+mzm=|bڤxujy/Ιi紧vͯ/?q h9:Gܳma& J#!iڱc -=x?f Vmy>f'^nj$eRaP7wsLLYi0]-¾5$m;B:|+i֓Ppt6tDn$qdG ԫ>A&UW:4rX3ˋ/b?& 9s -&8 = ;(Ϙ 9#airX'&i# B+8<Ҭxߟ}eMVÎVC >jQl6`"CUS@[PL4s}A V cA+вӹȘH~b`u^9ЕMlY_g_~Y?'bk#{ 6UtSGۤA^e@ς.҇)Gbpvqݝ0%hdQm¡,8^JhcR~̔>ೳ,BS3 CZ. F1I=x_#/⬱לjs7TJY3;_$XC[e;t#^Bz I[{ZUX;{8fe"0-\R\"$R-4Bv潶?wcynr p4S]0e,l2DWȃţRzM_99=+%"`zJ*$$+UcڙlߖFBak/)d=lyoz kƢuB#Ի{BkYX[ 53 D>\ zש͞* -i51Ʃ r?a>y~Ȝq0T`ȨP -XJ(e -.}KjC6+BnG  -*[GTOKcy̎_ꍡdz'zֽz+>UpxJ@`xԵ'O!C[00f9R Mɻܾ-Md$,.FqqIk3-vlg֌=9G8PU/n=[RY~KH(;VmH䷾/A.=zo9.=Э' Mz2$W? v󀅗n5>vA1,K zZϽV^JpR S&xUUQZ㤘XV^Y+bAtzј[YW}֎/}Dȉ|g?뇣zTۇDUGc )6dT,Gm4+^4{p*R>Ǟ'r^}NI[F|oW`r]-Ϛ}{c'Gs&Oj\}x_wNM[piꥂAZ5U;\e}tD;Q)=S2tGRt i6DDH[L6cn# zK@аm(/^Io6a@ÀXnP-FNDM,s* ǬUEfO30xRAsC<8Suj2LlxŖ9+ۋ.wu~WkU$ce_`l+ͫIlL3`I} -x=0 -w:Q`IsR9oF[LYUMYe;V~|u4KmSc1옕U/(oߍ B#n9rSkOQOps3Z=rasi)u>&]"T53)r >r$/=YM+LYU5Yj[z=FJe -dA $iN}]UwH%,e#E1JIyhJ,Bչ:v&$._$뜰L{'_/>Og92;-1g< uٹ{rҏos?/l2h:缰ե>9g_|}΋)uH9~!J -UI9Q}  -Gb7+f(ï5ZX|n M ;U1$ݾp7dЋġ\tsS!IS@TdsN}ƲU{#ߖ9:9ަ.,u+2%f)mCY^G>P9 qt o|s$6\FΑ:s||6uB}_|=->-WޏǍmJҮ /jz4AhsSqLem)ÆƅgzF\bI&eXc.o›iV` E1b#?}1OU9&ŠN(Ue3$=z''zђRis+-ejsRgIUHjBUJ׊i>_:Q]u?AE -Hm`2BG`C)@iDQ}\uYYCώ6e3v9|FGXDZ0E7,HJG|@RrS% loh+e@|r(, u:LS0V'}B|](JW܍>X6!ښPo/{aQ/= No!F$Z\4QSr|LSBvo.B*6Rn|bm&8f#U,WfZV !<Q%Ɛ*߯2}ιΕi9\|>+Iy+z뜓l>Bz9Y ۤR%-s]燲]by#QztKt&q5Vj~J)?! FHDY5J醛ι뤫XqysP\#zta緥}ιSD e(z0'"j~jc]"#k9]7_59:A2:)~/suա ^Nٚ8Rh4ͯR낷sug)O*<'|c`L?%?]ι˅2k?l~]@x؉Ni T=ZeJr)Xh/*:Fc;OV J|+p%=e/-)T|*sjgeF?9vATp*|&ZE&C0?Vvm {4EN|,S\c ѩL}2V+ô(~~{sm^б ZS=ѩqc#o  Ek>Oxc82@]-Z5v -&f3py/Fmyϓxӡw§ӓG]Çe]O@##@ 42>uDOcWn'릅:jà Sm/D \q,հe |\$>J><=g]T OI OYG'C"+Oi`7|bmj p~m 6!d|@^-R9Ozm}ϗ48@\+>  'uB(Q(ҪȮ4p07t5 šgoxX:-\G GjD :'y~ -ߴB"H `(cP)1ޡy~'BaB*U.;!56]~p0:FFvYaP0,ɱ,3v6(n /[NmW?u,h<3 =RiB- h؀e'^4t -^u~T2] BRJfI/ Ⓣ{_$;֣x71;De!8%X›eۓѩ:h!$AA@kK:.O?rg\,š-B> b (vDbD{, 2Kһ!˭+bXA<'Z[A$(H$0KB|nj<(ۂ"lLi2dZ^±"uFP8G: -AʒGG4f ׫8ħ1.^_J=TApI.RǍB>4IKC۫RO^Ԉ,O uek޾vNG@uD7XEپh;"Q˄)Z6YD]ilDBl 0:h h$SilAa0v[m4~E_t+FI`N^x~!q\w<@f+ -[פA7X[JSPaio3Ս()B[i`XSPUʢuuZÓZKBtj׎bjV5+Z@+0J:,7OAW}d=H>Y odEZ OhBCF$v{&~_9Yڹԫ8Ph{(Ѓ^ԉPL~dl$?mY3/jvpȃd$tSAB2$DeU]h<2%'D|83RDU|+4< 4) KXH) *0#D# A rBbB"Q,%vHHu - Hf&?TFB3Xɺ'10 -rP~z| /aёS &3riΔ|RɦgAeD(7fơ -FB4}붅\b &BUn -D(B>X2Ih%Dt\6p#]IH_''-JZMӣC@*5{/rş00 -E'I-O_ !^OesܻGm]gٰEurՄn,ק(ICΈM֥&'8pf9v$k52R$Gi6LsB}`sAS$׶4Ġ IuY">f8*}ܯXB^DDpUCVM9{*m$O(JD7@ZM-&СP z~8}B/r>!yI(moCjF)N<N3g7cM۹3Av2{vm ?˟-Gg!+~}5%.ymJ)utj46,a .{?/\t5+?u;=;]SΪwW{~g^YizuSe~<% Rԕ3eM:[5`͘ouJ%rw%6g뢣wzƘ.G񷺨}G›ֆg;h;.sauzKyk5zS0@nLLHTGq+U$T/D"‰=½ iPdrm+h(vݯAm`={ݍJLvx8{BMj;҄>RQLlLmlHmS,ZWDx(ICCy n[WuK/4KP@h;p=O5mF~hOk6&ywt7+k>.z\& ]jD`kGxNoa6`&Gp%r3F2X g`ޢUѪ_uQ#L `imPG|U@TI0$ Vϧ7WuƚE~M1/8WqR~y$_#s/6]:ZAfD}Z5##q˳(7 _F^go0<&Tyi>ZO}-b޽\E[.g"( qP&NA^qc/yQ A=(q0vC30U -g|I׏uƕ=8؝&qK\Hfhr-|q%  D`p}Ou4.dѐ`(E)hzj\x"˛@4(9;#4ƈEL8_"#ivBi#|1''YsM+cι}w>uûhGս5*$Jgأo:~Z|ᾈug qة]+;/cV釻N7חwHQ$⿘ss(39_JE/Ŧ>(L2ZIڵ^Z(bRG_jdpÈO' hUÅ}ĤӞ169boi?Gs{{pȑ☃U;:pqh29b$ΑVY~UGg02IUSxAy:-e4s֊f gX01hwvIF\P^e]-w䰌߆} $a)2 2Bȧh!cjBF+ tryy-*ҵh瘣8 4Ů-5CT,,;)RK,iRFӀ%f@H#OæE]Jz "r\- wb._S@=.}߶S֣#uiw[T#OjoGrL.cNiΈDJ7 Y^#!숌l2NIE$ޏ7~]䦥;j-_Qqwfgl7ھNx; s[:K锽>0=EXɄpⷑ;n!7J[%pBqsԍ,],Rғ<>8j<[a/ps*J3pNc${!XOY;q5+vT4WR ׀ftY\Z!o *)#,6˪5^BC(:uo飲" -3si}B״rˣc/g27L 4iKę%Y8r&H:~+ }*c{%Po;]\1k# -\PuF`MHnDȻɏpBF<]eo|HrW%)j*~u~uXV`Ȓ"dz-Ru^M;3q+ۤjʟeT=\L#lx 2G.uv5Fut]G(lIV%.ՓY;#dqrI6" Sq#6"HU eФ:ZX2%HB:r?X@H5a5(xSY GЎAo̢ MXAAo/n+h1D]*KteԶK==+ɴID6gDYPDydv%3NȄ/Oiyk< -U]GSϦ`KzPֳc] ^jܫ9Uu&%2g|lS\* أcw/5f^]k] 2 $0!`X1/fv(郏(xAe Eʜdc-PhY"_Q95Уx6"A$Oq}`b3G S֐>,%zv< Uo,"LPAT(V95Ym#p.~3q`ҦhD'+pm8ܟX0D iG#$E$p&ƌ >5$QQVi#6S~Ut}YE>]7(W"UA`1:7"Y/!knPszZi;~Oݷ Ym"勑:"Yϒx:MEXV Vo@&Q6<9,ploJh\͑xtQŊ&=ݍbn?x'Ǐ du~/?A6r -endstream -endobj -618 0 obj -<< -/CreationDate (D:20080513143006+02'00') -/Creator (Adobe InDesign CS2 \(4.0.1\)) -/Producer (Adobe PDF Library 7.0) -/ModDate (D:20080513143007+02'00') -/Trapped /False ->> -endobj -619 0 obj -<< -/Intent /RelativeColorimetric -/Subtype /Image -/Length 1983 -/Filter /DCTDecode -/Name /X -/BitsPerComponent 8 -/ColorSpace 827 0 R -/Width 124 -/Height 108 -/Type /XObject ->> -stream -Adobed     - -    $&&&$++++++++++   - - - -    l|" -  - s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& -EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT -&6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?9f]$$`;sjRܒ-?>'Wr>yN|R~.*MT%1H%aɆL=HDCjͨ(y.YAߌ`/L&h*IOq&S"bFbEiZNߺc -bgZn潺m6;#} -~aFJIagxx_cx+Z %P>I'{nlj6dGqYK= cv9)sT͛6nfTRheǨ:ӹPdHj'űeca3C!bш^رTvܓ%|zj(]la-ZnȒ(T'NB$)֘֋z 6FL)Z0͍UsfGl ms>7~vap:U'l7ͮql\wU=Gp|+:.#Hd4v dZݘp'QЄeœI~bI끰Pe#e Jx;dVu24-kHґˠ1D ]7V`!Ne;Ӻf)o&ҤR% -v.:q8n#J\K?N~.5m^GR/GzgFk-/_PI `` ["l\ yC-Y}G!Lbllb{q9~D+f \ l F8^c2K RJqE2S$(HC4QJ q)_l( "ҵkU+KnZ -*r;e"CPpa@1h#|=1@KSqظl Z< 0Smz%_HHjSPup -IGR|pIpkigނb|M %cJy&)]&hg$|00Sc1x H91ݶ ixrV8nXŹx;cǃf!Ihi`pӐ> rt*ܰ8|rsEI ED0ˊoh䵚[9~>y&­_ލOk鑍!durWI>@|KJ,SM\}b1-5śdI͕bce>׿\z^Wӆxk -endstream -endobj -620 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 831 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -621 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 832 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -622 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 833 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -623 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 834 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -624 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 835 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -625 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 836 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -626 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 837 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -627 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 838 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -628 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 839 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -629 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 840 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -630 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 841 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -631 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 842 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -632 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 843 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -633 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 844 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -634 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 845 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -635 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 846 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -636 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 847 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -637 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 848 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -638 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 849 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -639 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 850 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -640 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 851 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -641 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 852 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -642 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 853 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -643 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 854 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -644 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 855 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -645 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 856 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -646 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 857 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -647 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 858 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -648 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 859 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -649 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 860 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -650 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 861 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -651 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 862 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -652 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 863 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -653 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 864 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -654 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 865 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -655 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 866 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -656 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 867 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -657 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 868 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -658 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 869 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -659 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 870 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -660 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 871 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -661 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 872 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -662 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 873 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -663 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 874 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -664 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 875 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -665 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 876 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -666 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 877 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -667 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 878 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -668 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 879 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -669 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 880 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -670 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 881 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -671 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 882 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -672 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 883 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -673 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 884 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -674 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 885 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -675 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 886 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -676 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 887 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -677 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 888 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -678 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 889 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -679 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 890 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -680 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 891 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -681 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 892 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -682 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 893 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -683 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 894 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -684 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 895 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -685 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 896 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -686 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 897 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -687 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 898 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -688 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 899 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -689 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 900 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -690 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 901 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -691 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 902 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -692 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 903 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -693 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 904 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -694 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 905 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -695 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 906 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -696 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 907 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -697 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 908 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -698 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 909 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -699 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 910 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -700 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 911 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -701 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 912 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -702 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 913 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -703 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 914 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -704 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 915 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -705 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 916 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -706 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 917 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -707 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 918 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -708 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 919 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -709 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 920 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -710 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 921 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -711 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 922 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -712 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 923 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -713 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 924 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -714 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 925 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -715 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 926 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -716 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 927 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -717 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 928 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -718 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 929 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -719 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 930 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -720 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 931 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -721 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 932 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -722 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 933 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -723 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 934 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -724 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 935 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -725 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 936 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -726 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 937 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -727 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 938 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -728 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 939 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -729 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 940 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -730 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 941 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -731 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 942 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -732 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 943 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -733 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 944 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -734 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 945 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -735 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 946 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -736 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 947 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -737 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 948 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -738 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 949 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -739 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 950 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -740 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 951 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -741 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 952 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -742 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 953 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -743 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 954 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -744 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 955 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -745 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 956 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -746 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 957 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -747 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 958 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -748 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 959 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -749 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 960 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -750 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 961 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -751 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 962 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -752 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 963 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -753 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 964 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -754 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 0 0 0 1] -/Function 965 0 R -/Extend [ false false] -/Domain [ 0 1] -/ShadingType 3 ->> -endobj -755 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 966 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -756 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 967 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -757 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 968 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -758 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 969 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -759 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 970 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -760 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 971 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -761 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 972 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -762 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 973 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -763 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 974 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -764 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 975 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -765 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 976 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -766 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 977 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -767 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 978 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -768 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 979 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -769 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 980 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -770 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 981 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -771 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 982 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -772 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 983 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -773 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 984 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -774 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 985 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -775 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 986 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -776 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 987 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -777 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 988 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -778 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 989 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -779 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 990 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -780 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 991 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -781 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 992 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -782 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 993 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -783 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 994 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -784 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 995 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -785 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 996 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -786 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 997 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -787 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 998 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -788 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 999 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -789 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1000 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -790 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1001 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -791 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1002 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -792 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1003 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -793 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1004 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -794 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1005 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -795 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1006 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -796 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1007 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -797 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1008 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -798 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1009 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -799 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1010 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -800 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1011 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -801 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 0 0 0 1] -/Function 1012 0 R -/Extend [ false false] -/Domain [ 0 1] -/ShadingType 3 ->> -endobj -802 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1013 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -803 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1014 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -804 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1015 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -805 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1016 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -806 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1017 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -807 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1018 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -808 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1019 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -809 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1020 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -810 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1021 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -811 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1022 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -812 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1023 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -813 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1024 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -814 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1025 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -815 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1026 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -816 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1027 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -817 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1028 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -818 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1029 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -819 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1030 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -820 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1031 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -821 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1032 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -822 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1033 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -823 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1034 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -824 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1035 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -825 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1036 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -826 0 obj -<< -/ColorSpace 827 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1037 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -827 0 obj -[/ICCBased 1038 0 R] -endobj -828 0 obj -<< -/Subtype /XML -/Length 16788 -/Type /Metadata ->> -stream - - - - - application/postscript - - - Adobe Illustrator CS2 - 2008-05-07T15:15:31+02:00 - 2008-05-13T12:05:55+02:00 - 2008-05-13T12:05:55+02:00 - - - - 256 - 108 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAbAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWP+ffO2k+SvK175h1MlobVaRQKaPNM20cSV 7se/Yb9sMY2USlQfFHnv8+/zH833Uvq6nLpmmOT6WmWDtDGErssjIVeX35mlegGZMYAONKZLz5Lm 4Sf6wkrrcBuYmDEPyO9eXWuSYPoTyt+bn5kflfdaXb+b7n9P+VdSRHgkeUS3cURAPKNmPqfCCPge q9lIyuUAW2MyOb6o0bWdM1rSrXVdLuFutPvIxLbXCfZZT89wR0IO4O2UEU5AKMwK7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+dP+cz7u4Xy35btFJ+rzXk8 sg7c4ogqfhK2XYmnNyfNl35F822eg/p6702WDTKrWaSiMBIeKMYmIkCMej8eJ8cutppA6J5f1vXb 0WWj2U19dEcjHCpbitacmPRVqep2xtQE787+TPOXl+LTrnzIGDXySLAkjMzx+g3BkcMBTxUrVWG4 JwApIL6I/wCcNvMs915b1zy9M5ZdMuIrm1BP2Uu1YOq+weHl82yrKG3EX0TlLc7FXYql/mC81Cy0 a7vNPgW5ureMypA5IDhd2ApvXjWnvlWeUowJjuQ3aeEZTEZGgUl/L7zwvmrT7iWSJLe8tZOMsCEs ODCqOK+NCPoyjR6rxQb5hyu0ND+XkADcSn+rarY6Tp0+oX0gitrdeTt3PgAO5J2AzJyZBCJkeTh4 sUskhGPMsW8ieddc803FxOdOjtNIhJVZyzM7v+yi9FqBux/rmHpNVPKSaAi5+v0WPAAOK5lmmZ7r HYq7FXYq7FXYq7FXYq7FXYq84/NT88fK/wCX4FpKjalrsic49MhYLxU/ZaaQhvTB7bE+1MNK87g/ Nn/nJPWV+u6P5Lhh09vihEtvMGZT0PKWaLn81UY0qa+S/wDnJWZteXy5+YOjny9qbusQuQskcIkc 0Alimq8Snaj8mHjQb40r3bArxDz5/wA5HSWfmKTyv5F0dvMWsxO0UkwDvEJU+0kcUPxy8f2m5KB7 4aVI5/zY/wCcldJhOo6r5Mgk05BzmVLebkqdz+7nkZKU3LKaDrjSvT/yn/N7QvzE02WS1iay1S0C /XtOkYOUDdHjcBeaGnWg9xiQrPMCuxV2KvGf+cjdPgvLv8vEuChgk8y2lvMkgBQpMw5cq7caLvlu Pq1ZOjA7vzXH+Z/5XazpcqwP5iRHng02CCSCSynt7xEhgeWZ2WZriFiaqF40evtXn1GPDvOQiPMr GBmKAsoXQNTT8n/yqF3JpqTa9fa59UvJpY3FLdU9T1EVzEX/AHalY9+HIt71jh1mHPKsc4y2vYi1 ljlAbhr88dT0zzp+Tul+cVeKS5sNVl0+3vIopIVuITzFVjkPOPmqKzKxbiwIBpvmTHY0wnuLQ/8A zhlcFfN3mC3ptJp6SE1/33MB0/2eDLyTh5vrXKG92KuxV2KvG3UeQfzOD7RaJqvc7IkUrb+w9KQf 8D880f8Ai+f+ifuP6nph/hek/wBsh+j9Y+1vVr3UPzK80JpWnM0XlywblNcUoD2MpB/abpGp+fjh ySlqsnDH6B+L/UjDCOhxccv72XT9H63qkFvpug6L6UEYhsNPhZuK9kQFmO/Unck+ObYCOOG3KIdB KUss7O8pFCeUfMf+ItI/Si2xtoJJXS3Vm5MyIePI0AAJau2Q02fxY8VU2avTeDPguzSdZkOK7FXY q7FXYq7FXYq7FUg8/ea4PKfk7VfMMwDfUIC0MbdHmYhIUP8ArSMoxV4V/wA43/l//iW/v/zJ81D9 IXc10404TgMrTg8pbkqRSqseMf8AKQdtloSr6UwK8Z/5yk8m2Oq/l7Lr4iH6T0N43jnUDm1vLIIp Iye6guH9qe5whU+/JbzDqfmP8nNOuTIW1WK3mshKx3MluWiiYt4lQhJ8cSrxv/nFbzH5Z0PzBrun a9JHYa5eeklpcXZEZPpM/rQcnpxcsVNK/FT2wlX1YrBgGU1U7gjoRkVeTeSPySvPK35par5uttQh XS9R+tBdLijZSiXEgkVa140Vl6DDavWcCuxV2KvHf+cnrAXvlLy7EZmtlHmG05XKU5xhoLhQV9y5 UD3wTyGEJSAuokoMeIgebvL+m6SyvepbwfWZp3upGjjjT9/LXnKAgADNyNTnlXamszZchMyd/u7v c7zHjjEUE3ltrH0Zo5YovRuK/WEZV4ycgFPMHZqjbfNbGc7BBNx5eXuZkXs8X/5yPhsYfJWg2VhI LW0sr10tNJgVIoCJY3Z5BEoBJRgACNhzPjnfeyuv1OWcoZCZxEbs7kG+V+e/Pu2dV2jgjGII2Nsc /wCcUfMEOkfmstlct6a6vZzWKBqgesGSdK+/7kqPnnZ5BYdbiNF9rZjOS7FXYq7FXiv5iazP501t dE0C2F5HpayytcoKlyq/vOLfybBR/M1PbNFrMpzz4YC+F6js7CNNj8TIa4q2/H4DKPyU1DTZvLEl nBEsV7ayn65T7UnqVMch+gcf9jmX2ZOJgQOYcDtvHIZeI/SRt+pf+cUOop5ea+g1SS0t4l9CWxjB pc+uyqQ7Bl2C124nvj2kJcFiVDu77R2PKPi8JjZO991IXQdF1Xyl5Lu9VuNXlmj/AEaXttOKlI7e aYBxQ82BPqNStBkMWKWHEZmR+nl3Es8+aGoziAiB69z3gfsS7yvpf5heaNBt559fm0qxXn6M6l3u JzyJLsweNgo+yPi7dO+V6fHmywsyMY/a36rLpsGQgQE5fYPvRNrqHmDzrqVyLDWH0by3YP6EU8T0 uLhlp8RaqtuN+tBUbE1wxnPPI1LhgPmWuWPHpYjihx5Zb+QVrK917yr5x03SrrWJNa0fWCyRvOfU ljlFAPiJY/aK96UPTJQnPFlETLijJjOGPUYJTEOCcO7ku1LWte81+ZrzRdH1L9D6Pph4Xt+hpLJK CQVQgqeoIFCOlT2GHJlnmyGEZcMY9UYsOPT4hknHjnLkOlIa9n17yVrGm3B16XWdHvp1t7qG7f1H j5U+JSWbtUilOlDkJyngkDx8UTzbIRx6qEhwCE4ixSK8/a35mPnXR9E8vTmO5aJpXTkRGS5O8oHU IsfKh+7J6zLk8WMIHf8AHNr7PwYvAnkyja/xXvtKvOdp5t8o29jrI8y3V/dS3IjltXLCFiVL/DFy ZePw0Ip3yrUxyYQJcZJtyNFPDqDKHhxiK59fmj9X8u+eX0G88wal5juLG/hge6GnWrNHBGEUv6R4 utWoONfH+bLMmHNwGcpkGrppw6nT+IMccYlEmrPP3/j7GG/ndrWqah/zj3YXd69bm8vIEuGoBzVH l4k08fTVjmdo5meME83Xa/FHHmlGPIPRfyKt4Lf8pPLKQABGtTI1Kfbkkd36f5THMkuGzvAryn/n JvXoNM/Ke/tWcLcatNBZ267Emkgmk2Pb04mFffCFRH/OPOnjRvyi0QXjrDJe+teAOQvwzSs0ZFad Y+J+nEq1+YX/ADj55E863smqt6umatNvLeWZXjKafaliYFWPutCe5xtXlut/lB+cf5aWM2seT/M8 t/plirTT2kZeJhGg5FjaSGWCQKK13r4DG1es/kZ+aU/5geVpbm/iSHWNOlEF8IgRG/JeUcqgk8eQ qCK9R4YlXpGBXYq7FXz5/wA5BfmFpWo+avLP5d2C/W70azYXOqOlSIv3gWOAU6uwk5N4Cnjtdjj1 ackujIb7yPr+mX3PSFeS2Y1MHNUdParkAr4b1/XnKdodhmRvGAQenc7bBrI169imOleWfMd7MEuo fqyr1d3EjkE1NCGcAfM/RmDpvZqZl+8PDHyr9Dbk18QPRuUr/Oz8p01b8u76W2YPqWjxtqFkwU8w 0K85EUj4m9SMEU8aHtnX6PT4sA4cceEff73UZpSnuTb5Q1fz7qF9qukazb20On6xpKxH69bLxeaa AgxzSeLDgOuZ9ONb7x/Lvzrp/nTyhp3mGyIH1qMC5gBqYbhNpYj3+Fuleooe+Y0hRcqJsMjyKXYq 80/M3ztdGceU9A5S6ndkRXTx9VD7ekp/mYfaPYfhqtdqjfhw5nn+p3nZmiFeNk+kcv1sm8h+TLXy vpAh2k1Cej3twO7Doi/5KV2+/MvSaYYo/wBI83B1+tOed/wjkGA3xPkP8zluwPT0XVql6bKqSt8f /IqT4v8AV+ea2X+D57/hP3fsdvD/AAvSV/HD9H6x9qdfnRdwta6Hpk0np217eepNLWgEcQCMSfAe tXMjtOW0Y9Cfx97i9iwNzmOcY/f/AGIj82dYtpPI6xafLHcR6jcxW8bQMrqQhLkKVqNmjAyXaGUe F6Tdlh2ThI1FyFcIJ3/Hmy0aXJa+WP0Xa7SQ2X1aEj+ZYuCn78y/DIxcI58NfY67xeLLxnrK/teS +QPK3kHV9JYavMYNXt5HW5heb0Txr8LBWptTY++afSYMM4+o1L3vRdoarUY5+gXA8trTnyxof5fy edBaaJbXF0+m0uG1ETcrdXQ7D/K+Lb3+WXYMWE5agCeHe72cbVZ9SMF5CBxbVW6SeTfK/lDUb7Vr HzLK0GsW904VHm9LknenL7RDAk+2UabBjkSMhqQLlazVZoRjLELgY91ppB5b/LY+bbTRdLt7jULj +9muYZw8MPD4vjO4NKb/ADA65aMGA5BCNy+Ljy1Oq8E5JkRHdW5Tjyv/ALk/zW8x6l9qLTo1s4+4 V6hDT6Yn+/MjB69ROXdt+hx9V+70eOP843+PmGvP/wDuS89+VNEG6pIbyZPFVblv/sYXwaz15oQ+ P4+S9n+jT5cnw/HzCZ/m5qX1LyRdoDxe8eO2T/ZNzYf8AjZd2jOsR82jsjHxZx5boDzz+Xkuv/lD L5UtwFv47OFrSpABurfjIASdh6jKVJ98ycEOGAHk4WoyceSUu8l5T+Q3506X5V01/IvnZpNLm06a RLO5nRuMYZizwTUqyMshYqSKUNNqCtxDS9d1b88fyp0yze6l8x2lwFG0No/1mVj2ASLkd/egxpXh creZv+cgvP8AbulvJp/knR3Kl2/YiYhnqwqpuJgBsuyinWlSeSs3/wCcpvJVzc+QdJvNItq2nlyQ rLbxD+6tHjWPkB14xmNAfAb9BgCpx+V//OQHkHU/K+n2usanDpGs2dvHBeQ3R9KNmjUJ6kcjfAVf jWlajp740qr+ZH/OQf5f6P5dvI9J1KHWdYuYXis7a0Pqxh3XiHlkAKBVrUitT0A8GlSj/nFHyXqe ieU9R1rUIWt316WFraJwQxt7cOEkKnoHaVqeI36EYlXuOBXYqwX85vzJt/IHkq51VSrarcf6NpMD b8rhx9sjusY+Nvu75KEbLGcqDxz/AJxY/Lo6nf3P5j+YW+t3sskv6JErc3aVmZZ7t/8AK58kWu9e Rp9k5bkl0asUer6baNGNWAJyhvbVFX7IpiqySS3oUkdKEUKsRuD2ocVfnf8Amd5Ubyn5+1vQeJWG 0uXNrXvby/vID/yLdcy4mw4khRZd+QH5xS+QPMJs9QZn8s6q6rfpufQk+ytyg9ujjuvuBkZxsMoT ovuSGaKaJJoXWSGRQ8ciEMrKwqGUjYgjMZyV2KpNpvk7y1pmoNqNlYrHfPy5XBZ3f4zVjV2bc9zm Pj0uOEuIDdycusyzjwyl6e5OcyHGS3W/Leh65HFHqtot0sBLRciwKltjQqVO9Mqy4IZPqF034NTk xXwGrU9T8qeXtUsLew1CzW4tbUBbdWZwyAALs4YP0G+++Rnp4SiIkbBOLV5McjKJonms/wAHeWvq djZmxU22muZLKLk9I3LcyftfF8W/xVwflcdAVtHkn85l4pS4t5c05zIcZjur/l75O1a7a7vtNR7l zWSVHkiLHuW9NkBJ8TvmNk0eKZsjdzcPaGfGOGMtvn96aaPoWkaNa/VdLtUtYSasEG7HxZjVmPzO W4sMYCoinHzZ55TczZQGueRvKuuT/WdS09JbmlDOrPE5oKDkY2XlT/KyvLpMczchu3YNdmxCoy2R Wh+WNB0KN00qyS1En22FWdqdi7lmI+nJYsEMf0imvPqsmU+s2qaXoWk6XJcyWFuIHvH9W5YFiXep NTyJ/mOHHhjC+Ec0Zc88lCRvh5OfQtJbV01l7cHUo4/SS5JaqpvsBXj+0e2Jwx4uOvUozz4OC/T3 KOtaf5d1SOKPVRDNHA4miWSTiA4FOWzLX6crzeFL6yPmyw5MuMkwsXsrvruhps+o2y16VmjH6zid ZhH8cf8ATBgMGQ/wn5MM84+Vvyc82P6/mCGxubpQF+txyGKeg6AyQsrsB2BqMh/KGAfxx+bMaTL/ ADSxO0/J7/nHeymFw6fWuJBWOa5uHWo/yUK8vka4D2ng/nhkNFm/ml6Jp3mz8vtLso7HTri3srOE Uit4IWjjUeyqgGR/lPT/AM77/wBTL+T83837ldvzA8mEFW1KMqdiCkhBB/2OH+UsH877D+pP8n5/ 5v3PN9d8gf8AOOOr3L3M1vFaXEhq72TXNuvWv90g9IfQuH+UsH877D+pf5Oz/wA37l/l7yV/zjno Nyl3bQw3N1GapLe/WLmhBqCEkBjqOx41w/ylh/nfYU/ybn/m/c9GX8wfJRUU1aAAjYEkfgRhGuw/ zmP8n5/5pV086+UHJA1qyBH808a/8SIywarEf4h82J0WYfwS+RTS1vbO7j9W1njuIzSjxOrruKjd SctjMS5G3HlCUTRFPj78/NYuPPnnXWTBeCPRvKfDTNOt/tvd6hK/F0gjH2naQUYitFQHMuAoOJM2 X09+Xvkmz8r+VtJ0wIv1iytYopWRRGplCD1X4KSKvJyZtzueuUylbdGNJnql/pAljE6m4khY0RBU A9+RJC/s9K1wC1lILo/MWnkgMskSU+2yfCP+BrgpfEC+70fT75fUGzMKrKhqDXofA4RIhJiC+c/+ csfIE36H07zeqBrmyddP1CVf24Hq0Ejf6j1Tx+IeGW45NWSL5y1LQtRsLe3uLm3kt0uI45UWQUPC UExuPFJOLcT7H6bbaiH1d/ziZ+Y0uteWbjylfy877Qgr2LMfiayc0C+J9F/h+TKMoyx6t+KW1PfM qbXYq7FXYqteSOMVdgg8WIH68hPJGAuRA96QCeSFl1nS4vtXKH/VPL/iNc1+TtnSQ55I/Df7rbRg meiDm816VH9n1JP9Vaf8SK5gZPafSR5cUvcP102x0cygZvO0S/3Vqze7OF/UGzDn7WQ/hxk+81+t tjoD1KBm88ahv6UES/63Jv1FcxJ+1OY/TGI+Z/U3R7Pj1JQM3nLXW+zKkf8Aqop/4lyzGl7Q6qXI ge4D9NtsdDj7kBN5m15+t7IP9Wi/8RAymXa+qlzmfu+5tGlxj+FATarqkn95eTv/AK0jn9Zyk6zN LnOR+Jbo4YDkB8kBNJJIau5c9asSevzysyJ5ltAAQ75IMwoPlgZBbHbXM7cYInlb+VFLH8MthCUu QtJkBzKOg8m+aLmnp6bMK9PUHpf8nCuZ2Ps/PLlA/d97TLW4o85D70wg/KvzTP8A3ggt69fUkqf+ SYfMzH2NnPOh8f1W0y7VwjlZTC3/ACZumobnU0j8RHEX/FmT9WZcOxJfxSHy/saZdsjpH7Uxt/yZ 0FafWb25lI68PTjB+9XP45lQ7GxjnIlol2zk6AJnb/lT5Kipzs3nI7yTSfqQoMyI9l4R0v4tEu1c 5618AmVv5G8nwU4aPatT/fkayf8AE+WXx0eIcohplrsx/jl80zttM021p9WtIYKdPTjVP+IgZdHF GPIAOPLLKXMksf8AzP8AOlt5N8jarr0rqs0ELJYoxAMl1IOMKAd/j3PsCctiLLVI0Hyv/wA4reVv 8QfmY2rXtZoNDha+JcluV1KfTiLV7jkz18Vy7IaDRiFl9h6td+jCIlNJJqgf6opyP4jKYhvkUht0 jklCBQscZoFpTfvthJak5EcfHiFHHwyDOlGxd7LU/qW/1e4BeJeoV6FjTwBAP04eix2NIT8yPLie ZPIWvaIRV7yylWD2mRecJ+iVVOGJospCw+B9CmudROqQ3k0k4/RkpVpGZyotFEsQFSaBfT4jwBzK cUMn/wCcevMj6D+begy8uMGoSnTrha0DLdj00B+UvBvoyMxYZYzRfeuYrlOxV2KuxVLtdsPrdi3E Vli+OP3p1H0jNL29oPzOnNfXDcfpHx++nI02Thl5FhbdM8tDt1F8sDIKL5MJUXywMgovkwybh0++ ujS2t5JvdFLD7xmXh02XJ9ETL3BEskY8zSYweSPME+7RJAD0Mrj9S8j+GbXD2DqZcwI+8/qtolr8 Y62mVv8Alqx3ur4DxWJK/wDDMf4Zs8Xs0f45/Ifj7nHl2n3RTO3/AC88uxU9VZbg9/Ueg/4Thmxx 9g6ePO5e8/qpol2jlPKgmlt5b0C2oYbCAEdGZAzfe1Tmfj0GCHKEfk48tTklzkUxVFRQqAKo6ACg zKAA5NBLeFXYq7FXYq7FXYq7FXzP/wA5gaP5r1K+8tx6daXd9pqRXLNFbRySqs4ZAWcRg0PBgFJ9 6d8P5nFi+uUY33kD72ueOUuQJRP/ADhjYCHSPNNw6lLh7q2t5FYEMPRSQ0NfeQ7Uy3KeTHF1e3eZ jLHe2Min4H5RsCNhUqfvP8MrinJzCyP0lV3pRqVqPbJEJVodSXYkcqdvc9MhSBJfD/pOpwPvyjJY sPDiR9xrkjyZcyneQZvzws7R7WTzDJAqhphNZWSkrGrLJLSQry49EWg+eZduJSA8n2V//jfQrWKN heNqNosKjrzM6BaH54SdkAbv0ezDcx2KuxV2KuxVhev2H1S+biKRS/HH7V6j6Dnl/b+g/L6g19E9 x+kfD7qdvpsnFHzCWJBNM3CKNpG/lUEn8M1eHDPIagDI+QtyDIDmmFv5U1WehdVgU93O/wBy1zfa b2b1WTeQEB5/qDRLWQHmmlt5Jslobmd5T4LRF/42Ob7T+y2KP1yMvdsP0uNLXy6Ck0tdB0i2oYrW PkOjMObfe1c3ODsvTYvpgPjv97jT1E5cylOo+fNLsdXudIisdQvrqyWJroWNpJcJH6ylo1Zk2BKi tMzwGlkFvdRTRxsDxeReXpPQOvSoZa7Fa0OKoPVtf0vS7H67cy8ofXgtR6X7xjNczJBEgC9zJIuK rdU8x6XppsRO7O2pTNb2iwr6hZ0hkuG2XsscDGv0YqirK/gu7W3uF5RfWUWRYZh6cq80D8HjPxK4 U7qemKq4miLcQ6lqlaVFeQFSPnTfFUFBrmn3Gt3mixMzX1hBBcXS8TxVLlpFiHLpyPosaYqvs9Vt bpJXXnCIZZIT66mIsYn9MunKnJC32WGx7YqivVi3+NdmCHcbMaUHz3xVpZoX48ZFbmOSUINQO4xV firsVQtzqmnW3MTXCK8dOcYPJxWlPgWrd/DMPUdoafDfHOII6Xv8ubZHFKXIMM1K6+vXktw67Psi t+yg+yOrfTTvXPMO1NedTnlk/h/h93T9Z83bYcfBGlLyemnaHr12Vi9JdcaISSrsvrxBlTkPF1bj y67KPl0vs32wdsGQ7fw/q/HVxtVpwfUOfVnV/YxXluYXPEgh43G5Vl6HO3BdbIWkl1a3FoGaRSYl 39RQSKe9MnYYHZC2ZM5KWSFyep4txB/ymIoMdmMTfJkWn2ItkLMeUrfaPgPAZAm20Bh2qaleTeYN QWO8mFvCY0iSKR0UViVm2QrvyJzgPaHtDPj1JjCcojbka6B2umxxMAaDzLWPyE/LvU71bs209rJ6 hlmSGd+EtTUowkL8V/4x8cxcHtXrIAgmMveOXyr7bYy0GIm6pNvL35TeQPL+tWWtabpfHUNPkEtt JJPcSAMBT7Luy9/DbBj9qdaJAylxR6io7/YyOhxdB973PPSXVuxV2KuxV2KqF1ZWt0EFxGJAh5KD Xr9GYmq0OLUV4keLhNhnDJKPJVihiiXhEixqP2VAA/DL8WKGMcMAIjy2YmRPNdliHYq7FXlek6bq 0fnDXLrUdD19ZdU1jlFf2V3BFZfVYljtreSRFu43ZRHDzasRahpQ9MKpJe/l35jg0nTdX0zQ0fzb LDrOoalNJIqSfWNQV1W0aVJEbpeOyhHC8kryBNSqkemflz5lsA4XyhNPpU19pct3pZOn23q2dglw WqkUro0vryIxWR2ZlCguSTRVN5Py780tY30FhpDaXp2oHVLiy0xZIibM6r9UsQlFdo0KQfWbhlQ8 V5cVqcVTK68gzwpHrj6bHaamddvNTn1KYqz2On2cE0dpRgXYLIlvb1RK9fiG2yqA/KOLTtT80aI9 ppkFnLoOjyy6tdwXMF213fXsixxzySwNJzLpHO6tIefxnam5SrL9HvfMGl+cPM1xdeWtSul1a/hW zvbc2Zt1tLe3jgjZjJcxygcxI5AjPXudsVYf/wAqs1fUfLGqfpnSFuNXfRoLPToZTG6xX9/LPdX9 wo5lecU939rr8B4nfdtU1/RXm+C4ezby7czW0fmOfWbu8EtqVuYLRGbT1iX1OfNjBbqS6rxI+5VO fys8napoN7qj6zZqly/F9NmikMkFtaXLNO+nQBiWUW87NVqDmCvhxVKvRMCoXVXaPS7yRGKskEjK ymhBCEggjMXXSIwTMdjwSr5M8Q9Q97A0ChBx2Wm2ePHm7xdgVSubeO4geFxVXFMnCZibCss8o63J qNi9vdGuo2JEd0aU5g19OQf64G/uDtSmeq9kdoDU4Qf4hzdRqMXBLyKe5tHHdirjuKYq8ttf+Otq i1rxlQV/55Lnm/tT/jZ9w+4O20f90Pj96Ozm3JdirJdC1/mFtLxvj2WGY1JbsFb/ACvfv8+vf9h+ 0Ay1hzbT5CX873+f3+/nrdRpq9UeSf51rhOxV2KuxV2KuxV2KuxVbM7Rwu6oZGVSyxggFiBWgLED f3OKvK/Kv5p+YbnT7u+vNJudTmlR9XisrP6qiWekOzi1LSvKvqSSrE5C/aJU9FpU0rLNB8/wa9r0 2naVpt1NY2yRPdaw3ppbIbi2S6ijAZ/UZykq8gq/D3wKxu//ADM8zDVZrS30eRozr6aTp6Q+i81x Fb2xuLz7cwQHlGVDHiFBFdwaGlXTfntoUVjDM2nTrdC3mu9QspJ7OGS3jt7iW2dQZZkWZzJbycFi qSBXaoq0rI/NPmTUli0Ox8vmMah5jnEdrdzxs8UFusDXEs7RgpyIjSiKSKsRXArEdP8APcPlq71W J7pfMEEf1RUtrOw+pai13dXRthH6fGGGZG6qwNdmG+FU2sfzMvZtQu7UaReXWptM0NvoUQthLCtp BDJdyPcGf0WVXukSvIfH8Kg7tjSp75A8w3vmPQH1q4jMMN1d3YsIXT05EtYZ3hiEi70ciPkfngVk mKuxV2KoTV3aPSr11NGSCVlPgQhOY2tmY4JkcxGX3M8QuQ97BE48Bx3FNs8dLvF2BXYqlmq6jqGh uNd0yOOW7t0ZHt5SVSaNt/TZlDFdwCGAND2PTN52DrjgzC/pPNqzY+OJDflj/nJf8rNZiCX18+g6 gp4zWWoxsnBhsw9VQ0VK+LA+wz1PgPTd0XiDqm+rfn3+UWmW7TTeZrWegqI7QtcufYCEP+OPhlTk DwH82P8AnKnVvMFtPo3k+GTSdLlDRz6jIQLyVDsQnEkQqR4Et7jLY465tUsl8mf/AJL26w+QdNIF OcSEj3KAn8TnlHtHMy1cvIvQ6cVjj7mdZom5TnuIIIzJM6xoOrMaDJQgZGgLKo+w8v6jqYpNG9lY ts7yjjM61IZUjPxL0+04HiAc6rsz2ayzkJ5fRHu6/scTLqox2G5ZznoDq3Yq7FXYq7FXYq7FXYqo 3tqLuzntTI8QnjeIyxkB15qV5ISGHIVqKjFWJXf5W6TLHHBaajfadZNp1vo9/aWrxKt1ZWiusMcj PE7oQJWBaJkNCR8jap/5f8t6doMF1BY8/Tu7l7uQOVNGcKoReIWiIiKijrQdTgVLtL8g6Vp2sJqc V1dSNFcX13DayvG0KTakVadhSMSH4lYryc05sOnEKqkT/kp5fD2zWup6nZhLWOyv/q80aNexRSNK GnYRchIXkbk8XA0JHfDasn8y+VLTXIbKlzPp19pk31nTdQtCglgk9NojQSLJGysjlWVlIIwKldr+ WmmR6sur3epX+oakbm1u5p7l4aSPZxTRQqUjijRIx9ZZ+KBfiofGrauP5a6fHdre2OqahYXxkvnu LuB4fUmj1GcXE0Ll4nAVXVRGUAdANmxtU/8ALuhWegaFYaLZM7WunwpbxPKQ0jBBTk5AUFm6tQDf FUwxV2KuxVbJHHLG0cih43BV0YVBUihBGCURIUdwUg0xq78h2Z5NYXc1mxpxQkSxrT/Jaj/8PnPa j2a08943H7R+v7XLhrZDnultz5P8zwNW1ura8jC1IkDQuSOwAEi/ewzV5vZI/wAEgfs/W3R1seoS a71GTTXEWr2sthKfs8wDGxoCeEiko1K70O2c9qux8+E1IOVDJGXIsX8x+ZGvwNO0uCS7uZvhit4V LyO3sB+voO+ZvZfZWScxsuTIICyxPSP+cQNb1WeTU/MutxaZLdyPPJp9nH9ZZPUYtwMzNElVrvRW GenY5CEREdBTz0oGUiT1ZPbf84a+Qlp9Z1rVZdvi9NreOp9uUUlMPilfBDr7/nDXyG8LCw1rVIJi p4vObedQ3YlUigJHtyx8Ur4QRnlK4ttAin8tahKIr3TJngYsCgcKaK6hqHi60ZfEHPL+3dHk8eUg HoMRuAruZRDdpdTra2FLy7cVSGIg0UEAu56IgqKsf10Ga3R9m5tRPhjH9iZzERZZfoPlmKwC3V7w udUNSZqfBFUU4QA/ZFDQt9pu+1FHpHZnZGLSx2Fz6ydXm1BmfJPM2rjuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRvfqX1Sb696f1PifX9fj6XDvz5fDT55GdV6uSY3 e3NBaF/hn0ZP0D9S9HkPW+o+lx5U25eltX55HFwV6KryTPiv1c0zyxi7FXYqx/zL/gL1k/xJ+jPr Ppn0fr3oet6dTX0/U+Olf5e+UZfD/j4fi24+P+G1Xyx/g305v8NfUaUj+s/UfS5U+L0/V4fF/NTl 74cPh16K+CMnH/Fad5c1uxV//9k= - - - - - - uuid:E5FA3B3F1DD811DD86BDF21B8BE353A9 - uuid:9149C83E227611DD96FDE93621064FD0 - - uuid:E5FA3B3E1DD811DD86BDF21B8BE353A9 - uuid:C90DC6BE1DC111DD86BDF21B8BE353A9 - - - - - -endstream -endobj -829 0 obj -<< -/OPM 1 -/BM /Normal -/CA 1 -/OP false -/SMask /None -/ca 1 -/AIS false -/op false -/Type /ExtGState -/SA true ->> -endobj -830 0 obj -<< -/OPM 1 -/BM /Normal -/CA 1 -/OP true -/SMask /None -/ca 1 -/AIS false -/op true -/Type /ExtGState -/SA true ->> -endobj -831 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1039 0 R] -/Bounds [] ->> -endobj -832 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1040 0 R] -/Bounds [] ->> -endobj -833 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1041 0 R] -/Bounds [] ->> -endobj -834 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1042 0 R] -/Bounds [] ->> -endobj -835 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1043 0 R] -/Bounds [] ->> -endobj -836 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1044 0 R] -/Bounds [] ->> -endobj -837 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1045 0 R] -/Bounds [] ->> -endobj -838 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1046 0 R] -/Bounds [] ->> -endobj -839 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1047 0 R] -/Bounds [] ->> -endobj -840 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1048 0 R] -/Bounds [] ->> -endobj -841 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1049 0 R] -/Bounds [] ->> -endobj -842 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1050 0 R] -/Bounds [] ->> -endobj -843 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1051 0 R] -/Bounds [] ->> -endobj -844 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1052 0 R] -/Bounds [] ->> -endobj -845 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1053 0 R] -/Bounds [] ->> -endobj -846 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1054 0 R] -/Bounds [] ->> -endobj -847 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1055 0 R] -/Bounds [] ->> -endobj -848 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1056 0 R] -/Bounds [] ->> -endobj -849 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1057 0 R] -/Bounds [] ->> -endobj -850 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1058 0 R] -/Bounds [] ->> -endobj -851 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1059 0 R] -/Bounds [] ->> -endobj -852 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1060 0 R] -/Bounds [] ->> -endobj -853 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1061 0 R] -/Bounds [] ->> -endobj -854 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1062 0 R] -/Bounds [] ->> -endobj -855 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1063 0 R] -/Bounds [] ->> -endobj -856 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1064 0 R] -/Bounds [] ->> -endobj -857 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1065 0 R] -/Bounds [] ->> -endobj -858 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1066 0 R] -/Bounds [] ->> -endobj -859 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1067 0 R] -/Bounds [] ->> -endobj -860 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1068 0 R] -/Bounds [] ->> -endobj -861 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1069 0 R] -/Bounds [] ->> -endobj -862 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1070 0 R] -/Bounds [] ->> -endobj -863 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1071 0 R] -/Bounds [] ->> -endobj -864 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1072 0 R] -/Bounds [] ->> -endobj -865 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1073 0 R] -/Bounds [] ->> -endobj -866 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1074 0 R] -/Bounds [] ->> -endobj -867 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1075 0 R] -/Bounds [] ->> -endobj -868 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1076 0 R] -/Bounds [] ->> -endobj -869 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1077 0 R] -/Bounds [] ->> -endobj -870 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1078 0 R] -/Bounds [] ->> -endobj -871 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1079 0 R] -/Bounds [] ->> -endobj -872 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1080 0 R] -/Bounds [] ->> -endobj -873 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1081 0 R] -/Bounds [] ->> -endobj -874 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1082 0 R] -/Bounds [] ->> -endobj -875 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1083 0 R] -/Bounds [] ->> -endobj -876 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1084 0 R] -/Bounds [] ->> -endobj -877 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1085 0 R] -/Bounds [] ->> -endobj -878 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1086 0 R] -/Bounds [] ->> -endobj -879 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1087 0 R] -/Bounds [] ->> -endobj -880 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1088 0 R] -/Bounds [] ->> -endobj -881 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1089 0 R] -/Bounds [] ->> -endobj -882 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1090 0 R] -/Bounds [] ->> -endobj -883 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1091 0 R] -/Bounds [] ->> -endobj -884 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1092 0 R] -/Bounds [] ->> -endobj -885 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1093 0 R] -/Bounds [] ->> -endobj -886 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1094 0 R] -/Bounds [] ->> -endobj -887 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1095 0 R] -/Bounds [] ->> -endobj -888 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1096 0 R] -/Bounds [] ->> -endobj -889 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1097 0 R] -/Bounds [] ->> -endobj -890 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1098 0 R] -/Bounds [] ->> -endobj -891 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1099 0 R] -/Bounds [] ->> -endobj -892 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1100 0 R] -/Bounds [] ->> -endobj -893 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1101 0 R] -/Bounds [] ->> -endobj -894 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1102 0 R] -/Bounds [] ->> -endobj -895 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1103 0 R] -/Bounds [] ->> -endobj -896 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1104 0 R] -/Bounds [] ->> -endobj -897 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1105 0 R] -/Bounds [] ->> -endobj -898 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1106 0 R] -/Bounds [] ->> -endobj -899 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1107 0 R] -/Bounds [] ->> -endobj -900 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1108 0 R] -/Bounds [] ->> -endobj -901 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1109 0 R] -/Bounds [] ->> -endobj -902 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1110 0 R] -/Bounds [] ->> -endobj -903 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1111 0 R] -/Bounds [] ->> -endobj -904 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1112 0 R] -/Bounds [] ->> -endobj -905 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1113 0 R] -/Bounds [] ->> -endobj -906 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1114 0 R] -/Bounds [] ->> -endobj -907 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1115 0 R] -/Bounds [] ->> -endobj -908 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1116 0 R] -/Bounds [] ->> -endobj -909 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1117 0 R] -/Bounds [] ->> -endobj -910 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1118 0 R] -/Bounds [] ->> -endobj -911 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1119 0 R] -/Bounds [] ->> -endobj -912 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1120 0 R] -/Bounds [] ->> -endobj -913 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1121 0 R] -/Bounds [] ->> -endobj -914 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1122 0 R] -/Bounds [] ->> -endobj -915 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1123 0 R] -/Bounds [] ->> -endobj -916 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1124 0 R] -/Bounds [] ->> -endobj -917 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1125 0 R] -/Bounds [] ->> -endobj -918 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1126 0 R] -/Bounds [] ->> -endobj -919 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1127 0 R] -/Bounds [] ->> -endobj -920 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1128 0 R] -/Bounds [] ->> -endobj -921 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1129 0 R] -/Bounds [] ->> -endobj -922 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1130 0 R] -/Bounds [] ->> -endobj -923 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1131 0 R] -/Bounds [] ->> -endobj -924 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1132 0 R] -/Bounds [] ->> -endobj -925 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1133 0 R] -/Bounds [] ->> -endobj -926 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1134 0 R] -/Bounds [] ->> -endobj -927 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1135 0 R] -/Bounds [] ->> -endobj -928 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1136 0 R] -/Bounds [] ->> -endobj -929 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1137 0 R] -/Bounds [] ->> -endobj -930 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1138 0 R] -/Bounds [] ->> -endobj -931 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1139 0 R] -/Bounds [] ->> -endobj -932 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1140 0 R] -/Bounds [] ->> -endobj -933 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1141 0 R] -/Bounds [] ->> -endobj -934 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1142 0 R] -/Bounds [] ->> -endobj -935 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1143 0 R] -/Bounds [] ->> -endobj -936 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1144 0 R] -/Bounds [] ->> -endobj -937 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1145 0 R] -/Bounds [] ->> -endobj -938 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1146 0 R] -/Bounds [] ->> -endobj -939 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1147 0 R] -/Bounds [] ->> -endobj -940 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1148 0 R] -/Bounds [] ->> -endobj -941 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1149 0 R] -/Bounds [] ->> -endobj -942 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1150 0 R] -/Bounds [] ->> -endobj -943 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1151 0 R] -/Bounds [] ->> -endobj -944 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1152 0 R] -/Bounds [] ->> -endobj -945 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1153 0 R] -/Bounds [] ->> -endobj -946 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1154 0 R] -/Bounds [] ->> -endobj -947 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1155 0 R] -/Bounds [] ->> -endobj -948 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1156 0 R] -/Bounds [] ->> -endobj -949 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1157 0 R] -/Bounds [] ->> -endobj -950 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1158 0 R] -/Bounds [] ->> -endobj -951 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1159 0 R] -/Bounds [] ->> -endobj -952 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1160 0 R] -/Bounds [] ->> -endobj -953 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1161 0 R] -/Bounds [] ->> -endobj -954 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1162 0 R] -/Bounds [] ->> -endobj -955 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1163 0 R] -/Bounds [] ->> -endobj -956 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1164 0 R] -/Bounds [] ->> -endobj -957 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1165 0 R] -/Bounds [] ->> -endobj -958 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1166 0 R] -/Bounds [] ->> -endobj -959 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1167 0 R] -/Bounds [] ->> -endobj -960 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1168 0 R] -/Bounds [] ->> -endobj -961 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1169 0 R] -/Bounds [] ->> -endobj -962 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1170 0 R] -/Bounds [] ->> -endobj -963 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1171 0 R] -/Bounds [] ->> -endobj -964 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1172 0 R] -/Bounds [] ->> -endobj -965 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1173 0 R] -/Bounds [] ->> -endobj -966 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1174 0 R] -/Bounds [] ->> -endobj -967 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1175 0 R] -/Bounds [] ->> -endobj -968 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1176 0 R] -/Bounds [] ->> -endobj -969 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1177 0 R] -/Bounds [] ->> -endobj -970 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1178 0 R] -/Bounds [] ->> -endobj -971 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1179 0 R] -/Bounds [] ->> -endobj -972 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1180 0 R] -/Bounds [] ->> -endobj -973 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1181 0 R] -/Bounds [] ->> -endobj -974 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1182 0 R] -/Bounds [] ->> -endobj -975 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1183 0 R] -/Bounds [] ->> -endobj -976 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1184 0 R] -/Bounds [] ->> -endobj -977 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1185 0 R] -/Bounds [] ->> -endobj -978 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1186 0 R] -/Bounds [] ->> -endobj -979 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1187 0 R] -/Bounds [] ->> -endobj -980 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1188 0 R] -/Bounds [] ->> -endobj -981 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1189 0 R] -/Bounds [] ->> -endobj -982 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1190 0 R] -/Bounds [] ->> -endobj -983 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1191 0 R] -/Bounds [] ->> -endobj -984 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1192 0 R] -/Bounds [] ->> -endobj -985 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1193 0 R] -/Bounds [] ->> -endobj -986 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1194 0 R] -/Bounds [] ->> -endobj -987 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1195 0 R] -/Bounds [] ->> -endobj -988 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1196 0 R] -/Bounds [] ->> -endobj -989 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1197 0 R] -/Bounds [] ->> -endobj -990 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1198 0 R] -/Bounds [] ->> -endobj -991 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1199 0 R] -/Bounds [] ->> -endobj -992 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1200 0 R] -/Bounds [] ->> -endobj -993 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1201 0 R] -/Bounds [] ->> -endobj -994 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1202 0 R] -/Bounds [] ->> -endobj -995 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1203 0 R] -/Bounds [] ->> -endobj -996 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1204 0 R] -/Bounds [] ->> -endobj -997 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1205 0 R] -/Bounds [] ->> -endobj -998 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1206 0 R] -/Bounds [] ->> -endobj -999 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1207 0 R] -/Bounds [] ->> -endobj -1000 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1208 0 R] -/Bounds [] ->> -endobj -1001 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1209 0 R] -/Bounds [] ->> -endobj -1002 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1210 0 R] -/Bounds [] ->> -endobj -1003 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1211 0 R] -/Bounds [] ->> -endobj -1004 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1212 0 R] -/Bounds [] ->> -endobj -1005 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1213 0 R] -/Bounds [] ->> -endobj -1006 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1214 0 R] -/Bounds [] ->> -endobj -1007 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1215 0 R] -/Bounds [] ->> -endobj -1008 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1216 0 R] -/Bounds [] ->> -endobj -1009 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1217 0 R] -/Bounds [] ->> -endobj -1010 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1218 0 R] -/Bounds [] ->> -endobj -1011 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1219 0 R] -/Bounds [] ->> -endobj -1012 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1220 0 R] -/Bounds [] ->> -endobj -1013 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1221 0 R] -/Bounds [] ->> -endobj -1014 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1222 0 R] -/Bounds [] ->> -endobj -1015 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1223 0 R] -/Bounds [] ->> -endobj -1016 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1224 0 R] -/Bounds [] ->> -endobj -1017 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1225 0 R] -/Bounds [] ->> -endobj -1018 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1226 0 R] -/Bounds [] ->> -endobj -1019 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1227 0 R] -/Bounds [] ->> -endobj -1020 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1228 0 R] -/Bounds [] ->> -endobj -1021 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1229 0 R] -/Bounds [] ->> -endobj -1022 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1230 0 R] -/Bounds [] ->> -endobj -1023 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1231 0 R] -/Bounds [] ->> -endobj -1024 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1232 0 R] -/Bounds [] ->> -endobj -1025 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1233 0 R] -/Bounds [] ->> -endobj -1026 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1234 0 R] -/Bounds [] ->> -endobj -1027 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1235 0 R] -/Bounds [] ->> -endobj -1028 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1236 0 R] -/Bounds [] ->> -endobj -1029 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1237 0 R] -/Bounds [] ->> -endobj -1030 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1238 0 R] -/Bounds [] ->> -endobj -1031 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1239 0 R] -/Bounds [] ->> -endobj -1032 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1240 0 R] -/Bounds [] ->> -endobj -1033 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1241 0 R] -/Bounds [] ->> -endobj -1034 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1242 0 R] -/Bounds [] ->> -endobj -1035 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1243 0 R] -/Bounds [] ->> -endobj -1036 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1244 0 R] -/Bounds [] ->> -endobj -1037 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1245 0 R] -/Bounds [] ->> -endobj -1038 0 obj -<< -/Length 2574 -/Filter /FlateDecode -/N 3 ->> -stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km -endstream -endobj -1039 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OAg4 be2,u„yŘH2;Evy69^XgYILH\`c+$88(=}/=]7;ZN4n~E풪svJ6gY)Xx5735#"HkI!&I@?&&#*%,ሃ[a@ -endstream -endobj -1040 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOAߟP UӊaƜSscFQC -%~|/ʲͰINJfbd`gceaIANF#V4nAA2fbltMQϫ9 Y5sRg$O'DDd~a -endstream -endobj -1041 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA߮a CVUrz^atk9B#}ġΡ_ȮĶF`S7:*OeEyGf1Q&aB  ӽޯyuEs$;u5+ e3 񌒑AO^GNKVCF͓ q bL -endstream -endobj -1042 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA?IV-Lj:cZϕ#YG͛(kj*K-˳{'wmM$R I`g0b1AN=;ڷnh^Ӹn%U U3e#%E=y9#JcR*G$r b -endstream -endobj -1043 0 obj -<< -/Length 57 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H7ڍ B*'[1G3mB kc -endstream -endobj -1044 0 obj -<< -/Length 49 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hڅ܉`oǍ7L"-їP` k -endstream -endobj -1045 0 obj -<< -/Length 39 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hs'qhcAߑ6|V@k -endstream -endobj -1046 0 obj -<< -/Length 33 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H^s'h>c;چF)l6 -endstream -endobj -1047 0 obj -<< -/Length 25 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HVX<: 7l -endstream -endobj -1048 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߰߯ܭ۫۫٩ب֦եդҢѡПϞΜ̛˙ʘȗǖƔœÑ ~}{{ `3 -endstream -endobj -1049 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߰߯ޮܬ۫٩با֦դԣҢѠϟΝΜ̛˙ɘȖǖƔĒѐ - }| `| -endstream -endobj -1050 0 obj -<< -/Length 204 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OAѯVSK{X+,knyyj,ZZ,X9cqQ'y9YziI: cF O o׼:yفlGQtAJSOXH2> -stream -HK/2J2s`) MQILL4"̙{:"HHBR$2|Ģ˟oyy:5LK|2e=[Q(/0k!]x\?G - <4OisQ;l_)V VYx-gYϚ72Gi3uHe`;S zh:,a( -endstream -endobj -1052 0 obj -<< -/Length 200 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /BѯUS \M #ZXd ]nSݒe+ 3n2n0VT-SWY3xM9Ɠc0!ܞ=sD琛\qKOkKm.{<6np좴NIAΙM3k2eHF\.LEsڐY  Ga~ -endstream -endobj -1053 0 obj -<< -/Length 178 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O2d"+V9rsMƔ"z"<,;mMu8W~#B4WO?/c#7CC'O>йmeyGw jf&T ()kiȪTJ2 -җd$$.K=#,_|cb -endstream -endobj -1054 0 obj -<< -/Length 176 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OueE˵0Hss12WzK99)1!>_]]mMuU,}̼L=LL\]  >YZih|anJUϏ e %53y%9Gܓ#~K5 a1+" c -endstream -endobj -1055 0 obj -<< -/Length 177 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OAQs+esX/=ɕQ93RlIlDV1Q~~_XD -1 2 03120t3pws}>i?Ѳ|=;jVTn([0S2Q4R4PГ&#{E)-$5Hj$oJg -brr^Od 0&dQ -endstream -endobj -1056 0 obj -<< -/Length 177 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOм!bʔ%;R9E7BM<{¶ʶ¿̦̟ouqg'E=-if)7|%fr@39óA(SzaBtNh|DGKÓŅzHŁlFيdA2S:h`` / 0Jd -endstream -endobj -1057 0 obj -<< -/Length 176 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiSQFn Ck0ֶkD1nr6y..VOf#~c-b%JLxeg'4$8(0?{LGK÷{D{RdhJB.x?G=C=%k&cB1>A>F:B2 I" `meh -endstream -endobj -1058 0 obj -<< -/Length 170 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOqJ5bLˑur&W2W25ǾϞ;ssSI<8Hsl3lObd`*.XFyaafA&~>y/C8pws}A·Eli=R}GGQ|KIKQCAt"$*e -endstream -endobj -1059 0 obj -<< -/Length 169 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOqbVއy3u/T;ywBZgWcgjFuE\e" V+=;&YFiF)$8[:״h_Һf 3#,vJ/ cG<EÇq~EFq!;f| -endstream -endobj -1060 0 obj -<< -/Length 170 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H SaRQ\Sc)wm, -I6vy:!a* -lo ^`'**we̓,gi -vd kW0K|Q(~}m734\4Nx?(;HlTxR`f -endstream -endobj -1061 0 obj -<< -/Length 162 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H K1TQHT̃BGV(n>v2M\~S19tWXPWv/lٖ扵JcYdY`(,Oi{iSL|%g;~ʛuu0 J?B/LO  -%M? 5/5Í +g -endstream -endobj -1062 0 obj -<< -/Length 161 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H…NBa_A2rhƝrҭĕs-s9q8J E5eafbd7O\\_>,C,< cg^O <]\t(;m+- -3M3G&jFz*:C_+h -endstream -endobj -1063 0 obj -<< -/Length 199 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‹O_VKl+L,eZbgg']tmVKT+1߾ƴDe2*3c/W_7ONvV8_1>Dޣ4oa^x |3TOЂhT<P?C9@rOCM~oƥ:3}9O$W ҦQ0M$Zע`1_7a -endstream -endobj -1064 0 obj -<< -/Length 196 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA_&SiʬV+ṯ!{-ce\+s4߾IJBd.20-W$8(0 M?E?O^^_!>|xi{h=tӼqGW銚Nmx:%o%g!kY˘e&yʸ> -stream -H /&gZ5b7Xbe,N%.]3-sCanÐy l&?&_|^L_-qOx-9S£̃!m]nq8{\rC3Ec˭Iu8z } -e*K-RE=ꂷ4?t*pa<;fƲG %4)TOdb| -endstream -endobj -1066 0 obj -<< -/Length 194 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H KObJ.J@CEy0\0$%+Bh7ט?2S֘(U -2"}D7_ 4?"I|iҺ=L#D#[W?/7ԯ|hh> -stream -H‹Oizk=T2j1S׹:ղ^XBZ߾P緆a^]aPГ,(x?Vf/)xJQRfccaMhAT(Q|^˙*NVldm/,Ms 3Yaqr 0c. -endstream -endobj -1068 0 obj -<< -/Length 189 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA_X1r4cr_y5VˤDLaY|V;""u5U~*K̊L |12f3ŇH`= F z缞rJ(0O<yhi"yup!:;SQR9Oi. yF,˚"mPvTIS_i5c -endstream -endobj -1069 0 obj -<< -/Length 184 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA_,^JQ,15xXQcm%5E6"%EV~,s,|gJ0312fA~^n^o. ';근:H7TyBQRdhFpγ )aT8QƵر:z 0c -endstream -endobj -1070 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOכ3DUJ09w^w.cyf 2k[fWb--)ɳβʰX,,)fIL_$>3DGKjܼߡݢPuQqQvR -ՁjGDQ352ҹ^<;L ct2*d8 -endstream -endobj -1071 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA៴#a(9<=^sUαs,}C2{;;[MuUeEyYY?LbL# _Bt|?KCM#jvj|!ېT,-HH7͈&D#5Y-"9I]*ӄ,~q~`1d -endstream -endobj -1072 0 obj -<< -/Length 175 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‹k߰6^zt=ti#44Hv$-5+U 3J&F -򆫜^%ԂN^K:d -endstream -endobj -1073 0 obj -<< -/Length 157 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡nA߁*ym%f.JVksѸFQ#ɹskk˛h -endstream -endobj -1074 0 obj -<< -/Length 151 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡nAJQ#X!h{S\F;9*_(s/[kA^s?-)$v 8jmMT#*2"gcceau3r1r2~3p0ӷѳkcILLD(jRѣK` i -endstream -endobj -1075 0 obj -<< -/Length 140 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H -@wc؊X(݁kw~ʧ"e^%%Eysgd9I`ۨDX*2(#gnj'cQv M- 0vi -endstream -endobj -1076 0 obj -<< -/Length 141 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H`!*V{ -1jTh}c#vpOl`7ـ!pVf fy>p!FFIc#xUKQB܏U/T S j5 -endstream -endobj -1077 0 obj -<< -/Length 136 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiB9 0' 7ெw]vT8~a`7*+5pe\dk|C%Xpwyls:ff -`CR"zz s(O#`j -endstream -endobj -1078 0 obj -<< -/Length 135 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H`bbOԨM{ooO~mjlh{CҮaW嵂U*qQ<ǜtzcK akK -endstream -endobj -1079 0 obj -<< -/Length 129 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HWP(v4N,_A1*X{d" ќÙ:߄&>&c#C~ ˏlĥq58VPf}wEcZfJd;[RƱ1 k -endstream -endobj -1080 0 obj -<< -/Length 124 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,P]-v슁X ,$$k%163S~N8#!n}\{S-oؗUxvpKpd<2VV1Rl[ -endstream -endobj -1081 0 obj -<< -/Length 123 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‰P_d%_ $;%ww5||朹H]|gQ 1F}~6=ܻE 7k/->7cZDXA6WxW歮%6 Vl -endstream -endobj -1082 0 obj -<< -/Length 111 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‹B`/&ˡ! -SjB="#Hw8'_އ5+z]8TۼॉW_沊~a{mu -endstream -endobj -1083 0 obj -<< -/Length 177 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HyKpZ]hL4osNF#5oLԒ\nةVa[ƦO"++<_Yfif)I& / c |J%zb7G {;BbvPl`04ѯ}h^K((gNPP9rCgea -endstream -endobj -1084 0 obj -<< -/Length 166 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H{kAq{in!D6zpD؆Xj\\UXXPa_f+YX|//.rf0K3M1I?qc|EF0z=G};hOZM ՍfjblAydF6!)>n e -endstream -endobj -1085 0 obj -<< -/Length 169 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰n_\qL}VMl A\A|rUƳI(pho_ʶ¦̦ĺȺ*2""<<,4a01e1B|y|МhoWg$;'Dၦf3 -endstream -endobj -1086 0 obj -<< -/Length 163 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H o`3Ĥ2g0mW -܋s\\\t: -GpٗdW6yr2o}yYiI;#1D鿉0[4}4^0<nBw;> -stream -H,‹N`KVl%oj5Ye5FEʿyv[ W*OW[nSCf# -߰fqż.1x;,a)OY>38D'hqJ~Fg -endstream -endobj -1088 0 obj -<< -/Length 162 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H o`a1q!&s+ZFhʔO{=sVW98*X2]~;<šAb/࣎Yì^(av:*'.,3,4DO8Z -8"¼9C~><(d7 Tg} -endstream -endobj -1089 0 obj -<< -/Length 148 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, a2#{D\f㓧GW;m -/gS| (g -endstream -endobj -1090 0 obj -<< -/Length 148 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡ -A_ B5" Dkm_ʻ!_u^5U -{{[kkKsScc}mBnrce00'G^n.wʞCvtlhV4liQMF~ )hQ -endstream -endobj -1091 0 obj -<< -/Length 150 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, o q HQUL8戫[hO[ak\;\nm<596[* -fSG廄Q(S*l9Vr$Yif|4$8.G1>>0,C-k~C{t/Hh -endstream -endobj -1092 0 obj -<< -/Length 138 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‡ -ACff{F\#7.7~5 -2"<> -stream -H,‹P#bB%&oP^ -Wt,KMs\?gH'\>1.#.C!>Çow9kZH-:`m -endstream -endobj -1094 0 obj -<< -/Length 101 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4‰B`/d$YAyTv3י#r7W}bb#B}y[665~g6xo5zxbqO~. n -endstream -endobj -1095 0 obj -<< -/Length 96 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|X]To -endstream -endobj -1096 0 obj -<< -/Length 88 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD03I>: r :(=e$%VQs<2}&/\RBѧQ~{զV16z%Uo -endstream -endobj -1097 0 obj -<< -/Length 81 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HL0 QeЭ\N *%oN)>=[׈/٧'x|;xPm[3 hU> )Yp+ -endstream -endobj -1098 0 obj -<< -/Length 74 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT‡ @ʎ% `/ihǻljanw)̟s2;Mtc:F#Lp -endstream -endobj -1099 0 obj -<< -/Length 74 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT [ -8%pUˡj>cr`: \n2Yѵd"g -0qqH -endstream -endobj -1100 0 obj -<< -/Length 68 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H\W P8e,B1 $oOS߳#䁸GWͯ[ צTy`q -endstream -endobj -1101 0 obj -<< -/Length 59 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hl @Ay5Bf'=7pwY5IQ(#s0BrY -endstream -endobj -1102 0 obj -<< -/Length 54 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Ht ?M]P>e.w&NhN[jJr -endstream -endobj -1103 0 obj -<< -/Length 63 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hl н͢*Gav}󂅐n)ߵ^ʇ{k5éSI> rn -endstream -endobj -1104 0 obj -<< -/Length 57 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?].#пK0tŁ\~guł~NC0~ 5r -endstream -endobj -1105 0 obj -<< -/Length 46 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?].Et/s}~ÆDsX -endstream -endobj -1106 0 obj -<< -/Length 43 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]!]FG.aX_џ DA9s -endstream -endobj -1107 0 obj -<< -/Length 32 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?2B:]$ -t7 -endstream -endobj -1108 0 obj -<< -/Length 26 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?.t^2%IXt -endstream -endobj -1109 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?~}zxvsqol j -h f c `^\YWTQ c -endstream -endobj -1110 0 obj -<< -/Length 136 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, -@w{X݁.ZhM:|VZA-({[k^^r2䐐8(\XY'^&nF.9tJŁb}+} =$;_m=-0i -endstream -endobj -1111 0 obj -<< -/Length 139 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, dwfENct0-&zwW]>k> -stream -H,‹ -`&& 36ȝ22b?r:‚Cwxxkη:U.8e8%>88-`m7Ӽy)cyg LO> -stream -H,`o"f=h46%iK?#1!Nvv6^ -?x4جÔqq¨̗E<98dx]o$J2Z ZVPCguj -endstream -endobj -1114 0 obj -<< -/Length 133 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HP_ 5k/B̒ ד#,)``>{xu> -stream -H,PŖڤ?jB|'7K壿;[i4xuj{U*.cE.j^L&߬eئ٤:)VUL. 0Gg9 3 1F~9` Lk -endstream -endobj -1116 0 obj -<< -/Length 118 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$QE?Cmg;(1ZYX;~wm=͖MUu5]eK<u,>]V 7iS\%Lpa5q4I'*Dl5 -endstream -endobj -1117 0 obj -<< -/Length 116 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‰c_C -&ehZtΜll-WHHHdlsd9M9'?Eh{¯1?G!Joqԕ|h&:5Ux[fT 0Gl -endstream -endobj -1118 0 obj -<< -/Length 118 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‰@} -%rT捹. [J,9DŽ&|C\Dg'Iqڼo!jrP:vU+elKFOc m -endstream -endobj -1119 0 obj -<< -/Length 117 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4PE8j -/ggd }>>Znr 7RsMOU=VLW+EEt5-Vˌ.Q7dY\$W}m -endstream -endobj -1120 0 obj -<< -/Length 43 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]пKE9t: s -endstream -endobj -1121 0 obj -<< -/Length 33 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?2CIC..^ Bt -endstream -endobj -1122 0 obj -<< -/Length 26 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?.tLC :tx -endstream -endobj -1123 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧ٣ס֟Ӝљϗ͕˒ɏǍŋÉ|zxvsqomjhfda_ ] [ -X W U S P O M K H F E CA? 0Q -endstream -endobj -1124 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪܧڤآנԝқИΖ͔ʑȎƌĊ‡~|ywurpnljhfca_ ] [ -X W U S P O M K I G E CA [TRn -endstream -endobj -1125 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ݨۦ٣ס֟Ӝљϗ͕˒ɐǎŋÉ}{ywurpnljheca_ ] [ -X W U S Q O M K I G F D  6S -endstream -endobj -1126 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآ֟ԝқИΖ͔ʑɏƌĊÈ}{xvtrpnljgeca_ ] [ -Y -W U S Q P N L J H F  S -endstream -endobj -1127 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݧۦأנԞӜљϗ͕˒ɐȎƌĊ‡~|zxvsqonligeca_ ] [ -Y -W V T R P N L J H  ٽT< -endstream -endobj -1128 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ݨۦ٣ס֟ԝқИΖ͔ʑɏǍŋÉ~|zxvsqomkigeca_ ] [ -Y -W V T R P O M K  AT -endstream -endobj -1129 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآנԞӜљϗ͕̓ɐȎƌĊÈ}{ywusqomljhfdb` ^ \ -Z -X W U S Q O N  )Uq -endstream -endobj -1130 0 obj -<< -/Length 111 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4@H 5>!Th ;g9}~SrK?_1sC]SCz_[}\y;b1k^ c~ZBiP?to_km -endstream -endobj -1131 0 obj -<< -/Length 104 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4D)(yUb$; +iAgD@kW~p/oi5rMoT+,e ^``no -endstream -endobj -1132 0 obj -<< -/Length 104 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H<0# h5X@"G›gOfg+xj<%B634 -z' -iQ8G4Gdn -endstream -endobj -1133 0 obj -<< -/Length 97 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD BP31D%$Ւ}c==1=;X@/]ix់zFQx[KGn ya`oR -endstream -endobj -1134 0 obj -<< -/Length 86 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD… @ ?t !p;R|#pVϢK'6,nB5{[ZTq#o -endstream -endobj -1135 0 obj -<< -/Length 86 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD… R1ꮔpBk\sw^) G$ llW6_=ureƿ [v[VFO*p3 -endstream -endobj -1136 0 obj -<< -/Length 78 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT YnE)/zPŲYۏU҂9|h7|}H$p -endstream -endobj -1137 0 obj -<< -/Length 74 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT@0wkQAY@״峰[FS&TaQ؞HCuѾ\ c]q -endstream -endobj -1138 0 obj -<< -/Length 73 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT ذDaH_N;ugWǶ*<,cC+q/ӭ`s|Oq -endstream -endobj -1139 0 obj -<< -/Length 66 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HdQPLTI`M8 ۿWx%}$s/ONq -endstream -endobj -1140 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ݨۦ٣ס֟ԝқИΖ͔˒ɐȎƌĊ‡}{ywusqonljhfdb`^ \ -Z -X W U S Q P  XV -endstream -endobj -1141 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآנ՞ӜҚИΖ͔ʑɏǍŋÉ}{ywusqonljhfdb`_ ] [ -Y -W V T R  V -endstream -endobj -1142 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݨۦ٣ס֟ԝӛљϗ͕̓ɐɏǍŋÉ}{ywusqpnljhgeca_ ] [ -Z -X W U  7WD -endstream -endobj -1143 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآס֟ӜқИΖ͔˒ɐȎƌŋÉ}{ywvsrpnmkigedb`^ \ -Z -Y -W  ٔW -endstream -endobj -1144 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݨۦ٣آנԝӜҚИΖ͔ʑɐȎƌĊÉ}{yxvtrpomkjhfdba_ ] [ -Z - 2X -endstream -endobj -1145 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤ٣ס֟ԝӛљϗΕ͔ʑɏȎƌĊÉ}{zxvurqonljhgecb`^ \ - 1Y# -endstream -endobj -1146 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݨۦڤآנ֟Ӝқљϗ͕̓ʑɏȎƌĊÉ}|zxwusqpnmkihfdca_  `Y -endstream -endobj -1147 0 obj -<< -/Length 203 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@6R% B#ĈHth)**QjJ)E%! -[:2?*%.Ty?MLk,4χ<%h4> -stream -HJ@||Q$"$QJ"Fɘ([FJij$FEHL0+wuz'wS>5>zH7MG-Y)I+A}hĨGPݥ607[׹Z -erA-9Y$uue"yFHҴUĄ=tV[ -endstream -endobj -1149 0 obj -<< -/Length 196 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H kAϮ-2ɲ֚&<2l D-s2E/s2yfd"210 3 rtpuG׼_Qt9gOɝ>&eD҈xh@Г=>{v WK^̣MsC` \I -endstream -endobj -1150 0 obj -<< -/Length 196 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H/яfVcceYf5cdiWRW.1iVVƚ'&cC yWs2tt/h|ӌ!ш.vkcajGTyQ9 .[oR@ s맰Fǵ*.,,Z 9Oƒ<<˙if"<)!b 0@$] -endstream -endobj -1151 0 obj -<< -/Length 193 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA_,ee iѦ5Ŝ#y<{1 c9,%U"{~LLwr ''3G+.y9m/Oݴhp!; #9TlT-LG Փ9 f -]bj";U7-ſo] -endstream -endobj -1152 0 obj -<< -/Length 192 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /᷿lVV1MkYh;Cׇ[r"&K Sư|tna[|UHo* -/%e"O"mqI7m7\gZrIg+qN1h,Ǩ/PR26K9 aA~${^v=n -.v' ^W -endstream -endobj -1153 0 obj -<< -/Length 185 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OO4-cZ14b&Be45x]]: -"<Y~3,D~R|'ŘF3 #7;F zxEIANƓ5M 3+TL /ȝEԐVRP8#@8%vBT΃1a)# 0 _ -endstream -endobj -1154 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOߟmb&&3MiG^w71# ͳV5 }߾žζ_oUF-S:ϗJ3G4G ḅ"LLz0 @O4<_Qzr@#QQRtJތtx`B05ѓ>"uHRGBK_ -endstream -endobj -1155 0 obj -<< -/Length 182 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O3bŒ1L-S劐|Ṯ.YgWc'}fSf]bUeY~S3K0103 -1 2ѻ{ _^>=|\~EMEI󒆃oyQ=C8E8blLDH@^O-i Cj*Jb -r"2%E(>`q -endstream -endobj -1156 0 obj -<< -/Length 180 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O12a)[1b0D35BcCb9TTXP^`/6oMuUeEWQ#BLLL|0~fcM#v>iѰQjbldxC` ']KVC抷KjR*J -rb2bR"b"BUua' -endstream -endobj -1157 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA߿N+dX#j9s2QX1WC&|ߡAb_Nd+WdS`gc72yYiI  ?~} <@//m7w\44|ynvCŊdAld͈x`@SQВא$&sAZEꜤSb'DDd$a -endstream -endobj -1158 0 obj -<< -/Length 179 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OsaV0Hs_9Qm#dʩ©_oC}}]4$8(,"BLLL}< 9:ih==;V-̼()xUAxEᒼ )q 11/" b -endstream -endobj -1159 0 obj -<< -/Length 179 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA\hu0jēcO#!̕|TF*/cO7O$_/llqV,,"|>13 1 2 03120p3pw{c=;и튺%9Zgd4դT$$NNˉ;"* > -stream -HOA/:13-/{Fc+KdvE -e+C`bU8Qa!fwLL| !dD2ӓ!j5dHF8 _c -endstream -endobj -1161 0 obj -<< -/Length 178 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OAIE9ZYG9r3˱}"}}]?m$kuUeE ?fL<~ŒB|ysuqvrдӰQRP5S1vCH@IOAGAtM^CNM -񂴒Wsgr'e?7d -endstream -endobj -1162 0 obj -<< -/Length 172 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOq&9b9j+u{T$r99 rgKmM+/&X%XED 31 2 03120t'\:8hӺianvKBLDHF0 둯)kiȪ\!.yW  q er -endstream -endobj -1163 0 obj -<< -/Length 172 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiS b"L*k(vȑsl9:X4VgWaWBPl ?: %2]M;W#(;>"ȷa7^1dpA?D/Hnw?3:>^ZpSwꤶLA΋dE )(:r 0f1 -endstream -endobj -1164 0 obj -<< -/Length 169 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Sabdr4GQE"ǢiIfiyvl+l_f#Q\=`0,-XaVL2M0ݠТ|Dx31: 2F _ѻ킎9.化XR=+((#`f -endstream -endobj -1165 0 obj -<< -/Length 159 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡nQ"6AЊ+ߦjj=9*2/WI|y[kKKZOqNrJrLps ߬B,,,}|LL> -stream -H Sa%9R;a*q*3ϩ©̱d.W7!>.+n3llY+ g$FiI820= ~>{;4ķՃz˗ kŇC_Qf6+e g, hW -endstream -endobj -1167 0 obj -<< -/Length 155 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Ho 5⌳BTcTko68ɣ7_kM^Uo<9S1!>..6&!c|>ɏ(0KY1$cea2P9:*+䫕E̴h 0_i -endstream -endobj -1168 0 obj -<< -/Length 142 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H -@wc؍(`Zݹau5wWgG{A咑4'ucC}Bbll"rf %NFj; @mogk=m=-ljih 04i -endstream -endobj -1169 0 obj -<< -/Length 139 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HE@wA -).ŊK:ے|7x&Uyp/s+kkK1)1#4zC}BrcZ-bdd`gc337SQaQm ,o=j -endstream -endobj -1170 0 obj -<< -/Length 51 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]ѿK"vv - CbG?OcG?N# r -endstream -endobj -1171 0 obj -<< -/Length 42 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]пKxE9,7*u s -endstream -endobj -1172 0 obj -<< -/Length 29 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?.S]]ć .ltM -endstream -endobj -1173 0 obj -<< -/Length 159 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H0J8 R]@Fmێ+|^88yX?n`ۏM?nͯhiO&.iT $-pG9DaDb͋T7T%DDL ;w߾ -U[PXyqr) -endstream -endobj -1174 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߭ޫݩܨۧڦأע֡՟ԝӜћЙϘΖ͕̓ʒɐȏǎƍĊ É ˆ ~||zxw >` -endstream -endobj -1175 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ުݨۧڦ٤أס֠՞ӜҜњИϗΖ̔˓ʒɐȎǍƌ Ċ É ‡ ~|{zx 2` -endstream -endobj -1176 0 obj -<< -/Length 132 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H`DjWFc_Z &ij:=]:|k*[& Vq}" -P9,ޤyJ&Nc)c"X0RL4?kW -endstream -endobj -1177 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ުݩܧۦڤ٣ءנ՟ԝӜҚљИϖἘ˒ʑȏȎǍƋ Ċ È ‡ ~~|{y Ia -endstream -endobj -1178 0 obj -<< -/Length 127 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰`B Mm4b> -stream -H /oihB_kƘKV-YZjZ}_+Z0ްʰ_?|eb=[(/aC<x<zxhrsIIcl\ns&gS]bldh`$o#Y0:֎VƓˢf"G&#SyIhn&TRRSȏf #xa= -endstream -endobj -1180 0 obj -<< -/Length 117 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,@E4=tt2f.32(G#~}| wyoof7uyT=/qWM>:U^Z^JK;I7!7_Ql -endstream -endobj -1181 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߩިܦۥڤ٣ءנ֞ԝӛӛҙИϖἘ˒ˑʐȎȍNj Ɗ -ĉ Ĉ Æ }| /?as -endstream -endobj -1182 0 obj -<< -/Length 112 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4@sD$* b!Oc1 R5*!%\s?|1# UgyGG/l>y]i6r-m -endstream -endobj -1183 0 obj -<< -/Length 204 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /Bѯ)SG~o X--LaJq+n鶲a194=-m  ~|_χ3^> -stream -H4‹`(SdBFCPI7v3GݠPC">z'۳l\9|hjCEaxOS+,?kt`nQ -endstream -endobj -1185 0 obj -<< -/Length 96 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|ۼ<]1o -endstream -endobj -1186 0 obj -<< -/Length 84 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD@0ȨУ"gngE Q-kL9ەGՁƽ7S huh`Ro -endstream -endobj -1187 0 obj -<< -/Length 79 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD HÆ]O w-qOVx+}J:J r\37%A?0G> -stream -HT @ зu$D$2g@wپoVU¥ -8dx -sNqT -endstream -endobj -1189 0 obj -<< -/Length 63 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H\ 1ph+ -~h7މq#=7<߇֕E,`r -endstream -endobj -1190 0 obj -<< -/Length 201 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /BobafhҢѰhcXVzܺw=%4ZZYΙ> -stream -H OAOaSR-ZZ5rha$ J4gggO7OoCAq>b(o^/x9s)O'ixH>0=BԃR.@Oe{v7MN uE1q6)*UjyJ\Rm&a$,ڸY[¼dMXb -endstream -endobj -1192 0 obj -<< -/Length 199 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O7,J\ZZh)SF1$G4Y,V&Ʉ.W'waA~0!:-4/hv)/.N*'TyvP>tHΓ -<77qFrrd6 Qj]I4&NEQZ5^Z )K EHQ*b& -endstream -endobj -1193 0 obj -<< -/Length 197 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OA/VhTjԬEZ2hռ].dj12 svKEF"~sd0L1L0яҋ {I93ZA儦1u7G<x@EIu=**vwۡMƭMD̕IRؐgsƹAYWyAL.+:U\,FK^b\ -endstream -endobj -1194 0 obj -<< -/Length 197 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H ‹/_&uXjX1)F-by5nI5y~3K?G^#Py?#^ty>Axq. ZmhlRߠΕK5j\p쿇2U7%ʋ\(8Mӹܬ9;3NO&GKbBu\TDf`hVb -endstream -endobj -1195 0 obj -<< -/Length 194 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OWKH՚4Y,DS +-5,w[-GSQzfbdK30 J?G ottNhy:! yrSߣˣ> -stream -H ‰OAM)jRba-Ԩu,{!re4Zj $"8(~t/9 -/-cGiR;O]JNJw(nţ&9 Y3 &Rܭqk$*VaJ\V28]kU:0/{sb -endstream -endobj -1197 0 obj -<< -/Length 191 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Oᗆ2Yiֵs>+T:itϞa(}0!~|K9gvBZ44xNvnuכ7(S4S0Q073]#'Jj2 J#kbKZQɄiaa& )c( -endstream -endobj -1198 0 obj -<< -/Length 193 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‹/GY)V,b%h0XDݝӺVE$j]/CUQ$"4K:)$F#N;93ZQ|0Cxe.;TnQ">HyuJkܭrf2%r^E2dFݣ{Lu+ez圐6izRO 0cW -endstream -endobj -1199 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OW)*bb[d9J9rWd 왧% -řG3cax~5!zAzWнs>=ܴ\44Ψ.PQRP:h``$D@dY˓zq$ZIﬦZbk]ܔ -X0c -endstream -endobj -1200 0 obj -<< -/Length 185 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA"!̑kc&yMRjDX۷|de!0Yi4;&)~nNd|(|y1ҿwN)o'Fx |D ihyipDr R[S=@!S٣KJBѼCy*m) c -endstream -endobj -1201 0 obj -<< -/Length 175 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OAab„ƒaVɔu:!ae1 \X{'6u5[i)fILoę\u88(" B b^]?/^|3Z.yJANFDZXx3S7Q:hԼV^$P`c -endstream -endobj -1202 0 obj -<< -/Length 174 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Oc#цkU}M۰ -{s3%&ؾyeUU(Gafbbd/120r3cbcc}MD󊆑OZaUCE%se%%EQ.:/y$d+ -endstream -endobj -1203 0 obj -<< -/Length 172 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Oqӈ4Tbja\SF6Rj2gw ykWa̮̾M#y,-S_IIqqJ%s-Wh 8j1B/wHTQtt>d/3Z|titq,;ipf+Sb6 0dd -endstream -endobj -1204 0 obj -<< -/Length 174 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HO/B[ɣWL_$] sט>Hb,&'1QPoQ(a!A7k~|Z/ɍtŷ%]'_E>EZ6>M+ u@ c*G-̼xƽYd -endstream -endobj -1205 0 obj -<< -/Length 168 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HSaB>䣖ֶCiwȑ3gqo]=.SWEysY _i{Z;qq> -stream -HSaQܹR+Zl,!`D}yNe%Eyq._mW~ӬS_X%Y=| P1f{wDDkC|2 03xQ<\ 5]lېHW|^ҲкiCkqN( TTϨ`e# -endstream -endobj -1207 0 obj -<< -/Length 160 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HWsQ -F"e6-yː9ܾkKKs5)I>~w6kUeL\DG1 3} 1 203xQ<šw{,l4-44Lԍb@ՀGQyDY]ea -endstream -endobj -1208 0 obj -<< -/Length 151 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiS0!!qK9u5"R\Te%ES`9`.%I6olr22gEX! 30I͋aȍC'?ҳ&߭tXP(&'e -endstream -endobj -1209 0 obj -<< -/Length 145 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HƒQ ۵l mcq뿝oo̻īȳ >V^qn.q&v&6VFqhfhb`oѕjhhiIU44de -endstream -endobj -1210 0 obj -<< -/Length 150 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$N@v%{ʔ) - -"ETRV) ˻ X=ybav9[xŨaTW_^d"Zm=ڞ7-W)$je\XDY<0J% Or^) f+ -endstream -endobj -1211 0 obj -<< -/Length 138 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H -'n1fn5[pے&|xUy*<2Z[XZ912ȉbbdw0m,tf:& "fa -endstream -endobj -1212 0 obj -<< -/Length 134 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡P 6-BZQOPiBH=9)>x9G^.:jp۸p 4q®XCE `_]9d^XIXJJ"FFa`1f -endstream -endobj -1213 0 obj -<< -/Length 135 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,Wg=-8d(vm3wg,#^Cw']nKKsr8VU*s(c0(`ٻzV2Z-6)j\*1((0+gee@.}rS?:f -endstream -endobj -1214 0 obj -<< -/Length 128 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,@@w;IqbJ-5a1ߑ yx&Ͼzx]poK6qNZ\Ǣ<r۬d4+52!8vLH+bgOGg+ -endstream -endobj -1215 0 obj -<< -/Length 125 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,@#P,ذ{E}b Vl&[⻐xx8"M<&߆|𥏸N:jsh%79h Qg -O-S y_Uyu&R`Sgp -endstream -endobj -1216 0 obj -<< -/Length 122 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$U`o{lbXKzWn76c^Kd 0_Sg -endstream -endobj -1217 0 obj -<< -/Length 118 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$UPE3QݭKf"&v|cD.L?S}p/C0}kG/m&vYeK̢n 1svaiK%Y  gg -endstream -endobj -1218 0 obj -<< -/Length 113 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,WPe ؕ"{Ũ;7o2M&AsqrߖJ.||Ư)?]=sM8c߇|/}ipR|H@+s,h4 -endstream -endobj -1219 0 obj -<< -/Length 110 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,U6 c-bŇopW% o;ׄ1v xKO}zjvRu&k ;[mED6e-_h{ -endstream -endobj -1220 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ؼպӶгΰ˭ɪƧģ}zwtqnlie}cz`x]uZr~Wo{TlxRjvNfrLdoIamF^jD\gAXd>Ua;S^9P[5LW2IU0GR-DO)@K&=H#:E 7B3>0;,7'1!) "  cVF -endstream -endobj -1221 0 obj -<< -/Length 164 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H B09Չ10S>Au|' 'uG]$]Lte;!C8ꆚG4~A ppj&F()x?e0+I^QQ'IˆV-]tUuc;02˴˺W -endstream -endobj -1222 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧۦ٣ءנԞӜҚИϗ͕̓ʑɏǎƌĊÉ~|{ywvtrpomljigedb (Zj -endstream -endobj -1223 0 obj -<< -/Length 202 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@ыf(IF E(D!fKEQTLe#{#bhbDR2;g~`[ -2_E> |gey-@^DG-Њ<OAN?qm͏zDe%7} -{wɹ&EjI'W(kWy%QEM’)8`[ Z -endstream -endobj -1224 0 obj -<< -/Length 201 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@kS)HP$ ,K6T́23L[6iUG2oy)$ͣXa$3> -stream -H /S1Y2L3fYʹfIi9Tsk}LQ3h.ӿG/eMsCG-uAC3GS"oA^TT|˓ܔ\mS"$ INjm5+ė,q> -stream -H /W?ke̲˘1ej̬Ɩ%Uqn}PjƘV+e - [K3G-N7JG="/ǴC<y@cG=v)Pڦ&7.d7ȬqBz ;وZXMdZG&cpjr, -\D -endstream -endobj -1227 0 obj -<< -/Length 190 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H kAo4mMd-ZdH1]=*-Ҕqa}][m?6E -|YXfXx=[8/1QfwLŒC  oyvrtp oۨYZ(_#)xh` '#{IFKZCJ̓^)J -YD.; -0/?\ -endstream -endobj -1228 0 obj -<< -/Length 195 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HO/oZXZ5ZeZ2r].ՕLHѰZcF6I, IO jtnVih*4d~$"0U||F ^ -n^]y9"{H}R{$$$<۸pM6P׹\CYE^A5#,#,Z .?k -0Q]< -endstream -endobj -1229 0 obj -<< -/Length 194 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@[QFQXRTHa>f/I a9;6 k:?*" -_9ZY LS3͇ zSj q^cTNx9C(GqÎp -a`lclD@]Ba|d H>$/g9'Sr9] -endstream -endobj -1230 0 obj -<< -/Length 109 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HTB R4*A{.kWT1OwZe]ιy|6/᳭-䄳1Cm"5hC=vI?th -endstream -endobj -1231 0 obj -<< -/Length 99 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4kBP3$G&p9}F?A}NN!>{ o]L`mI2yyAA)k|`i -endstream -endobj -1232 0 obj -<< -/Length 100 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HLY0л JwAN|FO&I|՚ |}0/X\_2:q{#opXiG -endstream -endobj -1233 0 obj -<< -/Length 95 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HLkBPo3A.*P)-~8>Z]-_gc7>LM1'bh3]y<!|@囯.RAi -endstream -endobj -1234 0 obj -<< -/Length 80 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD@ _ -.~&$vVԲ{gxKdH_h&_zx>8҆Z3_i -endstream -endobj -1235 0 obj -<< -/Length 79 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT0 0 -=&wȇ3jPϫ, |俻䛞k|RGC`>Υomhpj -endstream -endobj -1236 0 obj -<< -/Length 76 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HTY@0 .)d7Yj~T߽h /4s9 -;H{ 0jV -endstream -endobj -1237 0 obj -<< -/Length 73 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HL0 r9FK;k{XN5W+F -ǷtwZ`s~&TM̧GHC9xj -endstream -endobj -1238 0 obj -<< -/Length 69 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hl[SܩΜhп'r̞ϣn]ىj -#8j -endstream -endobj -1239 0 obj -<< -/Length 61 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H7 ڍ܅@?v"Hh; -[y3 m``uk" -endstream -endobj -1240 0 obj -<< -/Length 188 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HkAm emk-˹3 Bl9Bf߷W̏_Evllr|Y,X'řƘ|D{y>y}O뎦-u'7T\Qtth``%oLDHڀG%uF q Q5 -AIDAAx/^9 -endstream -endobj -1241 0 obj -<< -/Length 188 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hk-[hdQ&ҶmggEt[䑅Qhy|ʶƦ -Ey~r|gY%fi)& όEF8_1Qz|ѽsC0 ~T%7 \(NE;3Ȟ [y9F2248ɀQpq-1 {"^ -endstream -endobj -1242 0 obj -<< -/Length 184 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H kWo-G!2լiMbȝ6PP_}]mUeEyY(0 #?C+?n.:/~u;5V*|)()j5jUdHߒ!$qM%!A) gxN8 -0_3 -endstream -endobj -1243 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOߟ¬&&3L+kGns<> -stream -HkmEАXBFu;:ĥƐGf4Y &:* -M"?V2,_>%>Dif)L$$3K/J0AZ~>ԼT> -stream -H O3XL5&b9fsڗ+ iVx}}]2O -ll -s,3,$'313$䞱7.NZѾuC5f&jWTT t)ג;%{1 )5)#JDeD%D<;` -endstream -endobj -610 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [299.039 592.094 394.16 604.644] -/Subtype/Link/A<> ->> endobj -611 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [286.551 514.055 495.353 528] -/Subtype/Link/A<> ->> endobj -615 0 obj << -/D [613 0 R /XYZ 123.806 735.021 null] ->> endobj -612 0 obj << -/Font << /F16 616 0 R /F19 617 0 R >> -/XObject << /Im2 609 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1270 0 obj << -/Length 754 -/Filter /FlateDecode ->> -stream -xW]o0}ϟB:lT! yIeIs -{IL9`0พO (#$)P錁0 L "2~wB yc60H%CZ#$I5E0kW%_'Em*(pRNoʅO" /}Iu87qymb ymd)m> endobj -1246 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 538.907 174.51 549.15] -/Subtype /Link -/A << /S /GoTo /D (chapter.1) >> ->> endobj -1247 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [125.439 517.114 269.396 527.34] -/Subtype /Link -/A << /S /GoTo /D (subsection.1.0.1) >> ->> endobj -1248 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 482.983 208.02 493.226] -/Subtype /Link -/A << /S /GoTo /D (chapter.2) >> ->> endobj -1249 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.521 458.866 249.167 471.416] -/Subtype /Link -/A << /S /GoTo /D (section.2.1) >> ->> endobj -1250 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.521 437.072 323.773 449.622] -/Subtype /Link -/A << /S /GoTo /D (section.2.2) >> ->> endobj -1251 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 417.602 228.595 427.828] -/Subtype /Link -/A << /S /GoTo /D (section*.2) >> ->> endobj -1252 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 393.484 250.671 406.034] -/Subtype /Link -/A << /S /GoTo /D (section*.3) >> ->> endobj -1253 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 374.014 259.219 384.241] -/Subtype /Link -/A << /S /GoTo /D (section*.4) >> ->> endobj -1254 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 349.896 378.778 362.447] -/Subtype /Link -/A << /S /GoTo /D (section*.5) >> ->> endobj -1255 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 330.427 376.637 340.653] -/Subtype /Link -/A << /S /GoTo /D (section*.6) >> ->> endobj -1256 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.521 306.309 278.594 318.859] -/Subtype /Link -/A << /S /GoTo /D (section.2.3) >> ->> endobj -1257 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 284.515 205.843 297.065] -/Subtype /Link -/A << /S /GoTo /D (section*.7) >> ->> endobj -1258 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 262.721 274.597 275.271] -/Subtype /Link -/A << /S /GoTo /D (section*.8) >> ->> endobj -1259 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 230.915 136.156 241.158] -/Subtype /Link -/A << /S /GoTo /D (chapter.3) >> ->> endobj -1260 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [125.439 209.121 228.595 219.347] -/Subtype /Link -/A << /S /GoTo /D (subsection.3.0.1) >> ->> endobj -1261 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 187.327 195.757 197.554] -/Subtype /Link -/A << /S /GoTo /D (section*.9) >> ->> endobj -1262 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [125.439 163.209 245.5 175.76] -/Subtype /Link -/A << /S /GoTo /D (subsection.3.0.2) >> ->> endobj -1263 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 143.74 269.706 153.966] -/Subtype /Link -/A << /S /GoTo /D (section*.10) >> ->> endobj -1264 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 121.946 232.076 132.172] -/Subtype /Link -/A << /S /GoTo /D (section*.11) >> ->> endobj -1271 0 obj << -/D [1269 0 R /XYZ 81.963 732.53 null] ->> endobj -1273 0 obj << -/D [1269 0 R /XYZ 81.963 574.034 null] ->> endobj -1268 0 obj << -/Font << /F22 1272 0 R /F23 1274 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1305 0 obj << -/Length 1142 -/Filter /FlateDecode ->> -stream -xXKsHWpa^Ǭbg*?VbTr D -a{~f$˒T u7Y˳>{}IJ}+ea 1 pl*:?/O|0}DF/c"B 'ְW3FLLCSmfc %ڮ ,Gh*u lx*4֭y۪瘭(b"2С"uŐ+UӼX'X6qMGVBUv],qA':C}GuG62%P9T}}5]w;MvRqy7bcG -#F{kDӊr ބMЍ[}пqԝA}#(Aˮwضc74O,'unԋ.'\DBmUYOԷ -endstream -endobj -1304 0 obj << -/Type /Page -/Contents 1305 0 R -/Resources 1303 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 606 0 R -/Annots [ 1265 0 R 1266 0 R 1267 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R 1294 0 R 1295 0 R 1296 0 R 1297 0 R 1298 0 R 1299 0 R 1300 0 R ] ->> endobj -1265 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 697.455 356.501 710.022] -/Subtype /Link -/A << /S /GoTo /D (chapter.4) >> ->> endobj -1266 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 677.658 336.891 690.208] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.0.3) >> ->> endobj -1267 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 657.861 299.367 670.412] -/Subtype /Link -/A << /S /GoTo /D (section*.12) >> ->> endobj -1275 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 640.389 312.856 650.615] -/Subtype /Link -/A << /S /GoTo /D (section*.13) >> ->> endobj -1276 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 620.592 309.999 630.818] -/Subtype /Link -/A << /S /GoTo /D (section*.14) >> ->> endobj -1277 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 600.795 292.934 611.021] -/Subtype /Link -/A << /S /GoTo /D (section*.15) >> ->> endobj -1278 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 578.674 360.974 591.225] -/Subtype /Link -/A << /S /GoTo /D (section*.16) >> ->> endobj -1279 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 558.878 289.458 571.428] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.0.4) >> ->> endobj -1280 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 539.081 399.984 551.631] -/Subtype /Link -/A << /S /GoTo /D (section*.17) >> ->> endobj -1281 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 519.284 408.441 531.834] -/Subtype /Link -/A << /S /GoTo /D (section*.18) >> ->> endobj -1282 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 499.487 380.544 512.038] -/Subtype /Link -/A << /S /GoTo /D (section*.19) >> ->> endobj -1283 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 479.691 288.808 492.241] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.0.5) >> ->> endobj -1284 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 459.894 495.205 472.444] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.0.6) >> ->> endobj -1285 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 428.335 185.184 440.902] -/Subtype /Link -/A << /S /GoTo /D (chapter.5) >> ->> endobj -1286 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 408.538 414.506 421.089] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.0.7) >> ->> endobj -1287 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 391.066 333.311 401.292] -/Subtype /Link -/A << /S /GoTo /D (section*.20) >> ->> endobj -1288 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 371.269 244.075 381.495] -/Subtype /Link -/A << /S /GoTo /D (section*.21) >> ->> endobj -1289 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 349.148 291.344 361.698] -/Subtype /Link -/A << /S /GoTo /D (subsection.5.0.8) >> ->> endobj -1290 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 319.913 292.893 330.156] -/Subtype /Link -/A << /S /GoTo /D (chapter.6) >> ->> endobj -1291 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 300.116 257.894 310.343] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.9) >> ->> endobj -1292 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 277.996 237.673 290.546] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.10) >> ->> endobj -1293 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 258.199 323.902 270.749] -/Subtype /Link -/A << /S /GoTo /D (section*.22) >> ->> endobj -1294 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 240.726 377.144 250.426] -/Subtype /Link -/A << /S /GoTo /D (section*.23) >> ->> endobj -1295 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 220.93 395.595 230.629] -/Subtype /Link -/A << /S /GoTo /D (section*.24) >> ->> endobj -1296 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.732 198.809 404.436 211.359] -/Subtype /Link -/A << /S /GoTo /D (section*.25) >> ->> endobj -1297 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 181.336 352.542 191.036] -/Subtype /Link -/A << /S /GoTo /D (section*.26) >> ->> endobj -1298 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 161.539 358.693 171.239] -/Subtype /Link -/A << /S /GoTo /D (section*.27) >> ->> endobj -1299 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 139.086 383.294 151.442] -/Subtype /Link -/A << /S /GoTo /D (section*.28) >> ->> endobj -1300 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 119.29 370.993 131.646] -/Subtype /Link -/A << /S /GoTo /D (section*.29) >> ->> endobj -1306 0 obj << -/D [1304 0 R /XYZ 123.806 732.53 null] ->> endobj -1303 0 obj << -/Font << /F20 1307 0 R /F23 1274 0 R /F16 616 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1335 0 obj << -/Length 1023 -/Filter /FlateDecode ->> -stream -x]oH+ҖAZUfUmw7El(LhmpͿ߃&m'Q2p缜94C6e:xu{R24FG+l@] 0=0ƌrC6?M Χ/ - n9(\ >w`ur1X -s45 uJUl:I$ <4!XkYe*,FcI.ql"j;`ăK1Hsl熮ƓCnvg1EA|= 'dz`pחI-EX.d]*-O;N{gu}$Tv8zWWf&yN YƞDޟk"IȬ]\~P_Purf$JW{IfBU!W8Z֌%b˿^yZ,<gn.46?JfC^[iF_o.h,xko[I_8Ӎ|mζmrv$㦌a-#xKb ]d |9dNl~EֿkE%3dצ[APjo|˭QtL'euܺJ|38W|'&ZP٣PQʓ" "D뽆> 6$&3'8jOUsmeOuu)~*G,ۆF(]C%ig8fFߩSsY{>eô -endstream -endobj -1334 0 obj << -/Type /Page -/Contents 1335 0 R -/Resources 1333 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 606 0 R -/Annots [ 1301 0 R 1302 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R 1318 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1337 0 R 1323 0 R 1338 0 R 1324 0 R 1339 0 R 1325 0 R 1326 0 R 1327 0 R 1340 0 R 1328 0 R 1341 0 R 1329 0 R 1342 0 R 1330 0 R 1343 0 R 1331 0 R 1344 0 R ] ->> endobj -1301 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 697.123 286.097 709.479] -/Subtype /Link -/A << /S /GoTo /D (section*.30) >> ->> endobj -1302 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 680.518 286.097 690.218] -/Subtype /Link -/A << /S /GoTo /D (section*.31) >> ->> endobj -1309 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 658.601 267.646 670.957] -/Subtype /Link -/A << /S /GoTo /D (section*.32) >> ->> endobj -1310 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 641.996 335.301 651.695] -/Subtype /Link -/A << /S /GoTo /D (section*.33) >> ->> endobj -1311 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 620.078 470.61 632.434] -/Subtype /Link -/A << /S /GoTo /D (section*.34) >> ->> endobj -1312 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.889 601.149 220.697 613.7] -/Subtype /Link -/A << /S /GoTo /D (section*.35) >> ->> endobj -1313 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 581.556 366.053 593.912] -/Subtype /Link -/A << /S /GoTo /D (section*.36) >> ->> endobj -1314 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 562.295 347.602 574.651] -/Subtype /Link -/A << /S /GoTo /D (section*.37) >> ->> endobj -1315 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 543.034 366.053 555.39] -/Subtype /Link -/A << /S /GoTo /D (section*.38) >> ->> endobj -1316 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 523.773 452.159 536.129] -/Subtype /Link -/A << /S /GoTo /D (section*.39) >> ->> endobj -1317 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 504.512 409.106 516.868] -/Subtype /Link -/A << /S /GoTo /D (section*.40) >> ->> endobj -1318 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [125.439 485.583 301.576 498.133] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.11) >> ->> endobj -1319 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 465.99 329.15 478.345] -/Subtype /Link -/A << /S /GoTo /D (section*.41) >> ->> endobj -1320 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 446.729 458.309 459.084] -/Subtype /Link -/A << /S /GoTo /D (section*.42) >> ->> endobj -1321 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 430.123 286.097 439.823] -/Subtype /Link -/A << /S /GoTo /D (section*.43) >> ->> endobj -1322 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 408.206 471.502 421.155] -/Subtype /Link -/A << /S /GoTo /D (section*.44) >> ->> endobj -1337 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 393.76 541.427 406.709] -/Subtype /Link -/A << /S /GoTo /D (section*.44) >> ->> endobj -1323 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 374.499 471.502 387.448] -/Subtype /Link -/A << /S /GoTo /D (section*.45) >> ->> endobj -1338 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 361.714 295.41 373.002] -/Subtype /Link -/A << /S /GoTo /D (section*.45) >> ->> endobj -1324 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 340.792 471.502 353.741] -/Subtype /Link -/A << /S /GoTo /D (section*.46) >> ->> endobj -1339 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 326.347 369.215 339.295] -/Subtype /Link -/A << /S /GoTo /D (section*.46) >> ->> endobj -1325 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 307.085 359.902 320.034] -/Subtype /Link -/A << /S /GoTo /D (section*.47) >> ->> endobj -1326 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 287.824 427.557 300.773] -/Subtype /Link -/A << /S /GoTo /D (section*.48) >> ->> endobj -1327 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 268.563 471.502 281.512] -/Subtype /Link -/A << /S /GoTo /D (section*.49) >> ->> endobj -1340 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 254.117 449.171 267.066] -/Subtype /Link -/A << /S /GoTo /D (section*.49) >> ->> endobj -1328 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 234.856 471.502 247.805] -/Subtype /Link -/A << /S /GoTo /D (section*.50) >> ->> endobj -1341 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 221.407 449.171 233.359] -/Subtype /Link -/A << /S /GoTo /D (section*.50) >> ->> endobj -1329 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 201.149 471.502 214.098] -/Subtype /Link -/A << /S /GoTo /D (section*.51) >> ->> endobj -1342 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 187.7 449.171 199.652] -/Subtype /Link -/A << /S /GoTo /D (section*.51) >> ->> endobj -1330 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 167.442 471.502 180.391] -/Subtype /Link -/A << /S /GoTo /D (section*.52) >> ->> endobj -1343 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 154.657 313.861 165.945] -/Subtype /Link -/A << /S /GoTo /D (section*.52) >> ->> endobj -1331 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 133.736 471.502 146.684] -/Subtype /Link -/A << /S /GoTo /D (section*.53) >> ->> endobj -1344 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 120.95 295.41 132.238] -/Subtype /Link -/A << /S /GoTo /D (section*.53) >> ->> endobj -1336 0 obj << -/D [1334 0 R /XYZ 81.963 732.53 null] ->> endobj -1333 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1370 0 obj << -/Length 1062 -/Filter /FlateDecode ->> -stream -xX[6~WcK;3tUihCB=IHAd4+M09ǟ_{?;5]G6DsN(@4'[g|CS q>NߞNe9Aꚿ=|Z5miOԕF- qFiޟ=*L hL&aYLi$ CLX7F/d>(?lodBo(njJݨyas:rbX j6Xne<řGzsi^!?-e1N:BaРz^Io0{qP4b~kG0%bx]Rs^acIIBm}YLzLԺ'v%Zy;¶7OStKPXjtI)avetK/~3qj,V>ewf JǠ<&\}b{[sӹ~ul"F[u r#H`[< ]M ]Qrny͡ -nJ، 5WEO(eE*a$\қF3 h{RY֦ q -endstream -endobj -1369 0 obj << -/Type /Page -/Contents 1370 0 R -/Resources 1368 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 606 0 R -/Annots [ 1332 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1372 0 R 1356 0 R 1357 0 R 1373 0 R 1358 0 R 1374 0 R 1359 0 R 1375 0 R 1360 0 R 1376 0 R 1361 0 R 1377 0 R 1362 0 R 1378 0 R 1363 0 R 1379 0 R 1364 0 R 1365 0 R 1380 0 R 1381 0 R ] ->> endobj -1332 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 697.123 512.453 710.072] -/Subtype /Link -/A << /S /GoTo /D (section*.54) >> ->> endobj -1345 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 678.033 389.445 689.435] -/Subtype /Link -/A << /S /GoTo /D (section*.55) >> ->> endobj -1346 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 656.181 412.334 668.731] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.12) >> ->> endobj -1347 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 637.868 309.489 647.568] -/Subtype /Link -/A << /S /GoTo /D (section*.56) >> ->> endobj -1348 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 614.575 370.993 626.931] -/Subtype /Link -/A << /S /GoTo /D (section*.57) >> ->> endobj -1349 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 596.594 327.94 606.294] -/Subtype /Link -/A << /S /GoTo /D (section*.58) >> ->> endobj -1350 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 575.958 321.79 585.657] -/Subtype /Link -/A << /S /GoTo /D (section*.59) >> ->> endobj -1351 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 554.211 395.595 565.02] -/Subtype /Link -/A << /S /GoTo /D (section*.60) >> ->> endobj -1352 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 533.574 401.746 544.384] -/Subtype /Link -/A << /S /GoTo /D (section*.61) >> ->> endobj -1353 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 512.937 383.294 523.747] -/Subtype /Link -/A << /S /GoTo /D (section*.62) >> ->> endobj -1354 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 490.754 377.144 503.11] -/Subtype /Link -/A << /S /GoTo /D (section*.63) >> ->> endobj -1355 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 470.117 513.345 483.066] -/Subtype /Link -/A << /S /GoTo /D (section*.64) >> ->> endobj -1372 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 457.331 306.501 468.62] -/Subtype /Link -/A << /S /GoTo /D (section*.64) >> ->> endobj -1356 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 435.034 487.852 447.983] -/Subtype /Link -/A << /S /GoTo /D (section*.65) >> ->> endobj -1357 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 414.397 513.345 427.346] -/Subtype /Link -/A << /S /GoTo /D (section*.66) >> ->> endobj -1373 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 399.952 404.908 412.9] -/Subtype /Link -/A << /S /GoTo /D (section*.66) >> ->> endobj -1358 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 379.315 513.345 392.263] -/Subtype /Link -/A << /S /GoTo /D (section*.67) >> ->> endobj -1374 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 364.869 404.908 377.818] -/Subtype /Link -/A << /S /GoTo /D (section*.67) >> ->> endobj -1359 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 344.232 513.345 357.181] -/Subtype /Link -/A << /S /GoTo /D (section*.68) >> ->> endobj -1375 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 329.786 392.607 342.735] -/Subtype /Link -/A << /S /GoTo /D (section*.68) >> ->> endobj -1360 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 309.149 513.345 322.098] -/Subtype /Link -/A << /S /GoTo /D (section*.69) >> ->> endobj -1376 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 296.363 306.501 307.652] -/Subtype /Link -/A << /S /GoTo /D (section*.69) >> ->> endobj -1361 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 274.066 513.345 287.015] -/Subtype /Link -/A << /S /GoTo /D (section*.70) >> ->> endobj -1377 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 259.621 411.058 272.569] -/Subtype /Link -/A << /S /GoTo /D (section*.70) >> ->> endobj -1362 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 238.984 513.345 251.932] -/Subtype /Link -/A << /S /GoTo /D (section*.71) >> ->> endobj -1378 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 226.198 306.501 237.487] -/Subtype /Link -/A << /S /GoTo /D (section*.71) >> ->> endobj -1363 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 203.901 513.345 216.85] -/Subtype /Link -/A << /S /GoTo /D (section*.72) >> ->> endobj -1379 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 191.115 343.404 202.404] -/Subtype /Link -/A << /S /GoTo /D (section*.72) >> ->> endobj -1364 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 168.818 457.099 181.767] -/Subtype /Link -/A << /S /GoTo /D (section*.73) >> ->> endobj -1365 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 148.181 513.345 161.13] -/Subtype /Link -/A << /S /GoTo /D (section*.74) >> ->> endobj -1380 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 134.732 513.345 145.688] -/Subtype /Link -/A << /S /GoTo /D (section*.74) >> ->> endobj -1381 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 120.95 306.501 132.238] -/Subtype /Link -/A << /S /GoTo /D (section*.74) >> ->> endobj -1371 0 obj << -/D [1369 0 R /XYZ 123.806 732.53 null] ->> endobj -1368 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1401 0 obj << -/Length 948 -/Filter /FlateDecode ->> -stream -xKS0:"$ZJ:ÁN xLObr -+vlH҆0"zjwAsD78Q}L4!\cI/&gФG_O΍۠Ԭwز(&5A#-C*Ymx&)MHg$= `eʜQ#GCFA!8](n s>YSg\S!Q mQဧ61/&`48]ۃJmՎۛ}J1!ա ܜX,'ي߇Bl(Za4LSpgv :/񳉸/q`f>\rge"9%ܬxOsAᲐ^`> *eӑ=Gɳf`1LMeAc& .tI WMA)gji3(JRONeéS?w,YLIy)+ -%?V8+l΋Pc1DЦE=L]O \q%|Lx,:0.Gcm&'\lhL0ض\-d͘.SYCFj%+M`'2գpA; -iSn{񦍣Ʊqb_BsʍAZ[|ʫ\öuu\w/rΓYLoeҙ.2@)n;M&."P>.DO^K|C&H*/8j¶-ź>J57H»K(X@kaC['* -Ex#ߔfVRu>0)`ԽeW" "1]5[e>,Bۄyoײdya/Ve3.*ZɢZok8:;O+0cj'~61 bC -endstream -endobj -1400 0 obj << -/Type /Page -/Contents 1401 0 R -/Resources 1399 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1420 0 R -/Annots [ 1366 0 R 1403 0 R 1367 0 R 1404 0 R 1382 0 R 1405 0 R 1406 0 R 1383 0 R 1384 0 R 1385 0 R 1407 0 R 1386 0 R 1408 0 R 1387 0 R 1409 0 R 1388 0 R 1410 0 R 1389 0 R 1411 0 R 1412 0 R 1390 0 R 1413 0 R 1414 0 R 1391 0 R 1392 0 R 1415 0 R 1416 0 R 1393 0 R 1417 0 R 1394 0 R 1418 0 R 1395 0 R 1419 0 R 1396 0 R ] ->> endobj -1366 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 697.123 471.502 710.072] -/Subtype /Link -/A << /S /GoTo /D (section*.75) >> ->> endobj -1403 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 682.677 375.366 695.626] -/Subtype /Link -/A << /S /GoTo /D (section*.75) >> ->> endobj -1367 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 661.911 471.502 674.86] -/Subtype /Link -/A << /S /GoTo /D (section*.76) >> ->> endobj -1404 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 649.125 264.658 660.414] -/Subtype /Link -/A << /S /GoTo /D (section*.76) >> ->> endobj -1382 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 626.699 471.502 639.648] -/Subtype /Link -/A << /S /GoTo /D (section*.77) >> ->> endobj -1405 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 613.8 471.502 624.206] -/Subtype /Link -/A << /S /GoTo /D (section*.77) >> ->> endobj -1406 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 599.468 264.658 610.757] -/Subtype /Link -/A << /S /GoTo /D (section*.77) >> ->> endobj -1383 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 577.042 323 589.991] -/Subtype /Link -/A << /S /GoTo /D (section*.78) >> ->> endobj -1384 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 556.276 439.858 569.225] -/Subtype /Link -/A << /S /GoTo /D (section*.79) >> ->> endobj -1385 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 535.51 471.502 548.459] -/Subtype /Link -/A << /S /GoTo /D (section*.80) >> ->> endobj -1407 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 521.064 412.268 534.013] -/Subtype /Link -/A << /S /GoTo /D (section*.80) >> ->> endobj -1386 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 500.298 471.502 513.247] -/Subtype /Link -/A << /S /GoTo /D (section*.81) >> ->> endobj -1408 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 487.513 301.561 498.801] -/Subtype /Link -/A << /S /GoTo /D (section*.81) >> ->> endobj -1387 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 465.087 471.502 478.035] -/Subtype /Link -/A << /S /GoTo /D (section*.82) >> ->> endobj -1409 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 450.641 326.162 463.59] -/Subtype /Link -/A << /S /GoTo /D (section*.82) >> ->> endobj -1388 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 429.875 471.502 442.824] -/Subtype /Link -/A << /S /GoTo /D (section*.83) >> ->> endobj -1410 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 416.976 369.215 428.378] -/Subtype /Link -/A << /S /GoTo /D (section*.83) >> ->> endobj -1389 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 394.663 471.502 407.612] -/Subtype /Link -/A << /S /GoTo /D (section*.84) >> ->> endobj -1411 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 381.214 471.502 392.17] -/Subtype /Link -/A << /S /GoTo /D (section*.84) >> ->> endobj -1412 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 367.432 264.658 378.72] -/Subtype /Link -/A << /S /GoTo /D (section*.84) >> ->> endobj -1390 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 345.006 471.502 357.955] -/Subtype /Link -/A << /S /GoTo /D (section*.85) >> ->> endobj -1413 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 331.556 471.502 342.513] -/Subtype /Link -/A << /S /GoTo /D (section*.85) >> ->> endobj -1414 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 317.774 264.658 329.063] -/Subtype /Link -/A << /S /GoTo /D (section*.85) >> ->> endobj -1391 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 295.348 329.15 308.297] -/Subtype /Link -/A << /S /GoTo /D (section*.86) >> ->> endobj -1392 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 274.582 471.502 287.531] -/Subtype /Link -/A << /S /GoTo /D (section*.87) >> ->> endobj -1415 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 260.137 471.502 272.089] -/Subtype /Link -/A << /S /GoTo /D (section*.87) >> ->> endobj -1416 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 245.691 307.711 258.639] -/Subtype /Link -/A << /S /GoTo /D (section*.87) >> ->> endobj -1393 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 224.925 471.502 237.874] -/Subtype /Link -/A << /S /GoTo /D (section*.88) >> ->> endobj -1417 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 212.139 264.658 223.428] -/Subtype /Link -/A << /S /GoTo /D (section*.88) >> ->> endobj -1394 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 189.713 471.502 202.662] -/Subtype /Link -/A << /S /GoTo /D (section*.89) >> ->> endobj -1418 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 175.267 412.268 188.216] -/Subtype /Link -/A << /S /GoTo /D (section*.89) >> ->> endobj -1395 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 156.048 471.502 167.45] -/Subtype /Link -/A << /S /GoTo /D (section*.90) >> ->> endobj -1419 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 141.716 264.658 153.004] -/Subtype /Link -/A << /S /GoTo /D (section*.90) >> ->> endobj -1396 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 120.836 421.407 132.238] -/Subtype /Link -/A << /S /GoTo /D (section*.91) >> ->> endobj -1402 0 obj << -/D [1400 0 R /XYZ 81.963 732.53 null] ->> endobj -1399 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1438 0 obj << -/Length 1041 -/Filter /FlateDecode ->> -stream -xX[F~G,œ~^!-6Bδ\\.g$+U\"=#R<QƱKlp@=Y7wQn>{DpZ39EART}8;V%\ _"LA Oj;jsi`U2AHN*feP*_P1iL̜6GChm3oc)OlN ?UYϙm͠X+eu6:Pd ;ʖ~# ;4 -݉xH2hJC?_(h &eQ-tvS&M-+˘6_=j]t6KJ26Qeo}C!)&SJ -Gykt?>UyI/THߨ, .*UMMX`+{ ':B@> endobj -1397 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 697.123 513.345 710.072] -/Subtype /Link -/A << /S /GoTo /D (section*.92) >> ->> endobj -1440 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 682.677 441.81 695.626] -/Subtype /Link -/A << /S /GoTo /D (section*.92) >> ->> endobj -1398 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 660.527 513.345 673.476] -/Subtype /Link -/A << /S /GoTo /D (section*.93) >> ->> endobj -1441 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 646.081 429.51 659.03] -/Subtype /Link -/A << /S /GoTo /D (section*.93) >> ->> endobj -1421 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 623.931 513.345 636.879] -/Subtype /Link -/A << /S /GoTo /D (section*.94) >> ->> endobj -1442 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 609.485 454.111 622.434] -/Subtype /Link -/A << /S /GoTo /D (section*.94) >> ->> endobj -1422 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 587.335 513.345 600.283] -/Subtype /Link -/A << /S /GoTo /D (section*.95) >> ->> endobj -1443 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 572.889 513.345 584.841] -/Subtype /Link -/A << /S /GoTo /D (section*.95) >> ->> endobj -1444 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 560.103 306.501 571.392] -/Subtype /Link -/A << /S /GoTo /D (section*.95) >> ->> endobj -1423 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 536.293 513.345 549.241] -/Subtype /Link -/A << /S /GoTo /D (section*.96) >> ->> endobj -1445 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 523.507 306.501 534.796] -/Subtype /Link -/A << /S /GoTo /D (section*.96) >> ->> endobj -1424 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 499.697 513.345 512.645] -/Subtype /Link -/A << /S /GoTo /D (section*.97) >> ->> endobj -1446 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 485.251 513.345 497.203] -/Subtype /Link -/A << /S /GoTo /D (section*.97) >> ->> endobj -1447 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 470.805 513.345 482.758] -/Subtype /Link -/A << /S /GoTo /D (section*.97) >> ->> endobj -1448 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 458.019 306.501 469.308] -/Subtype /Link -/A << /S /GoTo /D (section*.97) >> ->> endobj -1425 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 434.209 494.002 447.158] -/Subtype /Link -/A << /S /GoTo /D (section*.98) >> ->> endobj -1426 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 413.605 395.595 425.007] -/Subtype /Link -/A << /S /GoTo /D (section*.99) >> ->> endobj -1427 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 389.908 513.345 402.857] -/Subtype /Link -/A << /S /GoTo /D (section*.100) >> ->> endobj -1449 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 375.462 527.916 388.411] -/Subtype /Link -/A << /S /GoTo /D (section*.100) >> ->> endobj -1428 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.282 353.644 370.076 366.194] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.13) >> ->> endobj -1429 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 333.818 358.693 343.518] -/Subtype /Link -/A << /S /GoTo /D (section*.101) >> ->> endobj -1430 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 309.012 346.392 321.367] -/Subtype /Link -/A << /S /GoTo /D (section*.102) >> ->> endobj -1431 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 286.861 377.144 299.217] -/Subtype /Link -/A << /S /GoTo /D (section*.103) >> ->> endobj -1432 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 265.707 513.345 277.66] -/Subtype /Link -/A << /S /GoTo /D (section*.104) >> ->> endobj -1450 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 250.265 513.345 262.218] -/Subtype /Link -/A << /S /GoTo /D (section*.104) >> ->> endobj -1451 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 235.819 513.345 247.772] -/Subtype /Link -/A << /S /GoTo /D (section*.104) >> ->> endobj -1452 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 221.374 513.345 233.326] -/Subtype /Link -/A << /S /GoTo /D (section*.104) >> ->> endobj -1453 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 206.928 380.306 219.876] -/Subtype /Link -/A << /S /GoTo /D (section*.104) >> ->> endobj -1433 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 185.774 513.345 197.726] -/Subtype /Link -/A << /S /GoTo /D (section*.105) >> ->> endobj -1454 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 170.332 513.345 182.284] -/Subtype /Link -/A << /S /GoTo /D (section*.105) >> ->> endobj -1455 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 155.886 552.518 168.835] -/Subtype /Link -/A << /S /GoTo /D (section*.105) >> ->> endobj -1434 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 134.732 513.345 146.684] -/Subtype /Link -/A << /S /GoTo /D (section*.106) >> ->> endobj -1456 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [122.809 119.29 398.757 132.238] -/Subtype /Link -/A << /S /GoTo /D (section*.106) >> ->> endobj -1439 0 obj << -/D [1437 0 R /XYZ 123.806 732.53 null] ->> endobj -1436 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1472 0 obj << -/Length 978 -/Filter /FlateDecode ->> -stream -xWs8WhĪHkۤf6aD_18C{BH==}!E}ޯwW6Ab16H;s8E>\Y]~Y- :>[+_90sжPNۯE=֒)ru`E|q8I}}!yxh`ԝ=汖FUqfr0{Q1pr.v]n:նG毌n_v\@̍9Xj<ɼ32 Vo6B޽2q*R_)_׻} u="h7xT!{})9e13#l:2H902p^ǜρdm*0N'n\|*[¼eY5k$sf;|һXrS*U $؁,)h&YPE&+UthY*dO6> endobj -1435 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 698.119 471.502 710.072] -/Subtype /Link -/A << /S /GoTo /D (section*.107) >> ->> endobj -1474 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 682.677 471.502 694.63] -/Subtype /Link -/A << /S /GoTo /D (section*.107) >> ->> endobj -1475 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 668.231 471.502 680.184] -/Subtype /Link -/A << /S /GoTo /D (section*.107) >> ->> endobj -1476 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 654.781 471.502 665.738] -/Subtype /Link -/A << /S /GoTo /D (section*.107) >> ->> endobj -1477 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 639.34 471.502 651.292] -/Subtype /Link -/A << /S /GoTo /D (section*.107) >> ->> endobj -1478 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 624.894 381.516 637.842] -/Subtype /Link -/A << /S /GoTo /D (section*.107) >> ->> endobj -1457 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 605.633 471.502 618.581] -/Subtype /Link -/A << /S /GoTo /D (section*.108) >> ->> endobj -1479 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 591.187 471.502 603.14] -/Subtype /Link -/A << /S /GoTo /D (section*.108) >> ->> endobj -1480 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 576.741 471.502 588.694] -/Subtype /Link -/A << /S /GoTo /D (section*.108) >> ->> endobj -1481 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 562.295 356.914 575.244] -/Subtype /Link -/A << /S /GoTo /D (section*.108) >> ->> endobj -1458 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 543.034 471.502 555.983] -/Subtype /Link -/A << /S /GoTo /D (section*.109) >> ->> endobj -1482 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 529.584 471.502 540.541] -/Subtype /Link -/A << /S /GoTo /D (section*.109) >> ->> endobj -1483 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 514.142 356.914 527.091] -/Subtype /Link -/A << /S /GoTo /D (section*.109) >> ->> endobj -1459 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 494.881 471.502 507.83] -/Subtype /Link -/A << /S /GoTo /D (section*.110) >> ->> endobj -1484 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 481.431 471.502 492.388] -/Subtype /Link -/A << /S /GoTo /D (section*.110) >> ->> endobj -1485 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 465.99 356.914 478.938] -/Subtype /Link -/A << /S /GoTo /D (section*.110) >> ->> endobj -1460 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 448.275 471.502 459.677] -/Subtype /Link -/A << /S /GoTo /D (section*.111) >> ->> endobj -1486 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 432.283 471.502 444.235] -/Subtype /Link -/A << /S /GoTo /D (section*.111) >> ->> endobj -1487 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 418.833 471.502 429.79] -/Subtype /Link -/A << /S /GoTo /D (section*.111) >> ->> endobj -1488 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 403.391 510.675 416.34] -/Subtype /Link -/A << /S /GoTo /D (section*.111) >> ->> endobj -1461 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 384.13 471.502 397.079] -/Subtype /Link -/A << /S /GoTo /D (section*.112) >> ->> endobj -1489 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 370.68 471.502 381.637] -/Subtype /Link -/A << /S /GoTo /D (section*.112) >> ->> endobj -1490 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 355.238 471.502 367.191] -/Subtype /Link -/A << /S /GoTo /D (section*.112) >> ->> endobj -1491 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 340.792 471.502 352.745] -/Subtype /Link -/A << /S /GoTo /D (section*.112) >> ->> endobj -1492 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 326.347 412.268 339.295] -/Subtype /Link -/A << /S /GoTo /D (section*.112) >> ->> endobj -1462 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 307.085 471.502 320.034] -/Subtype /Link -/A << /S /GoTo /D (section*.113) >> ->> endobj -1493 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 293.636 471.502 304.592] -/Subtype /Link -/A << /S /GoTo /D (section*.113) >> ->> endobj -1494 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 279.74 406.118 291.143] -/Subtype /Link -/A << /S /GoTo /D (section*.113) >> ->> endobj -1463 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 258.933 372.203 271.881] -/Subtype /Link -/A << /S /GoTo /D (section*.114) >> ->> endobj -1464 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 239.672 471.502 252.62] -/Subtype /Link -/A << /S /GoTo /D (section*.115) >> ->> endobj -1495 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 226.886 307.711 238.175] -/Subtype /Link -/A << /S /GoTo /D (section*.115) >> ->> endobj -1465 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 205.965 471.502 218.913] -/Subtype /Link -/A << /S /GoTo /D (section*.116) >> ->> endobj -1496 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 191.519 332.313 204.468] -/Subtype /Link -/A << /S /GoTo /D (section*.116) >> ->> endobj -1466 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 172.258 471.502 185.207] -/Subtype /Link -/A << /S /GoTo /D (section*.117) >> ->> endobj -1497 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [80.966 159.472 313.861 170.761] -/Subtype /Link -/A << /S /GoTo /D (section*.117) >> ->> endobj -1467 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [197.999 138.551 396.805 151.5] -/Subtype /Link -/A << /S /GoTo /D (section*.118) >> ->> endobj -1468 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [125.439 121.946 225.409 132.172] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.14) >> ->> endobj -1473 0 obj << -/D [1471 0 R /XYZ 81.963 732.53 null] ->> endobj -1470 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1506 0 obj << -/Length 322 -/Filter /FlateDecode ->> -stream -xUMO1W̱{:^5h#F8v!]Q4ޕ%&EK?{o)nedHc$9T£VC`̯n7$<~'z=1*R(E0+xU}@vk {ajz0${HSj^yp9S"ɷ`0N!Ijk47(zjLզ 6`O&P_߬v2Rav:z-_޿&UD#zjO?8urs|?&)b96ѵX<~:-: Wk};Zr -endstream -endobj -1505 0 obj << -/Type /Page -/Contents 1506 0 R -/Resources 1504 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1420 0 R -/Annots [ 1469 0 R 1498 0 R 1499 0 R 1500 0 R 1501 0 R 1502 0 R 1503 0 R ] ->> endobj -1469 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 699.779 271.743 710.005] -/Subtype /Link -/A << /S /GoTo /D (section*.119) >> ->> endobj -1498 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 680.187 263.941 690.413] -/Subtype /Link -/A << /S /GoTo /D (section*.120) >> ->> endobj -1499 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 660.595 267.842 670.52] -/Subtype /Link -/A << /S /GoTo /D (section*.121) >> ->> endobj -1500 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 638.679 267.907 651.229] -/Subtype /Link -/A << /S /GoTo /D (section*.122) >> ->> endobj -1501 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 621.411 272.718 631.637] -/Subtype /Link -/A << /S /GoTo /D (section*.123) >> ->> endobj -1502 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 601.819 270.767 612.046] -/Subtype /Link -/A << /S /GoTo /D (section*.124) >> ->> endobj -1503 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.842 579.903 315.79 592.454] -/Subtype /Link -/A << /S /GoTo /D (section*.125) >> ->> endobj -1507 0 obj << -/D [1505 0 R /XYZ 123.806 732.53 null] ->> endobj -1504 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1514 0 obj << -/Length 1738 -/Filter /FlateDecode ->> -stream -xڅ]o6콿"os&6tE=4}8[IL[t~H9I^,HߎgYWwtBΝQhD -z>RyCNyNE$pOḪvS{'ZE>Y\ui${O4xÿZKZQr N;=tצ6w_dgKuxַxS-Zf2Ns飜,\q8ˤ\ -#E.g'tmz2;`4g2OK3: -)[gYԺ;;4f|Ma_;>gIۧ/@bjGm"jM1:0Pf mBgIZREf5w/ptiה/,50UaMK~uXI-'z(' yY2b:BZk"x 5UjdZleD=+AX&_N`Yi,AsMh`b&z捜F.c{SGBT޶4@N8>DyJU1^>59ܩ" YB -fޓA)dMֱ0CT7^c!8"BFw<]@r~??GY;WM\&1<Dě+``R\z8?z&+R'W~ O#"oN|G'_8"e^wrkAćӰ>EVA Pyh)'KJ 1xRP#͡S5^WB/7CuqL×\40)-_F|UOgA0P.H:q~ -AXtGJ? 4I-,LP>[0FeU1>Wl> endobj -1508 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [141.601 499.53 149.445 509.23] -/Subtype /Link -/A << /S /GoTo /D (cite.XtreemFS) >> ->> endobj -1509 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [259.138 499.53 266.982 509.23] -/Subtype /Link -/A << /S /GoTo /D (cite.objStore) >> ->> endobj -1510 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [273.455 499.53 281.299 509.23] -/Subtype /Link -/A << /S /GoTo /D (cite.mesnier03objectbased) >> ->> endobj -1511 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [416.267 349.592 429.963 359.292] -/Subtype /Link -/A << /S /GoTo /D (cite.gfarm2) >> ->> endobj -1515 0 obj << -/D [1513 0 R /XYZ 81.963 732.53 null] ->> endobj -6 0 obj << -/D [1513 0 R /XYZ 81.963 712.73 null] ->> endobj -1512 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1530 0 obj << -/Length 981 -/Filter /FlateDecode ->> -stream -xڕVɒ6+p,cb{qUlgTR5"! c.e>hZ -c]^QIIz˴NL(4S5~]*2Y]2ַGo֋S&s/k-Y-? V.ry'Fݲⷅ8P~*De EH9Z*G7#/瓷5Q #]έIR =9*[ (IO 1*F|^ŤIC.-u8X2ZJ) h;tj%wЀ;ZJr~ɝ} 9nD'?x\zo>|ezLv;F*VAP>7,҂>"Z[_fz|"P#c:Tu=G0˺Z(p$o0 cd8OMe̠pϊ72fW⛠Iue >)-,)r7l*$MӗP@-)\3ֳ~&bBq+{Rgrv ʶ4mv31!Mk;'@,O4TSW<6A8DEXZuJ 7 \, cS >MUײࢂ4(n违=oFOjY-LaZ,PJ.W d@K3患.=ww^1â#ybF'_&R }s_ #LnpWKUsD=t> endobj -1520 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [365.919 630.34 382.866 642.89] -/Subtype /Link -/A << /S /GoTo /D (section.2.2) >> ->> endobj -1521 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [389.733 630.34 397.577 642.89] -/Subtype /Link -/A << /S /GoTo /D (chapter.2) >> ->> endobj -1522 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [404.444 630.34 421.391 642.89] -/Subtype /Link -/A << /S /GoTo /D (section.2.1) >> ->> endobj -1523 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [428.258 630.34 445.204 642.89] -/Subtype /Link -/A << /S /GoTo /D (section.2.3) >> ->> endobj -1524 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [487.129 615.894 494.973 628.445] -/Subtype /Link -/A << /S /GoTo /D (chapter.3) >> ->> endobj -1525 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [163.031 558.111 170.875 570.661] -/Subtype /Link -/A << /S /GoTo /D (chapter.4) >> ->> endobj -1526 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.204 543.665 410.048 556.215] -/Subtype /Link -/A << /S /GoTo /D (chapter.5) >> ->> endobj -1527 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [505.501 543.665 513.345 556.215] -/Subtype /Link -/A << /S /GoTo /D (chapter.6) >> ->> endobj -1531 0 obj << -/D [1529 0 R /XYZ 123.806 732.53 null] ->> endobj -10 0 obj << -/D [1529 0 R /XYZ 123.806 681.726 null] ->> endobj -1528 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F42 1532 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1535 0 obj << -/Length 1713 -/Filter /FlateDecode ->> -stream -xڅnF=_`1,[UO..~Z$K_^L2_^?[ Xg{t|n잉 }\*ss^Aͧe[lLks& pnrzRO"iFF25u=l]d@tӫHm -U[3I#:UqƕeF1;y@Vb<CmƝX=x)o` C/"fAZ;؁N0^#3XViDLW8krCoӽ@㜄0V~< ֕B$DHRE]upZ2۶~cQrlSio#7ւv* /nlj OgkNi\9.-#-zxʈ-κ8`E D_XIX?h #r;ْlRSgmH*De|V 5BPiO7}[aޟ3DR<Kd3$v U͆ dH}q}OA"z ̥ wx즦v)KlGL[Gݹj': 8,ߺs&h |R|e8B@PMBX̩nvТpEal1<}_@HjXP|d}555Dvƈ3-g1ºo{F<<4/ )ad+v- e@&D6/5q%W3[)PіiC$; v .d 1=DDѬo:ÓW\Lu]1JHYܸ nHg*(2F-Y|?A,(<+uca*FRt<.r!uh0F: @~i۷<Cce~윀sv @l^KK1B\FZ]xWjA'.Nz3bسEaO[ɕKc}Lt }ӌl=*89 -4=ӈ!;CdL;%3F,3 C'i2? V/X -k{YSq5>)+q#O.g+ĊC4S\z@V} gt+5 4(zZN[4}3Ձ!#0_Yu0'/rFz"m-BHW>7M(i\iڙmLf'Q~2\V1z;uU{ˁc -!7Hm{fɟ<~!ۃ8vxAr _0_-%7WqzsWEF$JcHuϙA+fAx2Kux>{ -endstream -endobj -1534 0 obj << -/Type /Page -/Contents 1535 0 R -/Resources 1533 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1537 0 R ->> endobj -1536 0 obj << -/D [1534 0 R /XYZ 81.963 732.53 null] ->> endobj -14 0 obj << -/D [1534 0 R /XYZ 81.963 712.73 null] ->> endobj -1533 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1541 0 obj << -/Length 1942 -/Filter /FlateDecode ->> -stream -xڍX_s6 Z{ktM K,z$,Hv2u A@ oDEQPw^$3/ox"*"v\"Wp|s^f67eoW7˸>nox`E뛛o6ܬ7wEFq6 #>.z L . (4Exy(=iyI[\%E諾{$Ni$"ao=!5$+Krǒ4yV'D3ԶU=1AUİހ$H;^8t@~xiȑr^ʓ!A'MWcu:bQ?@C.^d2.EÃΘ믷׈ڊel_bv aJ[D0bD|5O KLCPGȎ8-uB~|\sutz> endobj -1538 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [140.738 118.359 289.145 132.307] -/Subtype/Link/A<> ->> endobj -1542 0 obj << -/D [1540 0 R /XYZ 123.806 732.53 null] ->> endobj -18 0 obj << -/D [1540 0 R /XYZ 123.806 554.292 null] ->> endobj -22 0 obj << -/D [1540 0 R /XYZ 123.806 322.576 null] ->> endobj -26 0 obj << -/D [1540 0 R /XYZ 123.806 178.616 null] ->> endobj -1539 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F44 1543 0 R /F45 1544 0 R /F23 1274 0 R /F55 1545 0 R /F56 1546 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1550 0 obj << -/Length 2366 -/Filter /FlateDecode ->> -stream -xڍrБ\ut՝;+5U9$l!!v{>o#E$ x`֟WWu$Qu4ZgQi/߼_o7H7,UOw0Ƚo6yK)CFen/7.?%.aED}dͯ_{5_V՟!N+?uQKe._eOnU0WH.)$,KX!)7[ `xQ^?h'Ѓ.Pg1M zU{`9׏@aw"x}oW3l؏=ő -w\<&^qoߌT7 tq6Ozd.pe)8&x\wLыgDqGs75jlA̽FtDh&g\cL2f3}gͤvVMxcXz = .Kubۆ=:FXgeO3x)< }8R3ewfUޓ7{=BXwL>nz{n ]U +dUAqLMOïF%LN1Lg)k{GJ\hW~Low k4.l ԦA}ZL xIeGrfL~ xG4ݡ0]ufg>P8Eku';e\D#95"av=UZHUಯ.,.PYQP*$frT> -f52 hmHR<& qzjlQJ VVPEMmD򻐀W;d5=*jrKab8 *J)E\<>3|ء)MW88ՠ T[lhu7CxX]/ SBw4 91Ǧ[rK =7̈́BB=%l#Lޟ p#\e!:%I8d˪BqġzT.gR͛}h+Z\Y'v`OCh{rt`iM/!40)A+]%y|O}n=/^T5RRVzգl<2ˡarP16$`*ǀ;E d -Vc tZE<][x$%)ɝI,bK - gd- -/M;4f6=w!@%D#d&|,)OX;`I 6 4P/*S!5]2Ō M)؃; =?Iz1x5Bg l:0!\=O]OB~~Lg[gK#jus_D(C{V12XI 5DJno#oS*ŝ1l0$yS'k)P(D/!x*Pg(1-h"Tē?t/"8H_]TpjDQsbvB@~N=>Vܩ?>,[tKIyC!JŠ+rEg=U) 1!mJӜfZ:PTCIR)&mXqxcp6 ܙ1{Zj(S?CE4 K >F  >@>4Gd7HI%3a%x6T&^WQpq{zN3iGw`ܥR<Tr+~=z:-2[AYUy_(yqAI8 -xÃm> endobj -1547 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [161.003 333.661 192.904 346.212] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.12) >> ->> endobj -1551 0 obj << -/D [1549 0 R /XYZ 81.963 732.53 null] ->> endobj -30 0 obj << -/D [1549 0 R /XYZ 81.963 610.569 null] ->> endobj -34 0 obj << -/D [1549 0 R /XYZ 81.963 292.437 null] ->> endobj -1548 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R /F57 1552 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1555 0 obj << -/Length 3094 -/Filter /FlateDecode ->> -stream -xڵKsFFkf%[J┝xlŕL ,Crs^)R@ݷta~8y~yM:ZUYfF#m*|T\]NG'F5>-r~;6Eb|jMC&9;ƥNyLtyLͫ/ꋍt~a\*K^xmLh.^\]nL_}7򧓋˓?O4ՆjQxգ)i*[!ȖʜN͐|gHTEC2ZSt|6Yven|@jvۆ+%&͒l׫^6x8l}u4^cy}in6*pr.e隚OXÔ ;lYݶ,itEWS_jWpei}OSy.aV|UDcsjk&PW:[-qIuk9E_+5 -N-)~n6~gYRk涾N59O>=Ry}>[nBQ%)y W S&vo~8?.VsV|q(NfQzZ>q7$:mBM 5a3Yfw!"bB)ZswoYG b4 *4z5֡up O83 !q߁)YY 亂]mlj<|GImA%t9Q,UL]92ҕE~\Q۵Y-CmnvRҀ'uᘇ1 M4)|:TTx[||4m-_e2[=eGqs3I"'e<o0oE\҄OXd-5B,5*MY9T<,M6U4#Wȸ}Ef\Єxխ_5]\]"j9Ub\T\"V6yy|,u;u񻥯QV4}tA{SZ>芥_E|EW?v!F[?ZWMj[3pYE >vl|]3AݗL*& Z'~91Ş8zx^SmםthF:<y\UՐr&Wqn<aX~1@27o3LUa{=k͢Yk摒C牟 MF5۔`Pj"K=Sʔ.s4OeDN=BZBu !J2[Q7F5N 0hQ5*unrQi\h Ty4w49bmZ(SaՐv@5Ur(6u*Ʃ%K !L -lZCkZ>-D6N--D6N--D4N-C%6N-Cڔ֡֡ڔ֡֡JW -oӱqꬥ+Vs AS/TDѶ"Vi -jl"9ڔKcZNT)|xvvSN.&횶^8Qi>-dݒ]ݯoE0⠨5! XQ"j!5! D`QC,jBD @5! XpB/jBD @!5! D@QC,jBD @^D5  DQC,jBD @5! XpD/jzQR?ڛE{}X~[SR_ńdm}n^7PԈ&R5XB4Kp8B @`?Q@3r@`3CQB2VXBt2JB2>12ņDB01"k@` CQ;@ - BXľoo33{ܿO -)FQf86B@ !z opDo8@! Xs{b:BT@ 3"<@qzk">Bg8W !  @A@! !4{бGrE(V*P|D(È" D`"BBD@ G" X"BE!!!" D`,B !!" X,BADA!!" D#zBQ"BBDA!"D`"B{D(Ӵ79g:?k+'haE.-}}_x A䍗D^/,PALxc m -;i7S%@͞j @Z2~gr  -endstream -endobj -1554 0 obj << -/Type /Page -/Contents 1555 0 R -/Resources 1553 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1537 0 R ->> endobj -1556 0 obj << -/D [1554 0 R /XYZ 123.806 732.53 null] ->> endobj -38 0 obj << -/D [1554 0 R /XYZ 123.806 561.201 null] ->> endobj -1553 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R /F40 1308 0 R /F58 1557 0 R /F46 1558 0 R /F60 1559 0 R /F61 1560 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1563 0 obj << -/Length 2087 -/Filter /FlateDecode ->> -stream -xڭXKs6WpR3ޒHnIVΤ="mqL.Iq}ł99aX,v)a]Zyj={q -KJ' Z_X1г"/tз֩~|ṡ:Esϰ-El\c/ ǒ~{:w#5 .h췫?w|HoO ]${G}E=&lׇ'oJ r YO:uo?GG%stTOk>E_B)QSRFJG71&_N6kUZR}QLjZLXui 1it+]u\mln ^O xh jui\Hޜ, eUg)yɫ:/_1M&_7y#g -&L^fo0Gs;}YRyox4߰;ldLm;(}vTfw%/p}V*/ cXъh%vJZgZ#il = >}) -Jj'Vl#Ӫ]DEU&=uhXKN:7VjvpaVN䗥vuCs|s9.+U4LIx7#q -}Ϸ򿄌:{'STWk^roeFwPu57~\aW]2(f[ #G6PM;Xe<&Rq7H;GxȯL׸|wV !29)H}ת:dak7 (Pi_CVrjU4۳p= |SS}L%yٔ%*/<ªi(qQ$h}8@K>ud сkoAK{" -slK4#=/:l LxT8}je4{O{iI7]L؛4|?xq2Uy!e`YhlH?Qlz>w];SvfY!vP-b rIJQ,C2x&AjJMɂo.+DDpr9QOucı~LLIdn`,wd8G1f|DqUQɜb`5 -1ŗ0LdH7njtGMu>Ll6x "VQ?σBOQ%tspք 0zK/$Zq8Mv` ˫ʮ"H-,~Cr'ˆU2)nXɖpԣnǬOBp:zƪxL{Φ(zV} jr3Kzu~VoA1ƊppNK?l =#I_$ӾԵE?;o4\33!rBdvoN]oU\f> H*QaŒt> endobj -1564 0 obj << -/D [1562 0 R /XYZ 81.963 732.53 null] ->> endobj -42 0 obj << -/D [1562 0 R /XYZ 81.963 547.271 null] ->> endobj -1561 0 obj << -/Font << /F20 1307 0 R /F60 1559 0 R /F58 1557 0 R /F61 1560 0 R /F23 1274 0 R /F16 616 0 R /F19 617 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1567 0 obj << -/Length 2175 -/Filter /FlateDecode ->> -stream -xڵrF@2`Rr6+RJr20Y8^83===0qٿVg߼qT'V&rqd&\jUHGeBgbit.q7W%n/ -yH_27ۅ3y^-c:|zwbxu{e3[̄ב1*X?K]G&w#>ƹ(upw߳XTrQyH (OuJj5q̰ZX*m/֚<@?-otAT$ -~©IJ1 -t#h`&%xoblbfەHqU/{kH:-Sbj_I,U -G@АF`YvˬK#mүӗ,M4foϩ. (ښ̥Ԇ-j -%wuH(8/FjJ.NV {tȗ |iںޕ\"l60#6ly-} j;\ NF|:1Evq+~+n@am:Kf`L%[x|w7Ғ'&c$Xs-]+PSƙ4yQQ#godnKJw.5KO"W^+ Vx9+vTUmףeqP符PONL5wrۮ6%W|o;ɧ}wm{۬qq3{R {"vSuaiN@Mݘf\J幄(ۢx)Q!P kG4H+j6q,q - Raj209)>+;?d}> endobj -1568 0 obj << -/D [1566 0 R /XYZ 123.806 732.53 null] ->> endobj -1565 0 obj << -/Font << /F20 1307 0 R /F58 1557 0 R /F46 1558 0 R /F19 617 0 R /F62 1569 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1572 0 obj << -/Length 2010 -/Filter /FlateDecode ->> -stream -xڵ]s6+83i&FM$ݮٙn/X9%y Y -)[~+|<|@Pf_2}ћZfJ9]\e>zƋmvq29gcDqggL+&9;< pT/&Χ:&|:=y.6~>u/v~r׋.8Rt2tkaf7G*KL -SϮMfB<>Hrna.G"krĞRP]^A(%}%ڇe @XΡ(y|OTuvTD#S{Ts:rԁ2|6nEb!qt -FH ƩB%t/ũɝPX`šBaqjsTJR,Nr m%/0D!4F9ԧ9OiqZD7SySPJ]1e<]k9F$iQ ۑ*:v8Q;ɎHv dG"`;ɎD#@$;BlGG@$;ɎD#v dG"`;BlG"Hv|ڎD#v ؎B#@$;BlG"Hv ؎B#v|ڎD#@$;BdG"HvtGۑkc,EjQ_TmyYKNʓZA3fKu:iʦodg?}Tz՘/ge|u rwR+:5*p.W'8!zC,pA!8 `C,pAA^D8 X A!8 z!8 !8 !!8!zC,pAX D/p" `C,pBtX `;#FŁM6|~t8=tkKUMzUzŬKۤi-?HͱU\츥;O*>qCz[͛]Wn1VݼoVCzn+)ڪ{6hه-b8C1cPiRf^}L"QzM8<2Jؒ8tiz3:ѥn5/jKO0KcEV<޽$^SۼkYKl) >xiEQ$l@rV9g9{hZUզ¯8īzQ֋;iH&-QrFGizI̔a*vN3WQMqJdXGaN&ќ0RJA)O(J<=O@ `(CľЫ +ҫ n:Z6# t~8Iiy8x+$c -LϤ+_6aD)0g Le}ܡ;Kz2"\oK]PkZ"qaΙ䯏z+CC:lվpx>!8_5{M]hj%ldv?xpdžrMBJe0#e 2VBSBy{q^:DQt'#X #7A}'#K;:RâNt? -endstream -endobj -1571 0 obj << -/Type /Page -/Contents 1572 0 R -/Resources 1570 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1574 0 R ->> endobj -1573 0 obj << -/D [1571 0 R /XYZ 81.963 732.53 null] ->> endobj -1570 0 obj << -/Font << /F20 1307 0 R /F60 1559 0 R /F58 1557 0 R /F61 1560 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1577 0 obj << -/Length 3060 -/Filter /FlateDecode ->> -stream -xݝKsF_x-YIJ*-C+2!)9s>z>fVԣh}яߟoGΙ(b|0-GU(M]co9ǟ_˦1E=nLUU/[r^XXS/~|x˪J缘o޼e]=c#:캔ͨ, .u~YEel5)#4YF|+>-4夷 8 _:=33I̚OPG'"R>A)~OP=&vD Gu|Q>A(1"|jQ>A(ROP'"P|( Q>A}(:D`C|P>*P"|zP>A5(M% $Ԁ *@' ?u|AT| )hd\cǹuIdh -,e=; i0H >  ?BB$ab0 "$b  b ID2!* B 2D! 11$D FD!181XP-+/b#3bP#7IA$=b#Aɐ@#TB\}u˵wMnEw-lu^']d:"\]|re̮?hl|}<݈3.:IL?htK< A(uCHe q5\ @rk)- 3VVM֒ ܿ[89a2WҿyJ46<2[|;xc#=&c b,[w/)%MТ>]/˯Jo+9?[Wߥj޶Le6kʶoz}!GLN6@Tb[ 0<"< @  x(D -xA a))axA )a)!0< H@ 00<"< @  x(*axA )axD -xBA !&I]w[=ikLjemY=Kv55GPrM OvVS#jjBMAPS#jjL@55F `j F PS#jj F `jPSc05F L 1PS#jjBM-ћHFPS#jj F L 55S#jjSs>]ee2|,Ư)hS툭D ԒZ%$D Ԓ%1XPK"jIB-@,@%$D Ԓ,@ %$ `IB-@%XAPKb$D ԒZR>$, %$D Ԓ,@%XAPK"jI D Ԓ%deOܝ%w#=z\/i #?; 0H ?  ?BB$aa"$aaI~D ? C!00$? C!00P+aaI~A$aI~@'N~̷F~?*R^9; !w9] U(=^ށb}mALJU0;="&@_/Vm5zY˝U9zW*s[TXJ]24I+}']̮IW/ѹwxI#pm'l˷-t!p "|[ !ZA@Eji1i$ZA@Eg1ff4",, ")"Bʰ", 'h~V@zE^dWCHA@pERnE[V !VU>A#}`@l4KrzW>YJםdWzǝ2`'$C0WW] 1`B㯽A+m!~Vk>Q -'c7"\D.47ϧ. $;|R;vE\WU -(JA@xx?FH;P CK`5A04>]tT"%rzF%]r--㔱> dov4{ax;jשd_375 -endstream -endobj -1576 0 obj << -/Type /Page -/Contents 1577 0 R -/Resources 1575 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1574 0 R ->> endobj -1578 0 obj << -/D [1576 0 R /XYZ 123.806 732.53 null] ->> endobj -1575 0 obj << -/Font << /F20 1307 0 R /F60 1559 0 R /F58 1557 0 R /F61 1560 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1581 0 obj << -/Length 1743 -/Filter /FlateDecode ->> -stream -xڵMs9ڪ TŊԭσMI٬MmmU61 m{49 c4hz{z,>xzkxPJc]>Z,Z.zCyAt?nE}o=x ڥ}v>N ϺI(~sEFGNR7kN|{Z_Z U1n}(!}/W- ^y\\j< 6avtή["HdP{^ RAWqIOI$'G3Zݡ#5-<޳-Px.ok8!;j"i:)SXM.ݸ;.IsAA8vQc -^ȀŁ*]tRb44XkavU5=&eIuIa`7pqESJYMx^ꋈi"xSCP AM+CxXBd!P -4 A`Y#Qj0T)AXY )5TVXRAQ)(ű -()(: -*h+O`(BXTpRxP8O A^L=%yBzPD'T xO VLi)Lk ecÐ /0ha⪂C$ -HBA״M(?ObhqU9S䳻?Kh2ŹT* -f]~Ou2;haGrF)ӤJ ,>"(5fc8en؝ќt,0x|[ {Iqa QLrXI)A, {IvMM[֐^5kDP'l-r#-4yÓ&1ۧ\m&&Όfi6] BGe$ǐ@'6Kۏ% s:q:a4[RR"8Us?:%Ȑ2a,a,չ;c:e֛]Չ {Q'*/'xs0{'x%4rC/ɢ 1LKMjz5ܗxh^ǜMS>E y njK",D2.9l\rٸ qAd㒅H%K"D6.9l\ɸd %K"D6.Yd\rٸ qAd㒃H%K"D6.qAd㒅H%K!D6.9l\ɸ qAd㒃H%K" Ҹ qAd㒃% QB6.9l\rٸܹht8eFɝ"TWz)YcI?j` ; r#ȿeau4ȡm;l턂jn6 b/,> endobj -1582 0 obj << -/D [1580 0 R /XYZ 81.963 732.53 null] ->> endobj -1579 0 obj << -/Font << /F20 1307 0 R /F60 1559 0 R /F58 1557 0 R /F61 1560 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1585 0 obj << -/Length 2376 -/Filter /FlateDecode ->> -stream -x՜]oF+E<;{:N?v(BD,!N%*M(K#g<mN< cT 6WNe7ǑUVOS4WcFgSgۤѫqgϻտNvqoݳWJ}GE;Ջyϗߞ_zb5Ԋos^nf᷍V~嬂wzѼ>ωSX -y]Tt#!*,;L2JMs.gc3j1'emaqꝣy+ORũXvei 4)cdI `qKRӠZL:#ItH6e{y=RTĪ*es >BRU -BTBRU -AJQ)QU -AJ!V)* JARU -AJ!V)*!J!RAT -AJ!V)QU -AJ!V)QU -!JARU -AJ!V)!*!zBRU -AJ!V)QU -AJ!RU -AJARU -@JUvw-9>.к]Jj>7жԖ{Pަ:Цׅ 6צBlSBl -@MBlSBl -@M)6ئbSBl -AM bSBl -AM)!6 ئ`bSBl -@M6ĦbSm -@M) 6 Ħ:C=bh ͦ -u2U-Rr_pYhnTVw4tS2W# Y9~8c`5+IYR`$4+Zm7^Jzɓ OWMcg   D   @Z7@\7@\7@\7@njApApApApBԺu uuuQ  D   @nn n n n!jApAԺBuu!u=b:0=HYJL ڏ+RBD -@H!)!" DH!)!" D`B,RBD -@H)!" XH)!" X,RAD -AH)!" DGlD -AT"RBD -@H)" D@"RE -@H؈ԡ1 R,6h۹ M*Ru;b\!s<ogdA`ZJv#)$[>Ai`Hli죇jѵtB -endstream -endobj -1584 0 obj << -/Type /Page -/Contents 1585 0 R -/Resources 1583 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1574 0 R ->> endobj -1586 0 obj << -/D [1584 0 R /XYZ 123.806 732.53 null] ->> endobj -1583 0 obj << -/Font << /F20 1307 0 R /F60 1559 0 R /F58 1557 0 R /F61 1560 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1589 0 obj << -/Length 5376 -/Filter /FlateDecode ->> -stream -xOs湆?g4GXdjN:Mc{N3t!Kͩ,PT=}&D9+x P>7/~YU|^]cMW];{w1woO;EWw|6*9}oy.OY}^lY}wzWn*O?R}o7^*=$~zu4Ӌ]iV>4kMj(5C~0P,]*Pn )UeUY>[/^~î_u0IE3ڢYm3lګ#]O{(wH9!=/kb,OM}9>i>]zxfUNʢ7z;_n7GܶEW?zk<.Oü9&c+KMRכCr^_^_$۹V}yZ/774e5벨gCkb25VKE(QwE;oPi6,$E;t(1/y< []W;Pmzf lQb( [C_t-Zu[S*15jݔłuz]BۮX5ψa]]lMeѳYӶ#[}d+j>6h`+jZj,ѧLsFf6V2mڦ(q̫J O[OżzMQYRIzL2Ym5q$ꦨz6UQwK E -"Q -v>O`˴ky1ĘcV'QK5]n7ɖ@D߾fNz-:ȉlPq '^0p&^0o@AxLx&\]/5U/5 &M` M π8/X31.LPdA&c3&^b@Alx$x%\/X//.X./-`-kОO7Non9;?_wRL -MI>ǐ Y2$!ʐ,C IH3(9C I4$!ѐH4 aԐTCb I5(aC I6$!ېD *dݐxC H8$!D&Id㐂CRI9(CIH:$C -Jd쀄CI;$!N< CBVO@X4s˛IO=AOl}V/QPg$#@: $#HB: $#@:" (uHXG atHXG atD -HXG a@:" $#P@: $#@: #QG auIduHXG:bZGi˭u(>l։6nꓻru]D閫'm5O-ϾO8`bO8`&O8`N< N8`fN8`"N40'0o&0m&0k&0i&~{q&0fS&!100/.-ۛ, \ pT  x 3%|{#%0Q-itU7:dmy{sd:b>P4 qYݝfvL HhAlЖ~y1MI=!^2D"HL a2&IL a2&HL$!2#@d $L&@d $L&HAd $Lxb$HL$!2 -&HL a2&HL !2D"S<1 $L&0@d"L&P0@d PGLN:zyvAb:su!X%8.Ͽ擧{Nw{OsyoQ^~˴ 5V`b/X}/Wu -U`[ U`Y (UȪxx*^*^q -xlpaT`I /Q/XQ -2T`B T @(O¨xxlxt,xpxl:j*Ӧen./^ނ3$l[jGjg/ m1iL s*YˉS+];y$7N2坱n3Eԑ=[$!mDI[$!pE"JdsERI]$!wDHX^$!zEJd}EI`$ -`$!VIa(Fb (FJd4FId@Yd aLFBIHe(c)e$!dv#&ivm6z~"7ߐf 4k*ʚla/@4# $L30@4 ӌ$D30@4 $L3≑f aiIf aiHf iY<1 $L3@B4 $L30HB4 $L3@4# ,iHf aD(f aiv#iV/i_>-u?֓λMƞCHSF$ھ=dP̏ߝ#M>ZbY䯷]#i-)bKo^i] DMXpSuiyTiOj<ܬWO\IZ {OWnj>uUۣt G>ZޝWOqI3ckDPVwzon+z>r)d V(= C -; -(;`R;uF;PM}٬ténꓻru>v'=Ui$=3 aϐ@ H4 aӀQCR H5 a׀a I6h0n@º $0p@ $dRr@ 3'IH: !ꀂHX;$!HH<`O ${H",0}@9Ytcx浒ՒKrm^ ^qFHg aqIg aqHg$!#@8 $3@8 $3HA8 $xbHg$!p -Hg apHg !qFY<1 $30@8#3P0@8 PGL,͙nՒ{"02P,^0,^0@A" x̱xa,\-/b%/b fX` FX /X`./P++^@Axx+\/X\/[X[/Z`Ze -Vs~\xIT%M(c I5(aC I6$!ېpY7$!ސ|CIH8(6I9$!各9$!萄CIdBIH;$!CJdD&)<$!ԃ=$!CY> DH?$!CJD -I@$!Im_y.UOaA{Fa/@," $"0@, $"0@, $"≑E aYfIE aYfHE YfQ<1$"@B,$"0HB, $"@," (YfHE aDf(E aYt#Y>Sr ߐzuv ] yhꧯ\ ik'/L2iBȤoO^fi%m?9K!ֳۛO^y%9HNX_icKkFZ*m"?r!꛼Tmpwg]{sMڎfq{uVU/5 -endstream -endobj -1588 0 obj << -/Type /Page -/Contents 1589 0 R -/Resources 1587 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1574 0 R ->> endobj -1590 0 obj << -/D [1588 0 R /XYZ 81.963 732.53 null] ->> endobj -1587 0 obj << -/Font << /F20 1307 0 R /F60 1559 0 R /F58 1557 0 R /F61 1560 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1593 0 obj << -/Length 3628 -/Filter /FlateDecode ->> -stream -xKs=0Xevf{n,dvlGSrHPFB Yv~}z.^*Y"`ƥ8=ʏN/G-Qjqtz1iwGM]_>Q:>=lًGrOds}ӽ6t_}z:"E?/OwOҏˢϧL&;]O?oF ];52l1EG[K3J],f(?nݱ|>;.h,~_/t1ݭbNl-&@X1Š*&@X1Š VLC1B+&@X1Š *&"a+&@X1Š*&@b b b!TLb 'b"D.& X1Š VLb" VLP1 VLP1Šib(];bC1;Ҷ*[Z~ Êft|{KXë);yJBJf =Eu:[E|a |c+_ܶC;ҁ$EӬG;Â?-B5_ZL^M>>F_srH_W(LAl0BBh€yխRg+=۰y2ݼ׮"C+İݍ +'/.i_}q:v3^p), 拏NЇjիm9>QSeM& M!49@DBBhr@MaD!49 &yr<9 &BD!69 &yr@M! "O!49 &""hr@M!49@DBB49 &ȓBhrM];oCtbIrw=>'mK~SxO)cz5([3 $2 eĐP2 2@@X2 $2!a@B(a@@(`He ,a! 3 e , e @ e ! ܟ2p׎ؐqNeM>(jяQ»ʕ)EB`=R͔Υejh!P2]mQ-m6ަ) +.t[ըn﷼d9= -U\k>Ũj'D}rq+&Sb6}뫼ז(#m>]:TzrM?"V -endstream -endobj -1592 0 obj << -/Type /Page -/Contents 1593 0 R -/Resources 1591 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1574 0 R ->> endobj -1594 0 obj << -/D [1592 0 R /XYZ 123.806 732.53 null] ->> endobj -1591 0 obj << -/Font << /F20 1307 0 R /F60 1559 0 R /F58 1557 0 R /F61 1560 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1599 0 obj << -/Length 2139 -/Filter /FlateDecode ->> -stream -xڵXK8W62+zPcv0 gF6@2R$woha\LX,UѡwB8((4v_YIvٿǛręUzϷ[na; - ~LT_"-3x~}yow7K[zb[@QPp &?->z ) ;q(T%0E8R^qe0/ (K;-I,7 6 am׷ mMz$ 3'TTH' ԃ0o@%L0+g#_ێ'ѕmMœ - -XvTڵCЯl-@!>j_vmWHU6'ӠYvhcm^8( M;,Ė}mtyV9q˺̃' | "2`pt1@X84|5!.# K0_"ۦhx5* 2,tz&E=,ᗯȢs ΌYVTh9L;Ƹ[M{Ju74o WU y s0_RW"A vʨق?Jq2=A\x8iBarj.ETv4xP gCa7[4*' -*C236fo^wtKLVR?ꎐӃ ċ0?AWz̡֚ e>:vVVqI0 9p ێؙ"(Y m`niV[9 sS\?t,ƪ4+儳3s;7nd}ߖmU'ڰHww{MVQf`uME d4I-c8v f !KwL͖EaSm1V1P"Y'y%}SD$t4d ɩuN$*7=|l>1 6יBe TL@jIK+*S -u <#qy/Tnxgty0:|F +pP([ 0 2gFifT;.,c:Ջ}&ߵW6?n[8U,/rƾ#]!ɸՈX?4̂M+ϸ׈1:mIax&R$ -|K̆0/i0Vm#pnSLܟK禶7SC6g}rX,V\FwGG݋W&OB\+˄a:7*#\NJC?* 3u5⇭ٳ!?Lb@)9> endobj -1595 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [223.103 121.946 230.947 132.172] -/Subtype /Link -/A << /S /GoTo /D (chapter.4) >> ->> endobj -1600 0 obj << -/D [1598 0 R /XYZ 81.963 732.53 null] ->> endobj -46 0 obj << -/D [1598 0 R /XYZ 81.963 712.73 null] ->> endobj -1597 0 obj << -/Font << /F20 1307 0 R /F44 1543 0 R /F16 616 0 R /F19 617 0 R /F40 1308 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1605 0 obj << -/Length 1649 -/Filter /FlateDecode ->> -stream -xڝْF_-/G6]RhȖCRyVOrXg/緞c C-ĉ؏$ -mf "\qy5_^,xD͖nb+yf57o^|خLjvc/\,Vl5sA[rhVZ8Vwc:keIbpimfc36]NL\ q8ǍI_ձ,RM=wŦ_K#Zu;O<}+=_xQ 2I|oVUMІ޴ <8~Pߟ2Mj* !>4>hN@0';wbU2[4u8\%oS(ZJm.=X _ϬEy*xL0Yx_Q)6_Bf!ۼ@Ǒ35Zޠ݌|Зe ]?eI_"ڦ3uR5Pc$f gM{eI!d q ^:eT-"BkLƒ rZFCs! Mȿt,ʼn/j,;>D(g !=(ç>SYdߡuW+8y"*V8xW<~k3BR31P! QwbK>.*5sHG++W'5Uх~h3M_}j"ΘtʙBb8bZ -RW̥/ӯ)Bň3F<R|5v]Tkl~pBGjmxpEŬiS*]-O<O6ϟ.oi{QhAlߍYk#ރX]fܵJU4M}82H9{h|c+` wԜ $eZ,3yQՋk{On"ҦmxŇόתJй)$fJQqh3I>8dp7S}㊒j>,+0hu+NTdKqj ؀EǤ៦/}9z=|}yf_}4ǵJF j bn=KC3  3p(.}hqwo|"S:V}`9pWTff f9j:\hrRZ[&)DW22έf%#.ZF]]&+S͠a0(q;-j! Bǀd9A -|Vqbv4ҊZW9@sc e(Y@D~ĝ7 0k~3v:5BȖe 2Im O@wl9:ī%$ۊ/wxHCR~0eX.&rSQ ɾk1Ȩ=$lfP M_̞#G=V`{^~~'&E(a7a^0R/<%X.班:kw^8νQZbo?Ԍ:#4_H\;Ln4a)5 -endstream -endobj -1604 0 obj << -/Type /Page -/Contents 1605 0 R -/Resources 1603 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1601 0 R -/Annots [ 1596 0 R 1602 0 R ] ->> endobj -1596 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [396.672 668.563 413.619 681.114] -/Subtype /Link -/A << /S /GoTo /D (section*.8) >> ->> endobj -1602 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [146.866 423.947 154.71 433.647] -/Subtype /Link -/A << /S /GoTo /D (cite.StripingLasco) >> ->> endobj -1606 0 obj << -/D [1604 0 R /XYZ 123.806 732.53 null] ->> endobj -50 0 obj << -/D [1604 0 R /XYZ 123.806 499.994 null] ->> endobj -54 0 obj << -/D [1604 0 R /XYZ 123.806 378.583 null] ->> endobj -1603 0 obj << -/Font << /F20 1307 0 R /F19 617 0 R /F40 1308 0 R /F16 616 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1613 0 obj << -/Length 1598 -/Filter /FlateDecode ->> -stream -xڽW_o6 ϧ|hϱlٲKö$6Šغ;-s٧)ʹsri ؋-QIT8xwwGǧI$<`*(XTi,*PFn˔ax6/,V")Cǧ,ɲE"se9^lHw;(՞L ­V}שZm+iuZ=K)B~7HU G{\\8KF$0 Trw!?&JĎ?= jx$N[XrCERj0bEx(p[Z4.")ӌ`mӯfҬt'2n~=ЊHK#0 B]+bI`:.B)E f<\ ~]F@POp5vq"VoU\w`U\v@j gKǚF1LF3Gv6EQU{t1jXQZcl(0n_^/!pipVDpΟs{}vÉA`Ą%ӨG>ە17@ra, --117t}3n3$ݕ"sI,y0AA"!n?vpo͈$V,vFIhbn4rE+h(ׁ³_N|D -sV~ 2ε4.)\DIX [*: õZBwNdݭ c&1Pnts\+s0)r8eHyƸ eӨF=v%H5['9vO '"mOz$O9:KM2VF;"v#- -|n< }WpMRݑۍn<MD/Gu}Db86 (Ԅ}mΠnt?z5bUE +}ȂY󶑝{v@NƮo]*ѵ=9-<0\"un(Cnz/k-w/EoW{ vy5jWF''T8$γ8##K#gk/YɫW8Z)Xt -WNi^v([9K FZ޺[?j|c{62qgZ:v((/1(@{8dGkkfc.Eoh}zF{а껂A:c_^ e=({ᯂ20Y&^\Gܜ%Nr țS}mݾ9>C#G_7eZEPҎV]zPOJ2SFE1D> endobj -1608 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [286.878 442.393 303.825 452.62] -/Subtype /Link -/A << /S /GoTo /D (table.3.1) >> ->> endobj -1609 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [135.816 186.918 149.512 196.618] -/Subtype /Link -/A << /S /GoTo /D (cite.SEDA) >> ->> endobj -1610 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [98.895 118.359 247.302 132.307] -/Subtype/Link/A<> ->> endobj -1614 0 obj << -/D [1612 0 R /XYZ 81.963 732.53 null] ->> endobj -58 0 obj << -/D [1612 0 R /XYZ 81.963 712.73 null] ->> endobj -1615 0 obj << -/D [1612 0 R /XYZ 210.293 322.197 null] ->> endobj -62 0 obj << -/D [1612 0 R /XYZ 81.963 281.924 null] ->> endobj -1611 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R /F40 1308 0 R /F42 1532 0 R /F57 1552 0 R /F45 1544 0 R /F55 1545 0 R /F56 1546 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1622 0 obj << -/Length 1602 -/Filter /FlateDecode ->> -stream -xڕWYs6~ׯ#5c3ocN:4a(bC -.H9".awzw^\Y_q,ΓY4R,_fHr}D__٬?n^.7/+ZADždY^ٮ>| -lB&{-XIv*Ɠk0dikuW6mݭ!T]y+#c N^5Ĩ;4;շDmiSUx&Zd~4*) __KL EQBM}.֎%.*4e4Hm3膟Vl4C&]Z6],łޞצ*ͱw\ 1ޛګ[bM]Qi]knFYPm(7; Pw7/W+-Õl)iod>):Cћ<6EO;p|aj|+AwY̯tzr~ 02p:߭:vpM8h=2<}=B 1]kie]oA]9K=TM\B0|ucb@a!:>ut=d6)8{MIBy00ATmj]]A. -0{ثˌ]0ݜ3HȘwb3A3T;0.8Kd0;CȚrV[;?'xݑ$e0lyAC,Me]g9` \c{ΗUvs8׭^(A.4`~E L&m) 1XNs_ХN0"&D,a)XH7).gD[{u>ԟ֏T-wwE鶡á U麯籗< Mg~܋f.F" 'bg3gW E99b?aJ_u{hݐ.ptִGxÀ$o $:4cQt22~ѩ8:9V, , L_r@P-vr3y`S7]C -x,K$z:FVY3ۣ@n-8+"ˢiURibBfx07UKc @wFLjK/; -.vIχb:8XYrb Q u:u] 3uQzRtD #U _l EGtŸFu]m†E 1 uM :(V6vjr@hiI#쪝y;,;=Tڮ0h4̱ R2;"1`9j5T$Xq2҆t|n)6#f1F/o; )2 -)x; -jٙC}C~֏` v -[$I7gv8(*JlJ$,IOY q( O'D$g$.{{cw1ձ/u9_l槦m@!2x4/,m -endstream -endobj -1621 0 obj << -/Type /Page -/Contents 1622 0 R -/Resources 1620 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1601 0 R -/Annots [ 1617 0 R 1619 0 R ] ->> endobj -1618 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/xtreemfs_client_stages.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1625 0 R -/BBox [0 0 504 360] -/Resources << -/Font << /F1 1626 0 R/F2 1627 0 R>> -/ProcSet [ /PDF /Text ] ->> -/Length 1628 0 R -/Filter /FlateDecode ->> -stream -x}ˎ%r|YR;4Kf-$JN{gUu%4Yfzz#}^_ay\߿Gn[}#ׅO=^omTDZ=o^׹"Q2")T}$U2I)2(HIR[!)EF֒ToHA02JF: sOCFc6x)n-:(2jaϯr<4dON<)c9 K]G@Fnl,UdE[fmoHJntxv= =TyYHEK(^H)9]H R` P#$3u(xG =Ty$` %GT&I Re#5_}unR $(Cc)udݛWB"0+zA:5rL(51KZw41ԫG*gr;JxwU6"GTǁTg5Ac㎇5&s1nrȱ^ح@Y`U uAE{ST&^G@F%O4XL,Ah=>*$wSwSA%#䢩~xHJdDAjЄ+"[%[[x "[25Q;.eߤI]P2 `2rcϥ&Nu؈Z*"SIn-? [;,+?`|i1<;fMdC dDAnVp 16v:ȿb2dϤZbld(HUvFndlԆxLvL #6>>;&(Q*㽲cϥ:;f@FRQb2GbTgTvѹ2reϥ;X@Fl~Լ1' MANcʎ d'_Qgǜȝ\jc<@F^gR U.9&(Qj.&8\j{vZYo,4OvQ# z@f93}C[k -kQssE*޾ F͏NfvX0znAjwp'L)9]Xn97odEEQiGswiwx7{/Pv0M:Bׄ5LU\7K4Xz쌆\U; -&#"M*ыi#6`9&!>䘆L#̫+Q#W1B29&P3I^}GԚ4ֺh8ihyM![g 2rQ$KQohaDxθPaȝ\c>I8\唜q&uZ'dχLfn?߿L[?z/+I^K_1_}x~%3R}{8cFIP HV@i (  -|#Y]vܨ[r>z!9_/rkEp\dr@Ϝ3P$;XWF9t -%cqj'i0]h4.EԤS{ RbM$Cv% ChqdW+=Ci#qN4 .]J;Jj}giu 'CiHϨ R6z%`[3{! ݙv -״=_Myt2ԗ/\NN3UvQa-ݼm:ʵ?mFC;ґڋ3{/Njx/ɛv^1P#ԂmR#s%l߭(eOaZ(k?hK}!-gh1J&zC{AKUmWhi;p{ZCr^2JF;Uǁsy%vN #g~ăҚD84J;ٞ8R#jtLAXr~{ E'TttN32 B -Z##T2y (EF@HEF"LE3Q,VsXuHPF&c*4g/23q"xWtJDXB7 b%3TH5.2D4_ڃPQ"CAg& -%P"- :y@3θ_Wz~f& ACVIh*h8A]2;?%FpXt=v@ OpNh:=FOˮ_M6ܢAgPFl&NTi2 Xeʂeod]5O"22y\UUF#d,2:y^t;L^E@*2*_y3Ud -X'PtqHhV%@*9\R;j.*lkۄH78{|#Z>rso3=95H `mX.EvHZ$V0(D-H$ʸ jHed787 D U=@ldf< 5vl;f<$̟63P,V)o:i*bJ'_:Wd U:[K?!=dk2*.lȋN<:RLw(H vQCFl~Ը1]Ӡ+8f':2` #6>:;@FRsrې<S֙gK' ݎscNn~E{l~+mpC /n3ϥ -↸!#s'y.9k^sNtdōrCF^l|.3_27d9py.1sCF\jc醌y< %n51JU T UxJS'(ԧz}l-{& 6ܳzOfNP+ޡCb*9_M;&L'=ҒA]Cxuw/4 z?p*]H# /:,_~鿦Eʾxh -|h?hJzX=?}ˉcb7(luh_%=ѿAOb:_%'~:Gɑ?Dهq_9S'?ѠAo~EQ̙4u~Dˏ"*{P񞂿ny'Л>\^ }+GAG>}x?xs>9ޯkCoo;[ضڶ# *vBm'Nbiuom*ۅk~Y%1VMՒv3J¶G9|↰|l8]I|]DACzKaԥF*h)sF8_А9Œy.u(' 22X2ϥ@ei>B aِ8Q ņi1;&ņ *3d۟lmE9r;3۟4;5ZH*6ep"X,Gf&UYlhG ǝ}3Onh|4Dto2WvPcXN#]k橈|U6wq]*(fh7^]c3Wl8؎OS|oz8JFī_+2j뙴\qcȨ~#-V)κ1-fKq ,.)DV2 Y7Z$7̱6n⌛ݰ#IDV2"Y7䑪lY7s)κ "`$κaKqn 22g0ϻ,97@vϕ3sƍ!rz;fCFL%y (n \8Sy.U1 g2raϥ:;g-  Kq :&U9JFR3oJ \9y.ř7{@r2(HqM!#s |0u6-ݎ/Pg2*g+1ϯ7(3o R@cȜ<#윝FsHcvwΉV2pE/ΉV2"s@FɈTe!#W~s)r2 -xrʐQ9[yv=3O|ȓR}|vL #s>\7 (:BrlD|9fś1[Ɉo>PVc\Bo%# -R@Y+)V2"o>P/nR(H ܎jm 31km gR)c9qy.U̝؉{ 1;A]5؟evfj? yo;P35؟0ϥxہng`KGN7du;fv])o%#)tMy+Q옅0dd10ϤŎYe*cvY}oUo;`g`I5EŽ jpJ ]Z,P:f[$q|XF<2"b_*-F1C~t$rǙlX A!l< zl#da$z5ED4'Y ZDH>~XtdUx Cc,%"$z|᎕9E{ǃ֛{1Ikdp܏qƱC~"*Z2ŠE䫛qgq\ ^IWac3exxסgؐyΘy^qqp( 4dde7!`76ʤoB< <skm&eÐ;!Kѳ CFc6Le76 53%Mr2lYjXgJ ^~隥4p\,H>k==(뀳F˝!8.aO@ʺW#D$_^gId I EG"RD({!MbGU$ HHڨ{FR\FKId$/g_&X&FY MD,H,ߣ0"+YInIYR6⑱6?t0;K2n{E+|N+Qz[%i){$kZ5tR֚N{~PV(Ίswud*}WDմaDE6!oL;?$:hqD:KB5Bn -~mT- ` --:Oy{4a*YbwOD4>ە<>C|nLs|+s y\?yr__K{t\2lѹW{|ka|'0[849sq<##D矌?!B<~Oǧ3yQ7[|߉Εs99,>3v9S[W ߏ߉͙bu'.[.x㸜qe [mlldE!?+EZ{{Te#?>Qڰ >Ѥyd#v՚%%oTR2{׭-OC.,;EYw8%\8)9\Fs^p)>s!t uׂ_?h,_dI -Z,Lmߴ䣑IMAfLCX"]U*-vrnR,̘[:7 `Df>S)GCi(pLUu2J1Sntn|8Sɓ|MXZ>Z$PQ Z,dU.2 U$_SQ 45YqJ*Ȕk$2g*0/55Fȇ{򵫑)QT*ڕUՎu4CJdS?21 fbv$U1*s_oD-@PG0_iw2AT5ԙ#&2&ѹJ'#hJ;F+v/L=bQ[H?}<~8-'T6LKŔF+ڶ; %rXA? W?3vQ>Ogf]]FT'NPS .PB " *@bAU]XAe *L`I1iژXAAKf42 3|0pzAIsoGZ,RF= `͒ -h<*<%3Tq#{![W)d-@PrGH |ʻ8%5&A*b*c* -@br|MR Z,פ[*L*SEh+2_Y\)MT! JJ'#h <WYd-xs%\ (ZU:vAfbE&æ|8>פ{*]ai(0",56cULJ'3h$_IWYd --̣!zaI C2J'_2cg'#,5TqǷ}k:wE -|mQ3&m?s|mQ3&-ҩE\%XA-5sH l80eVFMkv5TjXA_BM_ k{+X#RӚ8L:V|&SʻB=Vr;7 `DjXUZ&.qMS)Z&.qrjR `Dj\U)(0P{̮@3):^_ =l0mHAG3\VPt#r3#\|Q̴x%)#=؋]pqJ?f`Q7~Q/7#`_pNTdWC`q,s|BU -#q!>VpG$c0H"KL&<4^ɽ"hkJ |~F?@mF _JyK3[Uh޲0"[UhUhޒ{yZ| Lqa.D -[LFyKx -w1Ѽ%q\e 0O1ԏ[XA-wO`D$irxx|yK м嫩z4M/׮DL|8_cMZSZ,Ϊh=#cfJ95g=#qx^ -xEMZ1;!R` &8Wi*CJ!ShJU:7 `L>/Z!\ME-]dqNƱ8"B']#XA"p|TfuZ`.|8R:-0"/ qxJ%zFm6Z`u՚%{&:$TAD"M4莩ў#s^,@VֺkKhzMXgtQk44DL7h}iPLJ$Cw+UIe*@>+]&槮5FR..FNAULS:>M#&'e\{^'Y:0]ҀJ=NmkU_ۧmޠ?'| ^.žft&T͎b[ubIx0sNb^-ׅ'|u w0^RILKlZ{\X;Pft^~w CYvZ5K,8\8|}sh1J֟,8#nΐNiNpt0$9 Ȩ~qI9CLkЫ u>s #La'-_ ~t@ א932ܝ \p'^Y.=I}{k;4;޹]Y9'^Cp=eH4}髹[m 0bg j ˮJ -@{V_$K>F,x -/'ʳOA&*ƇP MnuA{v֞ -۹== &RHӏ}'HCArM8 ɩImxӣ@;V,'86~'1..Zu..G⢪]?뻨h8**:h'}*AdlȘ?峨,.+}_B\("9b>Ș矋bh!}\3q1p"Ey"ธ9.wqq1V7OxΉBu\!sqX9.ZHAR^懅BP@ ##E $.vi DEkaܣb(*Ob>5oߏâQb#cq1'qqg-M iϒh؊{kODs>{j5\(J?lH)W[%45]aߊS~RCXl2q~[fk܂+ҊWk<#7릙ԓ~'_\aEܓ~e^GHP -9Lr.}]~y퉏oY~ќ~2]PϪMV,g NHm[v+)u7}^W}+|lu"[̷ _u2eG.|ː[/6-[̷3S -endstream -endobj -1625 0 obj -<< -/Author -/Creator -/Producer -/CreationDate (D:20090414162455+02'00') ->> -endobj -1626 0 obj -<< -/Type /Font -/Subtype /TrueType -/BaseFont /BAAAAA#2BArial-BoldMT -/FirstChar 0 -/LastChar 23 -/Widths [ 750 610 722 666 666 722 277 722 277 666 389 610 556 556 666 333 556 889 666 277 610 833 722 777] -/FontDescriptor 1629 0 R -/ToUnicode 1630 0 R ->> -endobj -1627 0 obj -<< -/Type /Font -/Subtype /TrueType -/BaseFont /CAAAAA#2BArialMT -/FirstChar 0 -/LastChar 3 -/Widths [ 750 722 556 556] -/FontDescriptor 1631 0 R -/ToUnicode 1632 0 R ->> -endobj -1628 0 obj -13383 -endobj -1629 0 obj -<< -/Type /FontDescriptor -/FontName /BAAAAA#2BArial-BoldMT -/Flags 4 -/FontBBox [ -627 -376 2000 1018] -/ItalicAngle 0 -/Ascent 905 -/Descent 211 -/CapHeight 1017 -/StemV 80 -/FontFile2 1633 0 R ->> -endobj -1630 0 obj -<< -/Length 326 -/Filter /FlateDecode ->> -stream -x]Mn0ta!RR$Qi@!E*2΂3C[ {q՜3M/hts -TAuD5v6]fcc(--bsipGՆq{ F0^Ȩ,>n\F/`/DJㄣIl;3W -)KQu[.\&A*eSyǼCXC=s3OS|:@F~|f5Ko"ًyΟx2?~O5?1_z;x}ߟus.0}'vQL -endstream -endobj -1631 0 obj -<< -/Type /FontDescriptor -/FontName /CAAAAA#2BArialMT -/Flags 4 -/FontBBox [ -664 -324 2000 1006] -/ItalicAngle 0 -/Ascent 905 -/Descent 211 -/CapHeight 1005 -/StemV 80 -/FontFile2 1634 0 R ->> -endobj -1632 0 obj -<< -/Length 236 -/Filter /FlateDecode ->> -stream -x]Pj0+dc)n?@֮Z>Rzagٕ.W -p +'EUu&Xͬ%14o<[m;0/d`qk_8ODۂőst|3w.m{ ޷P^]`q i?hj\Za4XYRc2 ?f|(*7uNqrR-rC̮r -endstream -endobj -1633 0 obj -<< -/Length 1635 0 R -/Filter /FlateDecode -/Length1 20948 ->> -stream -x|{|Tݽl{%/@$74@D! y -PQ`fmkB5ߊET*fwfv |nfΙ3̜s& `N@[esgcvE|@^ey7@zgl~`u$Vh7o0f1in܍+Vfڈ`veҺϮ7yֵWenUϬ:u-m0@ oimh)xe{}LX -h2[6#o>Hi$>}!çY3tVr$E?Ax!D^-OÕ -`'T J""GkŸ~>w"| >>àM`)0A߯P/rK c{EP%*nNpKÍ0 -Ro?t'GY7] ?CAxBDk ӕ`-tq -t.A dN)HfӧDSxj=}k}ҵ/A,j0\RAn$d'!9Zԋw`o9 p5 ѷO@/< /W8Ol $SMsi A?ۅʼn4&5=ni\'?ïcXt(CކQo`{?\{GuZ JR쵙n=Iߣ?үIH& Dž' tq8^+.82yLi_:($u-O;3V^]=F`8@5/qH -@ I)'5:@n'.C~ TF}.uI7{=B_oS,jO/\),Іvap'zvp@8!!>⨹QbxO|V|]ZZ= ҀtIݍ:y\!oߔo!Id j\-h|zL4;pD-Ÿ&jTVz586|d-jIr;zQqnu:/8E(qEK=S~AzR#m!Ӱj NaX\J"lk걇IPAzpC!¯ߣ T$ @2J -cCsQ8{Lݸ{%d5jaE; ̅D7\hCx6~ OhO%Z+L.,ȟ蟐7>7g\Xߘ̌3*9)1!튋u86l2*D;[Vkbw֬lV!n6"RZK95\wZS$6Ǫ3jRGϫBRo8q3))(p(UV([kFm)6cT{7(cG1"jD,T1ތJ3RA@HQWW541%:{lL_]ﴀY`:&y7j#=c`ITﭯ* U>>4bwL46QnTYkW56Ҵڮ2z+:|ѻ.Re0"5xg0Jj]uc-MBWO &$hAHvUVySʼnҤ't_d#X<iggXaJ TEMhS -ki᧚TG1`^eL> ټjW=(Ef -d8԰cư㘢Syyb5}tŦ"@Azr?% > `!9*RVaIb_uֲ 5 YM煚aZ/FЧXmq13VLQ/_-JUmy%H}p] LiŠnL1 t<%',`ɫ*'G1).E L]ZrIL]+]]%ueuuyղڮpjv}t_Wˌ >%1PXA&cR%= WvwOeU:vZuhǣƩtJ*+A9@R=J:y /,6~T ôg) >Zŀ$Pd1D ^BT8Fa7}ECEsl_*bma6>7ŞbOÌ;UNoƺIw=Z^uRs/?ԋ9mz׃ 3 usX7_@-ij5RhPܐG>WC%jsl54rԬF(H"l=%6١)~Q7t?|FCV els 33 5E]=NǺ:d"@ɨOXRĊD%3݉b"*B<=a|EgjV8lqQ &5cRNW\܄I&cmMMOHx?4wˆ{۩ dw8^x?|߅B߼3 -A%'+}ɇ36VcXW+k2ue)ǮM;yG Ry_L}+N]-6WSƘGr\:{|sfsW^eyjA1u:ooKSY$En-^7I{H hBO"Iv -0!՟K4ՒmcsrB _]ĥŸr9#=a'Q[9Dè|AUhճ~Ysv'IJ)tѽ|G|黉Ǣ8pxi+fϢ4sSޛơVtAҤ -S$T+H$S @OwqxA٨ĒMWF7BsŇ`J2#ߖwǏhZ^#ht=l9ePtz2Rf)z8N$$Lke Ÿΰ.~M={Nղa dQ&lbͮ:5Ťb2l3Sݺn@wR'6xRoJM`a{CM|5[m?!B2i]gIQn=^Ƿ:_z{CZy߾ucY=#۟z'ߓ)C -sFWMZoVtR-̔rm:ih:$ژ8$&&$w&K6H. HZ~1Dmd썧{Xo8d_}qϡ5ӯ5[:M}ءwėB㖔T0+/NY_),I㨲8D`5yL>SDMsMGjYL@N͐kh1zcCt }$K3Rډ %~hY_pg7,wa r4偉xQ -&-:d\u:;!JkyŔ9bΛJ'~5@OćF3Dvj>!g_|+~C/hmQ̢jNKKgxVztFٶOK+fݝzGۃх@sPNMlIO*&=oy6g;J34ږ95ER& -wEo4gtAw =gB_wuGSӃ65[+/z~t~0Fkt vi[2WDK'sfI/'n]. -H5tJ:ɓd\%2~F6/NVsEJXԋuVq|DyK|_N1 ,8Q(bL4ĊderO|^|U9/pub_ToA-dx"e@ `lX լqB:58)5H:1Z}7;Vjc:HN\t17 UAͨokm]Q`d:Ȏsf6 Eh0狭*gqC91ȉAm|}nɦq( B9E5pN{\kVn%,@HJLL -`"C5~F -"CNGTOF C+CϳQqTcYGDbnկ3[2t,FٶIt:llbtb ZCh5X2A͍ŒX\I.WX(hxF6 $C3P^EIɼȜ=9h(zu8jrї"(߸ e ;ZMyS2Nh#aF -S=l/cpK,̰`ˑceM`+B|o7yzk6V̛?m! wfmq+Ai|MYwqy@xX)?lx<)HIjHK蒺 ?"xEsRjZNq]ܭtoSbrs4'EYQ:(%[gzq6#"F#{^u{ f94<Rim耙_ {뾳`јG`p;2xF/7$̀;>i^Zc_!_&$P  Cx(3T0d! I'tC\_ӲGJu*KU .G I܂AVd -nW%"p >"c^ev- 9J@'2B˱0عy):;ۜ'8mNՙ /S0L(.n۾gY~G ylw#^3]%8ab<`Hʸʽ䖫o.4n$郡}I0oɉ7 m,-7'$'F+3>dxؼö_ڧ55%N2ԕ)sG7Nmk9ɚ%&c5o}!Db-.^ -KZvc<'xU?Yˎ@wbwG\ -78l DbQ2o 9ngqМn-YFY1Kad/W<ė * 2q| / V8 -A^2KR},Op4kx daZX ~<|xT3~lE٫h|!_5c"7K'}z(ǻġ҄--9?V pt X2U_)l`v~dơ/I i#䡿JGx^xF̞7ea԰{6ҀtR"r(u#AY*RF!^,ozuM+]O.W2|AQbhh3x/+Ų m0ܨ'  Go6ngWw)mû3żְNn0lUQ@oV(l"ȥ\,5+1T)[ɱdo[dDe*~0BO0Dr~e{ŭC~K*L"-w Faɂ4x E0ޏ<v^a _P$IH|Et>g~}aVShٜn> 8C і"H@ oF \N%K= PDq.Q\^>:p pro(fznDiR' I7Eq -+Gq;K`Dq⇣ 5KQ\ˏfPw LDȯGq9μE#uH㣸2~|G_ 9GI?;Ws_FqQ?űMÌ(7\ho߰9QEq2qnvsC8'q⨏E清E%1dq]Q۱Dta>C˭w2},EqC"iy>Z~8(#1QOdcjqL8.⨏u=cgߎfcjqL9>rGX#zfv>"Sq5ǹ]6{Gǘ -8s[L|\luQ5ӠB.PX%0zhXjEuHo㰦VWH[K { ]VCi(i<0dXiDl-s2FXX ˰˶ڸț=BKhajc[MHcc6#r Ԉ%+ VK[Py+5*Z XεemMr+k˱<m]=j87Ò-sx -:e,*xOpܢȈ0 -1p/cܷ֨v(2˸֌y={JEJ+ש=&H{_}~KxFdeΦa-"h#5^c-כy6Dʌw)=R{IX&g!d$nbcX^Y02/kʈ1bDli]K~z7Y"QoΔ/̫%k9\*=+M[ͭ-ͭuMԒ+WZ4ԏ+im[9yeɜ2E m(N;Q͜ݸyY{E۪p4uj{k]}ê֛eT9ImǺM ninUU]652LdYikƦe6%˜ƥ+WֵU+갹uꂺz4D_XWܡ[v5FhvYolkYڈĥXӀMmih]T_lbM`kS[Z;3k׮@EF􀰱iʎzM+׫Yjê%;ggַ61+{.vv)ܢF쥽aek#Z߼ies]N1<.-j}fYѰRE+l ]ZČ%<TYqKj4{F_Bρ?8sρ8p ݍtU\p5((cLK.pX+yi]i͗mb"Pf\ZiMkK/W?Sԇ͢G*NQ‘ܗnzZD(D#Ⱥr> Z1L'vxQ?L>_pTvg& -6ULݘЄgzesև0 2yg?yL87$ .d䃽ZiD`xH$X& -(6}vcz:b -cž`[x -8O LaLj| .(|[ozA 7"}b]8j]8R]8R]TF# -Z؆i7,b~7:v]Ik0AG gs,yDž66lS{]n^w"h b\A86$Dž$tsL0* xdNoзpQZ:ddR08XD?nn(=J_ƳG]Oaa? S^Ѿ^#As3DOZq%FG\^I}I;G#|@*vxst"2<( =B>OC{B (3p(cA*rs -S~zT\s'>GE@C9L{1ݎ)SlLi<6h0e`J. .^ff`o"32Qh0#A_0c.K<%r2ة<#wᡠ4V( z"3!6LGdQfp~г=Y|t=;J,REFGz=S=[lz&^T~R%99'"8GiXc\ (( 0gof#I;y3>=E7.>zPtzr=٧=m<yǢǤ_GMV&Orضhm EqA#*+;PHi81i -endstream -endobj -1634 0 obj -<< -/Length 1636 0 R -/Filter /FlateDecode -/Length1 12800 ->> -stream -xZyx[ŵ?3j͊w֕e+elj,^[0%Xy1b+c9BKX+<C*xI ck4%5$,}gF׎MC{>4>39̙3gΌd`M""cSX2}1ym 5[%Y׽uW~L3&;.d4^ z;<~ߖސ&[Hc_m[4Px'+.{W<^}@#`a/B-S_4 )C3H]|t$~Q$AxQ{a -p/\ ?A +s34b $]Epu/mpRH\ ۅWqv0BT2mV;u0.%U]S FsЁP#{rgY"_6(/lFDhuu?|HȕB ZyHgQmCQfҠc Z`?(< o C\/CkF+Y1Jӡ%Aox^&N+4 -5HYЂ G|NaZP,K2HYJV4H@3 q&fPL#.1q k}ZCW|`J?HH~@!G$rzZ6 -OXĐx-ړώJr,| Õ1x;ѐb"i!DzF${#d2y|DF>#_QAs8iLHǰLBR-*Dn!sfff133ZZ=_s玏M;GF)B2aFzq{Ube|\YM֓d Fz Fw4l6 :VӥX.~AKA'$f!Y m_ [,(QxO8+|EE#DH\-jVi~6^A{6nnnnMC_0<x Nxnt} y5t - 3!7ѫ>٢-d ]_,-H=itV̚6I| -0µh d=5Zs>'o-?$?a<-.дC~!l$W/b/!Lh>\)<7ݤS\lr%|㩘koh@S>#RKM\Oڄ]Mcb<~3F҅'*6*VM -YYy ݮEW㭲 -x=P%4 ' 3̋!va"fPx4 -4&FX< (G ->Q-?C~z!Oqrf!=Y&m;'/F;X~'a@4Ar:f4a5p1|gX,٣K蠲P˕)v]J7,: tnc>iՏ͞*OUΟ7dvE3 - ӧMu:s=;˖4Śh18NJι]]r.^\N2|udI5=g\X -(,꜒|)E孈ouz% ÁZI&RpS@]{-Lq `0>a"9;HRhj] 3ury yuNyֺL[X ղUO#kkdF --`[X6t:;}Zees$qZ9wѸƉLa.- |։R^ci8& g۽2َSJl%lUuӾ^ή524nu edxFQ' 4:re뫵 &@t>YRX0hIvdV8equ#KG΋0!dCBOZχ//Qr'H@i1>/k,Ni3 pdOh,,OS cXv|"Sq),NgE0>oY`|Kk#GO+v&94&InaȘd|x3yDN?%eJ]WLR79뗯l7Oe*Դ -TE4SRLUʬj#o0̿KNRT_,; E70)-hEdqg3ucUܒ)/Ջ"ex((T:M=䦦#tSs%; ùqu$ցzz9p%y1(,c<<1p{;ub#-l?`kӤ#ё7ݯ% |x5hO5iC8 &bk[i_`,FEks1 b*r` cUf`{f8gjI"gM-YmQ,WLerEL.V6⶘d9j>il1 R9)1ќh6Yi8#%^F&-..%5#=;='$h[RS;iifI2ݫ*'ʹ}F#'<9lZ-[M͍ -9ip$gal /= l ht=9X>u^m *,mgN TVXTVQVQZdM-%7f5WY5'S{̥fKY Y^#`R{2KsKH&ԒdGJ.Uxg':SCKIMIfЩ.3s)q9Ёg_ȫ Z.Q>}BG;Ĺ/l%ɬo;/̞uQ ,ꕓbH'd"iZ`?AU>ǂi񁧑,Z|t6Ce-Ke6dTٖ[W7| >l?BRSzSjx,fHXrX,mr~(O+>[idqSKd#1fر7*a*Y2N)-:On~]W[tRBmѥ٘Y RJ.7!/ >Xbv Py - -h--ldcIj9hŐs.K.pفOF>=M~?e~}2~h{ǭޢ W|#dECn/,]j[<NYFznOnVNV22>5%SJ2+kf6Miґٞ~Mڏ Y;1\DV}S>JsLDcR-Ag&n)4,bnjd{X0Vxe|IdѬ5NᲨ2;fvYԹz%9{PwLNщc;w,X߱W;JKbնԹDZmcܧPYy -AiIblJΝ]:gv"Ib;NOA-Os|KὛ P}2ۿ?zq}"{e U:'T̾'XZ0b<Ģb=$GTKuP1.Kӡb -:M(U,}*րA󐊵W:hWҴSTuZEۋ(\sYtñX8s|8CQCfc רcߡb1U13cbaT1{21?8i,8f\ı/q1VU'qΏ9N8Ncq&׉-αXr~lq!D sU2%3l -fbm) [sjׇ> TA7 LJ!{~l NԬB\͹&hJ-Ól%gb-4Qhq[6FR-l~\<6ÿ1f[k^{,F4!^lq  *Wk=GqT57s_a)u-.} u-K 9lBPe|>. 6aW fA)f]1xj$ۭ̉(ka b|㑒} -1᱌}R/}Xpc;ҭg܋؈1?&lD;xl~\x >yD:Yf$؈ntlYQ[>_c{9=ZܞW=b+%Kf?Nl+S27iIyaQ ^?ɼ41;L5YxD*9s=^T ` [j -F߷9/n*LI喭p4g9Ҵ@G_0\ε& -996:|R\ -VǤ@FYKO ¾t J`O/6#fV6zIK׮ tB1gY -vB2&_O'AU:6J!?z+X Kvz@[_Hmkt= -> vwj7w#f6߉"9*M L֠ =tvVU mV9_Ѵo` ଝ=A_ bKߗ`?,u70NwrfǏ ibĔ]Idv qv A{a໇Iy9s!ٻbuN,^\$~I3oM"B<&uK=i$rD'H$DrID";_OZXY-rlPp1SzZTMCPF69$~JY&ꛫNieݲh$v/rezS@sk(=fgI~[&km녴Mi k/PMYV,\̀字g!euDX@V‚Z>JVp=_Q3\OoL$}vLoWL/ǣ^.kP/.^^\  rT B\'*M9:yy\'%GΑӑp Um\dHWYq^HUy\f>@b:c:W_j {;VD;H-I𪿔rb/{ZY+ x;kaU]s*vS^z-+7i*Yvc˘6עycElylylEE|.9uPޚUv&cg:)> ->> endobj -1619 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [140.738 118.359 289.145 132.307] -/Subtype/Link/A<> ->> endobj -1623 0 obj << -/D [1621 0 R /XYZ 123.806 732.53 null] ->> endobj -1624 0 obj << -/D [1621 0 R /XYZ 315.492 345.809 null] ->> endobj -66 0 obj << -/D [1621 0 R /XYZ 123.806 279.416 null] ->> endobj -1620 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F40 1308 0 R /F23 1274 0 R /F45 1544 0 R /F55 1545 0 R /F56 1546 0 R >> -/XObject << /Im3 1618 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1643 0 obj << -/Length 2408 -/Filter /FlateDecode ->> -stream -xڍX[s۶~ׯ#5X-u6֙i'͜IXƄwoH>'OeX,v`_W?V߿S: "IzΡF,J<׻zɻvTEfʻvϻ_W׻_4GQէ_ׁ$u~GnwUadUYUUmqzUUۨr8~z7M{ht+?(nDؾQ<{S=ng,ϸ^*}`68N{0;3`#75"G;J8R -7meT0h{lajˣcLZ.޽xwy'LؤAk3HE#nz%^-Zl윤Yw;6P&J*uF!\KZp-fUQx;1Eg ˓b (^!FlTpKI{<k <^XL\{~⇁eĻ x:^I= OGvn}Y2p{b4=7EC bt#+{:M}>Ť?V_Cϛ-ږchr ]tc3Xw 03`Ru|mc7Od6_lʣ?rB͎s!lM?N_j3,%̉},{7iK7;1pQ !0w2h* W.n0{!Lu478~x9ܨأqw|1ǁBϰ_sIE~Hem,%!`Z:d_匆F0,68 7Rga/\J3C3pC@CȍEQqܢLp)49(μw?qc]Ƚp"94D3KVDO/hntnЧy$@(ɥr?,.x5^Ip{u3__,N dMTmĈ+G%F3=Vh &?<ntyNǴLPৗq;F - -* hʆG#U s!'ssK.NKD,rfkD1}N=Hl4Y9aqV'rͲ]8VY@Z*@kX/@FoʚjvȍV#; -̴R$r`}#MGPR^ED8?AO,$$&爺5rHuˢڝR-yӛ%`/{=Ϥ$rfLB-D8;p`'."/ЫB—H]+5)Q9 !bCuHi!0zAT6mp0ԖsgKOWeMHR81sysJ݀s&S$c},L]KE7EWg#>ȳUSZe%OWrEaHZT@L0˃<Av=n*DeeĈR9'*]yjl;[NQRvk}y߈Eb^O`AiJ8BE8o}mӒ0Mw<|SzjDއX]("DanLp#_B( gF80Zu !|DhƺԂ_}[z=D{{)\1bzH5ıPv -8 KCN -C:L=ayaI7t&El=4j+]PK>_J!4fmvr\Vȷ M/ϼVbN4FH5K/S|BeaHldLjJ?Hpȏ> endobj -1637 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [374.39 565.383 391.336 579.328] -/Subtype /Link -/A << /S /GoTo /D (figure.3.1) >> ->> endobj -1638 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [451.304 179.729 468.251 189.955] -/Subtype /Link -/A << /S /GoTo /D (table.3.1) >> ->> endobj -1639 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [168.444 136.392 176.288 146.091] -/Subtype /Link -/A << /S /GoTo /D (cite.RFC1831) >> ->> endobj -1644 0 obj << -/D [1642 0 R /XYZ 81.963 732.53 null] ->> endobj -70 0 obj << -/D [1642 0 R /XYZ 81.963 326.688 null] ->> endobj -1641 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F40 1308 0 R /F42 1532 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1648 0 obj << -/Length 1485 -/Filter /FlateDecode ->> -stream -xڍWmo6_OF(Qo)0`˒E:thBh^\j QvjCXxϑ"Uyej%EFyIV޿׫˛eĹ,.<W/ŗcqQJ0In?F^ /(L»-W)On7ĴiQyJ=P5 Pj-4ZeD^a_,|ЭN]?hd_M/wɷBj+Å[̯ @[ F[{\Ho.If]5M6gdmeMQ F"! 2߉8l$ˌg!3usZsJJ Ru =tPx9}6C6Vt(]⠼x]nx71h)5}rc6xPW\Ï/Ҵ9hґ@`fSLN &Qetr:E ~Ѡ|z;TY K\mȶo*ypkf}RMmh1V jlZXV…"%Y ;1Dı(pd¡AY6zΐG;bgDC -)qMQ@'w}PHN`Ėm.`&m\dZM]@r6VLDy8#EJmՉ_/tspCY5UpD^qA:lT񵓗znﰊ2wU #[e׫j;`eU3XZ@!qoTE2h,2S[ bcP -Ex=6Fm2F0&iC㹞b34amkѷ+ $> endobj -1640 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [216.24 511.24 233.187 523.79] -/Subtype /Link -/A << /S /GoTo /D (figure.3.2) >> ->> endobj -1649 0 obj << -/D [1647 0 R /XYZ 123.806 732.53 null] ->> endobj -74 0 obj << -/D [1647 0 R /XYZ 123.806 693.056 null] ->> endobj -1650 0 obj << -/D [1647 0 R /XYZ 284.352 409.291 null] ->> endobj -78 0 obj << -/D [1647 0 R /XYZ 123.806 342.007 null] ->> endobj -1646 0 obj << -/Font << /F20 1307 0 R /F23 1274 0 R /F16 616 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1653 0 obj << -/Length 1563 -/Filter /FlateDecode ->> -stream -x}Wߏ6 ~_Gh\[{/ ( -؀u:[9kLzGT^b(6lEw/^eoi򴭋Mi!]+y3ȣWv+6)wUV oIGuu'i^AMjފ6qhӦihSzuכ*FmY~vWybX0Iv'^žijp6YɑLϴOonnYZv.v蜾ףMLytXh@%}> UwױǐAH2D3LdzfhSm%kHS@$# -lpOIrf]H"(BMJYytv13 ?eUİ[*B.@⭜Zb -bL.sC-76DՎ#*phMgFEaA̻]z-m#T{ߏ!}3Me GlW> endobj -1654 0 obj << -/D [1652 0 R /XYZ 81.963 732.53 null] ->> endobj -82 0 obj << -/D [1652 0 R /XYZ 81.963 712.73 null] ->> endobj -86 0 obj << -/D [1652 0 R /XYZ 81.963 227.996 null] ->> endobj -1651 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R /F42 1532 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1662 0 obj << -/Length 2198 -/Filter /FlateDecode ->> -stream -xڍXK6WT% gu*N*U)CKL~}%өn4@?n0ڞ%6"˒qqz{Pyt{x~W!Hwq< ޿<xy~JH}}t~sa8Qr; U)06 -UO$na*7nF^kC7-ʢn3c?eW #>RF`"D78[,Ss9''s4p#Tp|I"a -w8Bw)+bo!xumVtc>Bnw09$W"i%@1:゗`yr4It01ٱe0Fwu0e-:w#ث׌~hrP߆~Ii&oAelr`Lg|ܒ0ftn4-Z=W"C';T#20hvf^Og }x",H0pD@:ɸM5I[M55tٔ@1o +E>Xrn˼$LB" i`1DFn`μ=+(9j9;.j/ٯ%E+s|O:ll8Oh -R yR7Ȩj6_ό/p jHnw%3<#襻X,T`.(PM68X]qjpH<c*,3]KUQQ0S6vj`5\hAZcF$zgGqJ"g9 -;Rd"yRDMQ J(2@&d*ra9HˊySp; }Dq"jQg9fO̾%Z񤄆zIZ`4V\`kAgì -y.T -T8fB bH x QRCT!”)1 SC(s]^"W[8H{U\̭lэ -TPV΅ۦsd*ܑ:~~xIOyo=u e간2Rv,WlkRZIDD"er¶t`RX(cug*4^Yl$% 5{"I `Qp =`aVk8κV@l[zuP'!NQ XBI3'v Zm sP04,HA;R}JF\t?_.8A0(i2 g.&B`~4QP`T+g)pD^Nl.аl-1Ropd;l>̟$QɟCsE7JiM@؍30]E~%nMiIn R=σڢyCtZS9K:*D]굺̛Paљ #!0~6bTr -P.=hQco\VJ_Eyܷ@?o`0Hf ]3YmJۿΎ'?2yZs@{I.`֯7Dֈ* ~Vz1A}nqbAkG?bi3 2/ ʿ'^sb4g-Id"Y -endstream -endobj -1661 0 obj << -/Type /Page -/Contents 1662 0 R -/Resources 1660 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1655 0 R -/Annots [ 1656 0 R 1657 0 R 1659 0 R ] ->> endobj -1656 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [394.915 581.468 402.759 591.168] -/Subtype /Link -/A << /S /GoTo /D (cite.dabek2004vdn) >> ->> endobj -1657 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.472 213.202 221.419 227.147] -/Subtype /Link -/A << /S /GoTo /D (figure.4.1) >> ->> endobj -1659 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [468.081 121.946 475.925 131.646] -/Subtype /Link -/A << /S /GoTo /D (cite.ledlie2007ncw) >> ->> endobj -1663 0 obj << -/D [1661 0 R /XYZ 123.806 732.53 null] ->> endobj -90 0 obj << -/D [1661 0 R /XYZ 123.806 605.594 null] ->> endobj -1660 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1669 0 obj << -/Length 1624 -/Filter /FlateDecode ->> -stream -xڍWYsH~У\n E$R=F﷯r0i}3w}g΋ٟL:9idQil*{f}5_Da|{uq̽Zyu~bbub}0v ?wߟ_6/g,A@ûES6O_|Eܹ幗еs={;E߭ Yzi$I^6$LNLiڌK3# ?=obY充Hc/@z/>guoj?wyϏ -5c4`zWAҟ(Rj4 鶒-N8x7 }vڨҀa =Yck&v*Z`8e-04;bBrhԶ/E& t\ aka+3bo #2CîBuGY7HmtC Dճq/@[1я- -rP N[R#2`#~Qӂ6]3xG=-#]KHG2;Z7ZMycJ "8%LqSa/Mn)TC N3߲:|-Mww-b-I JRŚԂq!LEܗGҐ{vS96{#RqCmY:~kge) -pF:+íӍ  zAJ%5`=< (2-O5sR3'5qƷL -b6#kI #CXB-Ey wB4SFG{QhZz£}6MKX*c -\]JKмZ(M)I}~jQqJ9fm;K%}pl-8zG֜9 FG?x -endstream -endobj -1668 0 obj << -/Type /Page -/Contents 1669 0 R -/Resources 1667 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1655 0 R ->> endobj -1658 0 obj << -/Type /XObject -/Subtype /Image -/Width 590 -/Height 404 -/BitsPerComponent 8 -/ColorSpace /DeviceRGB -/Length 9589 -/Filter /FlateDecode -/DecodeParms << /Colors 3 /Columns 590 /BitsPerComponent 8 /Predictor 10 >> ->> -stream -xy|U_e*3 ޑMf p5:rYtї82">: .72(0\QPa'd3k?NgT9~G]_]1 YD:u#G<xQ8qD:u#G<x\jȝ喙EV54>fլh|Fe5ܧ, >YD6akh3MGٞO&|sht2m97 cz(u҉4܋:׆#uA=}8uP> m9{a0y]T*Rq4>js0tW1АSQpFCOᮼ]x: @z:=i8J$t 2p 9u w.г -n94; 44ȬΈP4'`/-;Έa7f1-@0 MR.4>tR4dPO g~:u] h|§:N|H-F?:Maţ :?O6&TAhņ㕽+@C]W$rG"@s:MbYj5 -"%{ɼLi4[#"bY(rH.Iwב C1a.fu^\,Eȸ;%ZNѸa:fu-_*'m#TW&$s)8}CƇ7hu"M%w2jDFz|ԟlXt=6Ur=IJ*Sef`Stm|Ncu!'ɚ钿C&.W]J$pƍsiu"2rU7tL}ԉH߹rX9IuF1?ND~ ϰqK.N$ñƇu0E:Kfy_$sבv<#+_ߛtf[1za;guF z{F0sXqK6G# !_ Ӝ:SϱgUgbГ6mгXƇ:=pE#đYx wlI<4WKQ>J>igoʟɩ (aJ@ 5y:hgu:KBk|\.` rPBCkN4> eA#|d:?"hu!{rЇu'  /W:c -WNj1/`/?ʇs;Bw]ѴFqWM{,vQuҼ.v4oF=k5E}k]v7~FU+TF] }bѶñ ZDBq 9#ĩ.@wq@^ 7xCfvWP3 Q-@fvQ?^ B5P©MD5iM!KYFcL :`` -H;x0+9I#lw+} t:pN^j|ۺ c{ ^{n{_7QwvcL~n5ھ}gm91܁xa -/,J/wAuO]S1,^\*DCꎿwG~ܧGs; uou -ZYzpTeYcSKԣeY]\_9ל>kh̾^>i;,Пoi$ɹ}+ϩ z O 庌$y,G)"3 m7V) zI3#)+$eЍ-h?O̽"NDNWXYz-c_+:-M=|0ݡ__iݽ7b"ע7iywZJ 6*X^8n|.}f;S;Wri6& !)IKOnۢF -+&ފ TU:<Հז{B9xNy[w +Ni`HB%SKNS}Y-/v .H'go`0XrmNAkEA yÄ.m,+>eB~7Ofig>P]N2)`~əз2ED4OM %$6ᩏN+X]þ~;^;U{Z ;/qٯ(>l@Ƽ ,S+w-Ϫ66Ю@uUݡ&J&ͭZu0 QY</ݢ -Ч05X]}sQOB`xy 7oЃg_ӤNS]W=`{vV V a= (Sա 8tskR] C itQ;t!4Dc:) -uE+B}:#x!SmǬ""ELxQvDu=D"vr:ԁ6%DFjу6"P/: 7uhi(Dڅ9lLR.SYTC#vLDԡqH;e4]uh4Y:4ik&MD0Q#nAԡYh?#\zɈ: ԁ4!=qa0؉+N˚Y ui8kh#H; pXDDCQgvF!8zZ|. }lɣĬ..bz@ "PQ"6ˈ:(@vAA k:(CΉJ(uP>jQR"ꠅPx.t4Sfu lGA;4N}:舎`#"&qDA_4-[ui4]SQѷH;QhDT4WKa%:ŬF*1QSvD`hu0i:0^@h6wҎ!@kXu.x:xiSk&DujQms{gv@&/Qzcmv9#q|+"jv(>W#w')bWF:s;Jx8:]{f"1":SJӎ0'ӎR;oS4[8~Dcdzȩ~h Ov }FiGH;xzQ_#`:.#hvD.ʴӧij\nuӎt˕pQ4vշkҴZ$.-uRN u2§w@:^VSJD]B0Q1"B4I;d|N i&:s6$ADO0&cПqT#D -bk Bڡn Y!b9Uu)v"ilHڡn}c&u؉|3yUgؾWo: צO%hn"[t%3׼/VxM<o:= krxuzɃ"iu"팦ZS>em C} '$: F6ih0`&O4@#2C)u zI"aRuDx=BEqENޠgEtɻZxieQ;&}^1X:isB NDm{2fC듾!D >JєsB7iy Q$9!K29xF䜈ĩ.` -`oE$!¬<("~lsBNshD*%1y]ӯ)bYұa#+3&:܈+  W,KZKL%Iwz^gA;CXX.wƖϘpՈ:ɯ^Uwy&\50G6{1F<`}ĕIRRD`dt!.0Qf_nvy}եf 9uYgHzt|~Ɖ(lZ$dևDeT -0S߹rX9Iu:Y^Z7 uuSɌH""z57^ x!YYɃԽb31 %<7AhQ8INxQA,X}'O#'}ڋeWb:GϪ`+.`Ψ?ؾ 9Uۏھgu4OtvvcL~n5|aہl>`݁.V0T]}!Ot iYi~dQ5N>rAY D)<OW>K>>JuK4Lm -vߞ#"W~-˲,+ৎY1G[˲$2roЮS3.zЧsʲCYqD$="LChosKFw ۸c>R}ƴ~zO|8|ܰ5aƄZ"7H;$R"rΖ@?xA\;szHUyEw֚ .2I/f obwaleEsxΗ>5v-_Q>lTܾLRU~bTzoFZsVׄpk?`Ōi9|yoQ|xS>KJhrbNkPOnjkOpx-x&&ځ:$$Ί[ʄ޺HŮ׻MsΔ~}㶶3lÉ~:ʋf;{)FaVƃvm{dU+; L;}`@t-rw<9i:ԝ17ʨsFܿ&%.F!M59H8ԩ$ݛ.^Q{~3/n_{n|{f$VR|oi=-Kѥ7uikuoL!e:#q&t\¬qD:u#Guvؾ[8DX]0gsl?oGm3`>Wtv^fr;:#or_=S?`P'X>-+핸_܃,ꞺbYcr;[ 0ew: /P;(0ڈ9~`ے3'ƶ:u2ou -ZYzpTeYcSKԣeY]\_zЮS3.zЧsʲCYqD$=<'xHh6ꌖk 23;$=Z^A٠\kfĴ^"_&zb;Lj`$">Y5ta۔ qR/ w|/d(0ٖ_*"][Ć8{+;|r%-jogtK=9'"_Dg=K_pq6-HiV[kL¬P&S^, -F0r.}f;S;W|-Im. M(>ACR̟ܶ`o*KyYݚǔVdfu2d)={a_) 䜈$^=dcyE}\bKNnؚ0vΉHM">< D̏4YD^}pתӯYKw/<0zS"Zwhy|y`kK"3"7|."Wy\ܿgj@le?#gi7wR]Bs 5-'vޙ//ojgI7VMN҉qjSWWM>upm%iqŌdܭ]IM6< xE̊co~UW Xq+^p[7/zՙoUuܑ=x8qۏN,9F6-c[]e)޽aJέC?[aZw) 7*?1"հuJ)=/l3{OEgLǯ)ط+^{S{޴wz֠o^zxv|oQtosg & z%yU\(޶naSThcu~nKVZ˒^> endobj -1665 0 obj << -/D [1668 0 R /XYZ 206.682 543.136 null] ->> endobj -94 0 obj << -/D [1668 0 R /XYZ 81.963 474.86 null] ->> endobj -98 0 obj << -/D [1668 0 R /XYZ 81.963 339.812 null] ->> endobj -1667 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R >> -/XObject << /Im4 1658 0 R >> -/ProcSet [ /PDF /Text /ImageC ] ->> endobj -1673 0 obj << -/Length 2172 -/Filter /FlateDecode ->> -stream -xڍXYF~_Gʣ%z8J)ȩTũT:4IOf@6ODh4w3\ov7.Qڬb6*KEd"Kjkw?$΃tme-H۟޾y}ܻwKB~}}Dav毛!%Q0UDpQEJ6IXERu\/ns^(ʮn4I Uq_ަQ~ru&K pP[Ey);Tvb[Fv`'f@~s1Id"m4jiY<_S1uy ;T?_UwjE`t\) l+pk`xuZXhB}cꚭ΋e ypohbV$+]>z581rpڜq~j"*] aKz7Xo׵hNBDwʅVv+u16f)XZt#@˃G5sYP; >r>/i`\m^YWz\䓔Zfx|#Tqb[ƦH$:8xKVR-Ju;F̍ 29#Vq -2ɪ|O,9f7zǶB3ChfpqAٌs`GBT˚F%jḟ)r7_KfBYCue2GOMЍC LPv`؏Xؿm9Z!ӰqS0IVhEv|X1Rx+ -YWV'! @_+K4dEecR"h^1 x\6wÒTW^(!ktP,p-zmyp_Z0δaq0pk*R4)i4$4큕z$̨U=xM(=TH mK3ؓ5jy]s@ǛTJT~jX͚T*f6]Rk\K*ؖAJѕFL?,h[\<^G"\3[[+h𑆋]D / rQڦ$"R&w#p♻Y4HOS&  RXb/,Ԙi2-> yB@oE^-hc<*"θ:4scr5⼐@NDk7/M:4{\!PzWI -E2&ٔOd/#J,''oZLYY#OYo7tf)piF팪QťY՜:.4 3LTƩ,(q VmkLf"/k^5L3ԛnܱAGF'!J[$<'#tP0WH׻ƛ޽yͻv]~oE춐J~9msrBey&lgϔq ."U/QD/dqá/~ -Du{b0iR, u%7B-A2GSdJ<3FJfwV, #Z񚋺RQbP -ijH_If~ݿQE) 'P|-m~0Ӆ|Mt)J-Gi E+.}@qj6$Oj{D"eNh*5o^3(z@S) ..KTۆ HxGLpgk4|3aD}AGQJDiW$ϵNseWUi`u=d[_z%{% (o]KVz^X~eW/fu7׃魊HK<WZ!_S7˸ip ewՓ/EbO2Έ!V_GvY˂?G,l?t'Y3=U.^#Șl~5<3Y$8&1LE9pt$i%)T/*G~纠> endobj -1674 0 obj << -/D [1672 0 R /XYZ 123.806 732.53 null] ->> endobj -102 0 obj << -/D [1672 0 R /XYZ 123.806 546.669 null] ->> endobj -106 0 obj << -/D [1672 0 R /XYZ 123.806 169.966 null] ->> endobj -1671 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1679 0 obj << -/Length 1676 -/Filter /FlateDecode ->> -stream -xur8QU=(Y-M6M39$Wz~e= @[BjmzQi{'/0Kyy&U}o_^-$|Lg,KB3w&) =}\n 0M>LV z I"'߾^^$EXK>E@iК[O []Ҏ9ZV as0kD񑻚%{4tQ5l3T|uk)x\Kɞ+e1c\C,%WT!Ḩ24xPv7YXᱧm -:N8;ע 6׀ Ox ]F.5. -3S t=bDh\rmcBIl; >,?u,JyB@j؀=dũty|1J2QZFy.'Jm)_xTcg#; #^i`([X~`g46Ƣل:j 94j -!&S)!o OxSz?YG[jj oa ~C"7JJ?,Pir(xXʑĔfg"8fo DOƜ53.{ڰ[`ǻG6o`>Y-:@rz|F@ᰋc_$ayLFjQ{(Ё]MdE[mIG5f\ ^fPܶ9]GZֺY߂EFcP1s0ʭ Z0◪{֥ŸFqƏSTD7D"0RVR~v> endobj -1675 0 obj << -/Type /XObject -/Subtype /Image -/Width 645 -/Height 465 -/BitsPerComponent 8 -/ColorSpace /DeviceRGB -/Length 19307 -/Filter /FlateDecode -/DecodeParms << /Colors 3 /Columns 645 /BitsPerComponent 8 /Predictor 10 >> ->> -stream -xw|wftP(e"K -e :+*D@ AEQ(Pٻ-Z(PJ[wuB:ҤMrIz>x^n|R} X% <c!<c!<c!<c!<c!<c!<cn@k(|ubBAI\г}b{: (SVJپCwG"$25{ϯJJT)Ogzw$՞m^:kD5"|1w@oena%9+*O|HLת-sM^ǂ_{:Žw i]aEi;*CZhEߔ%{zYy[柹#LvXOl gH|7,EFhJJ:G9>ҫ>SB. 23'7c"rxlƦs[{Lu r% Դkl;th.13_ho{dЧUm8@,"enXG` -˨&+"z5w̔S6QJ*D]ҡldkat4%ce6 svs]йev7֤p"1ϩ4Cpg":0"}ʞ;sʪZ$vDTB{0f - QýzͽxVX oJ|cZ94} *t "Um1sڱ&eB﮾qGvg+1uhWwr%VAu -_&1D:._ds||dUvqFb3y)'?4r~Җb@/?V)9sp=sj*ZDljJH`sWlWhVYw|mҿ~ÂOuVȩ --9N8xks8zgØI(1KuS.-.z3Jӧy5YW y V,!iw<#Le]JDW_oݔsDt`ىouzNgsIϛ <,[%Gm?Mr?>ʾ*U ުފ9!ϓ!H< 'EO=U(u/nvˍivC<,>Fcc!c0 c!gUf5#BIiQ:z9 Lnz҃9qi ^MP<֬<1yќ)KFFS׷?ެI' Xɹkw-ؠk"1&N;Ww[A1n8_ m4C#N x~(ehϙЕb "xٚoUg&_*Sai0?˨+hh=]cߡC,[b %+'[luJ%vЭC齇 sorFQKFn'\žZ@sl! +z>J}|J%YJLHV%{FkǿGm09|B 4R>kШy̴ -.4.l}6?fɹYB""F^u苤 - d7NC:>Fo?'!ʺWm/;`c T?UJBI]c<_zjRY\o:d;4imy ҩym=P"-ήgK<ׯЊC_.Ԟef$feeSjUaOEGxοԛ.Yˢ'׎x߄qo'.c cV%uο7{ci//o *l}3,s{oay26_ #ߧ93ʀ^8cQO?;PǃX,Njuc"BRבi2*}ڻ4O{oV8vVmR#B"b5 A(thǼ4Rv^8GX"gZrV;l9-9"~X$:{ DDB178dbI2,WC[?kRv.:Mᦰ*}o7``GVeg$_=|OIC#g/ՍX{6^ZVQ&WRED,ԱnON3& -=4O}xi=QPļDHS $"[Z\õ*ur?_%' e*"t?VT$LyX1sWlWhVYw|mҿ~ÂOC,/<&,$IYߖ6t~yK)6_r<Ʊ -Bf,w0G --J'qh]#ut賆*%KD%3ԨX"`@2*_ź~YD7ތ߶爚^V1f:C695|tiGn_{ځUs]_ѸsZ{+\*Pz?(jgmn^kp -V"-w1DP$c?97{ `,;Sn4URXQjHHRu:n \tݚ,r=ǜ-#2 _ + BD[Ckr+JkCLwOkMBCxλrxE '$ChDTvB"*k&drL:(nW6nϖ9|0|CF:Rg"l}P(7Qե'jaÚi֧鳆nDt2UY*L{Ɠ?;-su?wψ+`&wZ5we*פm?[7Dn=sN^12DDV_5%Kn"":\]D}-Riߞ7ʔM)*W2r?zZ*^MϠG#ug ])*"c/t^τ؎8UPY?X_nb*XD1Ư^".5Hڪ_kk;{kש?v徏R>oOE'F?!I©'lHps{](,wCvGfB/GY'8Gn,rsGt9sdg沑5}KC>\;vvqt٣{ - Wy ?8_%[ǰf@Cy ??c!gXu? 1CŬV H}CGEٰ,+Q(Kr/;c{]# GkYR*]]z:@]^cvX^U}\&PU)e)_ bkKnuO^aeR -* ؚ⺚⺜„ucv o__`ԊT[!Z~jn 3~[{4. d/.ֶ,K>m\w)_2ja'ӞX{zձW.kjw.43|sP*׳d*V v}1L\|jmVFR^P}N־\Q&1Orp|Oc!uq/jKGwQ2LKW4$)YF~oZ˽9)nџn4?}IƋH\Ƭy `CXiOx>ض,%"=վ9z.N1Jh?&[Rw3gK{}3(@2/\aȹ7Ur4%TTeq/ͬd1-˿Z[QbYwzGt߫H7ЄOmvK}ϻJQD`vw+,+Xw[R c3_ B+n<%[ǰL@Cy ?9cPy ?1,>cYD1?y a71C`@7Cy ??>cYF1:ltC} ?1C1@'Cy ??Q3i|7LNy {17-hy,"=ے +Bhk6 |/ٽk]hۓW ݄DaE~%)J"ah11>훎*x,9% X b^:_?OWK48n@Yb5HhA `34e1k@aSC &<tdžA$) HC"JkX2>H`tc DzAIfiĸL -y܄ϓgqaXeBCčaAk2Q" Ly2`jchp ,0{lNzB{/`(B L(1͋Yֲoyx^̺0YcF#>hyAq{d٨g~-soE|4*[<=*lg܏]K y,9c?,h,c~=XAi1t@胯ńy43(ˊv.I:uoZ4ڟv`eU*]nM=d;,[b %dt4U^QQ[>LN=_:MT}2SߞKؓS[qXDwۮtvi33@SzίY+7OEGxοYÅwvm>eO_Ѿ~ՇVjuA~!,L~sNCnoqv{>UOCS|(X1nb32x.V㑬rU'q!~RRs^8cQO?;PǃX,N2NB"b5 A(tYöUD4cVP:r ]ձ4|j)k+y, Ib:&>wWH(uy^ $e)ZN)nΤ׼r"E}\436OhBs"R2V8#9z~"FyT=n!dQ{5Xϓg)kd٧. _MJzB)JzKDve >~9E7aᐈhw''H*|z=> POl~ _RxʁWϺq,럥xI-"sld`0 -DT{3Ulo_I^.sA|ϥB} SX@D5*V3UɈH v~uVkm;޽b聵 e' Ysu?N~RW4B]{ɣ[Z2D$>sF7M"%S0ߞ9-gg4^KO1eV/'"{knV3%r% Ѻê.7]g n^'e$U&{A%@Jdm:".ȩ}V3F9FX*.M1,Žbݺ7wziDtIDTv -ujXW"JHV7OU]ڀ =m'$ uaJplt%v hі9|0|CFGY u&"N-شP">!P -Öenx@$@~ C]ε>ϵ {y:~?K.s~O \q(Ra -/ii]=4Ut彄rUm%2dj,NDa9[_Nt*"U"\EDt򪌑5Id5s!M};c?}btsc("1s8_mrFo?:xau$q ^w֩whny@ ݺ$9|iRw hPSOi<=70ylB>7#LrV%u1:Խo_>T F7lMalWZWPzd?ugI#OhQT_%/Mt T&˳grOOQ[B4]|@?-3GDq]gU̵"#ܭ~ˁC&vܶXFz*~}^RKŁRc>6-ky„>M4YڹgWsDj EA%wJ5w e*"t-褢&<㥏gϏ#Z➭cܖXYK"n4|f #Wq3^1ٸgV%7nKӖgVY?Ӕ v_{+XMfʺuc" Pk.O͒6sVUֵzs tJq@lKK0UM1_F,x,˅A,֫g͈p=YYuCLDתTghVU?.@5~]N50>gt)}|al;9X{Ɠ^ -xiɧ=Ty]y - bܖx @=H0@Ҏ}`w bն͍Z3!>?/"0_?wĚ|}L07Nkܰ/uߜ<ҭU4\WQzUY\0 H _><4[uV y%l}`H{.Z5NJjߍb׀arR@i'.emմ -X+auاXF~s {r -rkUGgϱch NI,|)<6\`_ NXE̯H=4ލ!QINm?`CRu@f彳rn67l}|ߞN}vϭۓKw7'^UdpO'vps:N Ӟ89ue?>>O/󏗿`yeEggnvweq@Hl #f6OtS.5΍yqfU;M]=wOfxk{G AaiglO[ÏW|O vǷݪ~nwK4eUzvP1D.x}b'ޟ_l ^莎vקkc||u?Èw>_|̕x?}wB8ϼugH?nMm|_:7;O?p~׊ŝ;wz܅W*Egg9yo?|#G9)Aj |-2Esq KNuiFDs/U%N'}=>#ێsr[9 >,98= c":u֯άߨ4ާMI￞FӃ宿^{..j1I4eOfT(Y+\t$\EDAMýYk"g_"RT45ާM9`AON3& -=4߯B{"RՖnq!fc=Gqr%" g'"T4ђwY!45ާM}c8Xu~yK)6_r<Ʊ -Bf,u@$!"bo\c -jU!{ l4"A%TpcqlulbAQ4eU2" (Mп^qGw]^\v񵗮H]55c$&r2Tsg5>:MnԟUT^$UDD7񿧇2+UV=ĠyT 8X6k =lIDI<-#"GKm `4;EDZ~Oz{":R˺8֕յ>z4w":~n+Dajg}1JSu篧=Oі9|0|MD3 Dܐ]/&qnK <Jd[e3]ZFw" ٚsҥ[7WHj|Rc }ʵZF=:}S'5f u]y/!\U[{|qF ˽(?/U⍟u|zf c_/UDD'gB|lGeO*UߟM/ DD}#Lݔr%#_n|"hƅaܑ:ҞbiѺ=T^A쭙*j,J8uNE5ÍN3.U,\T8+l?ČM_feTA,5fɹYTU₝KOUײn^<2_󮪦ls*<;4~K<}YO蔲c DhDF^}|u|O=4^kXM̑ٹj5ȽQc}ذȧgA5[B9>bߏ(;<^ 킢gj~XڍO ts3rE#SX;cv=/=ůiN]zsZ̿uE3zOI.}絗}ݕܛM>E'~ 7f|V@kv}|5&J#8 -%ODg/տ-#ܭ~ˁC&vygˡlý"\ٳ=e9?o-,{{E=BbY:X}+lćC:Ģ]/Bq y zF[ĕҊXVtڻнO}+S\Z+<5^ե*O}+->ťύ0 -+:V< ĕbf`?`mš0F{l)  H,w`pSWK$m%܊pmHhRȞpbǖK;A_';Oj4XC# -0>%⒲q-"Ԏ7xl>[m< IEMf<)[ie3CK{w""\ε  -`ǼNb˄T01,?!ylnYKkӤ2"ÕXL? cT|f*s: -#"p< s0<׫&(Ǧ*隍"pڄV%]{gYҍL0cEMEƶ홞aTVCD; c D2@!1 ?6UIמ֊ۀzd0-B}lL\ ->qw+hD2@+ cXtmft}723:`Blc!+neJd[`5m0n"@?nUIצGX?[LhzTJd} [+nXuMtc0Q!N|ҡV%]{"2Vllt+ze[6E1"`rODD y\qw+ zt@9p%2"9?n%s _ V%]-VX)݂P"4y ?aPW" -K<s)kh+=?`p=T 1%2@cJ6+:dRWt!4ڠl0(Ne˂t!hC?P"hj}J6!"V؂ ۈy ! by &Cy %zmi?`l| &c|5X-B@c]8_ ?1pڲ2ˇ3˫J, =zw?,zPRgn,+/)jU$98{Gzw9"Y{ίoU $^Q^GivW-BWn;4UMAUMAխc7N?rр{G߻"eeNYeN}WS'bHs[dYVY#W*ډPw s@ǖBQp{˳*, ob_'')*%-hi>8zÈ`f G0x~%:co,#P=lXVV^[R5jͼ}EfcG_9ÅqЬQ$txD|>DU{v~zkb׃"rp B?ʽuef+ع;{󇇏s'"VQ}syU\T96` 6#J$ak{Zi?bLf:cØbA%J*i:Ef8;  -洛I-D*j/܊oeYТѼ)&Yغ3 - -"'I}^ {ڛU*_}>K6vƾJ -U}&`"8 3KUD]tot4^L ˨ -NL\y)TŲteոz U2s!JEWqZӉ]vnjroO#)+isֽ]g;!@ދYSo~ȭ:eZ[^)w27 L.QIͽpiv-@(0Өr*K^t":pW+V w=gv_k+ܓɅqY]ԓDT{h!YgTu5ɟwߪ{Pscl(׋&{X6;5VQϨ8.pa[G7Mq|E:@άRv|Ĩ ɿ{uiyw_q.RE=",ļ9P( yY}(m8[>T+kS`*q`aRnU;r3UDأ{k0uDtꫜ͵2Tڸ͍WS"".]{M1ap.0'! CSP~:gJJ4"jćf%n F FP[>pQɮ̿pRV*T>9g}!\8\HhH@DXzr\ΰ #+f87 1wb_% ܆/j9ʤ1 -F:#$r047M} >6 7J>F_g/8s놼Lց3Y fp QC.- ^ݿU٢{f4XD M?h@Ëln+@q d̍ ?[w+,vqLZ8TY')' y%xtAP?hc:Q"7(`|?[ؘTYy%|Oa$cczeҘ~Fc-<8_]j>6UVRbn I `F=W~"O8QlcrT ˜ppM+vEcJ.(Sic{TV#a `,cڸU[d1-Bm\j® n$! 9EEp}DǺ e Bcsxe.UY -.Ze̵a ` -̈́TZF]HZ;hD0l|꯸&Tn2 e1!͍~ƍIwS-WJQ95Ą00cWOep|UY骬r.yǵkUpDPFS(ݧPQ -Er\ 4WEE "`jEc5ʤdl֮țaB"4He7lr5ӊ+ ylAS3M4 -&e7AYO0-plrqr.{asF &0ǖEÍU^[2 v6VO ylNlc Ư[0i|7`M$BD;x P`L8_ ?`r/ $`Y6w8_ ?1Cy ?1Cy ?1Cy ?1Cy ?1Cy ?1Cy ?1Cy ?1^ ƞc~>c~>c -endstream -endobj -1676 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [128.1 198.831 145.047 211.382] -/Subtype /Link -/A << /S /GoTo /D (figure.4.2) >> ->> endobj -1680 0 obj << -/D [1678 0 R /XYZ 81.963 732.53 null] ->> endobj -1681 0 obj << -/D [1678 0 R /XYZ 239.547 534.699 null] ->> endobj -1682 0 obj << -/D [1678 0 R /XYZ 81.963 184.352 null] ->> endobj -1677 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R >> -/XObject << /Im5 1675 0 R >> -/ProcSet [ /PDF /Text /ImageC ] ->> endobj -1688 0 obj << -/Length 2059 -/Filter /FlateDecode ->> -stream -xڕ˒۸>_#UeqI/'V̨6g0P$=V>"E)Fwo4 >e{{ImLۗ $QA`[_·}xZ*tj]*|z|F\o3 ->m B a织w (JQpNp8sGzSztYFYn绿bQ,/,e$YPqT["Rc|Y8`4YizTp\UvmI:^e[vš!owcc|sQxᛦ9+o,_:|Oʲи|mWvTBysލ޵:ဖқu@f km[ Oո٩ taH&$z?Zӑ2҃2F= <I P[F-#HmdXXkQu@oL+"Zt,𲲞l6iǤ2KUnQ~__XVX 0V@tmp7 JStS&KV"!0X(4GokW 3Yv6]o{#\}0:ͩfAHYN(IQ`M*?fXo/,UD]mLM* H-@nZN!g>ƒm0H{cQ ִvq# lNZgi_*"ael+4_$ɒ=&(L<"9؀< -W{Ӻ:?{IL^KС5"PYGy oEʔcAǖQb8pmwݛMO78,@ډ%Xvr)]b#(&F;;;[/t%%l*U8BԌQRE! - p!Wkm].wjXanKe+jɸ28 õCj,B2klz+lBV.h{n[*U7w^+Ejcs3s$'u]n.p"Xí =t|T T9Uc,M,VRdpfm@k]4F}'PWݺ^XoH5_(æKLb4\h;%5řOwP6se$Qp S,>!X(8SU>a rr فHȠ9ӥ݋k`a>G U> endobj -1683 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [163.861 228.553 189.91 241.103] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.0.3) >> ->> endobj -1689 0 obj << -/D [1687 0 R /XYZ 123.806 732.53 null] ->> endobj -1690 0 obj << -/D [1687 0 R /XYZ 123.806 712.73 null] ->> endobj -1691 0 obj << -/D [1687 0 R /XYZ 123.806 678.592 null] ->> endobj -110 0 obj << -/D [1687 0 R /XYZ 123.806 597.776 null] ->> endobj -114 0 obj << -/D [1687 0 R /XYZ 123.806 278.479 null] ->> endobj -118 0 obj << -/D [1687 0 R /XYZ 123.806 155.102 null] ->> endobj -1686 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F42 1532 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1694 0 obj << -/Length 2383 -/Filter /FlateDecode ->> -stream -xuXI6WH)\mn8gg. -nw~}jD' -"P_[m诃`q~:3 hF.K\rfvmÇGflqH?~y>m'=ϼsi* wQz.a׵lB:ʲ]"ϕ?L,]wie0v. -+(nk;^N$y>W6&̼AmX g5c5mەFt؃6T4U. NXPz_q1瞧S#}_~986:>9iA앶dg:_w5VpN%K`]YPy|}]0l QWS#Ndg۵M-! .|epgdV@7 -a+62`Q],=xNC}SW\){iJۓX[8$2},z81HiS._@ag -1 >8⠼Q+D'@0C42b(kuVϛVQvÐ h㗎~jq=Xk|ڹcJ>Ҷa>Xk0L][L;Hpdg^1v)~ IY"lH:+Smq 98D -| ]IYv7ѼUah%6G֧ŔP"ƈ -kruE=qW^a8JJdin .vo _G):"ts0 .\uL.8f2!>dUa]NsY 5Li\ (gr,LwCZtq~-M;؂.~YNpp|+Yr!>U;#tb.ΆHPDk3Y)( Oj^KYӧ{nьB x+T9HΜEѝ:]8ԅWmStweSaf l&嵅j̑1*f%.i,)@ )h8JFkk㶸2BWz_p-HȰZ{偋Z}?D`+Ž,*CfxH_@㫀 -2T*ذPoV3ɥl 8?Ϥ'FdFrၓM rE.<0:r LH}$#膳V\5UBft|m<̇ -ӈAh -r3co&0E.\cWE,C#gc⾗az8_5륉Eʦ)f$y/WZvFJU[=}JVS)w -{qI=ױ4Y orK Z9«A ő?ɴ ^( x';v*o!OBVbtFW@ -)Vw.lGKvysy\IlcP ^,ӝ -"z!SҐXx?`S˓` =yS-Ӻ -$QW넠 s\ID>v/BU-bmYwhC 5<99.pFi2]  TpE#c`{ sۆ&Rc^D[6/g}[*e6Mpٛy+EOQAKys ΒԽb_Ig$pZ2s% -f)`|2w&NX?+Zjf+E\ᡲ |௛ru.i&>#\:5Cig-{Vqcgn(pH.$H]jm5dT?؊,Za&|t5wrtapr0w!jy{BGhƙ桯BrfĈs`4=H@ hn$J[wbr"]Ds79#LܧQGYj!BWCؾfCI6HtLi 6rGF^*`)zX3cuϖJc{V);WoF?,@y:yVOjziC:-;'тA&c%ua ʲTHe7IgBO_ -endstream -endobj -1693 0 obj << -/Type /Page -/Contents 1694 0 R -/Resources 1692 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R -/Annots [ 1684 0 R 1685 0 R ] ->> endobj -1684 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [372.805 685.333 380.649 695.033] -/Subtype /Link -/A << /S /GoTo /D (cite.kroeger1996pfs) >> ->> endobj -1685 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [385.101 685.333 392.945 695.033] -/Subtype /Link -/A << /S /GoTo /D (cite.kroeger2001dai) >> ->> endobj -1695 0 obj << -/D [1693 0 R /XYZ 81.963 732.53 null] ->> endobj -1696 0 obj << -/D [1693 0 R /XYZ 81.963 591.034 null] ->> endobj -1697 0 obj << -/D [1693 0 R /XYZ 81.963 566.452 null] ->> endobj -1692 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1703 0 obj << -/Length 2011 -/Filter /FlateDecode ->> -stream -xڍɖzoDs_2ؙVDK|E!߻6pi3yP;;gw>rw+$tN/NP^N^Ωr~s?4t>>!.uLz?>0/'=!|x~qw< @P d^N~w* ^TΝX['s/#iϝQndO}/uM֝8QY0rEuiu+{ǞQwy?24tg=^!8NYC!۷z軖aؿU~xoT2 -ԁB&)WٯGpf^Ucwb?!p5/TYjcQ+ō6!ض7#C2̢7̰R$Rݠ#aQF3_v޼!t9r?*4j{) u]-m;!&(fKFQP2VWAh+6Ċ!RɞXPeF52(H`(RZ_ѱM].F:`5cX_n İ"0ka;kApGެ_y;] eLx%#r^'*I2!,9?T%KG۠*ٌA C1d*gCR5єhPWeգ̋ɻ>BsTy#=#F 9_98>̠e6:5m. 栘rټ/i{*?P∁ɵE 5$8!+XP617*P<39k+Q?ɦg R gZXItn+tȵ]ey0Ee2Y@;+ --Y͖'O/>غQW1J46$!b g̜Aia_xV5Nxm5L1 (zV6fQpFEx!.GVTUJMkS̖֦o1a aQч/܈ӓAisR -碨@8z6bm߲4B*PNYo`3<+AcTYD8"X_ _%nqܻڒoA7ek~R?y$yph9~m^>g8B?e3"gCw{KO1o)C'Li$x_ iK$qO%mji[]MP,ɔEjMYȔZx”΄L1G~lsn6557`{bmv1}ϛ/%|s<!c -endstream -endobj -1702 0 obj << -/Type /Page -/Contents 1703 0 R -/Resources 1701 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R ->> endobj -1704 0 obj << -/D [1702 0 R /XYZ 123.806 732.53 null] ->> endobj -122 0 obj << -/D [1702 0 R /XYZ 123.806 561.132 null] ->> endobj -126 0 obj << -/D [1702 0 R /XYZ 123.806 480.481 null] ->> endobj -130 0 obj << -/D [1702 0 R /XYZ 123.806 218.63 null] ->> endobj -1701 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R /F42 1532 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1708 0 obj << -/Length 1530 -/Filter /FlateDecode ->> -stream -xmWKs6WVjVI]WNRthАPv_}A]X{(Qvz&8-$Xo< 4yKxէ~z&yͦEw+.SOop5na -$Qq{~],דN&4| ,]살,g, V&ѹ1q>fL͊bhyZ&2jy.aWj)&ޭ~yϔټbU}jЦG p7/`nVh;(|g,Yi@p -ȲcGfFՠ/`Ƽ0804kWVmU}sz:2 !9._,~8kC0[ ? 3aCpsgi k7ߞv=8DHO@*X\ޕʙEJ\M+e5FHޯV,-Y$*850) *}5N1WXE~35fyZ 3;(+" ik:c j\xU9ן~g\ NuBš#Q5.sNVC;~+/POl {o5^拄5p -mBp“n[tA>.kX]}%@`ęC҂ -Gt(% =0׫[bRcMO'cH)2=:Feh|S r6VQtʊ9){VpVA1ڡ5Smv0wBܾĞY MlwR?+Ri!) 3Zt)J9ږZ,bU"">7Wtl[H25S|gsatnfk1z$IR#% -MP00ڡjQ*ULP)DY1 *7TVNH#3 ΩgTm&lJ^"iCOS.| Z+Tv%k]L-!dagVv3=շϼ)`H;C7jGCm:G99ۀpr >B;t -nٷ`oȲ|VeȢ8 E&BؓG3 _zAێQ~ tLj|diEIF#\{kqB-C,,|ź= *+3v]ZU }gN%ĩBxVwRKa}-:V8TrV@ ӈL•'>#*Ӕ}gX(Q!*唒aG,&-ai} -'iO$9Oh8И'1dG}(: Mn_T`?jsp~Y#YW~n&Nl2b-~Ƴ` f0kOXɺ'? -endstream -endobj -1707 0 obj << -/Type /Page -/Contents 1708 0 R -/Resources 1706 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R -/Annots [ 1705 0 R ] ->> endobj -1705 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [349.101 412.028 375.15 425.973] -/Subtype /Link -/A << /S /GoTo /D (subsection.4.0.4) >> ->> endobj -1709 0 obj << -/D [1707 0 R /XYZ 81.963 732.53 null] ->> endobj -1706 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1712 0 obj << -/Length 201 -/Filter /FlateDecode ->> -stream -xM=o0w!Hg ł@Щn齯!AoV|| -36U% /1j)Pmآ+j/vbiq]w u9wiɦ|)ú6&&c8d`Q oAUO6~hX;Lӈؿ) xhz)Lo6; -endstream -endobj -1711 0 obj << -/Type /Page -/Contents 1712 0 R -/Resources 1710 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R ->> endobj -1713 0 obj << -/D [1711 0 R /XYZ 123.806 732.53 null] ->> endobj -1710 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1716 0 obj << -/Length 1518 -/Filter /FlateDecode ->> -stream -x}WK6 $ϬeܚfCziz%fW6"#U{@g"[|^ʅTiUWb-jޕE*Zl_~f\ru˿7UQe,*1~{Q.h* -JAR!KN>Y[&wozgT1U2xl px7n@3ɽ:oxNlø -*lnH_sPq411k]]툸 Dt}E8W9f9'oPy9솥KQC% R&yaB7>Gcy:!~SA;&`L{Dr *=nǢPޥocYv2"$>Wy>3{?$x.P=gy^ -+`CĆj\ -o$8(rU$#k.%قr_hᖗ ]S7X. \hu/cĕS8:HA!Li< TV/[MY2Ud7I9d0ٚP* 0eUAꣾYh ֢QY-EoVa> 3#yEkH!Ts|T[s4lŴ$b .2\-U0^PcjM;[q4]1! -rJ b&S =Zg:z_:w -q@@ 4{ ,1Gz }C[R,d $b gߥϟ>~a^3` -|Qmn@ g.v$p4LSmGq| -Xsey5!EXU=USdϬk(”'5 3/K"4Ue,kVdh9B u 6&KWƚP -Nuݩw=?BE&٢vPcrAbm#H@GA/4p60c B`^ꚐᢧQ:zJ Fo9^UG`%Һ4K+2!{#0BaD,$\c<-T5J[_Y!hr{ŕ 4BC K!kWPY 3'mIJC^ [sD36҅%!<*.X؁|I#z#G(x - 28INEm2Vd/"V\т(h"AD7!*gW!X>CoX& ߇qo5&HjܡP?:F0xƟ}.D]JAޥur5WBnn~CD -endstream -endobj -1715 0 obj << -/Type /Page -/Contents 1716 0 R -/Resources 1714 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R ->> endobj -1717 0 obj << -/D [1715 0 R /XYZ 81.963 732.53 null] ->> endobj -134 0 obj << -/D [1715 0 R /XYZ 81.963 712.73 null] ->> endobj -138 0 obj << -/D [1715 0 R /XYZ 81.963 218.311 null] ->> endobj -1714 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R /F42 1532 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1720 0 obj << -/Length 1932 -/Filter /FlateDecode ->> -stream -xڥr6LD)m9nf&Ɂ"!5I],@=B?j,}cq|" 8ai~,$rw n<\oH],/?}[~/g d^cS/|͏=[m~#ՂmKi $PۖW5x0;jWMa2 -␫X.ilt:BGa'bY]%+N> -cbN -W -c0> -e:B?v͕50Y>SOkbD@)6s= `6Tq Е2 h23&K.Y0pg`-ҜBAnӺK)s$ F`-EK-r8Mx sSzďݽr,vm'aZsO807oV:4›d)zwAzEP=v nɫhHHQ?w N+ -\Z(Z!6~ ֢i%Ls")[[k;PGNE,r 8 mɡ8=:x -LVc߭i%ŘonR`mt 1Zlp,Īٓ4Ve/$V ߃AaKwݤ'鳥hN^bNȗ"]|kvJ <roBCZ3/j5hoA-{lKZL2 -~VjWk ]mb)UC'=Ȟ:-(zSZODu)ׂ:ԝy~0,5)$U'ۇ}:Lb=(%^ځ:ul [GFWߩ}xrGCQV`ܧևcyJ1.A%9^qHAeaZ\XS<5ulKS-LRBG̃$ʩ~B:?Rֻ^ySU"˘II LBYDZ0 -A$(c3+|֔xxF3}$-hq8] y0Đ\5źb'EYBKPyFR$3$K bCXNr{`PW``o 3 0]44"?5~W]aYkn}  -;')ނi|kAȽZȫŠƉ5 >FeCP:LG;qzk K/v߫~:R82CY{.ax:zhK! 3-5oV`(&G%{5ȣYX,L/g -endstream -endobj -1719 0 obj << -/Type /Page -/Contents 1720 0 R -/Resources 1718 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R ->> endobj -1721 0 obj << -/D [1719 0 R /XYZ 123.806 732.53 null] ->> endobj -1718 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F19 617 0 R /F57 1552 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1724 0 obj << -/Length 2002 -/Filter /FlateDecode ->> -stream -xڥXY6~_яj-S#Xv96 #1ɯO-ݗiX,աǽi](AgJy2D~GSo~9pa)pL;;wOwoO?vQЗ2ž{,?[z/Wuk'jZBIHCxmp ۦ/]o C=m2P m {w MA%Ol"OW`1(II,cIWpqև+B=8XEw'wn;lt<'DH=~1w[-I鮝I\Y)+Ŝ*]P-H !WZG]U/B4+["JG4N={ -7q= H֚yM97czߜv U?+H =Nx}[-R]c!|Ґ - -uuT=[GՑI UA81 #퇎PтC8;)pMr'mqs1XRU-!Ud!~diU8 /na0u0(#LE^ѢMF]flPHRKOoE‡nhї8C|}I*ߺ++7v$EQ*?:JyK:ןq -1'kTQ=x/Di@T=Q{B3֊P6R #A9D\PBe8RY:ί;Eȱys)-E\̼+ZB~&*z)jБYXS3s|8ysݶ$R(萈׏caOQ4l9?#fK 4aMijJ;Z2x1^P&֟PqvMeg^zb[7^ H5.{'+>P -B]K?yz?!&Ǭ dk>ڑfCn^[<;o -2uYa !Tٲ9X@0@!)bdY~@Y1#AIx,(F65fi |-Xj@KEgd&E#[V%kGth8}Dnlv@[c 7&b#K0@&2C> <{茩ݽm76 GvE0+IBy `.x!ݦ+i;=9Q;.+:[ڐq;|ͫcknu zI#pQy,34 \~X͌iO%W\-w9ꈦ]iM#-N:'=0LT܍ &^2˵POdHB)a_+Vl r} -{ڮ1 S\𽻲VM_*L؏0#۱޶cK=\ ~,/ ˂`Ji)?]nK(']H3+Bhpd+{8GP=E3pc&(ht۱Ke-ge&Q+7L3oІ41qYW%6Pz?CHw(#K+w?RҶt'qq,/ -9LxR/iHmf> endobj -1725 0 obj << -/D [1723 0 R /XYZ 81.963 732.53 null] ->> endobj -142 0 obj << -/D [1723 0 R /XYZ 81.963 584.634 null] ->> endobj -1722 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R /F40 1308 0 R /F19 617 0 R /F57 1552 0 R /F63 1726 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1730 0 obj << -/Length 1464 -/Filter /FlateDecode ->> -stream -xڵW]6 }ϯ,me@7vð6- -VY~H%vm>E&%"9RBޫ!( -4ya" ,^D6.b/?o^6n" (AaāWwB^Eq ynרayJzQ6z8 &Bΐ -ߜ%W;0dޒQ8e2db=jdP$G9V3yW&G5J} aӎ I2ʻ= jMpAI=E]ðV(5'74p)iM,C&u\"_?:#/_d=ٸK'29/!#iMrը*ZM4dm ӛ搅U5L_,n1/ʴ -@;pǵ\i)g*A΄{d'HGA}kGYbl^4*("1$/]!jL~+ [CZp -_T,ݪB0)3g5p@M߄d0TmZ:W#d$".X HlDǙ"0h */`s<6b[гVHb$s! mit8 -CpKö܀D@Rvc[KC߈^44uHF|Fd7h5R -kb QO(W a1*o'XAU,Y:ɜ>np|D6N]}h:އihIqMi M#q/#@;ҥpD.ݼ޾n+Wj^gx 8N(6aQۗ^-C" aOu#ʰdS y !NLon78GIwMwu̹B%mNC}q^)g‰eykv&ԆO;? ro"gڼl+7 ŏz5ߪTga.">b2"Y,?. -endstream -endobj -1729 0 obj << -/Type /Page -/Contents 1730 0 R -/Resources 1728 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1727 0 R ->> endobj -1731 0 obj << -/D [1729 0 R /XYZ 123.806 732.53 null] ->> endobj -146 0 obj << -/D [1729 0 R /XYZ 123.806 693.056 null] ->> endobj -150 0 obj << -/D [1729 0 R /XYZ 123.806 545.767 null] ->> endobj -1728 0 obj << -/Font << /F20 1307 0 R /F23 1274 0 R /F16 616 0 R /F42 1532 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1735 0 obj << -/Length 1284 -/Filter /FlateDecode ->> -stream -xڵVQs6 ~kM)C&mzn%S$&$Ϳ@PiKҗI`DQ俯,R,WAƙN )Ypozӎ'a2|'J8IH㼵O [^ޔ8m yW'x+,}[c'`13g3Z\Ͼ otje[\Da]_5kfk{Ck{4ol<\cB)ʋѣ%R)l[Vaޢe-|b٘Ui]w']wx}Dۧo挄&Ẕ4rybZ@8 Jjw`.2J -צA x$Z= -p+A9 A#`/CqĀ L? -/4hv9vfZpLwU]{? H%EwҪg=O. t0#<{9;Dj1˶O_0/J2ynqv~|X!2RnoM4A<G,}(^!ܪYaH m^=G 5QT~tc)^7bЬV L99 @v`{( ˴p+8UwW~;oAʄI9h( [y3ۀϛqSM,|[뼮<4y{P<%)Ï,"͒8S }Ⱦ\,av**eBưfǗWX̯竳@4m~Ck-UGiU7F* mC <>=z8aR}6/7/߫krTYv]qe&z5\h&=|O}<<@nw( 96ỳ!qCkV]:"Kun楇W -x-0 1yPo+<.xp @2%U\ - ='6$d%c>$Sj{E~i8 _!~s|rq|L26^0 -0 ?nhMn2>ڨVm,:B\aSٟ:jrC/hcb;- -J؁0~|wzۀd,]up9l5VD”J5 3HPM*1dut& :[ʮk -@5u9 iGPKu64X/ -endstream -endobj -1734 0 obj << -/Type /Page -/Contents 1735 0 R -/Resources 1733 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1727 0 R -/Annots [ 1732 0 R ] ->> endobj -1732 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 0] -/Rect [218.035 499.311 225.879 509.011] -/Subtype /Link -/A << /S /GoTo /D (cite.RFC1831) >> ->> endobj -1736 0 obj << -/D [1734 0 R /XYZ 81.963 732.53 null] ->> endobj -154 0 obj << -/D [1734 0 R /XYZ 81.963 712.73 null] ->> endobj -1737 0 obj << -/D [1734 0 R /XYZ 81.963 440.648 null] ->> endobj -1738 0 obj << -/D [1734 0 R /XYZ 81.963 398.351 null] ->> endobj -158 0 obj << -/D [1734 0 R /XYZ 81.963 360.994 null] ->> endobj -1733 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R /F45 1544 0 R /F40 1308 0 R /F42 1532 0 R /F55 1545 0 R /F46 1558 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1741 0 obj << -/Length 1308 -/Filter /FlateDecode ->> -stream -xWے8}+ho<̐3$r\ 6MR_-̎&l -uQKƃAΛS1ҷmnk ppXF`nOpt$ݞpsa·tl  0gAc㇝[ÖxTĉX:?R#%_;Cx-t~P>jqN)q]φ0 -7kPW <+F$Ʒ .'%9qԆӞz!n%y,} &Ffh;i \@ANmxҫn<1Nvgeg -rYoV9h u{숖PmTرrE4k7ЦY13)P6X1Xf{Wj+BUweq BѾ-nKY AϬx[@!Wy`?նnf54Aib} g w쓬(':]YO(Obb.'϶(J>1 x)ڮM,ϔfqXvVvy\m 5ʯhQCW"Iȯcm_ n'Pt"I%V\]&]_`PeRX&=}Z& kl2Y/$`dPY?U(P|j_D DöR%4\ҿuO`㞇:txyh_GR,oc> endobj -1742 0 obj << -/D [1740 0 R /XYZ 123.806 732.53 null] ->> endobj -162 0 obj << -/D [1740 0 R /XYZ 123.806 204.219 null] ->> endobj -166 0 obj << -/D [1740 0 R /XYZ 123.806 141.443 null] ->> endobj -1739 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F42 1532 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1745 0 obj << -/Length 1907 -/Filter /FlateDecode ->> -stream -xڥXmo6_oZHy@dNX,qmacы+u_;%[<y{yxgZY쒹9 `ar+5ϬOxYhx̾Ⱦn \]9.W7/בbAA -s8}Z\Ock9 DZƹu?sNjmڌ'gD$W٥ZA%w'~ڲ|"idU"!(MLf-hzF ʼԂMu+ɶYq12/\loxM-DqMw2'bSkejnăؖ[%2q=]l;I`jj0g]h23ѫmP_( xB.x25ڟ-i.;|)N4mTyu(&!{ 0pQ*O!S"RMِ*I)%T171GLkHcT }Z^iW:wX+gNH+n#YEI)Ő[_=f&QjW/0m:mcQ&j -֍xj.Z[Y YVU!Tu+ |7q?{a8&<~\oIY%ڳK^ѩ|QSWC' -}2udpTiw mg$Dc\H giU"mJ- FlrxON ̘d>lAuZ`߯q/iAPʇ1g&܋/[`HeS0aM!0'T"Xp|`1)+t5V -DҞ 4u(!s3e# f\I*YQ |UhC|sf2A9R^#^xݫ|D)0ܞY -zgTDB|D>h,$ *:ļ Dò'p^IgX^dcTxE ' vAVA/[ -LyG4p(\D80;p+ˁԢ; ,U&d)sِx_)X8Ãڗ,ت٪ +%*4ZKR,1qXQ ->{Ĕ**e`oBFe. ꪠT.=c:ci2KR ? rIPxKpke(".R8\rS@2˳i~סaAв1ZQWq[BT`㺬7o vP͆ӛm> endobj -1746 0 obj << -/D [1744 0 R /XYZ 81.963 732.53 null] ->> endobj -170 0 obj << -/D [1744 0 R /XYZ 81.963 700.261 null] ->> endobj -174 0 obj << -/D [1744 0 R /XYZ 81.963 536.609 null] ->> endobj -178 0 obj << -/D [1744 0 R /XYZ 81.963 394.112 null] ->> endobj -182 0 obj << -/D [1744 0 R /XYZ 81.963 323.068 null] ->> endobj -1743 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F23 1274 0 R /F26 1747 0 R /F57 1552 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1750 0 obj << -/Length 1476 -/Filter /FlateDecode ->> -stream -xڝWێ6}Wo23$n&HvSHVm6Rp(ڕnːzta 9~Cݎۿ=pI{`٪_S錠r#6فꝾGttM|]TD6(XN,2KHF$,M *z1tSw*.!ʰeq,z?PÿRq4׺, 8c;[$(g:&l>3Ͷٱ#Eí$iS Z+4QA4*YF$> endobj -1751 0 obj << -/D [1749 0 R /XYZ 123.806 732.53 null] ->> endobj -186 0 obj << -/D [1749 0 R /XYZ 123.806 700.261 null] ->> endobj -190 0 obj << -/D [1749 0 R /XYZ 123.806 555.041 null] ->> endobj -194 0 obj << -/D [1749 0 R /XYZ 123.806 427.256 null] ->> endobj -198 0 obj << -/D [1749 0 R /XYZ 123.806 284.361 null] ->> endobj -202 0 obj << -/D [1749 0 R /XYZ 123.806 159.231 null] ->> endobj -1748 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F26 1747 0 R /F15 1752 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1755 0 obj << -/Length 1547 -/Filter /FlateDecode ->> -stream -xڕXmo6_oZ7dn,v]as%Wd~w?.nwIc7Ɠ$ݘ'fvf.>%H_lq}a>x7\ N^0'ی>}9L7'‹™}co:Ͻ ҼBeF \/θ a7#Z(݌'Q2u6kI~Q'EOIp cS>-A- 0XԻѰ #%mZҢ}VUyUj%x]hc$xh{w1s 'Opsn*rjƾ=t HQUbJ_fr*5Dgc8U_TH`ܫfMTk8!TG{gPD|A Z pZe"|YA\j<ׄ箑7 -|)Jdԯa̙,-26#MiNhfL3/c^,tgv`=#{F&B澦a. H;N] !x;F>mU-Rt Tt~mCX(hHuZlȳZ"Jsm*dzpml zUfgݜ4_Aΐ*-7 PEjsĠ2U%y3kL޿enӴQ ;1I_w\ #+ʡgN(kۆ3SQe. wJ -u(vݑO}gS$@ +uA$t& {wkoLB!}fbk$uPhaGS&axN^x4(vw22us$CCt-*;ޛyT(ܻ-Kk_.1Jgn 'We#\oY᩼Q%q 5PGPA!Ld.Ñ` -endstream -endobj -1754 0 obj << -/Type /Page -/Contents 1755 0 R -/Resources 1753 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1757 0 R ->> endobj -1756 0 obj << -/D [1754 0 R /XYZ 81.963 732.53 null] ->> endobj -206 0 obj << -/D [1754 0 R /XYZ 81.963 564.215 null] ->> endobj -210 0 obj << -/D [1754 0 R /XYZ 81.963 321.117 null] ->> endobj -214 0 obj << -/D [1754 0 R /XYZ 81.963 217.165 null] ->> endobj -218 0 obj << -/D [1754 0 R /XYZ 81.963 154.459 null] ->> endobj -1753 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1760 0 obj << -/Length 1070 -/Filter /FlateDecode ->> -stream -xWn8}WQb]SͦY h CGXYRr}gHJv}29͜9s4w6caȽՍEL8XD$oUx_'Wb<<1xGܿZ0_ͧ?0O.O8|~[}VG RCJqA8yv -8Q"{0[O$ [}>*$C_~][z< Y_iժ\U34C5bQoфlխVXCmKTw~9,"V4l@x`&fk5%x2 㰤q P8 bad9nڬ$BxCS¤~+2#au0j'N8.#PU!~5_ Ցe {B?+a#ZN P[ϺY6edUG6D!wMYo:)T铐 4/Khj9U)Rͣ]b0rl=-̳VvC&ɐ),Mr@Q[48:g~CHyUIiL$yUI YZ5'&ډ 狣 3QPT*|yʳ(yUUgm7e.>7w#Q$YJn #`wJЅLRcui췇O;5vEhW*Y<-azĴw?VfdHLmxu}Vʼnj^|OF7k7]kMO< - w8* ׸Ovn!tϘMYI{᪆ [5`D=) Sw5%AtFjFm]bhX+R߼)h]P,b c悋kα/xTH|j>jpm{⴬]-,!,w wLF^SCq -SNA< -endstream -endobj -1759 0 obj << -/Type /Page -/Contents 1760 0 R -/Resources 1758 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1757 0 R ->> endobj -1761 0 obj << -/D [1759 0 R /XYZ 123.806 732.53 null] ->> endobj -222 0 obj << -/D [1759 0 R /XYZ 123.806 697.604 null] ->> endobj -226 0 obj << -/D [1759 0 R /XYZ 123.806 578.709 null] ->> endobj -230 0 obj << -/D [1759 0 R /XYZ 123.806 460.478 null] ->> endobj -234 0 obj << -/D [1759 0 R /XYZ 123.806 353.867 null] ->> endobj -238 0 obj << -/D [1759 0 R /XYZ 123.806 247.256 null] ->> endobj -242 0 obj << -/D [1759 0 R /XYZ 123.806 176.85 null] ->> endobj -1758 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F42 1532 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1767 0 obj << -/Length 1686 -/Filter /FlateDecode ->> -stream -xڥXnF}WT`\\;N4qj+@$0hr%-‹]wfgIc+8{9rZf.gk1aY˕VGNֲ>ڧO/_^ّ3_đg{}jk0r?M{=$qg}ՃI]׉Tr5_,ORͶ[QQsZ qz1̔Evؖ9.Ψ[5Գm-vޔG(*~~h3[H `_^P@}9^8ndL=LgPIA~#rmZ%01Tԅ3%%IX6PS;I% ;1B'c86et\׉bJDzɼ^̡:'Yţ{V> [7mSh"ZqD^$+oqa l-⹢YyS]]+T Yg:$OxdfsOEH6+vhsR& f5%miqZ}"b*ֺS ojpAJ>V[ N]Q`'zHʏ2uթGLxi4/^eҕc/AO<bux>D{bY7Q-5 zp^cGT`qm`16uFʰnYmXYDGߙ QGt@(0Sz7-kO -cx4/tU*[ĩGPpf=ZvCg?LfcCm5 }ӌ7)e~ -o@3 C,Mtj0t P6 ;n$j^c?2d{f\H -endstream -endobj -1766 0 obj << -/Type /Page -/Contents 1767 0 R -/Resources 1765 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1757 0 R -/Annots [ 1764 0 R ] ->> endobj -1764 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [272.909 291.333 298.959 307.772] -/Subtype /Link -/A << /S /GoTo /D (subsection.6.0.9) >> ->> endobj -1768 0 obj << -/D [1766 0 R /XYZ 81.963 732.53 null] ->> endobj -246 0 obj << -/D [1766 0 R /XYZ 81.963 697.604 null] ->> endobj -250 0 obj << -/D [1766 0 R /XYZ 81.963 464.651 null] ->> endobj -254 0 obj << -/D [1766 0 R /XYZ 81.963 379.445 null] ->> endobj -258 0 obj << -/D [1766 0 R /XYZ 81.963 140.515 null] ->> endobj -1765 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1771 0 obj << -/Length 1470 -/Filter /FlateDecode ->> -stream -xڝWo8 _GXØ!wwbȉK", {"͙qݏs \-N=<%fu~v9w@5tGM W){A8{Z9Axunf~S/N'ﺲ@^gc@x)8H2^%{{{qFǚ Oh:=_LYQRUve}~Cv;/"[=2 -%X.{&s*kζ[" u&Z(M|k(Ə]U5r†aڂhʦ& - >_ç=a3dY G˘[ QRo n3cA%{d9',K 6JG׭][Т>bv{4nJ޴OQG3DBk[YcXh[_@uosFS~&"{Ԑtݴ=UpLo>reCDz5Ms4M $fRMQBchY]O wCEozu 72k Řkos}Mc[XJFVˌ~d sD@h " p,7Uнl3x ,K)`[b#50Ogud]40_ -"fPdMK/UTX(˔2h)ԴԴClPfϦ';l; ZsdfYcsٮtYuL3 /snAiw-CԾ!Z9A/A9ԅ}^AZrgǐnKX*YL6$pA.K"~gN}Q̒zi-G2 -!__ی6imAQ7;>: n6?*b}w).lGcf}doG˺_< <~3d4!%ߦ5ȬlO۟]xVKև>F;0BWp7kqC.7kXxTIm#ˎ x{8D HLqi=m M{!PS$Gכք7f2q>/d!ŵDSi=~dꤑ%1z/a6 -endstream -endobj -1770 0 obj << -/Type /Page -/Contents 1771 0 R -/Resources 1769 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1757 0 R ->> endobj -1772 0 obj << -/D [1770 0 R /XYZ 123.806 732.53 null] ->> endobj -262 0 obj << -/D [1770 0 R /XYZ 123.806 634.079 null] ->> endobj -266 0 obj << -/D [1770 0 R /XYZ 123.806 556.437 null] ->> endobj -270 0 obj << -/D [1770 0 R /XYZ 123.806 379.504 null] ->> endobj -274 0 obj << -/D [1770 0 R /XYZ 123.806 292.888 null] ->> endobj -278 0 obj << -/D [1770 0 R /XYZ 123.806 173.569 null] ->> endobj -1769 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1775 0 obj << -/Length 1245 -/Filter /FlateDecode ->> -stream -xWKo8W2DqLMh Ch$y3ɲIzZ4C9of(nY0y;w8,ҵ++Y kZ_ߏ?-ή3mMgڟn`_-NS"..AOWb2s$|ƭ>ZyQhmdfyaȤ擿&|t1j:,$Pt:ԥR٪ZV|ЉZM[e+;"hjsqp.;w}5s!OcB"计U2k],Vf:JWnn.N6 dQX3'b>g!,1F߷%;;T2khbZKe -qMHlBFWݑ;]ժT1mjD#.Q\TnuF]x5[Ǚk7c_hkt^bY!`pwF"*DJ(PӸ|x|zCQ(Uӗ5#f:s֪zaX| -yԝ@{Ӡ ~xd5^+?Esܠ=Eb)( Gf1n7g#eGzχn?४LC-!h Jh -Q2L@"OD Ousgz̈.*NۮUA Lmm n= xH\x,lZx~'E4er\,gb9r?L ojL X g,@[9i""w KTYk'fo۾%vMh7 L_3`%* -| q՛l4w79B9'>ye^KEiUw-d0cwvE#3po9xK[NLz1:/ZCwyXÓl(c댌g<))b yn:y\d ;z1}?J5b)at*a"@^L/HbT;NL5̩p|;g EpODkvMjEMVҞCSPՑJǷqE?T.qⷉ$4ft|PMT7Av` |3vl9,\s°2_c2 -endstream -endobj -1774 0 obj << -/Type /Page -/Contents 1775 0 R -/Resources 1773 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1757 0 R ->> endobj -1776 0 obj << -/D [1774 0 R /XYZ 81.963 732.53 null] ->> endobj -282 0 obj << -/D [1774 0 R /XYZ 81.963 697.604 null] ->> endobj -286 0 obj << -/D [1774 0 R /XYZ 81.963 603.865 null] ->> endobj -290 0 obj << -/D [1774 0 R /XYZ 81.963 510.126 null] ->> endobj -294 0 obj << -/D [1774 0 R /XYZ 81.963 332.036 null] ->> endobj -298 0 obj << -/D [1774 0 R /XYZ 81.963 250.913 null] ->> endobj -302 0 obj << -/D [1774 0 R /XYZ 81.963 156.892 null] ->> endobj -1773 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1779 0 obj << -/Length 1322 -/Filter /FlateDecode ->> -stream -xXYs6~ׯ[Ezt}4vjL$dᡐ=ί$JL"E"o]G{G?F'{iPo6( % @,g]܎''1tnn~Ճ?>WװTͮnfoFѧ#kO1Fxi=Ǣwݍ~Mz#ƅ1 -#BB0J(b*B?.Sq+9tg8UWc}%yH%д& F9[H[CҙmdntV YcR7fjq{!"BD8Jg9)yܯzPC0IH!L(bބsM]@D'9MYl9"Va<)U\[D"P?j~S6/ Ybh/ ~gE#-.REc:\X_g61&oluٸ` Ń%*uPJC,rXOlpH"PL튢J+t!,V_hؓ{ Ѣ2w8=KFbemŷkCe/ceb VemJ:~:dnp҄dO(f^*C&CUV^lWsGe2舴TDL9ٛ0:~h7}~XC ~(?m62Oӷiڈ -|ۨQ"@@| ^|&|qs@W78*5:#J6{c& -y_6}}e\V#(EP,v(CQzNEv}Z$tDV>Q{/4@vy ^c’72*1z?6iےNOtVP!q$UJFݘ"LGy߶(a6|?E@U*9}!;6itM̙݊^sΈvvz"J;|-yO75wc9-Fs:A-(Ѯ d|^:ř_ꡝKZ(Ashh1Zeiv͠ގ0S 8X3CLzE{zE;LF.V5nLȄЈv|y#;),SX!N/ zT!p漚Y=}`iV8 -Pt(9MiĦ -endstream -endobj -1778 0 obj << -/Type /Page -/Contents 1779 0 R -/Resources 1777 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1757 0 R ->> endobj -1780 0 obj << -/D [1778 0 R /XYZ 123.806 732.53 null] ->> endobj -306 0 obj << -/D [1778 0 R /XYZ 123.806 712.73 null] ->> endobj -310 0 obj << -/D [1778 0 R /XYZ 123.806 624.054 null] ->> endobj -314 0 obj << -/D [1778 0 R /XYZ 123.806 288.004 null] ->> endobj -318 0 obj << -/D [1778 0 R /XYZ 123.806 159.839 null] ->> endobj -1777 0 obj << -/Font << /F20 1307 0 R /F42 1532 0 R /F16 616 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1783 0 obj << -/Length 1137 -/Filter /FlateDecode ->> -stream -xWo6_@RI0- Œa$yiGYq&J7 {;w<5pe@J7SWp:FuxO.O<6c3|:"&f| ?# ԂN̈́u>1>7Ϥ#`/#s ccxf:+A/,^)>HRۚ3뇺Iw5qnr<hJKnq[8H1V98Ʒ+P>﭂T%p:$I6u#8kl'-MN*<ɒuPy-͵s ]]@.g/,}jni9dW6Vn*vM:bSVyԤQCk:>` a},)cg1|g“pmz5sX6%\w. U tuSV,1*xUC!&X,]? 5J{>x`̗*(hS =IQ(N6>kV)Km+Tk`}`hE`%ʑ_JL/ZC3'ER5|Н5ێ4kBK\& ::Gt.w鏔)aw* ,X ˀJ13YGW'%_ @+Ⱥ,j]r/No|6]\OWERn"*8s0D'xh!$|Ő%ZCr}A.?%J :ɷu&|ZLчwNm݃AYF TnTPx[YibCk)iI02Vh!zաy96wILNC4rU-NٷMp )b vB ۵C3PsiMжUʶ$>FvO({U <)Z'rOj:<,>.w.{t=J6]BчG}HhJ6acgX$;FG܎<?ޯm -endstream -endobj -1782 0 obj << -/Type /Page -/Contents 1783 0 R -/Resources 1781 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1785 0 R ->> endobj -1784 0 obj << -/D [1782 0 R /XYZ 81.963 732.53 null] ->> endobj -322 0 obj << -/D [1782 0 R /XYZ 81.963 624.773 null] ->> endobj -326 0 obj << -/D [1782 0 R /XYZ 81.963 409.362 null] ->> endobj -330 0 obj << -/D [1782 0 R /XYZ 81.963 353.707 null] ->> endobj -334 0 obj << -/D [1782 0 R /XYZ 81.963 298.051 null] ->> endobj -338 0 obj << -/D [1782 0 R /XYZ 81.963 240.848 null] ->> endobj -342 0 obj << -/D [1782 0 R /XYZ 81.963 185.193 null] ->> endobj -1781 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1788 0 obj << -/Length 1062 -/Filter /FlateDecode ->> -stream -xڽW[oL}Wq-ծfǔRUIJm%f/ ({9s 8ƃI`9'xNDC?3NhÝQw($۝ Wfp}h|}{s|~0&ԏbg8)l~qcgMWc3 -s?og-["n?Yz34]g3ds5h,2H r! ut***\Ra̚πeU4+T7& cf?\lQSA31>@`P]!Kah^\/Gmram >@>>Z>V]t{rhn6}@ACJrR$R%rbYYDՒD$Рy4ѽ^Row՚,d,/YSґfiKG|S2)꠨aMqcPs|[n>Ejfps2ɖT%In{ZS&-Q 8Ɛ>LXSr v cRm20=R9\eUye ծΰZ8OHp{FjG&eYeK{}:hmTQp"@?HOjF&0I%~אt8Z#2t/5睴22ZuK!"2ǤiC%4QbC;nE>U8ʠ`z:B -Ϩ錬Dv5> endobj -1789 0 obj << -/D [1787 0 R /XYZ 123.806 732.53 null] ->> endobj -346 0 obj << -/D [1787 0 R /XYZ 123.806 697.604 null] ->> endobj -350 0 obj << -/D [1787 0 R /XYZ 123.806 603.838 null] ->> endobj -354 0 obj << -/D [1787 0 R /XYZ 123.806 495.625 null] ->> endobj -358 0 obj << -/D [1787 0 R /XYZ 123.806 404.183 null] ->> endobj -362 0 obj << -/D [1787 0 R /XYZ 123.806 281.525 null] ->> endobj -366 0 obj << -/D [1787 0 R /XYZ 123.806 187.758 null] ->> endobj -1786 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1792 0 obj << -/Length 1259 -/Filter /FlateDecode ->> -stream -xڭWQs8~LL4k'S?LmM0N7]KrwOݕ]wV1}1ywc^EX: a%1wŽf: ؍Lāfw_̯Is= >|sT_,>?N->N.v]/ o&_NiH~wAJi#YWNJ$ƺhnLM+dnWԟkVja2L2|"{UZ'n6Y#*NtX,~0]8.qR(#ED -,i[Fj҉LUB&.WWN6A;'v8Up<`S:h5*(>i pl~,V6SU3(|Q{A(SU\I-WRs*^# - h'qkh߳~MʳVmиMUcxkAARhhG8Pixl}oU[͍0~22 yAE?0jwy+?g6͊=q1ro uLr~w]2zdPM.ajiܤҌgQJjcp*ca W=G6> -& -endstream -endobj -1791 0 obj << -/Type /Page -/Contents 1792 0 R -/Resources 1790 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1785 0 R ->> endobj -1793 0 obj << -/D [1791 0 R /XYZ 81.963 732.53 null] ->> endobj -370 0 obj << -/D [1791 0 R /XYZ 81.963 697.604 null] ->> endobj -374 0 obj << -/D [1791 0 R /XYZ 81.963 595.66 null] ->> endobj -378 0 obj << -/D [1791 0 R /XYZ 81.963 493.715 null] ->> endobj -382 0 obj << -/D [1791 0 R /XYZ 81.963 378.871 null] ->> endobj -386 0 obj << -/D [1791 0 R /XYZ 81.963 191.029 null] ->> endobj -1790 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1796 0 obj << -/Length 1153 -/Filter /FlateDecode ->> -stream -xWn8}Wm%bu(?fn"m%+Qvr(GeG$jgΜcc8Ưמc.Rxnh0?$Qj~pgپrMb,/wL.ngbh^7J.ooŧɇ z>#|c$p?2 ? |g|z_uE2M,YXCE?R5 gjqv> endobj -1797 0 obj << -/D [1795 0 R /XYZ 123.806 732.53 null] ->> endobj -390 0 obj << -/D [1795 0 R /XYZ 123.806 697.604 null] ->> endobj -394 0 obj << -/D [1795 0 R /XYZ 123.806 596.195 null] ->> endobj -398 0 obj << -/D [1795 0 R /XYZ 123.806 477.247 null] ->> endobj -402 0 obj << -/D [1795 0 R /XYZ 123.806 401.353 null] ->> endobj -406 0 obj << -/D [1795 0 R /XYZ 123.806 300.721 null] ->> endobj -410 0 obj << -/D [1795 0 R /XYZ 123.806 168.873 null] ->> endobj -1794 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1800 0 obj << -/Length 1023 -/Filter /FlateDecode ->> -stream -xWoF _G :$ӬRqV{@TGf)KߏN7/…vfZH@j&S}$wS3]Qo.ۚ.n_[Mo@G {y!a3e½ۙ3-5&x#xG9m"CibC p50Kv/_R[VdD?/q*Z@hI*}YN%rDt3U(!y*oͳ+T /mZoyagJ -Ƈ {UȜv"d8w,ܱg?> endobj -1801 0 obj << -/D [1799 0 R /XYZ 81.963 732.53 null] ->> endobj -414 0 obj << -/D [1799 0 R /XYZ 81.963 697.604 null] ->> endobj -418 0 obj << -/D [1799 0 R /XYZ 81.963 595.418 null] ->> endobj -422 0 obj << -/D [1799 0 R /XYZ 81.963 439.318 null] ->> endobj -426 0 obj << -/D [1799 0 R /XYZ 81.963 250.456 null] ->> endobj -1798 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1804 0 obj << -/Length 1368 -/Filter /FlateDecode ->> -stream -xڕWYo8~[dfuz&nmMb0ȒW ԑq`h8f؎87s`\/Ϯ>:' -.vcqv7sA4\gAI}Zf~8V- ѝsng̜HUaq?ZF[گU^6ߝЁ6q2tP\^ 9_xEZM^6MS'"IRiOB}|@\5Ո{>- -J[Zn 4~E 뎫m* 5 шg9~#9U~Xm@/+3D_Ж 뼼cU;egu-no ؗz7el6lˁ}7tO30t:1B -!Px璈鄊(iI7#z|w#glm.5*xR)DL_$B%hط)d,c(6q:HSn} -:t,zSN_} 0OI];#8&6%yz j4h*.Vp!Y5_Dk~]ȼX_,/s>rsyv=s@-뵸96}i >%8sËc+=3rOnVd})|8(+zS?lnȄ|a6r(j *3yzH9@\(qG A?~r¡pm+}'E)8mσL3(>qyC)-&2Xbׄo[18ԭ首/`\+-1Jmxo,)ݽ`,JV8$TBD iT=`̉CsYhWHZ|bʆkE x|8 4Ԯ*7+)xMqw蛲""-F&s#iH >TTt<NJUc'.t˧(nFd|#ݠ`58ZTOa\MW{4tL?l8@v[lQSwDF>nVsi8O9Vhw&VI,E<%3!IEtqaV3Mgf6R^ Fd<wؼmj]lBnԖxdfZmL;q`ıyZ@e[XDsAL6.G@Yø.V°"SI t#IW31^ǫ/zwu>h*}l"KЭx^zjXÞ>/ki}h)e"g\rzӁW`#b_6g:o20?Z|vz]!@2ǂ!~ԍ3d۠kx> endobj -1809 0 obj << -/D [1807 0 R /XYZ 81.963 732.53 null] ->> endobj -454 0 obj << -/D [1807 0 R /XYZ 81.963 697.604 null] ->> endobj -458 0 obj << -/D [1807 0 R /XYZ 81.963 579.724 null] ->> endobj -462 0 obj << -/D [1807 0 R /XYZ 81.963 488.411 null] ->> endobj -466 0 obj << -/D [1807 0 R /XYZ 81.963 368.206 null] ->> endobj -470 0 obj << -/D [1807 0 R /XYZ 81.963 248.002 null] ->> endobj -474 0 obj << -/D [1807 0 R /XYZ 81.963 140.414 null] ->> endobj -1806 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1813 0 obj << -/Length 1366 -/Filter /FlateDecode ->> -stream -xX[OF~ϯ[ G -,eJRuݕKK{\ ITR_=gfws ehI׵RlX&<:<Ѿꗿ\ϯt:6u2xư0O/wW\r~;?磿G&i7PEl|% |m˷ulxϴV@<<"2XB4'EpHb8Gu]'Q!ަJ;Q)+a; -P'RtPL^4@|bY'a۞Dt&y, i; -_a3f!Z,nt}:x -WL!^@ 0}Ĵi8İ}mblO֦'MX*ߔ75:B,;ڜE3!s P7eaH ݌j~ߙXH8kg`Κ(y\[L`zїd}eoy^@)h܉6`N)(Ƅ3.%lU$;Od-,{XE$Ix|]oʘv1|ͣ,dV snpì ktu*XFWr Z|o y/Cވb#_3)۾ֱ4m;T7'0L`1TuWbit1PS j\E>=ԃIc&60!"EBMJecXbW%ahQlI]BO}^b%nI6IςaR7 F -O×Y,aJݢ"nR?5Ӆr G%NxEQܴQ6cRO5I= 'pu2XeX]G*aHXN$y*J#&,!0rĄGd)|p]ؿ]߅` 2x\4)7-eh׫zU&jrzp9$џc+uThjG4䜪4 {\ep/fO.NhŸPUzY$LWn@bX-Gix -endstream -endobj -1812 0 obj << -/Type /Page -/Contents 1813 0 R -/Resources 1811 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1810 0 R ->> endobj -1814 0 obj << -/D [1812 0 R /XYZ 123.806 732.53 null] ->> endobj -478 0 obj << -/D [1812 0 R /XYZ 123.806 607.187 null] ->> endobj -482 0 obj << -/D [1812 0 R /XYZ 123.806 534.765 null] ->> endobj -486 0 obj << -/D [1812 0 R /XYZ 123.806 478.331 null] ->> endobj -490 0 obj << -/D [1812 0 R /XYZ 123.806 408.847 null] ->> endobj -494 0 obj << -/D [1812 0 R /XYZ 123.806 330.709 null] ->> endobj -498 0 obj << -/D [1812 0 R /XYZ 123.806 228.018 null] ->> endobj -1811 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F42 1532 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1817 0 obj << -/Length 1568 -/Filter /FlateDecode ->> -stream -xڽXo6_h9֢!KURQQ( {;e{6~rmq1Xg^`Eo3ヹ|ṁXEjzG+/h_rfu};~;\Ͼ R\#=>| őqRGË"svnV2RM]-b`on/.; -h Gµ-7iPhƩ ö8yq8Lwy"Cp"+ UUVB1 ╜~liH9z>h-Yuq8f)3-A(0lؕ L/Q\r"L-DNIKNP݅͑K'8Th&Kx@cR:OlpLlqsb96AGY'M]%5ܑPtʶES -VEt})2i0h3fW"ˊgEK"IԗDuw,"+( -c{hzh[p(vޢL <h v=;.6ž>hƲrVJER'YG8n 8Q0:% -MWwVe( ' ]}}X>QgTj\'ӳ< -[7);bQBWMDOOޕf̢lQ.NuH(6I o+ #$L2eeFŬh@PPK?X48ymz :"É" :H@#Vi>L?6w -endstream -endobj -1816 0 obj << -/Type /Page -/Contents 1817 0 R -/Resources 1815 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1810 0 R ->> endobj -1818 0 obj << -/D [1816 0 R /XYZ 81.963 732.53 null] ->> endobj -502 0 obj << -/D [1816 0 R /XYZ 81.963 697.604 null] ->> endobj -506 0 obj << -/D [1816 0 R /XYZ 81.963 550.279 null] ->> endobj -510 0 obj << -/D [1816 0 R /XYZ 81.963 345.169 null] ->> endobj -514 0 obj << -/D [1816 0 R /XYZ 81.963 154.506 null] ->> endobj -1815 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F57 1552 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1821 0 obj << -/Length 1575 -/Filter /FlateDecode ->> -stream -xَ6_@>ЧtMdE -$AKFCQ{;áli4ަ(PO ]kk֋ٓsߵ<ɢȷb+ b'CkYX_]>/?g;E9 .gq1yF7).-_^Z=_ξ<` ,-ENW\WYjh -ԉҺCA؁S]IgTokԎaX{WHMtmy7OP-{F*E*VOmCψ,g{P$Yx1|=Be {HB@[$L|%o q%3*)h[AFUC؆Ն6voLޘ%SQIqoMyG%^Gǩq,5+ \ifځz8.I24 -(ZRRH CAZ:kcI/Etp,E0%^dIgftF|K^Z vJ5σl^^7ڲWCO( Sr.zv#uϰ 2Ё!Վc(qD~`оBn9HtflȑEИv@" -҉ZJMhjUw՚w 5-@* PDfruےx~eЌ1D1s$.gH!Mv}StPJjޔQ̉D|?O}O0@CYC(HrO0|{HЗ\oc);(o12 5fh T']{SV (}hr5dmN4jgU{B5s?*,-ϛ0mn9TSG7rz>݋TGQ @҇F -2BӘFiJ{eڳ0!r8 ̚F>Ķ٩p- IM̧}ڷJr^mU"^ݦ^7l\TX&DJB\JLOWrVXf,B^g\¾t'hF}(;\>]EuFقB#gݒXhB>cN~hrM#փaWw╁s٭wɑMVt?߇qV,;/z Gm8߆cSzi tml$J0Q;K|5_Y|\L xQO)z UNn|O8\ )&})عh\n.4Fn~;V\֬|Q~KcW jj[4q<V͌;5{z]|geyGKzCJvuhtF -|VbTהc-:TAδ1,cN=fԈ></1qhZoPo9xm$6x&F(?S %WU|f"z|eFW6 - -xF܃3'MMG: -endstream -endobj -1820 0 obj << -/Type /Page -/Contents 1821 0 R -/Resources 1819 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1810 0 R ->> endobj -1822 0 obj << -/D [1820 0 R /XYZ 123.806 732.53 null] ->> endobj -518 0 obj << -/D [1820 0 R /XYZ 123.806 558.318 null] ->> endobj -522 0 obj << -/D [1820 0 R /XYZ 123.806 356.076 null] ->> endobj -526 0 obj << -/D [1820 0 R /XYZ 123.806 168.28 null] ->> endobj -1819 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F57 1552 0 R /F40 1308 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1825 0 obj << -/Length 1383 -/Filter /FlateDecode ->> -stream -xW[sF~ׯ-h&"\S_Zg+ifʢAK= ;L''Zזk:e={u9Izgp܉9ֹ>||q~5#{^,)..A5Ol={[pw;AYak{cN֭+yǸ\-<0a3B3.qBRBoj -D\.J5,1dyHUQWiNE7U[T T0M5BvrT@+\ ѹOn9NLӰc8h%hkK;TMQ]t -ϝ5*pf 4Sg -9Ϧ* 3VcZ}ބ,oMg"ñ19Q9t+B)'jpQ DVx!6C^vBҩ6V8V*ؒ]7 -ATuȇѰPYnA(tuI8q:ca`a 8eIlvЏi%=PэHBܔE7. c?[~i;T5!AJ]Jgc}ݖ9mV/YV;R*ԫ?,NL1ƎWi>ܿTrJ=,uH{$wę ^$>ǘ{aJmy_>CMO0rZ_2Ю&ۿD6U{؊BW CKP>KQ] p+Ru7w'T7xahcFpÃ7h,y *rtos@PA -Dx߇fSz6tKTo8'49݄W"]]pn~@,)YdHGCNs7pBГxV5P,Jvʱ Q4M-/zOy˃o|O86a8:[[I -endstream -endobj -1824 0 obj << -/Type /Page -/Contents 1825 0 R -/Resources 1823 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1810 0 R ->> endobj -1826 0 obj << -/D [1824 0 R /XYZ 81.963 732.53 null] ->> endobj -530 0 obj << -/D [1824 0 R /XYZ 81.963 602.013 null] ->> endobj -534 0 obj << -/D [1824 0 R /XYZ 81.963 395.714 null] ->> endobj -538 0 obj << -/D [1824 0 R /XYZ 81.963 174.968 null] ->> endobj -1823 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F57 1552 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1829 0 obj << -/Length 1343 -/Filter /FlateDecode ->> -stream -xڭWr6}WOBѵ4N-u&3iFC"_],(*=g"Ξ|w7o͢(/ x%"fiz:>f2A2'|&$Ɵo&p>n/__'Fяՠ`&ֻogbzVt4eQ(`\x#g?f,IyJoT!J4 -ϊy=mfIMCqͽ -F<?Jݦ^ ݲD2ָJ{GVJ֯'~߅!3U,{]4;#V<6KqiCl?'9X9Џpp`]ɺʑ.雹hqtKztKzp˃* -'[Fi +b VAbEX{pr{6vQmROW'ȕ%猖oGTECw.<+.0Y5NSxd$d 3~^θ_1Yɔ]`7ϸ#4wO"3jAڲ_SkdZ  Rlv@x -Rqq -ӮTÐEɉ45zT4F!ۛ# >[j,a=Z4&8& VhB'.%y,!wY}{G?t@O.6M]Fѽ:*GM#֓k -DX( `S/,!w-ֽQ{{Km >,z{}zĊsWp8'k $ſ/A6K}tlGAW^2%Yr= /H74 -endstream -endobj -1828 0 obj << -/Type /Page -/Contents 1829 0 R -/Resources 1827 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1810 0 R ->> endobj -1830 0 obj << -/D [1828 0 R /XYZ 123.806 732.53 null] ->> endobj -542 0 obj << -/D [1828 0 R /XYZ 123.806 555.568 null] ->> endobj -546 0 obj << -/D [1828 0 R /XYZ 123.806 365.509 null] ->> endobj -550 0 obj << -/D [1828 0 R /XYZ 123.806 283.635 null] ->> endobj -554 0 obj << -/D [1828 0 R /XYZ 123.806 179.418 null] ->> endobj -1827 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1836 0 obj << -/Length 1500 -/Filter /FlateDecode ->> -stream -xڵWێ6}WQbE}K7tv7]E$V#K. erisC׳WwX8{'N&^DΪp޹xzu;_"qoH᾽ԽY\;/_2qu }^?^fgBQ0pֻٻS`{a9ZrYQrght4f/ r[vud=?n恫ꆪς˾-R1ȲN ; {Ag8v%Ue=svF1oj -gƾm 8dB@l%bWd(YD^ʦ-8qZWr6/ײ/ǡ8Hi -9RRˉP+RC"иb/Π'/}q+ ؂,׊&SC]'iyܜVI}q0Nh?)ZGsd1K&ď)VH@R$+VpXFj0Rq[y VTqv;W aUYh[եk [j=IoJ0|0N[yv4STcpr6K/: ֨hy}tJ?)ix_fsGSE8fKOx"̿$B y7\wch'-Et{詧Nc8h -YOe)x45{UOT#^"?a 9-Xx67M2 1xD3Y>r, (ԋVOB{K"#W`'/2("?wy1h3JA6%smDZt8j> endobj -1831 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [365.351 447.527 382.298 461.472] -/Subtype /Link -/A << /S /GoTo /D (figure.6.1) >> ->> endobj -1833 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [351.047 195.003 367.994 208.948] -/Subtype /Link -/A << /S /GoTo /D (figure.6.2) >> ->> endobj -1837 0 obj << -/D [1835 0 R /XYZ 81.963 732.53 null] ->> endobj -558 0 obj << -/D [1835 0 R /XYZ 81.963 697.604 null] ->> endobj -562 0 obj << -/D [1835 0 R /XYZ 81.963 606.896 null] ->> endobj -566 0 obj << -/D [1835 0 R /XYZ 81.963 558.641 null] ->> endobj -570 0 obj << -/D [1835 0 R /XYZ 81.963 471.153 null] ->> endobj -1838 0 obj << -/D [1835 0 R /XYZ 81.963 435.291 null] ->> endobj -1839 0 obj << -/D [1835 0 R /XYZ 81.963 368.113 null] ->> endobj -1840 0 obj << -/D [1835 0 R /XYZ 81.963 328.499 null] ->> endobj -574 0 obj << -/D [1835 0 R /XYZ 81.963 218.629 null] ->> endobj -1841 0 obj << -/D [1835 0 R /XYZ 81.963 182.766 null] ->> endobj -1834 0 obj << -/Font << /F20 1307 0 R /F40 1308 0 R /F16 616 0 R /F42 1532 0 R /F23 1274 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1849 0 obj << -/Length 1261 -/Filter /FlateDecode ->> -stream -x}Vr6 )tg"Fƛ;x7tfHͮ,9\w߾A)ɉ  `譽urr},[H,≗evya()4H0b]s?#b~nv9_?N-?N>,'/#-ELӷ+2gn=e,{|aU*zqQ$a(vÝm 8S-Lq0E2d<(wfo5E)ai Et{S)ƊBVچ -pɸ^ $&;=2FY5}w.;"-~vH3kwYZީZ͖@&=)]8>"WI&eB:4{A.K^]61S8XJ;Tx/Zh cfKy>Al -#0دav=2A|v F  "(q@*!1?+|wJ/;g9t})|(5u;Tv$BGF'~z,'$0?=`nic?XTH -vx., yg ̢@Urthj uyw_ҙgj{<m-lK͒l%eZu.T5ߟ -x3Ƕڲ,s 5;v -endstream -endobj -1848 0 obj << -/Type /Page -/Contents 1849 0 R -/Resources 1847 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R -/Annots [ 1846 0 R ] ->> endobj -1832 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/interactions_delete.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1856 0 R -/BBox [0 0 464 263] -/Resources << -/ProcSet [ /PDF /Text ] -/ExtGState << -/R7 1857 0 R ->>/Font << /R8 1858 0 R/R10 1859 0 R/R12 1862 0 R /R14 1863 0 R>> ->> -/Length 1864 0 R -/Filter /FlateDecode ->> -stream -x\]%7v<"WGH $#@xXe(qNU'+"Eh@b>᫛p7/\µO_~IzjAk"TcviXuc16#8TRsPJ?P2(mb]<ﲴ"w5PZkD:?KGܷFQX(_eFGS=ht{^Sُ-c-g;kZsm['>GX-m|(˨bεrgzܸMyn\H'E?׍ iHpm;Q7Fjsͻsn:%>ys'=9q!.N\H[q[SX4=^hz֚bIϑ˨Njm_NhF׾2ոce]Av.r<0|lz<᤿ŌKކ T@\רO}Ϟܳo9grM1,`YW粢*c[]|~}Yoj6f4z9+ I1wy g-]J^*fz:4BsJ罱4u\6Zix_Ügc'_*>|]nɗ'2ۏo~/]SWRC!q w1{{vɓ?] ]jc\Bc2;K¹}~_%oPĿ_en~Kw|Bo;ccO /O=ۋbo~ퟂ|_9^^fG-z53;QtDHv>n4V+)]=&t ]*C|ª~ -p-ןR=on>#poRap6-1J %9 ]-רϧl}A_>47h=1ޏ,OI-s'E::< x˽#W4v<e9Ed_]ƤEٱ+Q99;by͋#.>,Sc_"cWy͉ŕ[6/} TqHSFfOα~7Ca=:?|"ݝ <x`,;̜?垨 -endstream -endobj -1856 0 obj -<< -/Producer (GPL Ghostscript 8.62) -/CreationDate (D:20090422132728+02'00') -/ModDate (D:20090422132728+02'00') -/Creator (\(OpenOffice.org 3.0\)) -/Author (\(stender\)) -/Title (\(Interactions\)) ->> -endobj -1857 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -1858 0 obj -<< -/BaseFont /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontDescriptor 1865 0 R -/Type /Font -/FirstChar 32 -/LastChar 116 -/Widths [ 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 602 0 602 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 602 0 602 0 0 0 0 0 602] -/Encoding 1866 0 R -/Subtype /TrueType ->> -endobj -1859 0 obj -<< -/BaseFont /QQFMLO#2BDejaVuSansMonoFID41HGSet1 -/FontDescriptor 1867 0 R -/Type /Font -/FirstChar 40 -/LastChar 147 -/Widths [ 602 0 0 0 602 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 602 602 0 602 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 602 602 0 0 0 602 0 602 602 602 602 602 0 0 602 602 602 602 602 0 602 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602] -/Encoding 1868 0 R -/Subtype /TrueType ->> -endobj -1862 0 obj -<< -/Type /Font -/FirstChar 41 -/LastChar 41 -/Widths [ 333] -/Subtype /Type1 -/FontDescriptor 1860 0 R -/BaseFont 1869 0 R -/Encoding 1861 0 R ->> -endobj -1863 0 obj -<< -/BaseFont /ACHYIG#2BOpenSymbolFID186HGSet2 -/FontDescriptor 1870 0 R -/Type /Font -/FirstChar 1 -/LastChar 3 -/Widths [ 892 892 892] -/Encoding 1871 0 R -/Subtype /TrueType ->> -endobj -1864 0 obj -3867 -endobj -1865 0 obj -<< -/Type /FontDescriptor -/FontName /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontBBox [ 0 -176 602 812] -/Flags 4 -/Ascent 812 -/CapHeight 812 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1872 0 R ->> -endobj -1866 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 49/glyph2/glyph3 67/glyph4/glyph5 77/glyph6 79/glyph7 82/glyph8/glyph9 101/glyph10 105/glyph11 108/glyph12 110/glyph13 116/glyph14] ->> -endobj -1867 0 obj -<< -/Type /FontDescriptor -/FontName /QQFMLO#2BDejaVuSansMonoFID41HGSet1 -/FontBBox [ 18 -176 586 765] -/Flags 4 -/Ascent 765 -/CapHeight 765 -/Descent -176 -/ItalicAngle 0 -/StemV 87 -/MissingWidth 602 -/FontFile2 1873 0 R ->> -endobj -1868 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 40/glyph1 44/glyph2 46/glyph3/glyph4 65/glyph5 67/glyph6/glyph7 70/glyph8 73/glyph9 97/glyph10 100/glyph11/glyph12 105/glyph13 107/glyph14/glyph15/glyph16/glyph17/glyph18 114/glyph19/glyph20/glyph21/glyph22/glyph23 120/glyph24 132/glyph26 147/glyph25] ->> -endobj -1870 0 obj -<< -/Type /FontDescriptor -/FontName /ACHYIG#2BOpenSymbolFID186HGSet2 -/FontBBox [ 62 0 807 799] -/Flags 4 -/Ascent 799 -/CapHeight 799 -/Descent 0 -/ItalicAngle 0 -/StemV 121 -/MissingWidth 500 -/FontFile2 1874 0 R ->> -endobj -1871 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 1/glyph1/glyph2/glyph3] ->> -endobj -1872 0 obj -<< -/Filter /FlateDecode -/Length1 4936 -/Length 3391 ->> -stream -x8iTW}ڗV - -\YJ1LԠQDm Q-ӓvm41%NfG}NgzDOq2tgY;)s*Nb̼W{u{uw0B+ -^XsPvmCV#6@ [hM$6o7GkFF_:rr !Re-g6[6ׯ_;¯Dk׶4TDڟukkF}kojj U \be>2yv.2"XCZɦ'i%klx&~XGkmuݗwp ѼNu[+וvPȰ' -8 G2t=$,ջ3f&V:,%iO)v頉 oC8 -'i-I]έ aʙƟ*\/ypEWS敱~1R+ǠWMv1'p B7c& b8$i]hF;pCRgcb~zHv)𒊴_ L50MէuAYu[ZpYO+Ĩ. x0O-M_ZVumvٕ%[VA_5Є][Әv }WvI;Șz@:\V્0vMvњ*@w[i 7_Ӄo_ OOK=f/vu.qaw9.kVqv_g^J|?sz8i_W0% OIqOz73LQHtn%?cGAK?xDb{*wCnq؋^P!7j8ܿG엸oj qo/{vŞDm]6֝..nwv=цB͇-hVJln&+6n`6z:Wm7ո97m§ x7XC6D8UJňI\+%x-VI|ҍOpX -/>N|Y,Wq.LKXbEXJ,`K,.7sq]w` LtN+i1b>bƩE bjM1,jS8% 'Da!N&&`O⤉n1ɇPi9߇yW`s b't+ᰑg8[ƍqvͮ4Vgcm8cJqK1+'21HS34>pc(Ha mL4§MdHMB?M~)%%ܘ4iaI¤LHt`&ƄR9oz -].AtСcUZUChUd@+b v4ޠ q ނzMC# ЙPoraD yb`~'nsw -ek)I!)lW@w:Cn|Pos9`m?uc(^]Oa'pEDb4l̬Cn^V!bl -X -[}q|g!3-"WFcYϦjOsAp_bR(" -+ǟslEIa&{UE_F]s8E{ O*q$;+QPYt1M q[.*Dg)Jgm_Mfd^@2=rQ\c\8dMoyɟ966R61@nTiXQ@^2B Mp䰌tvN M.Es'Φ/,l_xWN4.3f-l;)̔CQ9Cgd{a AQM V?؍N$(XsO1q0UvձY忊el'4ˉvi_U.¤ r)qf *l6B,r?:/0()MLaFEaӫ|юbvݘ*ci ^U`je46s)8Vvqx/~h<^Ǔs7Udx˘VvWcRxNH&p`:2Y7:ǥ=Ei 5)X|3tfHK@fy}ƀӏK/fѫy,]Pq3: RfKcMȐqf˨O?)}0gRa;>"#ܤ3pSU'=7됣:^Хљ`q{'ݚ<4KP;b-zO#1Eg ,YYi^+ig2xkv}1tඍ5)?3\3)ۦzm袸7ƧjkrBٴl ^Άl]u8EWߠoK4$ڌ]]Rl2ULoBMє"V1ŔŒD|"r(CdN2$u7ty =+gq nxMv|]G5\RPi_͑Kf}p7Lb˗_hUʗnnH >vƸGy`ɱy1I2'*u-7,77l7<7?旉!px1 1/Ts ٱTn45T ǎeX2sO66oݾm'_;k# {,&C;)&f`[T c@Z=x4jR6GV+X* yeODE >s -Scd0WbA&bҘF}y.h7/>N% /hDf8[PB5QGx4hUsً?)ﰌԎ_>?4F9+_]]^o=7?6Eث:mnxdH.0藑UVvʶ+(CױN󾡁ҙ}'>PxN\ө/7{]By ܇(cU#&ہ&d=:/P. -CDLJ5ھ^ױkm1M x)IxY_fmp3بcQD(zzm35=V_W?aVȜ%̛9_ӌT3| w 54]Q*[m4S6kitYot]x){!5θb6M&e'@bZ? -endstream -endobj -1873 0 obj -<< -/Filter /FlateDecode -/Length1 7320 -/Length 5055 ->> -stream -xY xTյ^ϙW&30$ !K -V P"A  Lx]M"DH`0 l뵀 -]L|}w}gk=QPo$4Ru척 #8zJ-NRkw]xOYg9@ s#k93K{>H,Ah E,Pi~+[Hd~[/=߭Zl# ՟sO u̲9=AUwj>8gaeVP '=EOM<)+G齤 l-{ڻ L*8ˡV -h+kSX )EZ@ P(˰Y -+؋Dq,=IDm4 Oҵrjk" -.fRU8FFx6Ja\wml"f^mR?4y߬A69HRBSnA%M3~܁wxU^a SMqBe.[*2M?a5@ќ_Q?$ۮk _' \ۮ5ZxpJl<2yl!PĽ J뱖h0.eU$UB x$KPܠ.E -Qb?(J?*N}cJZzF45tb9Oi䉍34>zy!؉ũ!.,&[XR@h wFRyo27$@_H`-@;E{|@`}TW̜d,bzۦdXȬz;j_G>˩gfPmY2RdV9\o8#>‚S -]1,kZ_^_ -|~VW.W|'LkE&G/9b-v;C7Nouj"O?I߇ s3^0_'y_y?z3υ_6 Ƴϼcgc':;?ŷU>~B[\o<.7m -<"ua'`kͼEkך -`r_xC5+t M |KVlt(] -| =mwq\:r|.w -!럍36l>c3vۈ6[p E #uXt34tioF?j >!0jH۟9qi*Zk>)puXi'=?>W -xW<r\?̊ -|XC,%Ѹ$ xN^lŇE\L嵸7_0z p5 -#TY|Y`㳒q?8cϰR FiNjFb'%N?N?' $Gq۝8Ax ׌c{"E#ȃ =|QU#7 =X@98"G8pDH -rho8<S/gA+Czy#ϳ`^mîPCz`pn)ޚo9; cq?1@`&fxc&2=a͘?;1=$il ĭ~̾># }K`hs_!^=yiÍ޼%NV qzu6~a)6 -xZK4-N^2pb2 4i[#l1i.t{;niN׶AnmM=31&AS8drm_I`rg[Tq>rqz}EC2Vw }`AIT'Z&ZHJ=T}Kc'y8Iʊ붾˝0aM%{=בk' &S4zgR޼#]祐NOڧα{=p}vE; #HfR˰_|/\8UdžL\64q]ceH~jM^4cүe1‚Ovi -7#y` ,mpDdgf -cM*᡺W !f!yV/~ XRB!$YS҈;>cc(ܪ%V @M<L)JZ΀=:/T/~#gP57I X=li d)͕HqJV 8 SU7!8<|cEezΗ+ե_,U] Fe>PbfmQe촘5R_)Hzݤ=1F@S6qT*Z 8'OȨc'|Ӧ㗿`ڟ>z-#dc=`gmUHJPT:[TG+'$zzm6ZhcZq)᡺tm<&%Q~_Fo΋sy+BJZa0V*55OM\M|MBMbMRMMgc^\5s=y|wȉCv)}yх]K+/.Zq -i \R24of_G "=F+j'j{刉I -2*NrzIi;ʪP(kHM]cBדr"qhݷKQ͗p7sdkHNWaIg#ͫްz ;YիwΟo{v3RX2r{IUWՌ`:kjR08lg[HA\Ϟ>?賁쩐R~!F؂0MM;3ݓ|jȣE{8A4{'%^/+mB%`E))I99EvA;,;\=vb;dNIPZ*){"5 +lW.9zw"}:U`XAr*kze'3L)Q!]'/_v+c֮|grӽW [Swɹ32~4y5~]^oKv)Y5e_*Muaoϐe=Vn&#&lIȏ+d#/Rܸ^'YƑ,$GSt؍=$nIbf74&=&ՠoRe&HN%-[#H{O'&MdC\6_}-U,&i<4Ud }Q QBm"$(?^rI_Bu'<>t$9QP|zH硝FeHbjb4Qxa\yc kn:Kd[fS1)0ww*bv}JJR-I~@?/!|l 1tN}{ `!D&5/MJIyN 'x U)6]/N:MiOra: E~5BY?MXmv@߼"_^˚oqZM}}[5V,P1,(tQr#1]Kn%#%1#z̹wK&\h|EF> -stream -xc`d``fh``f07b@",97g```tH.+QH)JϩLpY42RS4_E=d``U -eX%#j 5_Hp&V82xB^bn*T=HFA~q $3 #*`0Ԁ*nhdKXPQPUQPo=?YAkJYO320(10 0(* -)*yb -f Qv6FAeSU5s=]/?l((aÿy{i SdF^s.\Az=߲mFFFyƔ-[1{ Bs!7?#(aw1*OWِT\#Wq2Awg9W- \o]U,5# (%n1c#UMWazMYOs w#Ԍ> endobj -1846 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [407.844 198.037 424.791 211.982] -/Subtype /Link -/A << /S /GoTo /D (figure.6.3) >> ->> endobj -1850 0 obj << -/D [1848 0 R /XYZ 123.806 732.53 null] ->> endobj -1843 0 obj << -/D [1848 0 R /XYZ 312.551 492.367 null] ->> endobj -1851 0 obj << -/D [1848 0 R /XYZ 123.806 454.927 null] ->> endobj -1852 0 obj << -/D [1848 0 R /XYZ 123.806 391.397 null] ->> endobj -1853 0 obj << -/D [1848 0 R /XYZ 123.806 350.68 null] ->> endobj -1854 0 obj << -/D [1848 0 R /XYZ 123.806 324.408 null] ->> endobj -578 0 obj << -/D [1848 0 R /XYZ 123.806 222.576 null] ->> endobj -1855 0 obj << -/D [1848 0 R /XYZ 123.806 183.65 null] ->> endobj -1847 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F40 1308 0 R /F23 1274 0 R >> -/XObject << /Im6 1832 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1880 0 obj << -/Length 1244 -/Filter /FlateDecode ->> -stream -xڥRFQBüJN,삫r {րȒq6_cLjrR#Dޔ(g[_`ۺgRp!pH#Fڞ,ڋ=a_"1sӨA4Iۍ+ 9=kxlֆhpu#n.MԴ͈o$=8)L(Yor}ͳqOD?~W -`V<9ti#.Pu/$3=dqBDP*˜bU'/ Ӑ.Mo;67Pn-ahI>Wrq6W 9n+!}qܣ$z~;!;Pu~' φ09-Q}Or r[WxT<x@|UB؆sa&sP: G:6=P^,LE|iL.̿=n]3z]I%NtNqdYZi%Ŵ[RK:(u]듥VLj/*q)9G] On`%YyIR//s~^Iؕ3{_vMwrofٌ-о3 ` kw=̠Z8KAG9/$P HK&R-X* -Dq4+ -endstream -endobj -1879 0 obj << -/Type /Page -/Contents 1880 0 R -/Resources 1878 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R ->> endobj -1845 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/interactions_read.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1886 0 R -/BBox [0 0 466 383] -/Resources << -/ProcSet [ /PDF /Text ] -/ExtGState << -/R7 1887 0 R ->>/Font << /R8 1888 0 R/R10 1889 0 R/R12 1891 0 R /R14 1892 0 R>> ->> -/Length 1893 0 R -/Filter /FlateDecode ->> -stream -x[uyqݺ1cA@I.E"Hy?Nuk_(:kuuWuߜ~}.6~7^|}/yKnK߾xt߷n¥g7)ñӡZO}_R0LJ8Ժc: ;Tn':ҵuu}^jj5f@:87ukl:2>q=q=qy^gm4P߻0sy@9"-4JٓIxz~zɡ%lͿ=&mt%|*j4$88A"=lv">'DZl2bk3Z:'Yz{WTd{iQݿfz(9QϢƘgEpsT\]9%3y擗ڦhyw3ђnjԥ\rǣ$v9)ySfgW1SJ6)cɍ'7s]b )4PM f7n}^MvGt۳InܓqשnSr{13{436ؚnl>y=s[4ٍ-k7ɍN]6VXml\r㶙⎐LxO]3RYlr;e,&s27@n٥.'LffeLԥb?enfV1G(cu2ͦ6f2Omp 6l^PlnC22}W1oqzi6c37vPmƫ[Npctc -u_Kohj)%RDt6~V涵c1|Y=1aىNtu_L {Vxjbк^ G 4I)4Cc'xj)SWz7=UqxU Z, (mo6{\X}nU?W}n)Xk"?X+4Vhb! - -4X+ kӺY+4Vh0/8QVvBx! - -X+4X+;ZZL -X+tۙB©zapBx!ZX+bЧ1kk(kLrZmkSX+b''X+X+d ʺ) -GNV8Z-X+twkk#JX+f -mSX+:ap\ꄵ)b* -'X+nN[* -ZOn4 -ǥNX+;ZO.VSBX+)ZT]VlX+:Z) -X+h*bpɮbpEkbBѩSMbl6wLkN^*bP>u`Ş%V%VVZ kR'N0jX+b?eY+kfݦVX+ͦVX+9a:ap6S/Z ZkefNX+% ZkeCVZP|-V2keC-flQmX+[`l(X+ʆblMX+YP-V6lX+YZP-V6kegRV~6Z?eQX< S9(UaG"Z9\%kD V2~k-% *!wACe  , MXu2Xb*8%5;Oa k-ܞA ma(8kxx3!Dպ@&z*5/J%]QZEnhc#_asۂzAB72s$s3j -V>ͤf@頿Jj7 8%?V=gEOhZXci(JH%E8Х&J -4(R@lI'cI -t -\')@';Iu&I -si8IOD7I$65IWO&iH\JP&i\Vb$Ы—J%)-IKR$MT5$ePIʦM J U#r"ȏɉ>&)HUH5U#]~.' bG # #mr"8o`"(0BxS7Qe-s"nI!nI`u[ReMɘn @%YFA4[ܔUgFܒ --PnI 7q[Re-Uz-4[~[ے:=ޖTmݖTmnK*ܶ #3mɮ/lKn. CG?Ht6ً>?ոxsF4'ô $mʟЎc)fqAYۺnXiNj72_+UWkjwq/Hz_`pbЉ2bT0c`GI=o i*2t(%/Gf,C/FAg=O4N5 1kfnAnz[v;H4,9;< J/ٜm^o&?S5pۉDn[w_#`g9}OqG & "91ΉA| :҉P'1Ċ@;ۉQ1މ(#V4g$<1g"'XD؃lO =& 'q>1kO ?9`?#?" -(9+(((VeSBL6&H'PS:A 8PS> D+ٔ%¨. -(eXDň>btqPF1NkO"j6@bl*)ͦ`H|6FUlVHRh+but""bw bSƣͦ`K|6^b~)F;e)|2E4Y*)V)#ی+)ɦœbl*)VX!O -|lѴS:AQ}&&*2|Gh>㠤bd¥1y&ŝ3S1P!)0U,MAb[Vh**V8'9+ Fbtobm.߂] -+l -k Vd±l-,Jbx#!rg <{12(̭{|1KfdzV#bl㴊f¸Gd&C E&4o7e<&4y~]F~սwǕ܎_|\ݟ{nNs"7}C;b~n8S8Ɖ==U1seb1qӬ{|xn4˫R`>}sL\'_p׎/bC1/wl\3_(U2:2E/cp)OMUOb=_}T|B=Fr{1|Ga~,0cd#/| ky&S~,c/N}5*Rn u߽>Zh.yM!b…'N*pM:*5Mоa 3pʮL$ᵉ|?Uyƚ /!1/Zɼ^dJϺeUR_J]~%`5|',ϟF{I7SGd8WnOOik6͚JOԓ?ꮮ=N--S0ÿf: ŵckwHÿs+@~1PZ@U -:IeaM|{K^{p~^|y> -endobj -1887 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -1888 0 obj -<< -/BaseFont /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontDescriptor 1894 0 R -/Type /Font -/FirstChar 32 -/LastChar 116 -/Widths [ 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 602 0 602 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 602 0 602 0 0 0 0 0 602] -/Encoding 1895 0 R -/Subtype /TrueType ->> -endobj -1889 0 obj -<< -/BaseFont /MXRFPN#2BDejaVuSansMonoFID41HGSet1 -/FontDescriptor 1896 0 R -/Type /Font -/FirstChar 32 -/LastChar 147 -/Widths [ 602 0 0 0 0 0 0 0 602 0 0 0 602 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 602 602 0 602 0 0 602 0 0 602 0 602 602 0 0 0 0 0 0 602 0 602 0 0 0 0 0 0 0 0 602 602 602 602 602 602 602 602 602 602 0 602 602 602 602 602 0 602 602 602 602 602 602 602 602 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602] -/Encoding 1897 0 R -/Subtype /TrueType ->> -endobj -1891 0 obj -<< -/Type /Font -/FirstChar 41 -/LastChar 41 -/Widths [ 333] -/Subtype /Type1 -/FontDescriptor 1860 0 R -/BaseFont 1869 0 R -/Encoding 1890 0 R ->> -endobj -1892 0 obj -<< -/BaseFont /QEHNHK#2BOpenSymbolFID186HGSet2 -/FontDescriptor 1898 0 R -/Type /Font -/FirstChar 1 -/LastChar 5 -/Widths [ 892 892 892 903 882] -/Encoding 1899 0 R -/Subtype /TrueType ->> -endobj -1893 0 obj -5294 -endobj -1894 0 obj -<< -/Type /FontDescriptor -/FontName /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontBBox [ 0 -176 602 812] -/Flags 4 -/Ascent 812 -/CapHeight 812 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1900 0 R ->> -endobj -1895 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 49/glyph2/glyph3 67/glyph4/glyph5 77/glyph6 79/glyph7 82/glyph8/glyph9 101/glyph10 105/glyph11 108/glyph12 110/glyph13 116/glyph14] ->> -endobj -1896 0 obj -<< -/Type /FontDescriptor -/FontName /MXRFPN#2BDejaVuSansMonoFID41HGSet1 -/FontBBox [ 0 -214 602 765] -/Flags 4 -/Ascent 765 -/CapHeight 765 -/Descent -214 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1901 0 R ->> -endobj -1897 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 40/glyph2 44/glyph3 46/glyph4/glyph5 65/glyph6 67/glyph7/glyph8 70/glyph9 73/glyph10 76/glyph11 78/glyph12/glyph13 86/glyph14 88/glyph15 97/glyph16/glyph17/glyph18/glyph19/glyph20/glyph21/glyph22/glyph23/glyph24/glyph25 108/glyph26/glyph27/glyph28/glyph29/glyph30 114/glyph31/glyph32/glyph33/glyph34/glyph35/glyph36/glyph37/glyph38 132/glyph40 147/glyph39] ->> -endobj -1898 0 obj -<< -/Type /FontDescriptor -/FontName /QEHNHK#2BOpenSymbolFID186HGSet2 -/FontBBox [ 62 0 807 799] -/Flags 4 -/Ascent 799 -/CapHeight 799 -/Descent 0 -/ItalicAngle 0 -/StemV 121 -/MissingWidth 500 -/FontFile2 1902 0 R ->> -endobj -1899 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 1/glyph3/glyph4/glyph5/glyph1/glyph2] ->> -endobj -1900 0 obj -<< -/Filter /FlateDecode -/Length1 4936 -/Length 3391 ->> -stream -x8iTW}ڗV - -\YJ1LԠQDm Q-ӓvm41%NfG}NgzDOq2tgY;)s*Nb̼W{u{uw0B+ -^XsPvmCV#6@ [hM$6o7GkFF_:rr !Re-g6[6ׯ_;¯Dk׶4TDڟukkF}kojj U \be>2yv.2"XCZɦ'i%klx&~XGkmuݗwp ѼNu[+וvPȰ' -8 G2t=$,ջ3f&V:,%iO)v頉 oC8 -'i-I]έ aʙƟ*\/ypEWS敱~1R+ǠWMv1'p B7c& b8$i]hF;pCRgcb~zHv)𒊴_ L50MէuAYu[ZpYO+Ĩ. x0O-M_ZVumvٕ%[VA_5Є][Әv }WvI;Șz@:\V્0vMvњ*@w[i 7_Ӄo_ OOK=f/vu.qaw9.kVqv_g^J|?sz8i_W0% OIqOz73LQHtn%?cGAK?xDb{*wCnq؋^P!7j8ܿG엸oj qo/{vŞDm]6֝..nwv=цB͇-hVJln&+6n`6z:Wm7ո97m§ x7XC6D8UJňI\+%x-VI|ҍOpX -/>N|Y,Wq.LKXbEXJ,`K,.7sq]w` LtN+i1b>bƩE bjM1,jS8% 'Da!N&&`O⤉n1ɇPi9߇yW`s b't+ᰑg8[ƍqvͮ4Vgcm8cJqK1+'21HS34>pc(Ha mL4§MdHMB?M~)%%ܘ4iaI¤LHt`&ƄR9oz -].AtСcUZUChUd@+b v4ޠ q ނzMC# ЙPoraD yb`~'nsw -ek)I!)lW@w:Cn|Pos9`m?uc(^]Oa'pEDb4l̬Cn^V!bl -X -[}q|g!3-"WFcYϦjOsAp_bR(" -+ǟslEIa&{UE_F]s8E{ O*q$;+QPYt1M q[.*Dg)Jgm_Mfd^@2=rQ\c\8dMoyɟ966R61@nTiXQ@^2B Mp䰌tvN M.Es'Φ/,l_xWN4.3f-l;)̔CQ9Cgd{a AQM V?؍N$(XsO1q0UvձY忊el'4ˉvi_U.¤ r)qf *l6B,r?:/0()MLaFEaӫ|юbvݘ*ci ^U`je46s)8Vvqx/~h<^Ǔs7Udx˘VvWcRxNH&p`:2Y7:ǥ=Ei 5)X|3tfHK@fy}ƀӏK/fѫy,]Pq3: RfKcMȐqf˨O?)}0gRa;>"#ܤ3pSU'=7됣:^Хљ`q{'ݚ<4KP;b-zO#1Eg ,YYi^+ig2xkv}1tඍ5)?3\3)ۦzm袸7ƧjkrBٴl ^Άl]u8EWߠoK4$ڌ]]Rl2ULoBMє"V1ŔŒD|"r(CdN2$u7ty =+gq nxMv|]G5\RPi_͑Kf}p7Lb˗_hUʗnnH >vƸGy`ɱy1I2'*u-7,77l7<7?旉!px1 1/Ts ٱTn45T ǎeX2sO66oݾm'_;k# {,&C;)&f`[T c@Z=x4jR6GV+X* yeODE >s -Scd0WbA&bҘF}y.h7/>N% /hDf8[PB5QGx4hUsً?)ﰌԎ_>?4F9+_]]^o=7?6Eث:mnxdH.0藑UVvʶ+(CױN󾡁ҙ}'>PxN\ө/7{]By ܇(cU#&ہ&d=:/P. -CDLJ5ھ^ױkm1M x)IxY_fmp3بcQD(zzm35=V_W?aVȜ%̛9_ӌT3| w 54]Q*[m4S6kitYot]x){!5θb6M&e'@bZ? -endstream -endobj -1901 0 obj -<< -/Filter /FlateDecode -/Length1 9404 -/Length 6505 ->> -stream -xy xsnvg6w² B6 ‡Y"— - biJh` @")Ҹ1 UJ)D+Wi66|X\3Ey?s;w=wϹYB !z,b 3_n'"YأIrs>K( +C+K-B\EKf_!}Cʰ#/qNoYUP9vǗv |$iE`1`iŲG{/џ/}dҪ7q|9 :@[l$m\0 }$:UM:k-ndf-|Br' |%Y[mX(zf -SY|pV^qtZ@1YLNIje/JJ8W +bzt!%=Ą)l -\}{6\J*9gNNjc!'d/R98{YŶOrtꐾF=B)Fn"0 9%RE!D^M1Q'yU%FWX(LRF21beRͩEb,gj}ދ%`L/ق19z `LWXܘ,i;|hx:Ay<΃=i?~D%DxXqE`YIDDeiR3QQڌzc}4Ɩ,,eB%*uÌh#=40гBnpl/Wõ5kGūWf5pRr9] W ?>_Yp A7͡;xLqiW Jo>8}XC ?fÇA'?sx {r8iﮆwC6:9gpzNupNpx79ñ]CVop8:u+p푹JH Gb^p٫t~qxm_qxz?886b/i`/<^X ϧsr9EOUh -?Q`8n"~ Va ؁糖gYgQmg+[}l\q1gL3lA-Q;~ [,P5%PU`8l䰁*P9Ϟk9T>kZpxj5N'9VpxGl) £GeX0*Lgu[2C~9<ef(專C B $|a g%p[p6s F9a;38L0ýa*{0d&s B0 -vB/ak\ f(3;(f1kFllFQl,`@Vb+jfyV @D(dauaD?!-a1lDaH 3clY80C&>Ό d`-QlP3dNH -U :u>6CipơT)vE3_CᐜΒWCR:$N9C<86C,Jl4pF -JgQr̕N"q\k j;vE(f[.Bh5U׭(Q`RA !isppL:Eh:hTm9kG-xXƞX&G HDM "h?םIsZK֒DZxlG4 X.90N إ=d-B&G!n-7iT\Nۛ" v UU5ؾ}#>mލt4'`^ DO$]WCv-Z&S -D&WDU(CGҮPfF$Qz3_QdH!=sߡ^X:g9#D| BvF%"e$c /S@!> (A' &Y223P,n)cdgۑǘIVM*LV3}6A1z%"&V,Kt`KRH6OPց+%=W:ü="|}t oU89 -DBF퀈W:̲Lgt^ܭ^zQoTv >: 3'o_m4߷w3+z0'-ѥt OK;=*O?F&vbk"pI;Dfrw #!]t@^!" nҨFoIKL:}7x:ƍ,oiS"aL"&F3eH ]P{x.?2م *z>:z:uIHB|HEfwH 5[u@:Y `yF7in75kQHWuL$%dPWN4lл'3q〱XC@L*H/ @DeA3e[؝۫qBsS]R܂GNRa,DX,/BӤPEeTC~Ɛ˶XǍlٸQGݳ7";Ug,)ˑ1 -OUᖖ9"VMvoPkk==Wz ]aR„ 旑'b0FaӼet$~ xO oЏ&} -dof\&$SbX-&N%If;# 2B[PgSs.;Y6>470,K X, + -E&)Ęq`Yr MEE2AKFf)3C+M?x/?O/SBvO~KX [*\w/+2Iz2i5k8=#F:&I\wW/wdմrH :r5?D?ߧ4Aijp7xblsq\(}ysp듒3xoas - --~|><_ktyG+m.>6*%I~x颥g_KԳv_~iӲ7P"-$1jW%vw4q8y36e -vO94]SR]^-6V߼y}ƞ]ߺN -w_8yiE8/w~l-gJڐbM21ꈣ*>UjEV"AwkWKo!)&d G{wM)6?^k~x0sXoN_q*Á,a\q؜5z[ nH8a/^E Fr `N08Dקo/6vo>.tCgq;?q-~SH!QWHQMToDDDǃ$RP{ykG Cթ+z"2Ju 9\@9fbQ误\t ~&}εƪTaշ徊HjظG_??RH2QS$ VE1"znd{hd{a(W, gggNk ^|ErP|9ǫxkքT38#5 Q5v@MkM$8H޻zjgg{XՎK:bH9 CF _[\wN6ٰvÏj7ɤ}4Ɓ;?{wO~Qvvj酮0 ("%) (Mca2ɬ`/h#t-L'7ݮ~ߣк's# -Է>@a72d& Zb[Uhvdi6>%39^h1Qq_as١FX0(,rqQq~_fEOvi=|Cwns\Rj㟢<>^u|r1by=l[UV$Жڍh8wRW-ZII` лՀ6LSթc. Я-DKM<6V=g +\ I%`LfAV Œ(H5=*:]G=5Xk+X+ -e٧_x{Է[.LWtopD>CurvzrJ_m93AT(YQpꞆWM[8iGf}bA>qgf%'gLmlȺ7g<6fChI1Y*/l-\W~ݱhB)[~c?孵= O.ضP\Kꍏby߰zZu;gZ8굵Ht -a͇gK~tSVػ~zb1 i`n$Z+& P&p=AM&$L ­pzK^tЏ̀n4i /V -,)f!Q-3$eL;IIP7+LHbZ)E&' .֛|+% {1=Ӵ+:5hI$4^81řcK5`)4)MZs!,WʕM#BXLSyeTxJb"cqӓG,v%ZHD$$*..6RV 2eVk'ؓŃiٱTQz~_o|`#BiM7Ҟ]uXV!b`L+ -#˘$ [Ϡo/q6:ke__2e׼vqJh;<›1bD3o x*KfŪ;y\( ?Df3Jjߵ7SF/Bi!9)]ެ~s's=-g@Bq}oE!RScB7F>R+B>EUC*YuKy!Owf2̇J{\u0!/ߺ@DM4 ֈpo=W5GDظח~wRL\_$od'9 -endstream -endobj -1902 0 obj -<< -/Filter /FlateDecode -/Length1 1740 -/Length 877 ->> -stream -xohSWyIދm6q%y/C(VMږ j&Q(j>LTaPKهm2&h(6ES?([MRk8{=@+ZW(g4S`B ->h0| B<?Mj:)|%5hPyj㝁QS Y[U)KMYM[/ GaFfa-m1co]yIʟ5JeV -G9 k&ƧؿMס),XhTm-/Ku -6Y򪢥NEYA:ET>tr{&sМdF <3 v<#+'Y2q7*y>F|KC~/@nnmF^a Z Wbs⩯s:QVWZ%N>/j Vn;j0ONti%j\pWZ˖[&`>,ct!RjJAlč[dBBi\a2D#/Sh7f,olYen~ -Gt$x<-f)Wom`54G8^\EǮb<[фH6i}V ԚhT7k`h ZGM }6.61+IiPH - %TPu3,.8r Wٸa^+O[xu -endstream -endobj -1890 0 obj << -/Type /Encoding -/Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/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/grave/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/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/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 -1881 0 obj << -/D [1879 0 R /XYZ 81.963 732.53 null] ->> endobj -1844 0 obj << -/D [1879 0 R /XYZ 271.195 396.35 null] ->> endobj -1882 0 obj << -/D [1879 0 R /XYZ 81.963 361.477 null] ->> endobj -1883 0 obj << -/D [1879 0 R /XYZ 81.963 270.443 null] ->> endobj -1884 0 obj << -/D [1879 0 R /XYZ 81.963 232.5 null] ->> endobj -1885 0 obj << -/D [1879 0 R /XYZ 81.963 194.225 null] ->> endobj -1878 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F40 1308 0 R >> -/XObject << /Im7 1845 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1907 0 obj << -/Length 735 -/Filter /FlateDecode ->> -stream -xڍUKS0WVyzYh@)!J4C}WLN+C2E DE- 9E49 M8SH E%Q;<~rHpU0 #8e5*|ru+8A6]M28˂AjH$6'B04[w`D4AuDX -8hJ5)#LJV8.tZAtSvZ*}*cIKPhbSǑ"8m0\bpi;'ELi&Ωwn޼f6E+4>]{7禙Cwb ʲ -c+PJL+H[^x^ـn`}%DƉ+HgGi{ -\M׊Wq^kM~cYA`xVfeSwmfcr=`eva(WpǭiUi|y]-iau>!4[ÏR#kҎ+@'9QJ"re_;o ҫa֦y& imﷁ knaV>z0cz36PYV҄]k+mè|ujgVVunjGX#BΣYY57=m -endstream -endobj -1906 0 obj << -/Type /Page -/Contents 1907 0 R -/Resources 1905 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R -/Annots [ 1877 0 R ] ->> endobj -1876 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/interactions_write.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1913 0 R -/BBox [0 0 477 402] -/Resources << -/ProcSet [ /PDF /Text ] -/ExtGState << -/R7 1914 0 R ->>/Font << /R8 1915 0 R/R10 1916 0 R/R12 1918 0 R /R14 1919 0 R>> ->> -/Length 1920 0 R -/Filter /FlateDecode ->> -stream -xMu+N_1aJz/,*rٕ%΂(*HR?NqHְ)-8th4.ϼ|uO>yqˇOo*) 7/:_?UZ[~xzp/6@mk }y$2K躩mF:˺v:najB.ut:wgоzt9O9\zYis^ǀhܗ;{oVȱvZh7u} g:_f3{1ԟۦ#к ZHf:ZuJrsռg}'o2RG1*?O^\ۣ<*^B흮SnMziыc-7n߫!]B7WꓫTfbtD}G[u{kmNjUm{Z=&w:/=c(kᩅcԸPdQCStc̜jOō̙y#sT{ 9W3gNɍ1͹S=Mm<.Vۘ;J\L9lnCP|n\H>azuuM=ç.6>wi&BڣJbg"lmc%wy&=;FYMvǣ:jJvME.rM]6je%7q=ܴr7n/ZQ(MoۣmZ}n\>enҍ1f|nc7rlڋm<.&!sa ͞E6!j9mSKx14kwM]\m\S/㚂mZ]ncog.ue=ƶj9JImllb[\ncuuɍzkTqɍ5SK7ɍbrKv2drKp2$7;w&y1gݘmbj9\vX⓻,6Kln!uܦAmrSr2&FXb62qMnp 6R-v~9jtY܍SUt1s}L޶fZ1wS0{s>H86AMy*3ֶ͡=V[V;6fJkvWFiOݏFu.em~QYh*M32>4OfyLdv} -cI)`W> M}ү2ŏsiKx?DS~i#1ccǛh"͓Z~4r.12u7lMha.훩ypَe }>0ok m(ܲMfe175 Zq w:ThejpCw[.Z3)LxoLDg(,,Ot#:w!mC}{ِ iڐi(6am<LL:?tűpqȵ=jC,%9=7Sϧ(Cl'w~[;mIߪ8 -~O+  BCCh(@8YMЀpBBY1B!͚!44Ahh@8BC!͚!44Ahh@h8d-N{ 4bBC!  4!s c  g1p-Chh9pLB!MZAh8}}Y ӃnMrmf) 4r  \r}}BCB^MrS 4:TS/z  LrB6 ͭ@h8&s =Fe \{9͞Ch% 4tt.:LTN3>s6sЬBi& -BñS͝pTKᤠ}k/& -BI& -BBCg]@hh*> ]BN1.^BC'W/Y :z 4h|rBC1>!44 49P!4[lD3SP!4[l( 4B͆lB 4[ACCh٨&PEChP-@h6f  ͆lF f#ؕϢl,j 4 -B~ȴ@h6-KñƳ!W;V N{OAh* 4&׎!4M 4sI\:?񍡛АMHa(c` [he2g t^hq%#L̝H0e 3+λn9$8]z5Go;F_P_d7j>pNvNWpSC3dgP pSC85485;̩3cC5sjh p&/C5sjhpSCS!bZ85 qj95485;;-CqjCSCRǜb[.s© CpSCԁSC܁SN N 'SC)NNөSqj:SCSCf95t*N GNqj86uSé^*N g1:*N #mrSCG[pLSqN '6{s˜bs95!s̩= pZSCwZpjr N mZ*N v9pjh9pj©4Zũ)N Nqj8KpjbpR>u͵[ũ$[ũaN \r.85t`N N N g]\SN1.^SC'W/Y ǜ:z85h|rSC1>95tpS85SUUt5f hfJ85SU05f ũ&CsjP-pj6f+}hN85դX85SչhN85SN͆lS85Y©P¨95[lYԜ-EͩfCqj~ZSN1©ep8Vзx\3jǪ9 u)NYFքS1Ƽ XS8u{YOTK$!mKի6xvֺ_ Z8PHrX 6㊗eX.UmU\_ps1͸"b5sabeqbDpbd -A'SX#C|Qc21N# .FKbbl*.b/V_Ej!bd.VV],MrT]n/8V_EJ8d]{pJ6ኸb.Ft#ݑ} ,3|g;t&x1@b$_a9_EŊ8qbl2Mb_QL^!TwT҇<ƾ7쭰l~u?/N;}HFx>Gcg*ϳ0!"1,wI<£3!5nKmt:z~n(6!皼e=?|rIK -endstream -endobj -1913 0 obj -<< -/Producer (GPL Ghostscript 8.62) -/CreationDate (D:20090422130932+02'00') -/ModDate (D:20090422130932+02'00') -/Creator (\(OpenOffice.org 3.0\)) -/Author (\(stender\)) -/Title (\(Interactions\)) ->> -endobj -1914 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -1915 0 obj -<< -/BaseFont /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontDescriptor 1921 0 R -/Type /Font -/FirstChar 32 -/LastChar 116 -/Widths [ 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 602 0 602 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 602 0 602 0 0 0 0 0 602] -/Encoding 1922 0 R -/Subtype /TrueType ->> -endobj -1916 0 obj -<< -/BaseFont /IJQMIL#2BDejaVuSansMonoFID41HGSet1 -/FontDescriptor 1923 0 R -/Type /Font -/FirstChar 32 -/LastChar 147 -/Widths [ 602 0 0 0 0 0 0 0 602 0 0 0 602 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 602 602 0 602 0 0 602 0 0 602 0 602 602 0 0 602 602 602 0 602 602 602 0 0 0 0 0 0 0 0 602 602 602 602 602 602 0 0 602 602 0 602 602 602 602 602 0 602 602 602 602 602 602 602 602 602 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602] -/Encoding 1924 0 R -/Subtype /TrueType ->> -endobj -1918 0 obj -<< -/Type /Font -/FirstChar 41 -/LastChar 41 -/Widths [ 333] -/Subtype /Type1 -/FontDescriptor 1860 0 R -/BaseFont 1869 0 R -/Encoding 1917 0 R ->> -endobj -1919 0 obj -<< -/BaseFont /QEHNHK#2BOpenSymbolFID186HGSet2 -/FontDescriptor 1925 0 R -/Type /Font -/FirstChar 1 -/LastChar 5 -/Widths [ 892 892 892 903 882] -/Encoding 1926 0 R -/Subtype /TrueType ->> -endobj -1920 0 obj -5714 -endobj -1921 0 obj -<< -/Type /FontDescriptor -/FontName /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontBBox [ 0 -176 602 812] -/Flags 4 -/Ascent 812 -/CapHeight 812 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1927 0 R ->> -endobj -1922 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 49/glyph2/glyph3 67/glyph4/glyph5 77/glyph6 79/glyph7 82/glyph8/glyph9 101/glyph10 105/glyph11 108/glyph12 110/glyph13 116/glyph14] ->> -endobj -1923 0 obj -<< -/Type /FontDescriptor -/FontName /IJQMIL#2BDejaVuSansMonoFID41HGSet1 -/FontBBox [ 0 -208 602 765] -/Flags 4 -/Ascent 765 -/CapHeight 765 -/Descent -208 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1928 0 R ->> -endobj -1924 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 40/glyph2 44/glyph3 46/glyph4/glyph5 65/glyph6 67/glyph7/glyph8 70/glyph9 73/glyph10 76/glyph11 78/glyph12/glyph13 82/glyph14/glyph15/glyph16 86/glyph17/glyph18/glyph19 97/glyph20/glyph21/glyph22/glyph23/glyph24/glyph25 105/glyph26/glyph27 108/glyph28/glyph29/glyph30/glyph31/glyph32 114/glyph33/glyph34/glyph35/glyph36/glyph37/glyph38/glyph39/glyph40/glyph41 132/glyph43 147/glyph42] ->> -endobj -1925 0 obj -<< -/Type /FontDescriptor -/FontName /QEHNHK#2BOpenSymbolFID186HGSet2 -/FontBBox [ 62 0 807 799] -/Flags 4 -/Ascent 799 -/CapHeight 799 -/Descent 0 -/ItalicAngle 0 -/StemV 121 -/MissingWidth 500 -/FontFile2 1929 0 R ->> -endobj -1926 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 1/glyph3/glyph4/glyph5/glyph1/glyph2] ->> -endobj -1927 0 obj -<< -/Filter /FlateDecode -/Length1 4936 -/Length 3391 ->> -stream -x8iTW}ڗV - -\YJ1LԠQDm Q-ӓvm41%NfG}NgzDOq2tgY;)s*Nb̼W{u{uw0B+ -^XsPvmCV#6@ [hM$6o7GkFF_:rr !Re-g6[6ׯ_;¯Dk׶4TDڟukkF}kojj U \be>2yv.2"XCZɦ'i%klx&~XGkmuݗwp ѼNu[+וvPȰ' -8 G2t=$,ջ3f&V:,%iO)v頉 oC8 -'i-I]έ aʙƟ*\/ypEWS敱~1R+ǠWMv1'p B7c& b8$i]hF;pCRgcb~zHv)𒊴_ L50MէuAYu[ZpYO+Ĩ. x0O-M_ZVumvٕ%[VA_5Є][Әv }WvI;Șz@:\V્0vMvњ*@w[i 7_Ӄo_ OOK=f/vu.qaw9.kVqv_g^J|?sz8i_W0% OIqOz73LQHtn%?cGAK?xDb{*wCnq؋^P!7j8ܿG엸oj qo/{vŞDm]6֝..nwv=цB͇-hVJln&+6n`6z:Wm7ո97m§ x7XC6D8UJňI\+%x-VI|ҍOpX -/>N|Y,Wq.LKXbEXJ,`K,.7sq]w` LtN+i1b>bƩE bjM1,jS8% 'Da!N&&`O⤉n1ɇPi9߇yW`s b't+ᰑg8[ƍqvͮ4Vgcm8cJqK1+'21HS34>pc(Ha mL4§MdHMB?M~)%%ܘ4iaI¤LHt`&ƄR9oz -].AtСcUZUChUd@+b v4ޠ q ނzMC# ЙPoraD yb`~'nsw -ek)I!)lW@w:Cn|Pos9`m?uc(^]Oa'pEDb4l̬Cn^V!bl -X -[}q|g!3-"WFcYϦjOsAp_bR(" -+ǟslEIa&{UE_F]s8E{ O*q$;+QPYt1M q[.*Dg)Jgm_Mfd^@2=rQ\c\8dMoyɟ966R61@nTiXQ@^2B Mp䰌tvN M.Es'Φ/,l_xWN4.3f-l;)̔CQ9Cgd{a AQM V?؍N$(XsO1q0UvձY忊el'4ˉvi_U.¤ r)qf *l6B,r?:/0()MLaFEaӫ|юbvݘ*ci ^U`je46s)8Vvqx/~h<^Ǔs7Udx˘VvWcRxNH&p`:2Y7:ǥ=Ei 5)X|3tfHK@fy}ƀӏK/fѫy,]Pq3: RfKcMȐqf˨O?)}0gRa;>"#ܤ3pSU'=7됣:^Хљ`q{'ݚ<4KP;b-zO#1Eg ,YYi^+ig2xkv}1tඍ5)?3\3)ۦzm袸7ƧjkrBٴl ^Άl]u8EWߠoK4$ڌ]]Rl2ULoBMє"V1ŔŒD|"r(CdN2$u7ty =+gq nxMv|]G5\RPi_͑Kf}p7Lb˗_hUʗnnH >vƸGy`ɱy1I2'*u-7,77l7<7?旉!px1 1/Ts ٱTn45T ǎeX2sO66oݾm'_;k# {,&C;)&f`[T c@Z=x4jR6GV+X* yeODE >s -Scd0WbA&bҘF}y.h7/>N% /hDf8[PB5QGx4hUsً?)ﰌԎ_>?4F9+_]]^o=7?6Eث:mnxdH.0藑UVvʶ+(CױN󾡁ҙ}'>PxN\ө/7{]By ܇(cU#&ہ&d=:/P. -CDLJ5ھ^ױkm1M x)IxY_fmp3بcQD(zzm35=V_W?aVȜ%̛9_ӌT3| w 54]Q*[m4S6kitYot]x){!5θb6M&e'@bZ? -endstream -endobj -1928 0 obj -<< -/Filter /FlateDecode -/Length1 10048 -/Length 7007 ->> -stream -xz tU9TUWwtvB!aH0  f&"fN06 Q#0^Ё(r޻WOS]ϓ&FM$3J =m]f,|*!Lzo\oּGJ璑 ~ųB݄̜V͝^%x#ϑ+)}*:[K==M~8I3tfys?9R~ޓ37ӂ I?ujja9Ҍ szoc' b|KUx^[(&J] 9CKϐDzahQ3K -i<-%7Rs.Y.UOIM2g+}d=J$M"?CsVr) YQl+I+/ⓗXTL'Y+ۢV ~CHpI a9/%axr#.ˤR 0&X TJbq~.Si48NDζOFQ(,]o+Cd%'Pq07Kd فo̅l}.Y6NRgUH_Gf va]^G4 eWH9݇|yZ qd P=Z/x &;11O V9[ukt&ֳz*s_}y)х I6 9oAwڬ̋Sf$]g7ʥ 0 G&H2Uuz)%E>wO9t, nd?e -ׯMd+zxj6ūIo?np_WA;Ρ=p!bU\./9|y4SkKDK7HX;p ->}Nh|Zqr8p@pj?EI'z/;=ǖGGp8;䀃&hC#kE2@(~ os_ʁ- xio"}Þb;op~k:23a^icu6x42x% ^氃Kjj7D¯+s؆l5 j`5j -^ldU^Dz^,7oE/nK/FJr <> FŰA[u6Xa V*6 -eOg]KͰ" 9,xX`A9)Qp͡W=zXᐅ,`& :# -|Qt70D=9 - hvXp讱[%vTn^H]9$sH7"y> x8tXX i,q$ApÙ8rAlc8DDGBHn. 4N9ap|.v|3Xm` ag1v0M`a؅M0i[4rPQ!+$$-q`n`IcB_Mbh?E^%W03I=."QGUJA$-g3lv_-M%$8*OJ)z$u[X 1ӎ[d9L&`[5#v[N -$8v'Ii W,޼Z~~~6r#M-MheCID','xѭ3h).tf|CD&QC/43Yޘ%6@ֈ4q ?3V!6 kHE" 9##AM4JG^|ބ^6kRsBmtޱ[dj1Oyo\f^Ɵ/j1%/b!v >T- -ըW͐!T5-W|N4x.܎ێ:>SǐW5jX-1d`Ij3g!1ߡ9fA7Չ+BYGHW50L8 =%dPS64,GDžbzN__|o._?F$Yʓ &QYj؞ө1j碚%"$} B0[^ ,UDS@@%ԆPg=7"\if7ē7Rœ7p=g$.-PԸIivLVᶖԇ֬^]u::NL hsI ^FkjZt}DlN#6$AU+' [c- -6c52Se88/6"6W-Go4 hgH~_8 -@3ECB2{eLߏ3{F.q8N: Wo;%tKEkY_?(Lܪk;xbL~fFo\|bdEx]m{kbV5N5G$):ǜs8-6=dd?<2E8{AS U&2<$#"u:DO82=ʌR=%5u ^x4&dO(3>x -]:oaBdzS:uI,/Zo_i -~tq>O;SnԐ} -HC"#)+z =uϞG)aB:Ɉ`~Xf.|b懱`/??͇_Oױ!C:D.1T@5hF#ꢬȨLQd T&gTLFՠ -|LObIź!Ac2amoJ<ċj:j.}I$ftnJkL2ec-e^qd$q<,M( "#Ji1,=hH=G+ԁgn._e)aG!\qDUJnH$an-ݸ` ](JFPl.)>~fn5חl0vGHp".N'ߟD" *UÑMa5 X )[;ykѢI6MW."N|Cj&?=FG'M kw[)Cé_x~~?pQR -,O#.c-Y-)3uCiC^ɴk9qX-Q3F|yJQLӕox;5`E4SFF᪌Q`]3ۂzjs' ƃG48K4>++!Ox@+o|ȟ8}v큼͟orG5X`l'ɥP -GUq_v[T -A4Ɠx+DAb j1ޔDhR٣t7X#g)MJaqiRh`h%< -GlLBa {Zy1͢F -Zqx5UHe Pu:[xKX\..aϨU7vVZ\ F="! ެful IJ4CK%]H -.rᓪˠRbT] Se - -)߄l,VŊ#g<>*/e rYRj_:I*(A 8ϥV[i=ASh8ˎ=s?F_ Z~{j'09LS`0P{l.;f.h5fqay0b6T6p{9?\+Xt9ܵer ǮօVA)HSdX9V`+O S=Id3 %85I`R!3X҇l#fZ Q[q]t -1كBq0;yDDW5Ypi[wW}|LBe&VE- -Otjf6M: +X(NPU^=Fwc]ED^6&I,c%j=ql09izó-llγ;5SY) I}xY"J1]X٤o=a=;^'7q0}EQ)+FVTQ3&LOCp, -??)~@Ky@"NT1F᷿w8#\HBILl\|Iϛ5Ի)vxT%'ͦ[MZTWߺ{ eYՅё"X:3`nG0{w` kl"ƐXGI't%)и!̵$AP4s N39s 1tؙOeЍ+Crͭnt,&%8e2 YO֒{ H%#YNcf%z{kIf!5kFLg wh<y?FCLG?Uݏ$O -endstream -endobj -1929 0 obj -<< -/Filter /FlateDecode -/Length1 1740 -/Length 877 ->> -stream -xohSWyIދm6q%y/C(VMږ j&Q(j>LTaPKهm2&h(6ES?([MRk8{=@+ZW(g4S`B ->h0| B<?Mj:)|%5hPyj㝁QS Y[U)KMYM[/ GaFfa-m1co]yIʟ5JeV -G9 k&ƧؿMס),XhTm-/Ku -6Y򪢥NEYA:ET>tr{&sМdF <3 v<#+'Y2q7*y>F|KC~/@nnmF^a Z Wbs⩯s:QVWZ%N>/j Vn;j0ONti%j\pWZ˖[&`>,ct!RjJAlč[dBBi\a2D#/Sh7f,olYen~ -Gt$x<-f)Wom`54G8^\EǮb<[фH6i}V ԚhT7k`h ZGM }6.61+IiPH - %TPu3,.8r Wٸa^+O[xu -endstream -endobj -1917 0 obj << -/Type /Encoding -/Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/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/grave/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/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/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 -1877 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [411.81 302.812 428.757 316.756] -/Subtype /Link -/A << /S /GoTo /D (figure.6.4) >> ->> endobj -1908 0 obj << -/D [1906 0 R /XYZ 123.806 732.53 null] ->> endobj -1875 0 obj << -/D [1906 0 R /XYZ 314.421 381.167 null] ->> endobj -582 0 obj << -/D [1906 0 R /XYZ 123.806 327.228 null] ->> endobj -1909 0 obj << -/D [1906 0 R /XYZ 123.806 283.24 null] ->> endobj -1910 0 obj << -/D [1906 0 R /XYZ 123.806 253.37 null] ->> endobj -1911 0 obj << -/D [1906 0 R /XYZ 123.806 208.39 null] ->> endobj -1912 0 obj << -/D [1906 0 R /XYZ 123.806 163.41 null] ->> endobj -1905 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R /F40 1308 0 R >> -/XObject << /Im8 1876 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1937 0 obj << -/Length 866 -/Filter /FlateDecode ->> -stream -xKo8XlS - Ό݀KCq7L2W@#1n3|iͺ-eob~ōNY ":=IDy.yAׇ㠣mq&Ϯ }Wun;mc=yk~ C]i'R)Si6,)BAB)#o˷`jW}Yͱգ_!jIsf)M?}Jy{o,zFI^2B6pgr "hAD)5͐J ֝}dҵ`W eSH͵Q7QyQ]:pJݨuȫbާjِtP@K_VaĞ)到e앟O}I"܃tt zϳ`f[z;Jc5-ª:VIٝd.}OؾIk<"lmFwyDY%ѻCfYL D0\HZ _P#ʖF/PΟAYS}cΟ0,_a3<2ve4?پį@}r{CzkzJ 7.)wXXBy uj1/ƌ~7?n׆|^w?}@Dp\IΜ[a -endstream -endobj -1936 0 obj << -/Type /Page -/Contents 1937 0 R -/Resources 1935 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R -/Annots [ 1904 0 R 1932 0 R ] ->> endobj -1903 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/interactions_fsync.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1945 0 R -/BBox [0 0 436 266] -/Resources << -/ProcSet [ /PDF /Text ] -/ExtGState << -/R7 1946 0 R ->>/Font << /R8 1947 0 R/R10 1948 0 R/R12 1950 0 R /R14 1953 0 R /R16 1954 0 R>> ->> -/Length 1955 0 R -/Filter /FlateDecode ->> -stream -x[ˎE1Wo#A'FA "%ÆF%NGթ*G#-簚dW6YG3__r/WgO_:[+_-~W]=zyBgr7shkw~q ؝);򣧘q8N4ѸmƉ~e<ݹcPމS@_#>y[,v<,|x -)HSPw) )I(84PK9,Skuu޸eFһfwTqn&g$IMyShAߞƂzUrJWɲJh'?O~}ڈ{.?3t.=1?^MvO=t^d3QEBT=*—*zf$bye+=em.nfvN,bڳ_Vu1 Ie ~dOE䴌GTȝNmj>rI*"99+^GTD,v~Sl%ID]JS|݌v[mV _iOn}%,Uw>쩈Uy>쩈Uy>{=FZu՝O!YeI'G:ˢ[GTĪ;GTAyn뷃{mގՅYEuaQ]p{AuhkjwnQ~hmnќsj8%d{byk7ۮ9$uEڲo1=zo1-f8ЌS[[J׹DbWz<3%Qv0̔Hӎfc(IH(Q7i!FJjFJFi$v6HbQ"u̪ɍcVMn۹bo;VAҨe\Zl?ѯzHΗ3hu=2NLyzn%*L; 2ņM7v2H Qy8ptyaS,6EBTR4EAs1#c.9~26* Qsሣz~.8; -R!S*r4ܪ7Vk0bæTeusfJņMY)SktROĥWX@7%-;7 y3fPX0ŴÛCU2pXx3`iG `T`ța, ̀* Q%a಴7Lsox37 faoxUy3@S lU0ŴEfâ[x3;x3#oQZuo89$:̀ѪS 3ѪNy3`ț^uo0Z >f SfP SfP Sf SfF07&śaBy3Lj穽ěaBy3L S&ٛrգfz ?jQ( >=Uڛu@@'&efpKE\08J<_NޙH8G+[^mvHEAS Qﴻ A5GM%zp4 4 -3]Jǝ $=,JTs%a6Umʷ]מ>,_hYV0a7DDc~s΁bPx$+J&S=kAJsY@õ_T~Q?Os)rt &zb7q3X:/9;Ν"Pd E("GXV[M98\PM괱իŊ$jAtR_u)IFG6p$b=kn'8g,°*08DRZoa [ iuV)͊UƏ ys*^o9VLV 0񵰏B?eп k! |}\Fnz&@/ tau#/WC:v_?|&+B|ǜ|~kv8+OJ^_J @Pڟﳓ{^ݥTn_go%& ܊F8=[mYrmH [:vtق JB,DSȊ7}Kb;W$≤BTW^KZȯ."헃r?=LU- GdsxJH+|zR>R/ޑLоa]Z^I{}@p%gNh@RXex'U B6~k/"tK?e.憘˖Z.棿?|iw&mG{4m? ϙ-.?sy)//C}<_ہO3xU^a?p~Ƭ;1' x}sEO{YokҏtD =P -endstream -endobj -1945 0 obj -<< -/Producer (GPL Ghostscript 8.62) -/CreationDate (D:20090422140750+02'00') -/ModDate (D:20090422140750+02'00') -/Creator (\(OpenOffice.org 3.0\)) -/Author (\(stender\)) -/Title (\(Interactions\)) ->> -endobj -1946 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -1947 0 obj -<< -/BaseFont /MUOVVG#2BDejaVuSansMono-BoldFID38HGSet1 -/FontDescriptor 1956 0 R -/Type /Font -/FirstChar 32 -/LastChar 116 -/Widths [ 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 602 0 602 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 602 0 602 0 0 0 0 0 602] -/Encoding 1957 0 R -/Subtype /TrueType ->> -endobj -1948 0 obj -<< -/BaseFont /QYWBHS#2BDejaVuSansMonoFID41HGSet1 -/FontDescriptor 1958 0 R -/Type /Font -/FirstChar 40 -/LastChar 147 -/Widths [ 602 0 0 0 602 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 602 0 0 602 0 0 602 0 602 602 0 0 602 602 602 0 602 602 602 0 0 0 0 0 0 0 0 602 602 602 602 602 602 0 0 602 602 0 602 602 602 602 602 0 602 602 602 602 0 602 602 602 602 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602] -/Encoding 1959 0 R -/Subtype /TrueType ->> -endobj -1950 0 obj -<< -/Type /Font -/FirstChar 41 -/LastChar 41 -/Widths [ 333] -/Subtype /Type1 -/FontDescriptor 1860 0 R -/BaseFont 1869 0 R -/Encoding 1949 0 R ->> -endobj -1953 0 obj -<< -/Type /Font -/FirstChar 46 -/LastChar 46 -/Widths [ 278] -/Subtype /Type1 -/FontDescriptor 1951 0 R -/BaseFont 1960 0 R -/Encoding 1952 0 R ->> -endobj -1954 0 obj -<< -/BaseFont /MEDLMS#2BOpenSymbolFID186HGSet2 -/FontDescriptor 1961 0 R -/Type /Font -/FirstChar 1 -/LastChar 4 -/Widths [ 892 892 892 903] -/Encoding 1962 0 R -/Subtype /TrueType ->> -endobj -1955 0 obj -3220 -endobj -1956 0 obj -<< -/Type /FontDescriptor -/FontName /MUOVVG#2BDejaVuSansMono-BoldFID38HGSet1 -/FontBBox [ 0 -176 602 812] -/Flags 4 -/Ascent 812 -/CapHeight 812 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1963 0 R ->> -endobj -1957 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 49/glyph2 67/glyph3/glyph4 77/glyph5 79/glyph6 82/glyph7/glyph8 101/glyph9 105/glyph10 108/glyph11 110/glyph12 116/glyph13] ->> -endobj -1958 0 obj -<< -/Type /FontDescriptor -/FontName /QYWBHS#2BDejaVuSansMonoFID41HGSet1 -/FontBBox [ 0 -208 602 765] -/Flags 4 -/Ascent 765 -/CapHeight 765 -/Descent -208 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1964 0 R ->> -endobj -1959 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 40/glyph1 44/glyph2 46/glyph3 67/glyph4/glyph5 70/glyph6 73/glyph7 76/glyph8 78/glyph9/glyph10 82/glyph11/glyph12/glyph13 86/glyph14/glyph15/glyph16 97/glyph17/glyph18/glyph19/glyph20/glyph21/glyph22 105/glyph23/glyph24 108/glyph25/glyph26/glyph27/glyph28/glyph29 114/glyph30/glyph31/glyph32/glyph33 119/glyph34/glyph35/glyph36/glyph37 132/glyph39 147/glyph38] ->> -endobj -1961 0 obj -<< -/Type /FontDescriptor -/FontName /MEDLMS#2BOpenSymbolFID186HGSet2 -/FontBBox [ 62 0 807 799] -/Flags 4 -/Ascent 799 -/CapHeight 799 -/Descent 0 -/ItalicAngle 0 -/StemV 121 -/MissingWidth 500 -/FontFile2 1965 0 R ->> -endobj -1962 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 1/glyph2/glyph3/glyph4/glyph1] ->> -endobj -1963 0 obj -<< -/Filter /FlateDecode -/Length1 4744 -/Length 3244 ->> -stream -x8ktuw;ǷO$ڕ/ Xd#[J,FE0!H˰$Q qd`1d`'V{⦘C Ǎ]ĵTF+ljij3{|5w^UDSWi}4 [O7>ڷ!= MMJ^Ը!9_ <*BΊ"S6kDpN#9߮Rmlٸ~Bޞ8ܴ#o"/"׼~BE['OУo0|,c"([`~H˚6K-eC9C4NC Ye+Xʗ]plYpKd%u𞸡̅q-IV\釫^jw[uk5#9cOSK}k}?OS>3oW颦OLÀ;PʪVLp]XWAUkg"4V$hq}"@K|#99M2* / -!QĝwAW:C% #h1Ŀ A|-}xC߂xցJU#N?;rũ</I? b OXxZhb|a (zcvv{$~Ww$WEl'9GxYUv*jCAMvv#$>%,غ@JZQFwbDĦZ4Mqs@4bcoقOn0BD¸Mal I ^W1,q :x)I|ԉbM]ԸqxDbuH\(Vʈ+Wn\QnRa -PItC,%|p࢝! ->y6[ns%gψsRĜn,me)XgqvRE`L(ę3bg81X0؃E[U` U6o~%Ӭb +@д1͊[MT NgGJlżJ rM5)y#o&f;EfziJ̠)A4H!7<-&)Ug6L81ݍRtycAAaAjº-Yؘ֢h2ZɋF+ӚΊZPkBmB=PBsG y7b`^;~{M.(;2aDv8I7 -L2h.3ؠp(>\ Em>O[kVʭn9!;vpCСi,̨^,/M$Ry t!ḛB9JPZjh2Q}39&LJSGqE?3|gX[E MНb+`YiU_#NckX[K4LaGXΎE ب_(yb $u`!DaUuj7{ϲ"ö2*qc 1ɴ̟Pg -c}U{`C.䉸$s4B^G0hk$sRX - - ZA6򏃃. -t -*Z0ZUUDd] t%SU)yyÛ7 \cSKYq/d1|N}I*_coEZ3^;@I9{vßlf-]xm=7ƶ*iXrq)rhvkգ۽7yNH.zeil;rF (Hdg8O?.|31gRa~!3'\5pB4f:-7jnMtCg4ܚfi~{h5gy::˩IRl̛Yu懷<&0cwmyZ~ccW.An~Ğ"VO v))<ȳXU]tu 8 ޮ4Хo1G5iNQs);&ɪD07hb -X̜_nI$[]NͳyY<&?aWޭ|nK=^?##Q䩛MU˔ؚsaUW[Q\t~QLVzƚ3t{vB:, e\f!p̶lGOD['`*ݚ)hɪ1'Td`Qxt|ru5].Oh^ |y}?cLώ~p]-Za,:tfg/m{3mn߶c+X;=\&.G5J Zziy"n<]iko*qTaMre׍v )=37H"zA! бbQ -JHgܝV+WnW9x"{놾xsO'y%ޅsR,&`(!7nc3!l+ׄ8F<]ȫn^(o.\&~^)ʙ7.^rm{I-$XGX;43j8#'tppBk¾ܒKv-Y3 t?U` -bHj˖Ҭ21=KIk\4jϗW_@{fћhb -I'FC7R35Tn&b}7=ܒKcxђ\8n;Wm= Ok{J5S񝑌(^;@fRD7kWZ'* -endstream -endobj -1964 0 obj -<< -/Filter /FlateDecode -/Length1 9616 -/Length 6711 ->> -stream -xZ xE3Wf2c!aH 0\DJvYHXE`!ȊucaR=Eww=S:PBH)#@?!-=L5oƂ8i4!}q,xh^{)Cp]:'tMHħ%gwcgx po N2)]]ffƉ׵O,(?~\$̟1ovEؤ,(]xh]_ ʛi$@z 5dw>Ҍ=Fӷ]M*Ca -qlן/"8@Nـ$Gj[pԌrhO瑗Hq9YJV -x#)=Ag3yb_l5'TFb-rZH^, d+]MZBPZ% d&Zs>.Bb=(Mƒr2-=h#U"2dTR%͡K"\OX"z҆4gu'"gu 'gcXym۪P+Y zFt8 rrq4y'f),\,gCRT ) &ۅ9,.r& - oAWu/ )~0L ɸaKn+ٔ,f7xݢs]kԸu "W4''`W4 կif^/ڝ0$augVcw%wTNz}h@(2ܳ NRM2"R p;6o[ Pl82/F3w)h@e/0/ O9t nd -v]pxvW:ٕ)p/v$߾Mcߦr?2vdC{)-bu5W"}hG3i F 7H8_ 'sO8sjN1?n4?:hA8*;Nqx 6v2'8c^v{w9l c-9pAwow5^vF/a5794q[ {fmpx;9v.3{5vᕝ6Jwi_Je/RE;8HVW ʞ_Y*l ak>כrx75Pl#,ֳlem)-~q3_px4&/T2Qڟ;`*q*Pi^`qXaMPn㰚Ӷ\Xš X -S+`En /cp(?Vy 0;< (59s530X8O9LjdPX  p0S]&qIt$IL0xqwXch*at##ld?ȿ0"Fp0 G! Cqbh?/}7C,,h̆X`Hđ?fhrLc{9 F߀AvQ?=8MuFA_3 -2!oӣiKsCoCYRl/ -^bJO/KփCw8$[˼yp<,!1!%TqrX1Ѹ+ё! )A3EaeTpX! ws\ -VXCMbKHw0M`. uBnh2I~ XA !isppL*Eh*+-.HSe^-$ *l 3zL/ܖh&KD\ylϤz&[X$i-v&KĭBF-;i}T˓,dEWlR#/_||q6z#-MlECIxL'xhI ԆB~NQ>k!cU(M{m M'u$Qq311b$폊KD@^kj3L$]EzN.vw[/]'ج$1#M=IjOLcicIGZZգ |Zۣ~>?QzBb#NưX$b1ȐaJ>;2ti5 yyڬɉ[Mjȭ"Etz~jM:ys K[x?ACJPWbv T# -5d[tHU<ZzDc J;fwn;Z~>"= jFbɤftg!QߡfA7W׋B#YL:4I Զ"jFc©`1kZ/>7Lo?F$Yʕ &QY鲍ۊEZ3}]exTNI㢔][!$B0W^$,UL{Hh4>DK$'RCm -כo4֛)≛ߋD3 5qV[j$WʰguBfʧVᶕÿׇk֮][ukW; m4F/<4/e)eL*)M8!s W!WDgQ(2[Al$ jdhKwq&_lDml[h*a>!Eod<%QWzԎ-1Ct:$TVF߬>}gYѺTz?=M!GN^BPع-”KOYˏG.3 f7.>N1ꍏUq"uu⮱ѽ[memNwI(NKr\ɢqG=* dS="HNGD%y4&A*?xԏ_`qBdZSݻ eO}܁(Y -9LAw (펫ą<OARB4CA+NL} ♐|2ʥmeLILbu:URnb?$fP jըh"-2E/&b^bU -HdQ1U*n2I;s3(8fѡQ6h7=x5 5rTa*3BO=Yw%5&d@ei"H -0YĦIdCRbZ -ťF-3j1RϑӯU9Ƙ0M7R`IPe;I2xQ -j¨ $\1QRi'Ĉ!\ÛA2,Jid3Ym[-O?F7FCl,0>!,eKFE(!JI*^caR`-,0<@σtǘ~̇_Egik:ݿ޲_kti,8289A|l1sx8vҾ}ݺ9Z 9PGuWZ ZKSHbw$)jX,ʖsPFŠy_1fi!c˄uk6lXS^U۱ށsg>9+<1ʏLQ{mDI3EG4"정TDkIEvEY;Znc"+d@mMޑσRc7[=7$;%А{5,G>Ȓ5FQfGRkn%InGhzѶn` ](KFP,]]05][|foup7NLR'~ói=w6?'O&@ -F)JaPdexSXm,1VCDc.ZlREIgb~5(L,~=iUU+ܧA{V\' qr,#TThX[l7*Aq.닅iR -BpU!/󯧢y8󪛕ͧ^n :OqdDkh`dm0סMn,m1a)O>a&;関]%vAIl$;M }8*E#qX;F6M6qZ~u`)A:}\ z&DI>٧ >g̉qs"srsbrbsʠL,ceR\2cUD]YU]S[硅z[(ؾttWְqwe~Y9gåy%ªo.s, Fl7uNz3hoV+mM*"w22 00RjSs!Fت@ }_*4tj~;׊Ef]\##gW+,ٿ_ o_~ޜZzym(yTR&L_c?:^Jy.~5d#&d#Ԙ eUԢWnęi^+R-$`}mOm8::f/T޸ր|z⾰w?<-[2鞐HO71 һƹuT$ptWJo?Z2˒#);fz+e-K߃ x >M0|_ ßnŠ9r&4}ek(y{Swz~`¨s;=YSs/&Qu5^aBOL@J n;bw j<\3~-VklO䅓Zf⇫:랜y1ە?Z6i~6NP~11\NMn< k.4WܱkF;∧"D6K ՠbq+]!??!#4Dcf ʓS-j,^WSvp/PsY\X Kŕ2Ru#D]P>hh~c=1-r;`:aN֐.G.QFsI$@@%\x2T;UԮUe -9̄Hy&`KWp_/d]q*sbT%թSI2^`) N4|+ &u~x0BpG!YK0VBYΟ2ic &Ze,XvYak #fCl3Y-aZnWpHV}keK}E]+Db{)2,ٜlo˷ۧZ/ɂl!PO4>+{f:o%uz86 z *D U`0b H󉔧j^^ߑƪ/W`2 -0WY0<ѩ,vVzV+Iu=xxoyo@$T z3X> -=زu&΄wNҧ'6D_nHz3 Pޠv单M3ǭgpg}Wo2]~OyLƓd 9N%L> -stream -x[hQg6xm6^DͭR/x7Z"ڤi*b}F|QA0J4F/ VM!o>TP0Db!; N9=05͵B޴.AOw!׼{#PHQwtyI Eg6]3Ⱦhw:<~bг{4{r'/eCH1Խ@Ew ai-,>sy --*8RYTP$EQ$%QJcBD*a@FI/ -\W[6*rS*(8&  )͠Lf<%CY_C]*'_ɗT;MHo/iG;LI t/I*I8E6nIJae{0 fB J|P8jŵj0~F ]KT4㤏#&>:<;"4!ׯ^AMK$r5?8pڬFCU -b(υ-SqoPyS> endobj -1949 0 obj << -/Type /Encoding -/Differences [32/space/exclam/quotedbl/numbersign/dollar/percent/ampersand/quotesingle/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/grave/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/bullet/Euro/bullet/quotesinglbase/florin/quotedblbase/ellipsis/dagger/daggerdbl/circumflex/perthousand/Scaron/guilsinglleft/OE/bullet/Zcaron/bullet/bullet/quoteleft/quoteright/quotedblleft/quotedblright/bullet/endash/emdash/tilde/trademark/scaron/guilsinglright/oe/bullet/zcaron/Ydieresis/space/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 -1904 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [409.399 417.909 426.345 431.854] -/Subtype /Link -/A << /S /GoTo /D (figure.6.5) >> ->> endobj -1932 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [384.367 241.597 401.313 255.541] -/Subtype /Link -/A << /S /GoTo /D (figure.6.6) >> ->> endobj -1938 0 obj << -/D [1936 0 R /XYZ 81.963 732.53 null] ->> endobj -1930 0 obj << -/D [1936 0 R /XYZ 187.077 489.959 null] ->> endobj -586 0 obj << -/D [1936 0 R /XYZ 81.963 441.344 null] ->> endobj -1939 0 obj << -/D [1936 0 R /XYZ 81.963 406.893 null] ->> endobj -1940 0 obj << -/D [1936 0 R /XYZ 81.963 371.301 null] ->> endobj -1941 0 obj << -/D [1936 0 R /XYZ 81.963 344.843 null] ->> endobj -590 0 obj << -/D [1936 0 R /XYZ 81.963 265.031 null] ->> endobj -1942 0 obj << -/D [1936 0 R /XYZ 81.963 230.58 null] ->> endobj -1943 0 obj << -/D [1936 0 R /XYZ 81.963 194.988 null] ->> endobj -1944 0 obj << -/D [1936 0 R /XYZ 81.963 168.53 null] ->> endobj -1935 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R /F40 1308 0 R >> -/XObject << /Im9 1903 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1970 0 obj << -/Length 1110 -/Filter /FlateDecode ->> -stream -xڝVKs6WVjB @07׎Sg+u茛-iT\bALOw~xÅZ&DIa\fM,VmzŧL<5S,72v=|1?J^ -lq9X||ZL'2R1I2DLnd/ gK0$Z3*|p\l.mrV]>O8p e=ˍyGl@ @UiYnȁiQa:b0q:˔NZW~ KR.?Цn\d9P4zGCBޢCf-:8wQA@1 Aj*ufR2uΓ! js^ui -!~U6m0; 얭:}Mgj0h9GPן'm07,?` PdLʙVi vp<]ЌMw5S([::fGHδ(w5k/ڿP_d0XC:+,:[| .RBX'ڌB8yD{k V@|(YǷ/zk-)-űހ 1ޠ{3K4*ko.a~]`S74[yʟ[H"U1aAXӏEMPL 邈҅˺5~f9TnCLh ZKy`V3 -endstream -endobj -1969 0 obj << -/Type /Page -/Contents 1970 0 R -/Resources 1968 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1842 0 R -/Annots [ 1934 0 R ] ->> endobj -1931 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/interactions_mkvol.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1975 0 R -/BBox [0 0 388 181] -/Resources << -/ProcSet [ /PDF /Text ] -/ExtGState << -/R7 1976 0 R ->>/Font << /R8 1977 0 R/R10 1978 0 R/R12 1980 0 R /R14 1981 0 R>> ->> -/Length 1982 0 R -/Filter /FlateDecode ->> -stream -xˎ%GSiDy,  ,0 /LdƟy-dEȨԷgsسiӯw'scr!Ň'=kΏ뇓s;&ӟґthw6M26UZ36ײKkG[CUZ6TEJYb -FƙRRsHɏ99d{ t,c={|SLS5>ujZ嵒ު JXEC9fY -W ՙb="~2K1=DW =# -m!`+1\yزL_֋o;RM8B9}RǚO㼏 *XTFPߏakί : #'}a>cy:WЛ-]YI\v [.;wnC[rhU>[RmfC¬Ne*K-2'2wO^q$T}QawvҪ.sRqNmVsӣ>Z[NѨx\yJnj;T#NNq:ӗTӗTGo%/U(i=֒UIj:E(b(F0*"G[h+tSB2sB 521TZU:;/+̇tX@l2 -ɀǡȠQC fõ40 *VA fµ4 J % b5 %=-h`YP@,(,0G; -h%`z`@4 -J -8%0ŚQ -R([2eTu&'6:T*Xb L]j`bKKlYJlI,,e 3e4AШK Fl,b D,ZC, u_*b`KbL ?la =,tDE=q?:|Ĝ.KiaCXN `Æ54` -4s0DW upVax5tF g[6<39S-p/OAES<1$|RH OF!k q%2(bU >QtG!uQQ¤E.^t.!.c.t". -F,H,h-e2N+=g_ki7{"#21ri8uQ74RuQie}y :ּ//ˋ?v.v>K<0y'77TIWʓ7bxC̤xJ`%.k!\ Anuk!\ ACPCЀ!VCPCA 0sCPC A ACPCp-0  -˽%S& u]ghbKU̲A`*h 0ԥ!6 T0?U0)h0BY -0SF0! - 0ҫ0RP70 !6 9! -!0! - 0RP7LbYTX0ė{Lr䝆!6%4 a ClXG04i=g CHdY~CXCjU`'`h삼V:pX>@t?ՋrW$ˑBC [)&+v>qWM|=/Gal0~y˿t}ߍzp4zLoiiiN&_>~|yss[DJk -P־zA?~|b܌0zY9&YA2>x.T@U,9דtWҏlqD7gteVeJu(uYkڧ{Gi>]=9ڟcK;~Q|niR|K`-}-o_^?m>C]Nw7%Īؗ՜!$ryusZn9==Z)WBX2X!qNo`?f)qx ].G&Dx7߭7|Ob0߈iۼ'ks -?3]m^aׁBގBg5ѷcܖ7-A/ --/} -endstream -endobj -1975 0 obj -<< -/Producer (GPL Ghostscript 8.62) -/CreationDate (D:20090422141511+02'00') -/ModDate (D:20090422141511+02'00') -/Creator (\(OpenOffice.org 3.0\)) -/Author (\(stender\)) -/Title (\(Interactions\)) ->> -endobj -1976 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -1977 0 obj -<< -/BaseFont /AYRWLX#2BDejaVuSansMono-BoldFID38HGSet1 -/FontDescriptor 1983 0 R -/Type /Font -/FirstChar 67 -/LastChar 116 -/Widths [ 602 602 0 0 0 0 602 0 0 0 602 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 602 0 602 0 0 0 0 0 602] -/Encoding 1984 0 R -/Subtype /TrueType ->> -endobj -1978 0 obj -<< -/BaseFont /KZKAZA#2BDejaVuSansMonoFID41HGSet1 -/FontDescriptor 1985 0 R -/Type /Font -/FirstChar 40 -/LastChar 147 -/Widths [ 602 0 0 0 602 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 0 0 0 602 602 602 602 602 0 0 602 0 602 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602] -/Encoding 1986 0 R -/Subtype /TrueType ->> -endobj -1980 0 obj -<< -/Type /Font -/FirstChar 40 -/LastChar 118 -/Widths [ 333 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 556 0 556 0 222 0 0 0 0 0 0 0 0 333 500 278 0 500] -/Subtype /Type1 -/FontDescriptor 1860 0 R -/BaseFont 1869 0 R -/Encoding 1979 0 R ->> -endobj -1981 0 obj -<< -/BaseFont /ACHYIG#2BOpenSymbolFID186HGSet2 -/FontDescriptor 1987 0 R -/Type /Font -/FirstChar 1 -/LastChar 3 -/Widths [ 892 892 892] -/Encoding 1988 0 R -/Subtype /TrueType ->> -endobj -1982 0 obj -2488 -endobj -1983 0 obj -<< -/Type /FontDescriptor -/FontName /AYRWLX#2BDejaVuSansMono-BoldFID38HGSet1 -/FontBBox [ 41 -176 602 812] -/Flags 4 -/Ascent 812 -/CapHeight 812 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1989 0 R ->> -endobj -1984 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 67/glyph1/glyph2 73/glyph3 77/glyph4 82/glyph5 101/glyph6 105/glyph7 108/glyph8 110/glyph9 116/glyph10] ->> -endobj -1985 0 obj -<< -/Type /FontDescriptor -/FontName /KZKAZA#2BDejaVuSansMonoFID41HGSet1 -/FontBBox [ 18 -176 602 765] -/Flags 4 -/Ascent 765 -/CapHeight 765 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 1990 0 R ->> -endobj -1986 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 40/glyph1 44/glyph2 46/glyph3 65/glyph4 82/glyph5 86/glyph6 97/glyph7 101/glyph8 107/glyph9/glyph10/glyph11/glyph12/glyph13 114/glyph14 116/glyph15/glyph16/glyph17 132/glyph19 147/glyph18] ->> -endobj -1987 0 obj -<< -/Type /FontDescriptor -/FontName /ACHYIG#2BOpenSymbolFID186HGSet2 -/FontBBox [ 62 0 807 799] -/Flags 4 -/Ascent 799 -/CapHeight 799 -/Descent 0 -/ItalicAngle 0 -/StemV 121 -/MissingWidth 500 -/FontFile2 1991 0 R ->> -endobj -1988 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 1/glyph1/glyph2/glyph3] ->> -endobj -1989 0 obj -<< -/Filter /FlateDecode -/Length1 4292 -/Length 2926 ->> -stream -xkpܻǷO6 lv` ! "/($b$(\:)6J@S‏tFR -cu:N thK Z[gsߞs={VhE--@ -Iꖯm\Oֹ wi4-Pj# [ wkW: @O)DȖMz[غ9=_]Fyyn o\94@ޡ8:Ao?ѹDl" e` alhd,=`\Ug46hkp-O]p /M%\Vc*t-&,Jכ4]g&Vk2,!m;tA\7ޅ8 ]_7ad]έe0˙J W3S(oTJ+n(5$R&y;4UN|܆)ǎ% Ndq Ho++a%i -N3pEߥ"6qVGNp$gn%"5 aͯUUkRH|Xb?ET" xm(/AOQ|vysQG{Fsggaw#s=~7H oK3V"j)&fEq3^pLZ_$DEn DRNOf*2(SE]N|_ U:I~SF[F"f^A0 ̢7>"G=e)̨(,L^oU>򈷫r%UG vc+ӕJrFtIdcEXʊTX;ۋ ml7bӆpx] j6-[ &*U>uj+łC-g5β5Iq}hO (>^}]dU c.:d4Yq"M-f 9fIftf{vk_@Y6,客[26 V0?ł76o<ӾPqR1yR^*b6}?g'Y㎡\y8롡߱-Ή|tbnl|((OڨsC,,{xVG=lAA_qne͛&}#I3~tCFGW,WWlWwAq4ÈfwB5OvD Lk)19: U//Yx߃Cx.彡|>9׼P]nZn3-$$6:`fU6<]dd#*ɛV9ǶK~6@=?a yŦV)T+b7r*5ڭJM D_pؙ柛I ^d.~|wOtqD%u f*j]+KW7\8!6w~ĩ[ZZ 7?C-=> -stream -x8 tTE}^wyӝt~6 I`4T lP X0|d5""Dc0¢ GEEuqb v%*:잳l~UuoUU a]R`O^q ~sKs1pqPGw[M![=82YY;In5B02pXD|TAjIjβP"S;bf_6hb$ÂyEk^[WT\W*J|+rkWR*:^JxQ Wc " /sj <ƏC ϋL@<){6~B{6<.O-xc+h5YGw 6&Do ٱ(ͽ|L{qoPnTc}`:jkDk?B|ՁNWD YN/;q;KM"p<k -g5\ >?pg37{:⿮nz.׮6(WWQ5"mr0$De! r |RV| -A`l\"\"XcpQ'R>*a \0Dzv_yAA+d^Rs9;/8+E)pBӧuNOSGIa| od&pRRD7N8AxZ±ǰ>FGpĝN>ƒÇxpVC ڀC0tFiTz5n^<Ņ)^ZN{̞>! =vM`Ees-DD.Sx"LLΣq$0A`<6^`y%.c& -C1ʝ£Ҹ;]FҼH:iSN٨MGv;v9maGGv6 'VOh#MlQhPiE w!rx.. @F Y=+XɒX۲HTE|+e*tkދ -s1 /dHm:ْɖ-H=I%IE2a\KQ:]zPal 'eڝ&x:D!ТgfP)v28ႊuk׮Sg~v55tm ج@1:A0ݍHv%thtzL,ae:GJ~H?6KL R5 X8ff>y'eI`}p0\|\VU|V,2 mmـ:VOZբ*fre婶0hR8uP3OYΫ?nYu٥RrAeU S!hbYʖI|gҙ+5_9>ǹMW' -QjSE'}"!fphS|(#2f+2Qvօ?&s=ʪ uw-& i.['?5љzY*R@83]/Cy:H/fLIRѧW6v#S:# -So'ZJzUM-͟Ak%($]֓. -`> ] -Y_ll7p)U@K&1-wC^aKJ=Ũb}ƘqKDEwbRoy={}{-]3e +5QJ`'1mɶ{p a¾}u?>=k.%]sIW7ʐ`WvuUǔpVLedc5k#3DlkYCIg $}"jrn}/upN|/^^dNM2Iy''L,(>=M-& Xp5ZQ5%KjAG+CȶP36B=)J -}w5:'miQm9^,(= k*͔Hq-=dYtu-&%.%㌰*$)^qb4e>&blgL:>qT>qr^hP4:l 0qf~?,+*+:˓թ 2^e2k,**SS[W_P1̫qBD6]f|d{qgIӳF ÇWebiŹF+ j|M$[đ-"Wcu5W7ؘp6E'{q.F -9nO>嗤Rݺ^ `{3[FnyD7T:n)VgD:wxM־ ~@iS$oIלRQU+WZyo]?zԩ?$SL`)3ν{q6YN|ua:s4Z6ES; ɣADHdzN-ql6Nw3sdh|#v{_yC}qam;!zxqڿI 8%@g,u6KEs:\AMAModDa$w~KLYLؙc;D3KϊUm5fal'O7pסvK:|.N|/߳'vng g~y3:ra3=輠"Ihx),Rl jEpy QI:](:TP-%$3:[V aCx"m_ LMP6v(Wy3"ӑ5n -5m&2 1xY1}BAVܢ@=cAudn L)ONf3kС `ӑ! -a., l"{J\}I܏!9G~LC'P?F. 'ҫ]IS7A^ٳ[VDJKPdfֲ57nPݨ ٌ~FKw?o܄R&v74ߌ}ocFdj@ @ΌS^0aycJ 'm 3槙V`~V"\q êq(b;:Q PJM a z~ffWZ7t: Ѵ+'Wqn? -endstream -endobj -1991 0 obj -<< -/Filter /FlateDecode -/Length1 1372 -/Length 653 ->> -stream -xc`d``fh``f07b@",97g```tH.+QH)JϩLpY42RS4_E=d``U -eX%#j 5_Hp&V82xB^bn*T=HFA~q $3 #*`0Ԁ*nhdKXPQPUQPo=?YAkJYO320(10 0(* -)*yb -f Qv6FAeSU5s=]/?l((aÿy{i SdF^s.\Az=߲mFFFyƔ-[1{ Bs!7?#(aw1*OWِT\#Wq2Awg9W- \o]U,5# (%n1c#UMWazMYOs w#Ԍ> endobj -1933 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/interactions_rmvol.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1992 0 R -/BBox [0 0 385 181] -/Resources << -/ProcSet [ /PDF /Text ] -/ExtGState << -/R7 1993 0 R ->>/Font << /R8 1994 0 R/R10 1995 0 R/R12 1997 0 R /R14 1998 0 R>> ->> -/Length 1999 0 R -/Filter /FlateDecode ->> -stream -xˎ%5S9#U⻝KF#X]UObT5-0a;p%K8?͟]}xE=\m$<B[8–Ώv٥ucf+æ[}anj4v ϧ/{^1Kϫ>z<=%o6:]=px'yOq7eFausW׏_JfN4)Q1Q xcZF\uh/=*)0~᧸NQMk:/V͜[c PSk49gcSѾ+}yU -Ys &*Ǭpx/*BqS5i2F}G)s؟}WwG|][9j94KEwȻN ktȽA$Gr> <}켼q6/Glq^FFιzz< v}E+;}vi۫/[:S̒`3@f eb,F)؀)(STRTAa ,D̀ 6 J\-(Zb+lAa܂ Kl/(Վ vX)&BabP`Ơ0H&2e"0)pZ8cILEMi"ԳƒD`nl"%X&R5cXx &BXvN q" 'PNs"X@'NX';Ie w,)މP(` Ope z,cZ阋D׳ D?|oPO?J>䲅@U` FA!(( ʑ;Թ1Ŕ"FpZbN r%̏zɁGh HCRIY}XX%0w^UӶ־>Jr&Z}ֲs ty]o,S}ȩDlN cɾєu]J}P A[ԂhJ~P AA1E74f(U;E@h`@(aS@Q,B[Ԃ 4 XR~ l[$MJ]ץT`!pz lh&c-BB >n3^٪hl1-&"U -KBEE| 6aEQX4¼Z-^' 2VҼfQJ#o9kHž^Y2X.oYjiE˯C^(odYzZO 1PfZOؿV|4J -endstream -endobj -1992 0 obj -<< -/Producer (GPL Ghostscript 8.62) -/CreationDate (D:20090422141509+02'00') -/ModDate (D:20090422141509+02'00') -/Creator (\(OpenOffice.org 3.0\)) -/Author (\(stender\)) -/Title (\(Interactions\)) ->> -endobj -1993 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -1994 0 obj -<< -/BaseFont /AYRWLX#2BDejaVuSansMono-BoldFID38HGSet1 -/FontDescriptor 2000 0 R -/Type /Font -/FirstChar 67 -/LastChar 116 -/Widths [ 602 602 0 0 0 0 602 0 0 0 602 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 602 0 602 0 0 0 0 0 602] -/Encoding 2001 0 R -/Subtype /TrueType ->> -endobj -1995 0 obj -<< -/BaseFont /WMTTAF#2BDejaVuSansMonoFID41HGSet1 -/FontDescriptor 2002 0 R -/Type /Font -/FirstChar 40 -/LastChar 147 -/Widths [ 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 602 602 0 602 0 0 602 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602] -/Encoding 2003 0 R -/Subtype /TrueType ->> -endobj -1997 0 obj -<< -/Type /Font -/FirstChar 40 -/LastChar 118 -/Widths [ 333 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 0 0 0 0 0 0 0 0 0 0 0 0 0 667 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 556 0 556 0 222 0 0 0 0 0 0 0 0 333 500 278 0 500] -/Subtype /Type1 -/FontDescriptor 1860 0 R -/BaseFont 1869 0 R -/Encoding 1996 0 R ->> -endobj -1998 0 obj -<< -/BaseFont /ACHYIG#2BOpenSymbolFID186HGSet2 -/FontDescriptor 2004 0 R -/Type /Font -/FirstChar 1 -/LastChar 3 -/Widths [ 892 892 892] -/Encoding 2005 0 R -/Subtype /TrueType ->> -endobj -1999 0 obj -2447 -endobj -2000 0 obj -<< -/Type /FontDescriptor -/FontName /AYRWLX#2BDejaVuSansMono-BoldFID38HGSet1 -/FontBBox [ 41 -176 602 812] -/Flags 4 -/Ascent 812 -/CapHeight 812 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 2006 0 R ->> -endobj -2001 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 67/glyph1/glyph2 73/glyph3 77/glyph4 82/glyph5 101/glyph6 105/glyph7 108/glyph8 110/glyph9 116/glyph10] ->> -endobj -2002 0 obj -<< -/Type /FontDescriptor -/FontName /WMTTAF#2BDejaVuSansMonoFID41HGSet1 -/FontBBox [ 18 -176 583 765] -/Flags 4 -/Ascent 765 -/CapHeight 765 -/Descent -176 -/ItalicAngle 0 -/StemV 87 -/MissingWidth 602 -/FontFile2 2007 0 R ->> -endobj -2003 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 40/glyph1 65/glyph2 101/glyph3 108/glyph4/glyph5 111/glyph6 114/glyph7 117/glyph8/glyph9 132/glyph11 147/glyph10] ->> -endobj -2004 0 obj -<< -/Type /FontDescriptor -/FontName /ACHYIG#2BOpenSymbolFID186HGSet2 -/FontBBox [ 62 0 807 799] -/Flags 4 -/Ascent 799 -/CapHeight 799 -/Descent 0 -/ItalicAngle 0 -/StemV 121 -/MissingWidth 500 -/FontFile2 2008 0 R ->> -endobj -2005 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 1/glyph1/glyph2/glyph3] ->> -endobj -2006 0 obj -<< -/Filter /FlateDecode -/Length1 4292 -/Length 2926 ->> -stream -xkpܻǷO6 lv` ! "/($b$(\:)6J@S‏tFR -cu:N thK Z[gsߞs={VhE--@ -Iꖯm\Oֹ wi4-Pj# [ wkW: @O)DȖMz[غ9=_]Fyyn o\94@ޡ8:Ao?ѹDl" e` alhd,=`\Ug46hkp-O]p /M%\Vc*t-&,Jכ4]g&Vk2,!m;tA\7ޅ8 ]_7ad]έe0˙J W3S(oTJ+n(5$R&y;4UN|܆)ǎ% Ndq Ho++a%i -N3pEߥ"6qVGNp$gn%"5 aͯUUkRH|Xb?ET" xm(/AOQ|vysQG{Fsggaw#s=~7H oK3V"j)&fEq3^pLZ_$DEn DRNOf*2(SE]N|_ U:I~SF[F"f^A0 ̢7>"G=e)̨(,L^oU>򈷫r%UG vc+ӕJrFtIdcEXʊTX;ۋ ml7bӆpx] j6-[ &*U>uj+łC-g5β5Iq}hO (>^}]dU c.:d4Yq"M-f 9fIftf{vk_@Y6,客[26 V0?ł76o<ӾPqR1yR^*b6}?g'Y㎡\y8롡߱-Ή|tbnl|((OڨsC,,{xVG=lAA_qne͛&}#I3~tCFGW,WWlWwAq4ÈfwB5OvD Lk)19: U//Yx߃Cx.彡|>9׼P]nZn3-$$6:`fU6<]dd#*ɛV9ǶK~6@=?a yŦV)T+b7r*5ڭJM D_pؙ柛I ^d.~|wOtqD%u f*j]+KW7\8!6w~ĩ[ZZ 7?C-=> -stream -xW tTEWӝNN?!M4MHdqLO -LD@0b1; D!EWIDQ',Ï/{f잳l~սUuﭯnߪ"ADQTMw&lfrϔI3:xkج(G||pڌ*h4,xsuL 2BeS'v[O~e,謦;󷔕z/<>)+ -FrGi'OsLz̨9nN1}ܿȑLMnKD{]5Q;:'\8 sm'-YZG :|Mлtk_\Xqqֶ+^؉"YZkd4Ov7k~_?Y~^Tg5yZ{?<6D+]dM۵io?k[ED L{Zֺg@4d\ƃ,MYq{M1tWx98EuCQOu41W/9z@Xd||:{`Ϙhv#𜧱u0}\fܗjJ ׇ"[*;i#22D+R.xh?r1YnmX^d4+P@FC^ !|t.K2e?*G6pmbB[áSz*ſ+|UZd|p!|y3N|(O\g8^?(|ɱX±Xʏ>Z)?2:- -G>p# -pX-.+{=Ux -(P> -{~a;n;Q,nQ!9 -T7XnUŸ-ڬϥT7=h7 -oF_{Az6{5K,6SZX?*~9Q.˿2ˉpA%6ª(\KTX zԿ,^z/V˖b, /(R6cIu F`<ϳ}އőeAm)1hXhas -*<3ߒ(̷w -5 -O[qxJq{JSx -UBTYn9;ܘ[̐# -3*^MNnxXl<@6.fLSP0er'9Ea2rr'LR(Q}F<(.Df&po$8|= -?MN?xq -w+ -cah)G+ٌQ0rD#x /L17Cڌ?[rCPȩ4bnp#Gcp\(-CD5syns#IB - _ 0@!-mm__OS; -}I('G!;f+I&!kY 匓3Ff٤4-3==dܳ{j -*dD#/%~.ѲBzZLBZ&:B'I!U!MQHUINDBBB_zs;ؠavP@/yA .knrsYW{[PZ55W/_l=~b_ 7E# ]Z@~3W"|h+X.S:#}q,WI[<;5d{77qaӎulr]JrQ4H_֝#@(bt#H_+ke,޼ =<ʅKo\!0WЋK)Tʠ8>I,r.66J66fgTh)3Π)^sxym!7ԃ2h3 -F%%%%uF^-jGuDUYW_PXT\RZ/"';.Q> gu]%'nvy`;p}֥Oɻs* /<_=uzfWiO%%cap"1jT]F{Gkn -6lt>]hj,]dS.~sE?acmP uDd򵬓>kPv-:"A{v:8\A^e_[6V[a &´(MYA -3h($!k,cͱXQw:z_ظe۶^j -뇹t؜y]n8e(zOѵJr#5l(lϷ2rJʱ:/Mxzm_dz^reZ+'W/KȠ['Bؖ!9 k=Ґ9> -쀝9Nf_K)/SEWN2!".g8=b.i}<6~c@-MrB/8: -Gt͖['yP@ VMV}ՁqxR=}Ȧm:veى5_Ewv]p )}J66#ļC6 #AwvnѮhOh{Hv븭xw įA7]~|h71] -F#oyNTO W27&W r37p:G QNJ9lAD`,HT0I7i+({qSgQKlnDȞWo\CU?Leb)*y+ r68ϏKX_fo"zatߦ'k^!š -endstream -endobj -2008 0 obj -<< -/Filter /FlateDecode -/Length1 1372 -/Length 653 ->> -stream -xc`d``fh``f07b@",97g```tH.+QH)JϩLpY42RS4_E=d``U -eX%#j 5_Hp&V82xB^bn*T=HFA~q $3 #*`0Ԁ*nhdKXPQPUQPo=?YAkJYO320(10 0(* -)*yb -f Qv6FAeSU5s=]/?l((aÿy{i SdF^s.\Az=߲mFFFyƔ-[1{ Bs!7?#(aw1*OWِT\#Wq2Awg9W- \o]U,5# (%n1c#UMWazMYOs w#Ԍ> endobj -1934 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [488.596 297.877 505.543 311.822] -/Subtype /Link -/A << /S /GoTo /D (figure.6.7) >> ->> endobj -1971 0 obj << -/D [1969 0 R /XYZ 123.806 732.53 null] ->> endobj -1966 0 obj << -/D [1969 0 R /XYZ 289.062 557.965 null] ->> endobj -1967 0 obj << -/D [1969 0 R /XYZ 276.921 373.303 null] ->> endobj -594 0 obj << -/D [1969 0 R /XYZ 123.806 320.642 null] ->> endobj -1972 0 obj << -/D [1969 0 R /XYZ 123.806 282.195 null] ->> endobj -1973 0 obj << -/D [1969 0 R /XYZ 123.806 200.062 null] ->> endobj -1974 0 obj << -/D [1969 0 R /XYZ 123.806 155.291 null] ->> endobj -1968 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F23 1274 0 R /F40 1308 0 R >> -/XObject << /Im10 1931 0 R /Im11 1933 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2013 0 obj << -/Length 576 -/Filter /FlateDecode ->> -stream -xuSMs0W(B_(L In$ ӎ^>>ݥh(|ɃьS☣|R0HHHoO0< #prr#6<*| -8u[S WVTȲֿ(oiuuKF S> endobj -2010 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/interactions_rmrepl.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 2017 0 R -/BBox [0 0 473 291] -/Resources << -/ProcSet [ /PDF /Text ] -/ExtGState << -/R7 2018 0 R ->>/Font << /R8 2019 0 R/R10 2020 0 R/R12 2022 0 R /R14 2023 0 R>> ->> -/Length 2024 0 R -/Filter /FlateDecode ->> -stream -x͒%7U?E!<T[lL@@8<3 p  xaTʓG=Yh{1uR*U֑mp?ٳz7BfK%^Rnۥ~yrɧ> {8oyԒúQl\JCޔ*yQ܃BaGiyxze娻dЫ٭Vq/u -Ꮛ{~Z}L,?91nq=Σy9&P &1/gX~K?t%Ϸ/o~'B93ŋwobq?uJcg$3f{)v=v{~IuCٶ~kۚ{ed;((N=򱻻qQc>rgc[ƙmO.L#w( is=Bsc٣/bnȝ둓˶K&#~qδc6=w=(ȝ鱸.4p庰{߆t,wn3=q+ģ.΍]{d$Ѷ5'?Ό$>5?΄D>i~LRi6ˮ/l}6=x:z/O?Έ$ҏ3"n/N0}#2jo%T)m+kWYkWYwJZVЩXYp55j]e=|v-uیN{k7565jKV :hU9:ʺl<i|rx#ʺ+WYOLI*k0 :6EFfۤR`RP(((h0QDA@BAAA@A?RE=YC9A9(oZ z.ih0&W2%\lu!K+9)AcIP)dI -9)t6m$H+GP)A9Iyw -Y -9)haD8n="ʮ:Ő!8eR!b#CY e@P[xs(?PպlhI}Y fE2:[-y[ȡ!<`M-2glG!;#ЦU,ՑHCt$@#T#0Yf=9HCq$(Kp$@~3d7" HCm$@f3%6 ihjD&iF׵F3"d3" eD*#Kd$=di|ňn3[ -#d?u'oRq޳EW$;&K]0,q锷Oڂ$+kc)G2kP,)!-vR0RdtV]VSn>56CٟSSHȲ챈Z>Zpȱ+S©yf -#N : hQ:Yu%e*)P -֩YRv5S.z߯ȲP} *h\=}kD -of܉o\c[T>?}x0lt9`g *qyJ'j[KR ʁwdA8MHtaBTb.H WS:D:O -È4*_=$E0fmgyH4`H4:I4}&=ҀGJ&!i H*I4`XH4`xHLICJ0\IC$KHɓ.!`eL"e@rI5!4i oE˜4r'$y@]v}' % X1)?--Qы-J8K(b4'B5T-Yk"EM]RwI HfX}( h,jCPʻe5jj3Ӎx&/nR^Nړt<x\-lM@>蘲Hz0]D 3tZF0" 6b{D#yD6sxD#DY#! itD#!-͑YHCr$@#2M3%8h7 7&iLf# xXZ#!Kj3Fduh $; ;2"1Y"gi L,}$Y9 L92!AxG?ͅTRߨ%{ZCդ_#]JƖyO%87H_=G>k8Ҟ774oṯգ>0ÃtVpx.(wLiYs(A~C3b:s?ʱaǖ Tc~䡯s^͟dLHuʀ?E~S>/mk(Lj}/ǹwR(oN:+'+'w;'{znErk@?^q$۟K#:g|?6 +YS:f2Nf;aG>-?:;==}4v±Ż7*#> -endstream -endobj -2017 0 obj -<< -/Producer (GPL Ghostscript 8.62) -/CreationDate (D:20090422140808+02'00') -/ModDate (D:20090422140808+02'00') -/Creator (\(OpenOffice.org 3.0\)) -/Author (\(stender\)) -/Title (\(Interactions\)) ->> -endobj -2018 0 obj -<< -/Type /ExtGState -/OPM 1 ->> -endobj -2019 0 obj -<< -/BaseFont /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontDescriptor 2025 0 R -/Type /Font -/FirstChar 32 -/LastChar 116 -/Widths [ 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 0 0 0 0 0 0 0 602 0 602 0 0 602 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 602 0 0 602 0 602 0 0 0 0 0 602] -/Encoding 2026 0 R -/Subtype /TrueType ->> -endobj -2020 0 obj -<< -/BaseFont /IBWDUO#2BDejaVuSansMonoFID41HGSet1 -/FontDescriptor 2027 0 R -/Type /Font -/FirstChar 32 -/LastChar 147 -/Widths [ 602 0 0 0 0 0 0 0 602 0 0 0 602 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602 602 0 602 0 0 602 0 0 0 0 0 602 0 0 602 602 0 602 0 0 602 0 0 0 0 0 0 0 0 602 0 602 602 602 602 0 602 602 0 602 602 602 602 602 602 0 602 602 602 602 602 0 602 0 0 0 0 0 0 0 0 0 0 0 602 0 0 0 0 0 0 0 0 0 0 0 0 0 0 602] -/Encoding 2028 0 R -/Subtype /TrueType ->> -endobj -2022 0 obj -<< -/Type /Font -/FirstChar 41 -/LastChar 41 -/Widths [ 333] -/Subtype /Type1 -/FontDescriptor 1860 0 R -/BaseFont 1869 0 R -/Encoding 2021 0 R ->> -endobj -2023 0 obj -<< -/BaseFont /MEDLMS#2BOpenSymbolFID186HGSet2 -/FontDescriptor 2029 0 R -/Type /Font -/FirstChar 1 -/LastChar 4 -/Widths [ 892 892 892 903] -/Encoding 2030 0 R -/Subtype /TrueType ->> -endobj -2024 0 obj -4153 -endobj -2025 0 obj -<< -/Type /FontDescriptor -/FontName /GRTNVK#2BDejaVuSansMono-BoldFID38HGSet1 -/FontBBox [ 0 -176 602 812] -/Flags 4 -/Ascent 812 -/CapHeight 812 -/Descent -176 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 2031 0 R ->> -endobj -2026 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 49/glyph2/glyph3 67/glyph4/glyph5 77/glyph6 79/glyph7 82/glyph8/glyph9 101/glyph10 105/glyph11 108/glyph12 110/glyph13 116/glyph14] ->> -endobj -2027 0 obj -<< -/Type /FontDescriptor -/FontName /IBWDUO#2BDejaVuSansMonoFID41HGSet1 -/FontBBox [ 0 -208 602 765] -/Flags 4 -/Ascent 765 -/CapHeight 765 -/Descent -208 -/ItalicAngle 0 -/StemV 90 -/MissingWidth 602 -/FontFile2 2032 0 R ->> -endobj -2028 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 32/glyph1 40/glyph2 44/glyph3 46/glyph4 67/glyph5/glyph6 70/glyph7 73/glyph8 79/glyph9 82/glyph10/glyph11 85/glyph12 88/glyph13 97/glyph14 99/glyph15/glyph16/glyph17/glyph18 104/glyph19/glyph20 107/glyph21/glyph22/glyph23/glyph24/glyph25/glyph26 114/glyph27/glyph28/glyph29/glyph30/glyph31 120/glyph32 132/glyph34 147/glyph33] ->> -endobj -2029 0 obj -<< -/Type /FontDescriptor -/FontName /MEDLMS#2BOpenSymbolFID186HGSet2 -/FontBBox [ 62 0 807 799] -/Flags 4 -/Ascent 799 -/CapHeight 799 -/Descent 0 -/ItalicAngle 0 -/StemV 121 -/MissingWidth 500 -/FontFile2 2033 0 R ->> -endobj -2030 0 obj -<< -/Type /Encoding -/BaseEncoding /WinAnsiEncoding -/Differences [ 1/glyph2/glyph3/glyph4/glyph1] ->> -endobj -2031 0 obj -<< -/Filter /FlateDecode -/Length1 4936 -/Length 3391 ->> -stream -x8iTW}ڗV - -\YJ1LԠQDm Q-ӓvm41%NfG}NgzDOq2tgY;)s*Nb̼W{u{uw0B+ -^XsPvmCV#6@ [hM$6o7GkFF_:rr !Re-g6[6ׯ_;¯Dk׶4TDڟukkF}kojj U \be>2yv.2"XCZɦ'i%klx&~XGkmuݗwp ѼNu[+וvPȰ' -8 G2t=$,ջ3f&V:,%iO)v頉 oC8 -'i-I]έ aʙƟ*\/ypEWS敱~1R+ǠWMv1'p B7c& b8$i]hF;pCRgcb~zHv)𒊴_ L50MէuAYu[ZpYO+Ĩ. x0O-M_ZVumvٕ%[VA_5Є][Әv }WvI;Șz@:\V્0vMvњ*@w[i 7_Ӄo_ OOK=f/vu.qaw9.kVqv_g^J|?sz8i_W0% OIqOz73LQHtn%?cGAK?xDb{*wCnq؋^P!7j8ܿG엸oj qo/{vŞDm]6֝..nwv=цB͇-hVJln&+6n`6z:Wm7ո97m§ x7XC6D8UJňI\+%x-VI|ҍOpX -/>N|Y,Wq.LKXbEXJ,`K,.7sq]w` LtN+i1b>bƩE bjM1,jS8% 'Da!N&&`O⤉n1ɇPi9߇yW`s b't+ᰑg8[ƍqvͮ4Vgcm8cJqK1+'21HS34>pc(Ha mL4§MdHMB?M~)%%ܘ4iaI¤LHt`&ƄR9oz -].AtСcUZUChUd@+b v4ޠ q ނzMC# ЙPoraD yb`~'nsw -ek)I!)lW@w:Cn|Pos9`m?uc(^]Oa'pEDb4l̬Cn^V!bl -X -[}q|g!3-"WFcYϦjOsAp_bR(" -+ǟslEIa&{UE_F]s8E{ O*q$;+QPYt1M q[.*Dg)Jgm_Mfd^@2=rQ\c\8dMoyɟ966R61@nTiXQ@^2B Mp䰌tvN M.Es'Φ/,l_xWN4.3f-l;)̔CQ9Cgd{a AQM V?؍N$(XsO1q0UvձY忊el'4ˉvi_U.¤ r)qf *l6B,r?:/0()MLaFEaӫ|юbvݘ*ci ^U`je46s)8Vvqx/~h<^Ǔs7Udx˘VvWcRxNH&p`:2Y7:ǥ=Ei 5)X|3tfHK@fy}ƀӏK/fѫy,]Pq3: RfKcMȐqf˨O?)}0gRa;>"#ܤ3pSU'=7됣:^Хљ`q{'ݚ<4KP;b-zO#1Eg ,YYi^+ig2xkv}1tඍ5)?3\3)ۦzm袸7ƧjkrBٴl ^Άl]u8EWߠoK4$ڌ]]Rl2ULoBMє"V1ŔŒD|"r(CdN2$u7ty =+gq nxMv|]G5\RPi_͑Kf}p7Lb˗_hUʗnnH >vƸGy`ɱy1I2'*u-7,77l7<7?旉!px1 1/Ts ٱTn45T ǎeX2sO66oݾm'_;k# {,&C;)&f`[T c@Z=x4jR6GV+X* yeODE >s -Scd0WbA&bҘF}y.h7/>N% /hDf8[PB5QGx4hUsً?)ﰌԎ_>?4F9+_]]^o=7?6Eث:mnxdH.0藑UVvʶ+(CױN󾡁ҙ}'>PxN\ө/7{]By ܇(cU#&ہ&d=:/P. -CDLJ5ھ^ױkm1M x)IxY_fmp3بcQD(zzm35=V_W?aVȜ%̛9_ӌT3| w 54]Q*[m4S6kitYot]x){!5θb6M&e'@bZ? -endstream -endobj -2032 0 obj -<< -/Filter /FlateDecode -/Length1 8608 -/Length 5933 ->> -stream -xY tE֮=LOf2'2!#Dp1a4DD$ȆWFt"번q0yEEY ¤oD99LuUu{oW݄BH 2)>;0hP;6Gćɕ/b'Μ@Qk1Mo-otbn֌]^! ,se]<*>c>.ؼfy3L͝Z4'>x燫1h#"G9k3xUy U2">0qzob}; b|K pcl՞/BOΐc<־3$^@jku%y4Hq YL x!i=IVṁDr3KH$IXA~81M*R3ql+H/jYE F&I^eCHPr_Ba8OKEZH@!Xd'TH3b@; ZKZ4 VMbB -6e}["TJVrޟ8.,DE6mdjbHً.tZ<:D6h/a*̤eUf1t#]"t/Md>k"Nސ%&@Ixn[O^;{own'FY=#sHN!99>j HvOu7/`wYkkZgK&r!ZtCPXI5C`D'PǞlP' ,!" JahuVZаz؞ c<4,Ŗx4^C#*kuIô#h=?оnpwKrvõ+rZ"^iKdW&ؖ6:|p}pTB+ʡ5pauK!Z -+_~;E4|ΡA_⧑u4.T_8'p>>:#.A6Yg737iq8Va:"$pÎsxñ00Cr8m4U8?Uo=l>xþJT bopKuxiZ!)?a ~Uoqrعv`^ޮv~R2Rx)^䰍 jd5sV|$[KLhQjn-:Yzժͫ\koz-~Mh4q^B*ZK+P(W8Du2$<ْH :F)z Nf0DD%n5ycBlUJV"2ӋxYod=3p7ݩV|.Q,w[nq?3ziU*ޟyjp^Ϣ_o_ÚzabV._a#PIWa&llfq"ufUbRk0E$1:Üj3:{8f2ɢq[=:|A&2O=:좻sbRZ, IB{ҴwE@Tl/zvwgrVugzo? 0m;ٿܮ_o49ܜ5K=P?P (\ﴀ Umc-JK- -T$\#Giڔd'pd_<,w3fΙ];xH?al -#3ό!~2 blhS ?R1 :3ILHDC^@0#b6 ٫: ɔRHkȸj[>Vo~ƵI bo.D@Wh3>&,fFu/nYtv!J yi/< a`ͧn c1D/|mЫ=;"SR\7+orYdRm eoǔ`vQi6HxQr fmSMKJcs[P<%+t$H?&x;אZ#j"j5Ț(s~ѩӴM'i) W]h‹?Uo_k%kt)&Ϭ+;2 1^μuT텿}g5(AC '"!`3:$$('B O{^tLՂTMao_ '=Ztn1Rg?eEDKT ч"2Q,eeL'!nkݦ{GVDr -ׯ/_~kWnz.mMTEK=y^Wns5= b0ӢP5j|!otm9C<$ҐotѾ}jHwgV˫JW]tպcb}kw~>zs~r._<)nԄl@AH6H٬g]2qjZ^JԪēxx լ^Otկ%cXXŖOCq+2U|">gN /ZP mµ$0:fĺ4 eh/sp+baoL-seyHЭ?V~E6=@t'MTGŸ'toXus+23B :fajmߨzjj~AQt2eᩋj4Ş*kaq6Z2~6NޯY߂֪nÊÁ=v߾ԝAwΦƶS /ֳe, DfbFp ad(K)[r -d 8CY'A1$  t ܂]6BsٽF 2 -y)E^d8f,Y|%ꅉTjtHSohuީY:jBNRZc#5 ^6bngt,^K C?a8Cy[(8@n~5/>A$=ȳႋ?H Q÷IE=nP9Fpl`% /u5ظyOGSI) !1n{D obdZ ?ݞ@{J #8:M;S %9#+ *aD7I~`*~Ĭ,b.+'?._uMG8 }Ќ1 -g,0DԏXۉ#銌"ѝbbH:^sxTzy͛Xƫ%E߿ WОOFT]Z]wG^+ h;DCq3-'uJ} ]+u$јCcH,z!{APB$gƜ:wCssz6~ƂTM+t=J6/7ѡe4Z2cd!<x "83wfaG3x'dWabqO_w'^~1 -endstream -endobj -2033 0 obj -<< -/Filter /FlateDecode -/Length1 1544 -/Length 793 ->> -stream -x[hQg6xm6^DͭR/x7Z"ڤi*b}F|QA0J4F/ VM!o>TP0Db!; N9=05͵B޴.AOw!׼{#PHQwtyI Eg6]3Ⱦhw:<~bг{4{r'/eCH1Խ@Ew ai-,>sy --*8RYTP$EQ$%QJcBD*a@FI/ -\W[6*rS*(8&  )͠Lf<%CY_C]*'_ɗT;MHo/iG;LI t/I*I8E6nIJae{0 fB J|P8jŵj0~F ]KT4㤏#&>:<;"4!ׯ^AMK$r5?8pڬFCU -b(υ-SqoPyS> endobj -2014 0 obj << -/D [2012 0 R /XYZ 81.963 732.53 null] ->> endobj -2015 0 obj << -/D [2012 0 R /XYZ 81.963 681.348 null] ->> endobj -2009 0 obj << -/D [2012 0 R /XYZ 240.312 375.48 null] ->> endobj -2011 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F40 1308 0 R >> -/XObject << /Im12 2010 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2097 0 obj << -/Length 443 -/Filter /FlateDecode ->> -stream -xڵVNAsY{qW0*GbPn<,1,Ȯv5UkN5阳3+vEM""Rk6z}쾬1yET$Ì etqs8OQ;UXL:jӳ쵭ːA;|A3grx2ewgRIx5DxlP֥LJE7_&#$u6\JGM! a+=ͦ"Qg{vF@ j> g z.O3{tO/i黦lh=: --uǦah8CF}vԹ"Ȗ@h3PS{txFW\]Ui nl9} ӶʀƁ:ɢAD@7}iK ]4ry7rS3X ǹ.kq?Zu, -endstream -endobj -2096 0 obj << -/Type /Page -/Contents 2097 0 R -/Resources 2095 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 2016 0 R -/Annots [ 2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R 2039 0 R 2040 0 R 2041 0 R 2042 0 R 2043 0 R 2044 0 R 2045 0 R 2046 0 R 2047 0 R 2048 0 R 2049 0 R 2050 0 R 2051 0 R 2052 0 R 2053 0 R 2054 0 R 2055 0 R 2056 0 R 2057 0 R 2058 0 R 2059 0 R 2060 0 R 2061 0 R 2062 0 R 2063 0 R 2064 0 R 2065 0 R 2066 0 R 2067 0 R 2068 0 R 2069 0 R 2070 0 R 2071 0 R 2072 0 R 2073 0 R 2074 0 R 2075 0 R 2076 0 R 2077 0 R 2078 0 R 2079 0 R 2080 0 R 2081 0 R 2082 0 R 2083 0 R 2084 0 R 2085 0 R 2086 0 R 2087 0 R 2088 0 R 2089 0 R 2090 0 R 2091 0 R 2092 0 R 2093 0 R 2094 0 R ] ->> endobj -2034 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [151.734 590.685 159.578 603.236] -/Subtype /Link -/A << /S /GoTo /D (page.3) >> ->> endobj -2035 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.738 590.685 172.582 603.236] -/Subtype /Link -/A << /S /GoTo /D (page.4) >> ->> endobj -2036 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [177.741 590.685 191.437 603.236] -/Subtype /Link -/A << /S /GoTo /D (page.36) >> ->> endobj -2037 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [196.597 590.685 210.292 603.236] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -2038 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [214.151 590.685 227.847 603.236] -/Subtype /Link -/A << /S /GoTo /D (page.43) >> ->> endobj -2039 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [233.007 590.685 246.702 603.236] -/Subtype /Link -/A << /S /GoTo /D (page.61) >> ->> endobj -2040 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [160.837 566.277 174.532 578.827] -/Subtype /Link -/A << /S /GoTo /D (page.18) >> ->> endobj -2041 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [178.392 566.277 192.087 578.827] -/Subtype /Link -/A << /S /GoTo /D (page.20) >> ->> endobj -2042 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.434 541.868 164.13 554.419] -/Subtype /Link -/A << /S /GoTo /D (page.20) >> ->> endobj -2043 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [169.289 541.868 182.985 554.419] -/Subtype /Link -/A << /S /GoTo /D (page.35) >> ->> endobj -2044 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [158.488 517.46 166.332 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.1) >> ->> endobj -2045 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [172.82 517.46 180.664 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.3) >> ->> endobj -2046 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [184.524 517.46 192.368 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.5) >> ->> endobj -2047 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.856 517.46 212.551 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.16) >> ->> endobj -2048 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.039 517.46 232.735 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.17) >> ->> endobj -2049 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.223 517.46 252.919 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.19) >> ->> endobj -2050 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [259.407 517.46 273.103 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.35) >> ->> endobj -2051 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [276.962 517.46 290.658 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.42) >> ->> endobj -2052 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [297.145 517.46 310.841 530.01] -/Subtype /Link -/A << /S /GoTo /D (page.44) >> ->> endobj -2053 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.66 503.014 176.356 515.038] -/Subtype /Link -/A << /S /GoTo /D (page.45) >> ->> endobj -2054 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.515 503.014 195.211 515.038] -/Subtype /Link -/A << /S /GoTo /D (page.50) >> ->> endobj -2055 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [199.07 503.014 212.766 515.038] -/Subtype /Link -/A << /S /GoTo /D (page.53) >> ->> endobj -2056 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [217.925 503.014 231.621 515.038] -/Subtype /Link -/A << /S /GoTo /D (page.55) >> ->> endobj -2057 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [235.48 503.014 249.176 515.038] -/Subtype /Link -/A << /S /GoTo /D (page.63) >> ->> endobj -2058 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [185.218 478.606 193.063 491.156] -/Subtype /Link -/A << /S /GoTo /D (page.4) >> ->> endobj -2059 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.222 478.606 206.066 491.156] -/Subtype /Link -/A << /S /GoTo /D (page.5) >> ->> endobj -2060 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [211.226 478.606 224.921 491.156] -/Subtype /Link -/A << /S /GoTo /D (page.35) >> ->> endobj -2061 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [228.78 478.606 242.476 491.156] -/Subtype /Link -/A << /S /GoTo /D (page.37) >> ->> endobj -2062 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [247.636 478.606 261.331 491.156] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -2063 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [266.491 478.606 280.187 491.156] -/Subtype /Link -/A << /S /GoTo /D (page.45) >> ->> endobj -2064 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [155.222 464.16 163.066 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.1) >> ->> endobj -2065 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [169.123 464.16 176.967 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.3) >> ->> endobj -2066 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [183.024 464.16 196.72 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.14) >> ->> endobj -2067 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [200.579 464.16 214.275 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.17) >> ->> endobj -2068 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [220.332 464.16 234.028 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.19) >> ->> endobj -2069 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [240.085 464.16 253.781 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.36) >> ->> endobj -2070 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [257.64 464.16 271.336 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.42) >> ->> endobj -2071 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [277.393 464.16 291.088 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.45) >> ->> endobj -2072 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [297.145 464.16 310.841 476.71] -/Subtype /Link -/A << /S /GoTo /D (page.47) >> ->> endobj -2073 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.66 449.714 176.356 461.738] -/Subtype /Link -/A << /S /GoTo /D (page.50) >> ->> endobj -2074 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [180.215 449.714 193.911 461.738] -/Subtype /Link -/A << /S /GoTo /D (page.60) >> ->> endobj -2075 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [199.07 449.714 212.766 461.738] -/Subtype /Link -/A << /S /GoTo /D (page.62) >> ->> endobj -2076 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [217.925 449.714 231.621 461.738] -/Subtype /Link -/A << /S /GoTo /D (page.63) >> ->> endobj -2077 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [152.068 435.268 159.912 447.818] -/Subtype /Link -/A << /S /GoTo /D (page.1) >> ->> endobj -2078 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [166.164 410.86 174.008 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.1) >> ->> endobj -2079 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [178.879 410.86 186.723 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.5) >> ->> endobj -2080 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [191.594 410.86 199.439 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.7) >> ->> endobj -2081 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [204.31 410.86 218.006 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.13) >> ->> endobj -2082 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [222.877 410.86 236.573 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.15) >> ->> endobj -2083 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [241.444 410.86 255.14 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.16) >> ->> endobj -2084 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [260.011 410.86 273.707 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.18) >> ->> endobj -2085 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [278.578 410.86 292.274 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.19) >> ->> endobj -2086 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [297.145 410.86 310.841 423.41] -/Subtype /Link -/A << /S /GoTo /D (page.35) >> ->> endobj -2087 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.66 396.414 176.356 408.438] -/Subtype /Link -/A << /S /GoTo /D (page.36) >> ->> endobj -2088 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [181.515 396.414 195.211 408.438] -/Subtype /Link -/A << /S /GoTo /D (page.39) >> ->> endobj -2089 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [200.37 396.414 214.066 408.438] -/Subtype /Link -/A << /S /GoTo /D (page.40) >> ->> endobj -2090 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.226 396.414 232.921 408.438] -/Subtype /Link -/A << /S /GoTo /D (page.49) >> ->> endobj -2091 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [238.081 396.414 251.777 408.438] -/Subtype /Link -/A << /S /GoTo /D (page.52) >> ->> endobj -2092 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [256.936 396.414 270.632 408.438] -/Subtype /Link -/A << /S /GoTo /D (page.55) >> ->> endobj -2093 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [154.66 372.005 168.356 384.556] -/Subtype /Link -/A << /S /GoTo /D (page.16) >> ->> endobj -2094 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [173.515 372.005 187.211 384.556] -/Subtype /Link -/A << /S /GoTo /D (page.37) >> ->> endobj -2098 0 obj << -/D [2096 0 R /XYZ 123.806 732.53 null] ->> endobj -2095 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2101 0 obj << -/Length 1631 -/Filter /FlateDecode ->> -stream -xڕWMs8 WHԬH}Q5MZLc167_Qvv/$<>@h= -Fg>^p*HF2( |)7\kB6ץxηh(s{]6y[Z ɺl -ݙrnЩj90aCЇ1/PUb[WA̔,W("I !{NI垖dW;I+pշݎ<ы; (f;p IEE` - \&/Ap]a)3]%,8l -W/LFʀ\Ӄ>EAKYAMD񉌇ĉO]2}%! -^d pC ڔօ.;sY薠 j9A?󳯭M4/˧B -!ja\KG&\d_K`mK3<> endobj -2102 0 obj << -/D [2100 0 R /XYZ 81.963 732.53 null] ->> endobj -2103 0 obj << -/D [2100 0 R /XYZ 81.963 569.23 null] ->> endobj -1664 0 obj << -/D [2100 0 R /XYZ 81.963 569 null] ->> endobj -1517 0 obj << -/D [2100 0 R /XYZ 81.963 513.603 null] ->> endobj -1516 0 obj << -/D [2100 0 R /XYZ 81.963 442.593 null] ->> endobj -1699 0 obj << -/D [2100 0 R /XYZ 81.963 356.474 null] ->> endobj -1700 0 obj << -/D [2100 0 R /XYZ 81.963 313.692 null] ->> endobj -1666 0 obj << -/D [2100 0 R /XYZ 81.963 244.343 null] ->> endobj -1518 0 obj << -/D [2100 0 R /XYZ 81.963 199.237 null] ->> endobj -1645 0 obj << -/D [2100 0 R /XYZ 81.963 156.455 null] ->> endobj -2099 0 obj << -/Font << /F22 1272 0 R /F16 616 0 R /F57 1552 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2106 0 obj << -/Length 1099 -/Filter /FlateDecode ->> -stream -xڍV]w6}9޷u.b`pHINm͌+ͽs:t9tӀhy,'QA O`YŷiȲgǾd1aP$aA<<ҠU@dVo6u$E4 /C,;929Qsahqa:JtӐ' )jU$˴i}^|ٴl՟.b>˶ŸrZ\ -jA`+A(M3V3J$iBn1(WrX%y7}@t]0 ehJ8apZmUv7e~4DՊ&i%PNP*A^_?]}r#\R{ ChѶu+D+^ C΀{}R~C)=iJߜ4/CoH߹S"4>2,+ 87-cr&@NRd`g Npph LA[RV ֝-VLi}2 mFQ}+#ӈ¾S:aC bt #V8n{vr9x-loSxc#mF07:mle9٧!^"g/j=Z 7 -&? q(ĭZa7w[qըw uR?TP!shBj5F#Q4ȁ] #Uma<<~'ݽ%n\j?;>7th1zt`]EpZtIg2)1p;VҲf7逋t~)XCqe,q9Ey }{GE; ` 1'zE`x>B봏wZZYAka`8fCr52s0'@ޟЕl۰ZemRBxVٱΏl;igUT>T\DiVﺼ> endobj -2107 0 obj << -/D [2105 0 R /XYZ 123.806 732.53 null] ->> endobj -1607 0 obj << -/D [2105 0 R /XYZ 123.806 712.73 null] ->> endobj -1519 0 obj << -/D [2105 0 R /XYZ 123.806 635.686 null] ->> endobj -1616 0 obj << -/D [2105 0 R /XYZ 123.806 555.819 null] ->> endobj -2104 0 obj << -/Font << /F20 1307 0 R /F16 616 0 R /F57 1552 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -2108 0 obj -[489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 489.6 272 272 272 761.6] -endobj -2109 0 obj -[761.6] -endobj -2111 0 obj -[576.7 519.3 519.3 576.7 519.3 377.2 519.3 576.7 347.1 347.1 519.3 289.7 921.1 634.1 576.7 576.7 519.3 484.6 470.3 375.8 605.4 519.3] -endobj -2112 0 obj -[511 459.9 459.9 511 459.9 306.6 459.9 511 306.6 306.6 459.9 255.5 817.6 562.1 511 511 459.9 421.6 408.8 332.1 536.5 459.9 664.3 463.8 485.4] -endobj -2114 0 obj -[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 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] -endobj -2115 0 obj -[634.8 634.8 952.2 952.2 571.2 347.9 571.2 951.9 571.2 951.9 888.5 317.4 444.3 444.3 571.2 888.5 317.4 380.9 317.4 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 571.2 317.4 317.4 888.5 888.5 888.5 539.5 888.5 862.3 812 825 875.4 749.7 718 897.8 892.9 426.8 589.9 894.1 686.3 1083.2 892.9 858 780.2 858 853.2 634.7 794.5 877.6 862.3 1179.6 862.3 862.3 698.1 317.4 571.2 317.4 698.1 888.5 317.4 555.4 634.7 507.8 634.7 522.3 349.1 571.2 634.7 317.4 349.1 602.9 317.4 951.9 634.7 571.2 634.7 602.9 467.9 450.7 444.3 634.7 602.9 825 602.9 602.9] -endobj -2116 0 obj -[583.2 555.4 555.4 833.1 833.1 499.9 277.7 499.9 833.1 499.9 833.1 777.6 277.7 388.8 388.8 499.9 777.6 277.7 333.3 277.7 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 277.7 277.7 777.6 777.6 777.6 472.1 777.6 749.8 708.2 722 763.7 680.4 652.6 784.5 749.8 361 513.8 777.6 624.8 916.4 749.8 777.6 680.4 777.6 735.9 555.4 722 749.8 749.8 1027.5 749.8 749.8 611 277.7 499.9 277.7 611 777.6 277.7 499.9 555.4 444.3 555.4 444.3 305.5 499.9 555.4 277.7 305.5 527.7 277.7 833.1 555.4 499.9 555.4 527.7 391.6 394.3 388.8 555.4 527.7 722 527.7 527.7 444.3] -endobj -2117 0 obj -[958.1 574.9 958.1 894.2 319.4 447.1 447.1 574.9 894.2 319.4 383.2 319.4 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 574.9 319.4 319.4 894.2 894.2 894.2 542.9 894.2 869.2 817.9 830.4 881.7 755.4 723.4 903.9 899.8 436 594.3 901.2 691.5 1091.4 899.8 863.7 785.9 863.7 862.3 638.7 799.8 884.5 869.2 1188.6 869.2 869.2 702.6 319.4 574.9 319.4 702.6 894.2 319.4 558.9 638.7 511 638.7 527 351.3 574.9 638.7 319.4 351.3 606.8 319.4 958.1 638.7 574.9 638.7 606.8 473.5 453.5 447.1 638.7 606.8 830.4 606.8 606.8] -endobj -2118 0 obj -[549.9 574.9 862.3 874.8 499.9 299.9 499.9 799.8 499.9 799.8 749.8 299.9 399.9 399.9 499.9 749.8 299.9 349.9 299.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 499.9 299.9 299.9 749.8 749.8 749.8 499.9 749.8 726.7 688.3 699.8 738.2 663.3 638.3 756.5 726.7 376.8 513.3 751.7 613.3 876.6 726.7 749.8 663.3 749.8 713.2 549.9 699.8 726.7 726.7 976.6 726.7 726.7 599.9 299.9 499.9 299.9 599.9 749.8 299.9 499.9 449.9 449.9 499.9 449.9 299.9 449.9 499.9 299.9 299.9 449.9 249.9 799.8 549.9 499.9 499.9 449.9 412.4 399.9 324.9 524.9 449.9 649.8 449.9 474.9 399.9] -endobj -2119 0 obj -[524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9 524.9] -endobj -2120 0 obj -[569.3 569.3] -endobj -2121 0 obj -[531.1 531.1] -endobj -2122 0 obj -[359.6 299.7 539.5 539.5 539.5 539.5 539.5 539.5 539.5 539.5 539.5 539.5 539.5 299.7 299.7 839.2 839.2 839.2 509.5 839.2 814.3 766.8 779.2 826.7 707.7 677.7 847.9 843.4 394.7 557 844.2 647.8 1023.2 843.4 810.1 736.8 810.1 799.3 599.4 750.1 828.8 814.3 1114 814.3 814.3 659.3 299.7 539.5 299.7 659.3 839.2 299.7 539.5 599.4 479.5 599.4 489.1 329.7 539.5 599.4 299.7 329.7 569.4 299.7 899.1 599.4 539.5 599.4 569.4 435.5 425.6 419.6 599.4 569.4 779.2 569.4 569.4] -endobj -2123 0 obj -[366.6 305.5 549.9 549.9 549.9 549.9 549.9 549.9 549.9 549.9 549.9 549.9 549.9 305.5 305.5 855.4 855.4 855.4 519.3 855.4 830.2 781.7 794.3 842.8 721.6 691 864.3 859.8 404.9 567.8 860.8 660.5 1043 859.8 825.8 751.1 825.8 817.3 611 764.7 845 830.2 1135.7 830.2 830.2 672.1 305.5 549.9 305.5 672.1 855.4 305.5 549.9 611 488.8 611 500 336 549.9 611 305.5 336 580.4 305.5 916.4 611 549.9 611 580.4 446.3 433.8 427.7 611 580.4 794.3 580.4 580.4] -endobj -2124 0 obj -[514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5 514.5] -endobj -2125 0 obj -[326.3 271.9 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 271.9 271.9 761.4 761.4 761.4 462.3 761.4 733.8 693.2 707 747.6 666 638.8 768.1 733.8 353.2 502.9 761 611.7 897 733.8 761.4 666 761.4 720.4 543.8 707 733.8 733.8 1005.8 733.8 733.8] -endobj -2126 0 obj -[374.9 312.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 562.4 312.4 312.4 874.8 874.8 874.8 531.1 874.8 849.3 799.6 812.3 862.1 738.2 707 884 879.4 418.9 580.9 880.6 675.8 1066.9 879.4 844.7 768.3 844.7 838.9 624.8 782.2 864.4 849.3 1161.8 849.3 849.3 687.3 312.4 562.4 312.4 687.3 874.8 312.4 546.7 624.8 499.9 624.8 513.2 343.7 562.4 624.8 312.4 343.7 593.6 312.4 937.3 624.8 562.4 624.8 593.6 459.4 443.6 437.4 624.8 593.6 812.3 593.6 593.6] -endobj -2127 0 obj -[349 290.9 523.5 523.5 523.5 523.5 523.5 523.5 523.5 523.5 523.5 523.5 523.5 290.9 290.9 814.4 814.4 814.4 494.5 814.4 789.9 744 756.2 802.2 686.5 657.4 822.8 818.3 382.7 540.4 819 628.3 992.8 818.3 786 714.9 786 773.1 581.7 727.8 804.1 789.9 1080.8 789.9 789.9 639.9 290.9 523.5 290.9 639.9 814.4 290.9 523.5 581.7 465.4 581.7 472.3 319.9 523.5 581.7 290.9 319.9 552.6 290.9 872.6 581.7 523.5 581.7 552.6 418.9 413 407.2 581.7 552.6 756.2 552.6 552.6] -endobj -2128 0 obj -[1000 500 500] -endobj -2129 0 obj -[326.3 326.3 326.3 543.8 543.8 489.5 978.9 0 380.7 271.9 299.1 571 543.8 543.8 815.8 815.8 489.5 271.9 489.5 815.8 489.5 815.8 761.4 271.9 380.7 380.7 489.5 761.4 271.9 326.3 271.9 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 271.9 271.9 761.4 761.4 761.4 462.3 761.4 733.8 693.2 707 747.6 666 638.8 768.1 733.8 353.2 502.9 761 611.7 897 733.8 761.4 666 761.4 720.4 543.8 707 733.8 733.8 1005.8 733.8 733.8 598.2 271.9 489.5 271.9 598.2 761.4 271.9 489.5 543.8 435.1 543.8 435.1 299.1 489.5 543.8 271.9 299.1 516.7 271.9 815.8 543.8 489.5 543.8 516.7 380.7 386.1 380.7 543.8 516.7 707 516.7 516.7 435.1 489.5 271.9 489.5 598.2 163.2 733.8 733.8 707 707 747.6 666 666 768.1 611.7 611.7 611.7 733.8 733.8 774.8 761.4 720.4 720.4 543.8 543.8 543.8 707 707 733.8 733.8 733.8 598.2 598.2 598.2 842.6 353.2 543.8 435.1 489.5 489.5 435.1 435.1 654.6 435.1 435.1 489.5 271.9 387.3 329 543.8 543.8 543.8 489.5 380.7 380.7 386.1 386.1 386.1 380.7 380.7 543.8 543.8 516.7 435.1 435.1 435.1 571 271.9 462.3 625.4 733.8 733.8 733.8 733.8 733.8 733.8 883.6 707 666 666 666 666 353.2 353.2 353.2 353.2 747.6 733.8 761.4 761.4 761.4 761.4 761.4 992.3 761.4 733.8 733.8 733.8 733.8 733.8 611.7 1087.7 489.5 489.5 489.5 489.5 489.5 489.5 707 435.1 435.1 435.1 435.1 435.1 271.9 271.9 271.9 326.3 489.5 543.8 489.5 489.5 489.5 489.5 489.5 761.4 489.5 543.8 543.8] -endobj -2130 0 obj -[271.9 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 489.5 271.9 271.9 761.4 761.4 761.4 462.3 652.6 646.8 649.7 625.4 704.1 583.2 556 652.6 686.2 266.1 459.4 674 528.8 849.3 686.2 722 622.5 722 630.1 543.8 667.7 666.5 646.8 918.8 646.8 646.8 598.2 282.9 489.5 282.9 598.2 761.4 271.9 468.6 502.2 435.1 502.2 435.1 299.1 489.5 502.2 230.3 257.5 475 230.3 774.1 502.2 489.5 502.2 502.2 332.7 375.3] -endobj -2131 0 obj -[667.7 552.5 526.8 617.3 653.3 255.2 436.2 641 501.1 807.7 653.3 682.1 590.6 682.1 597.3 514.4 630.7 634.3 615.3 872.5 615.3 615.3 565.9 258.6 463 258.6 565.9 720.2 257.2 444 476.5 411.5 476.5 411.5 282.9 463 476.5 219.3 245 450.8 219.3 733.7 476.5 463 476.5 476.5 315.4 355 334.4 476.5 425] -endobj -2132 0 obj << -/Length1 754 -/Length2 1036 -/Length3 0 -/Length 1565 -/Filter /FlateDecode ->> -stream -xڭ{8Y+=\Ftm)׹4c2j=ed #E11̼43jqYZ I--eA+RE$*U$lR==y9{~ϡ|ͳqDc --\:kD8ˠ@☋@9nooE h+8,6"Q3.0Xl1&bG BEBp! -Q,>c;ʡl;DlIt:@P@cLX(Hh; (l#CIT/8 ,DsK O곹@#?(p4Be#PMp\S@ -1:Ӗ|Gn"ިBBb9C HB7AݰigՇz PL)I=^?DH2T 6li4:!$ bBA1`@&Dh*:@1*TT[ W[L4e{cha+U6i"i ;fѢ#FdS"u(JD -Im-!akFiR~둛'YfOhJf:?t0i5B?ɉ)PPVYGMGb0" o?p˔×k$YzwKˬ/yh{մgtv-m%=IA+^S⳻sbp3y"S뼳K08ciʷQM]lt;H^7j5apdf{nj~*DΛ<)lq}X5mTpl%ejvRmաÅo]5ș=9]h^~м3k,YlgZRYtBkpڨI׭ojf|_d|YSy}hPfAdQTu-w@f$kGoM!)1fW<>ݯd{.rCJr6L^}_SwtVvM.*4ZkYЖ"gWXf(h uյ̀Ud]1J{X Ny避> *J<>JBjvT<5> endobj -2134 0 obj << -/Length1 772 -/Length2 1280 -/Length3 0 -/Length 1820 -/Filter /FlateDecode ->> -stream -xڭR{ 'xXE"@`!L>@^0䁲1`f ?ba.7I3[da(GX0@`nǛ~!QG-\`.TAҪAh8OsC0EFYKM-Z ӝ]wb@P^Q_]ċ/"BD!Q(.ĿKrE AY CAYB0b|3IlKX5pN/24K@fc_- c(N''LoA4nlh1\.W3f#x0,=sȓ5iIe+6)9}V/+SN(qi*`b#_e'iu{](0HQT?`K&~<ȯpڗ6?e$r,̊) nvLT/P/A=U:WrO4\Q,mj .$=s26a}0+ ~'2].1f.SգV4Wğ=&"__+W]ÊwS3U1t2A29iƴlߚ76<-0]a2$3* }UVZy]|CsF%%24* ^yM^ы[}\+Ӹm~}޾饛^f,xqo~V4) iUQ$%fJm8 ?Kji}dtQ*]%N7 1s v苵7ˈPBGgO@Kڻx`|{ls4u(ufxY2޽#$[3J)r"> endobj -2136 0 obj << -/Length1 775 -/Length2 709 -/Length3 0 -/Length 1241 -/Filter /FlateDecode ->> -stream -xڭR}TSe -&C$|^vɈd0!n\lM@Q3T -4Qd;`!f9<<cOȳu& J -Ȟ[f$F"4jF"`BAU,>5@M\XuİBƒLyFИbANߟ2<<}A|X,J4$%b}-q[)oG\?O (i8n+]Ac> endobj -2138 0 obj << -/Length1 739 -/Length2 26188 -/Length3 0 -/Length 26691 -/Filter /FlateDecode ->> -stream -xlctfݶ.vضTlol6*mUTlIN[kݧ6t<}t9fcRH:ػy9YXy,fF68 - -1g+ 4, ,p1G/g+ KW)Ϳ [c3+;+g%]ōM#U j [bJ -Rj)ull Pr32Y]4sgտbraw@g3wvKH**$ĘfۻX+;zSM7ZgPp,,3+SW _u7wpGl_r'>?5A*bvn@g `ktڛ?yE.boO!X#r)YS~sco&?,[?=6s^I>DE{$7u0S]cg[dly0rY7vu23k`?(QQOV6+3 5usvڻ_G ­8ZWKUA҂Z'*4/%ږKzgFۓ!o˛%/n#M{H[Hi%}п8H; us\#\qZr݅ "tjWϰ`뻏wZ,&ꁸ xϸ+ -6+REHq?a@)m+ ,Ⱦ>Q ֞i zXtH9|ÆAf.VL>.aY+*f|.oH #| -^BGȶW-ЌŸ^#\,uJlil|ISԱ\upz+kx71؈IhZ;o@Mk~HCrxIIX}oiV'inҐ<' -[27q@Q.}\|a1r! /9]Bv>qim5k 8gGNAzEwUl=q`Jsw3:HHb;DM82pT179Na)nlQ$++.^"l# Xь %}v׳B4B2u*;fud{bwTWPCEJQIG9J"T-/P)h9e| Y .R3.gZ y+4T-ltO}Ǎ rXZG49V62^ொ(}FB7Qg޶1C2dWA[G坎 )1$$RPN„m[-Er s9&ޅ9Ш:h`llxx 4Ò&rz"ZWE&7 ;1;E!W^-vx~ U2'^4\EG$4tt팱UB0^yƩKF.tڤ -ԜzpϹ`dB'C2gFy[ca;ԿIdm\9x%8(ݱ?iCݽ@V0?ޏ'hWI9 oܰu3)W ;5<%ӢgîBb$^H"v+^ BWTt류/ -t=Wtj,Տ'ρҧ<ԱB.>c(T/TI΅}^v2h•e7?1w K\=5u醹 Bɺp -065l]kP *˛yBnLfУ߼1ܵ")s*'3Kw9$5y)QH39,[7zC2M;JYvz*,d J8T*73lWc& .Оs3 -sM!'o7s.Wy=D3P}# ShkM:L.o>cxu#VAxXxt]\:S,(onHevπc{I( lQ4" ِHM|a ߭FE @X,% >u>Q(aYԴYu5ρs3XLBF{DqOtA(#=܆^޶ {Py%DKbtj0]vag>#;?0q:R >=]8ާ.'b,awAq0<z KL6_8ن:@Tf.{4ðoO*CuƧ*i!liZ-ݐݴ<4hByE|)5c3{DG6= ,X0"(CÂ}plɃxA_L ͈҆rNULX +>-:kܟ9unb~ !YNҸ]GYLL>lЂiUQ"\UGRv`qlI&TƸ/(4f/Ct{H֑JC2TD)QRӿl-7)S'R-]ETL8n(WW+/^Iq_r BEQ'ת9{hR8-ݷ.+=I8BW;]ގ2 p? -e#EN8>6SlwD;ĻT_,ipwr3 zX"&9.m&"vo RR9rA+p^>?ɨ0%4GKbkZj7@[\8ĖV9Ӥ3ruя8v ~08}Vzbjȹ*g(ࠄՏ+7Zjl:?kV4LMYou:)c;?BD6y(ž;s?:oŏїH=芊.+tIfM?,7+ΫJjʺHڼw`21LВ %,I0cRffÜ|o]UjaGͣA -nJՂ&ށ{#GZa_ZeAHwtF7m#Mg_B}E5=߬A"B7q`[{Y`gBsSM@kC|ol:bI7=Cjg̑wf M /rojj| -ɯpQ>{jE!O ĈRA0ȓ^ H6.tT^!?ȕ& .|\|{V *X295fZP9|oB [k&}fB}6R7NU!-L [}m蝗o/zo2GMg1K홗A٤:N,ēř/mr]+сT[{;|d3#uM2ǽW*=*& ^ QG0$~}/T8x\4TNUt."'.}wrJG3#nKǐ4B0p,md#LΆX{\*I4jƴ|.}9U+ V$`6X0NS7 Lo:)@yfr^+naWā^|%(3[9RօC]d%."F:ch K)ǷZktT1FB<Fk\-hO$/ね%;2d7Tw# ]oo9rcf ~{iqn/0ڪfn߆/75y" _2ӿ -Έ(Iz]o.o\Jqb(~II$W{ZpyiMitl﹌f? ;s# yni]K§!MT}I5mGi‹w][?e;ʧL6*9^2ً}<2E._Ҵ(mT'=[d洯 F™(_W;PA lR+Gw("wb^ m^(vi_.Jpmi%-CA_B4ݸ:h=Hy[zSrŦƲLW2 R&Bl:7[>@g~PM 7 -.ZP̵KF"%¦Oa0KUOfnI@SZa X怦$?2.<ߤ6_CL^!v>=Nmz*Yf17@ZD{,By}ȓ$lѶ?X]*mi{Gs-Ǘ8(eH25$Nog&=Ҥ#oMĶ,nj➽wbèVh ن>*CE -ȸi1=/!{!lkX HǰO ~ %P8V|~Y?\*y+9!/nT[/7㏁Je&",!vLDEYݶ08?uܟZbQB<^wo0;Vi-T`і~ULLn:ؚp '%3ٸ9f)K0hQ -h\mIaĬѦAœ!Kv(jƊaGtG6[**Sq)wISMVLBKuz^)4&zMdA # w1!#?E0ފ!'(&+MCCB|b|P?Hǥd1Qzj.\I0}䨞7)nݬd .)AqSyIh eE!3O96-D~?/ -dm]7!Pz'Y܄AvcwlJև?dWe5EƲydmwWOw;ҹZ,sY=5e:~GSq KX{;*ЏScݠeTZqa7fG9@d@`d t:N榻yӯpV S mb}̹;e=@^/2j-JAcU(!G+&%SnUB&aZmdbdp԰P3BCNyXvV $O2 a }Q sAbŬaM8n7Y-E!..vWcb,\:^UբLQr72 -]prK/mxcƁ+PխAw=eVj|-1lǮʳgXUT{F2, Z0FfUu; ,W{WӖpL۪Wg]$hѷ.[FbjRE? ],5wqD}i˻si"Kgq4[6uѬl! 2غ?Nvi(f[CJOQ(@HE.4J5vuZ.1džPXa&lf m\ro`B+"*!KG - (2\ݖH0!b+\Q8w_Mdz7霼>ȊE5FqY:(MY ׹&g|8$qlu]#~Q*Pϰ0G)KXeX)bGQ{0#uMHr OP#צa`Ʉop.򹰄54~ ^8&<=>!dB1/s\*ҁN P,$N )$$?{MeqhANO8oib 71JA0rP 3_V\UR"`SP^eT`n:htuGp?"AuiW^,뢳pm%L[+ͱ!)>n1;T\h4íuD";af 2L-tj&!k*.l )̤0IP_g0x̮R-cHh4W5Q(Cg1*#Ti_/5ln$1ؙCxD^˜mY* :ۮ.l d'f_P -@g,GnvWw\è/ѓQM"A%6@cU#SIX-4x8pqY>hYAŕDp<Fgc}M|䩗cC5|AtWA3(c<]Ψ+kVb!5M3w!sf;]W}MA:Vl ,1*=hOvQ/~Ke打:U<8"LIž^)Vd@ʇ~fU͓#A0z"! D؂4 Rs}r$yvWaA:sF6ʰ/c?VHs6;}:,HsVw\fWw,Qu BcJӾd"K쫹7lEd~FkrYS' '5Y!$4cBvQUԻJr[Ks #l÷U禃Xd\ʷ ű828S^`0cYHvۉq}#[ȒW^,!=>0"PWQ^݉v~r(o mܨg0^2V8wzc8~v/l雃LBXtygolЫ%LJܩlUTHIJ]`JY!Ջܞe%joΫdWYuC[%m -d}JY agN XN>Qj5C7ID@Ĺ 3KU-K$e_*5h!cࡥbTrOaE6W2f|!u>7rI/ʊðt-NJ=Gbq2m:.U2%g?0!2 -a$'!*GZA`\xfƙikW0A7'ˋ&{랹YgVVyNDzO>$%?S7XL׆uV+]sd8Zux;K" |+ژN 3vë$rVՅCD:-,ѮÍX0GXDӓV ExDdkL{ -/ |h0B+ژ( ږ|RXw;yK YZWu~ -y$4Sj˅K1ĝE9Cx.6\H|&c6/ߵ2aī~;g9ˡX=wAC- -PU|xX! &?[EK셶Df!y !p156ՓA۴l-G52_5Y+"w/ǾWȲp+Y4nt;DuNe[.Ulj/g -5}:Iy|3[ v+h 3MofUM6uoE,l[:gXUjl/5([/y瓒 >HcjsfU@#uvB>x.P-ݵi7"C c}X̀V;[<딋 B!1(& /-s}QuO("u,}dD.51$n_5I.`zZfStLۧ!Ih<.z_ )V|Ӓ/^ Q4.[AWyUM5y{fyd< U$t-E.MHR ]KF'Y\9︮#`LRZ^% GU/ e{;^$qp$JV1j`?|)XO:TZ܏ŷH߫䭖."?u*Eݣm;*p˜Rt3i;֔ /Dӑռ>d,yֵu32 -Z~©&eNc`{(^zoEAD{JȦ*<3eL=a3wkԗhsy-M~ -[PBv^|.c1SgW.]o)KJw <1y_h2U`B"xcag] -sdKQ#/xЩ8dX4)зb%ǯ Oھͺ@u~ضٽK!NĎb*2 %iI@s5}o= N2uRV:PjCgGӽ+ؠ-X$gc !kیV(*>H6 k<)f],H -ݼa@QBO!ŷZ96?7u`OOt?Kv] BbV8}oudY,~,{tZ!?l'\%Dv/ u/T -MB#;3?i[n"~FgjO. qd6N=y/"h&]iǦ -fn/Ȗ*tӲh iRNT}WNJN : !Z7YpH~"=R |c<ߓr5#aȆ6a#5SL,COo|S|M -F@ (MM]U=,:}J$5%;&KFkLɗ$,?Z~:9SOX%N2RC8ѱr3Wz -gTl߮\:ѱu:4ej+BQqX5VL[9FEt% - h|Cgml2`R0[ƐcRțǤ^w4D>#Gp5sBZCa<7/5RC(FAҍn>\cZ#Yȯ1z& հMTvS:?=1U#AKZOD72-Kgq)6#--ܸ|dV[Gg>ӲۙöEac!k(*z=7B-IS*q/iL䩬}#dzB/|W_KNAd\>݃hk̹o^76pA.euwbSYb4اvv [LNy^L}jy|Pköidob?K=aՎ\?Kk8/ r&ל8EHjGgbKO淥9>,e̗9 VPpiFuu@sq~rnfB=eH[Xph/8wYxuppL;a\KEūGEv귦%l&ٿ=oXI .({zg4EFB|AJ{$K;W?tgU@0UzvAoɎSq[Ut1GOQ[V C( 0X*E?7N$rV,5p/Չv*ize;"T1<ӊ#XA0Y=\o%MT pl-T` -F+ Po'<[h:,q>Gc#PC*6zyuJ,BL-}ӵ9mW(J46VlFǶmYqVG۶mضy뾿P/UsY\20 UP? Pp+i`$-ww,V[BJ~w&Y3-ν(%zd9b`v,N_7`Fkxf%QAg.)w1 -(Q6qaef=US6n6nT Eh`q^ޙF0;[o.KثO+~>Ô~^|jC; }J{<\JT?˓џl#y.F!h]6Fyz\U '*̟t 7I $z5mB /@z9clDIPOnJm;/~g)SU#2BT5F<|ؽajP}#/$_^vRgLМUҰ#"ۥPogq䰤FaR)^0V Ru#g2,{Zo8+FDU5LGl"8rr Ȼ+t⨂OU" C1H]I_q%^>Tt8,nVЮ."0qJt@xԞ7j># /e;Ie}QpM%uJWVlm~ozR5K|H_Vq^%ղH*(1;X4g{[PC CA_ͧ!-旎ك `tQ\H?hnp\"\*ط=uc`aiOa@<ùF:iflcQ7`xl -aV5\~U*>85H8p +Nb3:)uZ'˟߂g>ʱIL(\;qy[hMYy]ZEkLGVFx -UGƙStĆnneiBobdX_j9 ->ȵ s $KFkK,pe%̲R`$tePv0LbMG5 9;bxI_'v|tlF+ Vsaw Sx6| 99ˇ`g/[ƓkexMZQ[tMv DutWK:.3Q_e;-!-T^^2WݎHy$j!uaّiJSVpV!HMڰmk.GSWN9!k1.UdcEvFlPk8B~F."lFS g x*XӗFUH֍(ԭPD"g'paKq}}U-%g Ed2!j -D]Q9I((!wF.Ϫ;?.=G>yZvb95<^IAެ9h1 *j/"|Qez0ٝ5%244~y'j\>Gnfai>%")6I6fe>dw&\0ˣMF2Kr- vQ/}b>N,dg`; >_| ,zppv?ޫԂ,@mEuw|1]b)x9Ϩ,  ib|ǵPHlMN2b=^FoIX/xCD$ h6lʮ!LP m ?u=_4a-qtGGH9j|vME$ۡoN -w#FLbBmIŨ`\:^Ne')bI ˅`JsDzFwMc,+F#;'G tVW6EU2,(݇7.Zv5wS [|?)1[ sX_7)6AHzcӎ`0P:`"JMCi3 G9P F:3~P2n|7V|mOiGH宩D -곎LY>jC`|uee(Y({G{9 -_lۊ5M3Z8%*0M91ԙ -aAn7H(5Vd=.Si@?T%[k*Laq -WSM(m:W^q៚_o_Y/寳0~_r4{yBUnidI_' ~{*yB`bN5)u}hcs}obnyB,Ax{'"zQҙ?K^ewNeY#J7C|nЎm!4}x,]B%<6 JŠ -&9H0Ibyqyiָ( ;;ߐJɊ=Ma3Ӹ T.+[q;Z ̓J5Zؠ@8G,ˁ|쓤Cϵ[B5-,54b٧\g xOZѽî^ǥsP~PpOz|O? Ĵl#(6r߄ P$iy5MLf-@țd7ycu<&WQ76w +/rYmj l7)Kح1E$v BV_XI s+_>s2kwcS%z'{Haon.|l9cAV<9d//EuB׻N@A 1 F.o _\ޫ[sQ^ӝ8\Qh,=0MЧ#z[I+$+ Op e)gE<>sg3Mڟc]YD/fai1PK^mt2,^,:x(*n )2hֻ-+ -p! XmMzïxobkwL앎C+j9ftClʞԆukQ  .r7Rdw@W|祬ߕdSȸ0FNq!}Reܣ|ZBmX3,R8hbu' ƫ{b]_WFLef];tK1ׄr30mY*ӿb-=_oÀ(G:[r/ХR.FeR^9xK`32I1 $?[\ܩlESP˲pA`B4g=nXP0 i3R"uz1=7Fmk:7D2f3= |?D,}%(=@Yu G,$Y]!r[m] `x[.};3=^23 -0t˵?F7 \U uSc']k(7j?k:ٵ.djY!}W'8/WA oP `r[H2Pg!$A@cԦ@#7jhR_Z 1ExKꑯ7׫^ZIUh:#id ׎T^g<=6!C+_g銩 -;X.9lЧIw '~(D9ǩ)S)r@9U -A`RFOs0,{e?, EDB_3^%:PrxꔔN]{O9k1`卥N$S)B#WLgoqKԚA-H j־Ü}c'J1O[?L<sjFOzr~Nq~lꝃ3K#mGCa%Ģ3YFjÊtA^CL'誝(SgQ' AIhz7!ЋS`ز9&Ct:>Y ٗN-ٯ0uƉg٦5%䒶n%Ad my]Kע}a?>>L$.[k}~1ѿ +G{MJ&%J5~zpf( -U@6׆1Ѝd..0[30^=/]1cFi&30fbBMs2w:+)xyɸjx>0>dУ V!bķ -\9кo\6V+٩4SZck0JW&8X/iK_,Ou'8P{, L2AU.Z݉ l6ⶣ#mة^l.-H ç>0Vםا"Qak!`-A#ˎd ^a*v$.X̥vK m8TMc5lGSDvl.7Z1ƝeBά 2v|G>HpȌȨ Xʒw貪(?5?F|mĽd5ڊ}; (l."cYaNlk^~ 7}xg "s3t^rbϽƽ^^zYK Dv[,C~+{&2gum=$D?z&6LYL<36F!d-\Vd߿]Vi_ S:PuJĎ=6|vmq &-0 +q&^; -잆K'=ȃB` 69w{NZr3昫(+\(ަp^Kյ>^41+yO$l%Ҋ"_KWDk.,^F8u i -Ey?׍qc ./3h\d3oĪ4m[WyzC:Qhx, O#CliER`ȳI5eDreesm̑5N#8yX6Y]KpN'<_2PXd 넜!%Tt,ZVd0};)#0sBӒ'rA['Ǔ2} -O͉m2HH0MEoH7W8!BR|\ aWm cm}k^4|X%'5XE; cZ,F}݄ZnQL6ßol;:3bN2Vc7?N? 7c{6*ESv2W(>YZU@Lyy &\+,a6~cJ qfTnd^/ QK'~@Ց1!\PVKy~o~B1Ii )-" -YQֹ𢄗_BDkW9[?q~ef<1 ٌճ+`m?+-6}E ]T$" |qp}Ƣߠ.᥿ .tys7 x -eٿlGܩqSVoc]h̷T ]o?5Emx4`^FRONZOy=6 1aĨtm/E!R՜:ð ?:+V}Ę*aOL "z?R'%"uC]T/5Of%C#^82|X5^ݢRʾtH&oI$z? -hv)Fg-Uq=͙*{cYxL &ug+u#c_'|,S7͖X -͵+2/}'92 ֒Z6E :jy"ĒC_,!V_梄Vk -K䥱/e\k0hfC3Qo;#JA:IYiftx;([=9A0k]f3ZJ3`|!0uy$>a!-\"mVۢ}W/ω0mtըk%gWuGsyku8f1o^"q/ RD߈o`DNSjGJ/ ĭ47{;|AQ\jn[4-<3h)DU_t)HHܛ ܌Z_MHJp7D<o?|5[(0'Ǎ=[_>w1Q{T]j~?L>IaZ݁eѾTrA3CYn>`\,}wkYӛGؽUx̪9` -e -ش6r6J,6*#*?cJ{XLm"Kݕc\Bp/!$𠰏\d?|2F?B.=E%|DS%^ӧ*Ð]>\`f%U9DleX3THjIIt v %LgʀdR>t6{^LT_q.z/MKj_N5Mf׎~ \kDlCb]L(+#V]&~'y#i-M6,WO$N[lCLZwV,ļd^Ï_Z}0o25W2L}C"Xx N;`Ԟhp}Q"ܛ]O.{Bd}IeB̒>+y&ǜHɆ$/!{%~SiwsE&%f 4D25:=qp>j>}x5vCχVCrG(;T{AБMI)-BŘ\u}KēvJ=m8>BuԺ$PEk -XYznNt -Cv)_O61ȒP -cPZ/bWrt8t Vph;< Ң%xI9 `ᾚg2[mW(WMn~/dȐA?yn̬|ИCRt,U*x[S/4n ^O0:֥tG].ԡ0gQ0'MZm{CH?\ [Ѽ,C&pF$kn_`##EB冋MKHk{8hلװxH5^1Z*;gH͢!ЫC2*'Bsj}\:h;psq(fg@nUdR_zjGFfvݕ[c=M{G8&rպ<*,n#sn@z݅aʏI58`&y;U3O0Ep}b&y* Bdvchv 8Yp1mA-M'Vv 追kLRw7{5S=)ey $DX.:ӌMv )"sM6R|Ҋt ^~Ie< ˾sVG%F涚 jL4wr%CgH$W r`Xfgơ<k6!yi&u˦=Ya~ gsn*gʳs`W9m*2t=zaӯ1$ Ku1LfW -G4omۿ]ť%S=WWM*xf;ȖZ3&$VM%9}LP A%@IXbh$쯮y2^Fμb!yуXȷ)>P!LqmqҵAG= .|x3x٧:>FR?RlﶇVO}$}+55Q~DepO -`YnRH%X{D~PmtJe5J: oz5EKx8UMn*G%[GKoRD-ध~*\(#hqp*P,a9{@[g#/dٛq8䲩03Fοb})PEw۱ļuk[E' ÊG$A͹H~.@Un e˨/f{܂=OºfWyҦ~ʹ7f.L7ZdF I+>E}g?' -endstream -endobj -2139 0 obj << -/Type /FontDescriptor -/FontName /ALOUBG+SFBI1200 -/Flags 4 -/FontBBox [-123 -320 1637 909] -/Ascent 690 -/CapHeight 690 -/Descent -194 -/ItalicAngle -14 -/StemV 50 -/XHeight 444 -/CharSet (/a/e/k/m/o/p/r/v) -/FontFile 2138 0 R ->> endobj -2140 0 obj << -/Length1 727 -/Length2 17052 -/Length3 0 -/Length 17649 -/Filter /FlateDecode ->> -stream -xlcfm-Zl۶m۶m6l۶mu3sD+#W?!%sQt0eec( i0200蘡IIL ],D ]L&eS# ldin0wfchbikPw4𸹹 99Slj -p0Yژ4%rqS;S'C1@ٔ`f03'gs3ur-@VTEPL^N *L" 03HSn_\g2,:hFF _Iڙ6quoBP!%)B kobd1zڙmhki?I3GA,,=LM,]W7~?W{;aݎ^Y^ABDgﴨ9@E LwZ?7_*)e ],= t:}t/JHÛ@`dgfp2s?t]L\-?9zCsXUUS &5-v%۔6؉xeF!l˚$-smO%|Ѽ;IKSwefWp<ƐOK_,BXqv{ }xsŐs)8A^\ X/BDלj#o -$1 ti WMAЛ3ߌfm+fbqWBy(}o IfVCawPw*I7RzWZ}̓d1b\> -#Ne o@v+_ws?7z<//ݻg"F=/bqlJϬAEvSsG(qxE YAkO_!=JL4[BݲnpؿׁM` OTBӭ*12a+Fȭ=,̙Q$Kc - -gJv򸗳ig/Ӆ<7k,Hge<~tQ^ -̜5GO]O )/Z.ԬFgp8nC'fKrZΕzɛk<ݾŹT3GvP[@CşN#ceUmȐD9)vEgjgW~BFQ>TZ戲yɁ -$;.s,ڌ_*S(}2Қ2C,GNjDZn -OX'ڮku֏2F(h3;8x.H&vaR EM^ `͌sC03S[5iVʐr7$ܦhp(y4e9۝]>[x[- -VVh} /kI 1m@fA/ y!RЭ/Ƴ0w<4c,0aQJ|R9FkRL 'wzwMhsqGLajꮑ+L^DAm*NwmeT9N58AB+s^{[9%tbb)sưB[' Gs@(Sq>Xϊ,)FE؁_CW/Gzpׄ76VX'HH]؅}r1yzO~^crE9l!Bb`!!ہ9,ٟbWAu7WjRtňB*f/1˵q|,6;dӳ]ZR_э"GQIϹgl<+4XaeQtږѸd$q)1đ-̌ݕ@r5,RrdJ5c3D"ju$?CMo4M5b֖ -_wn鲕 uJSiG?Q[[wnӈӾl)Sk -w|#_RgSMKY}@Ɛ fW;{CoSgz¦ ~Q,Kww]F}hSɎZA .I^('EJnZtSc/ۆ6ݡ ^+Of9f+}JCg8A~D,9P-,W6'ܲfWPMP ]EɦIId_ S`χcKp@$؊ګ5蒘Q R/jwr]5ԮaT isX6EauB('Q}^+Շ=/E^j"ޛH 6HƕF;G!">ƎG#ط]=x8~f'"Y`>1.v~&D%;Ft'酥&P6HEkَw.=L9V~gDq;&]AL?+8d1=tCvWƫ|1n5aQ9gN1o[&m ~֪!ݕ;2$$,ogecX`, -Fj _UG(oCRBY;{0OTRq8ϖV_l)Bea7 [T~$W/7?vGJ:X:u! ʁ׹M.i@u$6(t)˹ }x>GDා-JαBGa7.Br X![Rx0}5fruΌhy4#\"f#2VKO6;x,T:ysG^ @=='_IJor{@8tDnV+ws] wq Ј X"C ;Vl[$ѥ,BeD:jlm}dmp_4]VW:9&c1ڵ9=3[ݏ,}-Xo)lZZα5͖1܁vvd'@*$J -mFzzgˎ8xnw20& sAHDW 3 -͙yn?eЕK+TEH ߞ@F/@v23gԉa=Ha"帺H&"HS3j~mrd-# 4I` XѣeGƢ9pA]BuaU mڲX,X/OA٩K|*9^yoϮOV[$CԦ;JM##cltCac;!GC#a6^y~.T)x%>fs Q?mZM]B -Q\3GzM5!ۓbuBQij312uk$.gjjyj~2FqzZfHL9CPOs܃hz37V%z`5560W?ja#Cя/q(睥h0F@|lʉ" `[s{bSշ|y*?^aJ|!r`0#A#qqg+}2A{vM I~C2 -b,%w -VK,B}CNGRgWS~3ϏulFy>sMڧȧΡgV-aML\wko ˱N -qA_fmJgx2d;%/:z^AZ6q2cnsRԅI%kd +I,Pj*VQ\0+{DM57=գ*P巚x+ޝg -%3U^Iwql2C7n0j`_o^KtH}s -n"p[& ^hd9rvpqmo'E4 k!N̔@/'R$KpNnpKUeu?:$l&uviyq$z7Km9SxH; /=Qw}f<{W/)zW5]$#/mvᾔ]i`)[k+/ 5ބ -m-V:أz/p[aJ>qj.ϊE5'G&'T[yp (99&9(BݤF2 -B!|uՂslST!SH'䙵)x}UUx^&)b]JY:aZhd*8fVsz4H|}yd91Z6*ZaƜ3xCn5|.ʴu۫Lcfk)۾3p f #? 5d)5 -F]=e}PxDQ$NcV1!L, -U7q1&Wߜ.oRmyկ]9l*5*zCm*Xrnz>CL .rZ̀j^nMZgi -xJp1bdH,+kS/_j;REC"K?#H_;,\̀\C@'jiE#8y[:n;Nb5aPԃcTvKa)g2qбcxA`Nl\veWeN7+[rG}y8e(A ~6_ui b i|ظ/}o[.2ciIgvr.U rDmƾt .,nIߔ~@Z4^ǕƒQ';zk.:WVٓۻ5.R`Bl lDeTDۥ^%V=%g<,qx 89XnLBL"z=H?rJ qTb> g@-&0b ɖf[rqX3Mڏ)֛$ -6%&Pqh疎K8mQK4X(b cv9!AOwM4ms(W9iX.T0WmQڨ>>RO6uހjP@ɨ{mO qw[r;te@;\!My5 lN6XyX -N!Ƞ,h؃R%aHã-}n(7Nk_ZtNy:-rTg$*$3"QAqN. Cj_ewZ5 -6i#FNI;lKtjO7f K<f?9'RlZIb#(#8W)r|Bz!&hmX/u R:%8 [C=b%DΟ fd. if 4#~S|Y,ν}8qm;~j9j#b(n\reYXL'hU{`Ijәcx/ކjA*R>š4ӌhuvˈ=_ԤQ®%V:%CJB{} xFݬŜ'\ـ*Af='Q#>dn0"%Dm=oLlƘH%L0&*n؂d`MxqӍ"9^ ?+s%;dѸ@xՑ(DI_}h'> (Be*Q_=|SZL9b'jL:3 ))X?wd*?g E՛_N”,v@9i)W4BzVxϓDUAdRjS(κJ*z?p!0*t -#LKbԃ1J˂ GF{SAޛh᱿QTۊj琖p -EERRsc>W?MٱQBuW%|"(ZԋKSH毛/Wwa(i/ Kswڤ J `>`Fڲ)$kP\GzxdG1xfppbTat;V5}lVF;:16!OB^vC5?: qz%2{/ I?pp[A.-;b`z6HO֢7B]#"qs'/h5ux4Uz2H#5[6giLHXH*:hʸ.DnǃQ:@|75|Uneh-J4'5 H"~3q%g(B@Lנn (\k*w.{eQr;j(Qpk&u?/5\uDzq{cX+\qX6ȬI -2'Fɕo8JDN6GKpFq'Y呔3L%,Ji^XZ{)y^Pex_z8QߩKS1n| S Dl6\fnsj{Iy)zcݣzN(x44tr(Ry\㙡E0傕z FM]bYu!0XFɋ (rD|`_a9j9jCȜ]6GSqAoj(kkKD\8PvL'?}>;X vdE=&?ɭb+LƔ NSuwI -Pad B(kt%d#@#PKJGuP-s~#?hQ66bpAZM]uXej=ӊ@G*4:+ ?@- _,YρiS\ yi7wt }ѥ,E:|BN PΔ0]&0LʑN(]ph~ [b*L Ʒ婛+G87AEk> %ڶ:̤#sz} e3(ŜvZ:wD4E;ZAJ${"Ԑbi,reR?˛A·<+ڜB‚|Hґ|9!}4ZkLHq$3f@O2I'Laie#v.|qF *W?I&*MO_|KB07 —T&¹`M, -Xu $%i{>`sRvhy~}N@Uʛyi[* wARa3|Bo)GCiP5M mv)(nLղ)(VtmR|&Iu f@*0襲 qZц CYm㞋A|}>b)=Iks{IH0Q -ص4.:/ 6{U/&Z:*AT8,~'/..38?gMը$5uu{6 >ԖgHYyhP @oq>BQ*~*0;)N7O%0HM~;~7_)mjD4wOK0IZxЯVA5דv,Z#% ?]5jߤb#q}%jwsSum8tocKh;0F`|xJ$tUBC l (F>?!chRY=#7Jlqf,4蹪+H$|wOZ*37Dӗm9պ{ -Ar{Hq*'$S^`*U~އ.Ed)jo5(fA@}+\OH&yDvѢGJ.uLlXgw4Dw8OX -|Βw*t#Y+,3"GBt4^lﲹ)G`U-"I. 8$R;߱ǰ*dT:M={y  \M }O\c܆~*3tXt7F^*xrR[z-a/9SsDsH?{EyStΑ*)I.+c0̷R`G-Pw:Z7VFBDLa6GAl^Q rw!!_%3G<*<#5:ؖ1N7Kf=r}BfE`6Rkɾ&Mrt4f^J# #=+%cU4f0Cꋡ+<ڴDkK!bvFK2Ȓ|k9 2Xe8dfwI2'#a<:R8rd.-9I?+PVc9Q$ak&Sp4қL#*>*)m'A}S)o[Pc<;cmM.kW8)Iy>U"UէKߪת]K\pc|} "5J+T -Rha=k19t zt1P[bl'=A`,ܶ -'YGSz"bj(' pjǤ>–=m*_'r#4jjr8ǽg aTGˉi[yf_~%l] -wp}Iج}:E3!֨s%hslșWY>$z8VfR qytf>MܾۋԤ{>Ʀq&,.urC"hA׹2,bK}wJY#$4}fK}4x͇Ui h< 1f"hMC lB˅R Pyi`l7kK 4SioZ.IcTba6Yū"fiR+u^yPt>BXyb߹|<.{YI+vw&^<_nsD:>|*b+T@/be,kO]/@{Jel5_aoZ-b[Zx2Sw@ȍo^']9{yr;qioAϛ}E5VIbJm̀oEF.TE{8q5,BLy{6x!ӵULx%1$aGʺ4ijsF軧>?]fkD\96J{qύ{,}֨FJzBiߦ)OU#fW:k"9K]zdR(qF -~РT^֮SʯE&f;`/qX: -@{0¦-X:^4]LL39$Kh8L@:sK9uIJ!+Kmы5 y5 mcD fJѯZ -"B6skocK)k"Ymf7gwL>")ԛ x`eU]22Y-A};2;@{oYczt )<̄ ZL>Ksh-\m#|D~=-O}K}FFמ~T}|ݘMblk\X,hi,uuZZl#цhe$d1>(jc.ToR)Í0+|v_m" -ڮj'ovPiGRI z~ mO|K|H6/y4w9 XmxBp!jgR~K\.C,Z-\v %nAUޅg\_L$pXi0DzlpZKAt^e'cx}_7m\XdodA|浚3T xz"Ҕ̪"J82*(V8_ƾ;5Sx[_XI_w+YoGymaF@\{0d -Rĭ_H S3"=ópk k# E'uNmNWĽݪiGnIKYLuT7fQʃ="9;%`0XV0X"Y!ZUQ:K|7z;US/y+;+^jmҨ(F7?Ž-~a՜!S=`6]~\||}S*kGG\E@KfX8%M,)^@k";y[ ; iaa'0Wlw:'%Lrn5y}0z[Ehjðٜߊ> 皫+9=^meH<12Ӵ#kqϽtm,'q4zsObҋ%~[җTfHMFyHGὦ>jm}-Mfu}d<5{Js`bn^fre1Zo0A_kb}A=^ ߥ;Q#fBD1 - "9z$=ˁcݛ#T9>R,յ&>;^$r0T;$gCoͤ/y#A АUYrL"v+)ef (6{zb&ݾH{001=8 V?06)#騖D9Τ;;LDY3<p3~5GA{o5s)JA -f9/(hZr={'^nw$q8a] FW?DvV5X~*ۢN1"3}XlcvVpx!\ -|e<Z7QxPG_8իUQt[:eZ>нHR/GwrtE˽㊅V҅F$19 J^ f^~ 15. 1\(UlJ\$J0#rɲ*ߪƱg!Yue'cF1eipqhbGz\1Q[~B~q$4 ѼIvBm?#Lpwsh/a.=*)[Trf2)Dlqd+3WӲ꘱]?5k%ʾڭ{b, O;BUiyTkY Y'%hwo7-Z]ֻP)z5POBc djssE}ZdU R#ѤkV$&"oj07p|4t+^FciSfB_|Y-[kz$2B9f襹1cz@Tʯ7xoU!WU͹cސnl ΀$I -~R5O\SEEc?zђ aH@E ҕi>,S{lϝytHL_bmW^sYpOOQ-RP'i:Qe c8Am(Ssuu7á"W.fo~8A?AF3U(79u1)EѨ~ݴb3bT.wDR 4ׯ' KK?8&IĈLѐh@v -Q~RBJnOdw4cƸ׹5_EٛB+W qp^7AEơ臦t܏i)7MMBZTO\x+tn,y眬-Mb2%sshZ3yw*#_paT^4v;t =k7.wDBm l#f$O!\KmrIW[ĘCqDdK -M|N/fC主P6>*4AG zh! ą1F'Cv4#Q =fÑ9,~:tllIKooQFУ3+WۃwQc?rI&ڌYNO3&x Ӎ>^ -@Mf0{O^]x HЃ@)׭l6E$PY`w 5aB - ?## ;B\; *9-P"xK#i7fnj]wOEgI8q%TNh[(.S'=2+[[#s&J)WK8QH,7JJ'k"%i2\EР!Qm&Wv. (=}A巓[t:B,EK8ڏGڪzr$sBf.ɇ'Qk+!_^Nګ ju^Ы>a A[8&n!%[|\`Oia0ҠZ~0$[M<@ΝINe=g&M=~׃(6KcҜkX6ڄaC1fQdR%]N@7vqKWSTi$4"goȷ {ďBZ.[?P˛ Q pbӨTr֑!Qus02P /qM|̩-Zv~6y9^c%s.K(5ZE,suCJ;K7 fs/kL׮ӂ1{plM#2:Km!`@QEF+\Ļ'mD{ٍ5W*Kl_tž#ƾ 5S"͍yrrMpA[^>w"?CV^j'3Q^{mr'm|H"^{,+p%=_4;DO˥ՓJ3^G@9pNW۶m]`4,d1Ta *p/Ҙ¤&VgmV#qSq76Z2աV:hvl5:f3E]&M\5à3:sKE:nsـ؂PH@Ck'- -J:J,%pNtl|[>lH\YUW#^[A%"p7;|ۅ2[W l+Q~R(=; =% Cԭ:(LߴJLZʗ$$#p=G+ܞV el~Θy4d0㡾m:IKv9ȍ=Q_GfN΀@EP?C6Mf\o,ꫢ){^5 Xi5jԯNp&x#9IJ 'ݢF$Fb  lH}>/J m^umpH]f f)ô!U{6(V@bȚɶȯѻ'8jvګ,ҩ/]-/Oc P"^Hz8~=BU(?{ 13>Ε4ؽ) ڝCwuC(+>Di=30rqܣymJH/~;!/`̴ȈrjɤT#mhȃ@9"V8\ji>%&HddOY> -L}2-Hf&HlK}4tT!t9Qg&M#nr  M16e@Ew5(H1X_%V48MXSDB@Dxn K gԘa#X ؅TR{鴵ˑ2] &Ms@G.׬"_Л lv E NNWމCZ -endstream -endobj -2141 0 obj << -/Type /FontDescriptor -/FontName /SOPHDA+SFBX1000 -/Flags 4 -/FontBBox [-229 -316 1737 939] -/Ascent 690 -/CapHeight 690 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 444 -/CharSet (/B/D/E/N/a/c/e/i/l/m/n/numbersign/o/p/r/s/t/y) -/FontFile 2140 0 R ->> endobj -2142 0 obj << -/Length1 727 -/Length2 25424 -/Length3 0 -/Length 25949 -/Filter /FlateDecode ->> -stream -xlsp&6vd&md;Ğضm۶m۶9yzY{ֵzUun2q[GU7; =#7@E\X HGF&b4p45pr4Gs775sPQ[ P2066Z:x Rf@ %%/WHmVE'C+s#H0Xg016&q; '*$ -aPd% qthdh#Yd?X]#11͍@Ss8&ecb `9@Tc?NVV@# gk Z\6@zX[)G1A]ƊPnb`Uk?JRWc[+bAKMKVZf1#[csS?fELw-gho -aW0z ۺz13sXL,.Fho -4[]5 Hn -*˟)6m_*jԵtOK !Aޔ3[Et1>Z֣}5*k/- As{~qXʙSaRW\h:br{ǀPwΒ - n=Q{~ĄK2&KÁB^QyQ@&%/qdwv7!}wc$oZ\:} >FFLp,q[gB}%Y}"}ErJuN -\cQ7ʞ@JC޴8!S;GO9VO}h -wl81|9pS@c GI&av:Y8DL8+&KuNL.?HH)|+SQclT&yN%Й Qy'E!x6d}Es/[da/UJh’\$cGTI%7dmRD[XdZbB{)`A$/՟(Fd0#b! fB)S3⾶9PWb i&IOd{*r ߓ(xPqq`bql);:r|{Pg:Nw&ڝT ;r}JT ->yI-PA.Nble(. +S:1wMr-)In0gDb)4Ó?fBNHIT L 5ԦfPiy4:.2sqx4'iu)'PO˲Im'riRN`'Lkۅ-z.$;5kAXuZ1QO7WI=;N};so.i]I 5C9q g?n( qPͪZJ.>kz=՞x, 6b慠O=vyH;okma"CW9Ml¸^12_Xte)IXņ^+8g|IEE]ұѿR':1r2 LmǴv;Ӫ-3\3H2kbvdmzQȄTri*kkSzAv-6(GSgrQ fד+YBod%y?L"/B{oQ0.~] ̺Lg-u@ Ո.ibYL6^LƴE‚` @hiדl8X{(xg‡BxjN8?^|Vm :Y`;DKHNoh}u պl[0"{}ۖcC+>5hTbX`x3+W$giSk tt+*X '%d ?}pБ;ږ/*fT"7O~G -g$sɛz(hsAq a@GNyV`,ZZ0}x\ M*TL=*R>u-&w:/K{l00#[llYp7YWau6DgTLTđy/Lڕ*0N!d7`> ڊWzAGneBsZz@Ri2_8\q3v؋|/8|le=L3X-*PԽ;g@P+apYu@QƲQgrrib MfjHfk+$yW*m\PP9"6;JnwFIBqÁJUxKJYڋ%\k|bWz+;$_a,֫(c.FTfڣAQ@OF٭;adNu  Tx=Ԛ|JP7$ϑwt -^j4Hj 9ω[:$)?T4:{ -G~6]BZTxQH CapJ Ӈ=+pNvw69G[7wvtMf $D=zq(""hU>1̚LoL/+Q z_ZZՒ'_gM ~LxQ͠!DOaE6,(L8!~*)],Cc)t0*qn[x(E')L5ְ_9c\Ċ Đ$q%rrAkxg"ɌymaE.u^l-&`atexNM*5}90%Hه#LqvHZBlY{t*%iL>wr;AE"_m6Դ"fm=8mb 6}! w_Ra~ԕ%\I,{s\d5"*MIkS:!sqقbI\*ufJzљ[:"zNŬ2ord$|p=`j4\cK)̓ 2N/[<P̶S5vVѭ3nI^.Iy<#7ޝ:;97"穕!]pʭV?MYP.:,$;㨠yJ'&#jlyrIBχ=td~*O3^ˡQac@v15m(۪=ꄰrwH!݃^CJTrg颦"d:[sHcVyLL)`fE<$זPê竆ZN_jp xI,ЊW愇>Pow S; Cyc /6@pupL *әf sT{pR7 -Xߋ MdWow۽r/#eZs؊R G#@Vδi5mEpҺ[K}-?hl.-IḃlhH uYd [9bm3"s;`x9G{_5Xhx<-~0M3^RBFmPc2M\OEt8w0_ -F+gC=9=2czdPb֜L'5f5 -_S7Z-XmFF',v&"A-6PxBs!EsCg?\3Sh^AV gUʻҨ+fiѭ'-? JTqk2 -HX*}Z^6)Sx#(DLPNP^m|!.39Oqk ^W?5K,J6[%HH%ka/gIRk;N9EJ$XH'»7T\}rXN B)'@GHV#?AyQ*v0 J~1⨽K6P. @?2s=cg>˦-/$X~.~jK&E+"wR)%:*mg={| {õ1:)۪-HlI Rb.qy'BA⥸Zx20 ?;U 3jhx]WcwS@Yݍ[v|nSB[۠&5+egXY#K_uOX :{S<0N9B0.ފ>.G3h~oPQk5>MUI+ⰟE#Nr7h`9}F}%+wdC&O['kj3IdLpu{g}ӆHUIe6sSJw^lBJs]wA]Ss`:r5͛6*-]rZxX7ؖ ^?,4xĸ;ͨ. ˁFBIA3\g;;3q~8Cʘ/e -Х0jjPz}󡉁-M*pj K̕iR{Y0; 45u +FSՎj*gS*{ F˟N,/|ͪ~RgYZGoJZ1Gi6&[#g؈:,QD^!&`b)¸¤#cKݔ1hZɅrx!GkGJ)(PnKXQ o)!=]>^褌`]_qD8lRϻ%}qm1n t"uoqgZ -N͸6xR\@ Ş${K6L_eY+\>jYtN~p8_";^6vFPvkl y`eiIQ-gEmZ֖6~E̷o6KHTԱ]-I7 &VUPki2 \ EĮ/ 2((9 u@+N͆n2|<h+Ĩ dI X-Co8 l(u.[\05Y"1TiUX'3UQI-ޯ#B7Z;K#^{;3I%N_v\@Ax| a( -łIW7WF5b&#FFVJI(C͔'N1]5ސMP/bljU(EcD~&^s|j~ -_aY$m03 d1Ɲj<z" ˛yvAzU' &"ʥ,,n&|U5һThJ`#eY o§;|D~< Qcj!:ρ+.?[69Db4Н Do=6~[wm퐞yѰ:cPuE%n1B\ ^6|V&2=Lq5Nu+:d2I=q -ݚjGS߅-Nj_[JcO(4pRK#JoeMWN(݅q/P9b߈UrzmR/q^8:ɋhH.Z*l2y9$QmC"ؒ:pxޖ7Dhq}ϣpŪcSEs-Ba]14ʄnJq?AiI=n 5'jY3)s}+@ԯv=t(HO6f䴕X t3a9쮽_*_PO˫^~JJ<"h'˽k -fx`}{u"MtE`ҦʜQMǎ:zCsXyݼv(0fLDr~s]25 C-a(rE6/,h>XlmIiJOT#`3 Cܹ擘Oi/bUx-żC`$L fir-+m7ԳN]v>{;pBD6}!Y{.32A/iZJJ.^J 頉G{,&@SͳgvYv.FF#_S9Kg9"$LiB8;d6G{yJg+F&%!ARuǫ]d -фl\mqW Alj njqLh61[HdV@1S:$z],mh y֫=X&걣IѢK'5 0? 6MqlSY& m3N;->۞( /@iX[g+-I äɟм"8(-#y0k gor2$G7ZdE_ϬlpWo<={]E$r5sVOpҐd+APY|^^o*H7GC,jV uAݎ*q 'ٱ .fPˋҁl8_SϿJx"CvwaP{__PhmmĽ͛9TdžB[z9K6=l&?k[(7KEh -k} x -aY>tZn@Euܦg+PhO<}/>x:e>?!=C>~ RŔٔH6iGjFBܰ34${CTSlW2 RlQ @Lke-]gX3EC^#ӈ/ rNE(MHM>7r -!}! 7 _+:yq'6ԕNq~\ZU5J/:mZKك?6ufđAMquinZ)!/;tqgB_x1|Qyaʣ5q E a/cw -m&Gih1sk/͇ٹϏNU -a&hșX\NP:/)<ĺ4E% ,z2@a]$ʖDk 9z45v>ݱ'qСDaM'#I}I(iORYj`gL +hE*9 I%JlIcOT6ҙBe좠ijwS~k}T-'buGMsGk@Êga@er,z IFXL@#^E E*믶߄Hŵy{bpHLGtF]iw<+ѥ8uګЃP w[EB;vo_ Yy- 5g;s{&Lo0b l|߽şfN -%<=@ A1fM?mp"4]1緄d}q:ݥ'e KܰбTQɌX sw0.`5t`‘MƄWF+{Y6*$>($MV =Tе\k#sa}jIfqyn1<㻷HYG2xBT"xd9wAʞJC@y6Iф]Bgcy.h™=mhm#O5I#Z+r\-b/Jp@TEFuy{EP9\̳ CHUnVbklѵ' l&I:.[{n D*^sLUܘ -g|j\ST,( } W#TEx?jqo/H^"fFDNˣ|9i(qv.S?'G{&Ddⱐ\>}#3ʫй"ʟ8vqtW0>/ wGc~s&l"Dh1YIp$iau:aX5b~?4S^?磴i\ %>!tFN]}1nyYu3ِ [/v"0bM|#>~7IGSM@0NU猕7we r#\^@ErIeU7FOF6ʀ6Ђl;Fk?ݴ G ̬`4jw{RRgYޓڣ"ϑ:&9x[|Ek -%zriVqE|o11HV QfKYhm15xX:,4i|D^X X ^uxޑx$>md%2?dCgQo{H"${KC>w?MN9R.V%k^6fQ3l6n/\po{C\הG=C:KRQ}3ҸqnώGo4Jv)αfD.6XJP~DR;,lnFǛ08f+[mڨ$Lޙg6Ȫ:~ LBb(mD6 39L5YEw߃ʟ%c܌!~?R0$Xa  fW)k~D&K-=e5"9W>@P=Lj+įb -xZӉL$֟``kOGiRۅwH:li˯<ǰ5X=j4#T '- kyy:wGAn_u֩^AgEx3Fm>.~>rT(k}jfY(ŕpTA再P \9X#έp6((_Qx[ˈV -۪ -xW*9."6(TGt?uA) -3ȕdv淩o61|m]=VO3D듭%X7df \ܫSZC)KͷW'eOE#&f ;ի:$y )o!U.XCRae6޼3bm4 q  8d C %)j(#R t$-TS]v~VrM<\~hMdF7F}똤fR^}ڎ#/egd^:Z^k5Ф41/htbuJ$~U ݆UDj\茅7!X -MoYp$Em1ƵjvvϊDlr D&/)mx&)>99<\Zh-L\? P #}6v)Kף2j"&#ւ/k6-0rZ/uBw6 ބq/n_ndPԝt؞\dUgH^ކ\QirGYݐePI9̊oV^GlnXc5Ac;pSRTEZM3?`lYz7ЪqxL])|cí\CmHzN>"*I>,@u_4cjӺ'2ss -w36^&cc4~^!7Sb6víy7q0AbHٔUX -։? dL쨘lZ 3Fح*%p񂳰%7.b{^wBF7f;akKǢn[V0<{wf ژcS^9 Щy۱y18 -H?|lZuq)v3dv7Ǩ-[ϭw n"lSX_]LCU2mPTB&ُbڰ Y zbKz'| ?z'!C|>{ad^Yx~hl㷺7ڻ5DM DuN/(Ht[1c~w}z|M\CkMe'v2Kp[؉(Z7=YD8'fEc'r[m$D~Í; yaJc<]w^OhsJx/,(|HST~.g z`ydؾP&%`>}6!GŢ[9Gr騀@,npz^+dC -pl"t!TZv@oTTǬ`l79[G nEؗ=% -BNs2b@"~s1rnKFtRAaNYө_Gh-aBdxC5R[ߌ?l~ 3ړj6=%g{e"PKƯz_GQ`Ńlz+ePE 9 QXEϤ8$cj /HZ O/9/&= r+= IXA׆o~ u'rI9z(&ZM<_}M RTn7{bXN-7*u\pKSG|_Y6^Jj3{9 vpr^GKO@멗9JTݷ3$ }Wq63^߆Ђ! 3A he"Wht輫HyYeүBBxwn>kQ~PΛ~";u\+_fy -"{m&r4td/:fňzi9K k+)8,>({|FlyWmMd߀H0h -3/TeE)XgXE}C@N2F E^B5؋,r}6ZWϑJOhs$b)+FnVȑԃm}iFE*Ma#<8fL+cD܈(ؖM$dNcj -gצuL%tzbw(ّ7!)JEJy=6qDvEJŝ 7D/nnz#H1R#@FD8EK6~s ?k9Ĥve*çC`Z&HML(ɴAR"Ti-bسTpCX2' &\+Pi3y݋樋(sfo$@ҪW&++ -D㖔ݙ! /ev[4! -v'|>qBQ^ ˮRyrf!:惍 5ۤ*RGYt˭y[<qR@I3+ -"{"\ߢpRfjpPC=l ХP0 I䘪80N>2N8㮰t=Q -(\YզZʋ;>LI7΋ZF汷&08,#΢g_$ٶpN$ SYkPDPRg2I2! -=hbj~x:S[WtN0)$)FbcM`kpZݼ 0ο2AfWf]abIo# rA~L!8@^Fg6s?1ı-Jzrőpߒ18geRG/P( r5oD[a9` o`Z`pL_9Kߊ炭$SWF\YHb -8/s7.KG9K*%i,ZiTԀґ,rERH6q['¤m1I߹8?r>8vwu?#gbq7W :7X,VQ5 9B$vr@e:ʧ< - T5FSt" ƃ{#s@h):GvD~v -ؤ*N m rΆc6_  dnFҔ?c2bЎx2tEi" n\Zf24+ ckثk9=}80y}cc9j$zIzL+rm!ωVv}e&tuǍVCĵ9;lMʪzl[aG:IU1 j3] C(H6ҪQ92x;*9_rl*C$~=b.p|N9bLM. 1Ǿa#)u;~nu˭2֓ޠ!>_]EᲨQg %lJח"4_!hs<{T)8W[h@Vx#3Rz(2'@x1QnH.$ϗJqae$6 3R((rD,嫥4iے-3&{|I7dϾa5$?%g!Y >ʝQ}CzLF4}ԛӺk6,ה!ve|*\Z4VXwIA}RlJaXl'd\Pw= 1k z"(lXgl92dEo ﰧ0t7G21^PU :g4p7Ja:x*(v`rÕlK32Vj.0V)TFL]: =vc0̎B='nTϜT>6jX>'*;h0%jX @Dx0[N*;"joZq*IHvn6 ۷^w1(e:zTo\!HR㬠6Z OdLj$'C%N/+ٖXb]8VG[b-~kO7a̐8]6!jOBGBIz)"zFI0g -_*(wG)]#<4x3Wm=?k{Ös-wOZR ƎXX\& \W&e%Gx7K(h'*8l {(|05{Wu:TnU˹G6'i_%"`#D)Y֣vW(8Y~tg!<&7\dtDW(?tR-0UVAeyre%K\[2WJo,=^%~&3lҿn+̣mch1y 7L߾D^v1<DU -ٌ ck`_14s?s&.MJ -8 j}5G!GH] ʃS( -r{0XBlIy`OB%QQ4V$|TfTR1(b۳!vᔱ?H76h(nwɁATH$i_X̌k2ZȚVu;ɱӊܷhUFG ZpO -9]#Q(l43ᄶ$#A/ۧktqmH0*7>DeZ y! c;lMFꞵ3 -_C|Fk9cT˗L=dK͹t˪=.چ^~fiq{F2*/6[5Q -|u;guFHy>lƠ\Ґ sKOS$muÅ ΏZ}KO8m uY4 ϴz aT#jZE4ZO(4QYcaQhַeL˝iՃBrx7UW49`:=!fz?cG |Θf - :܌Eŝ.#od狷Eru>>o"+XӁ;C& oxcРVA6W659V#rEʓ2\1IM[Đ|#;¥fa$D -ͨ/g){{Džўo?">j g~٥Sގpz6h"aN1v7{$\Eb6gț -Pî JQ7cjcneO1$PX^ńQ0IwUmv q*ZnS1-ky~x2$,ln&`<:x@ot{˜ $R HwO< 1m; -{D7?=0wzrdkzm_WB`},7jeB@"袰%ȅi3p$x#6Oh_1۪+4%6C`AW9$E>utI'uJl1uTS U@T-P twԙ 85J¥)χh]VSVaaUQ$$ -шp,HvA\!;@ '~_fQHS ruҺrΊW-e1:lt[~ܹcFO聋YX$f[1'|BO\r~rKWdv2)׭ŒT8zCpUO?$W=c%h#|xP!8 +~*!XHdngȔmEaoh-G Kx\^`>ԱU\0֖*k -xve_Dul]qeϰ5s(3{2$gM~ ݢxX^@A3 c5~;t6j 8$f0!Eލu۔%o1n'/aTqQvĽd컡:@B%*qW#bjonM/BrSҢNc!y_&mv2Hs୔/!W #4EsMxf5y0λ]q2rŸt{ -^F nN]N2ZM"%,>"F+n9oj @?al5WNwA1wܥ厧@4Ɓ&SINْ{N绞G6Lio$zBƚ+l|w ݡ^ ?pɕ7%h -2oэO"uGX4R(&7 3!QKD➦u0!!<,my} 05 ߗl|yz#IG PLڦ@\& ^7t&D[[-9~︡((uJp Cx{'C+@NɄĪ֔;?KCnTf0 Bĺ}e`2mzvgU ' -Oo,8<`+ŝHL?26 |Ђnd[Mb@Oxm鿯QPcb[Tk>Ȧذ;5-&dD( Y0c Ej"8pRzV[G춪@ֈ Pո3-ݷ - 1kp? S%qAҸ= vCnnq*2tp2؂uj߬]>/_u~Aa=1NL`"Uwx_-(%2 RѡrVPJZDYjQ_*HE^ '}m&/m|XlB^㶬>j@2Vyȳ;qropU0fW]4ާ]1ū[~Z0. 5N0`0HDD9kg'|TȅLT"D'ZgÇ$}_:$`E׏͚2:,H=Vnܕپ'M{FΜ^B_V~U7dtӬee -R }O]GC dܡϋ $،b_)`GoɏnQ:#IFO#rJDoZ -b~ -x,[28ZO}l!O숈  s^Vĺa2˙ :lN)DV3<b=L;4.7vʰH+hK `ud*@4j"$i+xG'>{H;[s Ptܠɍ9̋.wm4)vTF10{4X^~[j}A0]mDCQ*E/$ARȝr7'=q4tP]}⡒<^7ʭ.f+Y4‹vfHk:+tj6\<"ř&9TI0vHOG4Pͯ'7;Mxk1.;xT`Po0,buB -Qo&w\|u2{NU 6[Px_qSDڵl Lch^'9&=:r~O\kw$Oq|RnZxisW+9z> @$a|gۓ%њ%ƘD:nEA)j3 -nefe}ϨYA +=Jԋ^އ+ D d1!@$%Х3!/M JC;QPHdf0?beShhWWzyI"[o8ߡ$%x+dQQ2,+9ViJw8~p^u;ﮭ|BFtDŽ_P QwMUU)f6vB1Wizٙ03\/8vqCPyzю~þϪ|ָAQDV,˛//T~L9?Y}o4RRzqgxyiiL{<O魟Z:\}:{4 LHom8+j[N4!n4\+Ɋ|W.h5R\VQTˮ_bO /O1.~Ӂs1kh/-{L"aNn764_Gɩ6hD@Sjt,,)5k iˎρK EgZ!z uib ;<P#AT/@Jn ;Pk}Kqzo+i+Z[ e)I \,n%kBc^'LZujLJ]!й>9.ߜhv;|R+ XZ=q :}''-c5g)p載Nrc!Xs4E$b'Ae:R5O`UT]Oֱ/p&c\SN}q|u NccL2RrAk$0!%vX6[;tFKqO~vt:CXwAK6 -~M7xT2r,u QHꄴ%,|W'/E[.ۃN{N+<m -ȩjXj AvnpR)lN~B<M>ĭOSŶt綤h^#t cj󩢟gOfYHR#( w1D#ֽ?cN`> -ƔWMRL{nɡ(q`7(Ztk$5t|1`=i3sJqq2gvܭ+i&K17¶ƅF_ZO{qaڍۚ kd`7?@Ӭ1^ -]>Dc-ޟ?ܠ 2zK^z=(=Pj&5/ᦜ۾$Gغkwwc m;ڳ\3{YI&5c"'-oNN.E+/",j{* A\S]0h5(Bi`<8]Mb|9ETh\E ~Qcܴ?6{GKF6R`iIAKt{cm8%MLWtK]<7/bq@+y/m\Od*p}J" - 6 -ZZE?c /Y?}w\ݠkPd+|'reg:KmkwAx6`% *Vdʡ%zwcпqA1Ϳ#^_NO_j?\{X/ΠZg J,CNg="&CLzd3R)*`ݣ9K~8 au]*)F2S0`/`* 砙X񻮗#ؗ[N5uX+[:O*#U/c*e@\e=0lC4q@YuF胹QPٸFmE`:͠XETg+).GZ},0.7%qq'ulnWlf|kjanQ5iJ"WS0r 5u7tMkCM5XEuehHo~,U,XVgHG}.rҐR%l7ӥpijy7Q8rA\r}Rs4BKkϬ=ps,[Y~U`3vM„3-!:iqeޭV}^@g{Ra+xOijR:_ۺpBmaE7zdk(1in.iX3GBuVoR=K}pW,0 U0$!.]#vNjՈ,|a,zOqN #p!I^ZU/+Ncُ`uH), Y*MhU'tE>zYlSg3A 8s09ʍ}=j-[mhR=.e}^lPBY -)j͇1xS(Pߍ{gݺw_acp%Gs ;0r}Y\.ቜp;5f3<2%'/`sz~]ؖȷcZIGV=ԛSv -endstream -endobj -2143 0 obj << -/Type /FontDescriptor -/FontName /YUYLJM+SFBX1095 -/Flags 4 -/FontBBox [-227 -316 1723 930] -/Ascent 690 -/CapHeight 690 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 444 -/CharSet (/A/C/D/F/I/L/M/N/P/V/X/a/c/comma/d/e/equal/f/fi/g/h/i/k/l/m/n/o/one/p/q/r/s/t/three/two/u/v/x/y/zero) -/FontFile 2142 0 R ->> endobj -2144 0 obj << -/Length1 727 -/Length2 20117 -/Length3 0 -/Length 20699 -/Filter /FlateDecode ->> -stream -xlc]-Z媷l۶m۶e۶m[].[3s޸I\vF<{۹x:221pń4 t0N.v".\uS  ldin0wfchbikPw4𸹹 99Slj -p0Yژ4%rqS;S'C1@ٔ`f03'gs3ur-@VTEPL^N *L" 03HSn_\g2,:FF _Iڙ6quoBP!%)B kobd1zڙmhki?I3GA,,=LM,]W7i\Ml̬)gy^^zin^*lRNc|aߝ1xzipeW;lh>1ϭH8Nlalڅ~)ctȯ#[nHҨ7ÕoQ&!`tf8%jZ%'oWu(PYiLqrV5pE0 1zť-,E4}8DˏIlhς)G‹ϳ1n(Ts&IՅEFpKž`jj;Y -t&%޳O{Cp69W8ʶ2]!k; aK*HlP`$DøM_ǽR#\vi;Jz^KAM,i;FT޸3RCXO5Pr85'hBTq?_5]L^g@όKd iEW$Pb̴"+yozMÇq?03PVUX@4Ѣ4",CﳅBlDTAhJ=H{RI%6W Xۜ]`ڗo9QvZvs|RDa -aʜB? #RuAMI{^ŹgBUi3l:`U4Ch~lVKqfwL0D -4 -JJ"t{z]w>@DEK?LwX" ܘ@\zwByM,"',Plzs}XϒA -d9{;xqI;†jϾ/R.2W$vW?{zhTVY*w=*ϐKWؾ7h7aTXʇBzME%zul:ξ9°|'=nlcMuV-XN {: ǬXrv$%Q{waB iIJƏpw4v -luPƝH]ѫIw#R3ַWpdZ?v I/ X;Ym Y)5F.i*;"v"R:SёDP Ӝ%9`h lYv%G\a'uufS +f^xQƌkz>ٙ&T5|YuHt{=+ҺMG)|lˣP/Ԝ싔~6N>!y[Acl=Y"ϙ)兕7:yY}50^!9g9bW[{Y jFmA("HOi`ugea[fl_=4ǗO48 -Z'nS 2mX28:LOjC'+ӎjcA{'Ar?LJŒ@V3ňՀDELn21< -;eB#/Jͱ9vo -oѯcLה_? -k["5YU'Y{n(70Y¦c|#4B]5OET"p)]$9&d~~Ƣomƨ8wn&ݖUW%c0tiꧠk qϡe0 !^If,Rڅ!qU_*ݲu멷_d,u -/&F3%#ESnj$u$n$p/Xp}NҜ?Ʀǔ'0m%QX!v]]˭&Zs/\V3I?;6n L?°☹@ܽзWqx -їG MQq/v%N_9$y?t'/f4;ѽ:m}4 cS@unxuM`H}lP!aBә"gb*/D"O6A(:c@8ph~ [B*M*F^_*3MOkwoUjW 2w6fs_=zQ] ύ>J)JVzu΅iX`.A,MkCvauz]GYXHw$U A00erԉyRi"lپ -:C=Xk"i-D@xPa>) -=69K!Gbc]H7cwv#C<ZUO+b%YwMtJFg>$_, Tΐ5 G;k+ȣ57ALf o@}#͹N E+wgI"~1tzP=d(q%|^kp=[KD>i<LjILH~š*ZYqu 3)[@Ն*Z -E`` @eHDB+$< b N&' :ڎ -#V(QܝcY!+Wq򨱭 ix<(Y"6X> сnaEUj#~AP4%ݜcz9d^3q YFZͱȖغa7w&eX70I-":i<7%WE//k1U Uw{>v>R.6왛 G2^9Ȩsp5y5/=c.{9/ -~~sӳ1H3K< oiI5Ys_ۜfӕS\JgXi[eN^ {u'Eq -MSABk a1ΉzU`{mύ&@NHؗ/f+64`PSYTHŇ73X~;jՋ }lMwYsp̾L?ӏD5;g5%JokTN($|C#]0z -.˅wۏA? $1P_lJm-L&h4g-H6'5 41ukp}CvktlY&O- _ -ļbAB;kaiIa+;N@[vVEWS)H+f}C=(Gxuv l .ux^t,Җ!%qXM]EezA,*, k"wyNRK .1EޞsF3Aӭ32$ - ȣb>0ދ?Hউ*9繪G' sL>m/N -{8X>YJ+P_qJQ6+Te$E#jwREي\g(7z^p -}9!k7\I#g2X$:05(3haMKu:iu_¸aDZ3| ?&μ )\R*֤79Z|+Ywy:(fe`q/%MS(|7k=pçkɭLGT8~vvRQ^&nzqJ{#4RHK0G @3z/ h]qo2>q |0KϭF㍛r}B珬J\m+,eOY7*P&9w R8 -դE`E,Շ;c+jcJwuKL駒Hll\{鲕!৖X]JŢ@it -:0r A(ܔ;zB^צF0$b NfCG Of~27 ʖ.K}Z/=f/Owxd;A\3tQ=}[6CpyMz5.kwqRi>ʅ/S2 -tߖo;f -{r\|߉[9A -EEam(ѕo0#axz;}ywB=3卖r!DĽY:Fzw()N#tU`+UDjÉWH*^@2NՎo(d5ڙ5/]KJC*xR!I3? qF䧀Ӵi@sD0>窦#}BS Y^e0$+E:3"Ə #Rq6q6s)0ȟa4/IΨBoBq9y]-Mo'xuV3+U'J%CKgo@.r5DyJ:rg응Q1+Hӳ84͵GݩrywgMЛqdJYi)es98׶QG&i՚xTJ PfأK(工!K_7.ԾmLi<4{Lc]|x.z Q8NsVEiHūmyrt["SH?_Q@>p5 -裭K=Mg~E^ScDF[W1GHhcrx <MC+|@vh S,z3˧ʺ/X_"X ͗7.l"-3Z,}26,Bc#L13SRtM4)ʰްd;ԟi-kD-eWˍ0vdx5>^ Eb<@hTwvWr4g$ɟ^f,6Z -}Pcg#dG ;0V#ݵ-IE*։H)Ut\O]Hv7얫k][7ͽqߡ(E.NQRS5neo| z\wt[6hֱz̅IgwMyz9%AY^;f"M]g5a o.P+4blr ¿B鈧IP6ΆZl[JI{62/ݬȿ$\B ]Wa%7ʞl RɛAcvY.Dܢ.+dhrA)*yKi^mwmJwJBwcR4 쵃=4U= - wX5 dWZ) yVE*`;HD1$$A]Cܐt(2Y`#s/mUIXq)oQ;h?jg/hasF,d)eš{,VCa(=޸mNSRDGCDB[;9lt=!_ %[=ՙؒqr!.l)r *66+҅e`"| x,^\t؛]4Ulk{)͡EcًcȊfoNL&{G.69JDeU)C뻱PXK6?\i FgXiC:x"QJpZ-QZSn8Jcccw:<)/̠@\(,_#ך~V -&(. DmF]p#)q6B٭ p},eg+#2:8 -:^h\)g\}9ӐE6l=B&,˥]yrTA_2Z#y`%.I>J<"&#VyK̃ -ʠv;aݞne+Fܤ`Jݕ$x}8vw CӒ̌^Z -i",N5 L'աJ2>GYNOl38jɒ>Ub^/PAat"wU@uiC'e-[J{DZNvN5ַԾ?&ǽsin‡}#/9=Kiz~\hί[z*"F/U<`cX].♉ CK(SuKĥH'*}m%'w.Q!ҷD<߮~|('JYԴ F&v[d@#,CD@Pӿ,hmiGA C]Iį첒ֳhd*BLOo=rgg1ÞАe<q7OJmbwO"Ǫp1=YhG`r™H^^8R8퓪@ yō}X%!ٛNX`XGV~0r0zvEdosX߶ʻiJ`/ N.}tf6ĈD.pdAv',-N䩻HfTI6y7F #-km&; w=CH|g]iNlǤŒoIQ7Zi' WYMåukߋDZ.!Ihj86‘< 0A&\=Ri#Ç+Xw\` oB.k|Oø<3yUWUw柶;B]6[JOHI`mJWi7X&HB Q - 0~gڞ^ĕZh٣!g.EDuӓk01{hmNїDϖ.r9oX? twd.Lņ] -q s ѵ"ǃٷ-3_LI9ެaB_  -LvVEĂߍ>fɚagW GK; J}nj-?"1:Pƽ8w,MZrZC*H{1rlA( dBS;mͱ5Uet]>UHә⚥߇ G -U&V*10MM.jufiCӉ6vK%l( D -8DžS\:@:m߿¨KdDāW;y26E7VW=aվ;lj3Xr&UP{Ed}ڷ -0y+G Xu/< QW}Ԩt_=zt`WDLFk)wfikƎrI®`҅ /b6[1B@s+4&h=ZPn8 :۟~"=gDwЪF~ -cD޽q ^#?+ݛ2?X" @8QcvLCw"JHܢfh{ҦNvIǴG>~3f7UCUĉ[k׍)ڕDaC"u^ t$`-|3OZn*XK]ѩj]$]v4@-w5րJ]*t_-`ܘf.e(Yˉzʙ1$(&SY3\ּF!4%qϞJA ̽Y0]n?I"F; Sa~NZZ"W--4wc%ȠN8*ŝO}KveNޞEmul: P'owQ27cO^7$@%JVwUA6 -&"hpT+1ʚPG wxȣʰkD7 -1X֌`n7EUv*V:]c&1rOᜬ!:tKz{tdb5U'-QyUx3ܬqY9ӭ .آ"O͍Qc"l8*ײ59ƔgS,\W Gt^ya|sF3]r׉,qE>(rP̙#K+2FȲ c۽K a)ϖ#|z&'yb/\7NnUڔ7 -.JK;Â`X޴.U7 -p񂶼AD {P'𥱍'u@&K2?q^yHfsyu[_pz9fҲcsJGOL̄XӼs-:' 򉇳0o(e4Zo1{/Dh0-Yߚ8$o٨eVՌ*w(˫+W?'יJ#wԳf"m}&<2VP8;)iMq& \$bAfs_y|\*9_P޴n{qk}"Y"J-2T~3В)=˦6pdDZ * Y*;}Wc4X*R$#I UwP XΕε>k+Gƈ#t6 fA4i*XJ=f(6]ډek <#Q[<ɲU!"@ A|*Β*ne}u$s+Ίa߸wȀ%DsUf]аjgyЕoa`wg 3E^lTbFJ5\ k -rz-Z5On~{?Ŷ8 mT~h:ȋxjgPe-M14A]WY[ V$K*ػGO9h,:mc,fwk~m4 -dcj:qT9Rȥԅ)2 ϶C!%K/ěf Z)O$1w#45p~.3{Soj2Rv}j߹M$Z*N7ol"WL1A>ֱCpK*9=,n -J!A%eKZ4Y4n %oք(,S=AWA'PՇY/+HG̲zFMRm;/ #7Ӡ],Z$^8 C֬lfQ(CljPѯ*c2H xtP/u41 -Xu6 YֺERrڙa"̕PQjMfWdnWԖ - 2r=eij2nBAn=kA00_Be?٥;<>f܁xNwtYftO633 kçKr|~oM3;QGxsR?9ۦiy>Og*-Ö G# !ܰEst88HY=fP+kF53=cQ_bOlA+l>>nw( yŨϿnvP׋` -tq+ޑ|+ t˓AG%Iz㳔!ALD8jddVfܔ)2m&@A7ut5ʲ/mgY~a©xU5DטJ}φ_GʿZŒC7^/ ߘ"XZ2ūi%dk=!Alpt`Uť3u#Uk,֠՛]Sjbs6NQ(flS.S@@m"ؿATAԯq%΢8ނz\Ѩ:km)zfRZXJT9rf@ OCu3~ -gwܭJ0QZ0ߵk'y^G~ziJM7l.2KQo3f,.ݪ(9GY ˞k93Hx>]jk0kX:M%]4à10\O?UUYos9**~Bb SCbs Zaq7 Ɋ&kѭr~C5CF*~i! F=/J~B ֲKB\:iN8{+*6|v{L8Qa_@v^y/.vX {l"C_ C,T>5V bczA4V7Y~%ov盀X~*PJ#Li1WY -65T@Oh:e* -P[ct0狞M9x[3OF2wѥƚoš c^ˆz|K=N.-*aq%u}٨0 Wc=ٌX ƸF| o`7SHl.~TDϞn;_*$D#S0Kk,{Sj.QtJok;8:b#&O& ͒SB0Hu=h×иֶ^M&R6<3U)Kr@\'rM6ɇ!2ݛ3':e/ Oj!)/;pd9R%hkrnPuIϧ{ޢM$&Ty4\#[]q`D -OfUDGgkc !A' 8r^NW#?sS1_ -0 -G5S\V0qIL3 R =ӔO6w9~9JL (e`9OvbXQ] c4`vtoJcS/(M>>_>F0"d -`rqq-$8!~9KhWHB ŕ2W^Eb -Xb -ժ=Vj[Z@w&lE‘vwN~H4J-觾r*J]+ϭ#O9n:l&FQ mFBGɋ'Ɍ~<3p.r4)$omdbä[~! Q"4M#%T)gbڑ=uIUI5]3ϴ->,*Yc <}Ϻs烰Dթݲ%%#Z/]OJ9&mBܖڷאq4 3^ݜR,QV.0W*΍["=p9`l#׶vm:%b/5d(?1H̭"JD+ڕz[(C5k-蚁S2*ӈWe3hQV!b32ׯlEoR=B05-l{yHr1 8H;Η ǖur]#t+@{V`~7<1\&~#j V RU2DyYA]ƅd{c8F9v C[ -N&\, -m WA҇ -jƅB^㬊# WD3JԩJr0jf9WiVLm7-Y.:V:.%lGKIBL*-CSFI3ja>E 5`//{/愌4KB/䉴hIGԎ(kM_"RHN=v< sX f2u DtQj >av[mUhto@'/0ɘ#ˎ=hmy#$+dSkcdhr 9UCiNXU3OP8/#/ߤ&(&l FW>fsΫDZ2~ -0w,~&cdM;7+<(?XP2:Pdr)>&odx!3W$8 y$834b ͆&"9B i;:Gž:wIc2LRLw'R_)M/qB 'Ltt 9lRZP5Sпбk덻m2(~Yhu%1is݂I -C<2G*ˆ!Ya: - 2tE\! DD\cgl; [}u}-,\au,C$'9$<Cfn}|111) zIm썿}*gK)ӏ-í$vOnydb9'x;0.ot_=OP#gsEx_NXvXZݹ9ZYfY6%ϝ -3CKZl2UA>?:K7 f T84P~-RSe#@v&YLiIgHYv9*%USIl$вLBr{fMԪz} -R/f h,~i^)X4d+Tq]c3S9e] Z虹'}2,4(P18NV>WJ j; -~h|F:3?eF4F@ALxq -+{w" -bgR#Xigy ɚsI8v񸕒+x1FNjc'W9|QO1 -e:ŁAk n-!ǫ&tuˑ B%2)֔|SDɇֶH^9=K1uG[a*zV -Q$ 0" 2Nh6hf>]jiVVPc(kߍ7M%a i7cېkdP\|(2QJ2D&1U {-J_"R`3y*[[%H;KV mD!%!*"iGpF\(/?#c/ '2'[gl#~+PxDr/5r8[uPغ]vȏAIMiڬHW5T؞F2/H'/ -]2oښCV_F[`ƞ -]L:=AZڊQ*H4٥r,5bI.iWB徤}#v1 }CjV"Eh딚qD(F8@@ZȯCz-$YԼI u~hVTtb /5Qs#inisLQ;;"wBs|d 9en'Kj[ -#GuA|D.m~y&~aq>> endobj -2146 0 obj << -/Length1 727 -/Length2 18934 -/Length3 0 -/Length 19530 -/Filter /FlateDecode ->> -stream -xlc&L.ڶ~۶i۶m۶m۶1mL}='Nč'̊$#sQt0ecg( k02Y`~9XۉrMMʦ&f3##  ҘF@&JO%eSS)K^ASRN@). -73u2(Xd,MMfN(c{;ar7;7S'9dEUTT~ L2\sq'_\'O2?$z&& _Iڙc6qu@P!hW9C[S/{[WS'@ bjgbjhC[K!bBv0?CտϿ?$c .!D1[N&3ۭ`h/겆.NmF %%,lM cab01|ƮNNv.Z{LM=La6VyB*DzamZukRwdMVw&f܃ |hߌd$@8hN/dTr<Őψ J2%8]̵ }Y.{vXPV>q⇜LM!h1I+ ^15Gف -$3 ti -WMAЛob@hE6zSJy(sD`EnVKiP&I90Vp7+vk ><*}:IG@ހjO~ f"??S)N' DuBriYn%&Kkh9˧ܲI̮EO-S!u.=8K7wtj2n\ -[=}]:P{]wۤ{2*Sp FMm.۠ݡؾIb̈́וok3pVeٰlӸߌp;\Dn&t%Pp6 S3YO}:Ύ?TnnPjj2T`mu+ڻ%.Hޒ6Y[c5 Kt*$W1'&I^wfg{oQOBSMJ1~$MxQW/h|U)2 t`U÷H,HWtb --ѿ9oPQ7ɲ<@R/_0TIO\"xAmEmjrqjB$ܨt[?T<'S%0$3:L:\eJ<2R߄w;Ekr@wo9S=D]fNgU-}’$i?:'gf gGn o/J-fuXo!$lVCg]J1rp ADRw/JY֞pv QwQ:7r6X6n?VZZ'h"u`JJ>#9U^u{Z-SO<ųo Bwa(}8fr$ m:HHcT)G34BgkFWs`"7lz2X4P2Z#yQ~P2Q+m h1|P,8^#78K w͟%}p\to-^ _w!D0Шmg:\E_2Z#' 6"vˊ+:\-NuABK [C"W -Be-ݼqAvz`+%ΊN~$qt[>OųheY AQ7j1O:j r众[jJ嫧jU]I,x+F "&iWʦ|z^!Ұ~Dcؔ\nQ̹t - y7 -,ddUXGU6<3H(kpX٪nٶKwT!O)wvn 6UWl?{䤸샣8Hȷx8Z;<: -Rwg^<,{yDB1!v{)Ÿw˸Bf0\x kx %%q pb!vYEanp*eL["Z+D/M{Gі z,;}+>FZ,#tQSYD}"L$̿Ԥ=)k<;l&7HgT%+VJRIWj-Oe \|/\0QskE7EOw+ #y1 -;AY=ڨIзɄ -c($ܤ̮ -8s{ a2v iXAκ$m ,Z%e@w—>޽=M+E>, -b?X)3&043x -ZZiLb³3{j#Xk&-h$H*-i7o6x4+ viX_ z DB{0Q˶cy1^܆lU6+t=Y4Iܿx#Al*N"& 4:rq -1!ׁ7Nӌ.AI $%Bx\0y"jwY d'RgX-0c:r5RBU|7u)b(qyG/7Yec7v yõnX#9b3mr*g:"Ꜧ<) #*#C%4Y8K:/ͷ~IAY >OB!l$/*/"u2-q'"摂#Ù0+r]CWx -FΕZs nLTZ3T5d|M#:Tk4d_Ow%V> bMQeeF 8;r*zG6Zqc7`㻘veBi\ |)!Sd䓂1qPl)LO -<ʢhU|nY% -mij ExHU'̄O(GbDmanznc*r2T' ?Z)WƿXlFːelvi!Or>W͗6 b/.MI'U4144S{m!ڲ&9W.(qɎ} P0~i:(d,kPF%hI21~,ԺeȾ~Џ$Nt -)8 d@U -d6@1s:Ƽ؉޼cK[#KPNhѪ|hj<C T烦"lCn}YV;"st\<EC?ZRԏAäM`7)rKj%ކ~gO2F_+Tـc;BK7)%23…_/aҡcgA23ZOiaɅ*/=lfŴ; r>u>#_)WǦ8 n`TywᥡߝkI+ߦ6r넼,y0-˃9T|(wsϏ'y_HOjj 12MH: u`. b<tp21mX#HڈJ*ADo-}%ŪÚaXjU<)e*o.Hqa顥ܸ7鮊HHrq>.M<3‹@a" ]렓Ik[IBPgIJ]ְJzV 1T&H) -QdtAA}^!~]?v~S+ʇ1 KgP6^x-$dq힒t;&(7 -d+;ZY㈘4#ˊAd`R^`׾'V4o e'lpFUo< \ފ  *\) tX8FQȤ Z60glp -Qd#oL[AQ.%Ȟa?X*U%dt<1N2?L{NJe>ҥͮDq:HMwʚowD}eVy/oզPʻPl|>Sfɰ3fྯ*FY"dYVґHHg=ލ8c8S`2PTzi-k-}w/Ɏ^64ݪnc!L#;c7`6'e⩠muG *oл$iKFDFăaR+jP )2^r萏c(j6 X.g.'= -{aqY곢&" -G|OQ|Ieui n5ҳs=ĊV-R|w,Th_^t{SM1ůSeR]ZrS 7|TyBұqh?gpEKUP>-ouvtuFs@=|sPa|"2TT -9-|1j&q'6%K_0{+D{(A*x&s;r;2b8+4>{ß@1CSK0F׭ nÙ^fM\ld<Ѓp.j~!eyŞ_ bhq]wӥ^~b sGKb[BYBͼ*/g> N^yedL_VA'h?iWk:gd5"]ИM:\އ<mk0\1~n _2kx—EAk>X1jx_AN=Wq*U_؟JڻDD$uޱE1b3:!b4z*BτY튏Ts%fO;p5EFȫ #G h ?tܴ#؝"I5_UX 69Ȱςz1 pAi\ {#>_Prq<*FeU4)zd|J+l-㤠x|S ^иh >30Ra.@\j{W~_m滛14dŬd73<{Yw?`NWS=}74̒_Uyݧ}Y+|4x( ezQDIAكŃm2J-|O.6UW31f|ԃ|\ᅔhw"v:AΦ8cnQg -5Yz(>*5X/iܪXׄ~L!\xQa)ri,w×aۊlp#TQҞX#hXRo6C Xi,^OWc)]sJBoM6/}i5Q+ v.Ey - O]U8gÃ%bX}*_8['xJxY;IJ(OUhC4gn_ecQEeǞY',R9&;aɒ]ASmъQ@]'OPy]w ; kE_^Iɔ!5e:Hbpd {.S l+AʩBCe-ӫ~mx29ؐ1wupZd@b4 ꥉ%ƉqRP ǦtŤr^0+.錋P 5f̀.!53Ar|<)e@O.de'Qw )1ĵ! %j!z{1?|– -*j]{f W3nXQþ2T.Vg͚EaeU'!66cÖa3Xl~ot޾K&/r[v3kα -T4W.0!SZueVtN5*G4?J }2 W)*`v7} 7k3Qղwk!V ͐y޿P(^pb@)h!=P^%["m%X'}=D-džlX#Z\0 ! ̼lcM=&~-g :M` -2@5`wXMn{*𝹫'K,gaFG571M+GL{OƲRǖﴜ JM)^# e[䥸Kus1"AXg*.X,Bk7~+J!t t9⤃8BWI-9tp_.aDpdv`$>Z~7fOed[ v?h:UPL־ff-r2֪OD,Y[`~Kpq~](݌1vh4#z RB8Y>Ʌz4/_[暕wx[fXn*Kn0;}@~ݿ^pqNd#ڴM&&5)[h("؂b> T_; ;iXej9|xEp6wTA}ynhϾh&d;z6/`yĖ,Pk~b Qӫ>?^}p_|3B1kwr\H)б?ٶ'3=ت;7PyԲIE?K~-> nSrܗ#XgGz -aYQ]ʍ?INp>ZӶ)|` y:űiI!yTvi05I>*@M7@s4!ΠI}q|VSCa=Tx&9m#8"N.DgoJW:nTk45d4CD&niX, -- !Q_ ϮVl0ԗAuq|j~DNV͡0u 3\oEՄ%iN Ron7oO(PoO .FOl媶7ۘEab7kk ;^\_/l:Ғ^t ZFB2bJ+kqHAدƍݡ0T)¥oUxZ':TkCE*U^o]W}\qy뫑 ϶cy5C.`'l50ݺNF>Nׁt.ۈ_[Gȴ - ߊ, 6 C-yN9~ӱ+nx]$jjn?hY,m݂&=/Bu ߄j'c'rʢy?B6Ls>q;dwbX9:Iy7P['6nu!9^/C.y\U vI -Klm)F)O;a-pۯfK/zqpT<7%d~:_@^R&$h i NNq~9癢*]ulnL5$˅GZJkG۩0.: +l5ZԓܴRSbve]PB;-'DyFΪr5 H%*{⪖D0+ n\P؊3 Ϭ?+P;8x5cQ 1l13|z jWż^q)^?ȯ&ұFw%-\k!-EcS&"#()-(iOhN<O+dQQRa)(,)U;>Fmނ\t9ũѧ)X7{ܩT'>OlzgfZ mOzINg>63QsňZî";+}H-\m~OˍX1Q'Fv'E?=@ )JUpڃ+u Z=k†lMP zgSw8룥e|"hpo{_1j^o YJLSvE^xw^Y080pGD0@`g7kEB/!ShAKT8NkuRk88zZհ71UdtfŞtG-PV y(`)mr26N~\_B.uR۲$.#D\^ĨM<'c+d$~GxS]y65U.U~*ۼ#qK9uYZ!;[C)BE^QpkvMIVW QHSG1I ڮ܈.eڶ90˧Zg^I%UdG]^ -t{[w(~8?{|]LRg -4lbhvom~.-WmWxd/ڡ+A}jn5c0BH)l$#j*zB{!뽪Ap^C9k| /Tٲ=8)ZdgzٶI"[c񱫄 ZHqEVxluAYNsAYԳM&2?YÀF3&dGH^W~- -׸] -H ^&q,Q ].)΢g|m^A)_d*=@护p4V5KH\M`nG6{xEkNjVb ӅV́6䙣C$eF^/CK|y|"@c`e=V"|Rv/0Q 㰑|GB,=|Wz:#*TpJX1wMk IAUZ{SJDnz.kqn+B, esĠ驢uU=NȝQ'˥O@ud2d-:Nduйrզ?]BS̖Bv!ڻx=90SNZP?6/\n'@,<3chK&ռX.4YW -9V6~ve6yɼМʥSA$<婖"9PIɲz=H@ p8f;J0H%7ܥvRc r^j]jҎ0@ihoAA -y> -hN*g77>\j::!~k&-ȚAG[YQ})sڮU /0vA&"qA!m"8NSyWֿCÎ9M!4_[cA0J6yCT4)NXؐe3<02QY=$^ދ ) كϺB!~JK7$Z *@1Y< !#ED?ޒuACoIۛ-ڷcX(棝WVZU{MAr|w(Jdd>aj!vt*Em>A{hkt|{GQ.va -$F̻'eGnC_ڀA5Zr UQjrvn̉aZJ$exQ?\~=Uļ1y,G4h{M#S`Z#aPQZuZ0q^$qspV[VTRGT̬Cd/]I7Upvm49F#"g5?s}5* mȆ53B+a%#m9C7AEC ߉nTm }.3xg2 nBO]Yj#[N*VJ7P%#܋ I}\FUjѹ\y|Tu9VsXҷF)ȸ,c(VkS}s({Dӊ 1KsskrނJplIx^vQE90:Gh^-dSbĈ.uAorQٯt''N:/z @dlʊS&)Or+ ) H7[Q@+1% -ժ&ǐt=`eie:հ -2fd>YE\>f8x@~o's[X; MoV -`a9p8ILwm>=TLz*RPD0{1;-VPG̴ Bao;wЦ6bE"h4udud|v2?+ AL;eB/' C^[o/<#瑥үʷ\sB=rDOƴ5y~z{% .N}V' q M]aeފ_ $|yj9hk$ +`ό赗b Y7(N,)'odjʥsBy\C"cR[{ -ؼa{ NMp?n;[XqKmn3۾`%Ôe>ʱj^|fz>m(2| zTGR>VU׵fC:c`pK,2S)wAط!*ӏ\a?QB? gkYspJ)p*J@2Q -xZF^ VhgKۨ2iEn_ā -ƻ~1~U+>7ɸœxZSmY7B ,L(6ⲵesZ$WSg9^QO$J8uORԡ"IayAOq^a@ -,ԿxZnj7 -9`am]usZ^rڗ0_ԑK> 9[<$M -ѳHx g`i&<8jNz1r4[#)d[RƏcr#TQb+&K,24=u躚 X5c>g]oT㳗](3 ]ү,3yEa,}1iK5|yt?j܎%ڏJMy0%#8leȩDV{p;ө4Io۴)\`\.-н%n+OZ.owKh4P^M $Cᦍ%5(A"hs[|,Yg{r-_FRuՓm~džw[9 RzE]9܃B.yiyJ0DDElFWo eܬ!9+ ?$} ͋Č/Ȭ_/=g(&@M'[P!$̫7Bv 7ǣ@8@٢^dÚGK੟aʌo y淰lԿ:j+5ko԰ Bث*}`2looFxDOAZN2?J9T{H_9,%o tϻ]~(1C mm:!ؙ2njl io{TTkD;u(]&"4֜© B~׈ HU+v!_FHţ&R%⣞gVbQ;&Ĝ0co$1wN -BHW/9OՁƆ4<,Duf_a}*EЗ~oK*@/&Z\j( -xO$rτ_(+}feP<&2z?{ -ɈQ];:UDh;h^mms]jR_ʚ!Rg(| U˽c9;B /J֑]# Vs=Bcd4N2\?" \n $~#^#p -ٲqt1te GӺS4/"'YSO!!@KcJp•j~&y+dG[-8wd$jlH|KjOJRu<+"v)H -SRЙ3v˂n&蟃{*+D9dffZ1WW4Ɣ"9#Pig 5,<N<奟9j`.[Avr?P& Z,ZJ8A@'u+#Ch^2,UR15~vN M?Zˆ:NBcR({ol0a3ӿCfq̇C"!CGN'z%, 'Iim`1;apFE- '㴍ƹ@y|(@_ꈉ ѡqVi,9оL0-E @|!w5z;g::A[e+b'(úXK5]6Xn\:Ox':q\ %{Z$1@qXm 0 NIM)lsZ̐a7E:Yn̜ю]IW\/6Oxy,M#ݫ?DSaVk4tK89JhUy!/MYL1&'N>$e-&ԏw*Un>-7]Jo(QYg 9yZ~ 'jlKdKwlRuppQ2 IxaGH7wY`ȁHaL5.;kGo=u8L@_ L/b]Mu/{L*ʜ(Q f%dv+ן9 -da:p4,ƫH'ztve>_ -= wq0*?G.c;lD}1|$6"ouɍJL0M#ξgMֺ6,XaXfXxYF Ƙ?ՋyԴFJʐPqN3Ŷ޽& -q.8WނX-Po,] -RkslB]7)ۄگcZP/'1WMv+1be8,{wZQvEmŤ.LJr$Ƭz{~_2=0y^S(@^ήoyLK1\Us8(}IxR<&&i^M:kPq"T~YH@AwwkM=lLN? -:^܄u]2;IgءwAjmf \; =ӛ>Wbq r ޒ,u5a} *P|$68c10T01MuvyrTOPS*^LYC:%a[%-+!/>|Q+Lq U@cz+Y ;&ĨH~i*ӣ Ɲxg >X3wBRPҗhTsD" R0 VI3oXAϣ+-Hzm^stjp(M׎Ykm2Dtme .7[n 6XU1 3:N ߦ2o.>{G R^{V8™}0+.Q2heLWXӟBmJ NbF !XrW-6ú\)tKa7P+፹&6hZD`&EJ.YrI,JEU$ww&raNS8.=O$tKzM?`_mAl f+,6U$҇RB`oea]&ATH߲חӂ!^M+VlZӟn"I/:HGI,\K_ImTp!Kmcuhn6KQ{Vd|ý`6' -%Cŭa$%2xE@ >ZZ0$ 85Yz$=*2OweuWk5DkD9oq5,@US>LJDăDLhۓ4h.5%.翆(7!W*rBuusΠS;X8=Lvq ZellN\!kIs9fNxK#K >f_ߡۖST<=[ FI6?K)N!Iaeѽ"6׊2WH~7kk -h՛o/*% -B _;1le -csѵQͷNkO_S\+>}%~?3c{lm7ur8ƙ[).e,mM,()!T}Fzd|W^ZF~yp-4 a4~REk_ -IVREӑ~!q |4UVC8(nn`ժN^wV4A̒˼>nA)*}ʠ:o8>'bih HT'J0Fk, !yΆ/#)Ѷs3OӎVeiI:H8eXs*}ULaWk.;ɨcZހ{flMA<8".g̓Fep ؅)J2gl wVqhF ^/q^*(D9( *vnY"y.&Զ!|:xL v@eDlKzBњl @w5)C_qf,ʘD0kOj&?JYU6޷qiniݦi0~'p)<kfd.T7*5T-\~.xQ(6fT{Q)iwPq4c!n}s'x0*\3m FCG#FuN!VHOdq4yېYrg ̟$ڈ!߰x4S״7mӌSk[nqԨFhp%K%97I{3T&Щ;sYe빷R-tQ?S #A4`bQc~BR꟏]Mw" (;;OvpS%J -%o DoVWӂi<"k$Yϻv#5Rᐫ;'0NPP`bL{呅5y%PR`GN6T{<1ӫ|ŚM_E u*柼:ózUAZ!7dy7`9 a'wYqǎ Pd]_,T3?W )Ux; 0Zrm'G/[ C+0~8sYG;θG^1:TU$C2}5I^o ˁ D)t%8i/ihN72)V}T06ֵ3WXl5X97"g<\A8v/dcxy}e#"Q֙odzE؋q<ǴCse9PiFPUzO*+1gUKciKbIYDQƜxnVرx }92i;HidE .qD=fx74kKVUHXy IlV4 j?+OLNmL;*U]Yw" ӻddf\)?ĩo 1ӢF4o~,El~j ­d+ޱvz`@ MI!a2zŕM)Yd;ZS/pj[uf5a N{q)6v t-1k[SY9fsRm6\M2A=#W!Y}-i{*%glR>_z -endstream -endobj -2147 0 obj << -/Type /FontDescriptor -/FontName /CPGHBR+SFBX1440 -/Flags 4 -/FontBBox [-218 -316 1652 915] -/Ascent 690 -/CapHeight 690 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 444 -/CharSet (/A/C/D/E/F/I/M/O/P/R/S/T/X/a/b/c/d/e/eight/f/five/four/g/h/hyphen/i/j/l/m/n/nine/o/one/p/period/r/s/seven/six/t/three/two/u/v/w/x/y/zero) -/FontFile 2146 0 R ->> endobj -2148 0 obj << -/Length1 727 -/Length2 15802 -/Length3 0 -/Length 16337 -/Filter /FlateDecode ->> -stream -xmcfݲ-\ͮl۶m۶m۶겺˶m{ύOjF3#暹))#-#@YLH@ CJ*djbio'bbP75(:L 0a{O'Ks 1忍5CK[K'MٕɕEʦ S)@X^ASRN@!. -73u2(Xd,MM)fN(c{;ar7;7S'9dEUT*C;?\656Wu4l G2N`&.#SsK;&igf`΅9@S]ml mM.NY{S'; @ц67B>a?&Kg1KSK(73M?J&v67?;ݢv&ve5t2ÿ -BoO.kdfW0=ǐlF6Fv'#kdjofmޘ;*-Ox - -Xȼ=A6x5ئUN++5ʎhqK$ikka=X\\ 4{E͸LI"^ -86+稒#5D~Jl@`x2je{Xpg۝b5\Ky_ĉr"5% Lh8z@$x2Bļ,TKe -( woQ#@ȟ)0QJz{դTYm\AvVth<1{REĭ_8KPdfdk5>'"E+G+rӶ$~m{hcpvoY#I#jqu_E@16#3P͍iֶӾanJS/ٗESqAHq@a@ \ 4gڸXK`tA"we$)Y~_GF/p.^ֵɵ!iGHegBb -D) >dxuG SKrBx`J__7FAj3&yďapcqCo>U` Ϣp_ S,eHyt]4HYE8VP8|u! P$vp}rpxGֈV1IbfGX! pGѠsط|f-&ȩD|(c;nLR'd_\jLS<>{CQPTF!@󘷢7#x̴f[~PF@'^;[#*|.JJz~ӭ;U~7kXG$'5C؉V3pΤ{jW#3]}&p$`c"tgP"yN?4Ao>=ގjzWV!U'6;c4/Iا!S\C^'qFH62DH,[S/zc59*FsϝQT;#hM*.B %:(2*]+-Iv.9ˆ~+,y }@7֧錨'i:1wy!ͺdT** -!ósx1ç%xn%l䚓 =jt}LB_og4 rB5P̆X so^xV؉֡<|"Մ_Y~Ano'amK$Q=0q?s9~H| spZ;( c-sqoݗf>chb*2RZxs.%'D▍a - skXOz8q }gX Q B'.7!~OU;Ȟ\~vi)٨du@z R+6& Ħ~A#Y [QBKŻ}oiM0ɷ|ǿrs2~AmOv߳js=$0oL;" 0nY 5d$F{yaa޸QvKn;0ŒtjW}:&,b$٩ mo}ů:!9y+F,~.;2w Ai2b,(2 }$!FӋ*`yA T aL幟v A?"e',~-SGϭ[tn 3=kAϼ))Qh}:oCPɪ*+'ߚq+}J 2m&:<>W;so706{L_=Fw;qڰ9s~rW723˕]^r`𠂣Mj<)' " ^fׇ,bd1qC#iܧ ?{q^"iN~ev3 Fh6-2, -yXyB"[h_1@^_h")dL8-()V%=4vN.\bjH<`uHпW:R8;tt1IIUismzG]!E/IB6:sl -2V -gnPތko%=2g m ͊\̲ +Նc#Yf%)Pbjʆ&K;.r2SB6ᶼ=b1v%lN$ b8q_mm} T#X^w:Fbb8y6)}1Sb<Ơ:> SLkb)/GQR)pbP=wރ+Dttp!k )hKBC7pAv%O$ yL['{81#Fsz_18E_(d% Gcgɠ9eb=%'<;7.gAgݘw6p">$&;;v`&Qrio= <!DT$R.3&ټ -8CK̅Rɳ#;_˯0 -f, %$i?(T%w u.E$~8Rٝt$5l,$ic. 5*UZ$=)4by"<]s bt8-JEĎv.e/zj5_fEL1m槫U˼pg$dKoj[8}{0DjZVTW]cQ:lH8f~XQb.۾.N]СA̚RE5'VKR`ŢZ4!X #0d(ʣ 4a3'ysRǚ{tPz[}D ]HY -@EY$gh{ỹշwDfMvY)Q*|bV6ʞtyغ@U)Q9@;06k1ox$ݸtdl)wiO;F>Yј4{5@ztg]-FarBI{߶ xԄM!Św˟%?JS*D*(Kօ. -? SX`H1_!q }hN3bY[S^N64A#%E?sB_[Kڤ?'e>vmo$ "*ڙeI?K[a d .S#cCQ[7Ĉ$:Fa:w204as,pӸxmb1GEeDgGz6{;o4,\gC&臌#9n߆pjм\} d~&Cv!:!sg뀢E$ G.BGafJBC4yT@QK,^ -tIzKpB9t&^ Ċ{LXVR=f*q% Wp7ǃp RXпbnQ$ ZNx>m"H!sLx44O dL@f_ϡUHaqEp:28i*ixǻ SX=E N3?LaYE;J$]pDlIn3s[#2s MIcC\Bۖf͞L}>V1 K:jq A;t:jciRC)M 9µ-m+32<8sli)$cٍfqƧy:Z[C?g#0kXh9iМaA(Bg 0V9`W@"Y -_+X܎I -[w4^g:H@j @j{;u1'~ ,N PhmV8?4="urp3 3 XXUDmA4fJ%Gx.G[9OzN;$xONk`x[xxjTD8gSmbt\Y Nr %9w #xbY_N#SJ_ -=|焳1r9Gzsɒj8Vad5z,%y*@Su伍%2>2@zKY@7ӲR2I Hj )0V2?4ҞLPbQ_dF#]//Qgnn3]4d+O\).O 1͇`U}>[-"Tw4!(kDQ+*@!Igmup~vF.6E#2n$2$R(ںDNCm!F>P"%J)unRO`UO:Q5QX0ccz B#P0[2y!J}ł)LV5;{yi-,EE#\"B1,6Kpu ..7#Y#i,5fb?ATH4 VkOBMk*h+f;!~13/*rs!TcJXUg`# ^Y+yE\/d.X8 wNoI}No+Jy(ydb}p@Iv+ς<9UPѩ<8* @!_͒0huR -IJH$O<@.R?MJEWJTtmQa/|9(8nK;-^nR^ ˹ȇKߐ!CBDIx 6ܯ1Z'yQksE/*?үѱ]ʤ()D7 'i(%nY@+{8Z]Ic/>t#SRz{Ǝ3Fv^4G_vxoRGcj]XJԦM$f*[SǶ?F@սYEl]OFKuhBa+<죀Ow DuQƎ+)-rӣ"S!jgQ>T6ԀH#XԴN,TFkMI=i y"괜7PL3wbr'ۙyq1Ӹ4Cdcv]g^/ UHtG/kvmhGK|qtxi !,:)kMV"E{lY8J־F: NdIBV1Xь|Ռ87c-zOnuFm@Vl%II6)Q.Cvfȯ%n!$OuۀHUܒ~nBpkP- D+E^yQco"zAʰSG<& wj+B]r w?;zXٲQ>3хvxUМfDIDC|$ѓ3G<8 [ʇ-bf{#nA` Pd*#Rl -Gx|32P"D͵+Õ% ?6e=mgHs2+#u*b:\?:{8J_"{㑔;D -\4^j27Q, Uh^Y;01q/elO^7K7fQwgd* 8}FDmqܴ.oL($/Ldq<ʩ3 ^c2[.vdOx!LS+Njx ea2t?:b lܛȩt:I}*(-,560p(1= =e莑`LB҄0͡U] g~9$Gc}rh>e#^0ۑ(m/6Lh}6|[C!![I;;\,u T/TCXhpm%Gt0\PVX7$H;Nui_R2މvy0cqkxԉJkQM w!QS ;N- v ߓ5J ´TzmgTLE_ƙ8W(ɄfVA:耳rBsQ`H6j6e2"jaoNpm2qW͜ap衃d*,c^sm]ʭm!z4kv ߮0f᩹g*(Va3b:fBͦV*ymBV&Oyst/om@l?P@kj?9dZsx ;uqΘ/'w]֎Y dm/ -H4UB 띯oE^<\R,|K"dGxOqاb0L|=lݟMXy6_DD_Ⱥ+  &׈埇jK!"d'¾ Wӹo'K JRiF=Jǎxf甙 Ce'Pl$v ?*>?i2LSOÁP8Y6kZI"`J[\\vw8?`Q}xq-<3[Pxaۼc5e5*dN}.#Ўl#4&V`k/W9:jQ։)՘nupiGo{8Zo!߅|`Gd#hsi$Dž j7ڄ,xهͿ'u3)Yv#%5zyֻ"pTpOx֊fX噀ff.O `1-ZFy2B.?j7X>KGS >VZˇEOPna^XL.M[uU田#.K?2z6L -}.W3'ᦂ8$tR'uPk I=Ygi#0 صȢ6kիԠ>&ux|u>dTc/ IrtC8 p~Ɋ3G7pI8|NًѠ"B%B{RT2gs`\1b'^zɪYYzFYTgB:˙f.z>]ݵPr׆좋aii-;T9yqU^/EoDuH88_J~0ѴzdnX_+f)M_Lx -)݈%@`t /$;y8o ptFwAoIƶ"\2EIPak1Iy>tFu2~/"d|B֣-< YƦrCɔIKiE&SJgчoO'scoDǿbے.nl4 zT`v̀k?)xn;i oul EV ȴhH=&GV3g<&lÚt+y2ӞՁ%6*x'{0߱Ϗ(=pOS t7yZ)1 ij'^/:]UK?J=~H CrҌZC=z+Tb>se/DϦegoy˿"$j&+Q_n>]0~\UT8P*ZE ̹4P>ٹ̹>T%PxzFD!3WO{BuH!4Ğ]MrVwObzRfE#KAheHk|덝84,B,o*Vl-mJW*%c o>}?] 3x3c6\lǽ~QR3;3g[OTĨ`JvSfug0PckTZ2W!iYWj.~ FȹV{+YLs ҦCVy($`%ecg!z+o82)+1dm`ɥ5_< }GN;3 [cxM4>Y !{]oiuQT:S2#%ÈYMmHφt:o7oL_z4xߗ~{:N2p&5' aQ΃5EωP:Rц*qͳ]WƲ=>p+='?).TǟJI8)w> o;f̭N di_ sV7~ -*7ԸxF*ĪBeCwѼمs礼sl{Ժ==*@|z">Ҭ& L>-\ ?q\Xp5cG~pߺM;%BgM };` Bzga1~7F{9"# %3ȳ@O2 -{|yv:o;1|h!p] cVD!Vy :PF%.Hނ Cbhda_ɪW!C ?-B -H@5uH=9_vASN\}D!1%HA?$aR•3ȡr橙и权v;c :L;`C8mQr+\NH(ܽFL6Dr2^v,B `'LNbȍZ(V2BS "vy-%Q59)# "Lɭ<]s[Q.хٗp_շ4Nv Yť7ANvkѽC҃Z="% xQs@,oT jqDl(ړbÚ6l +fb\m+Yiw5I 0W ZZr뿠eCpguA[uo4׉+-)7esowRI]_zR5GJPD۷bMh`q#e?M:+ZhFmfp"#a霍ԙ&[櫋:G}è3bIФy 3g.:bLH]D*ndV~F,|'9%]Kc N)F!xCF.QClM/ `fao-?}pR fՐf9 y TCG~&m]kA"%b;WjtN*uGمuRӚ"jGz k Y@;k|[x8R!hY\#F)} ƒTM)LAZH* *5&CyO%9 M5*ߓs~|s"dJu4&vr/A@e;bc7qQRlA[ $Xy`=F;md^CA HJGܑ;:r2@ DeO6$0|c -L̵g^X U/?ˢ}h- UTMWzrt(Űխ!zOXDzϢnUl4tkT[c@d1tHp flp]}9Rmo|8%WDfuSs#0~ʳ6\"DfkQk'EMj;z2+k8:r2wBE^q(7, !O.A͂>[֋WYL`pSc H1ZUe3Sr9-YjOI6BT<6ӄfW%P^ v$>1S - -FM- \v:V"[VeoEvm a%ma5$S_>mOipWbƝE%rU?cro&zL<W{.3-Dz|M[h `|#_jZ0&D )T 6g$ !V|k5&jSG^OBnj}Ɏ'_VWgD^?רPM~P -^T)!gسfd"xzMȺv󕫫6gl͖b!r4Y|[XӨr^7dŶchφta2zǸ;/Paܡ-^[yFHbXtuo[PoZH#1V1SVQ #|fXy Rӳㄟ -"wGEׯ1%Wv,?cD-h:WMd9G"d3Z$ntQ -Oױ3iT{]n9"ree-ki -ь -L-Zhpź,8Q>,`¥@'$irٞ -Rb$ET|ZHO`)2!FО6sR>۝+ﮗp -M홡7PiqUoZNz1Qe=[lY[)<}sG}˚I[;Y"ڔ>h$zHySBӱ[=B{^{O.$b eiK`AUϣG=XL8"߷SwKhrnO*%ޣz ICTv {`¨JWagZ<5v@TCpl/ pDNjwј9 NJ tsY ϭ)Y"&-̲(kv]:#S"7R wkiuz֫!-KV֤ev>AZbюdots$F ǒBB`UzL^C(K'졷])Kq!p{b3`2ƧAGɼ[6_TO})irl٭"N8ʠd<^Ro%{/Ia@afR:/CaCO_v15 4^_8g% 8ukLX ;pPknSPJ y)^nv"?}u|h@:@D/׆nBCc<\-dv:~a->OBz'Cjri5`&ZWF3_;+ 9Nh}e9 vݞAϸ -2j̸NO۟j Bn߮N47KzZIQ6k`kǦ?ZE&;!&#×KN Ϡq.o&iSxc[$)57ڻڍQ u> endobj -2150 0 obj << -/Length1 727 -/Length2 15916 -/Length3 0 -/Length 16463 -/Filter /FlateDecode ->> -stream -xmyc.ei?m۶m۶mim۶m۞w;q#&O2rY;H \T<LibBL,:fRRa'SCK{;CS. @`b``!;x:Y[()eXZ:m,-9JWcչE RSbH1䪮Y/@FWjlA\dP :E4uMRrث&ŠEBo3#4[Ez-Hi1.O{syFe o@~#_|?k/7f4 ɡ42YK*~q#Mv 3C\E9]1+O,_ +»!d -)8an{: =QM^: ym##PGжd')|eole2HCd.:ACV*/ϩ0#jB'i(K]SgAdͯ+ XMƂn u:wHĮƻ&ӜUEE ׂ,&$Sʪx`m dR9Ee!-3( ok}rÈ2?[Dzp]kEղo?иF~M=/M_1pꦉ(yA- ^Ї˟z}͆4֤{q'VnEyt Z@JkHːJ/CCN9?FTP,)1TO{*f+W!9ꯞ^ ȥՇۯF R޾].%D(gV~N!+3:]UAji~G:/l:p: [o7^ǫ{["JA)Mxjb5haF%Ὢ vbVܼ$/{݁gZ1Ć20OU;q2忱}.K?:uF-53æQjɂ5dHIYmB`/I "\_}S=GAZ4 ٍxh[6sY馸Vܣ(驰pɩZMtSq"C'F+w%ӝaBҋ4"{ԉEQ;Tqqyԥ-xVEVk+¯dSfhfOjզ -2um^C$mLAF$g'okX9VE L>-i3z] -Ǵ ]UYajR{}Ƌ §ދ':J^#dB ѷ褒eJ!1U}Fsj5~tҀt ,݁N8H\RZ ^#C7:@1ЌRcB!}n{8d4&p_aݔT)^G'̻S5,ݎ:ܡ 2>m=Pժȭ=G ƋS ,CKegJ:xr$=TmR{aUU-H(naoBІc| -:9vI/y Wt"vދf+B/KՖZ -09ߛ(Zf)*,VH4PX#}:j͋c؊(A@L3#U"H|C.ώ5by*Qo\cjw^Vߓ3{݉5 +n^q&,]&5]29W -#^Y95jQZNY$7̝:[|fGwYvc{^j@]f86R?"q/4f{/o7$ǾJ?4L~h^ϱڠ'~#`7tdfXȜu:{6t͖-ܰNK#sgyhu9\no(4:ڤf -53Zi2Uޑ<?Uȿ;A<RJh J2"]1O!dIPX#g Z16z!^ƛ_,y>ub0QB0<䈬 RWhBMc9r.kc6͗nI7oƐ$g$?xgZMx]A jaftߏhF:vBYOi2F-hګ.MY guugs"}oxsrO~i}edLGp4gҷ C% )7]o F09u,|~&P lʨ { Q|gnնQJ[VG -nI !zdERܷr"gj|Ɋ%.| i%9I0+RShmNiY|7oCV}6 >{K NFCE5 QP 99wsbY 5+#?bER%pia[1H]b[ל18cN s2>L_RG2 WEC6dw&l7uy$& (jt[zxяEݸ5,g\ 7s"@Ʃ%h!buCP4CIx,_Ϋ9ι>͢#3y=}O\efP0~swsJbVs$2pA2!"џrcr_>j G˱cylt,Q|jAekAZϞ|ҏzc -ר nn\8?45VZehI45Z1G>Vj1y. ` $%I0d ωtTKxV}>v6R.6vZNۥz2Ti~:l"=}eVz-߇W]:7'`#m m?Ko2c9IqMG/2Y|(k g_'Fq`˺vޙ-6"6f[FE"$k qA7z7rTq1hʇFE±hm'6o# -n2}UA&`0lX  7M+tɽfFzSgT#.3ϭ/?C(jvR|g@2]Qd C0 M܀,V\[ -uT.J%r50޻\a)Q"+. f߫ x5_GMCVhkv4{`*+5#S1I#E=4Iq=A5bb.f"w{J(^[APH9p7&5%qxz31ػQN??EE%.wPERqӊr yY3}[pUnN:eolJuXèRp>WmL2q܍/R ,CO -ISKH@VR-a%= *HV]w>S#;<mv֨l ~?-۶Kl]&v0z*žZFЛ=ҡAGʇm) @04K畒/`֪6\51\|G]@:6jRȳj ݇dC<_k-Utfvx7cUGvsJ 8c@t9ʤ؆{Fқ"z䨥m<\L?9b-lY3-y -{=va?++V2_* nѤ|1̓x(&R(dhߧ\b,ݱRpNT v$e|ĝSAq@#˟ h݌h{,M0H<$8H2ibi,vkGVj4{:Ȫig'dwIKHˮSaI8.+;$G8GV迒ȄP{o))u9q=nqFہL7{r-(9[sP[U諷NX/0x17csqV2(>|7pȐob~>]<F@o!mPsd6Zs0&Ƃޏu XcK -158pm\ՏC/Ї؇se81 7_̞FJGauШ!m[Z.>!5VYR !BfRjT`Ke~;ie^Mtl.Qx{؍,FG8P5 ׫t৉uLNHFhy5rq(ĜtD^,̖fz -΁"Mǎ?Pe-t57բΟ%|{pʠ /X*Nt].ד"&|S0!U7lcE##0R/IĒAzd%B_}(Ss{2ۢP -G )w -2m,цH hճ踹e93+gF@L!o\|3j6`#f{*Zbx\$0JH8T.-W4 4YlO8!0{vC͒)5aUӠ,G'؀%r-dv1C\RYmwHV0ɫoxymRϡQ| -Qʳ|ó_ Q@:=5S4gi&\]y2n@Y>Jf﯂}R>ŗ6]\ -El|Wiʲ0xp& )BB{;OGg^ưFW VqڡO~Bdu^odR_(bvN֙PDߕŮ #MQѻSpr.?32R4NGI2ɲf3,9*F]R -m6Cėf:2m#L+V/RJɑDrNL~SLuST*fi;0,;k6P]'mU3*m&` Mten{ؒ'Dq~)VPZk;tLkHdM`&y_I?6!KTH*]Oiкk#Ψ@}fl8($e.G \s|'WR'35:؈&[slZ`1xm[br٢S&>MUA nuptn>E4H$tW?Hig ?yLT`Z2C!T Qg]ֻhEv*Gv1Ca-KœcRяʇhpdB ]@8` #nȔ_"f1~=U "K`ܓkt}!1qǑ$xy桡RTTC8m$e p@ʕh?=wFTwxhy9.7:Ҷ3jOg_K*i2'`yA6B\7M'55/b2uo^,o聾b }3ұd}SIU' {+L[ɲlZ^r-Iٌ:c簢Dꎯw<- q~_*3U)s.ÑDjLRJ[L@܈[}r gTq=;+0 CzHudN:34?Kgn s%ľ c)LE|qtOpz' #Y~y[N'Tx+_Kb9JyIQC6adMKiJh+,6M9"Q{+"((Pt#f6 Z96bFSq2t pwqs -qo-ϊCٻӔӱ,k;zmMHFd^:̵b@G#m@+1PYy倽!e6JBPr.htw^}1^yG)Da.3iB 7&W97P(y?Ivaẵ@;;FF7W`tGɺ8|흳 U1te\(0B -4a..(d,F8{n,a0BQ4K \q΄d<*.ER{!~nO[H \J.MAR?$x߃xj>oT[v"<9IvGQhܡξbגI"p`oy忦v\"]zF݅h8wQ:.w~ zv/,t\ -(~4Ɵu5m{" ғEvGnL  _xQ?/oYXx e[I-FD>pgQ g2w·JN߫OvFCqm1&Ec?txlWiqq˧v]a@vY{+#x=y}AWj<l7Ҧ \kwllr@(:c;'tXZݰV3ޡeVgWhӧS)P/8 -uJO9[U&XaXF9z)@$::B3êJ`;"A (c4 3W1?w30o C61$`FGZu%)1x34#׃.10a?`v!~Kr%@%Y_訖sfy4YBQqV!)ثM$ \:DaqDl׎vYnWSOLBlObh/ˈѽlӇ3Fxz8W\8U͞18x0EkSſuq¶=.ǸB$ -N2=1rՠuBWҖM&={O)ùmڪsG+,kM0v|St9Wi5kIk#%K?8_g'.w}*s>P'xהo6-Fo|y\V'0J̵ɨJ;rqt,$Q|&[kdI{Teny~/:AwpނULhcOa=y {ģg$Ӂ#9f}L+HP#Ұ[::!pK*th[}@Y^jz _JPpy.4 !#M,fFoBL~2\Ѫ'ү tTpnnD(RHթƔIǴuWqlgQUZUev48h|rۖw1uxn&N26+^1AZ 0UMe\x&e9ڧćY~)3ߝCQIݭ2ղ22l]9+K;prVf㙌3>(4RQ 5-iU/ u'ZYv>;$"uꈟn^0wldANge=Zެy֟thٸHI44\paV-.W㎟DSߥ{Z)V`Y2=3QV~NQ ovNV"Fn9EIqKp؈k_MWQ8)F2F!G\D%"y&],HuVj/VSz=N@m~-S`Xs NStׁO\hi:T -č.. -UZ?ZIҙmX~`9N]%yEp+c24c=䝟ɭJXD3@pݐ^=G~dc$ný 23, -DHPa?REz]¤"OO% ▮ j3p !Gݝ&MsA R?~L}Naǧ*8- _"t@`4V͑+$R:OsOtʠ.G.ul "(ǩWIkPu /,C|w1\BJhGňf%c?&51Ƴ#QQ=ܜZ)G9ySK {Y KiWB2!)iԲ㹊n󖥪.J{1Y/D릉H/a]Ť"B@:6uV":DSi7Rz  -Z>qڭJD̴Hgͷ/cgn&oMc0S"0h wD=.ʰ۽1E5x7PQR8Al5 dD$]#g!RqY7>^ +k]}*tzf `%&%F0v-ϱKG<׬#+t#Nd_hj}f5u0۞x=o*oGǿ*}9zf{x;(lLJEĸ_Mm:gTm7^h{Y eW"dE R$/sK1VD%a|$ Z ܼ`ޱ37r!D!Fxךn5''!憄GRoWϟAw^@EasuXwa)/]| -c<~a. ) kBbɐ -?hX"O{p> =*w@X'ujS(kGTL7!iŤ̇#lP^+Qע#;wˤ>^!"IAd/tipLm7Vɔ*~-Hq5y:Y?Bz9 Y9@E"ggf*=m'6هQv޲B'W40Cʳ>K5C0r2Wr4h  ss ֔2b8/. - lM% -b oz[*x7\#Di%&让Sʒod-bŌėXL3!U?4@M>RَTZwH/bj>u|g= =oƋy<@o@P0FStU4:`%=T ]-FA -_!>\f|W/ƚ'. -VG[%alALІVXbGS$ijC]g6 YfRNfj5S>%XdWE͍JHTŹNV9E?p"/#Hf.8 -n-R^9%[ lvwYo#_]{}]Gؚ矿AEL@nQk=zT|.B tG^-+-왫J6n.A1[2 9c$551HH8A:1G,f<3}=+X'%dg-F&RF@hTʑ+zMh=2$PATdLfĿ:UEeeiz3o-eqH;m#=(gxqOp$:l1#Ņy@Gj6SJAlq_|mf?U]7+KGzM3ׄGs]L̚;Ya5`(yߏ~m_+T22;wE2(Wj,7u ^h#`sFyT0Zçpg'PGԏr^j96N}>ePǮg3=S:!pDB}8b/{9wN0˵* 1 58O֌q8`%`XJ?ݺAle$nw#Ono|0+#B[vR i̐ P -!H!ײ -+ij ;@~^ ǩXYn ,ocvO~%_pbaiik g`Z>j&(u9Wu"_sZgJ"iÆ/o%B3ZxAm5rqwߞ[cΘocN[)c1eqDX:HCE`Ҡ̠l%aG%w|e%is&XpS 1_T|Ε5~+oV/~O6(|V#5²5!ROTOM_-q 31!0Tϼ[5p5NG_?PRPB(+kKWms)U_6*E -f)b'@kTinAY҆rʛ1^70옅!t_*S_skmXxT\2> XL!Ġ~C=ջ<8Ӻi$jy,: - ^=g8\Yƛ+z0L/0V!8UЈƑ&𮬺 o }BsjQ;!ĄwY<&d7QsuU};_%D%]!Ʀ \ -ASaPQǸk{.4jLXxl6g iƵy0EMdO!b(\$3nyɵU6,N4O? h>WXhOP>#S.dU}v#;;|H=>4-y~fULb}noV7n`6&BN:: ݝ_c6@ބ]K;K:7> endobj -2152 0 obj << -/Length1 721 -/Length2 1126 -/Length3 0 -/Length 1693 -/Filter /FlateDecode ->> -stream -xmR}8NJD+4|3#+C2!D3}gN|dJjYqt\G҆`[}V"I- $es]_!x$Q6jw20#&ˤ00QpqeG'GQΑ DP"U[-ҿ"-j?? -aPH|i!t,(Bj/98,8,Y&@+Hq$D AZxXcq#wsnಋ?r2Q]CXӥ¸ɂR/<)Ѳϯ -m>ҵ(ԫ쫂>(IXg-+|??=eȭΝrJ`xyO;l.:[LwܺW~/aLܱݗ;ӭé!4|vS^nƸOkƣ^tԦF㗍 z>_@mCf"~jڝ5.W1fv!1d-_Yڧo|}a¦$Ŀ:\ -E7tI%ͩoy OzeO{,Bz"n[0q5xrbݹCΧhpńD6P8MfG: Aq7U}%?\]g\WʞR rcխyی&i872Xu4:_bVppQUyASʱC5,c*[8kV4cf037i.2]u[z')TSf&lg [S~O WEFV Ce#5߯kh_8aKQkXdYiS^ c]0UR:mfq8]z D%Q븶x()e@74MǀÛ f&M -4\Rfs*"f{Ee &h$Ssji]rkNYmqUVI_qg}-r;K+'Uޯ+&).4+ 30du|ݧ/)Fɂ򷎕G߿KdѮk_{6֟zMҼ.>3j6z;6f7] %n'-ے 97wiڒ} 54Ύ"N!>MwŞ.cbJZQVn/L >n'?Wd*̑Wo?8e.NATaTBhoi3& [^8:q) -endstream -endobj -2153 0 obj << -/Type /FontDescriptor -/FontName /JDSMEO+SFRM0700 -/Flags 4 -/FontBBox [-203 -320 1628 942] -/Ascent 689 -/CapHeight 689 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 430 -/CharSet (/one/two) -/FontFile 2152 0 R ->> endobj -2154 0 obj << -/Length1 721 -/Length2 1108 -/Length3 0 -/Length 1676 -/Filter /FlateDecode ->> -stream -xmR&!S襌 I1BI zȠcMFAq}jg f93#15?rZ1rp.!S{rʓNn85q|զ9 w/ۉyGf`v B(Y}DS"-ʈ}O _>:zKokGڶiV~XZ֊kܚC'wzg>xj]n"* vXxGBӬ}DxiKrg^)x#xbhYU 3̴} lw}_`YJ^s~gEwL+5ɞ wIzhbx#Nnҍ{ rn%2Q>߰[hs:".i-Ƕbز|"6وR_w;tpۣEd}X4;䫃x] #_)>΍q|3}_} c:Jcf`?iNIgT"ڜ®g޲(aZ2wOYm^2+VWyڏ 2yr -_'vS>Y+Bz= ]p‚bԢcoUUE[Lc%z:ݚֹYCͣ| |iϋwZJ-uTRl~9N\P4|c_7Fz4ں$Ari亸CEو*w)_zErd-9MRخt`gťϋvw@I*$-kݩY%a5>~8CU.#GP{XC!U`]ⓛ[~Y_2 Ō7[иgSmc>jڐP6pNKR^LLrKGt\s}3>މxc/^6ݱfҸƺ*bEDԹ.> endobj -2156 0 obj << -/Length1 721 -/Length2 19156 -/Length3 0 -/Length 19728 -/Filter /FlateDecode ->> -stream -xlycpmLLĶmvm۶m۶mMlcLλ>;U\^UwWW:z*rLFzX22G34LfFF&X23҄A#@*BOO -p6~YX" -ZRJ y5hd Pt10ZmT_v8;[Sar7[W?~9TUb" "#[S?NTMm5-,k,zX&&3hfa /ޤl6uo@NP!jkky# R3:ll[edcaRF dks Y8[M-?;ϾM-\lv.^AVCRYJﴘ@.M'ﴢ_0UrFΎFɃ_-W%,lEcaf0X8|\GG g4X3 Lk +6ko_ ZO.mѵL%Cڑ3M\ޙ@q 70;OfR*(' Aspu}\M0#> yid :rekXh{ˍ|=B[@ԑz"%9 Bx8j@4h :\Ԭ<-u @ ٗG=j 3!FPgF?7A #b eaȋ] u硒,!! - -N+jlSQ cDQ`ʴW{?r?;Ⱦ  IP1.wj~M݀ȶ9x[m^z ƊxUԲ![$bnL LUYcDžLL,PF&tg0Ii;bZ?4s_B 6o:~4!? . Լ"[G$O elm ,yiɺC=0?tOe*n辟 W\ܨU< 8 ꧀kPaAiЅ]'/Sj@/A6BU0%hg`hIsbAKִtO bin)w8kf(CSOXiY|^AU.>zzEfjA& +ŬsU˜zDn0 fwU@a 0EC"j4j1߽}0{JE__aSJEF0+S9ntv,sb,'"]LQ}We8Iԫʵ~$w֑) -)SJ0aR%4(jm?U)QuKsAmA\(r]xϤ yx$#Es3)=]ced:wE$WI5A ٤yXN+Pqtݒ6ݠpE̶62nh+'](Tpt AU&|rnj(=@/^Xds5t);u}Su0(6j>iP19/f_k&.^ bލ5zp9nѐ7S>&?_]ף󲗃x1bNd43+rg`6ypE{w}_-`[/{6(,ɔ/1K^qt#oi?qF/zDg/׼;k?qKpq&l }]/å]eF[/er[g#$`̐~FcĀC_' @9)A&JΝlp$kb, -$z@XBpC;uLD7vVcɡ| Î0Q6-7v3͘+~T&X*%37ٯ!JGDqq6P%n?ٽ>i9һ62e",$ .?tv:aI9C}'䋽TY௿ eTWPk #˲BĆ~=0&7jɟk@= tdo_eHǑ{-*2u?WH"}F]\=̭tb~RE-d!^-h"OeB|~XB$SU`A1=zI"I5ifv`k|X8<tg3x!p)JGmF1Fe?= 0UUc&nc{\Ә{CphQL`7}dJWd9mHʞa*99ؖH2̐. }e "u:N1>psH%XsxDSBt|_!K3 GҸQLdُogX:Ej36z4\']! -^P~RPk)y MhҗF^SPƾCu -1LX`Db}>~>'d~{(ngZה@w.5 #=gQU:1D7h%hO k;f7 DIHN(Q\F:w7Xϗ0pZyqi i=dJ?w@-Ɠ% q+f<_BeWɗ5$|9mų!- |AFG+^L5y6q)[ppe@&[O倘ؙcŪ Zz`b+t"&T$}QӢO0U S>7RMFՀ=NdE2*Жpf+=e3,UTQ_@tB!#=&:&UjO,C̔"{ڻPP|H;G0)st[%gQ -&Xxg9˺ ԯA-:t)AqᢞLi6g;22 odĺQ )kq|fO7OL?FEÙf7s~o?xyK:K ݿo5WIv< MsņpӋ ̵{0[eY͍1:yV!Ta:{-0?W5R? -SNDx:+ݡL9, -$Y s -lmG${ h;AH 12H RInG$`XM3ͬW @Gɭp*>?jVSo Gs[8cNLHYWn`/.'".L55-/yl f1#SĚA/5ssS5 ?^Xd:{#UERJTp3@i!J{Ha y JU yLVa F%dv:D*!b|›a'BqzJ0-Pơl!qiyKL-FB''7r%ޫ6i҂a׬ܭիc/9Aӄ)qM9wH8G@.`HY>߳kMQEy -x Kq$J"ݝ(+,P![U\,&aPec wSj;]K7[eiD8㚄y,\ }P{%`n̾grfb"߲,- .b(E}`-R/4efƔnC&LaЦm ͔ү8}-I̕3KS5P'oz̕b])RE=t叩NI1>XU?~i؛AU#UJ]URl.3 ŽbIh%fA "Oz$`׷ -kdT<{f\B/KҡhWkb"ދ*k H0d!o3Dv.E \xZ[uVfi׾phN}|U#DZi32x(}$ϝ?[qB`O%$%7˙zIcO| SZS1? u oo DHo ۂ~$8Je3w!`C3C p'Yks%ಜD2N9mD7j^9prQ^@-^{^"iiQQB>t") ^FG}N)jPDޠHw1"B&XfKea0`K[}!ܖO4[J2}#ո@GD'F-)mD鍗aB}.Jvdknu:#LL a{| ݧ0n!GvN9Ă:SאkQx04?} -I1ݵaIz:ϒ4ç3BS^<^(6-]&OI2YhI'-eC(֕v&L]St qQu7(b7O *#\qP}nK/W&vJ&qL , _eY寵BGm¡-f' ^gB4k JcJm9=|))R$e}6PSG^ cAi\$:yPjdl`[}=)v׆^-,KIzc@ly -zl@B6{+:ģ;MvC@ۨ:gg.F -(̪H-a;eI i+ҰF F'f:Ti&SM)WacѥD78w>lKRנ'88¹z~e"7 %$ˈGאi&&4)HOG{usgPl;\"x-%ZCmf|[=`6W"UY&gl5 Nu³v7"tT"2|pUe~R/Tw$4C>!m $>bI9HU*2869jM4+u#Z~6:ӘI]N^ۭ66CR۬6C{ɲ -o"=#Qfk8oKP4A|;SU -[ffH{hB_˄.iZ6M.aڤl g.epCˍSul(e%/eouozN h1E-엾ܚjHmɚ[ # -Ϗ jB/D=Z<jDm+c5e2  "sX+薉lvkZiPY5me0NY :JfSK<>ed3dEekx6\ZEVx0nEs6BI\3R?>yL*R7ڮn->3c3[Rk!C" AjXHΐO$v[F:9FߐNr\X|MNӽbY1%&5 /F6qo݇ қ{qr]RWF$vb9(w!5q )/jҹGwkɌFivr$4:B nN,3Gqbm89ikXΧ Ύ 7xBopE!Ti8õς! #-_ڇR_5>0yUdkz(% =ĬWYfB|bfԗ׺(50x E{ɶ.]^PQ6_h(Tʇ\KJyZ5=:{>؄F,q=|jLT=|N]ga!9q1{@Jc]ڲhwr}Cz u4krA-_WKgBR=BI!1^z%A>%#Ci jϛMaI"C0hmBCèdد(cט@E$?Ë}yBvR䇎6-h]mΛҬwb)wET~2L>5`e&8tg~Gr'd8N#7p("yP@0k8.*~Hz9p!s\9F~vYRO,?V;?D4E> {_`$eW=R*51?hz@7*e vBo_$Qn;TܕpWLʒ6=U_+c$X`H3 -|2i6v -y??l~ۓaBJ $K3(61W 25k[PLzV|%|ʠϦ)NWi\q:1\: 5Nu`UVUkU*45"G3-'ُ({" kWYd\BoRAMvNȴt~BCb~rh~ձMdoXSS#_2d -'7EpVoMCŐ{_s9ъ[]J8verJ*2(/5dPvkrqMܫԸCպ.Q=_6X@d[̕a},[˨ukb(cB"Pk9:R=U^e+䄴 -u:ߋRWͼq7X|BatƠ*/Oud !$ -|Ʌ\K n~'Έ/q+̀-ϱ aeLW>Nkfa`tYm7nx8~i<*wNfgn/v}$6Y_t^Gby2EKFt8?5<6ݖk%?]q]pAӗW\I0M}!G|>$ȡE<:v2V? 6~8Nm -:؈|N7LS n/";Rj IceuHm8Z51(7k`wD^҆}pFTbRG\8Bܒ RxVH5` rK[Ēuo~rfWmxޡYX -׸i -uR󌪺#A6432Y}=fa #Aw -&)=i#([&-J8 t0e>|_0% wiko:Qq>:'Shx˦+_"=BV٫ikcH VO|oQJTz, 6'J76OvpewcV}5^GMŌ1Y$!~z100ߺHXݱ `Jca;$4bgD*D[-5 ~";+(7ЉޅUTfDH mNY0/ -]s]3u% N?r +`%`:#bQkfe= KTɸj&G *:}( .8mCaĦٖƶ)h "Szl{ cQڮbԳ_uR #3τ!ɟ0FmpeE?{$2tWcƢ[>ʹ\w*O|X֡ -^Pثyd@t?] i}jA{p黩ELOU-m`Hr:5CMf9ȩV5SWќvҥݗtCzU5?a}}W^ ۪DZK|~O&+m5|?IL]ddi"LU<^ql*3t'ߐ'նAֻ6^k:vZl3lxn//,0X{W^TM*ؠF;=j!ɕw_u W34=jrzPC]y5y> :w?TN洉]Ϣ-ИXrpf-8w9IKm-R#5T4U@q=g74jL7@z2ohСZ\@E 6_sޭ;[.4Q}|v=uø(2<\#,ͽ)$fVK2R+Nfxf W͖M?a0h5{;꛲dc7@cgƐ"078@G -'0|;_6zD$AAAEG;a |Td 6XkQ'hb!5/弮K䅻L-Yk''s3V1՛GˍzIc?xTBtEJ_ n tFt daQ'?YP#. 7u3.CL+jն9!itOR$גy5Y`:صkx}<"aĥҞLV7!6'ý]z}7s'qz"TwZC҇A "b9^U s=/^[n* ey: -d+NʭY"rՅ= >CZAulUk!Z׶cxzM| -k(3BٿƤ4F,ﴥ]w166Ps:')[Sr(L~ xWitԍF'ݝL35OBa'u tJ-ӟX]ZD^ǐ_KF:{}C~TlN[Cy[H [aWKS> c0N1}o\tŧUwg9# < 30l|Wm^ -N)+r`pc~p. ,89vY ֙S~Ȝ#OJ?WX\z1Fxs.3l902@&J~K1~hxEBݡr@m}BjN|N;!gz=zm83MvV-SYOȤ)e= Yil,n.͍Q)fݣzRѴ/cݴ~hdETmRXs)FCŠA7Ejy 2ǃ~$PD5J Alu4O97WtQ7KP9qL-ZS@j[m~1+ܻxXe#|vz+Z;zW7#{a@;VXb15^H*( @VS=CG&V9*iBFLK-ͳBx-!.LE6` ›r\i2E{ Fu(9WUy]zԀ$'8^{nј'Lo[Dd֣FNa/ 4{Vu {?t?HtAC 3b,)1HJ3}\Rd'$pL;'Xӯ'ykX},hK~Nr!<ܔQ8X=g.T - X&xzp`y塀dNoLyRP -Lvִߑb%Qn5!9:)ĜnJ2E$H-O(dm'v YC<1Ǯ8fԬ-yY[p6U!S߉tj- ,~ijE^:Քp!p&x-cDX<[Y2_z-O[bl6 -N$ cVb+wv.ZvHc|*3w݋/5n{xowf{( NUyv};Vg; ko캐|/P$K-GM:r1C-) ]4X'ӆUhp bg*k;}f@2 E_,;PU#& o4Ղ$! 6r|l&Z%L+z,5;cSh؃.5u L;cG2}/(X4Y:n)\q҂?cƅosQV;@`Za&+Ʃx6~ncл$ @~P9AR.5gR.;9 b/DjS )2ocB<~titjސ+H[asr-?փ'ɡwr~N ipm\Ϡk8@KtuF7&-;,@7d;'"V. -4BT#x{Ia2i03iVjYƏG/4,wPuBvG4ʛŰ,:kO/n +uoVЮ崍;qQuiC8x D:~ۗɓ8ݥfPX3.&1=U$ECa^ĝˎQ<'{y-uW` I Hҟυ]K ]uĊsf1a\[5:W̦Kz/D5~Hygk#߄ޖ}KL3Kդ 3HLbIoJ@!((#χ\tN0nD<k$SmGL}/#_Ҝe48;0徆'^j놛KlRQ|]g? ˿J3[T_tHQP\(|SZrik oH,]31'atnVlz Y5 T}@Y/w=JƑT!M!T$_PjgWRȔb?$皧pJj-3ՍrTl ]VIETqIzܺ_Mօ(9U`uMظ ]:paxa#qd]&MS"~/볁N5 O%uY0@7l Qm"B{zȮO:= TMX'u]a9a!~jEsku8+jFu&=3O 2%&{Mcj[o]h5(zA)ؒ1! ,Eq8e#Cc%ωoT K;lw{EZ_s$]wirq]j[Q֬ӍIJ=[9:q}D%/̜KϘMfke{RNm'*;7 ?_s Z -ɜ 9&WsjzTm5kaӠ)oGRW宝FX[o6e{'_xY ,SS[*2.HJ 7GtU4ܪPˮ}8nX6لA8JDa1C$I lN×ȘH}]*ovx[re7]De R9=7ju9 ?؟QK#0@xmsn_l:1Ϡj,ns -b ,b1dc3 čm$'h\QK+]<+O -:9\y7>peΔ 0 -ziP'|pfbD,LA5RBFv3+NĢJ rk}yz 7 oveXZVt&iӪb;b9>єp5*WP -&@6#tmkI6o/pqbHNoY Q%\( Xt L$=H?gEs"5P5\}IJEIt=Є<'ߞJZtI2N&DV ejU?%g=+,AG>@X*e*^ܷeD}זʕ#CJt>7eʶp%7}rDS8_RHE꺈R!~>lbK03/mLi"p*ŷ - D$Ϟ+N|/XD©h=YM>մĜ1`1)ţxw,B'H)o)[%ۘc``Ykm岈")XKJ`|96ᾶɷ &\-,$)d),%bGLL@{^2 _M*`кxːU! -i"5O<_m:h' S)zm}Thmk[)T4V+c|H-`jA+<rԾ{O4)I03`T6Cb51:*9,c˝ե1#?B}bnq0ȉ LɅvln50>rrl &hĠhGyq%FY_j!&R_V{Ӿ"Ђ(5dZ`+]Lri{ 5}®0#,>B]djM\P6qÈim3܎BI -endstream -endobj -2157 0 obj << -/Type /FontDescriptor -/FontName /LWHRIB+SFRM1000 -/Flags 4 -/FontBBox [-189 -321 1456 937] -/Ascent 689 -/CapHeight 689 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 430 -/CharSet (/A/C/D/F/I/L/M/N/S/T/U/V/X/a/b/c/colon/comma/d/e/f/ff/fi/four/g/h/hyphen/i/k/l/m/n/o/one/p/parenleft/parenright/period/q/quoteright/r/s/semicolon/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2156 0 R ->> endobj -2158 0 obj << -/Length1 721 -/Length2 25762 -/Length3 0 -/Length 26365 -/Filter /FlateDecode ->> -stream -xlo_-ܶnk۶mo۶mܶm۶o۶mw̼/rUWCJ(fgaoHHPSedb`01Ð -;8[ي8pM&F&?FR3ˆN#@*BGO `jamWДP˩MlM  -.F #['J#? ſ89?Ll*br*Qaza1@Ft[g'&F6?Ec02-&f0MCr )&] lLv6.&Y;cG[Q6t6GA[cIXM ~uE?&OGl= EE57[ؚ ,3=%i0;@_翖C ٹ{2rh,8Y|?t\Ml-?wA21q71Y[3Lm --2kk[ Z.iֱH%Eܒ5NXGr 3W=^ѣy3*sa>8:*Hzf&뗸&d?^̶f'yY,yr([&WRqON"Eo2J) Z 1> 1Gނ - 1 pi SMF כ]7Ќf#fb~[Ly(uEfZMa{_{"A7RrR}ē`1lT: -f-N/Ov#_t?NJ˛3mbfdY mL>MһY-~IL,{˰8* \)l+ݥ -` -+<%q?+6._UT\q6cݥK*c.X꫽g^Ɨߌp>*(EYa"*_eWf+v=otqv5}M cFmo_68it2gYZ)vc 'ҖS:;\4AyѱrctE0,h`ݖ8:D [6 C[0\ m⮽ `e=ܛpV2(ev+ѯH`z1SPDido|YG-;K0f+%s\{OX|vuܢK S*K.M<YD2[U7 >'jȄ&K9.p2Ӌ3כCTlcGa1e4D sJ2O!,-=ձ ;hA~&tq] ÂL&jmbc[=+匡g'>AT8GPzJRK43z%#j#!2,}ԶZ!a+ialg%wk9zD! Fdf,{ t;xk^ -HɫNMu̬]zkOU1Υ:e&H.Kg7[B :fHGdVaR=dX~K_G'`bH.e -M ^'ӛ(o>G鍱aLJ+{q G'sɔ2k}$} -AW %>Jug%y*P{]PD Ye &6 y)jFo3ʜ;ݛGnik_{X.#v4PQ8gUGB@X4,26ug7'X>qB'/őx+g|5&"iQzɣL -@O=MpO!r!oł3v@UCtbΫCY Jm药9ڂ|XHܞfQvSIE.zX|Kq4s%$ft\cYzDkqNC݀K1'$˖[*[I :z!nKQ#R3 ]CWv#mlh*sjHTze.JkmkZ!X~ Hi>vHI2Сeq筦:nEd66b Kn"+_lC(Iם]\1^X"4mv!K4%f/?gv&{ -`ۢsϹ˕ 4H"{rE=|g6J[1AE;6=?vy:֦bV'$vu@] Ϝ4<bX'CޫkyQ#~k3%inq{EUHػ\Emtd_{2U3q6PPkajD4hV·>uV iuHÍQ FNs@-΍WXbEνɼ&6ܶy\qϯ tBj_u3q<1(mK>Ja"[3'*-Sc&iߠ]LQZ{G8 -j 0RzWHX>+-S9-6^R\ W٫er SCFIEQ2zc|U>o.!6xǻŅ~e)K`1 ..uK՛bFJAiDrTm=VIgZUŶ D|8WKê΅MghhE~;J aOp\ 3T>C霗p,ϺW4rيB/D`n#~K#BM&JD7p?bY 9 v~a-vwTMJRɿo~$>Z r#* iW6(;=m⸾Q<'K5XXP"pTU67*T$.K"&5#안n) e_zƾ ئej'3J-K+r}wuJ3e|ZIŰ> ӧ -s<.Sݩ]zCkgxtZ׋_.zx)cބMp1ay(ޑe#'@!QR;@w@j/Oܧ)ѸnMF]k{.B, 74dp8~#&Z$4}l˅G)g2;yKͶ<tޛ) -&^^? -->5ڧbT1˻!\N95B~ j̀P1;ϫ),ftI"tTU`04J42l@)g7xjg=;_ps4iqX22' -A+>,}ܑ$!}:2+Bz"H;vR_^ 'bwcvTĊ#絔YۓB!ЧQf zWjY8''vebVv.*]j0 -LU6#0Vz°an ^v. g"FɬG#Ti/7h*/f*E&bk6e{T@ڞgڳjj杼eG+x!h>{6xBc")GRvnO~;v e xrģT T0Ip`wx ŘU$.ow]Ū`˸s0drN46l+FgN1/O0{Z3`c#[JFq% MT+l(^~!u!oZ>(9_´r6 -)AAڤ<^Xv~1kʑVMHHo%roC}9JX9(jEzྔ]IlÍs ?G^7v0%F=@x׭~dŻ3hjt(c ML'WAWO -p]0##ݡvPɳIp 0-8˔PDkHO^Gs x'eb#ӈ'0Hn'& D܃@|6rr8L k_w u>=T\N&PU@jlL{ZpQ-f49&|:"t"Z/ M(&pkrp/}.Sz%X[k[GZ3 U+=s #7ro4zGɴe&dڟxYrd /QX;_C:- Lz -a@u"$1fezmGO+} ,JCTk"1) -|;sX .$. VSk2)8nd,N]Y~roU=9[7h},>-}eq-x9P -QP<|Ɨ6MRMۋ~w:E# Դoni2UUj%%KUő̺AlO R@U]xKfɘ"R@6##zR*/ȁ_))M\y ĽZKmn/fv\H @Fz;La#^#5£S=C`?QXUSJP<9uSϢvdx9Ѳ;¿žc~oݞER3>NypRcRml8Am0U!2'LcPrvR2 h|^Y\d(vf+)c|5j|^`.scJšMAA~]h"m{ՠTGR`w45`dCX\s#[2HN:e^jHL,zAh@Zi 1aE-5Yp+kĬC3(q'};Б[j|mҨ:rn~վisj/LiwM:3-i]o<6籫KқBzy{_2mO~-2eg|ܬ_JhǵW }ahyvǝ ]ugƍCu߂N jg -'T\Qa#轗gyCA|闷R"N1*^8#՝} MI !zUShDPfbM>}ZocUŊH-;B#Ys"RpQ~DqV4*Ԭkr<'q"Cj( J˘٧Ӛêo_KQ j| -~O005M7gP3m*JV>jpo=Q590\ReRN)B[4COi@li:;[9[t?J]Z -զ(Ieو;!Lkb8oERZ {Z6-+Q:=*.Hr4,r%$ȀpP\]]KEhiw\p)qN|k%d#h3;E0Z=^ŵH9}nmE]d %z{4fVۅ0ndޖitAijyTp`LjXFXeJx O}KhJ8FuhС7DVT$))5A{d5uY -h$K7뉀< -&iQ5~{~~['4>z)ۏƍDX߀AHzwR'P%yĮݚ 5kFcl'ErB"QgJ4+w@0(;Z\D -i`V4# ϭ -c+瑜|ꂄՋ+77N0^1ÊlN4߁~P= q`n+:(Nϻ'טWkLg ҡ*,Lzo]~.BsGmo/2H(k(:$IjA#VӬ`L=y e"\'{QdEF|GK*C)'Y=?COiԓ)I h;D)+I+"<8hIb{NHaY5BH.]K2>Е<ʞ1Vn(Ip#!`gP1{@ -h4Qe^ gZ_skk*ILN¡2\ÊNs -鼩AfkJ %_IiTqj4,gqmQ -HըC2đo'wݙMmxջ(ڑtlrϴkūfuq"Zx4'rQ=D~ 0|w`F۔ڼbys-Ko\1cx\s E -z<ף -:ʸő'r 7gHKn|_A;!*AL"Q lJSoQu8+1}g_}GSQv6s,L{MUW0TAjO>%I2k~>Q@~-AN"/ -;s'flJ<(;Q_0S[=W~wy(Je%H#$}Ǚ%2 {f%> Mpb\5b[h*A(B -~iTo׽[bK~)'X^݊oZ.iŘd1wnZv97/@j 59TŝC8>6M믆8!e.9} GAUJh*ǙAD]˅Rt08e$,Z1(]oPB('&*46Q1X<AN$e8']P!?M$DKLSRz0CNz\}|`Ã@;ɢ"qL](F"bR_)z%盳59>~􌀩$9c׫WCkdb w|遡̀GLail`p4ܶz*|?`]Ga{BoԽw[Whn/[ǝFGYRjM@ғʺ1XjBXoV YL%/Ȩt@Yٷ(ѥ'wV'.a fEɻMcib~2|dvbMbNY޴F'5 -xԅK +Q_IE{Wf&]` lOՔZ]\9,5>OYG_3VхBGrۿ5d#ղn3 z H  xNs4{`r0sWQ2G?6Eʢ-:w1 C6Fclp3Rv*krwq. 4;N &%:ϳ$ol㻙7E z?9 zso+ǃ!$*]#a^n,ldkUZNP.Lby(8(MCaQ -10+^NO«2 `}W|Ǝ%m䴜]3{'@Aюu·c'ٮ82o!N./-ßyeP`׎+=me$y,P}7 NejѐT!ܫ %VlRTZ?^ *'ɹ-Q0\W5g dk[H.&?Hc.7gW7 )ŸC8JR)UaHkiSwϖ]wdtKMAeONnt+1GV[-9gBRmBm:(d'O渂ݦȍN{Sˊ嬪|pA1C!%,]IzY#˾"(EwGtD~H$N0lYf)?! Y.D+H?'jwu/fFx;fn>@8PXRQ0_ReOd5ٴHcDlpU?괙1I "@Ow $%.:r2 0tE5ϲ  ,7Kf1[j~_$i% r:wn0Ь$"6%QR0<Ve{*};@*)nM6ˉ[,dI͔hK G/ۈ=,"Elg-''ʍ:HPtt)蝰 -=(l> )N,b)ˋ-y1КCް[?jxm#45FHZY>&CrUg_HOGL'TR}zOgݕMOSև F>DV< x -=γkc -LOjOK<-4 A}`K"^HTƮe&akEf/n[yY1dL<(2j;9vM-\ZoG:_f+e0ݍU/ܻN_ ]O[^fQQ9,pCÖdOţ$f]57 %eޖȗGKg0)6!dVM7͚{zt=αZ'rț|zt2_qd=sذcIp$Tfl,]z^sƈɐu 5'b8:nxdTZٌwx\ӈuZG>3fd"xG95T eep|xj? 2LNR  %s?00M־MBH{A<-o?ȌOu^Qv޼^"W)KOb-m^7o4AF렠M6qkWOαɓq[䏠KFx7E]1'ڒ+.}\PgB4eG> ;gFHm7ԇobm٠EۍZP̈1kS{e;]Խ垱ļ߬:N~p=H1xÀl83)9k@#w9juv;LbqYާYP3K+qck)H_󺁛ʞMgC12`MaF^So8p'4^qha} -p`!+Ho }[8R;E5qhbA' G%RJwX"ϰ:R Նt:wIZ%]*t7d.f')^̾r(m%UVBo sLBў'5dž1= 3BéƋ7q>[i=?(j*7f䔔j4~Pw$\ta.: kNy Lk@g;n6_Bnڦ\g -fMٟ\D37HK*x̽$kG20]X=jޅV/bH<|_/ _@/h;08ǀPUVu 7^CY\}s]}M&dtT$uZhyrMI?Ҙ!`G#>0/HirẖM"֫m-\Q? 3pѳH!yX$Qnuc|je$G<uO8@yCҳuMaRt/>\!R[*\PEm %IX .dfDڦbjChp] Q0Uccm`/Ñ;mY wƈِ-S"р>xPO`A-D07  ΘNB\F\"A-) *u -NY* Wiz_0rO̻cthe驇nܮ96>-#9gc\K.l )<\b~Dȣ ܘ5F8zS)e J]w!lDZ RX8<úpW\3 -rN*K9̄ i31\ц_Aߒ\6 qq;pPy .7(-M66%3¡)a-gXYAڮN  HL4=Ȓ=^cVMGe;v9kƛO':̃dA4Y k -o|yZ-qvܳ4f9qH7+iA(*9AEm=^3zRzciRBC[p!D.93,(/X VIf&|!;XzyBm>XmUD;# GgNF2FejXQ-Rxhh,^@~s@Gn3BuvBqG ~4ӵqt%7#.bZi}Ÿ\,m=.ϻt]Ƭ}0 -1!Y[(DŽ/Ёe%.6ErS TWݔUY S;FGUĤ6 JlƠA;7~d()h-θ|SUZuVz?*Œ>c1IquHl?T5h?pM9ZD"y_έD8Q9^xhuXL3M[j(J@^mc>F|E4S- 63s:wB(A=1|q4ZX'̙#k,)jp8!PQL|rapHa!֥Cm.^4ti@B4/,\4l;[ާ^Z}ЉO%2ǭk;kNjaoaY퀋إc0B68҄=6Rh?< -Aϰ`PWAL!GP7h7NwʈUE6Swֶ| B2¤["=7ߦKnv1ksBYM,`Т8Ӟ)^z%Bkķ}w0(*t*y,횪t8\L'CU٫l)B%7? -vQcgp2:r -NʊW`1K9 7v(7y]dV^Q>%TT> ^ jx3rPF,|{[nUx|0~~4).ģ9.Ǫil ie+'3$H:ފ"e&U|S/Q腈?wu. O hR0ld4KG۵|E w4}$ϵ ꂦ`@@l=TRqa(sOq]g;E[x@P/z*%:۽c8'Y6m.6-S:}WW13X!Qxˊ!|q?HDn]"%*/6P:|lLLY)f^LnE,! =Y`C -bjŷ+ww7oMKZɻ֧y[{RIovTi#%\^vwPi1șKBɈMf5i vޏ @ޙHWO'R 2O.4ꫂgVw"yHA s/s T&fz =Gh6JZy.cXB-~"주&ɨ5nzvdw`b&6r? aOie'r.Qٻ+hlMաr#m+7q"Xd1&SG+8UGP!7Rqm}"LO 1A3O^SNM94I> ="t=Zw8>rapeww_uj0ՊOuTݰ^ZSEAuA]|%I4(D[|a %QcR4fhs=KRR,VF#5pvj"Eo_h$Y?nOyp9jZk=Y&? #?8؈ynqA% -pMC؅]K,NBMe%> v>l"7]2Ώ0.vxeb#śRDVH29m/МB3-p.rI0ָVE@dPcgjuS :5N>9eqHSURn_-BQlaԞ5ӕ}y3Ǡs>@6Cmtc3!xqm +2=J$cKQK!eO(!ٞT?]w'2[1e׹KҲUbq= )n,)r -#z e( ٣g)`lWAc ;s"3A*" N8_ɡZ O{1h)ޖ ?bk:ݯȕX]~n\]KKSG)]l$T[r-/"DQu.#SȤ_Zd :/$Rj? cV~i [^~jqNMRz=-cFzY&P KGR9 nR8߁qqңkMtOdh^_8U XGd T|:2t&H6ҋԴp)л}~xTkaϵSHfyxOsAo LY(usf|@<Hɯh)J CZ:<;cEiG^zL__U ީ.\肑wf"p25 vm*W+i#L9`[\6*ƥZ%`Vu$pYjάw BnYi*67F{t^>u 1L' -)e߯wtYc-YxiM1~q|j@90$bm݌Hwu׊׼a -_hj4`8sr n?C(եF@Mn:{dM[|fG.St&iauap FTx .rFGRþY2p -zl* 4ojl?UTd'-xvRm7NK NU]׼(sɱmnH7m%.y9'c$>;!MoW_ePowwgVF&^pPb(wrxQc-"/ޮex +L[ }8Zb5Jt(EF~BG~Qmgyd㴲ȒB?ww$<'mЯ?mtqk?F62G,\Q񧻹ȀP閔΢s}_\pdku3B587 -,?"Lni%fr~S'+E=]rK1_s6WH d]`F%gcl -2=(ɚ,͂P2G)"CLOe<99E'/Jg^RQrЉd̩qxՉNƮ㚰[k8@p$`.';DmC5o6š -\Ôƃ4,!Tr񌶌zl8 -A %'`3B#BfJ 5*1X@]Nܦ7X#vЫ#5Ly^5`&<"?6Г(ѕ@ʟzdlM@l⯢1!V_;:jsZH4AgK)RMKܵX!F>q'xM[^K/f)NL4MZ=Z&=@&G:BZƂӝnfY]lkKȣuzjF _) #Px2)~)ʇȼ<[| *.:eVu?aX`{:E߯@ܒ8O -,t(9U7'= I nu'u?U}Ѯ]73'HD,4;d ^<3CKuH6kVXq͔%FSjֶ;Lp}5~@i^ zsmQ~$߫n /8z*WrEM{{2s<#5g µ 9c6pJ܃0*fت ?ŸĴ2etTֹ=E!'BϼY?K:~@ɣ"5UW\?hPڀ*"%)S5Qt'g8_ց0慈tQ&2YYӲD`0g.l#Ê5hP[tc,:x~ӫLl 8\I$kcD07&wZaNGI~GƱ!l^|5fq˝ 9htAJge^ud:*켊a|]_F+kr$Es0Cf_zff J ovf_d" jz?Hӑ.'L"$0eQpnWsIH٧(kZٙ9.}d)2͠A%QԷwqB+y.+g<v>>??='iR1r"_dd7kK[c~|WRXS 31?[='8ӗ7\a<>_Zo/#KnHQ'C22*8&70zh%"|?'N=[X:->@hV4 42zٰk vR05dv' _m="!'=xoաN)82@g'%Y{JzJ< 4͒XDFLV+pDoPF4dK -w'-7C+eF;>siE=|UCa)C@>q͂YQp&dכlPDj| %ibڔOjZՅ!%OT W#qpY6(NSg -zm -6VN*Xř?j=.F PTx䞅 x'јaݯи, 8]`wx>m~BDQ@) -#h4 ld.C- 3 k?btOB6dS%.hQ-"pU~[mg+~!SdҦrkCBx&GW~qQMe7Q ->+}U 0hz^іJKo$aB#L]Lͼ}2D|nUŸ -|+.jvJE8."ڞ# )Hs5;٩=b>F:;+(b3R~6(yHǔT G 4,2՞_ - HSr ؄(k.d9&ȋa>6 ʚ}D2FJ@*@'Xxvy!|T -_uŌH ":(P|ZR;/azkbY$9WQmy)PVv|W0`|V৙Qfr$BA*EbA1Z쇵vG,r5$ѡ zw^肰~N$_Qs% -lT{AW},TMgNX-E҇Ztgɕ)I 3+˃p -=a:3A}:NagAjius@,D͞⹕ɍs[Լ9sY(1;P] G nKL~A5Oa铗 jڏ"6< LIa??k9p=~c;/E`4ǿ/v<^|Tf rf^vv0C}5IB$0F6F3뢔+OTO': -;Vln%[qaxyЃ,!Z?WHf8b, -UV5 szKBXK*)VQUhY0 )e=5.ebe'otI2i8c|e8۹Z9#; We@搊}Y.*U(%Ђ0v [ba݃zw8a̞ ׫khrK>/WƿBUp#:CK0W%i.~2me̕ Б쵀{a2b$F5lbȊ{(e[Lvj6PcN$Vaf C!c7tQ )D(nBٷk^2+I'sjV 䡇wx'۩-8u^-gŴn*z/=) 3z8*_e {N9VXfmR8+_Kv~[jEa~){FzDU }&Z -O<6ҭ\Mp55F; Be%+4A.&pbNqoװpEAO|ݬN\Q " k[pX GNl70It^ "/&Ox[aJQ0~TC{jGu&S:i_֫&/VY=蹁2;hÜle7կ014h}ײn] -endstream -endobj -2159 0 obj << -/Type /FontDescriptor -/FontName /GEVOEX+SFRM1200 -/Flags 4 -/FontBBox [-185 -320 1420 942] -/Ascent 689 -/CapHeight 689 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 430 -/CharSet (/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/a/asterisk/b/bracketleft/bracketright/c/colon/comma/d/e/eight/endash/exclam/f/ff/ffi/ffl/fi/five/fl/four/g/h/hyphen/i/iacute/j/k/l/less/m/n/nine/numbersign/o/odieresis/one/p/parenleft/parenright/period/plus/q/question/quotedbl/quotedblleft/quotedblright/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/uacute/underscore/v/w/x/y/z/zero) -/FontFile 2158 0 R ->> endobj -2160 0 obj << -/Length1 727 -/Length2 15057 -/Length3 0 -/Length 15648 -/Filter /FlateDecode ->> -stream -xmwS.̲d۶k۶m۶m۶ݶ۶mΙ{fKdfTUdT=#7@E\EHCF&lfj`/jj 039P`"^VJ'FVvVu[w+K??Tfs+[3RB^ afold Pt32ZٻQ &VBofή3wvȉ -+ȫDTEFYۻp63qWw"["V=aV&c3 +{&eo`OJrGflm"vnf9S3g{?gdgee_?N[=+V.VfVnndQkuLs?^ -r*4ML-*8jlĿˊFV!c9#Wg+O#_<}銎be䚸9;ٻzdfif`j^/V4W N ,lі Է l[ڢk/Q㝙eO%gĽ50"g!awOfR*,/ Astu}TC0-/ywaMqcAU3$4YC/9{E -&_se"2}2IWPbG~ k//f <?*2+$[ݎ+Rq[mvk%[ˈ|8FTTO11WدeN >!XG]2>$&)vN<_Pf@mfh5%0 Pnۇ  !itòYQz8MvD~i'{6D|AON"4y%lj=h@[<*dsmжJ>1~;v-/hy3E=Xg,3n V43+32i02Fq/t}J﬙e':,:Y]Y68Y$ңeyMùW3>܁\p<-S*9͢x{Ԭ>F -HTc>s~Ck,i(A)zĂE4OS6T23SJ (AmikFNL Mg^mx`TA:*25[aN.Rl,=c91yϢ1b,1{oeE82㖬Mtѧlb3L7([펼 -8< ʵ+h[ר INYG9$K/%G7}:qX -BZ72!+({t6t 4%/dth`(Ws2ZgT[+6:p e%h|r~ܶrs㍑Nڥ# -y9$=}@YeΓW92~-: -"9f UJS^5M>Kl=KDaφѶ s[܍$#şxU)0Dzꫧ$iMc[osC7T_jfש>B>3Q -v>ˈDM8^ؘ"h ak"|O`|FrrC e4W512]URJcۏ(ldS(?co~ @䅣"0vpQ.U H]źJQ v'* JYϹ@}iS ;1D<JpպjכA1 nrlcK8 D [M>edz`(DI^\u; qO]x|:8 -$w^V0;6cpBttzDˮ -bN,O -1;/}lm`j[ÚJ:ʠ%o{l˓j$~KrO}C=Gv!3;(-8Hn/t&~eů<W#yOK Nw=V{LxsXo(4Cꞎ$\0A6$_) ]P#u +Mg@ -;C9B.[)ɤ׮XId<,M 'g #Gjn,_:1M L8cl=r.*=\e(nh-|V~^,s/֟+c -g,/ߪ_K:<"@QPz')- /Z); 1AJ%1D9D~QUIcW{+1 -<QɣgA2/u ZS٩VNC?*̉+NrQ0,号 2y*%VPK\EXT]YkGju/^ X]L9w" {^H@\Ĝc06Ճ(pMBf -S4x7|_ւzM'̑vZ+X[ -":{Zn-گ_Z%vW⭵鋲pG=M?W>(yɘcx3[zW$uTkNjkk"p#Mʺ/]QϾ6Z=lc?Y!͚#H{)7kSȋJ>~[[-Ik af?_Xy5&}y >R751;$U]Nc6 -_MN߾Fl&HicwgHo[E(9 ?@DYS!ȭQFee+ ^7T9?D%6p蔿ԠY@U*$XcD# -:Mi7t>M:|ؤS 0C3큕@C뽶5<:qjg-'b-w0H|<*UKs|n a"'vQ qtq]CIX,ѷ -MrV=d;|mvd4f`iFKy:,TI5bKݔ{$O$`BE+'m@~z'HD,}ΚxK=C봝&'-m!Pj:l6^wr2d;tK%h:Q):R.,خ>~yx%mtLŬg,Q@HD]h= -O~p/A g(v<7oIxLCsQp#I˛Щc-5bM4<#x ^$˶ M=`}b-\LTG9~#: =,,Uu|xhK LMMHe 9 -#jdx(@ȄsݟC@+Pooobu{2]HSq*ΐ`+Z4?'B޲iV*fTš\Xϧ9 c\+HbF93;0[ށy)jz =ً`&ΘzfzSI U25gMK?/8h֖Wㄇ{rGʖ_0iѱ{)Xcb9Cg!1iFQ)J!mHlp5Չ8GHy͓QYG3qUx[ &zb꽅#LTqGŽ\_F -_*|/j⺂"F+bac!?8I>'8%ώ ׋RKt2ifvW593p*ؒ7O>BX&!p\p"uCt6])JF$ui0p7չ؊: -j(khFrx % svbJL|nGcի5%uK_ eCI[fK{1; HR,8S`o577WB1 ]Wwa6cxG{AI-gѻ-v'R&`y|TL-*yY0ִVbcxߤcڨW;䀿tHhSXA ~'3zf~gco .I9|"`~3d3>`p oӫ}?!A)/8f}FF̰䫶"X@JU - -*m3qp;:vɕFW"6gUVnqx!wDrٽvޔa+0Ub`:BlI𸓙|&nIsekwɌxR yӃ&qxږ@{j7r' _Zxzã/J-~P.:\zFd3M}x XQ{fg;-D<<9A7‣n ('>K=Oxl8+w#;_raDvO1?}('T&]Gpz@0U($dc9BP_IkD;I5C@yκy #|m +Zi6cnn4JjԧRypEwpY. ~S#2#M#V>}n_ԥ枣J 9YM٥o`HwƲ8' {6aőPzir67(: Zza'P& 2=EG0hiA*\Iر -zqX"v3t‡pT("՗}WFoaoqs,,Q0 zƙ41AK,%R_6EMCt&,&2ryץpm$)^X"RݼJV'^RuY%ޙr̭d~U^7. -:~_{asv籭 kQSAfF5|Vԧ @FrO:hAhgt$d~c5t5 pEJ=0j4an_' Z TRurٺygEb In< mU)0egↈmn {yjBg}2XƷ0p}ֵ+_S-y5dIN1ɮvɧoM/L<n*DN%TGW?8QA9H6 -U0 BZR(TmFl=H6|/?ˢ̢WڢZw:Unz6 D}Q 2` -R&I lcmrv$j]VQu-P\8#%v l4ݞ.eoo" -ۏ}kA1BϠ@ovIkD۹ <4:YJ4pz)QhkVwڀIIDCFo=l\@8:q:fևtuw3ݜ<8R}GsJ'P4M8(3b}ŷџ p(I<@B7=bGgrtT3HPdn"bHFJ -Vd;RZSQ)n\cz,pYɅDJ QÒ;$;JARFyET0;]'`QƘA'ho)5ӿP5eG6T)pi(&-Ҕ f~߄cF g?f ;/  -/{J&~!VmdC (8IyJ94 #cV,4uf8s3nas &J=v_(2Xq:uH䳞VD,=V}5P`5k;̑E% m: -/Mx/b%p/Y==n23mu e&$3O}tlCRYs -vEonTv{z)£ ;uΕGoww 3!㈙ 9Tre R%,c! E@ȳt=d`ݽp o4`Wv[,J`uþ2X` GGNenB@x-pu akxdڎ1T\cwZWy/VT 0j銟6=P؍쿀~-aRkS5u~\dBO> Cخkam!_+-tmϭ@Pm6" -'1tmaI M ,Ȁ8x]_qol}Wtu#F-5Y`T9!Ϋ$Tv -znz+&}@ WAxλͽfx^>16JyDFTunÍ{]S?e޿iŖ5E *35K%iN;z3.-Y~m'<Rh}C=J!ϖ'(WfD4JG\™HqV{5szBݚq7=)$p)Wzx -+8($!ywb{ueT]qCz|!g s%n7k> +CEOy-#(]~`_pWN;-k_.įϛX&#lc) LEWƝ9/( a}?ӯ.W(;;q Q-嵀'E Mzl);('(A$z g BKT%/N2KT@Ⱥq/zӞLi0+nwbf*}8dNޅ0Vq$|圭15!mn EnKS:X.`__!AWe!4Je#)@;pI& iޭ.` xT / fp] ]๞K ) )V7\R:}`,{AJhhL7䋱y:c߃v1<3R;=VwlܸZX(fzݱ`3|MB}կ>Xڵ!+$HEEi}zЙTqɧwiZ|NӜd;i$~xW 4]HD!Q]HnXWnA =~ÍK/{_a%zzdKw'9LmcZKi I 0z(41] FP'$$y bh{IA4. Kԇ q8bNp9y^S;N.Nۃ;lҹ*GLBjԿwtjJ:gHǶ\#n7!vnL}b;Y*;H&X¥x\?Bҡ\cnW|h\z71aךrJ[F`*M_`egk8$w: ncd0FM#ŇSqzDr8x(52:4Fgh.Me&VTStB熆Llc|Vn1L&HewOb @ڤd`bat`J1) -{ΚƎVnHVJ钼C3o6Kx|s7&J6/a#'=.,![G%oILmSJwHCʗ^A^kZ6}XAɍtcc]-y2=7dČ9V6rea;od |QA9^.wы ndy"LjA;;G,j?‚c"U= -.5'K3Yyҝ"ZqVM/w"%_qr4!!Ͳg3x0e+[_POn>tVRaޜڕu:9} -˿eR݁;c,3NAP*ԀRA]0!?,ixRYdjVeͳ4?B)H]ls@Ֆa4oG6ftIu09.;.) kܜ-) &6xEP݇ hj23@CW|]U#k\?U$ڕ:.$QB.Ufnn6dN^ńQI6 mDjfFc۵7ٌ~0?ZjR/6@j1MڿGK ,vo7GTMl` uImqq wr\wo]icoyHtf"ݒ/,VdKL]f) p~A80pжt4q JH Mi8Nxo8TNA)L_PzոXDnd|;u;]? !(oe q@Dҳ JcgŒ{¾|]'Kp18H[5`ˉBtrV_C77F[^;- G~u$gj-Gω{WͽKq@4 ˨ՄxeƮL_v]=U9v*-J4|[63I!#"8fGKtx\`s Pm2z9LFBUZO7|O0sՒ.-T'ϤTX -)E\3GT@Q}/q͵,F#xҬR"\%f,Jџ}pݻ\b^\.g_qE9.|ofK4ңP{^pPNF?Zl.:j F]0pJK]~]2HA˨S\z1%@؄DBssx:\3Qf >r'XN\=3FWa\ZNY w_|GŠKےDr q=BeCL~zɥ᷆s/x1|vi~\/FΞpktG.]ry}>rkx$J=WSwlmD' -vw'uh![Kp+p$]GFПgƌ15Bh񂒓zvlYeJsQ@T`/V7KqC + c+`1HK0) ]Ls{Ji5JSC;h+ٞ7B♏DLz2OJ;=#!a[6L4/v)xA!x7%)wvӈ7li]P*gj;R@\ouI,O /S?1d$_[ٱq|qa|o(<ɓK!y֩;6@St]Ր0ۡ7Fx( ZҎeWx?ujoìW9> _%G~2T$/5 ,cO#Um]ntىQ2\[mk8覕h~Jt܈oP%O`zy<`EV6=BSt'3w`9>O+~9.M8ʼn6!oHaUG!îhf0rg|b)hT7av^FF`W^;s۴9o ~!2׏Gq`m26]sD!a2wMi⾝ba8e*p1 YM;S&'W45e8"2 ulNݪY.x٪JUp/?f.qҾ8:e`]`mw"W[9MX wf6Of|?6SEm=3GBuIf,R U@Ya;cMtjpr\# nt3@4a}((Б?Y]-\$&Pf86y{szZZPPOBT*Ut2t[K F~Z*c_.uCt9782U YQЙ8u=a9pr^dOd= -bг s&7Jæmjo|pOMHk;-}ƬȎ3QW,{k,ˡgy ||8L7HT˂f-NwK 1?P"-0dҨcWI5/( ^̲qu [LoMyx=Nuht{8;> -[l_8u9.?/QToKqAXEOd'9[8]9I94j؍vnUɿ-]T^LM*>ZՌNn|N91ę_g# 5Hƙ0=Z2<"8ϊ>)E {o] INdUNT-N!$1 SӃqCOiPI~6x߃ _>}诌Bu c1`PcJ:rigFy0 -n(AX}*iz$v7Ӥ_0OY|5JD;8ޖAI$Q36V1^,(~냘[u6ՠJpg+L*(աYv(]*rwR%],['}ୃ@ ]STip!iyF^ 1;Et:GCBR(eS)4/WR -E$rBK;NuJQli=-:Hlmϳ1Ԫ,Ł/NKE6bG Q\ 騴ɐ$"=퐘#Uq߉t!r].aB`c}U_MwSL{ߌr^-!^xD[-v͑s kZ"7-GM^@opzdQ3 `>ӽXpB! -d q2C0'835+"~`-c"M0KzBd$%Do& ]r  Y"\+z*=W=oE6(uo&>r^-fڿ7! |u毉&.0A#׀ѐcj#\k"A2dD<ѕoF%ŘTx__'69hհ8h>8{UaR,qT r`~a-(!^b{SFPTlW u`lOg,CjK_C7'ʸ C!(z.3TPȋ߾Hw^Y՛aAzO~dwd.h9ϿDD ["Sxڅ*qyOJ8oTayp5A>Շ+ e]fr9\>MVuO#$TW?*@oӛ3yfk9!WR \]c([~YВwRJX=@rԶ韨lywV/]` IA'њIᛑ\+RX-YQ0mnJw:~3 [Yjȏ"%* yuir73V\!gΕe`Q\ΆD*VvL,6xA[v ;=5[ڟ&7)c*G\;+((`6,1rVqݹ ω8,UAJPdOdC!P6R`년_R~߇Le̗ǖufOo63!')Hb (^?ALG"i,|iiTH5Hr= 5?V+E,G`MXf+qY+4485hQ,d[viK=]LBڻbS -FLJDee!?7>.(#_~ml{V(/5yxڣI %,tEHs8QC׶U.TQ'y ksd -endstream -endobj -2161 0 obj << -/Type /FontDescriptor -/FontName /JOMBSP+SFSL1200 -/Flags 4 -/FontBBox [-146 -320 1449 942] -/Ascent 689 -/CapHeight 689 -/Descent -194 -/ItalicAngle -9 -/StemV 50 -/XHeight 430 -/CharSet (/A/B/C/D/E/F/G/H/I/J/L/M/N/O/P/R/S/T/U/V/X/Y/five/four/hyphen/one/period/six/three/two) -/FontFile 2160 0 R ->> endobj -2162 0 obj << -/Length1 726 -/Length2 7481 -/Length3 0 -/Length 8075 -/Filter /FlateDecode ->> -stream -xmWeP\[%@' 6@nu2#ާ|Jp!2G ;#Hӑ[IӞ|y-܎o"H׾71smm +~nNNJ;tQRgm zER,x~ 1sOyD[Ɛ~uCQ3A޾}@' j1["AjR \e3BRI(*j#fDꖊǑZm+k͎L졯HSq({')qk_0Tךl4hnݯh^D@U#1rI6g ܰ]r -kWt G%K 1RKKchdzS_d24-1h< )ʃMAQB&&i//N"0S#F #W x{[.jh'wQ#lcA05 aLI*0m',xܽ{E~O~#o@dߒT`U Ԕ)Τ՗-{ݎC4}ѩW,2[*JZE4Fo3-\[bt%?R9}S;5g:VxXaOj7֪IH'gԐIfu<*G#'#}`UꀃdwFG`|Q lMOz c0T{XnzBiQ&Ԡ}߿SrMZPFtn2∏ټM(c'(i\5ZYrC y T[s #X9 -TyMQWݦ?t?cR>fĜ=beUdЄn >S7kLI>~иJX/VUaRӌM~g bvV/@=wM2[[&?%Ft2pEBi (?MM^C׽6>w"creNm|ΌuSY! Txmq gԎ;cVQ/M{ b?)$$R[b#CBn^" =Y﨓b0nD0lqܴ2N[a-Ť3E |9"z[O]ʢǗ9v]_SUw3QxY{?o\%0#c놉DY[XAU%='"Bqg<^Y4JmʼsFQlz^wٯQʔőO?;_]8m^䬄4KaM߳Fj! 4 WF>^Ez.K"4"Uqn=T AdыjXd^QQymVz7db34YT]֦=_ n. (J^*xw{K{L4YL?deHy]-^D B,k>XC?;P>sI0Zd/ݻ2GExJc}Vˌo/ѝO-&ef9_ -QZKB.b86za7`2xu7f̩HSpi/GR:Ad+WdL9f(*Y)j1TuуD]En>XYmTkyD2zЯ"8d2ސ)7Ttkا~3]z\K&jv3+(:ip%Fވ3*2{;xVLC잏*;6impTIĝ5X$TRF+qkPDkJ{ Mėzv"S!fo/sqb[{2>X$mz uZVںk3(;H4@I% -b]OL_tEgN )o(i}6Bކ1xMfojoT02YsKHlޢ6m8՘ >a4,'{5Iv}bC7R'テIb`IhVa{6NoIq_P^ -V4(v z?5ؕ\E _+ssҚBN1fu`͢2g9wB{dl|'%X.Z4\"FR - 9ʣkonծ[\jƀ7+L{H:s GW3,.pUb"(7jD*^ -ޓI" l#qbTtN(h4crRfa9Bs)멵iZzhfE $o$^_.qw -~j!͋ !,PR&<>v-!aQh]iw̕,23{`ї~ aũ&ɣnuɩ67wo>#\IߢѴ*d$5t]RAF -i,8? -JWXgi96~H]C-6@ xBګQ1cG7oW֨qPwi"32Ū(F{s+Q["4=-@H>d\* nXG˪-Kz&ܑs(/wJ˩M 0chÒH_ٺѐCE(>s+I9oK3_HAaR4l5QR2=/rs=7iJlCYaC)IJݨ吝%#|,kx{>= h״B?E$mR P;'өkXLB!==HSYUw>v]l'^>lS㺐•?DR]L'y!3ߓR - !{W |+r-״SB~ -,t_gZ]2uQ?(C}w .܇=Cr$~KMcȑӴd#"%d -endstream -endobj -2163 0 obj << -/Type /FontDescriptor -/FontName /HPHIAV+SFSS1200 -/Flags 4 -/FontBBox [-197 -321 1455 895] -/Ascent 729 -/CapHeight 694 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 444 -/CharSet (/V/e/i/n/o/one/period/r/s/zero) -/FontFile 2162 0 R ->> endobj -2164 0 obj << -/Length1 726 -/Length2 6260 -/Length3 0 -/Length 6857 -/Filter /FlateDecode ->> -stream -xmreTj50CCJwt׀ 3PÐt4HHIt#)!" ) %r}}׷ַ?'Ygl0 -m -AT !q0>C a $((=iw -C8#PgH'$!·r =dpuLuTA:F U u[;!l@Z dDI@6H/Nn|plQHgS]C""iݏݤp7{ B9A뢼A0 d C-$Oo랐=?罆\ u8ήh8 -Q. ^_(/B 㩋ݽ|n*/8Ltuc? !ܝߋr0J*&:<ﶲ pABQ -,/-\F!@|yDod(+^AqI8HPXD$!.еqG.Uo7^pHyc%8ܘ -v :5?0>=wQ-IKtaY"׆OIxtة[eoN[>cQNKg=p0-cX"L4MwDShjY|}/aIZ|9U.?W<%~DsKAVPrxIou{ ;'"ʶBf{Li8}ր@ԛle. -Q|4_pEe8qCU -/FGSmg$w>fo(ysv~.^Iw^l# - .I -v;}M|ckJN[v<.JK/? -yI]2J3gt?igɏl9#@;5'-Mve? Ol&t7 P}J'͠ATƿ̢'TH7n,!+9t[+*z=)h8{n`s}Tzj^2' -al`j.,fʻ~6Q^2jß*D%HL3]e(o{~ E}N[e.j=ilKNX#UnX(/VXnCAh t>Gچvf#>6rޭX`ULUic:9zYKhd4\$ҀA]w̿7k@Ģ=ǜso4@&'$43~qrX*C__צpSox3|w_m}@EZDH)}/)#Q}UB$YX (NH-\Wuѩ;)%D||bU csYEX m^Yzr)>n0h] p8x$ *fzMJ qIɘn>;=2bNа<1 `)8̄p4-^үzev9* YQ0gI2VlvռXS׻\Qke1WÕOtl2q!s-Pm`RhE7@ʒ&Ӈ$ jҎ\C'ύjO>欬C #C(w5'~u O/ ix.8`UFG %EIt9"8ߙ O[mHB-FM3wq9%H5 "{Zf97er0 -~` |8 t ~g2?4c4ˣo~pkb+Kܬ5Ȥ܅.ienMiK~NKC4XeG7|ĖRItS2̽vð6|]cm] SK6P 3z(9p2S3oi7~-lV]_OrS).XdU̟.V#$-4ՠ9 ~lvۑߺ$Y3 SX4(cQ`O@^JE:N8n Ű]V'Aư{(5.9yDg> ~bRlL,yd!ՐoggKT -m)u4.fP(,?mBF?u4rG?޷.ں!eh4\{w7۰gGtT? .kc.R䯥ztdqJLO m_~v7r [L~pZ3p:8?xΙUbOH٥WֻFBeݗf/`6\x&pOrHP3?:Apݨ\^\B]#[ﭦŠ2}'u+ j8Ϛ28"xKN֊s'[ϏW8i {{pStdbݤkGn'-UޕEo#c+㣶m螇@rʫ[pg2omNe.SR2#Cz7 [`Fx&(_K._zo:%4z_oFcuceM_[RXq<G ^C6@6$JK-}cHU<~Ri9pԴ7 ĈoJ7/RW.0U4!&_1X#@aB`'FO#ZN ,~Tv~]d^xyBtfc}L󩢪`N~7ɡĤ>̏1T'Tj 1k|B2moNi /i&[#7"[ۣ)u+9 rnj5uZYzƳS*%5C.5ͼN=eZ.\;/rB5qЮBkCP M۝RY{.#9b 8`fqL}/1dx_aUL54ΣpS I ax[AM;s]VKD% y2USMpkAԡCkL13;f iɄ SΦ[$<}!Py!'2Е<HBTXE._5ҶisV7giFmJsLLz ZdO-5M%Fi*&)'e]omշWB[J~~,D\+rT>5' cRkjF1*bÙ\e?.2_}MS`RG~RByҸ+"K`c;\Nq;\?/}Qd%&Ow9QCwr=?XstN&#k3Q$5aC3iܣ -ˉZVhœ \uk)dzrO9w21T\!(#2213~E0krg8CZ+!7 n{*b'6*H;x9PMՐ -+ -A/j$9_<ӭ9jꍿuK{ʼm7MNib$xA:`3M{UVo.}[AV_ݧ?euZQ 8IM#(J(9RV.^e~]a_z><7Iw -?8f2H߹XRG*ʧz@$| @Ysx㥣iݷ_IoϬX%cx&TuEck8[HO-V6A0'Na6/W^٪`l{M;'guXlߜdA5+Da OE `I/Gq,O3f[u~b<~8)a4xB|Wۿ##_mZI>?&` OYJh콪W9 gֺT~^Mwﭴ2F'+b,TL -Bf<*GFkxTI & &uKGbVB p\VoYs:߶&;Yν?6>w%ɗrh f-?/f4LU;8KNb'A=!^_,:/+6Y=[K+z䥉Wmga6Lf6Yq w߭܈-rU -v m tWbmJ7ѽ}ɨ kGD̆b&P:}ɩlG Kb#OҘ*泡[A~O+t),9-ع*Ln- ^}RlT@\%&=""˃UZJBfC(ᙀm,Ht|AiG|ނr;ӘD&iWD^Jx?4VrRYYSaH{#5&g 4'ȱY:6xW8GQ?s(l~]}ЊR~|3H/QY1֜!9M~ fqM3EG3¿W㺫;L-LP\؃/#OC`g -+*OT ofXT=dhI?ydCiv݂ȊËr\Op{isJɐKIl'4t$&lϾnE~QL%$|¬!PbC?ڪ :$HE9 -WSLAmq(@hSCyBպ~!,`B)KH_9;No@!\2Usε72F`Q7'V[z9bUO#Su< ,T?bB=h+Bb;FZҍ}hNmw塞6U+Y*31/ښ*L HBK;WjEosxcFw ۾96} J ;%8cɈk/o~-~iSxwlHy&kMclxÜ}˵gsbN*jZf́F O jo(2Zx'6A1{'[Z?ꝔE<|Em wnk'';7|cL0ljǪwk͜HDdⓘϩ@Vi,Dw-{uK =/U):ZA Ve:|SpI#`9w.}i9{b8l!J+O11Sc^G5f%ZnY%BHL (*z ' 6UtI62#oXQXy)u!6f߸Be%]ܓ*;,;f<1 ';U*N:nj9u9+=%zl6$ɱ9 -endstream -endobj -2165 0 obj << -/Type /FontDescriptor -/FontName /DFXNIW+SFSS2074 -/Flags 4 -/FontBBox [-179 -317 1341 876] -/Ascent 712 -/CapHeight 680 -/Descent -194 -/ItalicAngle 0 -/StemV 50 -/XHeight 426 -/CharSet (/D/F/G/S/T/X/d/e/h/i/l/m/o/p/r/t/u/v) -/FontFile 2164 0 R ->> endobj -2166 0 obj << -/Length1 726 -/Length2 16767 -/Length3 0 -/Length 17344 -/Filter /FlateDecode ->> -stream -xlctf϶=v?m'6ض1:m۶:N:s;_fU5k}U{۹z:x*RLLL&V8rr' 4,&&f8r ʄA@&*  bY" -ZR* y5ddPt54Z휁3{'893bfN91UaqyU +p;g@UGpec_N&.ct3p'l?9@S?hWy#[ J7:\`F6\t*Z#?B;M-]m3 UWS{;?{UFEi5%Ymbv&v5r2oiE#@_M,EiMgea01YY|[W''˿UM@nmބ7*%Opyk|cb7|jMIDWFriqi`>s ܓx}WY'8i0NڣΛr'h2i~smbΣEl^N"!￯\eє<*{NI1X-՗C)пDͫOCh[P ?2 {s{iF"!Ĩk~n 0q"5cZEۃ<[t+"o0Xν=) v_=H1b\:(#Ni`HyWng7?nhD(&LѬ)kITtKdzQR&Zڹ[Wy<AUp&AYQ21Y ˅qk0 e׫c$8\f!y?}+VwI~Smycj,]ijadc1)9&Ia%8<63!~f]lm2ÃH+PKZ@T9O_I1K -̵9mh~yAMxgDzsiQ 2)cv;+R\rMEB0[$ڜܠq5']akSbx&vPDM2k7,&,k'H(ά$2|?ge?$v;7bzl ?v+*γOL˝كdf|U'44bzl0ݭjWE˟T0 AaQ=`pƛcA,)X_!!>Df-[e+Xh{p4o|f*67.\T+ ޮz'H|5^9&ᣠ3Go*X{MjRHٌxr5bA_a[;݃XG w:u'Pkua.(i-ڎ9s+^o=KxW 3Y 1Wfo>_tp]oTq_RmTD ̵eդ=F:aL{IZgb`AGs` -.jP&}:4؆- e$C v'J鯄6[}G_Ik~)_y=Wq_,/30͈$i1lٜ ř³ -1'wb8pW5 e'UD&J@5!Og V yTW1WCu5#iY+1 -`@ iD3w -4Ph]6GwˏYK3~/ -UCC˯o<򗧰)ƕ]]Fn}*ne눮AbU -Rx]v߲OڼuFب8+ -XA|y ދ6דi:K_I~s.?2F*sϘZ"?kn=41;ygjn\ʐ^06 }{khM6D\ mOmh9׉]T]brBM5TnmMz-MwAkGS6ĜF`;+-UG$_ê֎ y&\d5$m)- grLM(1j}YVRۼej$C;a+ O:ly>NU7\ kwNBYjd` w"JFSjߩOy'r/n"':.QN?F-0mQ?U`bR%Ah e]4E^n~@$ӁPVs+UX1tfP?zN&WU+4ך1f➞J*:"ㅏfo Dpyu5f|\^Ćh^Uowt3x$F]iy~J q; ·V^%T`BM0-Gb'z0PULC9rÑ(<'LyZ;*w[?ۨ t?CGR X>̜&کV&ٻ3pZ }qu[pګ VBq˦P4-dӿ6`pyE, #t)Cz$ޒ%5;"?%&I l[|_-1eMˢ}!;::Nre{^=N"J?^vy ̼ncL4p\b/UC`Uj^FŦ 4Ϩ"шo+n`2HVУ<B_cE Ҳ>FciO*񐁹Fcf+X&?J=_WzТŵ C_YOؗܘC\a4Ba|O0UBR$PAH$lzۘ$ԓ&ӤFM1a3O[P}I`=Y /?{ڦqCCn8x*>lr#h`K hg %E>]q m(Q!_\ߨ.Vl{k0Aҏެ"BHpLeG::\B!=z:,#hXsFQ ?6h[*h!w0*Rq?WލYt[_>s}HB[d+C!10ͧ)W›kq!obYhG4-,/i^?>2J㫥#Gy0CͩoM^u`MK\W_Uܫ,mV%.*X.<$Bt"ѲYXv[%ˇ> N{S@%.RUEʩb.(Au+VG~s3fMʔHe|8o u%h?Z?O;P ZxS褋i1fQ/ny3B)zLajRBif<;w_n w͝T;i{qҥ+k>e#ѻV wBh8:" -I8z_;ʘ2b*MoPfVdg>IlibEAC~pu8x -rcsVhA:G;/(ݓP;/rL~yl>[r>naQ$GmC ~dz $+gcggX*ag^"W4!m9Skw -墰)lٖyeqs+Ժw:ShEk$+=DzM^#Wj7]{fxh(Xcʆ**~:#1RpZlԫwLك?#Xo**ɾ?}L'deu?p(枱r:m͌=M^2`Z,'aݦ}4N?Mf8339y 1-^dڅyyv*][5SOnP/DVD!71(Օp{kT*djR8OIox -\!ơ䞊nlJ0)(w),p2_G\;1T ;:J|P9I*,˘+ -3Uh?, Ԅ -1iM|O/Wt!642\E͝%N-eu.Ѕ>ɉo4j:idY$!oYf|/;lֽK7VwS41l`lZgc6Ef,`^!@[*2 gOa}K{Y -IRCDCP}/LPܯZ(r -߱&ꗣ-rr`xGm'ERʘhӊt#YA-%_ajA}ȀNWmu6ITkkws& җ/*2tw"?C3:I:V+st; ovFUl@=QႉetaS.Z7gO-"r2X%T7Ms=efl]Um;+?;ǪKgtk3A>]~WO|m>O'qd0s2j/~U&p)0UOg`4 2Qq2y&-+]6a|8|~R>hlFA)hY`o0 ?G-1ܭX`"LJ((Na7›T}Њqw>¿n0r&Kś6Gzom%mApemAtEGq:85ӁR-1]*8!D7Pvy5YҠ*v'WN{r{3 <)g2Iw޺ <jp8ݴ~h2ȍ/Gr 6XiA _y |z*cX,ucc&;T|l-rqNܕn :?K_AǓqِ#VqY|ંӉww-e IoseU%!lT6hN!McI"X9,]XL^)J7,#ngdwqx>l 8*crK:&5,}t]SvV^脂.cu;Nݦn2|ov@8b<xY2fu(|ꏠ}H%us xz*^"FH``2oI"W'{iۚh+(ܯy2P ,WP>$)C b⸋- -G)lXAU? -7q$7rIdO#|\NH +E9qFmL죈ԥHChwT-9 *t4 WBn] GMS7`-lT8>h厤U%rY$0n'oy'PXB^gս~&K;v1AWt'RNWˈR9KM5")Yh~<7;\1A, 엾,sQGLaȋ+P &bM2qt:`Ւp˟cz`1FW˒F,s̵#9>cXRU"DwXco+͆k_RRd&f}K_s` ^$F{G qCaY6:SwP_hjKf] PA -Sٓ&sq5Ҁ j/ ֍ lW'M -+5_- r֬JÏI^VB6@2 ˛绶ciBso>68oy* J0. e3VBjӢ$uvM݀$:`7m:gx#hgf\Wl?xYLѤ:-$roEfs!mou2^{:g@tAvز"̶`[U]qeS ?JLOE̥@#Yݮ8zՁ5좫HMg[jz) V+΋2ekT|76]^}Y`DYa'9cu>ȲJ<E!BB,kYжۦ".U_2GS nac  >kB*iθ>bWlX~W{A ~T(G,v9!uAj07V}d5Qs*(1i6| -"xa/xsli -`䜑8Jcwlvm 7 icԧNf,KFҽ=隊Y±ayiefԢzB\ƻS&ZuQFk?2a妼|(C愰IG{SV#H%`{m#y4gF"pfi*Æ/)PoB"w4klY@$G <"A#V -2ѬpIEH72Uh{nRd1J͈5)5IxZIQOdqtc3rJ7hLnO /ԟT_?U/ұ:M\4?V<#r0}`Qz,nh -mx#fC@M`Lxؘa̖ywP}i?C*BטG8@cV t>.5-,bA_%~Z[*-T6?VЫЖh"si77}UquT.H`ZP"$:XHBc s0neٴK]]l;>|Tnx/ {v%7<}xmka - >~Oewy?~kRQDd]mmD_g}s]IzrK4ܝX`nX88Rqͣ+%}!Ș\rw E.:fdB"g-/! +U(+lo@~D`xQBqOG;+-tNth(`Wp:r -2?:7p;];!jxLKd{Ź*f#eo^&Wӭ?}f*Ƀ:l }B=(HTYp`kk_:jӟk"עˣQn'<DA|n_4DD"mDЙf6:Q$Xc?B[?t7j9½<Ǜ-)U%Kgg58TmnN'νNU8E|ffde. -6e+{IYs%E[}? -/;teL*ڨ"⺦XvtZ)4CZE,2ϓ8i@)fӴ)}d0,?W28}SuIM}Z ItA}=! k'3쌶JX\tLE+{IWLDzt%[3D}"[XМ)5g< xr*tBjD ӚE~ -* (c/*HΞ7WYV;dn48:^ d4<L^ _AAVtgA1:(*tM"oo AviٌL! WDL R\?UG~9pKF,3{ -H궟ɈSkK.Cz5^/ܵ`%ȳe{i>m!Q~S`{JOtle;!eұ7.M^6J;CQ"㌪O3 Hj&24p9_nb_\w+C)4}KKYr",-8$QXvZTaZR3)|aoA>IөӕE|5$d>unc^0j!D=r3`yq̊,#UJ2?/X ]{_{Z-YG7ekD'6/^;WJ"84hJi7`nkPwqLZ31ƻk.ѽn*8^=5Vƌ}IV6_1dF|E8ќ7Yu͙FB$ϱc(f:@KL4\For3G93,BxP z%%hҖ<%{0wajH~w:>\ B\2,⨎ -Cof&]܌K>:R^Xe K!Mk#\k׭[ѡ=/щfrVt<`^X/c,[/hXU≎b/{l!?:mmLжbm`= -I?Z>*')Wi5U!>3vH4wO4IBD586ydǡ$(SkpÚ;Gf-Tĩ @Ɓ@Ntl5-NDo`5/]+'0ST@L&3?(J?o^8J@+FmcMahQ<=.Å -m֊dϤt8=t!iP|2Z -)J{"3&>vWó{2rس]jTY_ j(2?EIo -k3zq`| t;KHYO4?W1?.6j.:<LJr`x#M)>14'XԴBv0wg͈11szЦlNjډYmpy{ 4>]üXH*wXRŬX|?HK`t71zO7#8A/!k)cXZ ɩ*u}ah"AP<_q0|ɔ$zng1"ۣwBƠW'@4-k#N 4zv^.Ib<:Ц%N_󗁗:R)tز0[ 3{*?z;Np'g,o^%Dԣʥu;M_V.)۳p":EdžT(M0vva(Qx,-PM˜L^rnc .dw.-:]hJcɩ/skcċ#}?aЭ3{X%rJ6AX"oC?usd-ԌFWW N aM?ݛro[^{]{*A,V6 LϜ&_ܺo #%՞PI>&I,K9 jn}aKtO=׮)Fh)nwOTڡρ޷ ,;?2 KJm`+)0ɮ+;P1JߙN\[tZ%cE77t#Bt g(/%~$1a&_x9Q/S|}e1TjjU>G<{PBFIMC#u -bd)S7o 5ʭ5!gL9߭d]l~>*\ҹcӳvP`Cpqjm0-eQ6> Ġg{ټ3tg`x4ݖrڡG"WLXQUq7,XHNaup1 3-WT'EES&b\2d.u$v_~vsÆ2F˜_{:tt &4 I|uLjC uvqFe%| γДgoe&#c4HG -E{ ax { F;쪏YDڥyzNhnsNa.1,b&6w0H6q'KJ(#Rw͡ylF^ZSADA8eyOk;rO 6-J]*{"P(AfU_# r;/%dBg!pmw (Ó2u4]o:8De-cMS,'O -AsN-Yź.aQ,JѰex#5&HF FFMwSR 9n-ѓ-o^rD٫9_M \G#yT"F8t5wV(u:>!^Y[%pH ,ϑ;b9z+6qr=n͠1xJJhD-Y#}Mt A~C#h$"gۋGB'U{XyqR mԆJnmVvޢFST-.`J|sdWT/2EqKN<>; #~>lQp8T ~ۂ7r~TQz b>ͽ 0=Oo sƋG&fG딬6OpF ʥ7phwV`%/}wzL1gKu?Q}䀂g|:o("V3MY|!a˻vb!ԏ&eD&eaqRs\3Cg\C8p׾f[wu/rJ#/!̯XN@K~FK6j!~gQ}|x v7RD yy5Θ rr`Q> E< 5X7r:&T/︀VEU#ۛTWi3 w2/G/iPgXE}roeQy (8mCvar6Md.)#y^q@ g9Ivxf~l2ߤ!lqtt+~Zrf[~K{(RN,Tq>vr|Sp0y3O@vۺN[f;Lm,xcMB E L:+z1uK7v| 񴹣SR FD/vѾ蚘]5Ԯ޳| \;4c@)ۋ붘e#guK\RV!?h>#dϾ$Qp >MK}mO09/+}یa gрy'ϛƘqE L>ẜ Jb C6zy*nXYw~j Kfk9cn҃u=/7lEZU Xekw Kզpwd~FhW`n>TJ -%\Wif(% {hڵ:|IZ5XQ! -ϊ\G4pZ؀pQ跟Խq>*":N!FBpzJ'vͶ ӗ#;L7%6fjVYm4ړ ΥaE(w1]|~s n: 'Ș V_:<&Y ؃>l:BG*=h2ypaH^D`u=j%&Esd˙`73S=q ؟uα"fw?RCD^9kd(oLճ7C. gPP[Ru\6m7 ج"|S>Mnn lbK UvtpwV5xy3!t[-j,o-g>B!\^ Tu61T|49G}4Cu?:HiöUmERL~G !W(HCt`7c5PF6v`8ΓRK==~$ qB'f -FZ?ª wig ǷZw>4Xh;)t9Qy_+ 2vwc*VK6s?+:70f< b_.]#xlpVY"FLi}# p-xK FU50oհ-Ip#Z>ys_H*0(ȓz+]"ֿQæOG9<5(o +kE`RcètN^eTS C*Ycl -.:q?pgC'5Ica$f,AZޥ ;2檾V_,HjZE,;j}f:Ҭ]"HPKǬnAiԘ=a /k#6w RAgHp`kM4S6<8?YxA>N&"V}nuDy XǢ;jK.F51;( ZPL3omֱ/*#;_ D!~mTڤ?t&\Ȕ|pf?tS:H~A(zl(T,i>xy@oMp֦Bk=3M 0.xvw^Swnؾ-߸8䋒'OzEiYKeg+b/R3UL|~L ٚR)Rd!>> ne9|ap1m!ձLQQ邝Ka)kj:YBRi{[o47fwQ؂JQaUZaH2|i32ʫ%vU-j˙ ӽHc -?!mf$r{N1X;x3vy~SNQԷos<{C>P]VN4sL| ŵ>ƶ{4s+ -endstream -endobj -2167 0 obj << -/Type /FontDescriptor -/FontName /PJUQLZ+SFTI1000 -/Flags 4 -/FontBBox [-95 -321 1415 932] -/Ascent 689 -/CapHeight 689 -/Descent -194 -/ItalicAngle -14 -/StemV 50 -/XHeight 430 -/CharSet (/a/c/d/e/f/g/h/i/k/l/m/n/o/p/q/r/s/t/u/y) -/FontFile 2166 0 R ->> endobj -2168 0 obj << -/Length1 726 -/Length2 37373 -/Length3 0 -/Length 37921 -/Filter /FlateDecode ->> -stream -xlyspͲnlXm۶m۶mXb'+~g{sO㙙g!#sQt0eec(H2210aȄL ],D ]L&eS## @@iL/#@ focfilqsspsvsrg)`fic -WДP˩ML m -F6KcS;gS* -brWvnN.fdo US -ӫ L2 sqmjb_\#G2ǿ%:FF x3l߮r'>?RLLAښ(m\]L&NvI2o ڙC-# ˿b& -.nfhQ{wdMM,]m=?&v6wת -" -SrۛXڙ]a? -]C_:貆.Nm*[7-'#d_:9ڹRo_djaj bobV'ZXd_$(;X{ x0LMM>+rӴEm {BaŔޙE?S5IV<,_zH#b|`%@2 pLPOOKk2hv[`ctV5ex("uvh:S'Vg5#gp Zfd)PIDڢtɼ,1D]nBr4~9RtZonT$RW,s*5% c Ьwk\8¾PƈA,RZns0*_ R\#W -+l\iT\]B~:{S"D55o*e5%ɫ =n5Yn9llh!$4QOHx*R} ՖBP7"N-;DwItg2zx[˜ۃ' b ZaejFw3ӑſQKG$NxVH 䣉uiѬf*~UX|z/vU΋v1.;To!Qv7 /ٸO0כoj^2l3!q@)6jI&hЙ@rYt!] W2FS2y߃ -P^o*JjV6lѹZ̧W. ?a6EoB"ў" 1  -铀2\eT,F~}*LeӄK4%%'p Ï IXŸ:YN"V]C DxD-}ݸV A IO\pWn&A\mGQgu!;$&_qĤǬƺ>Io9=~K4C.. -1&2/[K;/AV\N ApV~Pb/RB8$V( $;2U~k\6q3W0=g(,k %f "iФtB4)< [2V Gp,ؽ{$ivnW ['k߾& υ3S%D׳>A3"_m/Ct\:R7=C6 m2KjS FA@Q#e3,iM/BΦ >+Y,װJdԻdQ3=o1nNٝd6BW -YZ{'f5dleuaG6%UT{[9PpDRGƏ(Sn$xAp me.\bsǜT$%'׻]H] `BJqCGTV[pYpi%13``PjxEݮCҊWhXx'@/IO1>8sEpm5r~6 :[r)$kc ㇉__CUTDnuBvJX៿aTj8@'*HϛXFI`VlhS3,ޙ;;uZqB=G -Nm5wȞH}3_iNxX<jwàH1k'*OMn >jq9cieyӚ-&], S;;ex~ -^/ǩ)|3([`?=ҏTc[Qx&;t*@Eo!jp]S{^pֻQ#aPȊRBLCTcb9#DZ<3KQ|b#c)ů;=-u+xqw_X.a@vOSNScNMS -uz|9QPV͘3bd"crih;b:=|Jڧ,$xx93>\bfMN%rwya=UjoW7:꣗6K?-1KZޓA!Q #Ojbdڭ\l]cm?/\Y&bhx,j7~۰Y UCOɓ84w *= %|(JgUѕ>;Im#=w:RqЄ9DQpObE!7îdL(gߖVZN|'!lu"TE.W,=v\ o9 v+zQo,$x"dD9;Ja)<[K^+9n)%qRE _ݐ<AA+焚=7r)x)MAVaJi?ji7]Ssmtduܒd =Mv࣋1Hy"$vY)P?gX٘C녖5:)-"OoF j.Cde95"~@1<)ՙ!5Z -EjGsu3T]1j~J]_ FdKJ6ThRQb]ʾOjI;P6~r2v童IֵVR2j* c4#@ -<̯@}:L4fjڈ -6HKkʴzMw̴w1O}uKΰ #ajLOf b}geHԩh$V*sw򟷴c/ݙE=ȁLdT;ؔ/{!F#3No~2E$T#Ư䧷 `x+C=U"݃%}_g|HGAr!RyQl 5 t{?W̮#?2PyR;hcF -J^4xnu$7·3T(`5Lm [3>f\VОo—1. ru֯*$tHšt?>|9ԁ*Q<|'Y!8Ypk0% -(_j!áiA]. 1)6_XBTajdiçkY8?߽W];ŁzĜzLpRб-2Fg)tQ6D12&@˷Q#h ?xMpry$ _0\ -, -!*{fN'(8f@ Ɉ򽲤X 7yX!mEOg{Zwq3^In0VǬS\ML}E? \y伢%4C:bp 32V=ԛBXx-:[1U֟G1Rnor>8XeCWf5m@+ߴIf>)QjC7jj؟àlu??H#a߲&/,hoiVѐK&}m;4nP֩"UQq&! ֠| h$Mn7=+ OqK&IL1˚&{rw6Is݃LTZ3Tż -Ϊ16b~|nv%nE쓍u MonaE7p2jkFC )dhj@ &xGD+!\`㐇%H灈DZ %N\wٛz5bh(4!m% "Q"lӓN OxiW1h-FB=PaD{s`TB^H} " 4/#4ڋ(Пc&`ܗtA Jӷtxui9@Ggiqm5FRdRX'4ht%L^%mTJKUp&M~XNRLЪBS?x$eD=y@Z?É,z.r{fJ%{uqzjdn/_A]b+~uȜDE<7Y6ۜ;%+9 XaRZ(EHjTU{.G3T4j+YcˬoV:$fa=ڃ4&3 ⋘}i9FeQ(M M-ni"Ԉ!x;tA1,CAףa~ksHFM7PX(.]TiMX>'0 -< VRȩz-Kp/WFf~5EjD -myfzR0bSх7BM+wwU?6蹡JhCHzukEmiǧ FK vԡs"sDikN48 ]:&K`v{g !yA%Qftx'ϤXqJqHr}阢{3 :c;&B'6 ZjNOl˛U%!˲쾻KޱNCOE)w3fr#]%5HR%tgHt*%7Dۧc QOa=z ܜJP?N XF4R 6ݑLT^!r6 P#!%SK糙( -cʱSҘR8c nXT R@ĽWsʝ}-Epf^7`5s+PVa!v~66(fxCfȷP+2s.ecPP1A -Kt,=]o(7*(MC=.;Pad򡪕z0F㞵3Y,y-K F8`'~4of)?PX2XkB+^%}[Zh0` -ጩ;噀4tڙwy"bv׊= ^kVCXWGC{lm:߂VtzU#4heTyI?tM+͌5>{I=!Ψ1g'c/dR8Ǟ{y"%P}`;cn,l`V_q6X/'dHԔ(QEQR:qܵɀ)&MQQNΛ>7_Ue=5inWX!9g:į9! zFuRMuWʳQ_vK]Ǣg +J ݈vAg|-脘ܟb-ĵY ':Z$y"=]q{ Jg{v?q/quu]bK>Ǡ.f(*%9x/! -%BZ7?T--T]{Ęh(ljn*zPnGSy"uEoϬvja^:RtH\[yHOT:47mm;ɼX!f<eD\?Iq0n~#O"#V3ΗþsdXD”8WLNm7ǻ}LkXFL+y^-e0D6 S_ԵX%ԄI|"d>wJWfhXs*UpTRh -o @n ֹ{朙c#)6M#wjD(8D&0:B\,!kg1Gs]_Sfm_>X {yH. -$m`yͿKUEO~Y#]ioӄU+'-ҚQnOKG[g)~J5=[ -zJ o c_\7I_21@j؂6k\Z|ʋ 2'_5!w -x@E3H~$05Åﶤc-9Yc`R猂'+[!,]e7u-$yA)[ `,8饐+,2,ZcZv( -ϣaSPIɉju2*՝rRiMsXK1t d_Td117V4o+pSW2&i+p,w%!-$] [k>ot;ۦ~D9r`w4,y6X5+Va8 az2K àUbW-r_dWBm/} ͸ !#8,-ƌJ% [$kN#%~z72j{8N :`?_2Ճ \2"AeTժ0M't0 iQq1'~" Sp݅:,ez`)Kp7`XuY<GmgHksU 3Lx6- ;([8hf Mc*@Bz_c֊cWLTm ̒x7Dt[!^%Kfb>OD'b,#WlwlPd~(s#A5ȩ< 0IvXn_t"/u/16_uQgWF0(yb[NR`]bXF̩HOx?|l='"N5k& \LUͲd)1M_*f|lcN_.ZB1xi-PΡ8P]=,, s:hv-7rvZ$(9~-t!xCFA)Jrf+βQ/";UCO槚%NMۭN u] !|5o(>*sf׭* 3HE/ɢ9~m6嶧0KN#&;g -,w>L> &1z4Yc{YsUR԰W3˵$BHw$Ktrp7|*:dnS-K΄dWyK^,[BDX@. -?|w -XWksNq7}aq|nFdci~/vJaU#0XZ>+k -~1k`Sxx8FN*ܬ WUS7Z6s:pEKWś?L0]IK3QV:sJ'4'BTpsBp s%%,e?8 z0F6cPf'lZz\[)!b#`b1cotF<ݡ9;LZrwsYc3ħ~`KK"OE~'ho(oln,iPR3bp?fM鲭^xJe~F0yq̀smU/eV; @X]91ydf{fpl@h -ˣՑ a{`#ew0JA>?T KO̦F$\26SBQ^Yt<;" @3xHIe(VSx1˴[DR8D^RB1cκ;A,B4jHRyCIW(ɑSJOrMzJct bYcurkءX߫ͳZVd3 9? -/^*xg5(ٞB.fr4uj2  (3YO@;gm!baY@30(PI_mڣ)z;*O3S0wB"h(r -fxFBN/ SߺX_l` Aqs, -".4/ȡu )hAq@rYN]-ˤ\2w}4&/Tt"ڄg 11,6QzIv[-~F=xH'(r^1sn( pi[mu,;s`3ÏC1)0o!;.C+oY/)rԷ=P4jTӵr"7Қl3C_mqnFZLWWtBe9'+{)\:5 8x T=m^S@I\L>xng^ő\= _~Bc -$ص-p.=.o݀t/i0p3fxjƯՖ쒾/[QN,*wF ;+ -\ٓɇg ; -)~OeFoyV5t{}_I2лº>f乖nzGRDn%jϒa)q3uu_ǯ -=Y\0~XoL:n2p'S!J-떦 -w98,E9rE=4/'4;BM.EEcx+Oں5, -Q2n!~.,'N q>3R]PȇH㛝߰_}{aEp.,sTپ%ԉ1En@Sv[cToܭgb[w[& (^%o$-TH.“MN6Bg_[v@'M𶦎IGŰdi4D 4ffI5&nZOl\+A|]% 4Qv{Ν<1 - b,>5 -Lj!B/yY^p9T}Wn?``'G d&$h+XVDcP_@pai´^,̇`P@ב7GlYlXʃʰO -Px<Ƅu"џcf7%[|دW1WNpV38{%o~i oFfie-!đԋT&0؍a1"džS[2cF%Pi_dAiUn"PnN욽yzMl(i‰/bs\Dt5*TJ;>)=9|_1D" ծ&>B;ٙ;)zk% puS:0l."p%3p"z9mZs8e+{;^lSm/闷Q#ē v''7׵:]:Rߊ28.tƁxm@l_OjxK9ڻPV$2F -=Qjx;(EKݻ}MS ~7AdNF3hPN"h ].7rSȊAp.GMt xZ -Y -?lfVH"o9 R5? ث؁n搒u$'Eǘ`d01iZ3fПaG8Oa@y-&x J!T+9~DP3*r/H1D_y;j #p]uj&! -Qԛ<~K:Y@˝d:ā8I̝r-OUW7f(sYRcN̊ߩ7jTc[}Mq8 k)@:(_m3W6 ).9<u! aA:hfcxxKn&ش= ?tj/W 5ڬ[b>3AKw- -vAKC -0▎PQokjr4d^)L߽KU6EY_kK"u^^>ǡ!+9sv=۲UU+ W9d@w?Jm2oI\t'l"(thc^uvHFn|{/#ev3 -Z g,A>ώuH&kG_:-0-i~䘜rGgT $镦 =Ī2m5/|n - i$BvW)nY|@j<ät|(BW%"yn3EFU]G)r(-e`lܰ tf 0Hԣ+gt V`teq׈07#a!We 59$}v -Zx:mit•p2vIIf&T[cǫ WĢU%0~0'_O -I1Ixꍉ؈ί{ߨ%1A\y }sd<9 +Q4_ͭ ۮvG:!IlŷPI:Ki z b4,өg1{ ρ߃|-9FqdIxm3BYM,q$7-P(i]"gϐ̐c~sԏg {rZ҂%[̀p[?@+FmHeQo]O֒㎑`ԁGNQNET\KN lq9EsM/*4b{#7L6* -NTWd2( ?k{c];l)rްsZJx Vfzlf+y PRO#7[r]mab:-D *py>z~Bqy<~t"R[̓e :z9GʧxPhȅCvWna=n&sx=M^);/3i+2'ENxuP}͟! -b#sk‹ŵ䃕PpF>SlE-zL.}7 -֤[Paw&nC>oyS̝rcVM]V%}NH`G\ < 4?Cǵ6Ȓ*};OBZ[Z,պ~Vx]L˱_!ӂ@ -}!.m/e_IhMίTB>9{ǩ{lev?۹]2 '&!u}eq<9[Yҿc -x);[C; |x00*B2:A7飈>.iYwT"b -/BzO}up&a(դH['^Gʌ%W0`Zo~_#RD雓,$OrG"O," ih%´TNSu>xkבr06cx H(·:p|$;[)`^yKv[8tf} !Hy 'MB3@ #Sc;'>agb#-v.a#jiY|1]Vњ'GޫFƘ\S0?AB:`abͼ>b*tD$۶m۶m۶m۶mxm۶PJ)o^7m>lW~'FqoMpχP# wsR&-zӧ3RXF5/FA -Ɇ[z 7ZTţ -(]wZrgNk:/.DNynP:tK4/G9xCxz2˪^[\)B0?B|FMk nZy. [ic`6'*'_}fX4EUAoQkԫ`FVZHx=*|lC0H|6.&F84t1{UryӢ=Va׉aTau|&żC@X k[ ajf暭Rڿ҈)Xs9;$Ŏ ^3~ç6nxC3,YXeHtY֜g -dn^=֭Z|fdīoG6M)zܘ oK)cW!z6uJp?(3:x -gmK@P.,2TU w<χ ~;(C0)Om#BFo2j(jJ^D~Ñ;vŌd$ LNzZpCk[?K G78C{PB6xɮ޷wKsJ*V9~&&[fV³,&?5-W-q h-TNBk0n`cgǬMGYnM|yFõI6 ~2C&(AOQ ܺ|eUHՂ>|8 2|J /igKO*zT~N -ӑjVG4f#o?~~W#Zbqݗ=!?HZ3򝆘s ֬zje}N;}.rҕP'F6 ^ -`+WG-i^yT_PTWJۻdBC\kx6E6\h_/UG~Ȼi7B{$7H/$9y*&R3mHkuh4um ӃuXdm픪t)n۳4p݅phgtbxieaGpGqX13|;v=HatR\ր2җ˔2\;op;g٢ 4qa)R2$wL]Qz{i늅W>,R +]:sM܈qI6k@QZPc+,2=k^^[ZIB Pc}a:xn!v%ۆP)X3Yi+˜ :D蜵1ÊTa8V>~q0;x)}Sz]~ U c^*`9"8욤=w+hVzeDg~%W9%OVvx2aѳ>rJxG9bSvePg \+jO/1J2wYF:RO.%Jm-gpo.4ӳ -,3|NBa%3K,Fw(]rs+,e=X@$Ǘ9]dYݒʬ!7}޽g螄ۚ,JNlJuh[*nDȕЩ^ucUnJtO'sdʮv -ĭ.cED\7dpԄ+kÛ*ƁDlF/\m&nP# k׸CM\ad\q" K۝@Wa ս -GrrujP%& [$I@?8|G[ţd\a0ZrŐ#W'^KAٔbWh-BU -iQCzW+^wrQo;gѭ⾋fYn#F.`cB02&>)RoOCLavJs_]\8[ zwlަ@:$[Si&Vumo)~vI+ -*YN(Gi2=1S3Fmz~ m*L[Wh}5xoNߝ+zyD|;!6'&uqƟNj{!GEi@nө`hHnW(S~甒1i^qXфhP 0Ylq.S]qD9@׭9Û(W.gatdψoG;.ɿ,JigCJ_ryn|MLr"]O^U4^IT,:V`u~H;ė ` A 02EX0o)X"l"eVzEƀӿ0(L85ѶBV@uV@Ӱh~R$0V^Or;BBrsYOf3Z.'[|"2,:ESh&LLfecJ-M\"^v_m!45tWL>\ܞY ҈MeFCHU)T~ȿvɞ Mq*w!~a]NE}q/a#׬XqAk#P zlG2A7PO=$Bk:Q^ZMeK-%ǒ?@khir?'P%B(v `k Ztqzsmh>&AT>*7fVw ) -g37o5NZ\d[CT 9ˣw7bEv(&Gl{P~N+]IoQؠWXI&c,]9,SKV{Sܖ6ikWz+M 9J^Ř8Sg ٩ B11Ib}OoBbW -~k0[#I PJ>fFRϸ4a~`}O }&E;dsՇ@Լ({oTzTڈ㷶܋1Op`S/ލdD,)99u`26A@]i5HruȟSk $,є:D -f0e}X0)rq=5L :KQ ul(Ckb2ݚ#Be@ki7$(j&Iq}H%_@piNf \}췑iv7py7Q Ky:t<׶oN7iם2D࿈ȼٱ3kׯ]&Vjdo~8,uMu MA2\`@ y3d(PdZAWr %P7%MTXN -D>11r4<'GF -:6\eD-=N9 Fa]t)|k hwz$xkx-KAC(CNmaD*]/\$lPQvW {܂26Bit?$S'd˸6$+rlM(WƆ;. JSd݀C?^fW -R>Jcl-4akJDӟ6^ -M"vXYr-nNAȶ8yX׊Xi> R6]I$%֕67^n[KZ`fnĩys^R,$>{kw5+10"n~\Rԭ)A9V.O7R {+ -9آuI3%I5Q6YKŤU5XXm̽Jo!2>]RjW뉛8WFJ@|RRb:Z2"5ƕ/t.A4$MW3J;* -Fo p\(#gϗ#A>MsBgdlEu,D{qFWdoz|Yv84prL8,1"]6#^RUfɡ/:MhU>iꡔ}ݾ)j<o7>sM42M A1:Og V|(9ߐ}n8F)PN<:T}_~-E6.y/vməǸJ] -ǦK{Ul=颖Oo=@D3WOmD.TyEi'?%h$d+gmP8l @$p[م8ɯ\]3I̺>kuنGX[j8O"Y|.9rP9ad`0Լ(ڒ*ݒw/ fL_dG,RzhL5*GEsW "iJcQYmB[]4*TGw CJ| wtNd -iy_!ܬծw8*R0$sk& LD# r2PPt`%p4̥C|+ üLCK~Ҷ{%d17p^v 0X4&SvZ]Z -肣_X֎Ȉ'Yݤ&">Al6naр[92_{t\ ݵY vp0eENrXa\WŽDHNԿBVnaA(gqa".ʲڄbw_ؼAFQe-8;A?ucvoW -ύQ_Su,"8)$ yj-nHK{7W֠Q咛,p-\ݍUL0ղD\1tY@>vɖ0d?^)omz\!9‘OSGڄ%]̨ܡɶ<ŕͮh6wv3[-Z9jyymP&'+HWCBXRNMTB8R\Z;I>mtLo"1am*I@aи*&)ڼ0PDa܌qsI>91d+ܽ1mM 1l7~S,ևEO{M 7WC7px*J$}BHc I+)ʹM=oQMu<3i6^|3oؘŒd1K #@0fW T> L$drOF^GbՇt}vnðc߰zsh -W -R, Aijq629el?wm{`TegEwⶺ㝁1Xg͚E .ģ{@ϙjE{Wm¹X2.w4V+"M߽ ;>/dEUЅawtkiĴSK1AVzt0e Ͷ6~j s&d_K_G\R$e#[(CN?F 2p|M$τbbu".W)%@l,dOxs!t_zɥX{S:.@׳sYfD3|1POJd/PG:R7o9?"J mkn7.nK;+Gaw@&Vm; \%27`C wC݊#I:O˾H`E`n1=h@6$p8Lb45nXRC[;t7k^iAƟ1ig!x4 hBIce*m'v/E^XS -V, C(Y@&D5 FƉSr/_5" J^#cld@% -mcVaAM|H6vXA)BIۭYwqe΅qwjkV)_WZ8wV=m@!{0{bkM W 6yabHNШdHG:m)^޳.[)_@ow@0d=su="ȑib)~=}T=wnKp" ;c=&>SqXէV9(8c`3~O#IR,&.M8vn䦃3HS. -g@`pNa17SCF!dqUnK.n!zqo=+*}Ԉ%rZ:3O\d}J cw" P>:f[g -,AiLnԬi$5+n鴤ì7&*sFLwk E2 =y75uV79S\Oُp_FyZZe#iA:Cz.lkBƈR@T *)]ao +主20t5 R1|lw'K"㟑nATn$$>ϟ-#xE cE߱q;ctK+E*\:Z5` -.U7V羄%gCG>9.\?AJ/S~l9|oO fhpfLWq f3w%tO. FiOڥ8$Ii c_Kr:j.PH*-u:wtVO'ovk -\ߩGGS.cȐE]*לs:STUK7}oq~A&ס"\4XKQX (KMyR‡!@v(D;6PànY_Jq\x:+SD”G0C#f,%F3\ )ME9e.Ǝ#V\OwUz1BmFt# =,$@^oO+7exd<ҳs#u'6W+Qrzw!䥴RvKsaw{3 P:l&Ʒ,;5z,Rj&2Xbau"ED:2W[zya/8vR -+a(Y0Ko~F-bUһ#O#6|?rQF]1K!g -%iַ}@Z`z=6yGsxz}W($ ==dr\$Khpr -%hM֩DH2]3U^Vj:>E!H*x%g/v-4GlV}5Xp#7 D;-AK';{: ̮gωcԮ2#u XݝW9aW()Zsּ8$''j0u-ҮX`O^+G 2ʚ\GݩRFaF۞\7ch2ʝ׹a5j-t|-۠ 8~$Q@!΃:]lG8Mh0YU'CB9}Uy!}˷1Ou.[7*&`E2~K8A+0:5JÛ4Wd~7+`,,`d %fHɕǾ]ӠxP۞xaC#?N¡AGOu۟ֈc/nBV=sC-{  Cҹ/1T! -mx -VzLɃ:OcME|Ϧhӄ1%w\4kpz6RAkmG;xώCYVMݿ**Yi[P{{e†VI#]E=m͊썝(bxC.`Qn=lPC2̼_׼cĿ\;[ȳV3D)3H@֥ϑ[U -N|D4h?/G ig17W;E+rDdpjilvfǵYaT\y(I9AM8)T^ĕ'?3kNJ$͸&H,\^i}C텷nK: 0Ξ -N#B-8M Ȋ>,wP --)H]ӥvi39phtfe)mDžNZܙ -"8 - qZQ+_W(7-s)\J"vXXLhdQ,Rf7`<|)ooBF7qP'"m84COO5Dhk ygOK}=,Vi!JX/s?R^Ry2IV\b$N3Cޞ;z x7b ˵لyEobp}pfBM {b||9K.n[dUVQ4N]t9ܝ__qHJɒr}f`$ˇNӢ)KVf)]T,ȮRj ^L,Od6jղD[imcR/:NíS -h+"YrCwb87|JI7 bwPT~2nݳIk2v1]g+Au!K^U[9!d }Y><8h s$>C¾dܥ3[Wn(TNCt#H٦8h.JA(S$ϯWu){XֽIF98= .-'VgFm[aG=zv>xhgTgmIA?TF3$tVMJB]Ѕ\m:sD7C_S -Oԁy$d$u1Xh-CP3뚫LvӪi33Gr"Da֯ܭx&LШ7r;ƨ]Q4IUlwx#"~y$$}{>XgGҀ.ө b5[t!9a-ΘK>d -5xJ*]Pb/KaZjq{(Tjo5SqX+}ha!Z~b֘h:bp>]s"yݷcn6Dluϩg24%H2!ACv[ ̵H[ a͗o(=#k.=>BFiyL+&}쓨q!>7: Kxb'[OVm~#0䢨LU*vGlKQ8!^W>sNJT@k B!uvQNeK:f9m6}>$ֻ]#H0ӯ+_߫DKrrm_,ɺTA7|;ĩE?H}S8r'F# -&Q}v8( 4mx`M{+zp*aeJ9p`(X(wXry[qA0=!=0ŔNR!M'Vgt_C+νOIf/y@*cO fq|d'JABDs vsxscGo16a*0wŰ蟼tx)T{\isH*zf0-tSd~:uE#u-,P]'4xvgWyc@<65#F9gUQ3#M-gwd-ԷQчmnYe)cbjq1\zئn$ 2J0K3@^G(ЀaoMAs)7&i- ī+us; N<5U{<xݵRfv7f١q:29XY!3dIO]_P Ednk(36Q.G!'-XvտCC:1c٣A]n͋O"D}z+/i¨aYFvD\e') 5uYs\hP#@P:UjO@d3|i[cmc֒T/ _/Bbo+wOT}VXNY{T/>T;#\rL+\0ώ9(Q:M1psS CQӳ{K S  B6;*<=orTv)t 6֓WgNLhK>2;ͅ(ƊHYQ&d+yo~ؠ#FR$£-= 墕h -Gڵ6̑KL򛑅" \i.E[h#9%Js͋ p; -JG s›<22C*,I҆sŊ8mD@YIps^B֎gaVZ N6Ujn.̭@KH$_$iQa8mҴ_ƽ8c 1%2'/nDT.ﰎٺG'˥u*&PPjP?%3ug!/Y˔+Kv _v/ۂp߽4܎~bL,&z`= 3ƺdui+jSWI(^/Il?mDZ|V vECMd5 .y.LKvA?hRY"6RڡPbgHL'~/E}!.l/yCdhX|ҫ5 -lx -8z`;4XvJ3Z"U9|܃{uzH޴n{X|=ʖ6fC:x|xsY[`im+tSPm?X4c{Y % q ɢ=d}H6Ih"klZ@Xԡi\=h4u$ Vd M}*ij0 /1]i(\Ou .LȸALjɗsݐtC='"kë&V ,tʺ8-Ӧ+l1:8%< I+$MŠϬHjMw]$g u #s'c:F3]\ B$WB٤- -&6QWTn9߬X~3U'sZ Tog5TGVL -]kK[F3|Aa8VЗTQTt?W,rUSnZ`}p -]^G[_a##bֵ؂wQ]וj$<Ύ (^1okFf$`X#r&q\w/ΣG8,ZMcM3i *cmkuI?cVXc&SB?Ş1?}`;ªa$gvu`r+uĦ˶1j;kLX'iB"vx 4K R>e6|ɥy8;ptM~@mR )r1rٔlKfP!4;^{$ƅH>ڒ.1W͉h,׋2z(lWb !7[P.'*zC$< j 3T!-?z܌a$?oZ.o֠#L }LCEʣ,cX6gG*Y#9Wk7ge ֘IgX`%Fpiά#5Bhb -J6bEzwBz) -vrQ?kD/(g[nd8bɄᴐsf0w^|-J̡_Rnhvqn.aoK1a p}sX<",薭۔EAgq q<EJABXҫq+ `RkK}gTB[^.DG\B=,䒼2 & TZoplHRvaR[7)9ƜD.Ou.^[&R@NX`0GGgH܅56_Os_io$=2Tsm"Yhvebq zqHlɠpXF_3jԗ{`tչw_RZ# x:|Z⹴eq|@`_̶B{+-/[ -&EmYLۡ摳 o&ɉfW[ "{ŹltGlOTpIBXyόͯY%c ρ䐾EĔfg˫Wt|y%F{Yb 1fؓL -N@8-AIt9c\:-q[-3/}F-.Fw Fh,AL=^)d&S<םe9)M.f+?r%8CȰ|umERu.^ڰ}R8]aQQk0H.gc|HCDtjwj8 e$r#Cܰ~oČ-7% CP[lFM=:J+CFT1Hʾ. -1(_-xcO@37v4DC7t,M_^ -=t:MAPEj3w >U2 :a+0:/{!/l}+tm jlC^oŁ `a^s$VawS6GL{z_B{6˖3b6T}MoVu/6 9T1DaVrhؼF~GPUz-\d-#+ُ |=pf?`'s3x1@?Q-QhRIeSs -_4m -K|q}B!6+jZۋ)_S5Hf ϯ۲l{MvK&GaVnpMOCqVyIPER"uf,X7KZr Mˌ3MqP]tyb6cRO3DH>*SoG8v)qqwVFӞk 0%aBd&}/ޟ!\QyGS\ꡦ>ĵ{6ֈbȜvG,L=KsX#F)V_>E/~:%P'nNl\ Gv ~,Zү,؃%d Ou Lm;384"/rekB)b2T<#ǿo+k!9bHMQxE`]˭&D?*2F]@iŋ6GUo%'݇aYo"saAvt:R ): jy|)UOKq -ƧG\C^U@ *%8aA:gmģD,Gq9q53 \kbq*LlizLw~9m:ك"8K¬x<[Fc| +OL b8LB^s[݃@p۲B۹In)]['3fAZa=Xn( ̨K,F)jSRjlBr2CRXHt$F?"V<}BKho o-D |an*]Vz -$pɽ%Ȼ?qcQTp!AĻ麐3EDXT@7ߐB Ao9-?XE6g/'/ކ%b1$|}+Zy?/']Ri86)aAOq~[z$@gS͔32Bse76e/$aߓ k%o!CՊ҅xUya)/aRSs(:JDE꛹dt;8r]@>!Q(xEݬC?'[L'A|9jג ME{mû@vCIJҾCm4G(4Ur}P5HMI% [{{mPѐatz8F ^yTQhU,h xϪ;f ӻ}>GS[1֓>͸><v-`Gf}x)e`SԼN2x0(!p0XRhBol!a"֫da GR<"쌫PΒڝfDTȣ+*{ mJS33Xӯ?BiƊ%5C1NV41nńɡ06,S_;# zq0 #t9JWP~s_f*@bLY_ڼm1}kWJ='5XKK)e[IȼWw"gFx ks2lE Z␁fHG= 8t%lgO }M}+grgD_i 6vP\@3Ϩ+haSXмA\(5H juj| $unzzU"P kiuƳ ߻dѳTu=^FA‘G6~^]Y'Zɤ{|:%so^N5d-cb*#C3w'L0E4cV2^lA0xg_TɝinLt,;Tv{UOKǭ]^"C<]-M(=4i=4ݖ9WG" 3= y wo.*r -&E 7/V73v|s*pQ /NLfM8&MFf1F6MSq>B|!sIlxLz;,"<rnZpQVH[1{ebI*Fwt&P6h|[w6 OX aYOPBӯQhS!Nh/^X {P;'uIuG* LixpjjHv\^!k!Ґ $2?IN>MRJ#WfCFTG -V\I}1x1FW\;C7+Eq#@ -endstream -endobj -2169 0 obj << -/Type /FontDescriptor -/FontName /IKHPDP+SFTI1200 -/Flags 4 -/FontBBox [-91 -320 1380 938] -/Ascent 689 -/CapHeight 689 -/Descent -194 -/ItalicAngle -14 -/StemV 50 -/XHeight 430 -/CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/X/a/b/c/colon/comma/d/e/eight/f/fi/four/g/h/hyphen/i/k/l/m/n/o/p/parenleft/parenright/period/quoteright/r/s/seven/slash/t/three/two/u/underscore/v/w/y/z/zero) -/FontFile 2168 0 R ->> endobj -2170 0 obj << -/Length1 725 -/Length2 26209 -/Length3 0 -/Length 26663 -/Filter /FlateDecode ->> -stream -xlxcp$牭msbmcb۶m۶m:]uӬu]^6֎Jn@FZF:N# Thfc-@[ooFR#_F=@DgKO"p4,!9yu Y12@ h ׷;X @J= -09 3`6V%Q9Y%@ -O?@CGR?x]-02 @3kMo>?RD;YZ[B6VN@{?ܻ؛cP}+3Kop kcAh$oߎNU 8F6֖nJyE m̬Mooÿf`+@F_ov-+_p ֎"ZW0@C%C䦠Ro2p*ANXXˢF-kJ0kMEQI1UeW"i{hIP6#R'I^s-ByL.6>wrUN=a{^ĄKR&0KB^aya@&?4n!~ߍ`"~6qt!:3[85} lzY6?Mo -:?H#na/BW[d_V`yf Q ;.WrrYm % dx(^vJ/ɢkE_ojzpyh;ǹf\nj֒y"kyKQ2[ŧfp !KM:!* -KfurWhXȘ nɎ+Q~bYFz5{)Z>ƐkECSH0fT C㘺bK~)Шa".X>9U5N @<,LX׾5-m1T (3ߵ-?..wdn EZyU+{Fq8ѭ6RqvE-}/=B 4+`Ű823Q>T|.mhSUdPvصhf$cBR/MҒM 6e.!K?P,ӼX%ċ24Ae.Yv/&\y?<8Nm/E} ż)8|~}k%c]VEQR3'IX|yK|ybsk S1H. Vj[NꑮQ;rre L]Ͻ{Hh_̪~ɘ5JMeA`o&(7 %9 J[ƺ(d GOs~3nu`TEsSl֭tjl*n_dVV/V[OCm鋑dBQ^*l,GEY3]g?,;υ'sz X@a -ﭭr"k,4uaMW/sgZ9s\X{;6' Uv?gٔbش=t-rܟX,y P sqH$]VؾT} [fxEԭ8JIk3}S%tWxS -y^hqP]pDAxӕ S'+ncwv _Vn ea@`xዑr>9KWG 91N7?MFt@ˌs"0skZ=SN[u}jMɕЃ VJRs%? S/6WA^W#hƷBM8q,̪!r&y6ݚb+dY,B+sIF?;m GOp\O7:dV-_Q`BQбSy>~E$rnj,^rȻ}v\Tx &(3GeħA*$!_9)d‰FaIT6`oL^mҭW -s5y(GB Ӭ0)O|LDȉʆs՘ -ٞe΄SX*ze C_ءc,u2:_#7T1M/T\|Ӄ/?4gU~[_FƀxV ZP"IQPeo%V g UJ-x:cg8emzb,΁odBF>4vY՗p2?.Y$I̓+J~44Ԇ]6L\ 472&oXlr=߈2H!K;8e],bc)%_< -8}ԡ#2貿㬫qp(@@ùOHSes<P! +p7a[TP`Ԯ45} -AttYGc _x5jĂ ]f"A(!ZkAO̵SDV0ɨ|I;xۚV,ͦ} ~v7[dG{)ޔ=\s[؅yz\uBDwDe[C^D$Ku[?'~`&ehs̩}DI˙^K\K6qOא,Fs9xno!?UJ0 SUG~|O5хNE TErB=HrSN̚.cڠVi١*:o :\W}/(xF~}oeC֜cˆ\ce}s)󷋂{(uR`ҮJŀ*4}ܲR6] M9UMX͓}Vy+“00!خsቬ!8Hv^It^.Ϙ{́n5C+?}90r6_x #tg8)9Jo8R2BwI\l$zS*ov?˝bd= 1{~j˻.+! ARJTxFEb2c)82gxɵXIw6 32w_LF:nYcI{ujqKqď5Sv bp䏍)?\rh~~1d6#?NE?ZJdo0QF4"Q:4oT8])(Խ5ɷoa&wL,g 1XW -a?"a2j"߳NՈHDecs7قR=4>G -u CW< - -WkMC(52v^\1ɏrZaH(!UU&e;{bJu-Y٣@΍яntQy#kE .TxCăK;c `@29VX.᫲/@) (*>&O-~IgWF8V)K)0+R%Η57x IhqKv -h|J 9&YZs-"һ? 2^^P&OZ9y%za:"4(fG&ha%UrC^ֿW&n"`6{ `~膏Ŋkc -!fɢo}ji̐Aso@Lo.FdAmoOHGqUAK fYxMwm`(4 8j f]D{WB;7v= FKuSc?AW9uQ "ŇFIV$Usrܡg/\Sq#灣ܾ@Qone:cÂV?o#m~sǯTj.jdY2F?M[S_ֈa9V^DM84b3,S^䍘\`UiS;|-spZxԇZyHN7PYyUn'I#]HiV'b. wب%|{d< e8ngGE w,Bu8g>4xdFU_9=xYF:$dwKC}Hɗ)4] ϰ9AiQG4s~̴81J&U;]X؍D3usÞUjŒ~BGI\zPQNĔIV|5;͓C_HN%-M`Nm4y?d̒N8Ӄ!krض(Ro!\ŸR6]˹G0ăqVl~41:IZ*#B3DpU{T$%mִGq| š-zkguzL5|#&),FOe~yn@_Z7AW f |~Ί"Rm"QEQJ񬂑qnCat|[^:jpd50ldxjPb'X6mSÚ{Dx%t@SLF]_.wKѾ*Oӻַ_(Q(lcq) 挲HKDp+X7p3F*3]C< K }OS5O'f)0gLLW "UZU+aÀHnpf&F VE4 dDG~Q!bp*N_"-" N6D8;cmzEgg"R>G|iuhlH0t->r>ҧ{yCg"jhF 7ߦP̟'W'B{aD[ujqgNM{h5L/8݅0e×Ϣ4ysZ[ {l#73s_=@ ~n9NDc}qϘv\5 . ɿB[j~tfoV%_.R袄ci;7/6ïd˿Z ?4Y JiQ]G)IFw1Xp(f3J@ d#rEYF,xgE@ZX{!vw>'Tz[ǩ."+'_6utԐSGҿt97sc`1/^^fto -n 䀨,b e/MT! =NE2U#$Ko '0V4z1jڪszت -H~ yK#g;h4V C;|/!1F)g(S:G7PL]Xok($:LiRVHfҎ"L6oaX#ݫGݴC6H0F$Yq,4M+ɀh8^WMt/Ov !ɋ}vAyy! ȵs[D%gz\Iv -9&bY=!|u|<'b8Qs` ձ>쎩;{$pXʮ+%dE>ӬB| HK!Nab8 AjLmōND sSe3W_#dտ[ތWU5kz:GxR|T󏎓qJ܌*+ +.`!aUu.x=NLhPC~ާ -=/wOCKY=-<2KZ 4[}&L F)92a.dX# F.V;5@hJ7噙MKiÌe7}׏W%Kz+';Mב]j @Ycj x-ױϪ|x(ePSe *I*IcF0Ձ]46R[nq]%g/ȍ0xew1 Ҥ$F,#FI8rKhhj AE q.M\Bn $ VkPOz̈́X3i\U'AlmxP3l0"vd].M4LH\>7לQ ('RvB;wz/`֝B4]k@,^W@δMkؠk鯙*g]$ݣJR[dU۔ݕf!hs ̘eiUoδ˺,I(xGIҤG -VR)ClyNibweHŇ[7]e~A«Ty -mz9Y1<Na_~=Vbmqpn+D쟞MѲ;L??kV^B/{19~&NtsxQ|>N78y*A4R_8f1S!ԎNYjEK-kz4\VqS?q," BpcĖ3fN,xnKʎ? c1AN+ -Ԏճ*9 nc>Hs-ԕ7\_C!:l -2 -yXhC"E]\D5-ڧEO_cmr=;MOQ4G zܘ]K!9qB$<t/!=p4PX‡%SR3BnG[gбCف)|F7Ϭz- .^4BD0xafJOB҇kNZ"$ &CWjmTp~] RN\אr EE=Fն A?U3C(י9jI7UV" -wQx{=BuuapdTm# "СS -x0NVn[UԔ3:j|LGͲ2zܝq3a3N~0f#F:U40 ~UBր澱[oI -敬.&֟[p^*\>hX ..&H_\1ج4>]>-%Jlf]u{^NU/De*9>XAZ 4X` .~h Y.ro)&u}2}t#(B.4yxfN2.@%貅kbc}UȽ}.v4[hL|{T6yυ[Ia*Vm#[:g9CG 0&46"lQxq<ĿU7 -oXc)y3D͓]qL:3aP9SuhUvR{wc4j@g(CO#rWy?@jЋ$ ߣf --dx-5W;``3"GCw;8NYQy"0mD4'b|gjtZ*27C $@!NY΋M߬dX%AՂHo@+ - ,qLO CbL !% =!-&.-,,+.i FŔ ٟ=-AFS쳍.0I+WcixU 3VrH6SЧuZ6tqYPD$yOl˃2iiC^t/r5h=ݩ$.0@BL5's.@k yB(U'ͳb%0^"- K~f5ѬU^; A[ 5*6\y\$cqkZVjuwE6SK۾i_yJn9TwezU=Gpڳhy//fW%~Wu{gN|cK/u~HyYpBȽ8CN2!/ #Γxu`O=5=s%z"ؕuMrhYfqILj1 Wtm -z!:lo>R61!5Q|MS( @v񞞓e݁*| -!^ΰľtJ8Z}%ay$$۬}M0$<#W懯s?銄Wu@^Sf_mIBx/|6_;oMF]1%dl`t+Ryͪeç {om]{y: }3[gY6msh WbI6禔vMU e.n v3y7פ MUCoulhRa,G\ޟY5uW.D]؝/pH( Cu;i5QR6I!Gٰ?>pN89ٷ w^A:^C;zFKPD-MnO!*:l7+;$M?,W2,. kօmɭDg!nҗNH<@gw1[9EVok%mt:ҖM U?/2>Hg|a\"UܓޚBrc&(|fvYH2p:dT"yWGټz-6Nq?c&Hc_0I*;"QPw=CFKjBIxNVydG!l=f%k;xA=Ϗ\' D':E 5*io-U3 -o*o~qQ'&D7ڭ|(T:WutO -,eq嵄DR9wnw$rתX[H@d,:jf+¾4oH è{5 -}Qp2J\hux;r7}MH|㞨;f!F zS[b7$Κ.jFAKBۂ.SQRi,p@LDX…>r^i7p$'LCʵR^d IO2[,}WuY€"am>G]a/Dy͜Va +5hW6 %x!A2={-g q>$1\^W@ ס!3//Jg<}4EFd/2fJLa}Kόl$QN 7U{Y^qGH?A*gq^Vr1$Lrg V0$5r㏵3ǽ:׀^ D?4 -RV闆7-N} -StY^9ޖݭ1&NeǓy` .07Fu(RR\%% bk# q(,OwbPfq<28_&ªO,jy>0G*~CU ,pyTipѳ /%у.! \ms(]+?f -ob1_|&%Tյ#u}=>D}ށ\`6?#Vq8a$lS_ -0L2\TQ}'I)=8MJwf}\ j!wdʎfʖDvVU?zN3e/SllO1{7Ye3CƦw<`1Y)%݌ֆlF!.Pg|/0:SqVC6%Iz GU4jP'[`t#j^,mR9"wu!ENlDó]yV c+͉ \r8Ip@ʃz~b:3rt gوEz6Z"oT)L5~۞bڙӰxtrCtiǏ-c}oިetn^nm}KP)ߧ'bCZؐ]!BP \:Ңw1pƬ>XDr7w%e5~_kc1.\Wq艩a!s}%TE`'V7W=9#oJ#&hdΨTȇ*8?Bɂx`UD>A58P 3\'΁g? O+.v:0*|RiR^?b) j\_} b.F1Y5eC',oa:{n -欙s5>I.MɛC#5u>5GiV[r5dMU]t;bOshnȥvQ`s@.c Ի^ֺ|0.4]ꏶ+R _7FB>͈lteN"CBn v}z2db-J0#֯ҪkAww0)ς;A:^oVG"nMrɈd츙aڌ`QS8?8ϝk/lH9NX3,:>8,mr')jUn2_Thx:-A>”>[lSt*dlc+C8FV"3_^ˆˈ²뗐\x樉F`<*f3&̮~QÎL#LgH[*Pg ?>E^idx?%47J:.5^|Ciy-錴S + <}@'fe,vv$uiEGrPB(/kx@X3EJg=''bԊr<.Asી-6p$'s雈0.ʹ=^$ߊ<בu%M)xY8.g(#O?bpS& tC[Wz/|?Fi{ܐ"C'ȼwLi _V4#xq !cj/wQ[80jQ,#~{H:@Y'ݺ2q@B)zw71T>bE,ᆷlFvǽEXNAb1^ܳ$d|'HζF-cɶ 0Eqp"N?G >*@ICqGϰۖ|9\GFwX-ڦɱ"uezYUljxǦw^^g4:ڻ+z=FR5OC!{Whid.[d#,A 7F.1VD&~bWݢ]pʽmQ;Agtq͕0 wlcvLl۶m۶9Ɏdb۶39}O誮zVj*@mx+[}o# -9B[<:dr) dbZUH8|]it;"ʕ+[z!RpqpW)^v Wh}a%?ui%r9,Fm=kd3'q'::E>F)&ԋ|Lym"s+aݣ>,y4aJ'$?QEشJd\̠,Z3"r3؎9ǂ𰗇/̥Ѹk7~|Lw~S g8ůWע|8WdŸ d`zM&NhK2Y(qTEde.ibVSv܏-}㽌D:hˏÌC~EU0-0 tq4HҬ!yC?>vc&N=~hwQ>Ie` H $vehH!t48F[Ҿ @u:6>~b tFW_E+3AˮtW.!b}^e\G%Ut:# -8')ē8S40 ~0tv,*OSؐ)_9| 9/qɁ,~P O|1eO(oG'2>i@7_ъ^3{mC& } _o~Oj L@.}.ujou/#(FyjOf=fH9r 6jzxM/4h:dEkHq)Tn\ir4 Nݞ AޜϊcqNX7t[ϲkG`pRQe#SWx@DX?{NW[OxTlc%4 !>w!ckh >T٫;t$K+a0$|'<'3 pH j3!Cgѵ7&;zH&~"$RDx74=/!㨰p8OC%XS$'pGkR;q݂3jo<v|ӌpW,ҘpN,y͆f8 -=`ɮD^hzW udg`TCsi@yq.]Fbt Tz?bx, -OC:!& Jȯ.zk{c4OO?E^4#>X Y3G0@~hx2;;xT+bI"'2wk.?zjiꁩ-!{1r 0UMvM|j/MyanfH*qAMO4:ڮt2ξZ`BuyYUܱs70iMQqb' 2}lNwkk޶ hHHyJVPxea(SnC]#[ {D{F`Q宜q(ox`#b~Fک:$A^Up_ʙ߀ڞ234=bFMHn@o4f@?/nJGw {!-6?qҜd-q호UoZy]y!!hiHaŒ"z't%XJ}])^ ;v_ %ԳE`:1XuUivb_uf&4ls$Vw&I"9; .;wO&>Qj'K1eh0g*xw WUkm^_)H;c%!L3 [tiz&ԇ4CGUW׬8Si{#͖-pPHjE;[$2AP\- c0ᾥfY_et -[Ѥf*in?fmyɦiMRC=vcFp#7Dg yW§A?^&F`fӡi贻{żu'c JcFinI\e{d"֕7-\ILd"CxHe=_K3d,gx_Qg\]!ڷ.8hzV&%\l~`Se R5Fzۉ@ې́{nXPjJl鶈nsuJHe84s9g!T4Q%Pn.n;9y4LnZ|\9f!Y{GR3!ɣ3D2gWZEEzWBIZ Oaz9t4sWs(6 U1 HbAݸCB*xk愫̏>#5)\6,*ekThM\@kFr9*-4OirnfaW`IשּkazSG ->GP% -ԨU5ߑޤ}xW hئ Np Kr9͚ _CDX --'6^IwW[7,:I/O~btWo*i-Ln.%?gN[Ts8+@4LNqCYrsEyҲfx}\{ps)lWBb[/2oX{ߤjRA'+?ucdW6SO=Til+dl,x&9'n()=CcMרg^5{Z?M'l1jco%)ky&$g|r y{1ɐ,-H)9O<[Mie|(YlF\SZ̶咞74ȍ :5iɕR=̤+Ow!J/oDxkoOM -QFLkǰ$T8hd^-rv`vX>uR^A qJ۪eNя<땞 -\K1]KD.t!-@|z@^DZ]ɏ2rQs(z{UY֒0&:hƊ1Xd:au¬ڝUpix1=p7k4sHg1hJJy< fT翹Gl O=Um" }vqSFwFw;ZzZsyL+>1O}X ͓[^\u`9}eY}ֽ͕+E ]R~ȁ,6ɢȽ3.%(eQ{qt<[J}[CWF|S/oItB=m-3R:#OgM7rB''7*xѡ*PڬnSKD"3d",^ -AΥV{΍&@6Q}0ԡ/I./bCNQXcȯUn=/Fxu0=ˀ_ dr \FySCĮx'vb@`Cû6 E]6@xwZhsXzÌ8k' ZF+هOؽFmϋ6U{F;-B{ϳ$K-ߔncj)cVV|FCWIV(ko3z!nݟVXEI|/iu9$ l]Ev54[ Lm{8i FS5r8cWNԨ2xZFEteX+ZQ1w\2`B:NVVG f !|xvCI~ ٬fIiߝ(/l#Fbӧ4T'jvT[C4tg[cwzj^ Hc:"CiCu~>w;y:>j4<.303tx⛑Ly˪M%9)I[oQn6MA1\_r;ҫB*B{9C|q`U#KƓ_\m82s$RE)i]ZV֫\XtT0׏?]HğpӉ-4%S/xS ױfX 0UߏE;SHOlaP7ϋ,Ƹ&c;O!-qnw .FS}:xGvDf;UUF'-b?غC1=, -f9S^ D1 KTS9 ":^mY C[.b&:[ 4}ʋ0|S_*۴͋/¾.n='"ں|e2ܓK?ͩkctζ.Z{4A#!6Wò:vmE{x_~H#gV؊#x!~у%HXk(#WqVSQmki+0i-]P*U9v?vz/Q' Gqz7Rн*~#НCI~ ݻ6?p>yAb/]M3HMqbm8"૽¯ҝ$Lf?n8/C1 as~I(1Xckm|/#>)ϐ'oV;7Q>qj*ʖDBmӞ($&k;cF 5z|3>ՐHl8[(~tKFo^ȝaD̺l( 2z R?>QI;jRh`$ +҄,~MR >,M'XsP_AC/3Զ]^k^g03-+hč"U=%a脑~@O#YLd:54U=lR}2&ymW vONjS0% Nj߄jw@9GTk]0yL ^MTHRp +bR qQ |-8x`m|K5SS;y4i}x -#Q q_q{4_A&;!ʾgbkѮ?cSj[# ߅&1,8ޖ%.W~R44KKڄ.=юt:Dxj힯L5~V^E6@14wC\ -TĤ&S&[mJ2SWNf3h/geNtGdSKtXMucWA@름wcQ#>3Q%7O3 nvh*f">R̞Co ]m~ 7HbWQ36ALmYT@T& -߆ -ksy"kŎ)vp2˜pŧ_6y 9]#.@`FYAT-Ï?8$uX6w-ϳ*Svc:S7N|槞u +⺟bpo.!s׶1zxZ2u1A`agl+(b.,=^aQ?6Mxp|$=-.=t\B12Y -RjGc,%6X"/֞\ V+ٻ'apރ 1p=M!oblLLV0crL4;7iy_ ,xDC2ɮb`օr}ݱ "mZNOB&Vyj>oߤ/iH?0@ |xYR^W_4D ާ$âdA.}6^,p~nLO{j<3^y%X"O?9i{F<+]8zlHV>ug: 5~^YXђQkrULO.&po,cѸ|'S 01.y +b =J8,u$]xx q6Jw] &:)+G] -9 SBgBZF!C\#{{Ԇn6by _] s !RFC% j Jn4sxyC4AJɐHC!$RAba}Xæb_ɓZj/H1nǓ#x*6rk:W? “d}&V.N쇃şdХ./z )QO8AVF:olGeA,d4s 0ܵ҈ƈZ @,7i_P }ApFp8ƚ=&C 5 s_u ] —t| rF];ẒV!if/~[zhu;%`12UXV;e%&O [IaC!b[wM2/ȋC5)vĝ' -endstream -endobj -2171 0 obj << -/Type /FontDescriptor -/FontName /DANFJN+SFTT1000 -/Flags 4 -/FontBBox [-208 -360 1374 838] -/Ascent 611 -/CapHeight 611 -/Descent -222 -/ItalicAngle 0 -/StemV 50 -/XHeight 430 -/CharSet (/a/b/c/colon/d/e/f/g/h/i/l/m/n/o/p/period/r/s/slash/t/u/y) -/FontFile 2170 0 R ->> endobj -2172 0 obj << -/Length1 725 -/Length2 37087 -/Length3 0 -/Length 37612 -/Filter /FlateDecode ->> -stream -xlcpݶ5ul;wl۶m:6;mN:;mtl|=Ԯ3לcsYu-K۹y:xjj,LL&VXrrQ'  4, ̰Q{O'+ K) c3+[+'%MٕUN@ 0D$T -Ijbce -29N4vfVovn@';Մ%⢌jc;3?\yAM]\-Lߨ,Xff hae/ݤq:OBP!5 hFupu:̀NvidƶV6v1G a;cYhd.N5yY5#ʿcQ֤"wXNfwX??\ז7vq21D({oz&=+_tM]v.\b=kiċf+ЀX+4-t&ڔIxeDڑ"mɛ%.l#NIYHj~н9IɀqudfUp%?G)NIK^ms/@Xr=t{ }^{sFSj9 @$\cB(\  Z -9 HnA^e1pn鞂WOFc73`Dl2ʕy)z8PC: 4]0Xw_w"I7RzSR{ėh1lT6(#NihDqX|7ǎϟ; 4s"}]]鬯I"Syne.< UF>n9~hb?VR~ 0ٽZy -aUۧ[Qxi#\ePҳgסKΔ:m KBnt ~TC>LߣbC">:w>I=y圧CdL1kݝ,%IC/DؗyBW" ҿqT8@isj EIK` \AGxZD2 U\e)LYLam3؂! G*ԣi@qg~4F/ju` wmy#nc'm˖Am'{?CǏ Ľ?J8r#pNlF0eE{N5 #%;Z~:p"wX(*u"ӱMXyisxW:_MpòhAgR(p](WW8}wOBP!t(kF,#)±HUoJ ,;0ýϖtH@&rf 3_ .eιVw8嘹81Nw3Vaν[T>;+7[c\2qǗ *A_BX4M̬ 1)喁 FBN{@ ؓ ػz)?^|M?JP,u@cAyď^)z: -ip=FjS{WZKxV`.!z - -ǃe!3Q3X\Yȴzo 狋Ňgi2۸Fb0F#^vgB"-3ԁw1"8/[gʖ%lL.>n -?=jiwO^ZF8T}ޕodЛ%bkќ ^^c,t\WUϨ]# wךaH\\*?~dK!e V -**o@%rh{s;Q\j_題 Qxo3[6EgO?EQOnPr9=YPRvU|eYAw -+(zUC͌>1e-S҈x[J"\]DvT\G4+ -b4DլZUѪMcw!k&_w@}>AHc7Bk)\O,[+o!@(ffpADUw~! -9eiρ16q=ˮ)v')bѰrk'a}};hZuQ*2Ks:v7k§!`5:lYj3twPDNo۾~.trRUȮFSq#+xyKYe`Vpu.19Amq;O)c_wE3iw-Kʟ CP7МMMFlEõG2(nA"ȶ;^M&p]uAއV6ZWD m?T0[s.]A>WWqw4Z"$K~G,336~,S62\& _(FlZ.CbRfyeZ͞BvLVdF:+'h* -_PpkR{*t23Ƨ=Wsk֡6EWѭ1YҰ|_DAmujtK8Hq~KyGgiɔّJZs.Mx x! -J*9O>O5[=E YnTZ)lzctK6QNm0wdwzaHȄ7x - E 8j!`h(o4 -Їٛ T,$]&pBjcCI/r;fr%g)潔+4܉Go oʚq"9 _?ȵ=Qeu9j-Ѩ{A)88-W]4Жk ;:|y3Y/A܊Ǥ,8[BOyUlQhgP/oy3BYu6ƥ鈶Q+AV\U$JN:)iohUA,),&y 4UeM//Iשzauf̃89րq:eqbiȒjSgpֈd3U1_%_=C-“D#\5K%ChTX!*8@X)Q^E%.1Qc >*ޭYt0}A咥F;Iߓ -Se'^;؊7j..@R"NO[o6i%=lYF!5yM5oraO{اYԪ H*$Y1׀U$Xhsv|)n.ⳑ8&FYZc9Ea<|L7ߨ4RfD֐hh'GB5MxX^6-{̢;<gMu*j9k]ț!eG6WsF -N٭g"q'#`4Fa3aSCrz*Ym zTM~앴)UU,8r(( AB>F)Uˣ=Ե<B BR1a`=@}F>4IY+F@ T k{aֳ1ߊ"lM}ދJqkc\.qݼߙuA2S5&IFh0O^vTujڀ -?-ii(pC=2!`@ o},;+#Qt+Aw{S0oKд@(Rx WB -tO -VcWNJܱrvHm -`M&$mXxdLV7{M2)WJ@* x+2>*$ܿfocU,|G0KKfiR󹖮 d}nycP,jp hqiWt -Rv~-= -atWU[ǡ -[$PA u36Pt#Y$5߽3g&*m)b)U\?-h L%U4Nz(kʜxH )k8،u5Yt,vf ݮ2V &} v-B<6"Q)dk {-Ǣ %C_HXAP~x;eiHl@~s!Uf+)cthiCIR}kvw4CUuQ=tr#'Hm)pe?O8e k -}dR y䇞S^%ysxv%uDDۏW!r Ǯ8#cš▵ZKr] i"=dS'P0U5:yN'sqA}\xҩ-YΘDr췌;DdȐ`M|a1ƺʡl@M|멒ދZشG~9鲺{C2%ӧ};1d99SdI;vw%&E?& ]*\- xY,,9/t- ')7\ ЉƞZ y~2.|CL縺 yZAkEgq+4%iZ~":KO )ݲ}}$=ٟq'=v(Q4~J{oI* Aܧ- fb ? -sR&K_?en#~ɮ:p$g\Gkw?[a!N8Cv:$ugsY {ዔE({W0mu# jhfc8&E}KP7¾i>ReE}Id ^$) -I+N1lƗ2Y |yK B+j8O}dŀ V9kC#up%۽;dؤkPP~>Ý$Kt[FH3h>zP;40&y,ȶ6NsԸу qc[RfIJIIDmZK#>8\y~M\Vd6Tۙ$ #\15(Ȝ[x̢x [ZVS5 VI}/QYOlNA(РI?T>S ^֨a% qC])KPe%u9P,i XCe$m2yLYÿ&zpr Q{g_񝦺M`m!yGDo8 a*hj}K=nOŅ=?<vN8>LH~VYΑy7 mZ#g#틙Y 0a?d[ /V΢r_%K5eIQe-%lwe0.̩0h'pO&@ܷ# -_~@U?28dQ]Y86 k-ZaGd"f)+aL>y7!gn;6@(q'ajxPZ(}_0Wcx8KbFeIћp - sLb-tK>>_ԗ/!e$7ڠ*4/UmJg]b{ϑ;׹/xƄӉo[L.tQ/b@F*~hk2\3{cdXٛigD]_oswhM:aޟJg"hH) E-EXS/B,Su53O|}r#Pj z9 -Ι}3[S|k͂u祢]+}3% -&eki%0WmRfBO4nObIe>)=|O^ߪ4{z1k⭌3bNg AyxB +sUt..4D9R~~+-#=YUB^cGRꪜ[.?Q՛ -Q`߂|֖2gV Ľ,R/&ȉ]/n}`[yDi*{8L;;n)sB^۫ ,1 '1#3 mN@7׈(UB_%` a ٷ~t'N"^ -ؐJ(ύu&2b)[ a` (ѳ㖉p*hqE T/7*<ʥ ^f{c \e2J8YdsN\$o醶_(.n85GKug, V"Skb. *2SXę@qm"h{yv2 d欎3TAmo5 )dvL+h򩌋LZ;,Z Db`c @}`#1@lX e j=g{y2XOGL܄ID,HdϩCP636lYԣyB*b{5*¤]yΤ/ǀͽ=T u ÌK-_7*ы K'n6\ -O#ܿCֺnc>mHY9@F)]R -suAӶqԿ"x-:u2WjH5_a mo1I b8dB; 8 3E8uZέ;lhj(%~Sg!yD 1S^n^rQ/fΣ!  TUټG%h,LGZ ^72zy/"ߑhM޽Hĵ‰b%aU1_`TW-q/CsKTr _jNQ&HUଠcҹgYٞZyRf(wѨxP>Z2jahIUtK %,5D@4!HJYHlk#e:?ye@B1qv37 -5H;ǥDP6DjwPw|J"t),V 9%*=lNif6/A%o(+̆KODT6~JhSTa`޷z?p}z~Zf|35!$}3RHHc5bH9)Ù4^5QvSRT'[u] AH\]0 n%:'c9i -/hP'Y3LcĚ ԉ~D4'F0DP&04s:ej"{2Irj[*T)47cHL&nmۉG&1`O?aR3,0=}+vWH;9q.$f8}.~ 9-"#R7h|< ʯ) -!yk8Xp 3W ݙjq2!1z0ύ\56NY78]zɰ綦8xŁ?#: 8KԊ|)ɋD^gv!yOjE^J\d>o$7Pt#Hc16ثW0; [/2'm:Bjt3>upc 9xx ܪiS[ Alµ,7XW6xvM缄rC]4^͛mآr. JA,d熧h CqT3l;y>1ge!9cMq- 3,ײ{ fM Oi)|*B<ÔE,|܉FkD|Q 1[@CK7VMNQ=Toj  Lz4E W;=qGB;ՉScL+(ԃUCt[?qn$Pm&;9 έGf$E("4 |~Q;w AW}^* q;0'udRPa^8Wi8'k0Ҁ-S']Q1ۏtϊd Y -ثw!6+׹+)DՇBO~uP%BYUXL%UtGiRSb-GZN -ٶM6I_NP^gˏ/J BX&F_wܒjȂn}|*r~jSbu27p-v߂1GޯBW -ЂLw"G[?1Zk=xG~ZcKĔGGb&  991PZ?HWRuD#d&Zj -l;гf&*ԙIt&F9171Q?5@+ DkdaH?.tA|O(ZF{Qu,7C -#y51~􆝟e\YӤ*UNHYz (`0dҧp3vIt6g%PQT(bqFԴ!NhAc -¬# -?em08J\N;Ale7nL09R L|]{TRռx+x~b r9uɆd%۾jLB?Q!O,`ٯ'm)qP>fE,\pusL 7. `%ZAO(>6Sn(1ɔjU#L)!{eC caqF,NNfW`&psPga 5< 9^ +t -~5KZ7&TLѮ)$r~ހxfcz0)PkXj?t^b? yE)W=m3=B"xd?:JY(b}|鏶Qd+vVbt =GuǁG awk?}/$"dʅ)!%B)ZGbN)r~L ǠETƮ`+{ri}6l} kɀ#ar%W@'7'Z$uew +͉چpҵY)XfUs>ЉQOl U%F+.pytYofI$ I+\ ӣB4h!J^?Hϭ| qzusL@};^ p,V(1tkD S!SWT[%`JBQ^YKG/E@A$UK per6(c5ΞOa?j7+&`IS'FQ.(!쿹Tk/E8s;@Q^ј&t< ;>PYyY(&?A}KLw.H+Td3W\o_X7k^77'Z]sVŅ}(@(7; ]ͶG 3JJ0 HxO[/9E8x5aj:zjYUrG,~`5N6椣 -VD}U -zW,s Ր)$w'/hCa`(Qg#+6-m}%bo1`I&>ۍS7\zQSM*mCK+)Vg5 rq3 5l\ΝDX9^bhd>.5o*#eE wyZQTR[+j?z\H%sTIV~m{b> \/B)4ɪ163ɖa@GWs`MSe^:KJmQ?Z?Ri T?x7t26&O/dcoq=fMYU$5X6a\38; -Tܦ%в -<)Fu/4r.N:Dηb)Cpthz}.؀7WBfxP;vY5-sgqsNA ڼD -E;_TNiNk:[% -9 -&aC<YH7q1 ơ1 oO{ V(2D=s^$9<4!=c'jx=^c>r5-&}&*exKlqY%gs.'|KmȗnAʝIkׇ`FY=4FgID>G/ʎx:I(CC`ÀwKm^0!<أh6Q7asY*4hWmC l 4ʷ]%|B9ۣZ&tNB2ud! -\=l -ŧr/̇φ{NkS$x/0e~?j8~U8 ̌#N_LpEQOŁ[hxJȱ!Á>鴓<c&s5گR]|' -}ƍ,nzH WgZ=w<,Zlq!slzN -uڇ* XrByZ-!vnT`)f _jo o6vJ*}ru .`+sH"P#.>`,mi{8/@Xi?1۴sP%R!܋J'ߘwe0bڥ<< "d?~8JLhS+:i/D -RiI eZD+Fw?c/ocD>>pS-ϴY^ u- 2/ÁZ DU^d<}Yq?Q}xb\VQ9`g~D1`3a~I?_M"ھ>5ݑ)L>ŽL% %&K)ҳ~WU`Ŷѵ,(9ls$+u Ew 65cvkJPActWِ h?#[(G+-X~2A躒>l8y<'3p"R?X#2PG@UD_4Ł{3iլԕYs -q`1Au54|~؝?"xSPq -2γ-Zk!Aljub -jj%]_Ka9D6v˜)Y\|pR8nvFя{sY[m}PlY-eԅ Z=Pi3Pŵp07b -t6 ~6e7oZ2C0}գ!$ҵP1nkRyyCr4#47 npp:<C{z/lr(]B'Z1^Wtbbh '<-d"щٽffJO28\.Hޱm۶dƎm۶m۶mΙ?tjuݮ=nH ĭq\\DapH?Z8FǣY7QN݅cJV`[%YSLxBY]0;]7hǪ'*k, 6pSBA2.x^{)?h Ś2 'pC*XnSJ\ LXWT~)d<T%hGײַ5aGJ SG΋)V=;.hr$jNP&!  qpr+{Mm)E>iէuёmSg>W{"J5s2q?i`l[6a6K)T';j_t9-n2C| % 2l4-.rL!s~\`Uin*4bA|'قp#>bNy{fXy]Շc xD280[QWTmI{JzZL,VCBQ'{w2Ui͒`ӓ*UWK1!"V!Pۦ#§j -+tpr 0vzİh(- 'jaj N;Ie7|A+De0|Z[V~ ~n.9eUvYh!j lvZc -ܯRQD"H Gb|P㕡VAn`MsFH^OR?~^rMq 9岙[v.hg&]f?Dzaykiiם3J/!d Xb?>JvJ~F>CK rfGbHO+R[gz^><3 *!PxS BxM\#]-[Fx(&"rTh߽F/)dtA#u&ži$Rֈt(h3`a%v) Vr~_hf5M_(M[[I[C(A4m]>󹺈ghp=93vEU ϑX􎤝FkakbT0SKBVt&~VHU H*NvOp|ǢD!\gAS0XoDh6zб#6{]HA'_O /ƜO|T+Jy*Kܐx+/[5@r./5t,%=uoBjgHˋyADBL=| ՗d'ͫlcֿeddnz -av=/]-[CR:ʖ@IiT̜dݱRTUb\M2Vz'qr5w$lӻtk돐R9u@@*zZC*~Ϯ~>7ީ7䍡sRu5PP%SlC$TE:.K&q; j4_$午G~zWe#ᒲ&e-q-N guxvܐS!XrTe+5q ZCurdk.DB{(* KrVs-uT]h2_?34Fme7djg;7d% tI:(=ˉk u%yVDߔЉKw6P -J΀: t`3d Q0uphZŀ!+!`d,ΜrAfwO4ǐF5|}hzɬ[&…QdzfAz T]^BkBZ)Fʂ΢rAഷq4e2A+~0 ud\QL/`W>(^B1t_oaQ }uLSc]n.*͘ m]3N8N'ɍLD0q(eЯ]#`X\M)󷷺7S[aUydӭj:|z<'Db{hYg޺3Z>kԯhʟ;kZҦ_)D|ޱb($?t?\:ajH]m^Vp0ٲhɍތ*;ZyZ Cgrd!q?i)Cs`]J1o\Idl/D4ЕnY2)u*wN$7[Q H*[nxa2l9j豯}(QrMC.܍E>q|:Z0C IPʀ#ihvs /0I;00}Z9ЋÙRJXuk\À6gP~=p#P#2 %I2|0ҖaҼS40yS nf?C" jx[ù |*m!Lr;k3#QM"õUo~VPZzaAvY@XÂPL ܴ}EmWޓrlv׆WY=xɛSIWMOyN cs -j؍f"A6Op+Md1=D. -՛Cu3@ǿ=(XR6H OUʿCƒZJUB JIzJ܊ݣ-l{ۡn#g6˞l]h5j*-DБG:Tk#Ȑ r&д* v --f<fdojj-;N?2g9\vP,~ԲTyc]k]B“mV Gh-`K̕^Sc*"Opry]͢9N}l?YRzNnXqGܐ>‹H0rYc02clঐr5./yĂErXw 1[HuN0XmeW=1)o:T?{:[ˤx3ڠ# uZ1Kdգ@Hj;ToZN6BKgҾlZp%;k,$:kMX Da`σaF$S*"__V7]yVr%o$˫=W4+.Txp, -cyИI\$NG FO.NldKz|9,4Snz愬HA:wiy𳮲 #yRGn \g*IreX^m_XF3k+;ʶ!h0wQ-oRlڗkOU|F+ TKR"Bl %>x:BظW$98d -$&twEW;<6ǘC<aT3>t랏Ӫw΅ѥyh*U"lJG mwIּ]vh=D{X*Zm !/a+bf2u'pjΫ`@<Ǘ?[^lO^vbsY+1VK*t:b7MRsoYNq\!=_cX[7boWrw50tL<4_hr|]QAYxNVB 0jIXIsJC -BiDh[| 3pӭo/b MjL{p ;"E3 Ɗ[/f_PD5}bq ~~^`vNcؿ+sNV4O>N -N ?x+|P80,ڶ.^CTT83Va$9WDo[ 8EHⲧ]"?, A?~rQYQ*n :B[Uj .ϊǂU3JCiT3ǹ fq<}qXtZ E F@]*pi,a4+++B½"5"UIŐ@ 0~ 3,9ۜ!* S3BͶ((#Q3wr0c]gYvH?"ed)vb&ZyOU~cKҫ|E4NqbG~slcv{Sl=;+~qosFT;!>EvUw-w]ԧxװPxw.^g\ʤ;O" ;X -,F偛յK$6yǢ8=8)mz M1 "^ .1&SRûZ<XXZ@Ŷi:첦nV 9re2s-^b[{[VJ&H#ȑCf9!Fn8DT.hcZ٭zD.) 7 gp-{D.?}2lx4h$C -u9&@߂4VS9@{,m29"5115 /FM( s3LdF]b:pk`i:z0Rp5s,7zG S?MPvv+Vm-["8)``[ڄ!e̺KSQ5:_b߃PGjv~nʤX^V;FPs8Do}̼bOf;_ȔXcYY6z<ޒdi~~: 6P`Z\oԔ߸5&Wl !=l ZSXW"48qyCм"/^ALtYOS*V,3sRb E\S=У]%^޳pǖFqL:E eMp)^0vS9eQ4`0؆_+5W,ˈ6IVNO_W5P|;.5xȰ"R '"c!4/g8𭗢+ĉY`o&8&W__cR}YAMaڡ vj@wVlGg;;q!acBG$4Ma*Q9, :-^B(=5%`Vgv&$] aH"-mg;CQ_j^sA<5(PJ4 ʎ42\׎ԦԱp>[~],~҈zTJ},--Nv0 ͸ Nۏգ8-(h< џ4&3{cn]0u{P -B$0Tw;@!`.CY+])J,:t.'z+m,i6UN8_xVI ~2ބ ټFB`HZS3ilC3b#` Sw0%UQ+#6H3qu8}8bJj{|bڧI-{8!D ݲB dr0PY14{q<7:7 JWe~ Ӫ8R(M\E:IJѳA4|v{O!sz<)- Ј(nJ^?:E+ Nq\A|^mE1 v+ņ$Aʮ -cC:nTH'6H}ܐ@IB.4;?> i|mlI:\A-ug.x+!|Yguކ:VK4J.!hqWarS], 6҅ tȫ~ŀR7sK里ҕ|rDp%[hpϘFn}HDV` 12iE;j1NC3ppAP>5aLqPhʊۛ^+ -ۿ\/'J|;>,\;]5=o7vDL<-_XL>}ܛ jL/mskj0W0m<4YE4xaĸjtAsm&&#g`bgXF - Lû"iNVu,MXT[=X6[_8}npW Z=ERt Aԝk1 98̋⧍/srgo+iҕg' S{7*Ā0 h- afn۽lI*,]"W<9HZLI [5CƮȠΘg|Yf]l:ĽrM~2״Fx:u{?=yx pD=L{d$aQ=2q}jbtfVGݾYDOo{]&$:2@Un`s42܁uU:z9A=YJS.5^bv -K`CA 1ɝ"jy<у(YD(/# >NdLGlPl?6Kdp;$4z!WS/wF\Pp~MLP7`cGTo&fGs؍2|'*."9]P߉Ewsne5~:2%ÂϱNVظ6hT&߈$ؖ駱qiȻ،{$OدZ/r}:WGMwF1aE 313G$,9iI+žx+<!00:pG ʯZ^&bUq>rRE,K0Yx3W/&pd6fv#(sh~}$H>?) -ffMl L@o%޹CZ~ ڋr5{(e*HBg%캯rǘboV"4 ߴX̌(ִׇZIJC_[n 9it -*,nK!zB`4Æ_Pvry+b384dk?n`3>eE6^? $S V~hSmu/DcaQ׸py -XVĺW;@l#5oKO5:z -h{sotUhd// X9ɒƊ+e_U&򐋌t) -#V(w[UK-=}obf~p=hZ0~ӱ-ܢ1h\+ *Fx2蛂G 36~Xp#ڏ3gpd3y/PWx-- x.8M'#tR~*|xoФv!Fxsw -kQzT&ANyV#] H4ä%olg̟z -j5P67= nۜbiO!Rl6D[sA=O<ȁ¬Vdq!u82H/{)NޥEW6z;ci׬g̭+#f_x&-Ô|KD]Z\/2{Z[) DL.^J7Vj* iFlGS5 -Mto!"ƖT a-O _.㑾~YQP?qr5hNrΗ}%+M˳ Br:8k sXZՔO -lG#d'mOAY6Gf^<`NQT~hjF?(49 v?G+IGd*󡖯R)_'Ǖl=t9@ -dr5 gi3>bhGϠ`zz@"t3AHOW%ue6&G?@XV@ŮPT2UZ-iTiۮ.l -r]>>m'&~Zs-q %GKZ? -wwB@)xFP(`-)hcr3e!ida&|Uo 8;<yom}}NVM1CSp'b.x7 dh {(kjƄebnHe}$ط9[5ۖhcImWs /·@gR VOno0! "hl9˃5+4 RʾF6"t1-Q .?\d\mئCdg7tJFL3C]:0~ (Ie'NJݦWmT?k#i풪so-!E2`X/ޮc .\1uHAFrn%֘v/}` ͆n£CJ'\S'hTr;|F"2G/imyC $RM{îB!b;41PiDA85S-:ޙF20߂_ν R -{FR\ReϥClS¯)DeF*/3\%!?X7.ùuG|Xv>Tas>!© !-eleӟv G>nK̨浈<4y|_m>j爔FaLFɪZTdkA*TGn35qsaA1&E9zŰ7'jqPJ[3q)B^P3Hc@uS4=92{%j 3%Sx`r -&SȬ;ߝ:Xtedَ& "3 Y.|! -7qO)Ny{I1B&Vs=2):ri~l&&G?hQ]73Q) ZAHֱo< RxsLq*״z6t [N88xv2:+e* ]FdK뉂)h'5@{DWċ$7}:rytbxH8v`Eѽ4H'tCO)}/:&@xqJ/b[gpE Goxx`6#~4U6r"PXq¶-k .-e5#*(l*T

ԙueT'Hٟi?(Ù|&}ND;ԵsCrFSVwr@w"ki%I<oYfcIÂpyb -s6O0 x`cYH}AZ٪LZlӳ";0DG6s^?(уz'F>7,q'Z/Ù @ 7ultѼ]p6=e&"Veh},DQfzВ9jװ,NJ\tꁊ>r}73$*RX l5B w^{u(CuA67q*!ȃ&D?{d^ !2n̺g{n010*5KX&/]^A*$J밁7ߣkܻ}DrF<"+x˛^OJj'/{*ҍp[wʰh}4ڷ ( dJ(=g3\{YW2ۜYYZ=9#9îfu4lq+=WUl>qj8m BPNLh$ƭ0N0F::*}Bc+*u!VU6eǸV 5aQI`M -Xc$!0XCy+$MH@M̴ƺ2p`6k,TE4LBM^r"H v!z)pdS*Tjay_=X -H4o@!?X.[8o , Ro;'4GfǢF_BI(veMzQի\h}Ly 0|+8rFPzƞpQqCS*Ecq#H@=4PWZ7-'[1lݳ)<+0Qdm\cO0sFblك6Fw%Ip Z\R*e s姖 yޫ&?*V3K{ 2Ş(DV&-0ZUTk6'WtQ2b7l^ꙗ>H9P+m_r_zz fcx("%DLDc*hVbope^[1f`RN@3wxRm;ʑ.DUjh;Kj3rԏMW/f]H_e͕)|Un? %5f~փ'؎bfX6 H}7w &% .>Q:g&GZlA6Ad߭…*NiCV;pDf=;ů'&fW?.ImO dV^'h!;^;wj,pь`3+JʪX0\PZEX*N_x+oG(7NmJq`:J1j^Z]ϱJxН6;VÜ<:pLx$ы#' Y!ѹ) j| d69y'IF xӖ4: v3]sh͍X7iQC Eٱ n^TˬTeW#т~/zC[]ӵ -&O1#}6XMz̺N$W˜n3|!*MP@ *hangyVȳ -sX^!l:A Uyd^pEp7(6J'H m;fD1qUV!E"956fYKUg@?> -|d7&A*&XW} {x. \ -7ΣKgc/}=N\SȘ@M99%qqD:&Vp$[?e0o><(2T%&':I0?g,&6'aT6]wM۹GLJ׸:%i$ Ё#O3tԣ>%;S'q'݇T_)m@D -}rު+P>ͮq;BIq>0`?΋mt rg6/yMMQy4My{ޤ}uZn]&\W\ @6瞥G8b\y4x$iA? 1` "| X*zy3 )EAm͘ɒ\8q#y xbI|O'ڌh$#q$ق{ԙ8l<}c#su:~hUuG. 2& }꘥N[OZ3ivʡ%7.k j~粷/oH~%L! ȱH,6(4fXp*>.cX"&«!%\]+x%m뚱=sCPN | y{tiʍJp11Vܴ -ō!/)m{(#T]%{"y=&MV?pO (NYa=Î"ЍҘaq)GYVz|71΁UXTܯ+r)KttQoC)Nt$CJ7%OfKY,CTKJ]ݟAk;ȃBb%ප3 bîrTL]*-s AA9x9ƾmydW{ r5qNoQ#4vӝѭė{wzqiU؟8C|Pl[M-9D"z7(I"$dKc?>N\l .e:)Cw3`Dp޹A %X"]XDs^h^O3G~0H$7m8@Ct "?5M"s" -WYr@*q"E{4Nu+b0L YU䛕<ՇnP܎VIiKބBm"Sx_܊^$ bʾ 2kqy}rmQYFd#VW,ՎgmzJx'74Ozþ ]UWĞGLU 1!q?K/P[ڬs^m t5à65w;'{48 -D?±pDYSVV3%ZQ \O,V&i۷-V{4(&5Cqz{jor[*_Dŭ\`XI79lcפy0BXsv`+q0W9hݹ -_h~F'в9MSY5aؒtc?~<5r7Bs׸lZ6tQdv ;n>tzQW{'k7WcOA%'l4V{~'TA8?$I@651^*ٮ)9'!'umKG,-yѴ7$1+r! >R$24s o"Qg,K܇f6b<"e;REO4N6/h|h[dcb:6[3]=x bWРX8ZXX6MCL$} o(Zݴ8x-r8 n5dqw+si!-A丢7ġ5^'X5JA>8'Aa -OnG/Z: -tgQ$\G{ ا_oW7;#smaq3OBNHGo JU|YϪQWE׏CdZ]ShJ\03L+Dt˨~ !ʵ|Xa t.A[} tV6tWar?)oH\ N,||7 @.,' -1T\_i塌 JH"軇04pOi6 #WUp岃QaMme<9S+br{C v -j;WQY֍qLqҍCًR_I\X*Iצ6e%4ZvX۰N#KT1X_<~LX_:fE2$pU5P -T pe3d:"6ި 5&8ßE:z" =w\y;.r~a>ȁ6hFC -^1jD*%Xp^)ӢN`dXt7Jk7ŚG͛M3 L#Kg\ - -V7~Z -vi?mg1Rf4aĎBWr#hbuCnSCm@<p{H^#M|_$K5E4oiu@ѷ+ݪ J '@RGƂ,Km!UJŢ ?Xz)> @}S9dV({C9+^XBNXVg#iX kPG~1DEt} 1C +Rw~A\RDØ!YcRjGMfu<4uYeigo_Ƣx]X[ǴS!Q0I=z.,w[HC?nɋ T4$uwvP=4|}$1 J50Z7P73RoǟXEF7Zig\ERU}q>IQd#]**_I`Y ay"#NՊwz^quC8u祜zQ(lI4npsHK+cs(P,l̤A&U - |NYb|6']ns#@j܊ t汄4,x;HDžp ͋)Kw:ͼ MTO$e<΂U=311@8-zGHI -KXNQb'ۿ {;yE7/qw -DhQ b8HXy){HY8cV-lde2h,M? FQ5qR-ՙ`hL 'Q 7Ҁ0ة23f HH(::vE;r.{OiZtbnW۝@@(~ Na%k$4A j+ !qOjƟE^M,YGCTP ͉eI|=N7Iլ=NYpEC^XIŻWS=nGy `;iagϊ:R&p8qnn4i  $̇~ECʴfbНfJ@Ӳ")| 8om(Mi(~Kq'@vo -9ڸSQdh|˸$_J0Ju sQBiFKN4E@XYaL^Nte9Ymt}&Ї̼%jy &R1bMDdAK$,q9=9, $a2p 1^OQ4?vWjV6qu -O!ga^ZlE|$'bwE۳0n#-} 1wCFڴ=z#Y2F[G<ҟU0"r!-+/+ zG3jqΙ; T~DKyX S"J7H>zt=2jւyL -endstream -endobj -2173 0 obj << -/Type /FontDescriptor -/FontName /JVBSYW+SFTT1200 -/Flags 4 -/FontBBox [-202 -360 1341 829] -/Ascent 611 -/CapHeight 611 -/Descent -222 -/ItalicAngle 0 -/StemV 50 -/XHeight 430 -/CharSet (/A/B/C/D/E/F/G/H/I/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/asterisk/b/braceleft/braceright/c/colon/comma/d/e/equal/f/four/g/greater/h/hyphen/i/j/k/l/less/m/n/o/one/p/parenleft/parenright/period/q/quoteright/r/s/semicolon/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 2172 0 R ->> endobj -2174 0 obj << -/Length1 1612 -/Length2 15659 -/Length3 0 -/Length 16495 -/Filter /FlateDecode ->> -stream -xڭepܮ%jcf63̎n3bffffffc!fwܹS3stUoI{iIK[U]MA ljo sf`ad(X81(]p@#gK{;1#g @h -XY,pQ{3ZMY?-=W=h -p,mZ -jI5$hdPt14Y휀43{GͿ{;SJsb%08&M\wov&6.k7!ۿ`NN& g߬blaOn'˿nHS{J/_O.c dc7_0h8Yڙ'z#/?:[F ǿn+qtvژ1±i7?"mgf`a>WD%adjog01);M SO[oM_pQ0;^0 g9l-m<k$p6C ̌6Z:IXM-M,fF6;/)W5_|&v.%WQgRWSS;_QwV%?K7_0DD^ _ +'oB.CYdf??y/0v&̊_&.U׋[5@;nuބ7*-3ݹ;wdJLgr$TڨZTWc]iV4t -zߗ=òM^xnRvr0"iDy].mCis0N))뗼t9^>a?|LRb1P -O(GG{rbRB!RF9 jUz7#_w\~kxQGʽ(uȽ%Aw%;JWib]D 'p~P;a5L&@4rqE=Ug[Cҏ0:U -O0R$r%"k|+MzX0웳=3sQdSt'/w}`ԁNcj*Uj[P}L)nGn_ -'ND##C2^Ț<Q:Bר& [qB_cWk5RgVd .a~>Hv{*vDObiqOlNPέoƽN:9)^dAUYJUǭz/"#{}F7u|~Ր%xJhψw=h*ĥܡlce/8@z'p*ER8L@K-Lߊ svg$ۜ]?w f(cI-l84؝Q4˲MWCфlEh㪵F!,mM;nj.cgtz╔z뱈|B㯂bܠ'Ajv5aj~8GFB>M$]aA|+llN!$cNJغKcb>~!dR*H}ܣL-&J#u/=͛5wWA䲃B^hyXw،tJNꖕ"hl(|`9[=?/I_Z wѓ+s>11tfglIeM]ި}Zyv#2!3j%y.KY)s_Jb=٫>?RUtRDzX)~zT#}c s~심Θn`ӵ<<ҫQJ f_Иurv\NÀR{nVu -Fbb4iS4^i9׋Zd#djG 4'y1͝rg-ƜQn@AZ+, n6B"qW_2Ҁ6|QB(es"(lVڃN{Miw .pZҝY] ,F?0;MOu5_,o>T>~lsc/͆a=RJT"yG>U*k}V䊭 -~0S[$/>B/]U/= 34!f'RGCrd@o Su s_A# 2|%3\}tQR̵PrzQB-uD2 3;o;ഘGL:PȽ(i݈NRS2dݬXA)}%Mnm־w 剗yiCw^fxCqoKFmZTݛ:͎h'W;9 -QAŇt{˒+3]#zUT0UPǎarIUQʎ^#~Mg*xĐa2~U2j*kjk-Ği7HDy|lb}/+;.nJYX.ߡ㧄!9Po&39;C RI8j]9FW}舛6()J7 yg޼My. 7SUL-^C^>*(@މI"ov=m"zB4rWvzϧ'WiҨ05/8VN'}NOayek~C!)70{ǼK('=< -pHLW*Rf K' -oLn͊ -{ Se$dq*('\`2R2UD>N\W[<#Q%e^QqU|Z)%/Ŋ˕, S Mx!~s sp=aqƿZvV 70Y"򧺇>TY;3Kq^Ci7].xurBhO.~E 1ߩ5N5_R}1&IKA e]8ݪЍFn&eZo}N$Xӏ]|.N)gX㵯  JI0_\Xuwe~u_k1TZtҷCk2i7mJ\XW`ZVT -l#{gKF/Mqǧ}xd:Fz|';]Me hYQ|])r詫ry`FҎ%T'({R zS ֳuz>|2 ->L+֚%9ya{|Zef?F0X^f4*GYq5rm}?ރW_eh(=G;12HUOeyOzgy@WP)H*pqRT˻~T&J4˕]Sa !a`)ؓV -e9;l;yDfihf#0&k==@^4- 21>FB^ZPS㚀!q,/!de^y5g)t!o* o}S!ђ~uMQ#I{3n& ~wsnVW&NXxt ƣX1A%p?xrIMѮ!L,W*P $^C̤b'<,[T鰱f&~Q}PLcRmHO'y]oh8֍r慛,Er}5_n.ll^!]'0/xX`|}2ԓkX]2aVH2B_e4n&Eh~~IUtt!zCa35_cXi?,ղ=Ťݹ߼5aˊ>|-2;`(}fF})(zz'8yy42\BUWqҍe/fSjm z7*֪W7z5OnLxo4}ۯ =җI/eeVo4 1 foEbFvJd^SSYN(kѬ20t"Gf6iQTu8>'Ex6Xѽ^;B41D%{{lr~¶*Enl l R+Z CPnil]9PɼG!61Ԕlɮgzƒ[g%Ĕ&l*Հ7Ӥ -6Ь#D 0H⡴~z<M cݺ~zFR X F@VS"gn{c\#,PȂCw@I8[۫ӟNp0rŭ"ݬ2 -ż_O<ƛu>?ŷ"~;UsC7kIٮG4t8{YPϐ]H2 &l>MsRʗ\^ -8!!9. `]CU,/ROX`.OB&vk%F<1VAƜ -’i5ߍoO*ygn ' ,]\2!<@<-0ӻG}/# Wd<.t}Mt1Ѷv5g{m[*!?K B.B7{4I@߈sQ@51mJ/dsK1m#YrACHE~=B4n?'Ä3?)M-j׋c$񼽅tS%e&c!:dסRs}#8Y]#zL( -S8/FFKXn>*sRm׮|2W{.jYwь )u  M*e{( -cX -F$or|;+x*{A:A-p5bW<]OrEh2m봉xLR&$ZSNu(o[3BX+. -+fO'`M_P;_!hpkC7j8Dܫ7^d+ZP|ӤJ] STP0^iZC>?Ύ}1y!A\`e.rT\k1XH E5z&c8b"Q: #sZ@UGm59J3i52W $I#sgg:יTr*q9ܺW5[))^9`7LX[HιOo\Fg!tcRsSXL$T##nWBƒy',OC)$!d&ې Dz9rq3()0X3C ZlDZFU8cOp)Rۖ3~vԛ/Q2"ؚ`# ,mIVcwa|rW7|Ju!1fRCM]L ʡr֯|iTr͗CNyEJzzQ g -%կC@X::kTUpLE;jtD3Oǜ8 ܂A!x6A>O<3Խ{ܞNlղ/9` J=-ti}'~~ 3o -.<X\W'!}PҶqCy7 -8_#D E^J`scB uړ/O'Տw_ -ڏҴ(T00t+> U_P$/sg,77vTf8]É$HjQ> ׍OyE8XsA➼ڣ9SGJ!TB7|י5B-4yfG ]b czy KE~Y8 )y䥝F߆f"ſ`:[!m$ &[=RC(A1`^.Vlp}јձ& b7Qw/!v}QT"5Ox0G kQSzraX H/|ƢWm;byvo Im3ه[(u?$)1٬`h$2_HedOojEDJ`_meMP>?Rq]5jm Zc &L}-E; 2 *UDLDʧB*HE*EX#ءHp|S,Y{6Wdqe7&ǂp@nޢɊS+R#c~-<F5 &Ln{iّ)Bf#IG~5QLy8kӄ 5N"j^4/czPDS%t,mo'2;ʖ_=c}Aа/U_Rjq 4w{T21AݫiM&6AsX>G-u'luA I%tsgg~`pY.f7ֵ63QLP~.)}4 VZZ$C><T6?U6HTʶVA,{]S5Ӄ7C{4"̀1 G9QU Ԣ}EVf5tƆj.:Ǡqa-ռ^x5`A<}v -{K^!gUD(~jy$&h!zADF7D9vDHJ܍8!1g#j_4mKXT2:L" b;ɬ#s8))~fcJHE@WVGRYho;Vd1sXA;8kɓr|SY A{>IIGSTjvP at>"ƭKNgt~uARNRxL)Ӛ鮺f8ݧb䒁\iT%KQJO V{NZC 0pVt}cՉ>',UYwW/| htM -),ރ'Ҵ'$Z3:W-y2lȋ{ЏK)6 kw*vInQx(mj C9ҩux('J.EeIKu![E(ۧzBDŚRPԪ'$rv  I䁟l)hYD˷X ,S4"BSτ"M .WHWliP \Y0jJU&ue vvV#\_B(]ECD1/ %ԋn,_KPFs]] -E9M Sl Q"˳ozwh"xnE'jRTt6b'.6MzQ%ڄjx`auj[֌ &W2v7&wٳbkұ^,M"Ls+WnxqmM;_ uG1ԋs͞xQ"]UUK÷ٲwz@/x, ͳNOA -\;뵺[ma7qvKCP.Y?y4.%Ot˳QWTRq„O X~d";oQ}pKxE\N֫P|\s] jqDz2BX Q,0{r?evX +63q쫥vxŦ\bʂ![Os&L41ST/<ߏRv^҄؛렮m|: ˇ/v+|@Ȁ:JVw56J8{Jsk*(&a4L_,~@L깡xÔ&2 O>LvA 7 _A:,atN֢SJzuSw^H{H@o T~; ܩ@IjS[ '85qW`Ja3UPl\Mn҆`SOg^n;;IۧǸ XtʼFL,h{y&¨s=*uN@M!arnNN{1LyqB"0?&}"%Zvl۲ ]HiY$^Uim@g닲GWoZ !NrkF 5B?~ORl-ue!V$)1SQh'hs\IY$L)- 2\|$8WE6q*] 4|p }4 N돉'or .1VcZDXo@Y Qo+q]~9Ħp:ZǍvyϹesY Dxr "\Y"a|=(T49CMN>{w/_|Fj.nqfԥuHrof{\l7/ć[h𙓒x Dd^p8r,ǿL':_޽pİ|'X?fyIFg(hpVqv"(Di8|7<[B6qoDedgUdf|t0$wbJ$n+5{??V% k$x(*Aa2cۋcJ.:Ukzγ7rrtٿ >h8 UbQt**#5)0k"M)&]X ?BvYD^5m@;V^.gM2Xv2QK‰V_I] G7< y1dעnìDQļ뜋t=V9|pX@5K'cҎ^M!ϓYjw DuCnǖ1[u=gr޶JȪdo40ϖ'=u(gcUY-.ݹ>gM3Ϩ[kjH`z1fWIH|u~B,d oJ3PcCBʤ\<0 Cp'.3-Y ]^oN<>'AXo rGʼn57>px@- ='-5\K=.abI`Ak [ӏkpT~Uqݎ=v ȮP'+օ&3~6ʇ=º h8da wZ#]MQp/(RrW䇤jhLnh¥q| 2*0{4θB_}z:76$נ}N[=b:E(J_}CU<i5/qEY&5zaj.+8TԲTs#TNrSB̏3T) -qTrk xivKCMoIoMSuF>1!;ÑdK=NWgPq+0|njJ1I8j5<|a+K9oPbO Ji4$^-97J ?R##`qejVQZna3SKyi!Bp0m/\& $`竨vvuKx}F޶YؙJǼ tdh$f ۋ%E|ry>ЯKL#UE7&#mh -l/^gݕIxL`n>/c'`wTq1_ lcy]6s*^xz,j3n9e12pQ˟swYZC8#0g4I]pXx6Ea+růQ.mJ~Eœ\rZekHHNhiP;~d asm3GJC؃%Foj /!/⡟r[`*Ր'!&k&d?%tF1o L,Mk0=ۍy~+L`/Kbv?Ե5DbeBZPQѹM/:%b1|7cH|sb^پ%VuHxIR|ЩL\ޞHN.<8v25Z,4כ[B1}Ӆ-!_r -}kI% &#v1QdyW೛;*&KHْͫ0Kq`c{a1]92ٟ+38[BH.ɗV,WW`dHiy1 5騗AǚԱ>ňͫ\Uw4v7/'a7کbn T#9g!ޥޝ?igR7NȯQ/jgkʲ M B]gju(vpse\Ey5M%?`?+ҿ/b6W8j'[|O.KxzkQߛb{OehL6tQ97vGWr_ ͸LoS%LISH^U&np4gR3G ~.8y"/̭x:A֧rYPoqرD3|+Ǹ'OROx4\Z{Vʬ&gRڊyQj9;lq^bmP?$Gp>9`-ig!bB*ؒǑ>Mё%Õk"$Ҁu& ##o<|n>نR)$ŌoPgg}z0;C RjU%vc񍍣NIcQ0FC=c^cq鵅syriIN*^؁tu~>k*!)2蝧(LNX '!wCЗf;3e_m[فem4Ѹ/ZڿFlYz?8a*ZA׫Mzp/>Z>U?k HD M؎_ܜD -;lkG<~$mFkHT7Ui 5zW46q5Si/3HI.[CT.)~$|(IXu=|Y]9tuhS[xH+a6^wЯ3o-mXbN`5[v^;qZǤ]&{w򻠲|iPmG"A­ri֏͍6 -%B`J> endobj -2176 0 obj << -/Length1 1608 -/Length2 1178 -/Length3 0 -/Length 1944 -/Filter /FlateDecode ->> -stream -xڭT{胢B`;p( xJd <0)H  8Z8 3 @Qc -B@!E1@ 43B/%Ԅ$d01̛h -&19 ޮn< Vզ0& )p%ua4Q%AQrf$Jaxk@Pb`lt&eӄ: P25a,jQD|޸ z@dH@"JY\OfJ2݉$~'y5%y2[L 0 0慡P1 `dON\3|18が<o܉QnE1RHHa8h#/^<)jK#3ys{ZM~MYތo!gbyc0\\ g\6QoOb&14[6OYf8Ta8$Eշi^rU0V;;~q(0]d}ю\%%O[,Q -6:1qF(~)L_> endobj -2177 0 obj << -/Length1 1166 -/Length2 3497 -/Length3 0 -/Length 4250 -/Filter /FlateDecode ->> -stream -xuSw\SE@R- -I&]zB" $ қR頔EiJ"Q \ߺ~;s7_9sFX\JsuqX4`<HtEX!D086D.^10%Y%9i&3GPL ?` -@;KqN^ dǻc@$N Q @S;gU@ #`]HJi_"A" Pޠ;5 ԦQcMH}\@̅D+Ax4b"IPqj:X{"wʹ1Љ:wܰ8l?`41 b<@S!_3H`g`3 N.%~x)FbQAx@#݉` R,D7^`P߱HK( p+;$`BQ8߯p@muƧ(MM5, u)Ԍr2gK:@M CH H& H'e;O_-7_{ ]/w)@ՃqGˁ?' _2a_e!9i*~CG|ɀoD]@,귒:X' -uITW" ﴓ@Qܣ1Atb9)> -*ȴ[ly ȲD6u+~69S۴E"1ݾ8~h7Ez#wu -%%&eX _ͣZ? miusG߲}7yDQn !q;O͔݃^u<Ն6ToڲV.rzy@.U ђ#M3;.O;\9CKq@T˻u݂9GƹxSfh/U9Cjieհٗ挄*KM7Nz$NW[4F*c. c?v6AiQb?2T׫`Jޙr4.AqygE^6ʫzk&瓄3s>G$<,;f3w.Wwf\[7d5wf۫kr:/e+'kICT̥TvYM+ˏ!25Z}$DCSΗp5GYr Xx2 ѕ:|E{&=U٘>^AsVM g6^vh~ʣ ̴h` n-$?*x!CfFY~1d{iL3ݩZ\)q YZ8%ά# mҟ`nYTAtQ -VQJ5'bU[E>ҍafKœA1t?^a*9H|2AGtz} -ˋ8.;/l3ѥ<%`C -,C Ԣ0)lr6#& kB k  Q ïڪ& eDZU@7eH=xN;R#ΖxmG>7i܎XeV2jnJD>4])vE?Blr]9n2HvSŷaؒ^o!u_4Y!>B "v)ۑoS0Rf|q6B4P9ԫ8%YysLm}nv|"x,aE~(MfunQrxɸR>}Զ|jr4WCVu;S1id~C;HZAMV 1 -4agLM_yfRl)Y>e/"bT*H#tq9Sot -`T< -# jb  -'*%grgp̥٨kx P({/|o_Ons6/7]`-Ӓț~QMJxYe7gAΝ >\nb.,Lptgoh2"8}. -W~€`f4C%R);aV4=ʗʅ_ԬL{bk ?grl^Y01rDIܛ|u}G݆>Os5Y;NFyHDC˺y{?.A.'f6=7Ɣ\xgPIc}٥7Op)g0cɫ ޟ(wNftSxh9ZM! GdG=D27ԷXjaRIobiI`9is&|cN[h짢ް>~Ti;1q=4($gI 3Р/9D3H54]ubhTs@fb!aG0`oBf,'SD*\PЂS\ w*֙pU`dOrL!c/wK"w[8wo+VJ -EvL|,ʢDu Kּ3ŵ4%ٍ*ꐷaMqR2fLm\[_ sשRJp6V_*sQ\1O;d*dr M(Su lfaIC~`MBNztduPDѸc+?Ǒ#|)lʀ0nHݎTaq;5 -獫vmڛ_=W>Yuco~޲뜋c"='?Ln\,@ {HPwN-vJV:z`Q+[W'..3fCp%RANHF^|w7w^=n54u7D8)q\O/Q)>ӤONmE:Nkutx36h{f-tr7]׌?Rsq_ZL^6mP| 7 -T=Ҿ3{o9U6ϻ?"rq,`[l3m7zqoK[n兞jhs?/\4,L.ݠZp|}Y S/-3ePdHSX5yYqWnxd `Cҩq'P;_g/@q?#fYSsi҃sNc{ 3CRR> v݃ļVfol.d^溉 IiK16˿MFsxbyGkg-i Hti"k-3i}^f53OuJԳxiF;f - .KkB9W; X&u_?uös,MȮd$"^xg-O Q"߁?HtEdB';!Q ea6~(ER/y8Fv,(_ng:2N%2eai^]q%x^Bv%=|ܓ}a7;=f@hR^X =.=ҡmȓp|%LdD3_gAb^_˚jo~c'M/_; -J\n!۵X_J^ -v^Օ_"`VWW<{^:"iF9{L'g#ps9^ybLI/lf 7Vo:ԕq> endobj -2113 0 obj << -/Type /Encoding -/Differences [38/ampersand/quoteright/parenleft/parenright/asterisk 44/comma/hyphen/period/slash/zero/one/two/three/four 55/seven/eight/nine 61/equal 65/A/B/C/D/E/F/G/H/I 75/K/L/M/N/O/P 83/S 85/U/V/W/X 97/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] ->> endobj -2110 0 obj << -/Type /Encoding -/Differences [16/quotedblleft/quotedblright 21/endash 27/ff/fi/fl/ffi/ffl 33/exclam/quotedbl/numbersign 38/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 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P 82/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 95/underscore 97/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 125/braceright 237/iacute 246/odieresis 250/uacute] ->> endobj -1747 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /TOZZLY+CMMI12 -/FontDescriptor 2133 0 R -/FirstChar 62 -/LastChar 62 -/Widths 2109 0 R ->> endobj -1752 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /PCDXWO+CMR12 -/FontDescriptor 2135 0 R -/FirstChar 49 -/LastChar 61 -/Widths 2108 0 R ->> endobj -617 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /AQTFCU+CMSY10 -/FontDescriptor 2137 0 R -/FirstChar 13 -/LastChar 15 -/Widths 2128 0 R ->> endobj -1726 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /ALOUBG+SFBI1200 -/FontDescriptor 2139 0 R -/FirstChar 97 -/LastChar 118 -/Widths 2111 0 R -/Encoding 2110 0 R ->> endobj -1557 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /SOPHDA+SFBX1000 -/FontDescriptor 2141 0 R -/FirstChar 35 -/LastChar 121 -/Widths 2117 0 R -/Encoding 2110 0 R ->> endobj -1559 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /YUYLJM+SFBX1095 -/FontDescriptor 2143 0 R -/FirstChar 28 -/LastChar 121 -/Widths 2115 0 R -/Encoding 2110 0 R ->> endobj -1274 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /QODSBC+SFBX1200 -/FontDescriptor 2145 0 R -/FirstChar 45 -/LastChar 121 -/Widths 2126 0 R -/Encoding 2110 0 R ->> endobj -1532 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /CPGHBR+SFBX1440 -/FontDescriptor 2147 0 R -/FirstChar 45 -/LastChar 121 -/Widths 2123 0 R -/Encoding 2110 0 R ->> endobj -1543 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /WQLJSV+SFBX1728 -/FontDescriptor 2149 0 R -/FirstChar 45 -/LastChar 121 -/Widths 2122 0 R -/Encoding 2110 0 R ->> endobj -1272 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IULDDO+SFBX2488 -/FontDescriptor 2151 0 R -/FirstChar 45 -/LastChar 121 -/Widths 2127 0 R -/Encoding 2110 0 R ->> endobj -1545 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /JDSMEO+SFRM0700 -/FontDescriptor 2153 0 R -/FirstChar 49 -/LastChar 50 -/Widths 2120 0 R -/Encoding 2110 0 R ->> endobj -1544 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /SAPZKM+SFRM0800 -/FontDescriptor 2155 0 R -/FirstChar 49 -/LastChar 50 -/Widths 2121 0 R -/Encoding 2110 0 R ->> endobj -1558 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /LWHRIB+SFRM1000 -/FontDescriptor 2157 0 R -/FirstChar 27 -/LastChar 122 -/Widths 2116 0 R -/Encoding 2110 0 R ->> endobj -616 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /GEVOEX+SFRM1200 -/FontDescriptor 2159 0 R -/FirstChar 16 -/LastChar 250 -/Widths 2129 0 R -/Encoding 2110 0 R ->> endobj -1307 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /JOMBSP+SFSL1200 -/FontDescriptor 2161 0 R -/FirstChar 45 -/LastChar 89 -/Widths 2125 0 R -/Encoding 2110 0 R ->> endobj -605 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /HPHIAV+SFSS1200 -/FontDescriptor 2163 0 R -/FirstChar 46 -/LastChar 115 -/Widths 2130 0 R -/Encoding 2110 0 R ->> endobj -604 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /DFXNIW+SFSS2074 -/FontDescriptor 2165 0 R -/FirstChar 68 -/LastChar 118 -/Widths 2131 0 R -/Encoding 2110 0 R ->> endobj -1569 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /PJUQLZ+SFTI1000 -/FontDescriptor 2167 0 R -/FirstChar 97 -/LastChar 121 -/Widths 2112 0 R -/Encoding 2110 0 R ->> endobj -1552 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /IKHPDP+SFTI1200 -/FontDescriptor 2169 0 R -/FirstChar 28 -/LastChar 122 -/Widths 2118 0 R -/Encoding 2110 0 R ->> endobj -1546 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /DANFJN+SFTT1000 -/FontDescriptor 2171 0 R -/FirstChar 46 -/LastChar 121 -/Widths 2119 0 R -/Encoding 2110 0 R ->> endobj -1308 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /JVBSYW+SFTT1200 -/FontDescriptor 2173 0 R -/FirstChar 38 -/LastChar 125 -/Widths 2124 0 R -/Encoding 2110 0 R ->> endobj -1560 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /VUUVBM+NimbusMonL-Regu -/FontDescriptor 2175 0 R -/FirstChar 38 -/LastChar 122 -/Widths 2114 0 R -/Encoding 2113 0 R ->> endobj -606 0 obj << -/Type /Pages -/Count 6 -/Parent 2178 0 R -/Kids [598 0 R 613 0 R 1269 0 R 1304 0 R 1334 0 R 1369 0 R] ->> endobj -1420 0 obj << -/Type /Pages -/Count 6 -/Parent 2178 0 R -/Kids [1400 0 R 1437 0 R 1471 0 R 1505 0 R 1513 0 R 1529 0 R] ->> endobj -1537 0 obj << -/Type /Pages -/Count 6 -/Parent 2178 0 R -/Kids [1534 0 R 1540 0 R 1549 0 R 1554 0 R 1562 0 R 1566 0 R] ->> endobj -1574 0 obj << -/Type /Pages -/Count 6 -/Parent 2178 0 R -/Kids [1571 0 R 1576 0 R 1580 0 R 1584 0 R 1588 0 R 1592 0 R] ->> endobj -1601 0 obj << -/Type /Pages -/Count 6 -/Parent 2178 0 R -/Kids [1598 0 R 1604 0 R 1612 0 R 1621 0 R 1642 0 R 1647 0 R] ->> endobj -1655 0 obj << -/Type /Pages -/Count 6 -/Parent 2178 0 R -/Kids [1652 0 R 1661 0 R 1668 0 R 1672 0 R 1678 0 R 1687 0 R] ->> endobj -1698 0 obj << -/Type /Pages -/Count 6 -/Parent 2179 0 R -/Kids [1693 0 R 1702 0 R 1707 0 R 1711 0 R 1715 0 R 1719 0 R] ->> endobj -1727 0 obj << -/Type /Pages -/Count 6 -/Parent 2179 0 R -/Kids [1723 0 R 1729 0 R 1734 0 R 1740 0 R 1744 0 R 1749 0 R] ->> endobj -1757 0 obj << -/Type /Pages -/Count 6 -/Parent 2179 0 R -/Kids [1754 0 R 1759 0 R 1766 0 R 1770 0 R 1774 0 R 1778 0 R] ->> endobj -1785 0 obj << -/Type /Pages -/Count 6 -/Parent 2179 0 R -/Kids [1782 0 R 1787 0 R 1791 0 R 1795 0 R 1799 0 R 1803 0 R] ->> endobj -1810 0 obj << -/Type /Pages -/Count 6 -/Parent 2179 0 R -/Kids [1807 0 R 1812 0 R 1816 0 R 1820 0 R 1824 0 R 1828 0 R] ->> endobj -1842 0 obj << -/Type /Pages -/Count 6 -/Parent 2179 0 R -/Kids [1835 0 R 1848 0 R 1879 0 R 1906 0 R 1936 0 R 1969 0 R] ->> endobj -2016 0 obj << -/Type /Pages -/Count 4 -/Parent 2180 0 R -/Kids [2012 0 R 2096 0 R 2100 0 R 2105 0 R] ->> endobj -2178 0 obj << -/Type /Pages -/Count 36 -/Parent 2181 0 R -/Kids [606 0 R 1420 0 R 1537 0 R 1574 0 R 1601 0 R 1655 0 R] ->> endobj -2179 0 obj << -/Type /Pages -/Count 36 -/Parent 2181 0 R -/Kids [1698 0 R 1727 0 R 1757 0 R 1785 0 R 1810 0 R 1842 0 R] ->> endobj -2180 0 obj << -/Type /Pages -/Count 4 -/Parent 2181 0 R -/Kids [2016 0 R] ->> endobj -2181 0 obj << -/Type /Pages -/Count 76 -/Kids [2178 0 R 2179 0 R 2180 0 R] ->> endobj -2182 0 obj << -/Type /Outlines -/First 7 0 R -/Last 155 0 R -/Count 6 ->> endobj -595 0 obj << -/Title 596 0 R -/A 593 0 R -/Parent 571 0 R -/Prev 591 0 R ->> endobj -591 0 obj << -/Title 592 0 R -/A 589 0 R -/Parent 571 0 R -/Prev 587 0 R -/Next 595 0 R ->> endobj -587 0 obj << -/Title 588 0 R -/A 585 0 R -/Parent 571 0 R -/Prev 583 0 R -/Next 591 0 R ->> endobj -583 0 obj << -/Title 584 0 R -/A 581 0 R -/Parent 571 0 R -/Prev 579 0 R -/Next 587 0 R ->> endobj -579 0 obj << -/Title 580 0 R -/A 577 0 R -/Parent 571 0 R -/Prev 575 0 R -/Next 583 0 R ->> endobj -575 0 obj << -/Title 576 0 R -/A 573 0 R -/Parent 571 0 R -/Next 579 0 R ->> endobj -571 0 obj << -/Title 572 0 R -/A 569 0 R -/Parent 567 0 R -/First 575 0 R -/Last 595 0 R -/Count -6 ->> endobj -567 0 obj << -/Title 568 0 R -/A 565 0 R -/Parent 159 0 R -/Prev 491 0 R -/First 571 0 R -/Last 571 0 R -/Count -1 ->> endobj -563 0 obj << -/Title 564 0 R -/A 561 0 R -/Parent 495 0 R -/Prev 559 0 R ->> endobj -559 0 obj << -/Title 560 0 R -/A 557 0 R -/Parent 495 0 R -/Prev 555 0 R -/Next 563 0 R ->> endobj -555 0 obj << -/Title 556 0 R -/A 553 0 R -/Parent 495 0 R -/Prev 551 0 R -/Next 559 0 R ->> endobj -551 0 obj << -/Title 552 0 R -/A 549 0 R -/Parent 495 0 R -/Prev 547 0 R -/Next 555 0 R ->> endobj -547 0 obj << -/Title 548 0 R -/A 545 0 R -/Parent 495 0 R -/Prev 543 0 R -/Next 551 0 R ->> endobj -543 0 obj << -/Title 544 0 R -/A 541 0 R -/Parent 495 0 R -/Prev 539 0 R -/Next 547 0 R ->> endobj -539 0 obj << -/Title 540 0 R -/A 537 0 R -/Parent 495 0 R -/Prev 535 0 R -/Next 543 0 R ->> endobj -535 0 obj << -/Title 536 0 R -/A 533 0 R -/Parent 495 0 R -/Prev 531 0 R -/Next 539 0 R ->> endobj -531 0 obj << -/Title 532 0 R -/A 529 0 R -/Parent 495 0 R -/Prev 527 0 R -/Next 535 0 R ->> endobj -527 0 obj << -/Title 528 0 R -/A 525 0 R -/Parent 495 0 R -/Prev 523 0 R -/Next 531 0 R ->> endobj -523 0 obj << -/Title 524 0 R -/A 521 0 R -/Parent 495 0 R -/Prev 519 0 R -/Next 527 0 R ->> endobj -519 0 obj << -/Title 520 0 R -/A 517 0 R -/Parent 495 0 R -/Prev 515 0 R -/Next 523 0 R ->> endobj -515 0 obj << -/Title 516 0 R -/A 513 0 R -/Parent 495 0 R -/Prev 511 0 R -/Next 519 0 R ->> endobj -511 0 obj << -/Title 512 0 R -/A 509 0 R -/Parent 495 0 R -/Prev 507 0 R -/Next 515 0 R ->> endobj -507 0 obj << -/Title 508 0 R -/A 505 0 R -/Parent 495 0 R -/Prev 503 0 R -/Next 511 0 R ->> endobj -503 0 obj << -/Title 504 0 R -/A 501 0 R -/Parent 495 0 R -/Prev 499 0 R -/Next 507 0 R ->> endobj -499 0 obj << -/Title 500 0 R -/A 497 0 R -/Parent 495 0 R -/Next 503 0 R ->> endobj -495 0 obj << -/Title 496 0 R -/A 493 0 R -/Parent 491 0 R -/First 499 0 R -/Last 563 0 R -/Count -17 ->> endobj -491 0 obj << -/Title 492 0 R -/A 489 0 R -/Parent 159 0 R -/Prev 307 0 R -/Next 567 0 R -/First 495 0 R -/Last 495 0 R -/Count -1 ->> endobj -487 0 obj << -/Title 488 0 R -/A 485 0 R -/Parent 311 0 R -/Prev 483 0 R ->> endobj -483 0 obj << -/Title 484 0 R -/A 481 0 R -/Parent 311 0 R -/Prev 479 0 R -/Next 487 0 R ->> endobj -479 0 obj << -/Title 480 0 R -/A 477 0 R -/Parent 311 0 R -/Prev 475 0 R -/Next 483 0 R ->> endobj -475 0 obj << -/Title 476 0 R -/A 473 0 R -/Parent 311 0 R -/Prev 471 0 R -/Next 479 0 R ->> endobj -471 0 obj << -/Title 472 0 R -/A 469 0 R -/Parent 311 0 R -/Prev 467 0 R -/Next 475 0 R ->> endobj -467 0 obj << -/Title 468 0 R -/A 465 0 R -/Parent 311 0 R -/Prev 463 0 R -/Next 471 0 R ->> endobj -463 0 obj << -/Title 464 0 R -/A 461 0 R -/Parent 311 0 R -/Prev 459 0 R -/Next 467 0 R ->> endobj -459 0 obj << -/Title 460 0 R -/A 457 0 R -/Parent 311 0 R -/Prev 455 0 R -/Next 463 0 R ->> endobj -455 0 obj << -/Title 456 0 R -/A 453 0 R -/Parent 311 0 R -/Prev 451 0 R -/Next 459 0 R ->> endobj -451 0 obj << -/Title 452 0 R -/A 449 0 R -/Parent 311 0 R -/Prev 447 0 R -/Next 455 0 R ->> endobj -447 0 obj << -/Title 448 0 R -/A 445 0 R -/Parent 311 0 R -/Prev 443 0 R -/Next 451 0 R ->> endobj -443 0 obj << -/Title 444 0 R -/A 441 0 R -/Parent 311 0 R -/Prev 439 0 R -/Next 447 0 R ->> endobj -439 0 obj << -/Title 440 0 R -/A 437 0 R -/Parent 311 0 R -/Prev 435 0 R -/Next 443 0 R ->> endobj -435 0 obj << -/Title 436 0 R -/A 433 0 R -/Parent 311 0 R -/Prev 431 0 R -/Next 439 0 R ->> endobj -431 0 obj << -/Title 432 0 R -/A 429 0 R -/Parent 311 0 R -/Prev 427 0 R -/Next 435 0 R ->> endobj -427 0 obj << -/Title 428 0 R -/A 425 0 R -/Parent 311 0 R -/Prev 423 0 R -/Next 431 0 R ->> endobj -423 0 obj << -/Title 424 0 R -/A 421 0 R -/Parent 311 0 R -/Prev 419 0 R -/Next 427 0 R ->> endobj -419 0 obj << -/Title 420 0 R -/A 417 0 R -/Parent 311 0 R -/Prev 415 0 R -/Next 423 0 R ->> endobj -415 0 obj << -/Title 416 0 R -/A 413 0 R -/Parent 311 0 R -/Prev 411 0 R -/Next 419 0 R ->> endobj -411 0 obj << -/Title 412 0 R -/A 409 0 R -/Parent 311 0 R -/Prev 407 0 R -/Next 415 0 R ->> endobj -407 0 obj << -/Title 408 0 R -/A 405 0 R -/Parent 311 0 R -/Prev 403 0 R -/Next 411 0 R ->> endobj -403 0 obj << -/Title 404 0 R -/A 401 0 R -/Parent 311 0 R -/Prev 399 0 R -/Next 407 0 R ->> endobj -399 0 obj << -/Title 400 0 R -/A 397 0 R -/Parent 311 0 R -/Prev 395 0 R -/Next 403 0 R ->> endobj -395 0 obj << -/Title 396 0 R -/A 393 0 R -/Parent 311 0 R -/Prev 391 0 R -/Next 399 0 R ->> endobj -391 0 obj << -/Title 392 0 R -/A 389 0 R -/Parent 311 0 R -/Prev 387 0 R -/Next 395 0 R ->> endobj -387 0 obj << -/Title 388 0 R -/A 385 0 R -/Parent 311 0 R -/Prev 383 0 R -/Next 391 0 R ->> endobj -383 0 obj << -/Title 384 0 R -/A 381 0 R -/Parent 311 0 R -/Prev 379 0 R -/Next 387 0 R ->> endobj -379 0 obj << -/Title 380 0 R -/A 377 0 R -/Parent 311 0 R -/Prev 375 0 R -/Next 383 0 R ->> endobj -375 0 obj << -/Title 376 0 R -/A 373 0 R -/Parent 311 0 R -/Prev 371 0 R -/Next 379 0 R ->> endobj -371 0 obj << -/Title 372 0 R -/A 369 0 R -/Parent 311 0 R -/Prev 367 0 R -/Next 375 0 R ->> endobj -367 0 obj << -/Title 368 0 R -/A 365 0 R -/Parent 311 0 R -/Prev 363 0 R -/Next 371 0 R ->> endobj -363 0 obj << -/Title 364 0 R -/A 361 0 R -/Parent 311 0 R -/Prev 359 0 R -/Next 367 0 R ->> endobj -359 0 obj << -/Title 360 0 R -/A 357 0 R -/Parent 311 0 R -/Prev 355 0 R -/Next 363 0 R ->> endobj -355 0 obj << -/Title 356 0 R -/A 353 0 R -/Parent 311 0 R -/Prev 351 0 R -/Next 359 0 R ->> endobj -351 0 obj << -/Title 352 0 R -/A 349 0 R -/Parent 311 0 R -/Prev 347 0 R -/Next 355 0 R ->> endobj -347 0 obj << -/Title 348 0 R -/A 345 0 R -/Parent 311 0 R -/Prev 343 0 R -/Next 351 0 R ->> endobj -343 0 obj << -/Title 344 0 R -/A 341 0 R -/Parent 311 0 R -/Prev 339 0 R -/Next 347 0 R ->> endobj -339 0 obj << -/Title 340 0 R -/A 337 0 R -/Parent 311 0 R -/Prev 335 0 R -/Next 343 0 R ->> endobj -335 0 obj << -/Title 336 0 R -/A 333 0 R -/Parent 311 0 R -/Prev 331 0 R -/Next 339 0 R ->> endobj -331 0 obj << -/Title 332 0 R -/A 329 0 R -/Parent 311 0 R -/Prev 327 0 R -/Next 335 0 R ->> endobj -327 0 obj << -/Title 328 0 R -/A 325 0 R -/Parent 311 0 R -/Prev 323 0 R -/Next 331 0 R ->> endobj -323 0 obj << -/Title 324 0 R -/A 321 0 R -/Parent 311 0 R -/Prev 319 0 R -/Next 327 0 R ->> endobj -319 0 obj << -/Title 320 0 R -/A 317 0 R -/Parent 311 0 R -/Prev 315 0 R -/Next 323 0 R ->> endobj -315 0 obj << -/Title 316 0 R -/A 313 0 R -/Parent 311 0 R -/Next 319 0 R ->> endobj -311 0 obj << -/Title 312 0 R -/A 309 0 R -/Parent 307 0 R -/First 315 0 R -/Last 487 0 R -/Count -44 ->> endobj -307 0 obj << -/Title 308 0 R -/A 305 0 R -/Parent 159 0 R -/Prev 243 0 R -/Next 491 0 R -/First 311 0 R -/Last 311 0 R -/Count -1 ->> endobj -303 0 obj << -/Title 304 0 R -/A 301 0 R -/Parent 247 0 R -/Prev 299 0 R ->> endobj -299 0 obj << -/Title 300 0 R -/A 297 0 R -/Parent 247 0 R -/Prev 295 0 R -/Next 303 0 R ->> endobj -295 0 obj << -/Title 296 0 R -/A 293 0 R -/Parent 247 0 R -/Prev 291 0 R -/Next 299 0 R ->> endobj -291 0 obj << -/Title 292 0 R -/A 289 0 R -/Parent 247 0 R -/Prev 287 0 R -/Next 295 0 R ->> endobj -287 0 obj << -/Title 288 0 R -/A 285 0 R -/Parent 247 0 R -/Prev 283 0 R -/Next 291 0 R ->> endobj -283 0 obj << -/Title 284 0 R -/A 281 0 R -/Parent 247 0 R -/Prev 279 0 R -/Next 287 0 R ->> endobj -279 0 obj << -/Title 280 0 R -/A 277 0 R -/Parent 247 0 R -/Prev 275 0 R -/Next 283 0 R ->> endobj -275 0 obj << -/Title 276 0 R -/A 273 0 R -/Parent 247 0 R -/Prev 271 0 R -/Next 279 0 R ->> endobj -271 0 obj << -/Title 272 0 R -/A 269 0 R -/Parent 247 0 R -/Prev 267 0 R -/Next 275 0 R ->> endobj -267 0 obj << -/Title 268 0 R -/A 265 0 R -/Parent 247 0 R -/Prev 263 0 R -/Next 271 0 R ->> endobj -263 0 obj << -/Title 264 0 R -/A 261 0 R -/Parent 247 0 R -/Prev 259 0 R -/Next 267 0 R ->> endobj -259 0 obj << -/Title 260 0 R -/A 257 0 R -/Parent 247 0 R -/Prev 255 0 R -/Next 263 0 R ->> endobj -255 0 obj << -/Title 256 0 R -/A 253 0 R -/Parent 247 0 R -/Prev 251 0 R -/Next 259 0 R ->> endobj -251 0 obj << -/Title 252 0 R -/A 249 0 R -/Parent 247 0 R -/Next 255 0 R ->> endobj -247 0 obj << -/Title 248 0 R -/A 245 0 R -/Parent 243 0 R -/First 251 0 R -/Last 303 0 R -/Count -14 ->> endobj -243 0 obj << -/Title 244 0 R -/A 241 0 R -/Parent 159 0 R -/Prev 163 0 R -/Next 307 0 R -/First 247 0 R -/Last 247 0 R -/Count -1 ->> endobj -239 0 obj << -/Title 240 0 R -/A 237 0 R -/Parent 219 0 R -/Prev 235 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 163 0 R -/Prev 179 0 R -/First 223 0 R -/Last 239 0 R -/Count -5 ->> endobj -215 0 obj << -/Title 216 0 R -/A 213 0 R -/Parent 179 0 R -/Prev 211 0 R ->> endobj -211 0 obj << -/Title 212 0 R -/A 209 0 R -/Parent 179 0 R -/Prev 207 0 R -/Next 215 0 R ->> endobj -207 0 obj << -/Title 208 0 R -/A 205 0 R -/Parent 179 0 R -/Prev 203 0 R -/Next 211 0 R ->> endobj -203 0 obj << -/Title 204 0 R -/A 201 0 R -/Parent 179 0 R -/Prev 199 0 R -/Next 207 0 R ->> endobj -199 0 obj << -/Title 200 0 R -/A 197 0 R -/Parent 179 0 R -/Prev 195 0 R -/Next 203 0 R ->> endobj -195 0 obj << -/Title 196 0 R -/A 193 0 R -/Parent 179 0 R -/Prev 191 0 R -/Next 199 0 R ->> endobj -191 0 obj << -/Title 192 0 R -/A 189 0 R -/Parent 179 0 R -/Prev 187 0 R -/Next 195 0 R ->> endobj -187 0 obj << -/Title 188 0 R -/A 185 0 R -/Parent 179 0 R -/Prev 183 0 R -/Next 191 0 R ->> endobj -183 0 obj << -/Title 184 0 R -/A 181 0 R -/Parent 179 0 R -/Next 187 0 R ->> endobj -179 0 obj << -/Title 180 0 R -/A 177 0 R -/Parent 163 0 R -/Prev 167 0 R -/Next 219 0 R -/First 183 0 R -/Last 215 0 R -/Count -9 ->> endobj -175 0 obj << -/Title 176 0 R -/A 173 0 R -/Parent 167 0 R -/Prev 171 0 R ->> endobj -171 0 obj << -/Title 172 0 R -/A 169 0 R -/Parent 167 0 R -/Next 175 0 R ->> endobj -167 0 obj << -/Title 168 0 R -/A 165 0 R -/Parent 163 0 R -/Next 179 0 R -/First 171 0 R -/Last 175 0 R -/Count -2 ->> endobj -163 0 obj << -/Title 164 0 R -/A 161 0 R -/Parent 159 0 R -/Next 243 0 R -/First 167 0 R -/Last 219 0 R -/Count -3 ->> endobj -159 0 obj << -/Title 160 0 R -/A 157 0 R -/Parent 155 0 R -/First 163 0 R -/Last 567 0 R -/Count -5 ->> endobj -155 0 obj << -/Title 156 0 R -/A 153 0 R -/Parent 2182 0 R -/Prev 135 0 R -/First 159 0 R -/Last 159 0 R -/Count -1 ->> endobj -151 0 obj << -/Title 152 0 R -/A 149 0 R -/Parent 139 0 R -/Prev 143 0 R ->> endobj -147 0 obj << -/Title 148 0 R -/A 145 0 R -/Parent 143 0 R ->> endobj -143 0 obj << -/Title 144 0 R -/A 141 0 R -/Parent 139 0 R -/Next 151 0 R -/First 147 0 R -/Last 147 0 R -/Count -1 ->> endobj -139 0 obj << -/Title 140 0 R -/A 137 0 R -/Parent 135 0 R -/First 143 0 R -/Last 151 0 R -/Count -2 ->> endobj -135 0 obj << -/Title 136 0 R -/A 133 0 R -/Parent 2182 0 R -/Prev 83 0 R -/Next 155 0 R -/First 139 0 R -/Last 139 0 R -/Count -1 ->> endobj -131 0 obj << -/Title 132 0 R -/A 129 0 R -/Parent 87 0 R -/Prev 127 0 R ->> endobj -127 0 obj << -/Title 128 0 R -/A 125 0 R -/Parent 87 0 R -/Prev 111 0 R -/Next 131 0 R ->> endobj -123 0 obj << -/Title 124 0 R -/A 121 0 R -/Parent 111 0 R -/Prev 119 0 R ->> endobj -119 0 obj << -/Title 120 0 R -/A 117 0 R -/Parent 111 0 R -/Prev 115 0 R -/Next 123 0 R ->> endobj -115 0 obj << -/Title 116 0 R -/A 113 0 R -/Parent 111 0 R -/Next 119 0 R ->> endobj -111 0 obj << -/Title 112 0 R -/A 109 0 R -/Parent 87 0 R -/Prev 91 0 R -/Next 127 0 R -/First 115 0 R -/Last 123 0 R -/Count -3 ->> endobj -107 0 obj << -/Title 108 0 R -/A 105 0 R -/Parent 91 0 R -/Prev 103 0 R ->> endobj -103 0 obj << -/Title 104 0 R -/A 101 0 R -/Parent 91 0 R -/Prev 99 0 R -/Next 107 0 R ->> endobj -99 0 obj << -/Title 100 0 R -/A 97 0 R -/Parent 91 0 R -/Prev 95 0 R -/Next 103 0 R ->> endobj -95 0 obj << -/Title 96 0 R -/A 93 0 R -/Parent 91 0 R -/Next 99 0 R ->> endobj -91 0 obj << -/Title 92 0 R -/A 89 0 R -/Parent 87 0 R -/Next 111 0 R -/First 95 0 R -/Last 107 0 R -/Count -4 ->> endobj -87 0 obj << -/Title 88 0 R -/A 85 0 R -/Parent 83 0 R -/First 91 0 R -/Last 131 0 R -/Count -4 ->> endobj -83 0 obj << -/Title 84 0 R -/A 81 0 R -/Parent 2182 0 R -/Prev 59 0 R -/Next 135 0 R -/First 87 0 R -/Last 87 0 R -/Count -1 ->> endobj -79 0 obj << -/Title 80 0 R -/A 77 0 R -/Parent 71 0 R -/Prev 75 0 R ->> endobj -75 0 obj << -/Title 76 0 R -/A 73 0 R -/Parent 71 0 R -/Next 79 0 R ->> endobj -71 0 obj << -/Title 72 0 R -/A 69 0 R -/Parent 63 0 R -/Prev 67 0 R -/First 75 0 R -/Last 79 0 R -/Count -2 ->> endobj -67 0 obj << -/Title 68 0 R -/A 65 0 R -/Parent 63 0 R -/Next 71 0 R ->> endobj -63 0 obj << -/Title 64 0 R -/A 61 0 R -/Parent 59 0 R -/First 67 0 R -/Last 71 0 R -/Count -2 ->> endobj -59 0 obj << -/Title 60 0 R -/A 57 0 R -/Parent 2182 0 R -/Prev 15 0 R -/Next 83 0 R -/First 63 0 R -/Last 63 0 R -/Count -1 ->> endobj -55 0 obj << -/Title 56 0 R -/A 53 0 R -/Parent 51 0 R ->> endobj -51 0 obj << -/Title 52 0 R -/A 49 0 R -/Parent 47 0 R -/First 55 0 R -/Last 55 0 R -/Count -1 ->> endobj -47 0 obj << -/Title 48 0 R -/A 45 0 R -/Parent 15 0 R -/Prev 23 0 R -/First 51 0 R -/Last 51 0 R -/Count -1 ->> endobj -43 0 obj << -/Title 44 0 R -/A 41 0 R -/Parent 35 0 R -/Prev 39 0 R ->> endobj -39 0 obj << -/Title 40 0 R -/A 37 0 R -/Parent 35 0 R -/Next 43 0 R ->> endobj -35 0 obj << -/Title 36 0 R -/A 33 0 R -/Parent 27 0 R -/Prev 31 0 R -/First 39 0 R -/Last 43 0 R -/Count -2 ->> endobj -31 0 obj << -/Title 32 0 R -/A 29 0 R -/Parent 27 0 R -/Next 35 0 R ->> endobj -27 0 obj << -/Title 28 0 R -/A 25 0 R -/Parent 23 0 R -/First 31 0 R -/Last 35 0 R -/Count -2 ->> endobj -23 0 obj << -/Title 24 0 R -/A 21 0 R -/Parent 15 0 R -/Prev 19 0 R -/Next 47 0 R -/First 27 0 R -/Last 27 0 R -/Count -1 ->> endobj -19 0 obj << -/Title 20 0 R -/A 17 0 R -/Parent 15 0 R -/Next 23 0 R ->> endobj -15 0 obj << -/Title 16 0 R -/A 13 0 R -/Parent 2182 0 R -/Prev 7 0 R -/Next 59 0 R -/First 19 0 R -/Last 47 0 R -/Count -3 ->> endobj -11 0 obj << -/Title 12 0 R -/A 9 0 R -/Parent 7 0 R ->> endobj -7 0 obj << -/Title 8 0 R -/A 5 0 R -/Parent 2182 0 R -/Next 15 0 R -/First 11 0 R -/Last 11 0 R -/Count -1 ->> endobj -2183 0 obj << -/Names [(Doc-Start) 603 0 R (Item.1) 1682 0 R (Item.10) 1840 0 R (Item.11) 1841 0 R (Item.12) 1851 0 R (Item.13) 1852 0 R] -/Limits [(Doc-Start) (Item.13)] ->> endobj -2184 0 obj << -/Names [(Item.14) 1853 0 R (Item.15) 1854 0 R (Item.16) 1855 0 R (Item.17) 1882 0 R (Item.18) 1883 0 R (Item.19) 1884 0 R] -/Limits [(Item.14) (Item.19)] ->> endobj -2185 0 obj << -/Names [(Item.2) 1690 0 R (Item.20) 1885 0 R (Item.21) 1909 0 R (Item.22) 1910 0 R (Item.23) 1911 0 R (Item.24) 1912 0 R] -/Limits [(Item.2) (Item.24)] ->> endobj -2186 0 obj << -/Names [(Item.25) 1939 0 R (Item.26) 1940 0 R (Item.27) 1941 0 R (Item.28) 1942 0 R (Item.29) 1943 0 R (Item.3) 1691 0 R] -/Limits [(Item.25) (Item.3)] ->> endobj -2187 0 obj << -/Names [(Item.30) 1944 0 R (Item.31) 1972 0 R (Item.32) 1973 0 R (Item.33) 1974 0 R (Item.34) 2015 0 R (Item.4) 1696 0 R] -/Limits [(Item.30) (Item.4)] ->> endobj -2188 0 obj << -/Names [(Item.5) 1697 0 R (Item.6) 1737 0 R (Item.7) 1738 0 R (Item.8) 1838 0 R (Item.9) 1839 0 R (chapter*.1) 1273 0 R] -/Limits [(Item.5) (chapter*.1)] ->> endobj -2189 0 obj << -/Names [(chapter*.126) 2103 0 R (chapter.1) 6 0 R (chapter.2) 14 0 R (chapter.3) 58 0 R (chapter.4) 82 0 R (chapter.5) 134 0 R] -/Limits [(chapter*.126) (chapter.5)] ->> endobj -2190 0 obj << -/Names [(chapter.6) 154 0 R (cite.RFC1831) 1645 0 R (cite.SEDA) 1616 0 R (cite.StripingLasco) 1607 0 R (cite.XtreemFS) 1516 0 R (cite.dabek2004vdn) 1664 0 R] -/Limits [(chapter.6) (cite.dabek2004vdn)] ->> endobj -2191 0 obj << -/Names [(cite.gfarm2) 1519 0 R (cite.kroeger1996pfs) 1699 0 R (cite.kroeger2001dai) 1700 0 R (cite.ledlie2007ncw) 1666 0 R (cite.mesnier03objectbased) 1518 0 R (cite.objStore) 1517 0 R] -/Limits [(cite.gfarm2) (cite.objStore)] ->> endobj -2192 0 obj << -/Names [(figure.3.1) 1624 0 R (figure.3.2) 1650 0 R (figure.4.1) 1665 0 R (figure.4.2) 1681 0 R (figure.6.1) 1843 0 R (figure.6.2) 1844 0 R] -/Limits [(figure.3.1) (figure.6.2)] ->> endobj -2193 0 obj << -/Names [(figure.6.3) 1875 0 R (figure.6.4) 1930 0 R (figure.6.5) 1966 0 R (figure.6.6) 1967 0 R (figure.6.7) 2009 0 R (page.1) 1515 0 R] -/Limits [(figure.6.3) (page.1)] ->> endobj -2194 0 obj << -/Names [(page.10) 1578 0 R (page.11) 1582 0 R (page.12) 1586 0 R (page.13) 1590 0 R (page.14) 1594 0 R (page.15) 1600 0 R] -/Limits [(page.10) (page.15)] ->> endobj -2195 0 obj << -/Names [(page.16) 1606 0 R (page.17) 1614 0 R (page.18) 1623 0 R (page.19) 1644 0 R (page.2) 1531 0 R (page.20) 1649 0 R] -/Limits [(page.16) (page.20)] ->> endobj -2196 0 obj << -/Names [(page.21) 1654 0 R (page.22) 1663 0 R (page.23) 1670 0 R (page.24) 1674 0 R (page.25) 1680 0 R (page.26) 1689 0 R] -/Limits [(page.21) (page.26)] ->> endobj -2197 0 obj << -/Names [(page.27) 1695 0 R (page.28) 1704 0 R (page.29) 1709 0 R (page.3) 1536 0 R (page.30) 1713 0 R (page.31) 1717 0 R] -/Limits [(page.27) (page.31)] ->> endobj -2198 0 obj << -/Names [(page.32) 1721 0 R (page.33) 1725 0 R (page.34) 1731 0 R (page.35) 1736 0 R (page.36) 1742 0 R (page.37) 1746 0 R] -/Limits [(page.32) (page.37)] ->> endobj -2199 0 obj << -/Names [(page.38) 1751 0 R (page.39) 1756 0 R (page.4) 1542 0 R (page.40) 1761 0 R (page.41) 1768 0 R (page.42) 1772 0 R] -/Limits [(page.38) (page.42)] ->> endobj -2200 0 obj << -/Names [(page.43) 1776 0 R (page.44) 1780 0 R (page.45) 1784 0 R (page.46) 1789 0 R (page.47) 1793 0 R (page.48) 1797 0 R] -/Limits [(page.43) (page.48)] ->> endobj -2201 0 obj << -/Names [(page.49) 1801 0 R (page.5) 1551 0 R (page.50) 1805 0 R (page.51) 1809 0 R (page.52) 1814 0 R (page.53) 1818 0 R] -/Limits [(page.49) (page.53)] ->> endobj -2202 0 obj << -/Names [(page.54) 1822 0 R (page.55) 1826 0 R (page.56) 1830 0 R (page.57) 1837 0 R (page.58) 1850 0 R (page.59) 1881 0 R] -/Limits [(page.54) (page.59)] ->> endobj -2203 0 obj << -/Names [(page.6) 1556 0 R (page.60) 1908 0 R (page.61) 1938 0 R (page.62) 1971 0 R (page.63) 2014 0 R (page.64) 2098 0 R] -/Limits [(page.6) (page.64)] ->> endobj -2204 0 obj << -/Names [(page.65) 2102 0 R (page.66) 2107 0 R (page.7) 1564 0 R (page.8) 1568 0 R (page.9) 1573 0 R (page.i) 602 0 R] -/Limits [(page.65) (page.i)] ->> endobj -2205 0 obj << -/Names [(page.ii) 615 0 R (page.iii) 1271 0 R (page.iv) 1306 0 R (page.ix) 1473 0 R (page.v) 1336 0 R (page.vi) 1371 0 R] -/Limits [(page.ii) (page.vi)] ->> endobj -2206 0 obj << -/Names [(page.vii) 1402 0 R (page.viii) 1439 0 R (page.x) 1507 0 R (section*.10) 74 0 R (section*.100) 486 0 R (section*.101) 494 0 R] -/Limits [(page.vii) (section*.101)] ->> endobj -2207 0 obj << -/Names [(section*.102) 498 0 R (section*.103) 502 0 R (section*.104) 506 0 R (section*.105) 510 0 R (section*.106) 514 0 R (section*.107) 518 0 R] -/Limits [(section*.102) (section*.107)] ->> endobj -2208 0 obj << -/Names [(section*.108) 522 0 R (section*.109) 526 0 R (section*.11) 78 0 R (section*.110) 530 0 R (section*.111) 534 0 R (section*.112) 538 0 R] -/Limits [(section*.108) (section*.112)] ->> endobj -2209 0 obj << -/Names [(section*.113) 542 0 R (section*.114) 546 0 R (section*.115) 550 0 R (section*.116) 554 0 R (section*.117) 558 0 R (section*.118) 562 0 R] -/Limits [(section*.113) (section*.118)] ->> endobj -2210 0 obj << -/Names [(section*.119) 570 0 R (section*.12) 90 0 R (section*.120) 574 0 R (section*.121) 578 0 R (section*.122) 582 0 R (section*.123) 586 0 R] -/Limits [(section*.119) (section*.123)] ->> endobj -2211 0 obj << -/Names [(section*.124) 590 0 R (section*.125) 594 0 R (section*.13) 94 0 R (section*.14) 98 0 R (section*.15) 102 0 R (section*.16) 106 0 R] -/Limits [(section*.124) (section*.16)] ->> endobj -2212 0 obj << -/Names [(section*.17) 114 0 R (section*.18) 118 0 R (section*.19) 122 0 R (section*.2) 26 0 R (section*.20) 142 0 R (section*.21) 146 0 R] -/Limits [(section*.17) (section*.21)] ->> endobj -2213 0 obj << -/Names [(section*.22) 166 0 R (section*.23) 170 0 R (section*.24) 174 0 R (section*.25) 178 0 R (section*.26) 182 0 R (section*.27) 186 0 R] -/Limits [(section*.22) (section*.27)] ->> endobj -2214 0 obj << -/Names [(section*.28) 190 0 R (section*.29) 194 0 R (section*.3) 30 0 R (section*.30) 198 0 R (section*.31) 202 0 R (section*.32) 206 0 R] -/Limits [(section*.28) (section*.32)] ->> endobj -2215 0 obj << -/Names [(section*.33) 210 0 R (section*.34) 214 0 R (section*.35) 218 0 R (section*.36) 222 0 R (section*.37) 226 0 R (section*.38) 230 0 R] -/Limits [(section*.33) (section*.38)] ->> endobj -2216 0 obj << -/Names [(section*.39) 234 0 R (section*.4) 34 0 R (section*.40) 238 0 R (section*.41) 246 0 R (section*.42) 250 0 R (section*.43) 254 0 R] -/Limits [(section*.39) (section*.43)] ->> endobj -2217 0 obj << -/Names [(section*.44) 258 0 R (section*.45) 262 0 R (section*.46) 266 0 R (section*.47) 270 0 R (section*.48) 274 0 R (section*.49) 278 0 R] -/Limits [(section*.44) (section*.49)] ->> endobj -2218 0 obj << -/Names [(section*.5) 38 0 R (section*.50) 282 0 R (section*.51) 286 0 R (section*.52) 290 0 R (section*.53) 294 0 R (section*.54) 298 0 R] -/Limits [(section*.5) (section*.54)] ->> endobj -2219 0 obj << -/Names [(section*.55) 302 0 R (section*.56) 310 0 R (section*.57) 314 0 R (section*.58) 318 0 R (section*.59) 322 0 R (section*.6) 42 0 R] -/Limits [(section*.55) (section*.6)] ->> endobj -2220 0 obj << -/Names [(section*.60) 326 0 R (section*.61) 330 0 R (section*.62) 334 0 R (section*.63) 338 0 R (section*.64) 342 0 R (section*.65) 346 0 R] -/Limits [(section*.60) (section*.65)] ->> endobj -2221 0 obj << -/Names [(section*.66) 350 0 R (section*.67) 354 0 R (section*.68) 358 0 R (section*.69) 362 0 R (section*.7) 50 0 R (section*.70) 366 0 R] -/Limits [(section*.66) (section*.70)] ->> endobj -2222 0 obj << -/Names [(section*.71) 370 0 R (section*.72) 374 0 R (section*.73) 378 0 R (section*.74) 382 0 R (section*.75) 386 0 R (section*.76) 390 0 R] -/Limits [(section*.71) (section*.76)] ->> endobj -2223 0 obj << -/Names [(section*.77) 394 0 R (section*.78) 398 0 R (section*.79) 402 0 R (section*.8) 54 0 R (section*.80) 406 0 R (section*.81) 410 0 R] -/Limits [(section*.77) (section*.81)] ->> endobj -2224 0 obj << -/Names [(section*.82) 414 0 R (section*.83) 418 0 R (section*.84) 422 0 R (section*.85) 426 0 R (section*.86) 430 0 R (section*.87) 434 0 R] -/Limits [(section*.82) (section*.87)] ->> endobj -2225 0 obj << -/Names [(section*.88) 438 0 R (section*.89) 442 0 R (section*.9) 66 0 R (section*.90) 446 0 R (section*.91) 450 0 R (section*.92) 454 0 R] -/Limits [(section*.88) (section*.92)] ->> endobj -2226 0 obj << -/Names [(section*.93) 458 0 R (section*.94) 462 0 R (section*.95) 466 0 R (section*.96) 470 0 R (section*.97) 474 0 R (section*.98) 478 0 R] -/Limits [(section*.93) (section*.98)] ->> endobj -2227 0 obj << -/Names [(section*.99) 482 0 R (section.2.1) 18 0 R (section.2.2) 22 0 R (section.2.3) 46 0 R (subsection.1.0.1) 10 0 R (subsection.3.0.1) 62 0 R] -/Limits [(section*.99) (subsection.3.0.1)] ->> endobj -2228 0 obj << -/Names [(subsection.3.0.2) 70 0 R (subsection.4.0.3) 86 0 R (subsection.4.0.4) 110 0 R (subsection.4.0.5) 126 0 R (subsection.4.0.6) 130 0 R (subsection.5.0.7) 138 0 R] -/Limits [(subsection.3.0.2) (subsection.5.0.7)] ->> endobj -2229 0 obj << -/Names [(subsection.5.0.8) 150 0 R (subsection.6.0.10) 162 0 R (subsection.6.0.11) 242 0 R (subsection.6.0.12) 306 0 R (subsection.6.0.13) 490 0 R (subsection.6.0.14) 566 0 R] -/Limits [(subsection.5.0.8) (subsection.6.0.14)] ->> endobj -2230 0 obj << -/Names [(subsection.6.0.9) 158 0 R (table.3.1) 1615 0 R] -/Limits [(subsection.6.0.9) (table.3.1)] ->> endobj -2231 0 obj << -/Kids [2183 0 R 2184 0 R 2185 0 R 2186 0 R 2187 0 R 2188 0 R] -/Limits [(Doc-Start) (chapter*.1)] ->> endobj -2232 0 obj << -/Kids [2189 0 R 2190 0 R 2191 0 R 2192 0 R 2193 0 R 2194 0 R] -/Limits [(chapter*.126) (page.15)] ->> endobj -2233 0 obj << -/Kids [2195 0 R 2196 0 R 2197 0 R 2198 0 R 2199 0 R 2200 0 R] -/Limits [(page.16) (page.48)] ->> endobj -2234 0 obj << -/Kids [2201 0 R 2202 0 R 2203 0 R 2204 0 R 2205 0 R 2206 0 R] -/Limits [(page.49) (section*.101)] ->> endobj -2235 0 obj << -/Kids [2207 0 R 2208 0 R 2209 0 R 2210 0 R 2211 0 R 2212 0 R] -/Limits [(section*.102) (section*.21)] ->> endobj -2236 0 obj << -/Kids [2213 0 R 2214 0 R 2215 0 R 2216 0 R 2217 0 R 2218 0 R] -/Limits [(section*.22) (section*.54)] ->> endobj -2237 0 obj << -/Kids [2219 0 R 2220 0 R 2221 0 R 2222 0 R 2223 0 R 2224 0 R] -/Limits [(section*.55) (section*.87)] ->> endobj -2238 0 obj << -/Kids [2225 0 R 2226 0 R 2227 0 R 2228 0 R 2229 0 R 2230 0 R] -/Limits [(section*.88) (table.3.1)] ->> endobj -2239 0 obj << -/Kids [2231 0 R 2232 0 R 2233 0 R 2234 0 R 2235 0 R 2236 0 R] -/Limits [(Doc-Start) (section*.54)] ->> endobj -2240 0 obj << -/Kids [2237 0 R 2238 0 R] -/Limits [(section*.55) (table.3.1)] ->> endobj -2241 0 obj << -/Kids [2239 0 R 2240 0 R] -/Limits [(Doc-Start) (table.3.1)] ->> endobj -2242 0 obj << -/Dests 2241 0 R ->> endobj -2243 0 obj << -/Type /Catalog -/Pages 2181 0 R -/Outlines 2182 0 R -/Names 2242 0 R -/PageMode/UseOutlines/PageLabels << /Nums [0 << /S /r >> 10 << /S /D >> ] >> -/OpenAction 597 0 R ->> endobj -2244 0 obj << -/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.3)/Keywords() -/CreationDate (D:20090717103927+02'00') -/ModDate (D:20090717103927+02'00') -/Trapped /False -/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.141592-1.40.3-2.2 (Web2C 7.5.6) kpathsea version 3.5.6) ->> endobj -xref -0 2245 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000001762 00000 f -0000000015 00000 n -0000369466 00000 n -0001138798 00000 n -0000000060 00000 n -0000000090 00000 n -0000372181 00000 n -0001138739 00000 n -0000000142 00000 n -0000000179 00000 n -0000374324 00000 n -0001138614 00000 n -0000000225 00000 n -0000000260 00000 n -0000376893 00000 n -0001138540 00000 n -0000000308 00000 n -0000000350 00000 n -0000376955 00000 n -0001138416 00000 n -0000000398 00000 n -0000000451 00000 n -0000377017 00000 n -0001138318 00000 n -0000000498 00000 n -0000000529 00000 n -0000380051 00000 n -0001138244 00000 n -0000000576 00000 n -0000000611 00000 n -0000380112 00000 n -0001138133 00000 n -0000000658 00000 n -0000000693 00000 n -0000383664 00000 n -0001138059 00000 n -0000000740 00000 n -0000000789 00000 n -0000386251 00000 n -0001137985 00000 n -0000000836 00000 n -0000000889 00000 n -0000412205 00000 n -0001137874 00000 n -0000000937 00000 n -0000000983 00000 n -0000414669 00000 n -0001137776 00000 n -0000001030 00000 n -0000001057 00000 n -0000414731 00000 n -0001137715 00000 n -0000001104 00000 n -0000001144 00000 n -0000417306 00000 n -0001137589 00000 n -0000001190 00000 n -0000001215 00000 n -0000417430 00000 n -0001137491 00000 n -0000001268 00000 n -0000001299 00000 n -0000455402 00000 n -0001137417 00000 n -0000001346 00000 n -0000001369 00000 n -0000458826 00000 n -0001137306 00000 n -0000001422 00000 n -0000001455 00000 n -0000460927 00000 n -0001137232 00000 n -0000001503 00000 n -0000001542 00000 n -0000461053 00000 n -0001137158 00000 n -0000001590 00000 n -0000001622 00000 n -0000463060 00000 n -0001137031 00000 n -0000001668 00000 n -0000001719 00000 n -0000463120 00000 n -0001136932 00000 n -0000001772 00000 n -0000001816 00000 n -0000466264 00000 n -0001136819 00000 n -0000001864 00000 n -0000001900 00000 n -0000478220 00000 n -0001136745 00000 n -0000001948 00000 n -0000001986 00000 n -0000478280 00000 n -0001136656 00000 n -0000002034 00000 n -0000002073 00000 n -0000480919 00000 n -0001136565 00000 n -0000002122 00000 n -0000002160 00000 n -0000480982 00000 n -0001136487 00000 n -0000002209 00000 n -0000002259 00000 n -0000505704 00000 n -0001136357 00000 n -0000002313 00000 n -0000002349 00000 n -0000505767 00000 n -0001136278 00000 n -0000002398 00000 n -0000002456 00000 n -0000505830 00000 n -0001136185 00000 n -0000002505 00000 n -0000002564 00000 n -0000511506 00000 n -0001136106 00000 n -0000002613 00000 n -0000002665 00000 n -0000511569 00000 n -0001136014 00000 n -0000002719 00000 n -0000002755 00000 n -0000511632 00000 n -0001135936 00000 n -0000002809 00000 n -0000002882 00000 n -0000516214 00000 n -0001135804 00000 n -0000002929 00000 n -0000002956 00000 n -0000516275 00000 n -0001135700 00000 n -0000003010 00000 n -0000003066 00000 n -0000521021 00000 n -0001135582 00000 n -0000003115 00000 n -0000003159 00000 n -0000522971 00000 n -0001135517 00000 n -0000003208 00000 n -0000003235 00000 n -0000523034 00000 n -0001135438 00000 n -0000003289 00000 n -0000003325 00000 n -0000524954 00000 n -0001135319 00000 n -0000003372 00000 n -0000003417 00000 n -0000525141 00000 n -0001135215 00000 n -0000003471 00000 n -0000003500 00000 n -0000526936 00000 n -0001135097 00000 n -0000003555 00000 n -0000003580 00000 n -0000526999 00000 n -0001134979 00000 n -0000003629 00000 n -0000003670 00000 n -0000529365 00000 n -0001134900 00000 n -0000003719 00000 n -0000003761 00000 n -0000529427 00000 n -0001134821 00000 n -0000003810 00000 n -0000003855 00000 n -0000529489 00000 n -0001134689 00000 n -0000003904 00000 n -0000003956 00000 n -0000529551 00000 n -0001134610 00000 n -0000004005 00000 n -0000004043 00000 n -0000531500 00000 n -0001134517 00000 n -0000004092 00000 n -0000004131 00000 n -0000531563 00000 n -0001134424 00000 n -0000004180 00000 n -0000004223 00000 n -0000531626 00000 n -0001134331 00000 n -0000004272 00000 n -0000004313 00000 n -0000531689 00000 n -0001134238 00000 n -0000004362 00000 n -0000004396 00000 n -0000531752 00000 n -0001134145 00000 n -0000004445 00000 n -0000004479 00000 n -0000533758 00000 n -0001134052 00000 n -0000004528 00000 n -0000004559 00000 n -0000533820 00000 n -0001133959 00000 n -0000004608 00000 n -0000004650 00000 n -0000533882 00000 n -0001133880 00000 n -0000004699 00000 n -0000004763 00000 n -0000533944 00000 n -0001133762 00000 n -0000004812 00000 n -0000004842 00000 n -0000535459 00000 n -0001133683 00000 n -0000004891 00000 n -0000004938 00000 n -0000535522 00000 n -0001133590 00000 n -0000004987 00000 n -0000005031 00000 n -0000535585 00000 n -0001133497 00000 n -0000005080 00000 n -0000005127 00000 n -0000535648 00000 n -0001133404 00000 n -0000005176 00000 n -0000005237 00000 n -0000535711 00000 n -0001133325 00000 n -0000005286 00000 n -0000005340 00000 n -0000535774 00000 n -0001133193 00000 n -0000005395 00000 n -0000005442 00000 n -0000538085 00000 n -0001133088 00000 n -0000005491 00000 n -0000005532 00000 n -0000538147 00000 n -0001133009 00000 n -0000005581 00000 n -0000005643 00000 n -0000538209 00000 n -0001132916 00000 n -0000005692 00000 n -0000005726 00000 n -0000538271 00000 n -0001132823 00000 n -0000005775 00000 n -0000005898 00000 n -0000540172 00000 n -0001132730 00000 n -0000005947 00000 n -0000006030 00000 n -0000540235 00000 n -0001132637 00000 n -0000006079 00000 n -0000006192 00000 n -0000540298 00000 n -0001132544 00000 n -0000006241 00000 n -0000006292 00000 n -0000540361 00000 n -0001132451 00000 n -0000006341 00000 n -0000006415 00000 n -0000540424 00000 n -0001132358 00000 n -0000006464 00000 n -0000006576 00000 n -0000542100 00000 n -0001132265 00000 n -0000006625 00000 n -0000006732 00000 n -0000542162 00000 n -0001132172 00000 n -0000006781 00000 n -0000006888 00000 n -0000542224 00000 n -0001132079 00000 n -0000006937 00000 n -0000007021 00000 n -0000542286 00000 n -0001131986 00000 n -0000007070 00000 n -0000007145 00000 n -0000542348 00000 n -0001131893 00000 n -0000007194 00000 n -0000007266 00000 n -0000542410 00000 n -0001131814 00000 n -0000007315 00000 n -0000007364 00000 n -0000544163 00000 n -0001131682 00000 n -0000007419 00000 n -0000007477 00000 n -0000544225 00000 n -0001131577 00000 n -0000007526 00000 n -0000007557 00000 n -0000544288 00000 n -0001131498 00000 n -0000007606 00000 n -0000007647 00000 n -0000544351 00000 n -0001131405 00000 n -0000007696 00000 n -0000007730 00000 n -0000545933 00000 n -0001131312 00000 n -0000007779 00000 n -0000007812 00000 n -0000545995 00000 n -0001131219 00000 n -0000007861 00000 n -0000007912 00000 n -0000546057 00000 n -0001131126 00000 n -0000007961 00000 n -0000008013 00000 n -0000546119 00000 n -0001131033 00000 n -0000008062 00000 n -0000008111 00000 n -0000546181 00000 n -0001130940 00000 n -0000008160 00000 n -0000008202 00000 n -0000546243 00000 n -0001130847 00000 n -0000008251 00000 n -0000008320 00000 n -0000547736 00000 n -0001130754 00000 n -0000008369 00000 n -0000008434 00000 n -0000547799 00000 n -0001130661 00000 n -0000008483 00000 n -0000008569 00000 n -0000547862 00000 n -0001130568 00000 n -0000008618 00000 n -0000008705 00000 n -0000547925 00000 n -0001130475 00000 n -0000008754 00000 n -0000008839 00000 n -0000547988 00000 n -0001130382 00000 n -0000008888 00000 n -0000008953 00000 n -0000548051 00000 n -0001130289 00000 n -0000009002 00000 n -0000009083 00000 n -0000549741 00000 n -0001130196 00000 n -0000009132 00000 n -0000009209 00000 n -0000549803 00000 n -0001130103 00000 n -0000009258 00000 n -0000009330 00000 n -0000549864 00000 n -0001130010 00000 n -0000009379 00000 n -0000009439 00000 n -0000549926 00000 n -0001129917 00000 n -0000009488 00000 n -0000009607 00000 n -0000549988 00000 n -0001129824 00000 n -0000009656 00000 n -0000009744 00000 n -0000551572 00000 n -0001129731 00000 n -0000009793 00000 n -0000009859 00000 n -0000551635 00000 n -0001129638 00000 n -0000009908 00000 n -0000010033 00000 n -0000551698 00000 n -0001129545 00000 n -0000010082 00000 n -0000010124 00000 n -0000551761 00000 n -0001129452 00000 n -0000010173 00000 n -0000010234 00000 n -0000551824 00000 n -0001129359 00000 n -0000010283 00000 n -0000010371 00000 n -0000551887 00000 n -0001129266 00000 n -0000010420 00000 n -0000010498 00000 n -0000553341 00000 n -0001129173 00000 n -0000010547 00000 n -0000010627 00000 n -0000553403 00000 n -0001129080 00000 n -0000010676 00000 n -0000010768 00000 n -0000553465 00000 n -0001128987 00000 n -0000010817 00000 n -0000010941 00000 n -0000553527 00000 n -0001128894 00000 n -0000010990 00000 n -0000011114 00000 n -0000555326 00000 n -0001128801 00000 n -0000011163 00000 n -0000011209 00000 n -0000555389 00000 n -0001128708 00000 n -0000011258 00000 n -0000011385 00000 n -0000555452 00000 n -0001128615 00000 n -0000011434 00000 n -0000011512 00000 n -0000555515 00000 n -0001128522 00000 n -0000011561 00000 n -0000011672 00000 n -0000555578 00000 n -0001128429 00000 n -0000011721 00000 n -0000011790 00000 n -0000555641 00000 n -0001128336 00000 n -0000011839 00000 n -0000011900 00000 n -0000557406 00000 n -0001128243 00000 n -0000011949 00000 n -0000012056 00000 n -0000557468 00000 n -0001128150 00000 n -0000012105 00000 n -0000012203 00000 n -0000557530 00000 n -0001128057 00000 n -0000012252 00000 n -0000012352 00000 n -0000557592 00000 n -0001127964 00000 n -0000012401 00000 n -0000012518 00000 n -0000557654 00000 n -0001127871 00000 n -0000012567 00000 n -0000012643 00000 n -0000557716 00000 n -0001127778 00000 n -0000012692 00000 n -0000012856 00000 n -0000559513 00000 n -0001127685 00000 n -0000012905 00000 n -0000012974 00000 n -0000559576 00000 n -0001127592 00000 n -0000013023 00000 n -0000013073 00000 n -0000559639 00000 n -0001127513 00000 n -0000013123 00000 n -0000013240 00000 n -0000559702 00000 n -0001127381 00000 n -0000013295 00000 n -0000013346 00000 n -0000559765 00000 n -0001127276 00000 n -0000013396 00000 n -0000013435 00000 n -0000559828 00000 n -0001127197 00000 n -0000013485 00000 n -0000013522 00000 n -0000561841 00000 n -0001127104 00000 n -0000013572 00000 n -0000013614 00000 n -0000561903 00000 n -0001127011 00000 n -0000013664 00000 n -0000013885 00000 n -0000561965 00000 n -0001126918 00000 n -0000013935 00000 n -0000014108 00000 n -0000562027 00000 n -0001126825 00000 n -0000014158 00000 n -0000014249 00000 n -0000564047 00000 n -0001126732 00000 n -0000014299 00000 n -0000014574 00000 n -0000564110 00000 n -0001126639 00000 n -0000014624 00000 n -0000014803 00000 n -0000564173 00000 n -0001126546 00000 n -0000014853 00000 n -0000014981 00000 n -0000566000 00000 n -0001126453 00000 n -0000015031 00000 n -0000015166 00000 n -0000566062 00000 n -0001126360 00000 n -0000015216 00000 n -0000015412 00000 n -0000566124 00000 n -0001126267 00000 n -0000015462 00000 n -0000015706 00000 n -0000567912 00000 n -0001126174 00000 n -0000015756 00000 n -0000015905 00000 n -0000567975 00000 n -0001126081 00000 n -0000015955 00000 n -0000016011 00000 n -0000568038 00000 n -0001125988 00000 n -0000016061 00000 n -0000016138 00000 n -0000568101 00000 n -0001125895 00000 n -0000016188 00000 n -0000016280 00000 n -0000570370 00000 n -0001125802 00000 n -0000016330 00000 n -0000016419 00000 n -0000570432 00000 n -0001125723 00000 n -0000016469 00000 n -0000016529 00000 n -0000570494 00000 n -0001125605 00000 n -0000016584 00000 n -0000016616 00000 n -0000570556 00000 n -0001125501 00000 n -0000016666 00000 n -0000016692 00000 n -0000570807 00000 n -0001125422 00000 n -0000016742 00000 n -0000016766 00000 n -0000591149 00000 n -0001125329 00000 n -0000016816 00000 n -0000016841 00000 n -0000638260 00000 n -0001125236 00000 n -0000016891 00000 n -0000016916 00000 n -0000661242 00000 n -0001125143 00000 n -0000016966 00000 n -0000016991 00000 n -0000661493 00000 n -0001125050 00000 n -0000017041 00000 n -0000017066 00000 n -0000693551 00000 n -0001124971 00000 n -0000017116 00000 n -0000017149 00000 n -0000017470 00000 n -0000017589 00000 n -0000050044 00000 n -0000017201 00000 n -0000049922 00000 n -0000049983 00000 n -0001121864 00000 n -0001121697 00000 n -0001122878 00000 n -0000049722 00000 n -0000049899 00000 n -0000051051 00000 n -0000319163 00000 n -0000319332 00000 n -0000319561 00000 n -0000050904 00000 n -0000050157 00000 n -0000319499 00000 n -0001121363 00000 n -0001119540 00000 n -0000172249 00000 n -0000172437 00000 n -0000174626 00000 n -0000174774 00000 n -0000174922 00000 n -0000175070 00000 n -0000175218 00000 n -0000175366 00000 n -0000175514 00000 n -0000175662 00000 n -0000175810 00000 n -0000175958 00000 n -0000176106 00000 n -0000176254 00000 n -0000176402 00000 n -0000176550 00000 n -0000176698 00000 n -0000176846 00000 n -0000176994 00000 n -0000177142 00000 n -0000177290 00000 n -0000177438 00000 n -0000177586 00000 n -0000177734 00000 n -0000177882 00000 n -0000178030 00000 n -0000178178 00000 n -0000178326 00000 n -0000178474 00000 n -0000178622 00000 n -0000178770 00000 n -0000178918 00000 n -0000179066 00000 n -0000179214 00000 n -0000179362 00000 n -0000179510 00000 n -0000179658 00000 n -0000179806 00000 n -0000179954 00000 n -0000180102 00000 n -0000180250 00000 n -0000180398 00000 n -0000180546 00000 n -0000180694 00000 n -0000180842 00000 n -0000180990 00000 n -0000181138 00000 n -0000181286 00000 n -0000181434 00000 n -0000181582 00000 n -0000181730 00000 n -0000181878 00000 n -0000182026 00000 n -0000182174 00000 n -0000182322 00000 n -0000182470 00000 n -0000182618 00000 n -0000182766 00000 n -0000182914 00000 n -0000183062 00000 n -0000183210 00000 n -0000183358 00000 n -0000183506 00000 n -0000183654 00000 n -0000183802 00000 n -0000183950 00000 n -0000184098 00000 n -0000184246 00000 n -0000184394 00000 n -0000184542 00000 n -0000184690 00000 n -0000184838 00000 n -0000184986 00000 n -0000185134 00000 n -0000185282 00000 n -0000185430 00000 n -0000185578 00000 n -0000185726 00000 n -0000185874 00000 n -0000186022 00000 n -0000186170 00000 n -0000186318 00000 n -0000186466 00000 n -0000186614 00000 n -0000186762 00000 n -0000186910 00000 n -0000187058 00000 n -0000187206 00000 n -0000187354 00000 n -0000187502 00000 n -0000187650 00000 n -0000187798 00000 n -0000187946 00000 n -0000188094 00000 n -0000188242 00000 n -0000188390 00000 n -0000188538 00000 n -0000188686 00000 n -0000188834 00000 n -0000188982 00000 n -0000189130 00000 n -0000189278 00000 n -0000189426 00000 n -0000189574 00000 n -0000189722 00000 n -0000189870 00000 n -0000190018 00000 n -0000190166 00000 n -0000190314 00000 n -0000190462 00000 n -0000190610 00000 n -0000190758 00000 n -0000190906 00000 n -0000191054 00000 n -0000191202 00000 n -0000191350 00000 n -0000191498 00000 n -0000191646 00000 n -0000191794 00000 n -0000191942 00000 n -0000192090 00000 n -0000192238 00000 n -0000192386 00000 n -0000192534 00000 n -0000192682 00000 n -0000192830 00000 n -0000192978 00000 n -0000193126 00000 n -0000193274 00000 n -0000193422 00000 n -0000193570 00000 n -0000193718 00000 n -0000193866 00000 n -0000194014 00000 n -0000194162 00000 n -0000194310 00000 n -0000194458 00000 n -0000194612 00000 n -0000194760 00000 n -0000194908 00000 n -0000195056 00000 n -0000195204 00000 n -0000195352 00000 n -0000195500 00000 n -0000195648 00000 n -0000195796 00000 n -0000195944 00000 n -0000196092 00000 n -0000196240 00000 n -0000196388 00000 n -0000196536 00000 n -0000196684 00000 n -0000196832 00000 n -0000196980 00000 n -0000197128 00000 n -0000197276 00000 n -0000197424 00000 n -0000197572 00000 n -0000197720 00000 n -0000197868 00000 n -0000198016 00000 n -0000198164 00000 n -0000198312 00000 n -0000198460 00000 n -0000198608 00000 n -0000198756 00000 n -0000198904 00000 n -0000199052 00000 n -0000199200 00000 n -0000199348 00000 n -0000199496 00000 n -0000199644 00000 n -0000199793 00000 n -0000199942 00000 n -0000200091 00000 n -0000200240 00000 n -0000200389 00000 n -0000200538 00000 n -0000200687 00000 n -0000200836 00000 n -0000200985 00000 n -0000201134 00000 n -0000201283 00000 n -0000201432 00000 n -0000201587 00000 n -0000201736 00000 n -0000201885 00000 n -0000202034 00000 n -0000202183 00000 n -0000202332 00000 n -0000202481 00000 n -0000202630 00000 n -0000202779 00000 n -0000202928 00000 n -0000203077 00000 n -0000203226 00000 n -0000203375 00000 n -0000203524 00000 n -0000203673 00000 n -0000203822 00000 n -0000203971 00000 n -0000204120 00000 n -0000204269 00000 n -0000204418 00000 n -0000204567 00000 n -0000204716 00000 n -0000204865 00000 n -0000205014 00000 n -0000205163 00000 n -0000205312 00000 n -0000205350 00000 n -0000222223 00000 n -0000222347 00000 n -0000222469 00000 n -0000222572 00000 n -0000222675 00000 n -0000222778 00000 n -0000222881 00000 n -0000222984 00000 n -0000223087 00000 n -0000223190 00000 n -0000223293 00000 n -0000223396 00000 n -0000223499 00000 n -0000223602 00000 n -0000223705 00000 n -0000223808 00000 n -0000223911 00000 n -0000224014 00000 n -0000224117 00000 n -0000224220 00000 n -0000224323 00000 n -0000224426 00000 n -0000224529 00000 n -0000224632 00000 n -0000224735 00000 n -0000224838 00000 n -0000224941 00000 n -0000225044 00000 n -0000225147 00000 n -0000225250 00000 n -0000225353 00000 n -0000225456 00000 n -0000225559 00000 n -0000225662 00000 n -0000225765 00000 n -0000225868 00000 n -0000225971 00000 n -0000226074 00000 n -0000226177 00000 n -0000226280 00000 n -0000226383 00000 n -0000226486 00000 n -0000226589 00000 n -0000226692 00000 n -0000226795 00000 n -0000226898 00000 n -0000227001 00000 n -0000227104 00000 n -0000227207 00000 n -0000227310 00000 n -0000227413 00000 n -0000227516 00000 n -0000227619 00000 n -0000227722 00000 n -0000227825 00000 n -0000227928 00000 n -0000228031 00000 n -0000228134 00000 n -0000228237 00000 n -0000228340 00000 n -0000228443 00000 n -0000228546 00000 n -0000228649 00000 n -0000228752 00000 n -0000228855 00000 n -0000228958 00000 n -0000229061 00000 n -0000229164 00000 n -0000229267 00000 n -0000229370 00000 n -0000229473 00000 n -0000229576 00000 n -0000229679 00000 n -0000229782 00000 n -0000229885 00000 n -0000229988 00000 n -0000230091 00000 n -0000230194 00000 n -0000230297 00000 n -0000230400 00000 n -0000230503 00000 n -0000230606 00000 n -0000230709 00000 n -0000230812 00000 n -0000230915 00000 n -0000231018 00000 n -0000231121 00000 n -0000231224 00000 n -0000231327 00000 n -0000231430 00000 n -0000231533 00000 n -0000231636 00000 n -0000231739 00000 n -0000231842 00000 n -0000231945 00000 n -0000232048 00000 n -0000232151 00000 n -0000232254 00000 n -0000232357 00000 n -0000232460 00000 n -0000232563 00000 n -0000232666 00000 n -0000232769 00000 n -0000232872 00000 n -0000232975 00000 n -0000233078 00000 n -0000233181 00000 n -0000233284 00000 n -0000233387 00000 n -0000233490 00000 n -0000233593 00000 n -0000233696 00000 n -0000233799 00000 n -0000233902 00000 n -0000234005 00000 n -0000234108 00000 n -0000234211 00000 n -0000234314 00000 n -0000234417 00000 n -0000234520 00000 n -0000234623 00000 n -0000234726 00000 n -0000234829 00000 n -0000234932 00000 n -0000235035 00000 n -0000235138 00000 n -0000235241 00000 n -0000235344 00000 n -0000235447 00000 n -0000235550 00000 n -0000235653 00000 n -0000235756 00000 n -0000235859 00000 n -0000235962 00000 n -0000236065 00000 n -0000236168 00000 n -0000236271 00000 n -0000236374 00000 n -0000236477 00000 n -0000236580 00000 n -0000236683 00000 n -0000236786 00000 n -0000236889 00000 n -0000236992 00000 n -0000237095 00000 n -0000237198 00000 n -0000237301 00000 n -0000237404 00000 n -0000237507 00000 n -0000237610 00000 n -0000237713 00000 n -0000237816 00000 n -0000237919 00000 n -0000238022 00000 n -0000238125 00000 n -0000238228 00000 n -0000238331 00000 n -0000238434 00000 n -0000238537 00000 n -0000238640 00000 n -0000238743 00000 n -0000238846 00000 n -0000238949 00000 n -0000239052 00000 n -0000239155 00000 n -0000239258 00000 n -0000239361 00000 n -0000239464 00000 n -0000239567 00000 n -0000239670 00000 n -0000239773 00000 n -0000239876 00000 n -0000239980 00000 n -0000240084 00000 n -0000240188 00000 n -0000240292 00000 n -0000240396 00000 n -0000240500 00000 n -0000240604 00000 n -0000240708 00000 n -0000240812 00000 n -0000240916 00000 n -0000241020 00000 n -0000241124 00000 n -0000241228 00000 n -0000241332 00000 n -0000241436 00000 n -0000241540 00000 n -0000241644 00000 n -0000241748 00000 n -0000241852 00000 n -0000241956 00000 n -0000242060 00000 n -0000242164 00000 n -0000242268 00000 n -0000242372 00000 n -0000242476 00000 n -0000242580 00000 n -0000242684 00000 n -0000242788 00000 n -0000242892 00000 n -0000242996 00000 n -0000243100 00000 n -0000243204 00000 n -0000243308 00000 n -0000243412 00000 n -0000243516 00000 n -0000243620 00000 n -0000243724 00000 n -0000243828 00000 n -0000246483 00000 n -0000246869 00000 n -0000247255 00000 n -0000247641 00000 n -0000248027 00000 n -0000248288 00000 n -0000248541 00000 n -0000248784 00000 n -0000249021 00000 n -0000249250 00000 n -0000249661 00000 n -0000250072 00000 n -0000250481 00000 n -0000250886 00000 n -0000251291 00000 n -0000251674 00000 n -0000252055 00000 n -0000252437 00000 n -0000252819 00000 n -0000253200 00000 n -0000253575 00000 n -0000253949 00000 n -0000254324 00000 n -0000254691 00000 n -0000255057 00000 n -0000255461 00000 n -0000255862 00000 n -0000256265 00000 n -0000256664 00000 n -0000257064 00000 n -0000257458 00000 n -0000257847 00000 n -0000258238 00000 n -0000258624 00000 n -0000259004 00000 n -0000259366 00000 n -0000259722 00000 n -0000260067 00000 n -0000260413 00000 n -0000260754 00000 n -0000261094 00000 n -0000261428 00000 n -0000261757 00000 n -0000262085 00000 n -0000262401 00000 n -0000262783 00000 n -0000263154 00000 n -0000263528 00000 n -0000263896 00000 n -0000264269 00000 n -0000264636 00000 n -0000264989 00000 n -0000265342 00000 n -0000265697 00000 n -0000266040 00000 n -0000266353 00000 n -0000266659 00000 n -0000266959 00000 n -0000267251 00000 n -0000267536 00000 n -0000267814 00000 n -0000268092 00000 n -0000268364 00000 n -0000268627 00000 n -0000268885 00000 n -0000269152 00000 n -0000269413 00000 n -0000269663 00000 n -0000269910 00000 n -0000270146 00000 n -0000270376 00000 n -0000270787 00000 n -0000271128 00000 n -0000271472 00000 n -0000271812 00000 n -0000272153 00000 n -0000272491 00000 n -0000272823 00000 n -0000273146 00000 n -0000273467 00000 n -0000273790 00000 n -0000274112 00000 n -0000274359 00000 n -0000274596 00000 n -0000274826 00000 n -0000275237 00000 n -0000275648 00000 n -0000276059 00000 n -0000276470 00000 n -0000276881 00000 n -0000277292 00000 n -0000277703 00000 n -0000278019 00000 n -0000278328 00000 n -0000278637 00000 n -0000278938 00000 n -0000279228 00000 n -0000279518 00000 n -0000279800 00000 n -0000280078 00000 n -0000280355 00000 n -0000280625 00000 n -0000281036 00000 n -0000281447 00000 n -0000281858 00000 n -0000282269 00000 n -0000282680 00000 n -0000283091 00000 n -0000283502 00000 n -0000283910 00000 n -0000284316 00000 n -0000284717 00000 n -0000285118 00000 n -0000285516 00000 n -0000285913 00000 n -0000286303 00000 n -0000286694 00000 n -0000287081 00000 n -0000287466 00000 n -0000287852 00000 n -0000288236 00000 n -0000288620 00000 n -0000289004 00000 n -0000289387 00000 n -0000289764 00000 n -0000290141 00000 n -0000290515 00000 n -0000290879 00000 n -0000291246 00000 n -0000291606 00000 n -0000291953 00000 n -0000292297 00000 n -0000292552 00000 n -0000292798 00000 n -0000293031 00000 n -0000293395 00000 n -0000293806 00000 n -0000294217 00000 n -0000294554 00000 n -0000294965 00000 n -0000295297 00000 n -0000295706 00000 n -0000296028 00000 n -0000296439 00000 n -0000296756 00000 n -0000297165 00000 n -0000297473 00000 n -0000297773 00000 n -0000298061 00000 n -0000298344 00000 n -0000298619 00000 n -0000298886 00000 n -0000299292 00000 n -0000299697 00000 n -0000300101 00000 n -0000300503 00000 n -0000300905 00000 n -0000301304 00000 n -0000301703 00000 n -0000302099 00000 n -0000302497 00000 n -0000302888 00000 n -0000303278 00000 n -0000303658 00000 n -0000304037 00000 n -0000304414 00000 n -0000304793 00000 n -0000305166 00000 n -0000305537 00000 n -0000305902 00000 n -0000306258 00000 n -0000306608 00000 n -0000306963 00000 n -0000307306 00000 n -0000307645 00000 n -0000307985 00000 n -0000308318 00000 n -0000308648 00000 n -0000308975 00000 n -0000309298 00000 n -0000309616 00000 n -0000309931 00000 n -0000310342 00000 n -0000310711 00000 n -0000311122 00000 n -0000311529 00000 n -0000311935 00000 n -0000312340 00000 n -0000312744 00000 n -0000313139 00000 n -0000313539 00000 n -0000313938 00000 n -0000314252 00000 n -0000314555 00000 n -0000314860 00000 n -0000315159 00000 n -0000315443 00000 n -0000315726 00000 n -0000316006 00000 n -0000316283 00000 n -0000316556 00000 n -0000316821 00000 n -0000317214 00000 n -0000317607 00000 n -0000317996 00000 n -0000318387 00000 n -0000318776 00000 n -0000320815 00000 n -0000320965 00000 n -0000321124 00000 n -0000321275 00000 n -0000321429 00000 n -0000321583 00000 n -0000321737 00000 n -0000321891 00000 n -0000322045 00000 n -0000322199 00000 n -0000322353 00000 n -0000322507 00000 n -0000322661 00000 n -0000322815 00000 n -0000322967 00000 n -0000323127 00000 n -0000323281 00000 n -0000323438 00000 n -0000323592 00000 n -0000325592 00000 n -0000325745 00000 n -0000325905 00000 n -0000323872 00000 n -0000320510 00000 n -0000319674 00000 n -0000323747 00000 n -0001120693 00000 n -0000323809 00000 n -0001120189 00000 n -0000326060 00000 n -0000326215 00000 n -0000326370 00000 n -0000326525 00000 n -0000326680 00000 n -0000326840 00000 n -0000326995 00000 n -0000327150 00000 n -0000327305 00000 n -0000327465 00000 n -0000327625 00000 n -0000327778 00000 n -0000327938 00000 n -0000328093 00000 n -0000328248 00000 n -0000328408 00000 n -0000328561 00000 n -0000328721 00000 n -0000328882 00000 n -0000329037 00000 n -0000329192 00000 n -0000329346 00000 n -0000329501 00000 n -0000329656 00000 n -0000329811 00000 n -0000329966 00000 n -0000331834 00000 n -0000331989 00000 n -0000330183 00000 n -0000325197 00000 n -0000323973 00000 n -0000330120 00000 n -0001121530 00000 n -0001122535 00000 n -0000332144 00000 n -0000332299 00000 n -0000332454 00000 n -0000332608 00000 n -0000332761 00000 n -0000332916 00000 n -0000333071 00000 n -0000333225 00000 n -0000333380 00000 n -0000333535 00000 n -0000333696 00000 n -0000333849 00000 n -0000334004 00000 n -0000334159 00000 n -0000334467 00000 n -0000334775 00000 n -0000335084 00000 n -0000335239 00000 n -0000335394 00000 n -0000335703 00000 n -0000336012 00000 n -0000336319 00000 n -0000336628 00000 n -0000338664 00000 n -0000336997 00000 n -0000331403 00000 n -0000330298 00000 n -0000336935 00000 n -0000334314 00000 n -0000334622 00000 n -0000334930 00000 n -0000335549 00000 n -0000335858 00000 n -0000336167 00000 n -0000336474 00000 n -0000336783 00000 n -0000338819 00000 n -0000338974 00000 n -0000339135 00000 n -0000339290 00000 n -0000339445 00000 n -0000339599 00000 n -0000339753 00000 n -0000339907 00000 n -0000340062 00000 n -0000340217 00000 n -0000340371 00000 n -0000340680 00000 n -0000340835 00000 n -0000341143 00000 n -0000341453 00000 n -0000341763 00000 n -0000342073 00000 n -0000342383 00000 n -0000342693 00000 n -0000343002 00000 n -0000343157 00000 n -0000345255 00000 n -0000345564 00000 n -0000343683 00000 n -0000338242 00000 n -0000337098 00000 n -0000343620 00000 n -0000340526 00000 n -0000340990 00000 n -0000341298 00000 n -0000341608 00000 n -0000341918 00000 n -0000342228 00000 n -0000342538 00000 n -0000342847 00000 n -0000343311 00000 n -0000343466 00000 n -0000345872 00000 n -0000346333 00000 n -0000346484 00000 n -0000346639 00000 n -0000346947 00000 n -0000347256 00000 n -0000347564 00000 n -0000347873 00000 n -0000348334 00000 n -0000348797 00000 n -0000348951 00000 n -0000349414 00000 n -0000349723 00000 n -0000350032 00000 n -0000350340 00000 n -0000352213 00000 n -0000352522 00000 n -0000350557 00000 n -0000344814 00000 n -0000343784 00000 n -0000350495 00000 n -0000345410 00000 n -0000345718 00000 n -0000346027 00000 n -0000346179 00000 n -0000346793 00000 n -0000347102 00000 n -0000347411 00000 n -0000347719 00000 n -0000348028 00000 n -0000348181 00000 n -0000348489 00000 n -0000348643 00000 n -0000349106 00000 n -0000349260 00000 n -0000349569 00000 n -0000349878 00000 n -0000350186 00000 n -0001123000 00000 n -0000352830 00000 n -0000353140 00000 n -0000353605 00000 n -0000353915 00000 n -0000354535 00000 n -0000354690 00000 n -0000354845 00000 n -0000355157 00000 n -0000355318 00000 n -0000355474 00000 n -0000355630 00000 n -0000355786 00000 n -0000356565 00000 n -0000357033 00000 n -0000359036 00000 n -0000357407 00000 n -0000351781 00000 n -0000350658 00000 n -0000357344 00000 n -0000352368 00000 n -0000352677 00000 n -0000352985 00000 n -0000353295 00000 n -0000353450 00000 n -0000353760 00000 n -0000354070 00000 n -0000354225 00000 n -0000354380 00000 n -0000355001 00000 n -0000355941 00000 n -0000356097 00000 n -0000356253 00000 n -0000356409 00000 n -0000356721 00000 n -0000356877 00000 n -0000357189 00000 n -0000359965 00000 n -0000360585 00000 n -0000361051 00000 n -0000361515 00000 n -0000362134 00000 n -0000362908 00000 n -0000363373 00000 n -0000363529 00000 n -0000363839 00000 n -0000364150 00000 n -0000364461 00000 n -0000364615 00000 n -0000365541 00000 n -0000364838 00000 n -0000358568 00000 n -0000357508 00000 n -0000364776 00000 n -0000359192 00000 n -0000359346 00000 n -0000359501 00000 n -0000359656 00000 n -0000359810 00000 n -0000360121 00000 n -0000360275 00000 n -0000360430 00000 n -0000360741 00000 n -0000360896 00000 n -0000361206 00000 n -0000361361 00000 n -0000361671 00000 n -0000361826 00000 n -0000361980 00000 n -0000362289 00000 n -0000362443 00000 n -0000362598 00000 n -0000362753 00000 n -0000363064 00000 n -0000363219 00000 n -0000363684 00000 n -0000363995 00000 n -0000364306 00000 n -0000365697 00000 n -0000365853 00000 n -0000366008 00000 n -0000366164 00000 n -0000366320 00000 n -0000366476 00000 n -0000366694 00000 n -0000365343 00000 n -0000364939 00000 n -0000366631 00000 n -0000368772 00000 n -0000368927 00000 n -0000369082 00000 n -0000369249 00000 n -0000369525 00000 n -0000368601 00000 n -0000366781 00000 n -0000369404 00000 n -0000727122 00000 n -0000727059 00000 n -0000727374 00000 n -0000729031 00000 n -0000370896 00000 n -0000371049 00000 n -0000371200 00000 n -0000371353 00000 n -0000371506 00000 n -0000371659 00000 n -0000371812 00000 n -0000371965 00000 n -0000372243 00000 n -0000370689 00000 n -0000369626 00000 n -0000372118 00000 n -0001120357 00000 n -0000374384 00000 n -0000374139 00000 n -0000372344 00000 n -0000374262 00000 n -0001123125 00000 n -0000376653 00000 n -0000377079 00000 n -0000376509 00000 n -0000374485 00000 n -0000376830 00000 n -0001120525 00000 n -0001121028 00000 n -0001120861 00000 n -0001122367 00000 n -0000379828 00000 n -0000380173 00000 n -0000379684 00000 n -0000377236 00000 n -0000379989 00000 n -0001122199 00000 n -0000383726 00000 n -0000383478 00000 n -0000380302 00000 n -0000383601 00000 n -0001119853 00000 n -0001121195 00000 n -0001120021 00000 n -0001122703 00000 n -0000386312 00000 n -0000386066 00000 n -0000383897 00000 n -0000386189 00000 n -0000388911 00000 n -0000388725 00000 n -0000386468 00000 n -0000388848 00000 n -0001122031 00000 n -0000391330 00000 n -0000391145 00000 n -0000389053 00000 n -0000391268 00000 n -0001123250 00000 n -0000394787 00000 n -0000394601 00000 n -0000391459 00000 n -0000394724 00000 n -0000396926 00000 n -0000396741 00000 n -0000394916 00000 n -0000396864 00000 n -0000399699 00000 n -0000399513 00000 n -0000397055 00000 n -0000399636 00000 n -0000405471 00000 n -0000405286 00000 n -0000399828 00000 n -0000405409 00000 n -0000409496 00000 n -0000409310 00000 n -0000405600 00000 n -0000409433 00000 n -0000411990 00000 n -0000414291 00000 n -0000412265 00000 n -0000411846 00000 n -0000409625 00000 n -0000412143 00000 n -0001123375 00000 n -0000414445 00000 n -0000414793 00000 n -0000414138 00000 n -0000412407 00000 n -0000414606 00000 n -0000728968 00000 n -0000416763 00000 n -0000416915 00000 n -0000417068 00000 n -0000417491 00000 n -0000416601 00000 n -0000414921 00000 n -0000417244 00000 n -0000417366 00000 n -0000729095 00000 n -0000454944 00000 n -0000419499 00000 n -0000455098 00000 n -0000455464 00000 n -0000419346 00000 n -0000417662 00000 n -0000455275 00000 n -0000455338 00000 n -0000433197 00000 n -0000433445 00000 n -0000433711 00000 n -0000433891 00000 n -0000433915 00000 n -0000434122 00000 n -0000434523 00000 n -0000434725 00000 n -0000435036 00000 n -0000447799 00000 n -0000454897 00000 n -0000454921 00000 n -0000458302 00000 n -0000458455 00000 n -0000458608 00000 n -0000460713 00000 n -0000458887 00000 n -0000458140 00000 n -0000455650 00000 n -0000458764 00000 n -0000727437 00000 n -0000461115 00000 n -0000460569 00000 n -0000459002 00000 n -0000460864 00000 n -0000460989 00000 n -0000463181 00000 n -0000462875 00000 n -0000461230 00000 n -0000462998 00000 n -0001123500 00000 n -0000465724 00000 n -0000465885 00000 n -0000468256 00000 n -0000466039 00000 n -0000466326 00000 n -0000465562 00000 n -0000463282 00000 n -0000466201 00000 n -0000727000 00000 n -0000478156 00000 n -0000727311 00000 n -0000478341 00000 n -0000468133 00000 n -0000466427 00000 n -0000478094 00000 n -0000481045 00000 n -0000480733 00000 n -0000478479 00000 n -0000480856 00000 n -0000483048 00000 n -0000502605 00000 n -0000502946 00000 n -0000482904 00000 n -0000481146 00000 n -0000502757 00000 n -0000502819 00000 n -0000502883 00000 n -0000505355 00000 n -0000508626 00000 n -0000508789 00000 n -0000505893 00000 n -0000505211 00000 n -0000503070 00000 n -0000505514 00000 n -0000505577 00000 n -0000505640 00000 n -0000509140 00000 n -0000508473 00000 n -0000506008 00000 n -0000508952 00000 n -0000509014 00000 n -0000509077 00000 n -0001123625 00000 n -0000727185 00000 n -0000727248 00000 n -0000511694 00000 n -0000511320 00000 n -0000509227 00000 n -0000511443 00000 n -0000513565 00000 n -0000513786 00000 n -0000513421 00000 n -0000511809 00000 n -0000513724 00000 n -0000514342 00000 n -0000514156 00000 n -0000513873 00000 n -0000514279 00000 n -0000516337 00000 n -0000516029 00000 n -0000514429 00000 n -0000516152 00000 n -0000518638 00000 n -0000518452 00000 n -0000516438 00000 n -0000518575 00000 n -0000521083 00000 n -0000520836 00000 n -0000518752 00000 n -0000520959 00000 n -0001119685 00000 n -0001123750 00000 n -0000523097 00000 n -0000522785 00000 n -0000521239 00000 n -0000522908 00000 n -0000524736 00000 n -0000525203 00000 n -0000524592 00000 n -0000523226 00000 n -0000524892 00000 n -0000525015 00000 n -0000525078 00000 n -0000527062 00000 n -0000526750 00000 n -0000525360 00000 n -0000526873 00000 n -0000529613 00000 n -0000529180 00000 n -0000527191 00000 n -0000529303 00000 n -0001119249 00000 n -0000531815 00000 n -0000531314 00000 n -0000529756 00000 n -0000531437 00000 n -0001119395 00000 n -0000534006 00000 n -0000533573 00000 n -0000531944 00000 n -0000533696 00000 n -0001123875 00000 n -0000535836 00000 n -0000535273 00000 n -0000534121 00000 n -0000535396 00000 n -0000001763 00000 f -0000000000 00000 f -0000537863 00000 n -0000538333 00000 n -0000537719 00000 n -0000535951 00000 n -0000538023 00000 n -0000540487 00000 n -0000539986 00000 n -0000538434 00000 n -0000540109 00000 n -0000542472 00000 n -0000541915 00000 n -0000540588 00000 n -0000542038 00000 n -0000544414 00000 n -0000543977 00000 n -0000542573 00000 n -0000544100 00000 n -0000546305 00000 n -0000545748 00000 n -0000544529 00000 n -0000545871 00000 n -0001124000 00000 n -0000548114 00000 n -0000547550 00000 n -0000546406 00000 n -0000547673 00000 n -0000550050 00000 n -0000549556 00000 n -0000548215 00000 n -0000549679 00000 n -0000551950 00000 n -0000551386 00000 n -0000550151 00000 n -0000551509 00000 n -0000553589 00000 n -0000553156 00000 n -0000552051 00000 n -0000553279 00000 n -0000555702 00000 n -0000555140 00000 n -0000553690 00000 n -0000555263 00000 n -0000557778 00000 n -0000557221 00000 n -0000555803 00000 n -0000557344 00000 n -0001124125 00000 n -0000559891 00000 n -0000559327 00000 n -0000557879 00000 n -0000559450 00000 n -0000562089 00000 n -0000561656 00000 n -0000560006 00000 n -0000561779 00000 n -0000564235 00000 n -0000563861 00000 n -0000562204 00000 n -0000563984 00000 n -0000566186 00000 n -0000565815 00000 n -0000564350 00000 n -0000565938 00000 n -0000568164 00000 n -0000567726 00000 n -0000566301 00000 n -0000567849 00000 n -0000570000 00000 n -0000572548 00000 n -0000570154 00000 n -0000570932 00000 n -0000569847 00000 n -0000568265 00000 n -0000570308 00000 n -0000570618 00000 n -0000570681 00000 n -0000570744 00000 n -0000570869 00000 n -0001124250 00000 n -0000590830 00000 n -0000614274 00000 n -0000592868 00000 n -0000590613 00000 n -0000591275 00000 n -0000572404 00000 n -0000571061 00000 n -0000590767 00000 n -0000590894 00000 n -0000590958 00000 n -0000591022 00000 n -0000591085 00000 n -0000591212 00000 n -0000576784 00000 n -0000576998 00000 n -0000577046 00000 n -0000577433 00000 n -0001118194 00000 n -0000588997 00000 n -0000577885 00000 n -0000578042 00000 n -0000578232 00000 n -0000578255 00000 n -0000578493 00000 n -0000578721 00000 n -0000578955 00000 n -0001118152 00000 n -0000579293 00000 n -0000579519 00000 n -0000579629 00000 n -0000583110 00000 n -0000588255 00000 n -0000638196 00000 n -0000615678 00000 n -0000637980 00000 n -0000614587 00000 n -0000592745 00000 n -0000591419 00000 n -0000614212 00000 n -0000614337 00000 n -0000614400 00000 n -0000614463 00000 n -0000614524 00000 n -0000598529 00000 n -0000598743 00000 n -0000598791 00000 n -0000599178 00000 n -0000612596 00000 n -0000599674 00000 n -0000599831 00000 n -0000600029 00000 n -0000600052 00000 n -0000600290 00000 n -0000600518 00000 n -0000600751 00000 n -0000601204 00000 n -0000601430 00000 n -0000601554 00000 n -0000605035 00000 n -0000611630 00000 n -0000639820 00000 n -0000660808 00000 n -0000638575 00000 n -0000615534 00000 n -0000614717 00000 n -0000638133 00000 n -0000638323 00000 n -0000638386 00000 n -0000638449 00000 n -0000638512 00000 n -0000621760 00000 n -0000621974 00000 n -0000622022 00000 n -0000622409 00000 n -0000636364 00000 n -0000622911 00000 n -0000623068 00000 n -0000623266 00000 n -0000623289 00000 n -0000623527 00000 n -0000623755 00000 n -0000623988 00000 n -0000624469 00000 n -0000624695 00000 n -0000624819 00000 n -0000628300 00000 n -0000635398 00000 n -0000661178 00000 n -0000663222 00000 n -0000660962 00000 n -0000678726 00000 n -0000693206 00000 n -0000661742 00000 n -0000639667 00000 n -0000638719 00000 n -0000661116 00000 n -0000661304 00000 n -0000661367 00000 n -0000661430 00000 n -0000661555 00000 n -0000661617 00000 n -0000661680 00000 n -0000643422 00000 n -0000643636 00000 n -0000643684 00000 n -0000644069 00000 n -0000659192 00000 n -0000644547 00000 n -0001113597 00000 n -0000657576 00000 n -0000644704 00000 n -0000644861 00000 n -0000645055 00000 n -0000645078 00000 n -0000645316 00000 n -0000645536 00000 n -0000645769 00000 n -0001113555 00000 n -0000646216 00000 n -0000646442 00000 n -0000646559 00000 n -0000649893 00000 n -0000656694 00000 n -0000693423 00000 n -0000693487 00000 n -0000693806 00000 n -0000663078 00000 n -0000661886 00000 n -0000693360 00000 n -0000693614 00000 n -0000693678 00000 n -0000693742 00000 n -0000666078 00000 n -0000666292 00000 n -0000666340 00000 n -0000666649 00000 n -0000677110 00000 n -0000667087 00000 n -0000667423 00000 n -0000667613 00000 n -0000667636 00000 n -0000667875 00000 n -0000668065 00000 n -0000668299 00000 n -0000668574 00000 n -0000668800 00000 n -0000668910 00000 n -0000671926 00000 n -0000676368 00000 n -0000681541 00000 n -0000681755 00000 n -0000681803 00000 n -0000682112 00000 n -0000691590 00000 n -0000682534 00000 n -0000682870 00000 n -0000683060 00000 n -0000683083 00000 n -0000683322 00000 n -0000683512 00000 n -0000683746 00000 n -0000683946 00000 n -0000684172 00000 n -0000684282 00000 n -0000687298 00000 n -0000690848 00000 n -0000714358 00000 n -0000694747 00000 n -0000714421 00000 n -0000694624 00000 n -0000693966 00000 n -0000714233 00000 n -0000714295 00000 n -0001124375 00000 n -0000699269 00000 n -0000699483 00000 n -0000699531 00000 n -0000699918 00000 n -0000712617 00000 n -0000700402 00000 n -0000700559 00000 n -0000700753 00000 n -0000700776 00000 n -0000701014 00000 n -0000701242 00000 n -0000701475 00000 n -0000701888 00000 n -0000702114 00000 n -0000702231 00000 n -0000705712 00000 n -0000711735 00000 n -0000715761 00000 n -0000715911 00000 n -0000716061 00000 n -0000716212 00000 n -0000716363 00000 n -0000716514 00000 n -0000716665 00000 n -0000716816 00000 n -0000716967 00000 n -0000717117 00000 n -0000717268 00000 n -0000717416 00000 n -0000717563 00000 n -0000717711 00000 n -0000717860 00000 n -0000718009 00000 n -0000718158 00000 n -0000718307 00000 n -0000718456 00000 n -0000718605 00000 n -0000718755 00000 n -0000718906 00000 n -0000719056 00000 n -0000719207 00000 n -0000719357 00000 n -0000719507 00000 n -0000719657 00000 n -0000719808 00000 n -0000719958 00000 n -0000720109 00000 n -0000720260 00000 n -0000720408 00000 n -0000720556 00000 n -0000720704 00000 n -0000720853 00000 n -0000721002 00000 n -0000721151 00000 n -0000721299 00000 n -0000721448 00000 n -0000721597 00000 n -0000721747 00000 n -0000721898 00000 n -0000722048 00000 n -0000722199 00000 n -0000722349 00000 n -0000722497 00000 n -0000722645 00000 n -0000722793 00000 n -0000722941 00000 n -0000723090 00000 n -0000723238 00000 n -0000723387 00000 n -0000723536 00000 n -0000723685 00000 n -0000723835 00000 n -0000723986 00000 n -0000724136 00000 n -0000724287 00000 n -0000724438 00000 n -0000724589 00000 n -0000724739 00000 n -0000724953 00000 n -0000715077 00000 n -0000714552 00000 n -0000724890 00000 n -0000727500 00000 n -0000726753 00000 n -0000725040 00000 n -0000726876 00000 n -0000726938 00000 n -0000729159 00000 n -0000728782 00000 n -0000727601 00000 n -0000728905 00000 n -0000729260 00000 n -0000729352 00000 n -0001118711 00000 n -0000729378 00000 n -0000729530 00000 n -0001118413 00000 n -0000729690 00000 n -0000730050 00000 n -0000730624 00000 n -0000731209 00000 n -0000731747 00000 n -0000732337 00000 n -0000732813 00000 n -0000732845 00000 n -0000732877 00000 n -0000733357 00000 n -0000733815 00000 n -0000734363 00000 n -0000734642 00000 n -0000735122 00000 n -0000735593 00000 n -0000735626 00000 n -0000737010 00000 n -0000737440 00000 n -0000737750 00000 n -0000739435 00000 n -0000739665 00000 n -0000741605 00000 n -0000741838 00000 n -0000743198 00000 n -0000743440 00000 n -0000770252 00000 n -0000770493 00000 n -0000788263 00000 n -0000788531 00000 n -0000814601 00000 n -0000814924 00000 n -0000835744 00000 n -0000836092 00000 n -0000855743 00000 n -0000856102 00000 n -0000872560 00000 n -0000872857 00000 n -0000889441 00000 n -0000889759 00000 n -0000891572 00000 n -0000891803 00000 n -0000893599 00000 n -0000893830 00000 n -0000913679 00000 n -0000914082 00000 n -0000940568 00000 n -0000941183 00000 n -0000956952 00000 n -0000957262 00000 n -0000965457 00000 n -0000965710 00000 n -0000972687 00000 n -0000972946 00000 n -0000990411 00000 n -0000990675 00000 n -0001028717 00000 n -0001029139 00000 n -0001055923 00000 n -0001056203 00000 n -0001093936 00000 n -0001094429 00000 n -0001111046 00000 n -0001111490 00000 n -0001113781 00000 n -0001124482 00000 n -0001124607 00000 n -0001124733 00000 n -0001124813 00000 n -0001124895 00000 n -0001138908 00000 n -0001139087 00000 n -0001139264 00000 n -0001139439 00000 n -0001139614 00000 n -0001139789 00000 n -0001139966 00000 n -0001140155 00000 n -0001140379 00000 n -0001140629 00000 n -0001140830 00000 n -0001141023 00000 n -0001141200 00000 n -0001141376 00000 n -0001141553 00000 n -0001141729 00000 n -0001141906 00000 n -0001142082 00000 n -0001142259 00000 n -0001142435 00000 n -0001142612 00000 n -0001142787 00000 n -0001142958 00000 n -0001143134 00000 n -0001143329 00000 n -0001143540 00000 n -0001143749 00000 n -0001143960 00000 n -0001144169 00000 n -0001144373 00000 n -0001144574 00000 n -0001144777 00000 n -0001144978 00000 n -0001145181 00000 n -0001145382 00000 n -0001145585 00000 n -0001145785 00000 n -0001145985 00000 n -0001146188 00000 n -0001146389 00000 n -0001146592 00000 n -0001146793 00000 n -0001146996 00000 n -0001147197 00000 n -0001147400 00000 n -0001147613 00000 n -0001147854 00000 n -0001148103 00000 n -0001148225 00000 n -0001148346 00000 n -0001148467 00000 n -0001148583 00000 n -0001148704 00000 n -0001148829 00000 n -0001148953 00000 n -0001149077 00000 n -0001149199 00000 n -0001149321 00000 n -0001149407 00000 n -0001149491 00000 n -0001149531 00000 n -0001149718 00000 n -trailer -<< /Size 2245 -/Root 2243 0 R -/Info 2244 0 R -/ID [<9FD317BACFF93D9266FA87EA58277CC8> <9FD317BACFF93D9266FA87EA58277CC8>] >> -startxref -1150050 -%%EOF diff --git a/doc/dev-guide/dev-guide.tex b/doc/dev-guide/dev-guide.tex deleted file mode 100644 index 744484882b2492ce3ef977b51f49356e03cdadc2..0000000000000000000000000000000000000000 --- a/doc/dev-guide/dev-guide.tex +++ /dev/null @@ -1,130 +0,0 @@ -\documentclass[twoside,a4paper,12pt]{book} -\usepackage{graphicx} -\usepackage{amsmath} -\usepackage{amsfonts} -\usepackage[usenames]{color} -\usepackage{fancyhdr} -\usepackage{fancyvrb} -\usepackage{makeidx} -\usepackage{tabularx} -\usepackage[colorlinks=true]{hyperref} -\usepackage[T1]{fontenc} -\usepackage{arydshln} -%\usepackage{here} - -\pagestyle{fancy} - -%%%%% DEFINITION OF GLOBAL COMMANDS -\newcommand{\majorchangeZIB}[1]{\colorbox{yellow}{\begin{minipage}[t]{\linewidth}#1\end{minipage}}} -\definecolor{ErrorRed}{rgb}{1,0.80,0.80} -\definecolor{LightGrey}{gray}{0.7} -\newcommand{\missing}[1]{\colorbox{ErrorRed}{\begin{minipage}[t]{\linewidth}#1\end{minipage}}} -\newcommand{\majorchangeBSC}[1]{\colorbox{green}{\begin{minipage}[t]{\linewidth} -#1\end{minipage}}} -\newcommand{\majorchangeUDUS}[1]{\colorbox{blue}{\begin{minipage}[t]{\linewidth} -#1\end{minipage}}} -\newcommand{\majorchangeCNR}[1]{\colorbox{magenta}{\begin{minipage}[t]{\linewidth} -#1\end{minipage}}} - - -\newcommand{\feature}[7][]{ -\begin{tabularx}{\linewidth}{|r|X|} -\hline -\multicolumn{2}{|c|}{\textbf{ID: #2}}\\ -\hline \hline -name & #3\\ -type & #4\\ -dependencies & #6\\ -description & #7\\ -\hline -\end{tabularx} -} -%%%%% END OF GLOBAL COMMANDS - -\setlength{\parindent}{0pt} -\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex} - - -\makeindex - -\begin{document} - -\pagenumbering{roman} -\begin{titlepage} -\begin{flushright} - \includegraphics{images/final_logo.pdf} - % final_logo.pdf: 192x56 pixel, 72dpi, 6.77x1.98 cm, bb=0 0 192 56 -\end{flushright} - -\vspace{3cm} - -\begin{flushleft} -\sffamily \begin{LARGE}The XtreemFS Developer Guide\end{LARGE} - -Version 1.0 -\end{flushleft} - - -\end{titlepage} -\resizebox{5cm}{!}{\includegraphics{images/xtreemos_neu_logo.pdf}} - -XtreemFS is developed within the \href{http://www.xtreemos.eu}{XtreemOS project}. XtreemOS is a Linux-based Grid operating system that transparently integrates Grid user, VO and resource management traditionally found in Grid Middleware. The XtreemOS project is funded by the European Commission's IST program under contract \#FP6-033576. - -XtreemFS is available from the \href{http://www.XtreemFS.org}{XtreemFS website (www.XtreemFS.org)}. - - -This document is \copyright{} 2009 by the XtreemOS consortium. - -\setcounter{tocdepth}{10} -\tableofcontents - -%BSC -\chapter{Introduction} -\pagenumbering{arabic} -\label{sec:xtreemfs_intro} -\input{xtreemfs_intro} - -%ZIB -\chapter{XtreemFS Servers} -\label{sec:xtreemfs_servers} -\input{xtreemfs_servers} - -\section{DIR - Directory Service\index{DIR}} -\label{sec:xtreemfs_dir} -\input{xtreemfs_dir} - -\section{MRC\index{MRC} - Metadata and Replica Catalog} -\label{sec:xtreemfs_mrc} -\input{xtreemfs_mrc} - -%ZIB -\section{OSD\index{OSD} - Object Storage Device} -\label{sec:xtreemfs_osd} -\input{xtreemfs_osd} - -%NEC -\chapter{Client} -\label{sec:xtreemfs_client} -\input{xtreemfs_client} - -%MSC -\chapter{RMS - Replica Management Service} -\label{sec:xtreemfs_rms} -\input{xtreemfs_rms} - -%CNR, BSC -\chapter{Testing} -\label{sec:xtreemfs_test} -\input{xtreemfs_test} - -%ZIB, NEC -\chapter{Protocol and Interactions} -\label{sec:xtreemfs_proto} -\input{xtreemfs_proto} - -\printindex - -\bibliographystyle{plain} -\bibliography{bib} - -\end{document} diff --git a/doc/dev-guide/images/XtreemOS-Logo.jpg b/doc/dev-guide/images/XtreemOS-Logo.jpg deleted file mode 100644 index e8ce6ce49171053fe18411898a5670b03c3edbaa..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/XtreemOS-Logo.jpg and /dev/null differ diff --git a/doc/dev-guide/images/final_logo.pdf b/doc/dev-guide/images/final_logo.pdf deleted file mode 100644 index 6bfee3ee881435b599c3bd8e093990131ab9a5c2..0000000000000000000000000000000000000000 --- a/doc/dev-guide/images/final_logo.pdf +++ /dev/null @@ -1,1029 +0,0 @@ -%PDF-1.4 -% -3 0 obj -<< - /Type /Catalog - /Pages 2 0 R ->> -endobj -4 0 obj -<< - /Type /Page - /Parent 2 0 R - /MediaBox [ 0 0 192 56 ] - /Resources 5 0 R - /Contents 6 0 R - /Group - << /Type /Group - /S /Transparency - /CS /DeviceRGB - >> ->> -endobj -6 0 obj -<< - /Length 7 0 R ->> -stream -0.8 0 0 -0.8 0 56 cm -q -1 0 0 1 0 0 cm -q -1 0 0 1 -100.84152 -759.30717 cm -q -0.441941 0 0 0.441941 154.35506 536.04966 cm -q -0.19215687 0.30588236 0.49411765 rg -264.85608 638.39467 m -266.91831 634.0015 272.84253 633.23285 277.09198 634.0065 c -280.66651 634.82514 285.36589 637.66102 283.65362 641.98533 c -281.55389 646.15328 275.94213 646.89343 271.80517 646.25189 c -268.16815 645.52936 263.2313 642.85196 264.85608 638.39467 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -290.04028 643.06431 m -292.06501 639.10833 297.26433 637.95848 301.3263 638.54215 c -304.62586 639.17957 308.45036 641.72461 306.73809 645.53574 c -304.68836 649.2535 299.7765 650.33636 295.86451 649.92328 c -292.48996 649.4151 288.40299 647.04091 290.04028 643.06431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.24986 646.23389 m -314.17461 642.79822 318.54904 641.30279 322.29854 641.69636 c -325.33565 642.1748 328.02279 644.51774 326.38551 647.71807 c -324.44826 650.93003 320.3238 652.30237 316.74927 652.10172 c -313.63718 651.7795 310.68757 649.60545 312.24986 646.23389 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.44613 613.61667 m -247.69583 608.90854 253.84503 608.16489 258.38193 609.2585 c -262.4439 610.44584 267.0433 613.98663 265.30602 618.75225 c -263.13131 623.43664 257.05711 624.19779 252.5577 623.17917 c -248.39574 622.03432 243.62137 618.49103 245.44613 613.61667 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -272.26761 620.45203 m -274.34234 615.94012 280.11658 614.97774 284.516 615.94262 c -288.39049 616.99498 292.58994 620.29205 290.99015 624.77521 c -288.97792 629.19463 283.36615 630.18075 279.04172 629.35461 c -275.04225 628.38724 270.59283 625.09517 272.26761 620.45203 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -297.33932 626.15753 m -299.20158 622.03557 304.27591 620.75199 308.38787 621.56813 c -311.9999 622.48051 315.41195 625.54386 313.94964 629.55833 c -312.12488 633.53906 307.26302 634.82764 303.25104 634.19397 c -299.47654 633.40283 295.82702 630.34823 297.33932 626.15753 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -319.44892 630.60944 m -321.0987 626.99367 325.33565 625.36888 329.09765 626.03129 c -332.39722 626.80619 334.8344 629.67832 333.50957 633.11287 c -331.87229 636.57241 327.83532 638.15095 324.1858 637.70226 c -320.72375 637.08234 318.11159 634.20647 319.44892 630.60944 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.85753 594.66791 m -256.18222 590.166 262.09394 589.49359 266.51836 590.63969 c -270.49284 591.87328 274.81728 595.40781 273.105 600.02846 c -270.93029 604.6416 264.95607 605.36526 260.51915 604.2729 c -256.43219 603.05431 251.92028 599.40854 253.85753 594.66791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -279.84162 601.87321 m -281.84135 597.48004 287.40312 596.67015 291.61507 597.74626 c -295.45207 598.9286 299.43904 602.32441 297.98923 606.75382 c -296.13948 611.17074 290.6277 612.06438 286.44075 611.10075 c -282.42878 609.97215 278.20433 606.46886 279.84162 601.87321 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -304.16342 608.38361 m -305.8382 604.3004 310.71257 603.20554 314.63705 604.18791 c -318.24908 605.29527 321.54864 608.53359 320.3363 612.58181 c -318.76151 616.61503 314.01213 617.79987 310.13764 616.97373 c -306.32564 615.95512 302.8136 612.60931 304.16342 608.38361 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.6981 613.94913 m -327.07292 610.31586 331.13489 608.86605 334.72191 609.74343 c -338.04648 610.7583 340.49616 613.84164 339.45879 617.38993 c -338.13397 620.92571 334.23448 622.43927 330.70994 621.75186 c -327.1854 620.85447 324.58574 617.65364 325.6981 613.94913 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -343.93321 618.48603 m -345.07056 615.37519 348.30763 613.57168 351.54471 614.33658 c -354.53182 615.25146 356.11911 618.19857 355.20673 621.19068 c -354.09437 624.19029 350.99478 626.00005 347.83269 625.45137 c -344.64561 624.68147 343.00833 621.59438 343.93321 618.48603 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -262.35641 576.93274 m -264.63111 572.80703 270.24288 572.44958 274.31734 573.56068 c -277.94187 574.72928 282.19131 577.9751 280.59152 582.28703 c -278.51679 586.62647 272.73005 587.03391 268.63059 585.95155 c -264.88108 584.77421 260.40667 581.35716 262.35641 576.93274 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -286.97818 584.18679 m -288.84044 580.07607 294.13974 579.65863 297.96424 580.74724 c -301.53877 581.94458 305.47575 585.15416 304.22592 589.36736 c -302.56363 593.5993 297.22683 594.12673 293.37734 593.11061 c -289.65283 591.93577 285.45338 588.55996 286.97818 584.18679 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -310.11264 591.15462 m -311.56245 587.25263 316.24934 586.59522 319.79887 587.64133 c -323.21093 588.83368 326.54799 591.97076 325.58561 595.9065 c -324.28578 599.83598 319.67389 600.64588 316.11186 599.7085 c -312.51233 598.56365 308.9503 595.26408 310.11264 591.15462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -330.74744 597.50629 m -331.87229 593.96675 335.75928 592.95064 339.03385 593.94301 c -342.20843 595.10035 344.79559 598.13995 344.03319 601.67699 c -343.02083 605.17153 339.25882 606.35013 335.98425 605.49649 c -332.62219 604.41038 329.87255 601.2008 330.74744 597.50629 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -348.38262 603.05431 m -349.24501 599.97971 352.3321 598.55115 355.30671 599.48478 c -358.18134 600.58338 360.0186 603.513 359.39368 606.58885 c -358.56879 609.57845 355.63167 611.137 352.68206 610.3721 c -349.60746 609.36598 347.70771 606.25014 348.38262 603.05431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.93071 607.73869 m -363.61812 605.17153 365.96781 603.34427 368.64246 604.21041 c -371.19213 605.23652 372.31698 608.05365 371.77955 610.65081 c -371.10464 613.12424 368.86743 615.01774 366.23028 614.34658 c -363.50564 613.43295 362.38079 610.40709 362.93071 607.73869 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.57918 611.58694 m -375.14161 609.51596 376.90388 607.35625 379.27857 608.14489 c -381.49078 609.09102 382.00321 611.79691 381.50328 613.93288 c -380.94085 615.92512 379.25357 618.07234 376.94137 617.49741 c -374.56669 616.68252 374.11675 613.74291 374.57918 611.58694 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -247.29589 554.86438 m -249.83305 551.43108 255.03237 551.26735 258.80688 552.23098 c -261.88147 553.15086 266.08092 555.86925 264.19367 559.59876 c -261.83148 563.36202 256.28221 563.48325 252.44521 562.48713 c -249.29562 561.51976 244.98369 558.60764 247.29589 554.86438 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.30537 561.38228 m -272.46758 557.72151 277.72939 557.7665 281.31642 558.77637 c -284.47851 559.80748 288.76544 562.62087 287.31564 566.5241 c -285.39089 570.46234 279.86661 570.42859 276.24209 569.42747 c -273.01751 568.37886 268.44311 565.37175 270.30537 561.38228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -293.27735 568.39261 m -294.97713 564.6631 300.00147 564.73059 303.33853 565.74795 c -306.51312 566.87031 310.48759 569.73118 309.45023 573.61692 c -307.98792 577.53641 302.8386 577.56265 299.47654 576.58278 c -296.20197 575.46418 291.90253 572.41708 293.27735 568.39261 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -314.987 575.46043 m -316.22434 571.83341 320.73625 571.72967 323.81085 572.73829 c -326.92294 573.91938 330.33499 576.78151 329.62258 580.48852 c -328.57272 584.20928 324.07331 584.48425 320.97372 583.53437 c -317.72414 582.37202 314.03713 579.32867 314.987 575.46043 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -334.52194 582.22329 m -335.40932 578.85374 339.20883 578.42004 342.04595 579.41616 c -344.99557 580.61725 347.73271 583.44688 347.25777 586.85893 c -346.49537 590.23474 342.82085 590.88716 339.94623 589.97103 c -336.83414 588.79993 333.89702 585.78908 334.52194 582.22329 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.43222 588.42998 m -352.05714 585.43662 355.05675 584.57048 357.6814 585.55536 c -360.39355 586.74395 362.46827 589.50984 362.10582 592.55944 c -361.56839 595.4928 358.71877 596.58516 356.06911 595.70402 c -353.19449 594.55917 351.00728 591.60456 351.43222 588.42998 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.56787 593.93926 m -366.01781 591.39709 368.26751 590.06351 370.6797 591.03214 c -373.10438 592.18449 374.55419 594.86288 374.26673 597.52254 c -373.84178 599.97096 371.74206 601.49826 369.31738 600.65712 c -366.73021 599.56602 365.25541 596.68265 365.56787 593.93926 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.04136 598.70613 m -377.37882 596.6414 379.0036 594.86538 381.20332 595.80526 c -383.31554 596.90387 384.21542 599.47978 383.94046 601.75323 c -383.603 603.72047 382.0907 605.62522 379.91598 604.83908 c -377.65378 603.81546 376.7789 601.01958 377.04136 598.70613 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -256.10723 542.52975 m -258.51941 539.61513 263.29379 539.76886 266.61835 540.59126 c -269.11802 541.30616 273.47995 543.51462 271.71768 546.7592 c -269.50547 550.01752 264.31865 549.76505 260.96909 548.91391 c -258.41943 548.16151 253.90752 545.76183 256.10723 542.52975 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -277.36694 548.38523 m -279.35418 545.2194 284.26604 545.63809 287.35313 546.51673 c -289.99028 547.37412 294.35221 549.72756 293.06488 553.1721 c -291.34011 556.64665 286.10329 556.18171 283.0037 555.30308 c -280.34155 554.43194 275.64217 551.88352 277.36694 548.38523 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -298.60165 554.94687 m -300.10146 551.64731 304.87583 552.16849 307.68796 553.06462 c -310.4376 554.05699 314.43708 556.51042 313.61218 560.00246 c -312.37485 563.53824 307.4005 563.05831 304.57587 562.17967 c -301.78874 561.1873 297.40181 558.5464 298.60165 554.94687 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -318.77401 561.82222 m -319.81137 558.53015 324.1858 558.96509 326.74796 559.86623 c -329.5101 560.96608 332.98464 563.4795 332.5097 566.87906 c -331.69731 570.31611 327.28539 570.01989 324.68573 569.14376 c -321.83611 568.0489 318.0366 565.35926 318.77401 561.82222 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -337.1466 568.65757 m -337.80901 565.51299 341.55852 565.68546 343.92071 566.59659 c -346.60785 567.76519 349.46998 570.29861 349.23251 573.49944 c -348.73258 576.69527 345.07056 576.74526 342.64587 575.86413 c -339.84624 574.70303 336.74665 571.99838 337.1466 568.65757 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.24448 575.17172 m -353.64443 572.30209 356.64404 572.07088 358.86875 573.0045 c -361.38092 574.2031 363.64312 576.72027 363.54313 579.65238 c -363.23067 582.49451 360.39355 582.99569 358.10635 582.10456 c -355.46919 580.91721 353.05701 578.22507 353.24448 575.17172 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.90519 581.17718 m -367.14266 578.67876 369.39237 577.9601 371.49209 578.92123 c -373.76679 580.11857 375.46657 582.587 375.42907 585.21415 c -375.2291 587.63133 373.15437 588.6262 371.00465 587.72632 c -368.59247 586.54773 366.8177 583.89682 366.90519 581.17718 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.16621 586.57272 m -378.31619 584.49924 379.90349 583.27441 381.86573 584.25678 c -383.89046 585.43037 385.09031 587.82256 385.05281 590.13725 c -384.90283 592.10075 383.47802 593.5718 381.49078 592.67442 c -379.34106 591.52957 378.12872 588.94616 378.16621 586.57272 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.24002 591.32585 m -387.35251 589.68856 388.40237 587.99379 390.20213 588.98116 c -391.95191 590.11476 392.7268 592.41196 392.66431 594.42294 c -392.53933 595.95024 391.57695 597.8275 389.78969 596.95261 c -387.93993 595.85775 387.19003 593.36433 387.24002 591.32585 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.27115 528.66657 m -247.80832 526.53685 251.84529 526.56185 254.91989 527.13677 c -256.71965 527.53672 260.85661 529.10151 258.85687 531.53869 c -256.43219 533.97712 251.97027 533.8134 248.85818 533.18723 c -246.95843 532.73854 242.89646 531.01751 245.27115 528.66657 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -263.88121 532.72479 m -266.13091 530.29886 270.48034 530.70005 273.37996 531.38746 c -275.32971 531.91739 279.81662 533.68591 278.22933 536.44305 c -276.19209 539.20144 271.39272 538.65276 268.5056 537.9441 c -266.55586 537.39293 261.84398 535.43943 263.88121 532.72479 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -283.40365 537.89661 m -285.21591 535.21321 289.75282 535.91812 292.38997 536.65802 c -294.53969 537.34293 298.92661 539.27643 297.82676 542.25104 c -296.28946 545.24565 291.3651 544.437 288.76544 543.6971 c -286.64072 543.01219 281.86635 540.88497 283.40365 537.89661 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -302.91359 543.89082 m -304.23841 541.0337 308.75032 541.90858 311.08752 542.66348 c -313.41221 543.50712 317.42418 545.5656 316.79927 548.63895 c -315.7619 551.74979 310.97503 550.85491 308.66283 550.11126 c -306.35064 549.27387 301.91372 547.03291 302.91359 543.89082 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -321.58614 550.37372 m -322.43603 547.45286 326.68547 548.32899 328.7602 549.08639 c -331.18488 550.07001 334.67192 552.21973 334.40946 555.27183 c -333.80953 558.37142 329.46011 557.57903 327.36038 556.82788 c -324.9107 555.848 321.04871 553.53331 321.58614 550.37372 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -338.75888 557.02035 m -339.22132 554.15323 342.97083 554.85438 344.87058 555.62678 c -347.28277 556.71539 350.20738 558.92385 350.19488 561.85722 c -349.90742 564.81933 346.22041 564.30064 344.25816 563.52825 c -341.77099 562.43839 338.57141 560.0737 338.75888 557.02035 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -354.00688 563.55324 m -354.20686 560.85485 357.29395 561.22355 359.09372 562.03219 c -361.40591 563.18704 363.7806 565.4205 363.90559 568.16639 c -363.8181 570.87853 360.89348 570.7698 359.00623 569.95865 c -356.60654 568.7988 354.04438 566.41162 354.00688 563.55324 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -367.15516 569.76118 m -367.20515 567.3365 369.55484 567.25276 371.29212 568.11764 c -373.44183 569.30249 375.31659 571.52595 375.49156 574.04437 c -375.50406 576.41406 373.35435 576.804 371.52958 575.94287 c -369.29238 574.75302 367.29264 572.37459 367.15516 569.76118 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.19121 575.50792 m -378.16621 573.43445 379.816 572.83078 381.51577 573.7569 c -383.44052 574.94425 384.86533 577.12646 385.02781 579.40241 c -385.07781 581.37465 383.6155 582.28828 381.86573 581.38215 c -379.84099 580.19231 378.36619 577.85262 378.19121 575.50792 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.22752 580.71974 m -387.19003 579.03871 388.26489 577.91136 389.86468 578.88873 c -391.56446 580.05858 392.60182 582.17205 392.7268 584.20178 c -392.7643 585.76283 391.83942 587.16764 390.20213 586.23652 c -388.42737 585.06917 387.37751 582.79572 387.22752 580.71974 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -394.47657 585.37413 m -394.45158 584.0818 395.08899 582.48701 396.5638 583.48938 c -398.00111 584.61423 398.75101 586.66146 398.80101 588.44998 c -398.826 589.63107 398.23858 591.42958 396.78877 590.50721 c -395.26397 589.37735 394.57656 587.19514 394.47657 585.37413 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.44508 521.71248 m -255.79477 519.98771 259.4193 520.17518 262.15644 520.65012 c -263.45627 520.91259 267.7682 522.12493 265.95594 524.11217 c -263.70623 526.11191 259.65676 525.74945 256.93212 525.24952 c -255.5573 524.96206 251.25787 523.59974 253.44508 521.71248 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.56783 525.12454 m -272.63006 523.1373 276.57954 523.69972 279.09171 524.27465 c -280.57902 524.6496 285.10343 526.07441 283.71611 528.35911 c -281.86635 530.65631 277.45443 529.91016 274.97975 529.32648 c -273.52994 528.94153 268.74307 527.33675 270.56783 525.12454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -288.45299 529.64269 m -290.07777 527.39924 294.27722 528.29287 296.50193 528.90654 c -298.2267 529.43772 302.58863 531.02001 301.67625 533.53968 c -300.32643 536.0706 295.70203 535.03448 293.55232 534.42706 c -291.90253 533.90838 287.11566 532.13112 288.45299 529.64269 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -306.35064 535.02699 m -307.48799 532.59855 311.76243 533.70591 313.67468 534.32333 c -315.63692 535.02199 319.5864 536.72676 319.13646 539.38891 c -318.29907 542.06606 313.69967 540.88497 311.83742 540.28005 c -309.93767 539.59889 305.52575 537.71288 306.35064 535.02699 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -323.57338 541.0037 m -324.24829 538.46778 328.37275 539.64763 330.03503 540.2588 c -332.14725 541.11494 335.5843 542.92345 335.50931 545.61935 c -335.09687 548.34774 330.80993 547.18914 329.16014 546.58172 c -327.07292 545.73558 323.22342 543.77084 323.57338 541.0037 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.58378 547.28913 m -339.87124 544.73696 343.62075 545.83182 345.10805 546.44924 c -347.27027 547.43411 350.19488 549.32511 350.36986 551.96601 c -350.26987 554.64441 346.52037 553.67079 344.99557 553.04212 c -342.80835 552.05475 339.58378 550.02627 339.58378 547.28913 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.99439 553.62705 m -354.00688 551.15362 357.19397 552.00601 358.59378 552.65842 c -360.7185 553.73578 363.14319 555.68178 363.45564 558.20269 c -363.56813 560.72986 360.50603 560.08995 359.01873 559.41129 c -356.85651 558.32268 354.20686 556.2467 353.99439 553.62705 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.59273 559.80373 m -366.46775 557.50529 368.96742 557.98022 370.35474 558.69763 c -372.35448 559.83123 374.32922 561.80097 374.70417 564.16066 c -374.90414 566.44411 372.59195 566.25164 371.11714 565.50174 c -369.04241 564.35064 366.93019 562.25216 366.59273 559.80373 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.35382 565.66672 m -377.15385 563.62823 378.97861 563.62698 380.36593 564.42813 c -382.20318 565.58798 383.77798 567.54772 384.14043 569.72493 c -384.3529 571.69217 382.75311 572.01463 381.27831 571.18474 c -379.37855 570.00615 377.71627 567.91642 377.35382 565.66672 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -386.34014 571.116 m -386.14017 569.39873 387.34001 568.87379 388.71483 569.76118 c -390.35211 570.92353 391.57695 572.84577 391.88941 574.83176 c -392.07689 576.4378 391.07702 577.28644 389.63971 576.38781 c -387.93993 575.20546 386.6776 573.15448 386.34014 571.116 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -393.67668 576.0966 m -393.5142 574.72928 394.21411 573.69191 395.53893 574.64929 c -396.95125 575.78414 397.91362 577.66389 398.12609 579.45491 c -398.28857 580.70224 397.70115 582.01332 396.36383 581.08094 c -394.87652 579.9161 393.95164 577.93136 393.67668 576.0966 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -260.48166 516.47567 m -262.65637 515.10085 265.89345 515.40081 268.31813 515.77576 c -269.2555 515.93824 273.56744 516.92561 271.99265 518.48791 c -269.91792 520.11269 266.2809 519.62526 263.86871 519.22531 c -262.90634 519.03783 258.56941 517.92548 260.48166 516.47567 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -276.22959 519.35029 m -278.11684 517.738 281.66638 518.38792 283.87859 518.86286 c -284.99094 519.12532 289.45285 520.30017 288.26551 522.13743 c -286.59073 524.03718 282.56626 523.17479 280.44154 522.69985 c -279.39167 522.43739 274.6548 521.07507 276.22959 519.35029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -292.60244 523.26228 m -294.06475 521.41252 297.92674 522.39989 299.814 522.91233 c -301.20131 523.31227 305.46325 524.6246 304.72585 526.71183 c -303.5635 528.8228 299.22657 527.6617 297.43931 527.17427 c -296.17697 526.78682 291.46509 525.28701 292.60244 523.26228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -309.01279 528.0454 m -309.98766 526.01192 314.02463 527.24926 315.59942 527.73669 c -317.24921 528.31287 321.0862 529.71893 320.79874 531.99363 c -320.13633 534.24959 315.72441 532.91351 314.2371 532.43233 c -312.6998 531.8899 308.37537 530.30011 309.01279 528.0454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -324.9107 533.47094 m -325.41064 531.31872 329.42261 532.66605 330.73494 533.14598 c -332.5722 533.88089 335.92176 535.38444 335.99675 537.73913 c -335.75928 540.07632 331.53483 538.70275 330.26 538.23032 c -328.48523 537.51416 324.71073 535.86188 324.9107 533.47094 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.80875 539.30018 m -339.94623 537.09047 343.68324 538.42154 344.82059 538.89648 c -346.75784 539.77261 349.61996 541.36865 349.94492 543.71835 c -350.01991 546.06929 346.2329 544.79695 345.07056 544.31077 c -343.14581 543.43713 339.95873 541.71986 339.80875 539.30018 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -353.38197 545.30439 m -353.25698 543.10468 356.53155 544.28452 357.59391 544.78321 c -359.53116 545.76808 361.94334 547.44036 362.41828 549.72131 c -362.68075 552.00976 359.50616 550.97614 358.36881 550.44621 c -356.40657 549.44759 353.75692 547.66783 353.38197 545.30439 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.44288 551.28485 m -365.15542 549.17013 367.83007 550.06876 368.87993 550.62619 c -370.75469 551.68605 372.76692 553.40707 373.29185 555.58054 c -373.65431 557.72276 371.16713 557.05035 370.01728 556.44543 c -368.10503 555.36182 365.93032 553.53581 365.44288 551.28485 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -375.89151 557.08284 m -375.54156 555.1331 377.56629 555.63678 378.66615 556.28295 c -380.40342 557.38655 382.0657 559.12757 382.59063 561.16856 c -382.96558 563.08705 381.16582 562.86958 379.96598 562.16967 c -378.17871 561.03607 376.41644 559.19256 375.89151 557.08284 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -384.77785 562.58462 m -384.42789 560.87234 385.81521 560.90234 386.96506 561.65099 c -388.53985 562.77584 389.87718 564.50687 390.36461 566.40412 c -390.68957 568.03515 389.52722 568.32512 388.30238 567.52647 c -386.6776 566.37037 385.27778 564.53686 384.77785 562.58462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -392.16438 567.71645 m -391.87691 566.29163 392.7143 565.8167 393.86415 566.66658 c -395.25147 567.77894 396.36383 569.49121 396.73878 571.23598 c -397.02624 572.55456 396.33883 573.33071 395.15149 572.46207 c -393.70168 571.30473 392.61432 569.50871 392.16438 567.71645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -295.9895 518.40042 m -297.30182 516.88812 300.83886 517.90048 302.47615 518.32543 c -303.576 518.62539 307.70046 519.72524 307.11304 521.43752 c -306.11317 523.17479 302.0637 521.97495 300.5764 521.575 c -299.60152 521.30004 295.06462 519.98771 295.9895 518.40042 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -311.06252 522.61236 m -311.88741 520.93758 315.69941 522.19992 316.99924 522.61236 c -318.38656 523.0748 322.08607 524.23715 321.92359 526.1619 c -321.41116 528.02041 317.19921 526.63684 316.01187 526.26189 c -314.76203 525.83694 310.57508 524.48712 311.06252 522.61236 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.7231 527.49922 m -326.09805 525.71196 329.97254 527.11177 331.0099 527.47423 c -332.63469 528.10664 335.83427 529.34648 336.03424 531.38746 c -335.93426 533.33346 331.8223 531.88365 330.83492 531.5237 c -329.31012 530.92127 325.6731 529.53771 325.7231 527.49922 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.59627 532.82602 m -339.60877 530.97252 343.30829 532.39608 344.17067 532.75353 c -345.92045 533.52718 348.67008 534.86076 349.13252 536.93174 c -349.32 538.92772 345.54549 537.51416 344.68311 537.15171 c -342.95833 536.38306 339.88374 534.9445 339.59627 532.82602 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -352.3821 538.42029 m -352.13213 536.53054 355.45669 537.87911 356.24409 538.24781 c -358.01886 539.13895 360.38105 540.56001 360.98097 542.60349 c -361.36842 544.60198 358.10635 543.33715 357.25646 542.9397 c -355.46919 542.03732 352.88203 540.52751 352.3821 538.42029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -363.88059 544.0958 m -363.46814 542.22104 366.28027 543.38214 367.06767 543.79709 c -368.80494 544.77321 370.81718 546.26426 371.46709 548.239 c -371.95453 550.18 369.30488 549.17513 368.42999 548.71269 c -366.65522 547.71032 364.49301 546.13928 363.88059 544.0958 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.00426 549.70131 m -373.51682 547.90405 375.74153 548.77143 376.57892 549.26387 c -378.22871 550.29873 379.91598 551.82978 380.5659 553.71578 c -381.07833 555.52555 379.07859 554.88313 378.14122 554.32945 c -376.45394 553.25959 374.65417 551.64731 374.00426 549.70131 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -382.74061 555.1181 m -382.26568 553.46832 383.87796 553.94575 384.77785 554.54193 c -386.30265 555.61053 387.71496 557.15658 388.32738 558.93635 c -388.78982 560.54739 387.415 560.34616 386.41513 559.68375 c -384.86533 558.5764 383.37803 556.95036 382.74061 555.1181 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -390.15214 560.25992 m -389.7272 558.82011 390.77706 558.84761 391.73943 559.55627 c -393.08926 560.62738 394.3016 562.17467 394.81403 563.84195 c -395.22648 565.20428 394.36409 565.46549 393.33922 564.70934 c -391.93941 563.58574 390.72707 561.9722 390.15214 560.25992 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.61232 518.43791 m -313.31222 517.07559 316.89925 518.31293 317.98661 518.63789 c -319.17395 519.01284 322.69849 519.97521 322.6485 521.6 c -322.26105 523.0998 318.24908 521.74998 317.2867 521.46252 c -316.26184 521.11256 312.24986 519.96271 312.61232 518.43791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -326.17304 522.79984 m -326.423 521.35003 330.16001 522.71235 330.97241 522.99981 c -332.42222 523.53724 335.45932 524.54961 335.75928 526.31188 c -335.75928 527.88667 331.7848 526.46186 331.0224 526.19939 c -329.69757 525.68696 326.22303 524.53711 326.17304 522.79984 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -339.08384 527.62421 m -339.00885 526.1244 342.62088 527.52422 343.28329 527.79918 c -344.87058 528.48034 347.48274 529.58395 348.03267 531.40246 c -348.30763 533.0285 344.60812 531.61243 343.9582 531.34122 c -342.4209 530.66881 339.48379 529.47521 339.08384 527.62421 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.10726 532.78103 m -350.79481 531.22373 354.09437 532.5973 354.6818 532.86977 c -356.33158 533.67216 358.58128 534.87076 359.28119 536.68677 c -359.74363 538.36405 356.46906 537.02047 355.84414 536.72676 c -354.20686 535.91437 351.71968 534.64829 351.10726 532.78103 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.05583 538.09283 m -361.58089 536.49679 364.44301 537.76663 365.03044 538.07034 c -366.65522 538.96522 368.61747 540.24505 369.36737 542.02482 c -369.94229 543.7146 367.19265 542.53225 366.54274 542.1873 c -364.89296 541.26867 362.78073 539.92759 362.05583 538.09283 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -371.82955 543.42213 m -371.26712 541.83234 373.61681 542.9072 374.25423 543.2734 c -375.81652 544.23328 377.5038 545.57185 378.2537 547.29288 c -378.86612 548.93641 376.69141 548.01278 375.979 547.59034 c -374.37921 546.59672 372.59195 545.1969 371.82955 543.42213 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -380.39092 548.65645 m -379.816 547.1304 381.62826 547.91779 382.32817 548.37273 c -383.77798 549.37635 385.22779 550.74867 385.95269 552.39596 c -386.52762 553.92826 384.94033 553.35208 384.15293 552.82965 c -382.65313 551.78604 381.14082 550.35123 380.39092 548.65645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.77745 553.70454 m -387.24002 552.30472 388.50236 552.72716 389.27726 553.28959 c -390.60208 554.30696 391.87691 555.69802 392.50183 557.26532 c -393.03926 558.62514 391.95191 558.44766 391.11451 557.82649 c -389.7397 556.75413 388.47736 555.31057 387.77745 553.70454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg --87.686408 585.51161 m --101.65891 605.54773 l --85.394209 605.54773 l --78.571354 592.40446 l --71.231067 605.54773 l --53.874595 605.54773 l --67.956497 585.51161 l --54.856966 566.49286 l --70.629896 566.49286 l --76.880326 578.01385 l --82.692064 566.49286 l --99.966797 566.49286 l --87.686408 585.51161 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --12.796235 566.49286 m --52.887224 566.49286 l --52.887224 578.01385 l --40.100152 578.01385 l --40.100152 605.54773 l --25.579558 605.54773 l --25.579558 578.01385 l --12.796235 578.01385 l --12.796235 566.49286 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --8.4293081 605.54773 m -6.1012853 605.54773 l -6.1012853 592.23073 l -9.4570949 592.23073 l -10.420718 592.23073 11.258109 592.34072 11.966766 592.56069 c -12.675423 592.81815 13.247848 593.37558 13.68529 594.23547 c -14.030245 594.80289 14.312708 595.57154 14.530179 596.54266 c -14.712655 597.53128 14.858886 598.5824 14.966372 599.6985 c -15.130101 600.77836 15.266333 601.84947 15.376318 602.91183 c -15.485054 603.9192 15.612537 604.79783 15.758768 605.54773 c -31.336724 605.54773 l -30.661812 603.56424 30.174376 601.27079 29.874416 598.66988 c -29.524462 596.06773 28.812055 593.70179 27.749695 591.57207 c -27.09978 590.49846 26.274888 589.60607 25.262521 588.89617 c -24.262652 588.15127 22.959073 587.64133 21.368032 587.36887 c -21.368032 587.25888 l -24.100173 586.58397 26.299885 585.42537 27.949668 583.78434 c -29.561957 582.14205 30.37435 579.84486 30.411845 576.89024 c -30.37435 573.16823 29.087019 570.48733 26.549852 568.84505 c -23.950193 567.27775 20.365664 566.49286 15.778765 566.49286 c --8.4293081 566.49286 l --8.4293081 605.54773 l -h -5.4388722 575.16047 m -9.7695539 575.16047 l -11.40184 575.12422 12.835402 575.35294 14.07024 575.84913 c -15.247585 576.32657 15.855005 577.45517 15.8925 579.23494 c -15.8925 580.17231 15.731272 580.91471 15.408814 581.46589 c -15.066359 582.07206 14.582672 582.53075 13.955255 582.84321 c -12.684171 583.35564 11.213114 583.59436 9.5420838 583.55812 c -5.4388722 583.55812 l -5.4388722 575.16047 l -f* -Q -q -0.19215687 0.30588236 0.49411765 rg -36.948488 605.54773 m -70.094138 605.54773 l -70.094138 596.15272 l -51.134126 596.15272 l -51.134126 590.83216 l -68.894296 590.83216 l -68.894296 581.43215 l -51.134126 581.43215 l -51.134126 575.88787 l -69.719187 575.88787 l -69.719187 566.49286 l -36.948488 566.49286 l -36.948488 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -76.380813 605.54773 m -109.52646 605.54773 l -109.52646 596.15272 l -90.566452 596.15272 l -90.566452 590.83216 l -108.32662 590.83216 l -108.32662 581.43215 l -90.566452 581.43215 l -90.566452 575.88787 l -109.15151 575.88787 l -109.15151 566.49286 l -76.380813 566.49286 l -76.380813 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -116.26308 605.54773 m -128.61146 605.54773 l -128.77394 574.82426 l -129.01141 574.82426 l -136.21046 605.54773 l -148.32137 605.54773 l -155.7329 574.82426 l -155.84539 574.82426 l -156.08286 605.54773 l -169.01866 605.54773 l -169.01866 566.49286 l -147.62147 566.49286 l -142.7596 587.83506 l -142.64712 587.83506 l -137.71027 566.49286 l -116.26308 566.49286 l -116.26308 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -180.8921 605.54773 m -190.8283 605.54773 l -190.8283 589.88104 l -202.62675 589.88104 l -202.62675 582.16455 l -190.8283 582.16455 l -190.8283 574.20934 l -203.17668 574.20934 l -203.17668 566.49286 l -180.8921 566.49286 l -180.8921 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -209.28837 604.69284 m -210.31324 604.96531 211.70056 605.26527 213.46283 605.59273 c -215.1876 605.97393 217.19984 606.18265 219.52453 606.21889 c -224.11143 606.21889 227.76095 605.11779 230.4481 602.91433 c -233.17274 600.74711 234.56006 597.54253 234.59755 593.30184 c -234.59755 591.84453 234.44757 590.5697 234.14761 589.47734 c -233.83515 588.43873 233.36021 587.52885 232.7478 586.74645 c -231.51046 585.21665 229.99816 584.0968 228.21089 583.38564 c -223.574 581.25592 l -221.88672 580.50977 220.72437 579.81861 220.09946 579.18119 c -219.47454 578.56127 219.16208 577.76013 219.16208 576.77776 c -219.19957 574.35558 220.87435 573.12574 224.19892 573.09074 c -225.67372 573.09074 227.13603 573.28197 228.57334 573.66442 c -229.94816 574.06436 231.08551 574.5293 231.9854 575.05673 c -232.43534 567.37899 l -230.84804 566.72283 229.19826 566.29538 227.49848 566.09541 c -225.79871 565.91293 224.19892 565.8217 222.68662 565.8217 c -218.53716 565.8217 215.1876 566.81406 212.65043 568.80005 c -210.02578 570.80479 208.70095 573.67316 208.66346 577.40767 c -208.62596 580.12232 209.25088 582.39952 210.51321 584.23803 c -211.73805 586.09778 213.91277 587.66383 217.03736 588.93866 c -219.32456 589.84104 l -220.11195 590.09601 220.79936 590.35098 221.41178 590.60594 c -222.0492 590.87966 222.54913 591.17962 222.91159 591.50707 c -223.69898 592.14449 224.08643 593.07437 224.08643 594.29546 c -224.08643 595.53405 223.69898 596.52642 222.91159 597.27257 c -222.08669 598.09371 220.69938 598.50366 218.72464 598.50366 c -217.83725 598.50366 216.91237 598.39367 215.975 598.17495 c -215.07511 597.97498 214.22523 597.765 213.40033 597.54628 c -211.80054 596.98261 210.6382 596.51767 209.88829 596.15272 c -209.28837 604.69284 l -f -Q -Q -Q -Q -endstream -endobj -7 0 obj -31868 -endobj -5 0 obj -<< - /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] ->> -endobj -1 0 obj -<< - /Title(final_logo.pdf) - /Author(Björn Kolbeck) - /Creator(www.inkscape.org) - /Producer(Inkscape inkscape 0.45.1) - /CreationDate(D:20070525075700Z) ->> -endobj -2 0 obj -<< - /Type /Pages - /Count 1 - /Kids [ - 4 0 R - ] ->> -endobj -xref -0 8 -0000000000 65535 f -0000032269 00000 n -0000032443 00000 n -0000000015 00000 n -0000000068 00000 n -0000032200 00000 n -0000000257 00000 n -0000032179 00000 n -trailer -<< - /Size 7 - /Root 3 0 R - /Info 1 0 R ->> -startxref -32514 -%%EOF diff --git a/doc/dev-guide/images/interactions_delete.pdf b/doc/dev-guide/images/interactions_delete.pdf deleted file mode 100644 index 198d1254e9f8ebdb77c7291dac761df798f23524..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/interactions_delete.pdf and /dev/null differ diff --git a/doc/dev-guide/images/interactions_fsync.pdf b/doc/dev-guide/images/interactions_fsync.pdf deleted file mode 100644 index d7628c48676d0198b5d91be0b078025d5f91385e..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/interactions_fsync.pdf and /dev/null differ diff --git a/doc/dev-guide/images/interactions_mkvol.pdf b/doc/dev-guide/images/interactions_mkvol.pdf deleted file mode 100644 index 59f4b6e6afefff74623cbe0b1c66e8db4144d61c..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/interactions_mkvol.pdf and /dev/null differ diff --git a/doc/dev-guide/images/interactions_read.pdf b/doc/dev-guide/images/interactions_read.pdf deleted file mode 100644 index 6e3fbd2131fe3ff57533db30ce59e7714bbbb22c..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/interactions_read.pdf and /dev/null differ diff --git a/doc/dev-guide/images/interactions_rmrepl.pdf b/doc/dev-guide/images/interactions_rmrepl.pdf deleted file mode 100644 index 916d6f0be8364e8865babce5498abe588cdc78f3..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/interactions_rmrepl.pdf and /dev/null differ diff --git a/doc/dev-guide/images/interactions_rmvol.pdf b/doc/dev-guide/images/interactions_rmvol.pdf deleted file mode 100644 index f54777c93c6b76220eac75cc06fd23033e05312e..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/interactions_rmvol.pdf and /dev/null differ diff --git a/doc/dev-guide/images/interactions_write.pdf b/doc/dev-guide/images/interactions_write.pdf deleted file mode 100644 index 219f0c198245871ada2daeaca463e09895ac179a..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/interactions_write.pdf and /dev/null differ diff --git a/doc/dev-guide/images/rms1.png b/doc/dev-guide/images/rms1.png deleted file mode 100644 index 99215a7e1a354ba2e1a1f5b6fc2b64cd731c940d..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/rms1.png and /dev/null differ diff --git a/doc/dev-guide/images/rms2.png b/doc/dev-guide/images/rms2.png deleted file mode 100644 index 754d0bb5194f1a84d2729d886e698ab5150e8dab..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/rms2.png and /dev/null differ diff --git a/doc/dev-guide/images/xtreemfs_client_stages.odg b/doc/dev-guide/images/xtreemfs_client_stages.odg deleted file mode 100644 index 277d1e615542e91690c3671de619831f4a9d0a2e..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/xtreemfs_client_stages.odg and /dev/null differ diff --git a/doc/dev-guide/images/xtreemfs_client_stages.pdf b/doc/dev-guide/images/xtreemfs_client_stages.pdf deleted file mode 100644 index cbb1ba4fea69d325d8a756b4e7699b7e62ff2236..0000000000000000000000000000000000000000 Binary files a/doc/dev-guide/images/xtreemfs_client_stages.pdf and /dev/null differ diff --git a/doc/dev-guide/images/xtreemos_neu_logo.pdf b/doc/dev-guide/images/xtreemos_neu_logo.pdf deleted file mode 100644 index c0b4d96fa35aa9a2a62c9c24c39d35f65df6ba12..0000000000000000000000000000000000000000 --- a/doc/dev-guide/images/xtreemos_neu_logo.pdf +++ /dev/null @@ -1,1557 +0,0 @@ -%PDF-1.4 % -4 0 obj <> endobj xref 4 639 0000000016 00000 n -0000013841 00000 n -0000013936 00000 n -0000017156 00000 n -0000017189 00000 n -0000034277 00000 n -0000051452 00000 n -0000067268 00000 n -0000083517 00000 n -0000099049 00000 n -0000113408 00000 n -0000126904 00000 n -0000140237 00000 n -0000142884 00000 n -0000145053 00000 n -0000145446 00000 n -0000145540 00000 n -0000145681 00000 n -0000146074 00000 n -0000146168 00000 n -0000146309 00000 n -0000146702 00000 n -0000146796 00000 n -0000146937 00000 n -0000147330 00000 n -0000147424 00000 n -0000147565 00000 n -0000147833 00000 n -0000147927 00000 n -0000148068 00000 n -0000148328 00000 n -0000148422 00000 n -0000148563 00000 n -0000148813 00000 n -0000148907 00000 n -0000149048 00000 n -0000149292 00000 n -0000149386 00000 n -0000149527 00000 n -0000149763 00000 n -0000149857 00000 n -0000149998 00000 n -0000150416 00000 n -0000150510 00000 n -0000150651 00000 n -0000151069 00000 n -0000151163 00000 n -0000151304 00000 n -0000151720 00000 n -0000151814 00000 n -0000151955 00000 n -0000152367 00000 n -0000152461 00000 n -0000152602 00000 n -0000153014 00000 n -0000153108 00000 n -0000153249 00000 n -0000153639 00000 n -0000153733 00000 n -0000153874 00000 n -0000154262 00000 n -0000154356 00000 n -0000154497 00000 n -0000154886 00000 n -0000154980 00000 n -0000155121 00000 n -0000155510 00000 n -0000155604 00000 n -0000155745 00000 n -0000156133 00000 n -0000156227 00000 n -0000156368 00000 n -0000156750 00000 n -0000156844 00000 n -0000156985 00000 n -0000157366 00000 n -0000157460 00000 n -0000157601 00000 n -0000157983 00000 n -0000158077 00000 n -0000158218 00000 n -0000158592 00000 n -0000158686 00000 n -0000158827 00000 n -0000159200 00000 n -0000159294 00000 n -0000159435 00000 n -0000159846 00000 n -0000159940 00000 n -0000160081 00000 n -0000160489 00000 n -0000160583 00000 n -0000160724 00000 n -0000161134 00000 n -0000161228 00000 n -0000161369 00000 n -0000161775 00000 n -0000161870 00000 n -0000162013 00000 n -0000162421 00000 n -0000162517 00000 n -0000162660 00000 n -0000163062 00000 n -0000163158 00000 n -0000163301 00000 n -0000163698 00000 n -0000163794 00000 n -0000163937 00000 n -0000164336 00000 n -0000164432 00000 n -0000164575 00000 n -0000164969 00000 n -0000165065 00000 n -0000165208 00000 n -0000165596 00000 n -0000165692 00000 n -0000165835 00000 n -0000166205 00000 n -0000166301 00000 n -0000166444 00000 n -0000166808 00000 n -0000166904 00000 n -0000167047 00000 n -0000167400 00000 n -0000167496 00000 n -0000167639 00000 n -0000167993 00000 n -0000168089 00000 n -0000168232 00000 n -0000168581 00000 n -0000168677 00000 n -0000168820 00000 n -0000169168 00000 n -0000169264 00000 n -0000169407 00000 n -0000169749 00000 n -0000169845 00000 n -0000169988 00000 n -0000170325 00000 n -0000170421 00000 n -0000170564 00000 n -0000170900 00000 n -0000170996 00000 n -0000171139 00000 n -0000171463 00000 n -0000171559 00000 n -0000171702 00000 n -0000172092 00000 n -0000172188 00000 n -0000172331 00000 n -0000172710 00000 n -0000172806 00000 n -0000172949 00000 n -0000173331 00000 n -0000173427 00000 n -0000173570 00000 n -0000173946 00000 n -0000174042 00000 n -0000174185 00000 n -0000174566 00000 n -0000174662 00000 n -0000174805 00000 n -0000175180 00000 n -0000175276 00000 n -0000175419 00000 n -0000175780 00000 n -0000175876 00000 n -0000176019 00000 n -0000176380 00000 n -0000176476 00000 n -0000176619 00000 n -0000176982 00000 n -0000177078 00000 n -0000177221 00000 n -0000177572 00000 n -0000177668 00000 n -0000177811 00000 n -0000178132 00000 n -0000178228 00000 n -0000178371 00000 n -0000178685 00000 n -0000178781 00000 n -0000178924 00000 n -0000179232 00000 n -0000179328 00000 n -0000179471 00000 n -0000179771 00000 n -0000179867 00000 n -0000180010 00000 n -0000180303 00000 n -0000180399 00000 n -0000180542 00000 n -0000180828 00000 n -0000180924 00000 n -0000181067 00000 n -0000181353 00000 n -0000181449 00000 n -0000181592 00000 n -0000181872 00000 n -0000181968 00000 n -0000182111 00000 n -0000182382 00000 n -0000182478 00000 n -0000182621 00000 n -0000182887 00000 n -0000182983 00000 n -0000183126 00000 n -0000183401 00000 n -0000183497 00000 n -0000183640 00000 n -0000183909 00000 n -0000184005 00000 n -0000184148 00000 n -0000184406 00000 n -0000184502 00000 n -0000184645 00000 n -0000184900 00000 n -0000184996 00000 n -0000185139 00000 n -0000185383 00000 n -0000185479 00000 n -0000185622 00000 n -0000185860 00000 n -0000185956 00000 n -0000186099 00000 n -0000186518 00000 n -0000186614 00000 n -0000186757 00000 n -0000187106 00000 n -0000187202 00000 n -0000187345 00000 n -0000187697 00000 n -0000187793 00000 n -0000187936 00000 n -0000188284 00000 n -0000188380 00000 n -0000188523 00000 n -0000188872 00000 n -0000188968 00000 n -0000189111 00000 n -0000189457 00000 n -0000189553 00000 n -0000189696 00000 n -0000190036 00000 n -0000190132 00000 n -0000190275 00000 n -0000190606 00000 n -0000190702 00000 n -0000190845 00000 n -0000191174 00000 n -0000191270 00000 n -0000191413 00000 n -0000191744 00000 n -0000191840 00000 n -0000191983 00000 n -0000192313 00000 n -0000192409 00000 n -0000192552 00000 n -0000192807 00000 n -0000192903 00000 n -0000193046 00000 n -0000193291 00000 n -0000193387 00000 n -0000193530 00000 n -0000193768 00000 n -0000193864 00000 n -0000194007 00000 n -0000194426 00000 n -0000194522 00000 n -0000194665 00000 n -0000195084 00000 n -0000195180 00000 n -0000195323 00000 n -0000195742 00000 n -0000195838 00000 n -0000195981 00000 n -0000196400 00000 n -0000196496 00000 n -0000196639 00000 n -0000197058 00000 n -0000197154 00000 n -0000197297 00000 n -0000197716 00000 n -0000197812 00000 n -0000197955 00000 n -0000198374 00000 n -0000198470 00000 n -0000198613 00000 n -0000198937 00000 n -0000199033 00000 n -0000199176 00000 n -0000199493 00000 n -0000199589 00000 n -0000199732 00000 n -0000200049 00000 n -0000200145 00000 n -0000200288 00000 n -0000200597 00000 n -0000200693 00000 n -0000200836 00000 n -0000201134 00000 n -0000201230 00000 n -0000201373 00000 n -0000201671 00000 n -0000201767 00000 n -0000201910 00000 n -0000202200 00000 n -0000202296 00000 n -0000202439 00000 n -0000202725 00000 n -0000202821 00000 n -0000202964 00000 n -0000203249 00000 n -0000203345 00000 n -0000203488 00000 n -0000203766 00000 n -0000203862 00000 n -0000204005 00000 n -0000204424 00000 n -0000204520 00000 n -0000204663 00000 n -0000205082 00000 n -0000205178 00000 n -0000205321 00000 n -0000205740 00000 n -0000205836 00000 n -0000205979 00000 n -0000206398 00000 n -0000206494 00000 n -0000206637 00000 n -0000207056 00000 n -0000207152 00000 n -0000207295 00000 n -0000207714 00000 n -0000207810 00000 n -0000207953 00000 n -0000208372 00000 n -0000208468 00000 n -0000208611 00000 n -0000209027 00000 n -0000209123 00000 n -0000209266 00000 n -0000209680 00000 n -0000209776 00000 n -0000209919 00000 n -0000210328 00000 n -0000210424 00000 n -0000210567 00000 n -0000210976 00000 n -0000211072 00000 n -0000211215 00000 n -0000211621 00000 n -0000211717 00000 n -0000211860 00000 n -0000212265 00000 n -0000212361 00000 n -0000212504 00000 n -0000212902 00000 n -0000212998 00000 n -0000213141 00000 n -0000213540 00000 n -0000213636 00000 n -0000213779 00000 n -0000214174 00000 n -0000214270 00000 n -0000214413 00000 n -0000214806 00000 n -0000214902 00000 n -0000215045 00000 n -0000215439 00000 n -0000215535 00000 n -0000215678 00000 n -0000216070 00000 n -0000216166 00000 n -0000216309 00000 n -0000216701 00000 n -0000216797 00000 n -0000216940 00000 n -0000217332 00000 n -0000217428 00000 n -0000217571 00000 n -0000217962 00000 n -0000218058 00000 n -0000218201 00000 n -0000218586 00000 n -0000218682 00000 n -0000218825 00000 n -0000219210 00000 n -0000219306 00000 n -0000219449 00000 n -0000219831 00000 n -0000219927 00000 n -0000220070 00000 n -0000220442 00000 n -0000220538 00000 n -0000220681 00000 n -0000221056 00000 n -0000221152 00000 n -0000221295 00000 n -0000221663 00000 n -0000221759 00000 n -0000221902 00000 n -0000222257 00000 n -0000222353 00000 n -0000222496 00000 n -0000222848 00000 n -0000222944 00000 n -0000223087 00000 n -0000223350 00000 n -0000223446 00000 n -0000223589 00000 n -0000223843 00000 n -0000223939 00000 n -0000224082 00000 n -0000224323 00000 n -0000224419 00000 n -0000224562 00000 n -0000224934 00000 n -0000225030 00000 n -0000225183 00000 n -0000225602 00000 n -0000225698 00000 n -0000225841 00000 n -0000226260 00000 n -0000226356 00000 n -0000226499 00000 n -0000226844 00000 n -0000226940 00000 n -0000227083 00000 n -0000227502 00000 n -0000227598 00000 n -0000227741 00000 n -0000228081 00000 n -0000228177 00000 n -0000228320 00000 n -0000228737 00000 n -0000228833 00000 n -0000228976 00000 n -0000229306 00000 n -0000229402 00000 n -0000229545 00000 n -0000229964 00000 n -0000230060 00000 n -0000230203 00000 n -0000230528 00000 n -0000230624 00000 n -0000230767 00000 n -0000231184 00000 n -0000231280 00000 n -0000231423 00000 n -0000231739 00000 n -0000231835 00000 n -0000231978 00000 n -0000232286 00000 n -0000232382 00000 n -0000232525 00000 n -0000232821 00000 n -0000232917 00000 n -0000233060 00000 n -0000233351 00000 n -0000233447 00000 n -0000233590 00000 n -0000233873 00000 n -0000233969 00000 n -0000234112 00000 n -0000234387 00000 n -0000234483 00000 n -0000234626 00000 n -0000235040 00000 n -0000235136 00000 n -0000235279 00000 n -0000235692 00000 n -0000235788 00000 n -0000235931 00000 n -0000236343 00000 n -0000236439 00000 n -0000236582 00000 n -0000236992 00000 n -0000237088 00000 n -0000237231 00000 n -0000237641 00000 n -0000237737 00000 n -0000237880 00000 n -0000238287 00000 n -0000238383 00000 n -0000238526 00000 n -0000238933 00000 n -0000239029 00000 n -0000239172 00000 n -0000239576 00000 n -0000239672 00000 n -0000239815 00000 n -0000240221 00000 n -0000240317 00000 n -0000240460 00000 n -0000240859 00000 n -0000240955 00000 n -0000241098 00000 n -0000241496 00000 n -0000241592 00000 n -0000241735 00000 n -0000242123 00000 n -0000242219 00000 n -0000242362 00000 n -0000242749 00000 n -0000242845 00000 n -0000242988 00000 n -0000243373 00000 n -0000243469 00000 n -0000243612 00000 n -0000243999 00000 n -0000244095 00000 n -0000244238 00000 n -0000244619 00000 n -0000244715 00000 n -0000244858 00000 n -0000245237 00000 n -0000245333 00000 n -0000245476 00000 n -0000245849 00000 n -0000245945 00000 n -0000246088 00000 n -0000246452 00000 n -0000246548 00000 n -0000246691 00000 n -0000247049 00000 n -0000247145 00000 n -0000247288 00000 n -0000247651 00000 n -0000247747 00000 n -0000247890 00000 n -0000248241 00000 n -0000248337 00000 n -0000248480 00000 n -0000248827 00000 n -0000248923 00000 n -0000249066 00000 n -0000249414 00000 n -0000249510 00000 n -0000249653 00000 n -0000249994 00000 n -0000250090 00000 n -0000250233 00000 n -0000250571 00000 n -0000250667 00000 n -0000250810 00000 n -0000251145 00000 n -0000251241 00000 n -0000251384 00000 n -0000251715 00000 n -0000251811 00000 n -0000251954 00000 n -0000252280 00000 n -0000252376 00000 n -0000252519 00000 n -0000252842 00000 n -0000252938 00000 n -0000253081 00000 n -0000253500 00000 n -0000253596 00000 n -0000253749 00000 n -0000254126 00000 n -0000254222 00000 n -0000254365 00000 n -0000254784 00000 n -0000254880 00000 n -0000255023 00000 n -0000255438 00000 n -0000255534 00000 n -0000255677 00000 n -0000256091 00000 n -0000256187 00000 n -0000256330 00000 n -0000256743 00000 n -0000256839 00000 n -0000256982 00000 n -0000257394 00000 n -0000257490 00000 n -0000257633 00000 n -0000258036 00000 n -0000258132 00000 n -0000258275 00000 n -0000258683 00000 n -0000258779 00000 n -0000258922 00000 n -0000259329 00000 n -0000259425 00000 n -0000259568 00000 n -0000259890 00000 n -0000259986 00000 n -0000260129 00000 n -0000260440 00000 n -0000260536 00000 n -0000260679 00000 n -0000260992 00000 n -0000261088 00000 n -0000261231 00000 n -0000261538 00000 n -0000261634 00000 n -0000261777 00000 n -0000262069 00000 n -0000262165 00000 n -0000262308 00000 n -0000262599 00000 n -0000262695 00000 n -0000262838 00000 n -0000263126 00000 n -0000263222 00000 n -0000263365 00000 n -0000263650 00000 n -0000263746 00000 n -0000263889 00000 n -0000264170 00000 n -0000264266 00000 n -0000264409 00000 n -0000264682 00000 n -0000264778 00000 n -0000264921 00000 n -0000265322 00000 n -0000265418 00000 n -0000265561 00000 n -0000265962 00000 n -0000266058 00000 n -0000266201 00000 n -0000266598 00000 n -0000266694 00000 n -0000266837 00000 n -0000267236 00000 n -0000267332 00000 n -0000267475 00000 n -0000267872 00000 n -0000267968 00000 n -0000268111 00000 n -0000268506 00000 n -0000268602 00000 n -0000268745 00000 n -0000285611 00000 n -0000285724 00000 n -0000013076 00000 n -trailer <<520BF7E020E811DDBB5A001451637DF1>]>> startxref 0 %%EOF 642 0 obj<>stream -xڬMHq֬|Y Fٛn!H:b$ -_TtC"*bZ&]AsD~Inz~(9$~ I,D~L;?Z%`mrIz-#WG%)5+btHhti3.{M*|.a}> p  8\~J 'OX 2#Y_vBttUNw9];%#ZnM jPW5ps8^i[aN8YGW;)N^{;~CCURv{#`_'78;;0Y? ;?^43+ lƥ.p kh׀}4:W9ypsָ 4o69  :r؛>F< \X=Oa)6'=w1ym _qr]H*" 1KGyHp/,08k<{@:fN%rlyl04q݋ Y(׸5xu|{gyA*(Yw%9Yn68^'+ӑbJ'-R endstream endobj 5 0 obj<>/Metadata 2 0 R/Pages 1 0 R/Type/Catalog>> endobj 6 0 obj<>/Shading<>/ColorSpace<>/ProcSet[/PDF/ImageC]/Properties<>>>/ExtGState<>>>/Type/Page>> endobj 7 0 obj[/ICCBased 16 0 R] endobj 8 0 obj<>stream -HlWۮ]I  Vn M ΙdSRޫ})O~_~|׷ӟ>|=W]ەZ߮_[W篟>5\ϟW[;Jߡu|k_O~|/8ϟIzhN\֮Xɮj/Ty*I25Uێon֗SYRcxKoܢԤ|SDanܚo<43lbp7 .4|kl 3<X`S͠QkXPZ -(wⲺ\t#di 9wrCP,SC;klÊ.?=eVP!)WF_Xrrn%%.|c/qJ4OSv* #& Ѯy@2O(sb@aT*,Sb U #h$$59rb1'Iyr[F /,P "A(8UT\|wMh%6toN=![5WcT2H;b1O'eU[0g"-@O&7pd -7ƑM~ mHQe ?#UE x X^;yUlqY?<#ʚ\5SFbq[ -e^ IE -t5s 4&H 6H@4cwhҍ iwɡqt^zM- Ã6a]dc`PR@5ʞ $SZ FR 10BC^,uAd !K땘G|՝c'G"z69$xcDCJ R49x$v|neGe7OXP9aw^)O~ÙJs(ސѭDpb9TvGsY,}!e`k5(\(#udL&?tU-߬ep4-؁B'=+kn1nh[MU٥$!%Т2 bzh=_\1-;vY-sK[jӡZ~T#ؑ+5DQ:Z[I/DŽ=sA }0!t; a%jAPlo A -ZvF"N]ـo=}۩H y/ ?Dx0NN_ ]3W]x]ZwL>_sxlqZϖaWtliPy5"åaθpDGb܏:% VqdA"m/ %ˌ4hF7@K$|(W-,#e12FF01C% =k6ޱq4)p!~CJiB;6~U./Y0v&}_"PcjrCmloi# iW& Q< nషl%՗!k[GWp`95`|p;JFmQR-:"Iܹ^5H;e~ -P.,I,oIF신+\en)P~kculjC&8T/ݯͭ˝zgnr]k<%OacYEVTj=I>~ZtMHfe" &kSLcZ V뜵pO+g1 A9NH°ΖMp|v INgj|ؔd -!!_z/}uR.J)r:>*n0- -gwL}I 'EItE> `[a@ #4>Dt5 VfqU6 ܄/t;2`BAL|{+ښd4Bp}N5wKf7 -暔5>i^rX2 )Ï}ba Y2$ -V[FDd8e6aƮ2u~klZc>z$_q+1뙝Z:ľakH` 2=x_ߙW~x|Tu ~dp *~.N&rЃ8K,r8+}Gmq~1k(~cm FSY"n_qV;7^ݽa5ԴJ6z ގ6$sA =ƽn۷M[=P÷P -;8ƨGfC ^S?Mԥy)b%9G1U& jsRx=!cF2;־pkR񥄕><,Ւg/#KnCjPexl{`TDݣ*2Cr6D"AtTxnBQڈ ^"4P#܊~"z4Bͷ@؋jz#B3m @pDbnAAxУxήys -bc͈NV -3l;J -)VT8t\h/M|Ʀ҃+:5^nbRki79l/ ߮iphAqծ]ԾA]rCY`,ci۝!$ ]E.J@L<qrIݩVEMrC_?_Pm( in]X-Eڑئ6YbJ[ݣѰع`CqMk$`eiah,\YˣFJ%_ Z)Ͳ1ȢOFJXlcBm}jʌcߴ~bAI|Te8`UdjQ"XLoӎ%g"aZ7)s)굯/>8`NOJ)dZ6. *1b-|ll=-o7ƝXKGT` f;t -A7ݐ1@ѩ>3 -xL@$}BD*Ȇ}Sف4*q< 4OM?K "EӬ@g9c"co4) k~hף$q.mX"EdcдQPP\ciCa&+GW)# \l}{ }<XrV8ѩ<ݝVe]=1 - Iͽ= -c Ş#/ЉdJA'zkQv 䶷 %}oDlD,sZC^D$0)>{h@_1!jI@`*&]S>/򥏊Kc$/.䡾@nH(uC<$F[t14ԧߡp#6}(4/3Lu {%&F=œ>d0F1qW5ًh&&*'t*-g1qm_ -ëRqTlDY_)zd^4Lml -6N0<XC1v3LVlr҈-DTTB -(b#$knY;[}ǷR&VSV68%SVFfEE;;1P5-淋XOKS1{ds_P]; WA\gE~:o;U>H庪<{I sϕI/1'A1+$HΦ 3Dzyrg8n[h ->ڪn( 9"CLdN 5Ųݚ! ]QT~ `[!}GV/:7@f>ּNZbTФQ]SU*USoVb˺8zkx+Ƣ\<ێԼ^M1O_q0T)h{ - -Ͽlt(n͏#^ϛ~r Kt*|:P\(dd sI_ ϜipENyhz.FLuKD z⍽1k `>14KtAI (˃R?/0K:]h[Q+Z.~ִ=| -F³W9Z{uD8 -y/ "esza}/2Q\c Rع;0<,S vqk]f^xi#94жIQĝEMZ'̡hupޕBA1)ŠiHe)|̳\-|<2սk]6M*nr?5a4ty4lQ1aϣ[<:Yl#. !0ݐm|BW]_hHцޠhlK^Q!L׬dܚƆH &_Ku=:i5n8!vDEZfX4/;5_8NVx1KJ-;KHyi*tx%M: 0^:m^'Quܴإ? q-h 1Xx/uw͑l蛲UT`VaLdpr׿^ǟ5n{V4OXDgLhLĺ*:A9D䐲 o>45{96j@cbU!vZ.2%AW;35xz.XF) r=x|ݭ!`|oO\x2Yޥw/bYbMVmO&jj~5ܽ1i;d1_t7!/P7C#'. -^m#k9*i/ICRgi$/K'S]M_,E┪&ӿ1*N5fW݃nqw6xoI{jI#CƖOWSƛe-Y0ʃëлeģ"d8<_^6d@ &hڏf#:+W )#).\|R1_A/*[|-)m;-K1~V?qt[%VqM-׿E7G~wU?}߾GݘY^Oi  Tj__/O)eQs- -QjmnP=\8а %߁Tq[0-Kq,QbAoi8&]669{j6؞2EC0,u -Fj"#5D@eLxƅ9ǒEzjhzƎd8 e~MFxJ''. W9{(!8$0V-ބi8Z.\(Y <<^%Zsf6iIR}v#ZZCver".%{v=ZN\p;…6'iO.Ҹ'.zJLsx߬',Mf g&Dr2O7'>!WLއџ>X];ռ)^a\!en G#Y=F -7[9,RB'.q[1nT;DoO+u 22.uEN bvav5hLZh[㎰m$e2K5K[F}|$*NL#bd 8#aځVwnX^\^ޝ9C\Nčgp'O5ju-%ao#X]bp?gv@S <ӹQq>_e)y[jwgyKK5aܞz -O<#EOUTђŻm ܧK |}0~qAvsRy?Ov+D=Jh"aGb/]^+'jz-g6{4jj*L]U?~1D+ᗴVpL{'p0*ʺ'pheʈ wIj>Oh {%qowZΑmZIIZjFKSXBL ÷֬p5~]c˻x9FD U-{zKIoiͻpw'k'םqM'k -Lxo3R%"næ5z?1~uS($bZ!1lX9NNXI.Y%`w0Ϩ^mZcގ~fÓvx$UNp;ZV4Fزk5doKI#pn"=24Z(z؛8Xk>zضlo# IeFBbF0<ɕ7Nq'C(2XKnN5omrun^"g;&v -+i Ӱ.#[\M|^f]OnUUО*\=1}R$R[ݦ6:v\֒x[g?3 |,_fbq ٫k?fIӆ L7|곙=^+wnڨ9lFؚ5A[r^#$`Helu*wNw4ʖZIwz)WOy,~x+&.n<.xkV[uEuU -X/1`Aw%ܡXlmkF ڥq{9\[ -ŠfY:;ꍁBekT65Bѹ ?c\Cep9AK!=:Xt{W`eڦ;zˑ^yr'4ϧ^F;7V=g3_ -*:.Nw2M^ĕ0k[qu&GAS2<vPW4_MVy~˸s[OţlƢz=]Vqz%;Dr=|Tn=s=_C(QFUnW;yJ;Awܢmd j2̉qu،XWYE:jRQ~79] ->j ]pOsWTC.t|mĭw _z>[y՜WK 3pq c"1gɋox?OUrRckVY^pT+(>oh07V!A "jnU\VoT7jfI)񇧂o%/>Ԇnvr]nzwH"x7N1__\RnNxG0o͋Ϗi(šaf,B=I wʖ9y9C`xʏmQeVCoJL9DIN)A1}v NN@ ܭaQ[}C+'h`F&XT6ՐaZ;eX:ZQw 14Wu>v7nͣVr{ًpqcƒlۋ#1ox9|CwS UûAl;bo780DlzfbƒE`EHm~p7cci-2.i'=s8Ol<W mJm8޾ Ypq5mr#To'ipSMbqi}bMK9? ƝB$:>6㌃ -Z.zgҳ1o%5YX}\JX~PZø:Ԟѷl `["Ǹ52ctPxOVl_ffuznYo0xb{ Vk[fѳNDCdIHX楰#gh` qږ=i:in:$ZvvքU69:׸s ¼]}x[XӼ˼Ųmn7mTnYwr5spZ&?gޮE43'.ǎg6܅&1p >ر/ɓuYsoVK;D(Б]=L-m;̘WkJÙx0p~Ku=MW:o\Kҟ[O5 9maR؂2_]n`gX %Jct^Q -ݚӤwq֥y՟'C¼e{x{1X&/y)j=t5`=Nb8A˃kb7y,7Bk-X xKB$5Tl'Mv:/ny 6V^6χwyHküe*xG(awE^tr}^`Zy~QTvo}Z6o%vR36%[mOį7y';+G{:scغl}*.M~&pTmm1Hֽxa/jA;B1,i:€PNG:#ߖsjMHĎP7ßĭ?Opp$&\aG23WcKY~*z0hںXblAkh&bes16zỵ_:ϧ|4/#Ƃ|qU"Nl@g9v0 D˲5," -<]kv}}VևM _"hJUA->T=u빖;\ߜv(e}vAY;Էbrɹ춁 -zwH@dύ 8@aUQ~9"YI!F:v]!'`o;c+)@Ǭ3@:ŵ;j(AIf7w^ԜqcILlߧ.@BQsٯ%L#}nʉpL6~-zE=ǘ3ir1:|؜ /bC -Sp.J>y,svo.fOj'׏ih -ac+Rx?$ZѴK{TWd6ߡXO$] -i@0tHL׃|6 ax|Q|HpMɗ&B#Rx ge=;׉Lw -j]'ܨvpϩnox%c?\l]ao6[lb5o躏KwƉ4b54NMCN>)> m1!ކP]x 3%vqZUmA:dcyNe]YoO \ěF?aleL9d!ߚfގ-­^/`/( OGOPFZ}Ij@=TA6TZfEǔ飓nb5Fh=}hgYHbCfMwm]eF/:NH]ݖ -˲\;7YW/@:smKTG\:EWͤ!jh]95fum<1 u`c_ ^‹A:U ޢ8t-jRh-Kr-kC__c;;+*}JR9 Z&;{o0Y]|:wٌ[/QV2\'6X#KE\vBû5\k~F޶JATYv^Q%BnWMWpyHXNy9454APRLTehm 3+p(5O|L"1ٕG)!WJ\q;A5eq쬿WVL Loj -2cV{`peRaS( KdsPSkmMFvn6GgMgjupp#5͠7/[{|>n^:}]UVK0k]]np$>zN+QR>,>!koÂxfx|:T6|}'{wFɯxGr|[J_(6'LX:48OVD}٘{^lQ - -vO 6;f_kwU^>,ҸxF}!w`k8Up}rS .piF>d0ӊᓄbxrpmY%lӤl]YGUS/NfzŌ/=F+f)$\ -UD Hsݟp#xc@߇.AP|6(|G|1$eΉCYx6 3S<[2IxnK96c~hDLNeu̒QG̶Y0ߛ@۲tD -+4+IDWc=O)f0Y4;g8ZyJGdO5eLd) ∾:t8^fAz=;=8Se/'3hXH#t5)]'ّ0@p?tce9]*+KO p oǴ)[–PVE,.zjF?@CYmHVZ`zj[V+ OYUxns߶^}b, o<_s>~|~zl\mЅتh|BbbE{R-Z*Zinݥ@' ^G6kIՐlqVqm ]4ߵ'œ \g :75HD`+fͧ5G:Ik ¾j?2v׌닋O_lp{{lvR5Oԟ_Qy( ԚLjWX|ә#p lj* 1M6F76FUNjr#aUw/XI` tk /:敺Z]qs]qu`vm+ p ?P ͻ+r[8ĕVk.[LشU5K.Ukׅ.^c EZTbrIZoHkbQwҚg_Z Va-KOZa%-i=Dk˪~EiU\ZgWNF֑-l}3Uq~6Ǝ-/a/9/}V;ָ'5^_K5|h% #`|qkխժ G{ϭ{ҫonkŜ_&f }`_5q$fuj^<雭c|xL<0xʾq >tM jNӅ -ssN^z;clǮBA]j*WK\vFBjS230SSM]ͺxu \Xo`xj\47D5PƏLMYr -[pyµjSI`eXU-?7 Lo[[&b*p5S{ol#m<8c3t`q\ߗW5]_llpPF_xxn)hUE\_}">k0/aK5J3/" )./(ha2*מ7kwP -A7!έ] -]uYd[l]6>+O^Z|ϭ{W 'Z]~~~fV #ϊ -^^W|F4IFZþ 1g6L~4W`fx^s'|Q!^m9f*˾Z'}k*5x`A+ :[#t2L'0GlCBw^t5uu6J誊]lN]K uڳj^n\\XGY??~C\xZXmgiL s['Ξqp -|ĵKq.`'.,-7Y9~k`zct5q펛wpwDZ5w՞8zԌV\_ypvu若oqg/K oiT8ކE0vM -+kSQ5+\s0K - Mfɴpgl5*>a|eZK8ۯV_Z>v+bⱯδ֕Wa{ ` V{#Q o ll3,~ja| -;Xe+G5kf{]#4J/vNnwX*OZ,8zV06sٜ7~U6v s+fkl iq }o_zN8Ev b,=я &Q :}¾o`rOfwl+1.mWoǨaa֝*&a^h8V>cغqVSGG|lz~}홾+U8>)eqs{ ak\Iai|דJ 0Aay ֖`瞟&=G"1RI:+aFo . n>od}бP8lK4V3O <,ʦQ-e}FdQjD1e,MLMת8HdI Q#4Ul} d/P̊X"֧TC&D -|p܈9,ϔxhS6.ZM,@h(~sQ{E ݙ4jllA_!5j*m VXX=SJbL3 Ɩ:qYmy1Kϱ`*+T6ʮSpYJ'sa)0&^隱ßmèv(nQ+[Խ} bяp+f qsU;bC;خM*٣E}TPkOb: K{s 4@n[QfPBAZ*x Nʖ0>FxG-Lw.^Ut푍ep\Ըl~קu<6u SMUp]F5@4JteBTDAU[R=ޞ񔭲W` -\ KO\K!l{*=7(W>bj=&=k a<;0B|9XC^h{"H*rgnCD)UH Rx*^5iU)ϰrPFmwapf4ʲ9"+;VðZחn)+[_ZmsV kI,OcޮvM6]U|uY: xĉv<5L p[]5TBW!#1ݫuzߍpd{MNY`%˰D6mr1s+FV'%FbL\s W;Ws:V-Ur[?ܸo> endstream endobj 9 0 obj<>stream -HlM =x刔HJY@A' CʾjP~O$|jt_Gӆ??~imxg}枃D l5L'\R\1 jđX.0W -0dlaaF)lXu\Y)oaY -busŅ%K$.]tQ -PWp5%U7e( yqXQz͋3O^+ϵ{,¾%/E$]/V.F3[mE3lk}a Dž/k1k{&y5f s @L⥚w=}5Frپ%j2UzY}a}">+qem1fZLAwKc D4ilIhĴ1"p1"VOb\_m~.ߓXͱH!s~B cZCp/+obieL/ư/ʐmfLcT0el0Xi 9ǧ`\/b.&;I2ظ$vnJ9$.ظg(S46XA8kTƤU&f>,NcMkXIa<r1i=1Y[Âv޳Ocі5M~,ߓX~/֬c?n`Crdu3$6{)+a"&s5QB35XvW8 -OcִUT1Ҡ/hLr|"Ƹʒ14UMcbiLcI2lML+K -MbN? ,|1Wx l XItޤebE" BwC',*f9V8Q6cԳpkRAL{&xOa9x]>}aIX~%ſ=0"ӘF*A'Ǚ|h ] ~&ֿ!,Gs -MrƬ 5F Ie$9X"VF@3- l l~eIH`3+/;Y%0-@:<禰lnVX+*u;z&$NbI+Iƪj@L_J`XJf' O`󌓅i^X:7GsN*uO=,,c=+ *_9oxz*bLl+5x A'^|JWH,s8,j+x1kfdV(E^y?{ +Our<PA9+QeV,pUkȶw`KwYeaAg\-wi_ -XoWۂ˕Z?嶎Ct*@zMpPw}KV+%q8FW,4vwΘV WY]WlDžjOW~^rnD7oWl{r%&Q>Ӆ kc|Ȋ_di:b?!ɇCΙBWAZZY86;bO|cqj#3}gg%;bq;`.U~u#qV5'lu3W̵6~}T!:2sWY3{*UEW?3^1sb0>D))v!K?{pl +GSi!:^}&ag / [乞"(T4K kPRjfbZ gFH3CX/c+V2 q+y߼G)C9HZn^Ó. վJ8؇tO]@]\UtX(FI]}p+5 NH]j6G-˽Qэa葉jqʤx|-,yF&3 X!kDM^NwRJd?^Aa[ -ycWP˼F\^TZ{=sCv@Ke\_}q}5

A=ILG@l 0ZW aψ7r&cr  -Sz p{ -E^5zOaz\PC l]P9$箥aonbbcV$^[ܬ/64ǭ[-lpߕqS/t!^%83ɗgV8[V0?y2/f59`; u9mJ. 8Ֆ}W}a)wB `69=,rd2 ZUTyM.S+)| X!5,uAt;!yp_8>0pBb[-R}XEC%_Ck!if)^M[:VfHuQĢXKaG=rebMqP kv -ӠC',X3),M{Q]0pk.`8FlGhG^ [qYGn"p`vn gvGUP^{ힼ '[T -61] }Ik MƵa -2 -K?n‘ VCahh)rl; 9fE*X10d W5װ)M~bߌ2m0_: Lj9DĆd(Sl#f =n[:q0Q +葱6RJ{ "[BD5vSoߟ}>roV7y} W9K:ed_[+`2Xp sꇁ5g0dj`1)?$˹3PTlHXPc#l`P=uN3` +*b<F5!tkbU.b9T{-^ȋN^}Wr'%_K+<_?p1?P6VP[|~C^rF/Yx_x9}?Cb/"/6Z*QߙK/(HO^28|dq, 5BIȋmktjn~!eWWgU4xM񽨄&0S\FX+r^n=$L8DL -ll+'%`US|f_s]_:iO^'0={.#c_ɒ!K_}Z&vkk,4"(ڢ5qm>_mJZtj'i8*0t1.DZQYI08{85%{}xxdY|5- &X1BoJuQčpZǍq0s1oM*s%D#aVhTW^+=y}"jqƄ5O|9&Z5h-r`؊_l5 5ضԵ->XUغj{J'XqE7 X*RZ%:G=E -E˫̫ Y;EO`:RVWXkJ+IT]~gӓvy -kQ%l4a#k'WRk^ƞ4ss `24;z'HrC94ۀ#cc/cce7dG1vi̽G6ӁآskQ^t l@+kՒXKnQ]¯f~޲6h3;&yjƮhC[1]-ҖShՙū'yʑ좋[ߴ1PǮMceyʬ\nuIW6+ -Raֿ?rx{ѯÔ ^WcjL1 N Md*|>lFgNq(^E2Np^WofPR**||8pU* iT.<]C* %VJ~+jYN0FY;VwݒkҚIKi6%d}yk^t&Ýe}qrQ[0j–TQb5gR! %<[~SV'_U7Eq;cb~|~Є% l'/zH /Wɸ]jqU\E`DZ\ JH6rP#Ulf`#;/L$9rRر0w.sM? L_v:D^89JK+d€\,_>+})|2ɷc -^-)o>'/-=:w^S9Sb'okuΌ{-!?/q֥x]:՛q'fSH\尫Tዻ1 fs*Fm;-nFnښlx\x-iMN \5K:5i\ *,4:D-_AoªKfikPA[}+mahk׮N2^_VVQ䄓m'>>`%.LtUL꿸jz: -N)cb,V Z=uْbӼ'\q*+6}' ֹn]q w^YEרԀ/,ݣ, rq>۸vY444j d5OV.Um[դ-#U5 P9Kr2䞱3UUeѸ2ֺ{ש=Ui(6RU.XkLPpyW,,9E֨Gk7j)+Hq,}ɚnDjZ9MB[F7IJk8? 9kކ W%o⪎Ch]\{$.W)}׸)LZz5>^^Gv˪Ukf\aKx5k jռ8W-'™lEIt= ?p-lVU,ϏPX@a/H{F pvk$0fv]M#=]l[_H += ői*iS5wŖgy Wc`"ʩt?N`:bËq 6S@,I D9HE9^r<\{ -k,t[ LXz qkHe5tԵCE4ӿ-a#)A -N`Eᘵ֦ۈ l?T r;Գ0f? -nm:3xGUŚ<$iU<&EXg63X`y1zX]{f沱1 kMcc5c[K3m%+Ƹ4֏oAC`N#'`j0~|~Ȑ 0,Xs\~16Nxrb"VGk@c~geWĪk6Co[Hڔ0G câWLa],b xʹ6Ol5o -BV `n7/k vpьa!^sWKj}ؚUq- FM?7T5 *d?V;[O7ʹ"ؚigi[Ikui[ՉK8a%1ό`LuduBHZqڪ+WQUwX%U d_AYSE -t>WkX7@/CVgn pCX\m=>UT˜hU [G"Vg .^"'Bc5-veIbʼƖMU{, -6^\("| b鋂[tۭ {hB*+Fs`a~p0쫯-_;}iфsɋ?+X_'ԥs9T}1XԘg1>??~S gGy/xd+.ç-t)T\j"lX5*'$R+seaCRY[ֳ]-kXrZeZqa{CFqF -ƣzvZ{\WE,7r "y_(Hj~O,ڥ*jSܶ8%s |*Hn4t0ms#MFZ޺4uao}z+4%| E3TlWn~v6G뎿,/SoNb.e6eupujyQ&}߀#5Fun߸}` - -X6CxΥ$e+/U->F`^ul>|16-C< A̧ȯ<'-?fxb9+ur`I.^Ig+CJEW[An 8|LQd{bZ&rn{~~\2cud1Ab3-ϰ1曙n8c>Ӆi`*-!91 !#rn4RC# YFsī ;oG <'[Dމ̧pd:ybsgX1Qḅb^vpZ<:D=]2 >E"tբ0ǫsX׸JaV8l+ؕPpq,X"DNCa! dbZk!0U[ء8.nLm?tahC†C- ;e79T:dBM[!rs !6;TdD2 DrAN>3O9U쁸5Ps -bGŐ'e|;!!n!DuTk~EqE'Q!f!>q$o$z}-q($-4vC|{iy(5N9)Y*"+)"w6%q[".$rؠ3FJ\)?)K"6=%B%q"aDD!֓ :) S;m+1 s RSm ۯf`"3A:24{< a8FSG'X1~_h㌪1 "$aMbA$8}t'KX\9Z `%p8p.yr!T -5̧"8}E6w\AV%Ȱ*aQ`Xey8cU-m9L9lUyu2;Z _I[&ֺnKPμK/p(ao^? !r9D-=Ӡds*054w>*f1av7KvE&ƄfI5az8zP]tCiQ8'VB\RqW -{Qa3lJBB0Sѻ?ATV uCً`ϫ(3 [ FF/ }Smxh_W`C,;CkU/GSKkhn {B4Bf tsb?PpJS -W9p1bTk.)*?c(dc -0^)UlWWe ^7enb[5tO_slS0 7_Uj /BJ-}jl^_7_lIj&g`E/}Oo4Zi -vTƇTX,[w,(YdB.`~/WZ&mTHX>G^ĸM$VMXY&#,bqWH 8.ӣPb"6k#_S#xͲκ&?6/T)^$@;Nkk슗76~n@+St@.ZuVg޸a{up͹?q%rjYY___ -/җUutځS*\.>8`YY# -b#ObQ\C3vW8L&\hz\'/BEy"ZU?Vjšwx,ў1`}ZIRۍ2…jXmzz;%+` ,u] AqZ3 N -RvƺQqo -Skްg#v)ZeϯK d -~87s!TЬw*20"60ٔ!`cnk -.,[_=27kF;樏=mN 8WnW_/-U\g+;K7Q^Ul,wklu>.7#?^}ydƛd,^ şz9"f.<}qS 35qD/֫@p$f y|MgRLŸs~Uxr;˼cGJ46eC%5oO]ER:7nc]ݏiqF^4\a^\?v>>!` UiVdbFI}DF6}(ڮ|[ -6%k @Tj=-,,xC9^]4|q5G{ ;'er8گNaiac}+ĊXGbT^Vq5GHc84~q x0B&VfP71q3 -c)! ڥbexRޟ}bW,wy_-E_+^p|m<)axVbg\GبUڙs:\" ph%`k LSH|` 4A1έ+)?jxËMŞ -__kX[񥄵ȋ -5TwE+3(|טv^y{޾c{5x1Bc - ] -k0dld"Koq  4pK=fMl-v/>i1p?EqlvŖdԲZ&7NqneW7.qtvWߦRtlM_Pǐ7ܥն3R(yp3R,~2O{޶g{hA_Z`ԗDEC%VPJ[6cc#XcXNO1 dGjK& G[ t/찄4!`.^biq :Eۭi`E< (iwX;zE=z##.aU/mX' -K -`xݽI +bc#nG&.a[FL}ցah%] {4W2+[@?+_q|"_p'"<})`Cqk׊/( w% 0lnO -Sq;@r+38BXr&yoa{?.` X l t >.!0[(e,s&cPⷊJzC3N1T`&僤82" );Υ<-^kh+ kAʚ W-|Y+e -k^3./Skz5VXx#U ҷt@'U%k6M+%+Ɠg%kā~n>da# DU3c$j%UVwj>_&eu-U#r{djfP -̤.譚=fuf)](w5 -o<3+ז 3)yi F^kaW@n:ԅ]qWsjjuiQȨ uaGK2t@)jLgðHJ82>po(ZqRk޴_0cָ?VCyq(^ϭ{†'#M׈v)g]Ա - __Xf-_(Pu'jG._r_QΓ-Z8 ]+щi4Z~}WVѴ5 "ZY!ARW_S5էxMձE𶋋0 -D~q\rQ#0mZ5;q(`i&`>޻7>OƐ:f XqȀNk,:j&t0d}[R bJ7̒렍 0q&}ũg+kW` -[RnsLKdyLmЅ]M1kt5Oȫ?L21}-5;_y}TϪ:I_W=n@,N]|eT5}87P.moZ,_Z|Ctսud ǕjZR XUw,Xe]ǕMG(p5]uv{j1AB֨YޮAZ=J^eCEi>@~hǵ\\)^KTie P6m.thP :Zgtyo^س1㧯r*?@Uڡ}v-w -˨U#S=q963]W1->k0sWlz^Q;&qĖx[$q tű崅{ !VIs̋KRbkdCZhUR-IJeyV ٓ)V+w1N\׀PCcaM.!d,{P%¾~n#l} zTELbo_VQ8BQ~KWoK䲴s0 kv .S-NִYiS {krٲkkNqM2{p<#Rwd4C8zOqK3L]^\P2;kWWq° ^,Fn8 .V<4ڙ -W}Qv}@55~l[װcPzkVClTu u#UV}t?ẗ -RVc M8p$<֩ "S#\v)һV #pDKLEY_~|!ך: i\kTOgJl -_k+A/RqƩ`jg3  C{σkybQPM j#p}K:Up-a0seC=0 n~s8@ a[==[R=zcTŦ/M92◞bi"ZyW* g-_(6:  } /'Ø ._^ :髃.~j9薂N-+}FwLD-_,h7 [<'VjlmWWo_Xǿ0V-l!̧a~ -wY}SXZ+c˫qvg4}<(lbFk|4591#ȇ,vbKXѰXr cx:ʍz^_i$c\;.`j=H W+bW?k@,ufS! a)bBWpn(]c_ u\'UC|j}Oz>4 l%IJUp~iZ{=m\:VKiMHnejZVډ_=PB.> ЅƥqIǺ !ۺf*YՖpuq=崵Xf=yl]fz!3#wRz|8 _0`Z8kZUQI <.2eTW6J9LZ=  endstream endobj 10 0 obj<>stream -HlQ$= z'"BsS5sFꩤSW˯ޮi^ױDmFD\۫u05sa__ky]_%f߿?~~eVW:nx9+{/?_?kr-1ʁ."# ˰=SqnYrQc˰vIJg]7\3db͛#ֺ}5ê[Îbm9.q7:m`1`W6q67B 0lB Akk3f`wkF{5Fh:cǕة>?ƾcĽ3SЭ% Q 1^1Eݧ"^#OYHlx m6Ex|>qKt{qq-~Cc'ېN)FR¿6|ڱ !`C `a풰% .b17El)bsHl2oX"懘F,bf 1".@YČbYVo{'%w=');Bqr|0=lTa-8UaϏ[$p#l|q0%I"aE^|2א1Kׁ<]2Ec=EDb.b; /D5fkY~UĐ0E Sc#>N#t$bV7112{ X[һO51c)~ 9"јX`&bnd+̬%HsBlq۶Z lJN`&˗/ 2O7-_c`̱ 61*bECˏ/_kFcK^͋22NOϛW -Zu„>.^ު*xeT^5'YR=y1dbg[EįݤKnak$^1+ 1QS!xE -8y(^XkWYXX3-_*{)`LوSf JIK\JX.sF:CccQ(a=5&`-OƜ`2,`U"bMv+mF bU keU6oNW_ŐyS3ua_ uJ"2{b"-dz~Wcsʮs% #y!$Yy<٪mC\_t]{YmWQc:<]pl%Sښ`+HEFڷ-WsXdPx|ÑJ}h00e"yp zb_M\l++m宴uX֎ո>([6氕,@-+qE'l=y1fѭȫc2LΘ^e?}~"b8܇DZo\ix1Xxz9,۵u<B--FJhnsV%lIceƦ!2Gb%lj@跰KXa:;\oaҔ:$,*}G_x0bqV 7`F C|Gº*-<36s}&Ƃo|!(Ϗ[k.{g -Z\ +g^ʗɗ[b*x_Za.hŌkj]o`YOPۯ??n:\|־1v7ʘVS֑\蕴q$8wv2G~YcD,+2V=ob"fv&[k<"!fob'$6L°GXy*YF0QG{ex UyB_ cEa3~#mYU031% |PYb XIObyN^۫G{SocusA11aZrs1rA#z7)}=u6COB -2ՊռU~w(bq$C,fba'E|ʜBfwLi*d{=F>O?eqI9p2y1U-H`ڒs>X$!F9&wH%1{3D64\E>,EA!{KaM+KRdvzl6;RP_"k_DNL ?\w<'g)VFmuhIW<6r[!lʸy2nw@v;3J.Tm걌B5<{vCxMʂs]H;e5e0aQB%͇r4GaHvٻ=eR+}dZ^oBT4^{-,ByѳmEX"5měw/ffK3Wi/1"ͰX> [H#j݆#Q"6IQ5臏?H7\dFn|3{ݸV:g4WD,Y߸:X:P0oD#i@x% !Q5Q=x,H6|ؑ~gwxb2A ڛ7p63 -kuLU^G*R9FK Ŏk6h_loFX %,%e -{+AL鸢FG!>WSb>P%#xⰏW_*mc,"Bӯ;"B)v; -ƖF6qx{0xC*>LTȋc|I BHP5`"<^ē|!$[ěĝĚh3x}{*eґZ*!OIcz'UAjfOO m-~zS#ήlEURkoSGj%J:He;uʃ+\1jvN*̯:vc+ ɑlV Xo_*,MIwףhݪ[}Q{ss1{:ȪO` ]N-.=|)1dU,ƴ:LYE.]^"Ҭ!a4Ui9*f 4ԆRǴ&2cuf"TV;;v8H\!#]5|ax25S>)!!qZ -ws(2kHiڮ<0Dx]Ue%)+)JgBG9Ŗ!`wmqQK">t{ bJ.ۻ K4\؞Ք=E"K -?Mmp=Qk)EU| XۏMyiVQ\6ϸŕvezU :ՆxݰT/Vؘ nA]u'[ $C18D9]=]!'1-:N"PىgTICGw kv5Jۚ5IQ|^7xV_s{SJ5N'<&'7QkS-࡚oooϵMz]a!ޜ,}bGV_T϶KP#v4Dw"q1xN۹q?`iKV?կ x=!% -IvWSϜXAKݧvi$Z-OEĤ;ًmNhb+^DŽN>^ْ:c'1˓sb4PM^kփ\Scꇜ]5r7,sG/ h~Xg[ᅞܑbܵ&f:_?lJאAOh H}J;wm;ps|US.j}jF>xŎ;mx -x0UvUgkkk`,`9AwαVnxtb#9. AIQJDVֺ?UT0Ю#.N6+I87aUI.$zǣ}șf<:wՏtVr4aDMx,TjV+9k 7icI@|셋n2J%j_΢'raێRUҢ"3$N}ȏwu3yγJc_N-(|j;rz #F 낳Xf尿<[ɑŤ֮saj?^7o0I) -z Sx/.ULoIWBEogG#WF,K7#bz b4fu -iuA;6Rm?b-8wPRۀ7z2 ~ݕ;š(+N^n]ݦq7M=; Ekvu/S+z/pmn' w}i&BߴFk>5%e >.+YeY9[koTP|iw \H8ɥj?V'ۗlgi%e%nㄲ/3ј8@P %09AIbXqۑ-6]o*׬Z FryIpqj0RiYjXD eyru]g DjĄx,͒ ff3/% FwX -K&?9|k~ywthklp9qZҰ\Ev9G\\.v51o~Wh6pŏPB0zӨvpB{{ocBv  m Y&Q.sq՜FJ -9҉ Me &펕aK"RM? 6+>Y)q^l?Dx'VVEl\8cn -Z=$zI<cg탦vyމ%r> 0 8'uh.`aNRC^`\G (Y'^lcky'vކv$%R -NÎmi'\ԍYt- 7ϣc>p18N6|3JܹT\I. -Ľ WF\"m3ݱs`^Lw ҂`=c?ZYIo,EݰqAX/ʊ ^ɜvBD6"w} 5k@Pl@q;>#})FԘE׌f?LsW0؝W:HL:VXMЭo >K;A j -;,|kk+(5\n2%G=˞W~՜ *zu-N79v |3^օZrJ(RHKKْh 6"s,% -5C>nc -y.HaTAdrh (,97_`pG8SnHXޫ&i #~g!;Ub&/ZN˟w9Nӻ8ڜ^g^ˠF2lMJZe&&-L2ʇws轀D$or2iha:Wk%"\t_12jnu ơ+M/2:+tiO̝YLbc{PQQ2dvTGhVM?'ULHiDx͗ (2r0Nӧ)R\)>OfF9:~<ל9¿Ox2h!!1X0~"ʻvhα fdt&*VМ+\/+c=W~ClrE7&w0 WѤU29G>vVVtc}l; -7kљM#k+3g D"=0CEmasWGJk}:LPcӲ]_DDɞD,;{+Vs3QuOspy'Ӳ)-w*jZ-T UI\C )[o9=׀wydD<\:;BIl{`QȇmwT΍>9Q+' -4Ah,Ac?olǵ>V&Mv&>$X' -|ŏz[%i>p"{Ҽ2ɪ>!:m=r>u(&\f#K&<4ŏ:574;gr"jc ӣ -X ay𹷎IS4jN^L{>nj~Ţ&XƂdln^%lۥ#/9)v9ƹ۽Vgs>-x Bg%=N^z1JH!^RwW]mI_FKO_9}ֳK'WYMU/`  -F&;gPH@+9-5C,nU -&ҧ7~2f­BB:4usrZ܎[G8^S&/&o6|Eu81;Q{)#EҫX6CNmҩy'|>ܗh+_|tgvj|={uR^mǛ}RcڥNs0C1;3f9~js^c8+|7wҮynw&g;lj_D?.bwlnwk_g訣0p*̭O!E'\-D|-l6 -z/WLSZmnn?8h~ஔ8ov4 ?'TӌwB饥8:|x@:o"ǣ9_5ں͚Lf5t6a0kc+#k4tO۪Nz_xżg̍kZi>/Ko6SZ'Rgc!K{#>mpz4)ڨ/JEΥ[hĝ];;0iLğFKsdxcQh -^z]DD*LZM7Ӥ:j2W}.O ذ+CaPgʚ]XV O9*;~}RKKvƦm-|IJ,|ӳFRɈNmbsn"gy]:(5ˀĈ `m};mW-¹'! |)mB"%[~&Ҡzͽ6q.d!rӸ?Z\j񸻰.ׇǺ- x+_c?.2Rᒝ`MۼzuVn{y= 3`<$Gr z@sW& C*g087 5pI:qTř[U!T(B詅( -8êrd֜YBα&vM<=EđqnEbSW<GDoLI/6c<޴fژD"2>'`V8tCAuwEf;M 7?_:>5)96q\t*jf,qNw.z%#FN^;oDGoTd'k9VLA&C`dYXK[=">$33;~ aҪ!w??!rݥ404ܲn !C-튌P !T-D? Y~.õ[XqƟT>!i-Ѳ("%h:E(*"Wl.{yh(n= '@pLl `JqpeBC-OqD*Fn>=|:e Ky8tj Z2ڙ+`f|W9_Iu؉m^=n`+KǝdAB ڴynl'v Mi]e,h(v~Cu0J͜b"?? -Ubg /[Kv]C|x @--E"TG$;O.ٞzuٗ3{B|}Iw(mށed1WSq -n7ыKDz*|673+Ot --U_ƅ.ͽ68bv찟z 7}K5Go wީn=cks(+cmTu;qXOx0L/ҽL3Mu'/7A|"lX]Q͓s4,Lj2P >!zp&=<_unv&l,O}8-qC9c#5zߔ$ru_\&w!m">&w2 Sii`m-i0E]Ɩe,4! k&`xp>G9n]5kڂW1-mYfIox}+,E+-  -u>ra02*1Gb[qD6V>hAm;_Mcg 7o87>kg]WJLz|:/zK%?ֽ󃝃+Fw1šprݦ@KbGi&ܬ~2˶O3o\7Mh3.p\l}7eI8jÝ -]HXt4x W~٢5VyB|ҩCkۖ:y u2*|[d"V_OwLɹ*@C'B"~'eTq}"u!6 V?뙠D"b.$΢d!`T5"#+M>Bgf>ZnU3- P ngvam% ;`P``d},{zTȳDc{9A 6M|ezL2U-{u݂15 0ؾR}2@2?W4ڭ>o'yQ}( -aG6PoLJkst'|Pb^/HؿAڷ$\AUzCʋb7ka2`0Oa%wΆ`_PS,?;rbq _?L1Q{5^9==;3lN N ~NŶ/z!>Il~QMc#n|o%Y|y><јԠH?w,-۱Xb!TKB e{CV8ɹ*@Á>-a -*kH\-"  bz m7 ..+&@lLO&MĺvNiH3) Q\׃}2YE3?:AK+^:nʂcVCy6Ql5݉=|w|[D(Hqk|{+Y;u՞[Xn? -g쿙>w·g6tkag5MDpv7`eGv2AwgN40?_c df-jn yW+a~=]W~)geP -?`3Z!8݀Pp&(1ِjHpUo/\l Ӏ(ETh_y N4 8R"8!*wX?} &q ۽њJ4!¥AA6H -a9u6'l1gHPg{!,}# Dfhnv`Ygբ᝝"+n1Ba]E@ƏLZ *{.bgsL:_?SK+#G_ AW}ZW -d!0;)ybE݁#NGkPd,M㦨7oňUC{?["{E|/ЅOu۩)|}: $'#__6}s_cۚ#w'C~YK;nw*8XEoGPH O9.R @ls/ endstream endobj 11 0 obj<>stream -HlA$ EOPw TZHJYm`loIFEde"E>_~{>OiÚmu`cuϏv?d?vp,cǐq{̶;cꣷCC?>~Qף:~49j[%'xQo~C\pFt,v >!@1I,þ?6;#/+>K1阁!Ac r|̏_Wx fQ ko{`6mJMknH͝|OwR}mq8Ă.|{jz\c'7-~Z~cG/~Xci'H+? H/̠?dž:'/«`>Id"Kl͍SBdl9 D zoJEFzl$ptGf"ӟlƀd8y-!;_z,x< )7y[f:bCg䏀'Ug5Z}ĸ--bMlcK29hcjɮͶ$;S76cFԞ/6 կ=wX%1~$< -_c+ $>V.ϐ7wˉoVV|d%ko60q?'97waһNYb[pϷ) IDR Wߦx4Cz7xޘR(t oBE93MHBNt _c$$qU] L U;fVڣ^/]Ʀ Df%> j+r%jǷ|;C@p\ACcl솄 hbSz[*#>r -# zGߠ4}nNqfA\YY1deMNrfIbt91C?-4lј [zeݑי[-u9Ix@-n!a@ z. z{7_<%N -fPד^B6?- ͧ2O2j#z Uħ#` JRW[35p<1yk߅oMlV7pS 4.fXgr1V8e p~ǤI~F|6Sh~ ٠`^eo%i'={ -h~jMzG»'/«`A _IlQ`n ҙd= {\FuP.ib,4ьge~ _.xa\m/P K7iѝqH<z*+w|aHpaW$zf+#!ˋ96!ͧ7k O[*aGznQ;Ƹn oYWgE >Y[,)/ k裸s 6Z{U5&p-5\+Šu (_/шNS2?&$A#&+Kj>$S_l/[珓ДO{U6 'CkoGOo'AjJ۽&@ҵ0q"3x$%[dBD:XwYFvhJڡ*{p :qB/Yr,Cct.-3;V#/9{zeX@{sKi.M_Z]^Fv;7ޅ,QǷ8 -0}RifuhN)~9[#zf~gtS?BN_/o߉j, 挍@~|lA{bDczKfiG0 N 8(՘|7#VPn[P .:Ύ uc"-HٹC BScd69m(1 _x.L_0ytXw5ToEi% ֽ3%M9g۶ˀ6is* er'P_ntD`(0c8EFC ;PMZ43<5y&t3k㙐(hu9:{'5ljEU\X#䬱FUjp5:} o)D -:49!cA W)>NOфWh#ùeRz]OGl s,!㬬%tzbzzÕ< uvvqnS@U}S325۩Y.-&h?BIfJY^^U - Y])=*FHsJ2vTHHw( S&!> -TϏ-Z_f ,y ^Ӂp1>fWDsi-H-exM qie&-q"-ee@G.Qkm\v]Q"bz\bM Uİb>`QN1-Le}sLfWGb#kӥwGC'1_'0 -h6BS>S:!{>?yP㛏^sB,.Z8#EbffĐ%Ӭ01W= ĬX8kmbN"ƒVnA{K!BMs1Ĝz)IH9.Fd7nf$ Lڗ4:7oLE4C9d: g2"T#d< 2j Oǎº 1L^^zvS x59HEĜ1C5#|C 1+9 L? $bREҒ %$(AMy%[T9 CIಇqY-sqY>v5~$≋Jkq`>ch5WE `v7-Zb u0-1*EAK9u#1\mr=Iue0,4񖘎nª$( -.K@]ZY*jZ<]Z]Ιϙ&.r- H\D3HG\EFTψ@$uRplO\xCPgްd,A)]_KDz؁dRej -xY~awGa,f/auUd7O_܍xĒO,#a_Uqe֦%|.*;R_D2R]yW^¼}\L 0QiS560P*Uk5,ȒdƓE4_Ý &NLEB8Et.1ZWLM23Tۏ3.2n/HdeL;Re,O{^fH}9n&d sF}M u赃XPNX0f L30$0& .ԓ J a$0r]0a^ck"~` 3O`| SRd7$c (cH00f~qJ1k Fd{m"Ý"f$jginH{˛9%1kŒD\nAėj͵I Bƌ Juu2_fhbk@f$323̴&3;R=6vF0S)}̴lK?dFpKY:Ob0f@BB |>{ KFb -sČRKc(*p:1"h4TMw%WL`zO`!0aUiiVhB;D a1ͦObZՓvLHb%f]b s}LOo^)yMon^Rd"{O\ZL}$.GX%EE=oX2~ Efj f(m|{~l-HŬ -1ˇDᚖe%B,Ɇt~t$e+lz@&@eᴢ"=? [׷v4~%T}иp.vUeێc^p88u#&R* /z8(F)Ryi^b3w$FÐk`ʲk`H-2x)nx@fP  \"d9Y>vl_Cg2(QD:vՁ:} H0=UH|u܇ڰ-W%kg=Ű9I:dv[x~Md+ uSY[cUY, 1~Ÿ 5|_#s#F|U+(Fe%8W RLK".V҃iBd8&M2pѦ_2[A VyExȻdG[@Ɠ 7aU &KNXPs ˴)&?ĸM(1')"s7ދR) nf_8YA fff9Vh+7M ^af1\gM/4fT_:2ƴ^fn - f\%RRq$/AdE2ӌfXk<zx0%48fjK{&f2 sQi9q?>?{hr9>SO 9afN8f) vL2g<:DϐafBv76O< __23WЌ Ǟ23 -sefuɜf?sk6*~@5N0HK}O IZ`FߏYNt9GM ef?K^r'zY eVyR/燗s2q>rKt(wvU[mi2 Ņ\A9cx ).3*nFG+U`(,v,%~s).,O .vo) .(PSøb;2 Fcxbfkwo}ΪVq~~,ʜV^·ht -s3yYaY^XKUZ9]! {ǸZQ9UiY׵PVXM!ВmZK܆4Vy2M^\<.\Fq chҥmǔQZ6dYb٥K {-.U#yKCsO.^n4d9'!5G{~~,Z,sLVC^.e8-WJ>eu;QW#ZՈnhViD: :ZTfTxT\\ٗ +idqʮ]WCƌXԇiUTTNѣB -g]ˊ] #+yO+9_p -KVXB,3Ovai/9nk5[jJTJbiJC ϯ YSfva14,S+ʳĸRȜ[XцT+jE#0Ll "-+h&df*eQyidWr9EƊ̼%]nK.3̄ 3f|_ -TQ6Р9浥[7,Wz~vYBao >>?: A2pYVu}f,y=L mU4A3*L햙3! WjFfJ3[9Gu-C)3ZfF -Qu2$Ĕak|kI7 -ͼhԄ&nf|W;2SMG> 3VfB^u-3 {W yO3VAO0Gə -L" Vs&L Af {&2ghk3hX(^;صC$*◰3ziRv2 F)bW F(T (|f(8jdGW7^by[O2~$*]q}m21QEd{x!c_@Mo,f+e qf̸ `O( ^eYԣm`8>k2zwEމ^4I6yi0[L/=q;oR$0- iR |.g \F; д;7/,hg楔V*ZELy}m!/^\K FTbelʧ4v G2.ILU!\qgȒ6 -N"2SL8 -0.bIQ*ҟa&;I04h 3!!Aۇ_</r -14V2@y!%dh́LfȰy_WLw-\;l,+li0'044/  k$KcNbN&ais9ȕ6])^+L'K*.n*Cs-hvS]u -Oh\ 4AQ ЌL 1=?Ȥ'Y@v؈\@fL/5%B nȰyȃVL)iM̄nt斠fJe"XA23'23;3ffG9=*b ٢4Ng -2Y02 CЉp2kQ]t a -'eޅ7!3Sg sgdq|Ōy%3g-f 읐/2Yм/Df Y <ȋq 0#ŋe3^n -9yikk], sDًfZyރ -r,ypY jg LyjH3ehIc '0}%0'4Qe|$1$1F4EHQeR-e(i 5v%E|D2 2*b8wKk$/R NUjЛ Nee7MJTE>kr$;ȋ&)^4L~0mux>2uUND7*Ox̺ S?kI)eZAuO;nbXҼ-Bv!"fۥ/~\_[HLNaܰ gJ{_ 99Y.Iٖd%bg( JK¸1t$(K&bhug-\_;E\Lqp1KS7!D5R0~$.;w1L"{􄍬E^e7.gᩋ/(ӿBQbleŧG_h%,Ჺ#E qYU(8Knat(5Ǣe$.m`nx\{S".;p)j9|=kQcRgb#i+[BӚWAhAjơ&dF -Fj5cZ(HLBB%JqBǏSJ]1P!?-bq*04uCjh*G1#/Y9 A$Afz75.R{23% -[Y $g :O30M:df֖騔&qV0P/zRzgC2z%v@xgY0g=4w37#KwG&1ry>nXV4x>0Qk -YVRsTgYT;{ȅX[YV$IV&4qet%#m XDnoh13ȹԑΗlqp&&q)=ತ/c언4.%u/qگf8 -`ײǦwV.CTB%Erwq73#-o1S痕xj$(}}]C1,=4h)e&hvhYвxl2'Zԫ6j~d vҎ씦 ,\$僗qx*uiSty\GZ f 0Rx&0vJHQQMkD -cK1Ts T W01#l5 0fjwq|z1 -_xQwTWoJ<&Rc0km 2ci?ƻL]vvk10%:Р}4Y( O4j@cUZ1546фi~/?g'4\_д+A-Y5Єgk5jPٱHul;ʄ:4e(u%3OV葷*T)ʂo;)Qsnr1&L{ d`AFK2HbꬺXy8yڜy5DwWqҺUCoԟQ~~ m4@w1,dD],fgqiPcsQ WmQLITV}d'@'.(K2 [C,*e2n+g(T< p޸eɱx_3Kk;v])N|h7q)Q-PW]Z$$*J^<f6ƽ?9QJ+WV+Ǔ}ZsTF1R sUtM=`EH5U*Un8695#^i΀ -z|v6ni)/3x&d/K+uv\SD/CKfێ[}ԃ;%W‚lP4D,ג|'|{Vδ\gɏ$#cKԥ!57bm$fGtZ}sv^uZ^g'0Q扎ã~>'C>-$uv - ̝{k~&o̝6}<{s]%Ʋ8,GHga_Hו~ոѝ^27R߃ὄnf^) +(cUo8CC Y9g_j_s }*p}s6P l.ڬ+8]; )m=$q^n,Kf,9n7{ 1?Uf:䑝; -Ae9>mGߐBO/%]{ZZՄ+y J̰/+$1Mz&txPUVr5Q@+NqN$f IlNEM4H-Cv -L,)3!`߀ж?AޥN2.7&,}RpFW˧?hu1J<{ -Zʂ%M>&`ߐBwz-~&tW6+z_>FoLy+1_Ka&􏀗Z)2+Y5;rzJb kG,WE7)ns?ΞSÖpRG>ݢ7dyy&ݕYh+-mƦ÷ >UKޘ_r-}^G ;o -BBm?[B3RЄG) L:BZ*=^㞯{эZz!&?#u.s.j}e&'>4oDG2~d Α-[M/>|\t7л.??t/3 UW.`΢ɲ%l'v%3:-KDǢt׻V=AsMQ)2#ςQ؛79˼?Ë -;7],*Qة0#6iԨA(uu IuJI)zc?BƢ -7=_)#`ʅ0#E&wcݗ 8;2w8.G}{]WBsw帷w|Æ/ c ck8:|yŢ2u]VlHj'[AIƯ'[zz,O48:t6b\ g=W"RCА?4ջ|/ |7ISlW[dIvl z\9x4d$~FvaAYlaa5/ Ӧ8ٮ^^ޡ%d5 Fi ٹotuۧe[w"{/Nu=E}S@V6>l[qJ#+Lʾ9aܭ@'yr=>Qea5spDORR)VSZEy1` ǒ(ʰNʣ( |TU*?w_$8{_S5|s@'i[ =8RIxI2YW8* H]+4-']0;H>ۖVxo?׈ئlZZ!? -"eu -']'.LZL$Q#>ՂJbkrbJy,mKֺ~ݬ'-IYJKB|> Ft?|5Um|xyNع,<#{h2hSDj/MǎXϓ6:H?` endstream endobj 12 0 obj<>stream -H\K#9 DOw "ŏtf׳#1BiumN OL G[q>֬ާ~GƧ=^o kztxzr؊[q_gٞX3 OgYEmGC'zcML2;qS7د]k/>yx{N뮳x}f1WDRx]aFi??;k7p }*x|8Ên.IYѯ[p >k'y ~d>=T$mW+~pg+^wkP'T^w*5(۽\K_^g6%4q8XZIJ%R9Wh 7_m#/>яzţ44!)ȼ"6q4, 5:|??)Ks+NNnLnЍH6 hMzI{Af+=k_F0ǜDzx:%_7L\GvI y[SI\fWy;xYjĕ6fly qyFI;:}o6yv[Z|{x򕳡z1 [R׶[Y/qUfonutҨB_0)-w`zUz_->nU7+ٙpItA\ ߝyN %|&;Lr)5 -j087[s(zۼ"fV@b1?@}wwt+b6L>ij5$ W>votW>G܎FA57dpTZ^VgStPs -CϮy1u[M 1Vqp:f ZUz\RD\6Y+eYZ%.œ0)S/s%:K+"'q_-Aa`qĵmU{k^>ǘ=,bUcUڋV_J rêFufWM XSjι-f {qy -a ^(q9Hר0Sr6夰+aau`W5QLyadM) _O'D{8=1gmp3-Dr{+b'*$8)2I ."qg -HbPuɖIX`"lLKTpᎺl~Ii4ݟΜLB_ -cYaՀ&ۀoX!ыN}cy&vBΕ_'v5?F㋖SSoh3‚5UI\\C:H* ؠ !ه'1bu 7AuUT{San~ւ2Z&!"({&$Hk&t;;Z%Q&`VZ"ܰ˦g:nZ%Zo۟E{qxCQ9ĊJ>u:5"+SЗL*}OS OAo"FEv#1q)6N9l򍥫W%䙂mo[' -ZjW+hC- EZ 8 P"ǜ?%:_^ZZK4 -tlS9:qZ:xWh['g E퀷ddk :Mr8>^dXF;vL`9JDŽz?7;*@l\cqy7|gS??@[>U`49S$z}Bk1_,d*^r#Y ~ee#G"C%넞㪴wQcMgqprJz%K9 c;|)đ9]Ho_])DfSBt.|$M4DN!|}9<ێF"B")tȊ*W$x#/xgb%B$!uxw2bMmEAy<>ꎊf3! \d mC\*8lch<٠I)kn,Ikj / -Lbbi~ 'V~8Hb달ěD :Zgȳ&ہ5I >D+k OǴKcȼT9ly+W"Άt 5`P"U:#Xf$4Gס8|}!+mq)> -ڿrb.0x?P_ +20 -"F_+fRr-}[*G<mY54kx/;aILXA32[%l^,Vֽ"UZ}_IY=ָE"WQ܉.<߷;&y!Pj͋tγ"y9L#P2 MA2 ]%ȴaI>:`IJڬ|w:3^e.oDRoFe~l\إ^Vu6}r4ָR*\6;GO8tx&7xiV5O3\iؿ޳`+ *^.ށ940gY sB7ZY-6AfTi2+XAXgaeR@ 6gDg9:+KwDe82]S?0&*P3 -&`O0AOt5xI$CxJ J r ٪ڒ2 ړIXZ%qE,}o$1\0`"f;LwAZ}ywbF"y}7Qi7;>e5ezpY9rV}\ۓj1py*l#v<:,UƐ0)9`aE`Bo -x6];T!'>\5?~\!N칻<J;Z3AF#%l76e앎N ʶ5Wr[\uNFQr؟l,V@vĂ/5H\%-F bQa%pȳ$ތB -%8P7хCa8+jU41vk~dE)nhƂ97Hln;m:Xэ:0RȜB`9`%@n]/Z<VB -nut8PMDZU ܼH*H\Cc/Д*RWZ`W]<~ g9mU8]LIpsm+lEWҕϊ^x&;RxvjeRix&/OgT KU uuo% FNЗ -:߀㛷bM@\-*oRVE;d,F(j7-&ӢeCBW"q牦d]ŋ%;ލF9q))k֥[],<7.cM23RTf6' -%\\ 0$pFxO\"6Ӹ~_W0*[uꕅcg>⍠ב0q;Yi!&=w+:م۝_}6'zʒ?qW.,T4u L'bwA͞/E02x!fvq -=Y50 v,14H4cj}!Ybo vU`>waͻa- -rWE;ṄSRZ˶=K> -K ,n ϣ<ҎRM}K^\Ca+Zx'qZH[.-L`A -yO@4oj[FBiӏի¬;ZvڴW#θI^*%i's9#cdpֳ>h l!~Sg$sy6k]i6Xxq&Z[,{kD: e}k%FGV~1 !&a\ެ݆3tUg6U"&IdO}]2t7'&ϒhQun`5o =s:F2Wp/ '341UCu(H: -w%Xy֯::g1W5oˋ!$yv$+)3RH`vёp8V*S)ɁBM۫`Ɍ^[Z;#O6of*ΰWy4J4jAEVw( aCp8LXL艖v7iBLD|ecpE AޞB%teׄ -`FgM q,t&Lh0=3zhƮ-"XĎd- yc8\9'mCdxܩ8G(P!WFzsP% L%0}oxcL2GS `9"YV9a/JONa,-$FNbN L$BsWrDd:}'+v ӥGp!-bM1^Bb4 C!FW#% < !pxS媘s$zY]Mc7+ -\Gސຒ#a5ҭyLv]gWHS목ނ@è0?A ZYAY!t/:G]4~3g2y\%I_|ȹ,ivkQc ٍSL;Pź F~CQvpB,[~s*jO#6p/q 'k$GgںX2w94p8;Bf\bHj5CB.S4oc{X`,ݡ^ɖ!-K.` e8Ow:eyנ b݌Jx]͉5%r7&Zx@N)Tf *f-yuxӵg;V9Rp)K1Oa!%.ֿ4. nT6>*Ql*e[o \-m QKAi0 g,t}c~wy -||3}j~55 -7x6,õoVg&61:!05^Gs/1[:+Ox#`;R̙ Sk-m hZ6m7pv/wg9W+0?֤R43٥ B<:;MQ`&3== 6f,ps ~:6x" ԝ2j@h/ywĜ4( jYu+ۻK>c*m)U`k Mq/on.N.xE`~x:_o[ ؋E4t'6>svX^ B>h*/r>k'A /=bHx+<8 W8b@ٴݯSCF .K6Q{;X7&%K{:%B@҄\Y @bP#;ʉf!b}rG<-&{yB@b' ǽKE`P7xGxRL8x M{C|fp94Sk0h|S[/Sk L1X*<O#K^`gCb&hQ~b;×g`<-oۅcvæ(o -Ӆ׿7#,?+T# z!ju!V7ND -M/Euo3DQC|;60:61D\}c!;?SS%A^'&S"v aGthrE9`IࡦJXA6~À4 Ё1DL/VnbOkDf(WS|M1=֩FIgnt2T~T2 -`ndgqsOЃ9 ސDaiFFs9@ x-#P^`-Crюk+*181Nqj:~sx8ˉGwuk.r ܅uq(7Pb:9X-djYg8'rpj;g~_qmoh7Qto &ڍ#xsߒx\&/ZtYR>SϜ!q*'l 9`pXZRWw>W4z˹(BX~w=>J&ɵZnܓrMTc .Ul8 $mq٦g=`m5'?CCGʜ"6c/Z N7?!I?^2B%dt6Ä}`z_ -D;5wD e(uG lL~:xdj^́N` > -//n -|lsc5nO=o#@wczU]35( 6)Zjh.;K_ZW,d4X0r7sqhSBڂ,S"1W'9&5kmSry/ׂ9x1qDciI*<Ѱk ccMF:?VKqЌ-p -҇0K׾>O^Iɍr*nɫK6 4i/`*a [紇w3;sz5y|&k-rc 2#EWkj˵BaXⰎ{WmZ =Vbc hsL=n&!&^ bޗu#fX.IbNڒ|?)fO^HŢWoG̡a}|8n,^OɭMԮo.Ka̗-`x.øqFhW bFn rQ^x,iJN8R,W:MC|˽G~὘.k'5f 16Nkz^8Q ~zØi-JDf!m;!d!">*“%ծڄgK~kKViNx~$|pW"kxB-^w8^GsՎY= Tr 3E("5q9Oe=mũ%ɦpS›MB|G_rJ3kճ|WA>5N 4 ͂C3I-ۯ'l~gV &qiq/H07?ruI(m$)Sp)H!gEy<^Z2 -(Q%iC 6BdLucMCHL1 ꏢTIs&Ҋ4w2ek y5{4vh4xBдr>=F#~eA=r Y\J,s2Ln|-'N͞:^5gaʏ3EA(PJs}ŧB#y9$RB_tU #F:j'bBD|m /[zfL|c~9&ԱFʿuНx}9MBt۩@9s`?lUZVd_|3Dv=dMd(org9$K\ӗk4|~2COj\Q]49ǚ Hfؘ*e٢E`7uFդ3.GϢ4nR TY8󓙼<¨Asw_uݨ~TVkWD2?g&w*OܧPY ˯/|⌎c!ބwߒ?b)1ݳwۈFm(M.L<_`U)|GMIoHB~z/Z}-|og 9bIb-F/HB uFO*=7>Jo`]W ?:ݻק$ICʢ'cj| '$7&bݖG.A?^DJdm 0'yH&Ge\9 ;nدHЩ/լ${; -ZTr ۹ -#Ÿ]Aþ?*Nh"PE @lL?@vC-eegu+Cl]Z ިDwۋ^h܇$TOW`PAE 8Ҋ 0&5\|s="lgM J{~ω2|ӍGh-L5jG}z?;_L_[bOpM]N3 ި7"6x:֕I}s)6qd+{T|G3 -|[6/Yk -F'uv Y#/b!"6>RW=xS/n$u/B/hgH'W;KdGɦlNo20 <&}:zM_F/7u4|}X/} zLQnw4(\Eϙ}F?r|bS˨~sކϫܘpޥ`1}f. Il ~,?ص)˹S,WA` :z}E|ma|#N$_?mb霹)ӹAo?r6qsi'$-j ,;{#v w>fFk}NG9- ]Gv6nn0xi1ϥEy {hV1A qfr2`"ۀn>9[o6&k@hLň9O;(Zi +oqWOY#sgm] >M.3R|'U"t8s|ۺA=>aLLx77:;d8N]M -fl)[;0 o~Sc"ze3z`|O v.l۾?]Ѕ0غ mooCNu994ta ]̨5,萁cqj{Nt:?c -{&7H o2LgO-%I[8}[/{ ~X-fme֍!?uI/)'k -̜$ }:f|mG D=n_ ?e d^AJ z{~ݲ]rŞ5ƈ&V.L'[u&};{"?r'f-E"ս;?5[#w‰[YS|sb7Rp7 kPּTO^AUJ Žcѐ>{4&'\S_7 xD+@DYF]ߥHSoa:Mg-4`rs1ǁcERq?yd\k2?PoS3+ wCk|5sqyu:W[Y!9L/]r_suSֻ srj,M 㖺6|ˮy51 xQ?Z|oQn9 s"*F+> ~2DcqrVN, (GDzf> ܷqd.NOLJwX0΂b߆ن?W/c!|ZC# Da-ܰK/q$/#?O k]YoO@֞^]qe;*V`v%a0@i4tT~Q+ɂw.q6o@)DL <0pa_؝;MMs|;*g\~CwF~/>6 NF,OyH9& !Xzhﭧbw;rf[Z6UW`aD7~g^t9$p?Hs~m#V]v.yh5ᘾhF~sοTl:ȯ\?L߬9)l?9*7M |=J| ͜ǁ/Ē g@v{sftJTDҺ-x\s!d"0MEli;CJ;g#"~6Mƣuia/@`;]bpL>0Skv)8?(sfXfɽ j?0tL{g,#C #x0M'-`VJ,7/[quۋJ1wSX8dK?PmۋFFS~3?qFzcdG$^Q:O|% nrDT{\Lұ&fی?JT琾iwa;4C͵v⟂X ) -MEa~$YG|A)γ߭.8I6|QSb.V{4z#Hfr#h;۳q n%Y͟f۪}1o8ζ0@7sd+S5ғ"o{j|:>)CRyCӖrt&w>to$ﵠ~:]vXi];?YSUwFt;0@4Fg --.}=~lly $!oˆ|lNݻ}ij@ n)'5P%p^yy#Y7Myh)`]y%VgfRوVWQꢗ)T-jUimuܥRSԠ.+]V3}1S] DnZiC^+Of-S3=[j:sU@0R -iݍyS*a -ol*1/m`Ra'JDZ*ģtRX^#ZM}'Z'('}cɕq&-,%8eOѲ8E -ViPə8G{֜,u>ў`.PVȕ筮G _(9.P}k_hN r굲[_M~}Sӫge%Y5 |ӗSf8XLYQ~F0ݓ?q> endstream endobj 13 0 obj<>stream -H\]#7 Ow y[ "yqwɪ_{ZoZuz_/歯on|s[Nc _^lz9/w}ow/U{KL?9Ho&ܡo:To=ϼ&;\_%b'Hk"=uыpwbUMTJZǬ 3 A3ެ=X÷w}sDO|$ɳϗ |S #AgA7ۆ--?s[57^M^Ê/;o tzpoғ[x"U1 L t|#8 -'>ԀJQs  !WYp*> -B&,XvNhmg) Z-կV*j[yPP^؊3t:n E;BMHPK 9%9~CZ}q O.TӦsV}W}H' _쵠Lk:hs7?J]oفt( Ӛ7[cocvҲ޵tf/"%˴Fg -M! 6;A#wA0䆋ёq=_}Й+t?QtnŷkWNړd^ -y6!NH֣Ϻ7nB_;؂TWJnipZT:VtCAGˋrNn'-|xO΁ɂ/de3U ! tJaUvAW̧xw[6㮝toq k݂>t2Ep4w&u2n1lXمB_Bc -nCvb/d2lV o-)2X08*|d iKl4۹u"x˘JǫԤܯ5"K"f*:~D -Hbؐn -,E/pRH7ހ6qZw|GS$ ~{as.@G GzgN f$M؝\vVoJY~6#e 2p Iӟ t.t; A7UyV4X릡*t= h#-=}. %E !-fvě[u? -l[-jz >0=Aݠ>ipU h~{=/h -;:yFt?pr(O4}uf3kl†ijAqj mz/(sݍi|Ib㾇)T||9uq"B U$jtO2N0IW|w5QA;f>  -@AV7c_TIU;;͏џfКrLFsV햘qG }5$AX|7*աN5_!O͇5XvC<4hLA :hOx5RAoj9;U޻3I~$r/$|35fqY%ݢgZT3]0sݍH5}>E_Ьt1 "60zP$:LhW;*97ݿJ57(!9$M[3/3l5ޕ9C:%|Bx<ÝeT;G@(w>W|5|i?[=uZ}e*wr ۦq~ҢÏȞ$dZ2V9cݞE7j̼f3"rCJ55.%:T|VZ~Jm c 'kmkoZ碛ڣ|[^R {|  be#^ONy}7[ l \vrWG -n!f gS<"֖ǂNA. -zkI?:m|*GAix<+}.!LwݻN!>',0 @C=4tCLCAbTq=-oRaоN6CL/Aa|C2&n-AC,h ~( m kNf,@G \vJUѢ $DxNiCZ0RUGTt ~Aw-N]EІR榫s!} `:t(1hP30pyȵQOe%ZRv] މ"+9)~B\7¥n4рhñ13%꧝Ħ~WP-s]FI J`BL-b"jo_IsF3[G9{/7C=jOzsRXrj1;[xE1{f0УC(\%AbԌB֍N gXlWR[O V:q\'>4aS ] [ –3^!wuIɁqD>b3>gI}}##wH'i!LZwc !SRH2:!:JT}]9 <(F!2|R3U{gF.Ƙ'b7@uzDܞm[hID4]iOgኯsFȩPMSq^hW[Ī%)G7>N\߀KAp;qZPhӜ:-u"g\YTUzjN*FWN.LjhGuq|jtͣ230b6S\j#DO󉶳8S)wŞ@V-yI$Yzjt}R|] ]b3Z%ҹBo6%̴ -`6Ϙ׉A聜-pL6r1@q?Q qNrT:fn,UaC3F(:]m.T$#jkpYPYooiN:TjШkq#e؈pLx}S*fЃ!B"N#΁,tEgm2DJ°a1'C4cs _gh|awg 0 ΤP 6ćs1o ~rwPEȠNeP6<0 -aeP%+WDG>=~_r~3(j]0k{A8I`呫^UGp<ة錏cDY7TOY f"u/F8&JS%5H'w1#ǐX vJr*qB! %"WtWmXc\W/t5+y܋ۙcAY}޿Ʀ-Vr߉am堚ȿM(:Ps!/7o(Mzr,@ Jk{ׇEJQk#Q*S"Œ0&`bIuHc2Y>?^UOvâb bQ(YRkU yR QB>kF\`a9:짤!LlT fLɥwdArjLn ցy ڳB1\LFZ$^ƪH$"Q(G@5zؕEC,rWO(%4.M͚haRĩ񒖢VlI Wm`ng/~ - 6Vۇ!M>CRsRF}gf7E멜T,U:a8~k8/j-))ڟtᕚP79gL5J-G0&6c\gDŽ9ڐ&MzOLAV>aa0\QEy1 Y Kl|tf̳I$ $l| I(ʳ#KBc}~ MTz~u5LCj,a0S;h -#G!2_`zܔ4ʇI% Liֆ3Wg򥅓mAсfhn|x6J VK#R7/.K˙bZT=g_l׬I߿@Pp~ٯ*L$9U{T` b8]/:(5SsQj7s>ZQGָdFIy{t22=0JiҬZ #"e*7f8=EM)ib7-hsa4w֚0^zN(5oL.dfo,iC {aʎffM4t8Iúq2e$egs)1ES&UCvkئp \ޣc}`D)>Z,3$`;؟z0_  -ZIy/ϋ">A3qq1hQՆ#[᧶8Jo&8$- -?PLGT`۟f84Q1VYÊtręx/?>л#*-g2Ē+||(~ſ - -pJT,,Mߙ1x#JL'!ՂV䖪+RV؞p0&nk//FfXąx ဳ< ;nE`=Q%Ab#ޜ.=nWCmM-nlj"Eq{ "peӒ.@eom+P8#]/KS-ݤml34XS> ?2p{ -*)Jt0S ވ;~5>b39g̜_& WF|~ WI$|A!_ྼgS9#,4@],HIE8D*eb/Z `p)m4>a>3nHذBg]Z&cHq7>10뾰tg]Clps?C_ք 9_n/8#ZiW3}'oc8:5xdYb2dNAD}_,XBӪp1B}\8 -U[g'&:6%h=B_nlq=Zpݼ]@09GmEu3®!ᇕpUkq7<'ΡXL pCB73p.qKU!JM73&!:}U]϶dV,!Ы 0{S^'K5O`7OXi%OUÄ1uxwQւu O8 竒Y>wxO >˖^-UllټU=ǧon-½"qV3KXZrl?X׏)eZ넀~Iy.?pN?@KxhcT/[[r#fw6a$ҟU>!.s Tt&-ĂwcM/3=-b"e\ JG40ΛMA?/.&Z ' 0 H8 o! 8L ɎioA, -RV" -géncG3[REB6.@leG]cZDl1Ys4܅Kq K,\Ezl(00tĹd/ 8l -KYְc_$hl4 O63¦q&0T0(%p :ҭeLnG]b֦kg4 ̋c8iRo ɞ6Kexkk9']b'8~֧}H K,bg[jգ+i $+/-qF}kAt/ۘ:2֔%{Z#N% k)Ff$}lU=.T k \6y_[ho`STVg ӳԮ&p W&A٣_r"\ D0߶;7:lgGNjgYǣWA4:poGUWӬa\ASS[&zﶦO&(OZpb|ilnLJ{Ӿ˱ƿr+i 9ٖnlb 2`QvE+iqІL38 %8#l:δ%fBC(n1p(WO;%ӝ3lvpu\Ey}iÒ'1| Cb\u^c:?I%$9(DKh'KW]8-cG՞Y6ٵXRVzS+χn\(2,}8*_0DbԭҘQV::Y6!w-|U41z~@ ߊ{'Y$bJ'77YW2CLtX< hhRXxb:* brU4,%գW[ϊ)g0);+kt3gʹ"N+vXVY:;MW nW0,cM&m_Ĵ`ʋbHRUpk}G9 3zWum,|0"4ླ\k K{_OG̘R,\ '񷓯K\j3pgm s۫_eIjxb@( -R`xQ:(I_2WwzeiCk+w(X B} y+ff>4KRԝҒcu'XY4O2}d5 -'@QjqLJ0fVA8\i" lDdS2(ƻlldK&Md/r |3D8`>q P -̸& Hؒ&QbiBG7t5i\%ms ,L$#nO|/nfQ0zdd -2W]+Ǡ0WG -ݡ5G-_[ L7Z[1u<"א6Z;vcz[$">)v@s\>rS,%er{K7(l!ͭQFqE ]7JBYTH;'ꈷ8f0>Qz#)SLITjoW<\-KsqB}%+ޟץy/x&­TwWl"cD1G ȔYBkcxS4I][[0|@8)1Pwv&8R8`֌34t/5G pb&z;Axc@q-+JB}EQ~_RX u`.'6?TCO22Pg4Ko2Gap(Ƹ>['e; `RZέax2GMċ+yD\{tsZUMw?()XX̴x -5@0p]}`vԄsAwȀр WǾlED#^3ʾ69D#(q3bsYDR -y1q -`Aݏ)O\1epkfC"ƠxGe%1q&*?1^\ZfbyUԒ'.gS_c.g^_cF{,Š;֮* QC-khL!bt@ F`w޺O+ ; -s -vS_Nl]k:3!| 7`bRvˡ<ƾ&<99U+WmjEL; i8Pm[OC͡j[=qVs6k6hJ-ńY\ %4~]!p/Uت vV`xd9DfE*=T[jo8"] lʡ%Fwn/OJC+_/.b=w| 鑍6K!|V,~ T9gh -y5u>5Lm( jqGlF272Tw+;/ -I:07^86qxH=)/uynԮSMвzťì -4Xxo#* x3Swqv͗sY-1P$@cn`~XRCΗ^:m`ko@m ҧfJI˩qmPYTу Vi,:dy8XUmbq\{ &-$mOAp'T !ܯlj_ zH ->ҩXJNfvI6q\Uo t8ŸIdS6OYzxZx#J endstream endobj 14 0 obj<>stream -HWK+dC kd9ۚ-X{C~Q_n~m{<62nOSy37|ضTM%; {Q_myCu#W}&nK~WԙhqjTM?;J#agurq2=!e& x?һ#=sX% ?_o׍]B=Dgz-_X . Qi .|w&#!Iz9C4H d|\i“@BG2DXJkqG+{u_mrMʒ"Ri8#2P^*~Lu&$1͕HlLf#0yExt7>5|kY͉v:yfB$֨Wt\4 +fjhH*CFae/#zd]j,wو_Ib4D:b ]KPd` j *٦d",F"J3-lmڱf΍Ѽ erg8.sGoxO*XMĩ-[ڤtu9ǦF+6Gf ]D׊P`X*?tʷZBV6J2ZnRiEjK CљH'Aj@wEX -`. cB8©ʑ@$\ -;2|acpތ(aNFD5$*zN1$3"mKx\vCS(ˡƨ}|A2gOA&rgr|K=OxHl8q&NR/GijHDSb~Wg[sh@ɢyδE[fӎ9 - Pe[Pg#[?b[᭸Y -ht- xUȈ2`g @OmsL*.qIMũ[al@a:\W ˥dn%냟 ͫC~&y#f=b -"'߸!jCN(_t]+]sT"D ِnj>|:Pq -$5)CvZÙ>FgA ҘZ>MdD\!)(DZ;_JKaj0 _ '_5K'_0ME\nvJR͉~J- S@Ǖv_N_P!'e>(a-%5}SOE\qklxKCRly:8_wlUlF +EvFJCKDeL_<46'GJ'FIGd>+(YY-WIHJ=aVև_ -ɥ㜪T7c, ٖ5lvؾY/+5"I=9>#ྱwԛ]|SU$C20 )UH$IY6÷uP ~lE"א(%\csY8)6gr%s\IGbHQq"GUn뮽~Mn|/JאJMu: y*HL-ݧ^l~8vTXih8Q:KP_β6߭w񧇈r~+f&m?jUč(ߏdD;Ydz%ۿa -HvO)2F=%'B!q{b3Ν66$)9Z61QOܺ"$2UbvH>~^>®fI׬oI"8iNkzdRg>w&\(_"qV`d[3T+|Fc\, bn*'$QSY@l0FD cBٶG*@IN7qNӐBdYv+Og9/sO( 6]@jwY89a7;3O >x)BdBW6Zs$'ʸEO#{J:[Ȕ>2Ufn=^' OzgfU~3z^%$i|SD&S_1EEF>C4=QR0UqK̊Z9%H弖bJ 2PX%֊<@pdf6*AX1KZwtHur}uEC?ڬ_mi9+oힼg G"+hF%eUVZpr@TF@FhKGH5Ne1mKna2Bi]KЌuQ -3vkU2tlᯁa dfte<.b&=8e7-K \of#MĴJ1.A&t3fGy*SW;ޝ^HkvN`q2^u¼Թm ULugEqaRFqQc+6SS՚{_ICP/v3.Dij6 9z;15a^p~L鵷Z''P]Rvp< I}\k8-K|z+o{s'5 bG S] -|;p;7%v2Gf83N,-62C7 }oȁ-Х|>YYt$^ -Q A dH'\Va!KPiB,ݎhgij|bh:HV'U=]1~RlqB l qggK |gll'I牧F7ҨhdX>$=$ɐN?&BC2AP ShR,;olmxe XB!z0#Lm|l{B$U3'crwPNSoTv;%nۮVE c\Zb<[[9ՙUfބD|?/:"W;@mPi}=kR _,.~*:jҠumBrZU(kRyu>fYοYʍlKk$U' z &ĺ8Kq@*0UG RԎP`]Q;)r.\Qq/0qq~böBڡ_V^4s ɫ{k[TT7#dtA>$Yu:!n1;R799kb,$@ё@ch+!%z 7(vbe!v_Zf -%^y'rpVKs$M"_˼H -e49&(+ kCMG3D ӄ(O}(6$^v\b;ߧOw ۠y|\'E0)GRp$pe`KiX+E{;Ş -Y#\gȌVVwan]XYZG<"./mG:[bw<j}hBx$'yאmHll4C.&[&lUiёZ"5H" RX9661< :RqFa0([L -YT$~#R٫GIU0 .B 9qL2|" [)mH53U!mͽ!0' f%`alC979{LcxWAZ'ҫL^jG D5FHr[tz',2a:W{&ޕHڎ :j\ _S 6[)h.\3ͬ _<'!^QLVMDl ri IknZt9bw/iܜqS -꠩ŷaio;6$[Vp 5| '&?gLi!G0YG0 -o+ m> u^蕿y0 I}~0C=2q1o xmAiTFWݰiן'SS'(y?7(wO+.eGȨs#2[ez¹WlgAJb:O}eկV.O1< =߁ۓҥIkZQ\4<.c׾é1Da&,k'ҍ؄[Vމƫ3徧+u'g}=f/*I>fA; 7Çcb~Fj܏}U4Ր|؅=N=:m}=h{NI3n,fm* lv4.yyCL12?8|}ױz|3—1~|uZ<~а8{^vϯo"b:=Ґ~C2xپ̶YL3 7S M:m;Pt$Qmo\Nm |'6? fA%SR$%6 iI.iGZ='J؂e@-݀_a2IgWd%۟!w6Jz "0Ie L*l"6YcθL= a` ^8u|A9s OIɩ2ouvJ> Q >8#'ņdrIoMR]#hjmr_d4=Yq>SXZ! W ƺHुs۞NE`GIO%dT2D&V -Uא=t9gΖ183l#a09R7op[È}~ )5*D"JvWCj19\ҜS zo[0 -6"N796+6XLv}T..͈} ꅷ2DtɃ-3$ zpKrfۨ(Fb| (fj -`D峐~Ri>}ٜ8AX8xR">%0i5-L!5Tz<jjM{_;;{zoynkMװJ%tf=篭M^_dZhb<?`H7F"rp\AcN1ADzYbLpIdR3V㬴DVhCBEfDr4D}k5Bxҳ7B}C?<%,n6~s}} vr6ב&_U$IxyKό"sfsMlƻ(]dtUWŶ֠ΰA550.N:^ˁ)I6.B?F ~ŧ@ h=Cj+$J?omzngTklTY%^dL Ll)# ԝmz #y(ARyOZ>5oh{) - -]4>aU#J[֐vjH\ >ܛ:>]\%yσoͯu36Kv&}GtJy/9a1 0ѽ-{7{K1/Ny;?2BcfDɋ(=y^gFh~#m1y#>:~{ލcحǹxN+6;+Z% 0gsV?җ;k,HR d@g \g\yZ(ĊQo1/ecɭCrDyA奢QDۓJ𖞤[F b)CHxm{㣯/ig܉ԜDTCڦ"ƙQ yN\l[1v8K\sՈR5y\naχZ!ħX*;d t\Y.BE'āaZ!4Q6sXCv(To$$ ~)}pւ` AP%T.P)L2UR_03! --=fw+G[<)_ ,rGw!m -)tLb6ǎMж"jp(4wY JkJB3Z;j r{= ouH&#E!Zו_+1sp!Rh O}~Sw^)|%? *)Gf%߀ct;}% 5_7< ν.k9^a}%!ZFP:}^du};{]epUl_~nuc{.-խ?t{';g,9\ =k}jϞ,}FO%WXks 9aJe>fau[ϭs(Zuϕ2:1`Է҇m$bŪ٤Rz4zYS;\c5h)84P7TaXٯWz o97׀G վcVm8Ve*@ۤ #m)f4ǰWgj\Y#2D%|ʬ*%ۥxவYZMpet҆ʕf*fxVØ{6_OmWR6e6uL u:7ӚJX-):*pʤ$Ql5hw > ݳm*x* kx>wEǼ%SMv{N  ( Ű gJ6&Y0{/{W@tM&zٸkgĖ0T/k!&~bUd;h$7]uQlOW.Fyc,s߇`g+deQ”]#Ca1ǚ_84o3&BJSVH7p^/j4BI8۳X۸9AQg7`.q[J*QS[reәr9 -Vߋ_iEf Wbj ^-.h*UCN?B`#[:^lm\oMl+%OrWGPaK< JBtq3Ӈ_3B=PMϋTԍN"+:,&6ZhŪ5f U :fcXrk{ɿ{moPۯ%n+~r5fл \T0·.h&4yz.wH~Jo">Z`\#*u'w)lBqQZH45O_=>/]Z蟛aYB}w60_τiHi[R&iј*s]f0PL>,LLay(fc&qbJKl,PY`hiAZ -vfc2w@xp3@\-FîŨM -?r5!+՗7e:"cÙ>[bkVS-h YZ@ɲ(N+paJgՒZ6Ш,q/L*Ίh/[QHV,%v4AzZd!4i9Jrɑ# |:@y -0v *?Rf=̦ UR"Hy(dCW\J~ByH8h0m Hc]iFb c:BߖnwE"F]U`Z`+#nҾr [Vk?y(,_/^cBU6URd/ -˫(8*`ԸaD -"7XS Dh3{ʴ$1Dəe`1*st뚚}`qpAǸ1ay{ф$zEW;.MEPE5$j=E%f;#"QE-%[J/]bJh?ؽV]9(KvxT -d"Bٯ\yfڜa YC8f,8Dʱ@lP,F#*JLn J0uvnk;e!k~.̱=p t3X' ׼{{P9`;㲸TD[潬]'ܶPWPRo||yZsr JV|l Oi4\Liٱm_N`8ϓ$04=#{^cvv   K6"D}+^!JTH k*f".t˶ JQ2wvCۃeZ\lVc-pW+y?7Z89.`=?P=x.S:_S9CB:n-ն, -b䊒V| -eь/!dJ`,! -壊1=Mg.9sZ0 N<ui<ʌ$9+],Jo|t$SlB:N1 OEONUi@~#j=f-ˎ.rŪ6:*FEd7*AH^O앿+䊗Rb^O|Znd+͢dv7ϗɞ;.>1A(T? m4m`]0gG~5TvAy}ASmaIK8 鐵W6MIq J:HIxzhL# 5tZeCh&(443+i_.W*J0Щ']QB zlnR))GȂHúJ cLg5AQ3`*X -_>QRaܜLh "Z)qFEAkܹ0Ƒ-c\ODGO -ctO O)1sn#Jk_,AEfqխ)Բ+e&%1CE25e{0v[8ok3WZws壖^Of:| -[p.Ե??**=DrTE G[ -[9lRO|i34l`qq1`,3|ux ؙcF}w8㗟?fdߟ=AM ;-* _ $]t;cZȹ-7!nG] =K;)O.l(uXdl9Sn];~Qل޴>PR9(6.9 # EAX$f!|%gXsnsK~h :hq&N&$! iGX:Uƥ^W~dF`kf!5{(/Ty} k/t YV,U\8} CM%'0"Op+R]jUҼԊFom_|nWx̮.~Q$s kkg>S;C]]sW_k ^+[W endstream endobj 15 0 obj<>stream -HWINGuZyA,'jH7#H9iz!J79 )wu x M1aH1EbHT2gʋm_^7>Crz!l9rřTD;Y/.5yx4!5X_}[?( .7ۉD A8c! ^2qNE+'R~X5p IlDt%\eb;I:JCL|rdR3͟[o6R8!ѶN%^` K a -9<~H-vTNig٠?r/aor\15҉4v֣RycAۙ5gs GΩap^BBIB[2ոo7LE+Cu";wrܷЪR57r-MI\:Z0("喬R9\s0swVLNX!XiF"X/,G9ԢW眹w *B^aSq֡a,1`V2P%juHБ+'ˉqc#!Ќ s\E d@ȳ6%&;K-!6R"F=4z|q!ܶ'_ H E$:UJ툍qôJV+=]'ĕ0o( $\Q @^lT4SJT\/=JYUJ[L;v-g3Qţ< #N S~QLGZɃ(ʪ spY7r8H?VFSOy&]){؟qFU"NU=#cUƐgf3E.zk\p>!VTŭH u%a$V=K>bQƋv!t j:n}a[މّNN'2J-~5,5;GdBPŜ* -3d&l5,1o4/Hɫ\7#$al.wd03:Xc|&+? Ex0+Vb7Yhg& W :5<<4ex\R2v1G|-'=0m^GZ#b9ҖS-Ys:~7Su!\GK3?CS\4{< _9 skNlqL`R+m+OwS?)TܳZB/W=][R.[LqI -559a^7żHMۂt|{Kg'V/s 6&з&!)!P3Ѭ3aRby왢d*[}kZH=+}AقK@#R֛B@%gS |'rjUfKM憍X,&K|"LC#+|iTL4֙nMFv{o;nri߸o뭩p) _U#{Nrzr:Wmu{OȶSMp]{R"a"#b9">_dH1go3ƒňg=g4s{=g$_Sʚ#n{2N2>HuEnW=a3IcD#'Ů$](2yF$e#N b*Մ*y<-ߨQH;vQȽsą&2O}(.o?M I Lj:>F<0rtSH;S-h┭e&[/+#B 5o͒em?.zxADl,4l;B6!v-q"-kUfYkeMݐC{9c|bJ@]s8w#07}C4iL* -3J?6}%ULb.k!<(]P<~e2ٙze%tWer x`$#M[͈]+ $SlMR* uqYAzCn~ȆBŃ8;ݒQ&ZlfI*%$Ħ>}"ht0S>Wjtu+]tl_\B5*䀏IeS)il^A9&BebѦ+j*#UGdWW[#\Wp׵+) |3='H=257 3RPk?^Η>݄H#a EC=Mvb%vC٨c$ۺ$ИLu">x/>0)x}9)m3BF9,k]lN?7uTjdM5)zg73 {Ipeqیv#wz/H -g5ODR'ҫQb\aT! C$e]1娆UtD)_8Yz-*߹~mFY0@0F7A$ Nw4y8brK[&qg'D(S%+'p} AH.)6р#}Ӎ<_kx܇JF -|2dғΝ -2}0@o#&* O !&pȆɇLa"#ǐlHR$FJA4*(n~G8G=qZ܏,n9tI@s8"HEw)I.o$! dx/$dI{ٿYu ]A=EDA -%CD٪{7R -S;t $VYGM|`8 Br#Aj3)b'Kn{f8ͿW2ͿV LB?.  mܖ裡jWBe7b(Y5w (YKdnGd Y3\6htn"K8mFaD"%RL"m!P~L}gH?sj!ȹxK1{j59T'/N1 ^y)QxSBNb䴓bD]2Z^?rna/2%`q7IniB+m3x>\u oiڤCFy*|eߩъ"aI.|Ά\ x%{ -ɣ*>mN?~M*c/D2d -.).˙1/rJⱤKI$mPҲ*#jMv;OhZt 2 -t^|+;?;ϙTMݧVW_Pk_4 UyTdZʜu )JD"AQԝeRv/*<=[^WB{-!YЌi9U9٦*ILJj&J@PwtkӽI+ye3tRsǚ6Yn#Hz!RYkhMLEܷ dVp 1wvMJdLi](c> 18J(M|hdƙYf7( L9E ]Q=v&À2cCz-Fl\_$U۸!:A-\ToyQGbvA&r[r" Z;7 -orJў2dNyaOߜ:hJPdc0U1D;CTŒ/wh:IB6۔ 7XlLu~b xmZ{n2w$Jxt^u0RIے5z)7«ڛW=ڑWk}ɐm\ YiC9&]ic;yJnϟay~jG34:U|+,V'pP\)oV:%+xlV?@rRF7υ9iüYFZ"jʯ4kG9{a%i|4)qoisSKAܗ)ZWVR*r >pcj|P -LuFYX.Ea_$ :9 J/e{N٧_ -Ta>%mzzp -Ò530SY >K+ectjX So'@=&:tT()Y''S'e{Y6a+S,ԁ1c7v|#4'jB'@H=5/OR[nB U_''`@U{ic96x[ ]ߜy |E݆vF$HF,K%Ȯ~_!Pe\uQ ҃Eu$"#r]@Կh="jK;btܖ#0z1w#6l񆳻? L~@n6=  -8'0^SėMS (8M:ujaz~F+H,"::藵84 ?>[wBVxD<N=|vϕ( WBefX/1HW"ć28#Җb> Q|6#wn:ىוׁc@MNG:ٞCGh]xP!&XKiLJnXCgy=M}n}nT/BΧ Ѿx{ e&KsϘQGZ.!W|Vl GųƋUW)iɇz`?9T[w *!%V  %h/ש'Pg̾ o[c5?eyhc\~ehg A,@@J^ȀH +UKDuT;@*u. -@ծ$4[^gy'|}5u:%;%,uD>ه,m) l4g ">6EO* -jnwH3c+NYTnNp~',Lv#̃>=g|^aY-{l,Hçά `_QP@AQqۘlJA6kW{j1tƒ>=3?xbof,d_S(BGТ+01?gT*Ji=qg!4nPT99X0Ⱥ#=-aYf0BZ6! -YD箪{c4wk"~E1M+O?#v#*cnWB( -Ra$UH%(TUhqjD[`# Ҍ鵡 b>FM+C2Uڧv[|-۞z7`P9EM$nݟu PD$6а= | ڳHlи!#f,1erwmP="(ORtuu 0|P+7t&Y_td܈#{O=xfl:uفeɍ5o [mBȝe -(Xg*1c6[ym1 : -8͈^Z|U{jMK?PPC'h0_B\NE6l7>ۅbb֞6((Gbw[] D#= :> fB֍PC@E ɦN)'t6k={9q ,j4Sr#z1Qy]S;#hM1C96+kLƏ}޽Q'p^K%yn4=wpy<"ш{@w`ۨ:AH1%t*Ԍ98նèo>Z6#@D͎>QhNzW) aO*M( X/SU4PZٽAl1 -#?=2,]-BT R kՠbł9*MexUW`p^}Z7Tnu||B [(-ԟ}ma qMKtG/<<]ApCqٔsObĐ8MI'F 6ݜWpNӵAf6]56sw# Y{#N?U,_ws07]%QY,FѮmJ%[՝+GdzЬеg j٨48jRe}ͨYPC,R,'g -vMAԖ':V[<rc2Z2rթBX BmlUt;Na*0]h0/ḋ7ki 'E?TS,R&DŽTĄkWo W#u|g9._ RuIh~g <߿];5BH~"֮Ube^/VE?ctq(KS@?zOH%[H)"m>4 LT (%bR/D> _ȚY@Vse:iO^;f> y#ܭM(ll̪*HGTu}K2Yo H׺~+C Jx#myg <;*&gׯ- ]IHk_)K}_) {9^ H&+>Bfk*6_+>\r?«[`01ز-B@@@HROOc'mYR81i#P{Ujpb3dfAcd(>y?͟@tcTp 'ThΚw;ΒXG0"V5q?}Bo͋UX.v֯yNh#TJY,+qEiw7^P<,!Ű(FŖ+:RߐO[Cc^ּ6FrK|xᣅB=BGd |^3끸U9\Z  HI1x4&b輀q*#I]ȚvMS ܽ9f䒙i0AHw@J=׬PW;l1W=QWӳst011[>Ydl>-Dڗ]}}0Cw6=]-lشY:?asü^GP)kOvpVmJjYf[LmZiap)C?qE[?5`5+W=<@\1cb|-ւ挀_NHA 7EK? 6-l$zUgDFwזK^. )W[i?-CKF#PK_DfrSmȠz"E92E#! Mmyym{)R"&sʷxJa6n0[BEGЁ2?MbUcҨʇ暾N#%'Z -Gx"A.̊{]匤53.u0T@1C$Yjy(v$!H#.vFRвl9Һk.N[e3KY,;/!kHî̻aG^s5U)ќkL߅Eh?紧^Ά@FiL@C&TRzA5no]S7-]6t!Ҩ0OX='CՓHI*4PHCt$Ҷ!Q+AD7DBZU(~de| -FzgY"-wAJ8u<_'D:4Mlrud dp$(*TI򜝈E ~j )vY-W}@`kHfqEv.oi4C]oŀ@Y-ChÅ6D#[Ҭ#>pAw0$da" - P fYt$ĀVM3##Y3A4!Wy"b@̥dvՑ% g"Ű\:l9j.tNgu8JjX]&T Wi/`~qdգf۩o\ο {r.²qtenYA-8\jypvec20`0\F0W?h95i{'՝ VKO"wR -,M;;W u -Z#̌͠j|Wᥬt4&!u^ٞ${>TyW,$nVuBzxlܻW,ziz(wu5#1}5+%NJRHDjN.sӽygJY:홓'C]6Y lױwx@E1PC^1e1xC|12 ^oJ p"5]WRܑ3*rI̬5͑>rnNn=Wޡ΀L4xug6ҚwqvIvM!A yxf`MˊۏÝOrCOa]1kpKG @M;RШ'ϯR>stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 17 0 obj<>stream -Adobed     - -    $&&&$++++++++++   - - - -    l|" -  - s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& -EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT -&6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?9f]$$`;sjRܒ-?>'Wr>yN|R~.*MT%1H%aɆL=HDCjͨ(y.YAߌ`/L&h*IOq&S"bFbEiZNߺc -bgZn潺m6;#} -~aFJIagxx_cx+Z %P>I'{nlj6dGqYK= cv9)sT͛6nfTRheǨ:ӹPdHj'űeca3C!bш^رTvܓ%|zj(]la-ZnȒ(T'NB$)֘֋z 6FL)Z0͍UsfGl ms>7~vap:U'l7ͮql\wU=Gp|+:.#Hd4v dZݘp'QЄeœI~bI끰Pe#e Jx;dVu24-kHґˠ1D ]7V`!Ne;Ӻf)o&ҤR% -v.:q8n#J\K?N~.5m^GR/GzgFk-/_PI `` ["l\ yC-Y}G!Lbllb{q9~D+f \ l F8^c2K RJqE2S$(HC4QJ q)_l( "ҵkU+KnZ -*r;e"CPpa@1h#|=1@KSqظl Z< 0Smz%_HHjSPup -IGR|pIpkigނb|M %cJy&)]&hg$|00Sc1x H91ݶ ixrV8nXŹx;cǃf!Ihi`pӐ> rt*ܰ8|rsEI ED0ˊoh䵚[9~>y&­_ލOk鑍!durWI>@|KJ,SM\}b1-5śdI͕bce>׿\z^Wӆxk endstream endobj 18 0 obj<>stream -H OAg4 be2,u„yŘH2;Evy69^XgYILH\`c+$88(=}/=]7;ZN4n~E풪svJ6gY)Xx5735#"HkI!&I@?&&#*%,ሃ[a@ endstream endobj 19 0 obj<> endobj 20 0 obj<> endobj 21 0 obj<>stream -HOAߟP UӊaƜSscFQC -%~|/ʲͰINJfbd`gceaIANF#V4nAA2fbltMQϫ9 Y5sRg$O'DDd~a endstream endobj 22 0 obj<> endobj 23 0 obj<> endobj 24 0 obj<>stream -HOA߮a CVUrz^atk9B#}ġΡ_ȮĶF`S7:*OeEyGf1Q&aB  ӽޯyuEs$;u5+ e3 񌒑AO^GNKVCF͓ q bL endstream endobj 25 0 obj<> endobj 26 0 obj<> endobj 27 0 obj<>stream -HOA?IV-Lj:cZϕ#YG͛(kj*K-˳{'wmM$R I`g0b1AN=;ڷnh^Ӹn%U U3e#%E=y9#JcR*G$r b endstream endobj 28 0 obj<> endobj 29 0 obj<> endobj 30 0 obj<>stream -H7ڍ B*'[1G3mB kc endstream endobj 31 0 obj<> endobj 32 0 obj<> endobj 33 0 obj<>stream -Hڅ܉`oǍ7L"-їP` k endstream endobj 34 0 obj<> endobj 35 0 obj<> endobj 36 0 obj<>stream -Hs'qhcAߑ6|V@k endstream endobj 37 0 obj<> endobj 38 0 obj<> endobj 39 0 obj<>stream -H^s'h>c;چF)l6 endstream endobj 40 0 obj<> endobj 41 0 obj<> endobj 42 0 obj<>stream -HVX<: 7l endstream endobj 43 0 obj<> endobj 44 0 obj<> endobj 45 0 obj<>stream -H?߰߯ܭ۫۫٩ب֦եդҢѡПϞΜ̛˙ʘȗǖƔœÑ ~}{{ `3 endstream endobj 46 0 obj<> endobj 47 0 obj<> endobj 48 0 obj<>stream -H?߰߯ޮܬ۫٩با֦դԣҢѠϟΝΜ̛˙ɘȖǖƔĒѐ - }| `| endstream endobj 49 0 obj<> endobj 50 0 obj<> endobj 51 0 obj<>stream -H OAѯVSK{X+,knyyj,ZZ,X9cqQ'y9YziI: cF O o׼:yفlGQtAJSOXH2> endobj 53 0 obj<> endobj 54 0 obj<>stream -HK/2J2s`) MQILL4"̙{:"HHBR$2|Ģ˟oyy:5LK|2e=[Q(/0k!]x\?G - <4OisQ;l_)V VYx-gYϚ72Gi3uHe`;S zh:,a( endstream endobj 55 0 obj<> endobj 56 0 obj<> endobj 57 0 obj<>stream -H /BѯUS \M #ZXd ]nSݒe+ 3n2n0VT-SWY3xM9Ɠc0!ܞ=sD琛\qKOkKm.{<6np좴NIAΙM3k2eHF\.LEsڐY  Ga~ endstream endobj 58 0 obj<> endobj 59 0 obj<> endobj 60 0 obj<>stream -H O2d"+V9rsMƔ"z"<,;mMu8W~#B4WO?/c#7CC'O>йmeyGw jf&T ()kiȪTJ2 -җd$$.K=#,_|cb endstream endobj 61 0 obj<> endobj 62 0 obj<> endobj 63 0 obj<>stream -H OueE˵0Hss12WzK99)1!>_]]mMuU,}̼L=LL\]  >YZih|anJUϏ e %53y%9Gܓ#~K5 a1+" c endstream endobj 64 0 obj<> endobj 65 0 obj<> endobj 66 0 obj<>stream -H‰OAQs+esX/=ɕQ93RlIlDV1Q~~_XD -1 2 03120t3pws}>i?Ѳ|=;jVTn([0S2Q4R4PГ&#{E)-$5Hj$oJg -brr^Od 0&dQ endstream endobj 67 0 obj<> endobj 68 0 obj<> endobj 69 0 obj<>stream -HOм!bʔ%;R9E7BM<{¶ʶ¿̦̟ouqg'E=-if)7|%fr@39óA(SzaBtNh|DGKÓŅzHŁlFيdA2S:h`` / 0Jd endstream endobj 70 0 obj<> endobj 71 0 obj<> endobj 72 0 obj<>stream -HiSQFn Ck0ֶkD1nr6y..VOf#~c-b%JLxeg'4$8(0?{LGK÷{D{RdhJB.x?G=C=%k&cB1>A>F:B2 I" `meh endstream endobj 73 0 obj<> endobj 74 0 obj<> endobj 75 0 obj<>stream -HOqJ5bLˑur&W2W25ǾϞ;ssSI<8Hsl3lObd`*.XFyaafA&~>y/C8pws}A·Eli=R}GGQ|KIKQCAt"$*e endstream endobj 76 0 obj<> endobj 77 0 obj<> endobj 78 0 obj<>stream -HOqbVއy3u/T;ywBZgWcgjFuE\e" V+=;&YFiF)$8[:״h_Һf 3#,vJ/ cG<EÇq~EFq!;f| endstream endobj 79 0 obj<> endobj 80 0 obj<> endobj 81 0 obj<>stream -H SaRQ\Sc)wm, -I6vy:!a* -lo ^`'**we̓,gi -vd kW0K|Q(~}m734\4Nx?(;HlTxR`f endstream endobj 82 0 obj<> endobj 83 0 obj<> endobj 84 0 obj<>stream -H K1TQHT̃BGV(n>v2M\~S19tWXPWv/lٖ扵JcYdY`(,Oi{iSL|%g;~ʛuu0 J?B/LO  -%M? 5/5Í +g endstream endobj 85 0 obj<> endobj 86 0 obj<> endobj 87 0 obj<>stream -H…NBa_A2rhƝrҭĕs-s9q8J E5eafbd7O\\_>,C,< cg^O <]\t(;m+- -3M3G&jFz*:C_+h endstream endobj 88 0 obj<> endobj 89 0 obj<> endobj 90 0 obj<>stream -H‹O_VKl+L,eZbgg']tmVKT+1߾ƴDe2*3c/W_7ONvV8_1>Dޣ4oa^x |3TOЂhT<P?C9@rOCM~oƥ:3}9O$W ҦQ0M$Zע`1_7a endstream endobj 91 0 obj<> endobj 92 0 obj<> endobj 93 0 obj<>stream -H‰OA_&SiʬV+ṯ!{-ce\+s4߾IJBd.20-W$8(0 M?E?O^^_!>|xi{h=tӼqGW銚Nmx:%o%g!kY˘e&yʸ> endobj 95 0 obj<> endobj 96 0 obj<>stream -H /&gZ5b7Xbe,N%.]3-sCanÐy l&?&_|^L_-qOx-9S£̃!m]nq8{\rC3Ec˭Iu8z } -e*K-RE=ꂷ4?t*pa<;fƲG %4)TOdb| endstream endobj 97 0 obj<> endobj 98 0 obj<> endobj 99 0 obj<>stream -H KObJ.J@CEy0\0$%+Bh7ט?2S֘(U -2"}D7_ 4?"I|iҺ=L#D#[W?/7ԯ|hh> endobj 101 0 obj<> endobj 102 0 obj<>stream -H‹Oizk=T2j1S׹:ղ^XBZ߾P緆a^]aPГ,(x?Vf/)xJQRfccaMhAT(Q|^˙*NVldm/,Ms 3Yaqr 0c. endstream endobj 103 0 obj<> endobj 104 0 obj<> endobj 105 0 obj<>stream -H‰OA_X1r4cr_y5VˤDLaY|V;""u5U~*K̊L |12f3ŇH`= F z缞rJ(0O<yhi"yup!:;SQR9Oi. yF,˚"mPvTIS_i5c endstream endobj 106 0 obj<> endobj 107 0 obj<> endobj 108 0 obj<>stream -H‰OA_,^JQ,15xXQcm%5E6"%EV~,s,|gJ0312fA~^n^o. ';근:H7TyBQRdhFpγ )aT8QƵر:z 0c endstream endobj 109 0 obj<> endobj 110 0 obj<> endobj 111 0 obj<>stream -HOכ3DUJ09w^w.cyf 2k[fWb--)ɳβʰX,,)fIL_$>3DGKjܼߡݢPuQqQvR -ՁjGDQ352ҹ^<;L ct2*d8 endstream endobj 112 0 obj<> endobj 113 0 obj<> endobj 114 0 obj<>stream -H‰OA៴#a(9<=^sUαs,}C2{;;[MuUeEyYY?LbL# _Bt|?KCM#jvj|!ېT,-HH7͈&D#5Y-"9I]*ӄ,~q~`1d endstream endobj 115 0 obj<> endobj 116 0 obj<> endobj 117 0 obj<>stream -H‹k߰6^zt=ti#44Hv$-5+U 3J&F -򆫜^%ԂN^K:d endstream endobj 118 0 obj<> endobj 119 0 obj<> endobj 120 0 obj<>stream -H‡nA߁*ym%f.JVksѸFQ#ɹskk˛h endstream endobj 121 0 obj<> endobj 122 0 obj<> endobj 123 0 obj<>stream -H‡nAJQ#X!h{S\F;9*_(s/[kA^s?-)$v 8jmMT#*2"gcceau3r1r2~3p0ӷѳkcILLD(jRѣK` i endstream endobj 124 0 obj<> endobj 125 0 obj<> endobj 126 0 obj<>stream -H -@wc؊X(݁kw~ʧ"e^%%Eysgd9I`ۨDX*2(#gnj'cQv M- 0vi endstream endobj 127 0 obj<> endobj 128 0 obj<> endobj 129 0 obj<>stream -H`!*V{ -1jTh}c#vpOl`7ـ!pVf fy>p!FFIc#xUKQB܏U/T S j5 endstream endobj 130 0 obj<> endobj 131 0 obj<> endobj 132 0 obj<>stream -HiB9 0' 7ெw]vT8~a`7*+5pe\dk|C%Xpwyls:ff -`CR"zz s(O#`j endstream endobj 133 0 obj<> endobj 134 0 obj<> endobj 135 0 obj<>stream -H`bbOԨM{ooO~mjlh{CҮaW嵂U*qQ<ǜtzcK akK endstream endobj 136 0 obj<> endobj 137 0 obj<> endobj 138 0 obj<>stream -HWP(v4N,_A1*X{d" ќÙ:߄&>&c#C~ ˏlĥq58VPf}wEcZfJd;[RƱ1 k endstream endobj 139 0 obj<> endobj 140 0 obj<> endobj 141 0 obj<>stream -H,P]-v슁X ,$$k%163S~N8#!n}\{S-oؗUxvpKpd<2VV1Rl[ endstream endobj 142 0 obj<> endobj 143 0 obj<> endobj 144 0 obj<>stream -H,‰P_d%_ $;%ww5||朹H]|gQ 1F}~6=ܻE 7k/->7cZDXA6WxW歮%6 Vl endstream endobj 145 0 obj<> endobj 146 0 obj<> endobj 147 0 obj<>stream -H,‹B`/&ˡ! -SjB="#Hw8'_އ5+z]8TۼॉW_沊~a{mu endstream endobj 148 0 obj<> endobj 149 0 obj<> endobj 150 0 obj<>stream -HyKpZ]hL4osNF#5oLԒ\nةVa[ƦO"++<_Yfif)I& / c |J%zb7G {;BbvPl`04ѯ}h^K((gNPP9rCgea endstream endobj 151 0 obj<> endobj 152 0 obj<> endobj 153 0 obj<>stream -H{kAq{in!D6zpD؆Xj\\UXXPa_f+YX|//.rf0K3M1I?qc|EF0z=G};hOZM ՍfjblAydF6!)>n e endstream endobj 154 0 obj<> endobj 155 0 obj<> endobj 156 0 obj<>stream -H‰n_\qL}VMl A\A|rUƳI(pho_ʶ¦̦ĺȺ*2""<<,4a01e1B|y|МhoWg$;'Dၦf3 endstream endobj 157 0 obj<> endobj 158 0 obj<> endobj 159 0 obj<>stream -H o`3Ĥ2g0mW -܋s\\\t: -GpٗdW6yr2o}yYiI;#1D鿉0[4}4^0<nBw;> endobj 161 0 obj<> endobj 162 0 obj<>stream -H,‹N`KVl%oj5Ye5FEʿyv[ W*OW[nSCf# -߰fqż.1x;,a)OY>38D'hqJ~Fg endstream endobj 163 0 obj<> endobj 164 0 obj<> endobj 165 0 obj<>stream -H o`a1q!&s+ZFhʔO{=sVW98*X2]~;<šAb/࣎Yì^(av:*'.,3,4DO8Z -8"¼9C~><(d7 Tg} endstream endobj 166 0 obj<> endobj 167 0 obj<> endobj 168 0 obj<>stream -H, a2#{D\f㓧GW;m -/gS| (g endstream endobj 169 0 obj<> endobj 170 0 obj<> endobj 171 0 obj<>stream -H‡ -A_ B5" Dkm_ʻ!_u^5U -{{[kkKsScc}mBnrce00'G^n.wʞCvtlhV4liQMF~ )hQ endstream endobj 172 0 obj<> endobj 173 0 obj<> endobj 174 0 obj<>stream -H, o q HQUL8戫[hO[ak\;\nm<596[* -fSG廄Q(S*l9Vr$Yif|4$8.G1>>0,C-k~C{t/Hh endstream endobj 175 0 obj<> endobj 176 0 obj<> endobj 177 0 obj<>stream -H,‡ -ACff{F\#7.7~5 -2"<> endobj 179 0 obj<> endobj 180 0 obj<>stream -H,‹P#bB%&oP^ -Wt,KMs\?gH'\>1.#.C!>Çow9kZH-:`m endstream endobj 181 0 obj<> endobj 182 0 obj<> endobj 183 0 obj<>stream -H4‰B`/d$YAyTv3י#r7W}bb#B}y[665~g6xo5zxbqO~. n endstream endobj 184 0 obj<> endobj 185 0 obj<> endobj 186 0 obj<>stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|X]To endstream endobj 187 0 obj<> endobj 188 0 obj<> endobj 189 0 obj<>stream -HD03I>: r :(=e$%VQs<2}&/\RBѧQ~{զV16z%Uo endstream endobj 190 0 obj<> endobj 191 0 obj<> endobj 192 0 obj<>stream -HL0 QeЭ\N *%oN)>=[׈/٧'x|;xPm[3 hU> )Yp+ endstream endobj 193 0 obj<> endobj 194 0 obj<> endobj 195 0 obj<>stream -HT‡ @ʎ% `/ihǻljanw)̟s2;Mtc:F#Lp endstream endobj 196 0 obj<> endobj 197 0 obj<> endobj 198 0 obj<>stream -HT [ -8%pUˡj>cr`: \n2Yѵd"g -0qqH endstream endobj 199 0 obj<> endobj 200 0 obj<> endobj 201 0 obj<>stream -H\W P8e,B1 $oOS߳#䁸GWͯ[ צTy`q endstream endobj 202 0 obj<> endobj 203 0 obj<> endobj 204 0 obj<>stream -Hl @Ay5Bf'=7pwY5IQ(#s0BrY endstream endobj 205 0 obj<> endobj 206 0 obj<> endobj 207 0 obj<>stream -Ht ?M]P>e.w&NhN[jJr endstream endobj 208 0 obj<> endobj 209 0 obj<> endobj 210 0 obj<>stream -Hl н͢*Gav}󂅐n)ߵ^ʇ{k5éSI> rn endstream endobj 211 0 obj<> endobj 212 0 obj<> endobj 213 0 obj<>stream -H?].#пK0tŁ\~guł~NC0~ 5r endstream endobj 214 0 obj<> endobj 215 0 obj<> endobj 216 0 obj<>stream -H?].Et/s}~ÆDsX endstream endobj 217 0 obj<> endobj 218 0 obj<> endobj 219 0 obj<>stream -H?]!]FG.aX_џ DA9s endstream endobj 220 0 obj<> endobj 221 0 obj<> endobj 222 0 obj<>stream -H?2B:]$ -t7 endstream endobj 223 0 obj<> endobj 224 0 obj<> endobj 225 0 obj<>stream -H?.t^2%IXt endstream endobj 226 0 obj<> endobj 227 0 obj<> endobj 228 0 obj<>stream -H?~}zxvsqol j -h f c `^\YWTQ c endstream endobj 229 0 obj<> endobj 230 0 obj<> endobj 231 0 obj<>stream -H, -@w{X݁.ZhM:|VZA-({[k^^r2䐐8(\XY'^&nF.9tJŁb}+} =$;_m=-0i endstream endobj 232 0 obj<> endobj 233 0 obj<> endobj 234 0 obj<>stream -H, dwfENct0-&zwW]>k> endobj 236 0 obj<> endobj 237 0 obj<>stream -H,‹ -`&& 36ȝ22b?r:‚Cwxxkη:U.8e8%>88-`m7Ӽy)cyg LO> endobj 239 0 obj<> endobj 240 0 obj<>stream -H,`o"f=h46%iK?#1!Nvv6^ -?x4جÔqq¨̗E<98dx]o$J2Z ZVPCguj endstream endobj 241 0 obj<> endobj 242 0 obj<> endobj 243 0 obj<>stream -HP_ 5k/B̒ ד#,)``>{xu> endobj 245 0 obj<> endobj 246 0 obj<>stream -H,PŖڤ?jB|'7K壿;[i4xuj{U*.cE.j^L&߬eئ٤:)VUL. 0Gg9 3 1F~9` Lk endstream endobj 247 0 obj<> endobj 248 0 obj<> endobj 249 0 obj<>stream -H$QE?Cmg;(1ZYX;~wm=͖MUu5]eK<u,>]V 7iS\%Lpa5q4I'*Dl5 endstream endobj 250 0 obj<> endobj 251 0 obj<> endobj 252 0 obj<>stream -H,‰c_C -&ehZtΜll-WHHHdlsd9M9'?Eh{¯1?G!Joqԕ|h&:5Ux[fT 0Gl endstream endobj 253 0 obj<> endobj 254 0 obj<> endobj 255 0 obj<>stream -H,‰@} -%rT捹. [J,9DŽ&|C\Dg'Iqڼo!jrP:vU+elKFOc m endstream endobj 256 0 obj<> endobj 257 0 obj<> endobj 258 0 obj<>stream -H4PE8j -/ggd }>>Znr 7RsMOU=VLW+EEt5-Vˌ.Q7dY\$W}m endstream endobj 259 0 obj<> endobj 260 0 obj<> endobj 261 0 obj<>stream -H?]пKE9t: s endstream endobj 262 0 obj<> endobj 263 0 obj<> endobj 264 0 obj<>stream -H?2CIC..^ Bt endstream endobj 265 0 obj<> endobj 266 0 obj<> endobj 267 0 obj<>stream -H?.tLC :tx endstream endobj 268 0 obj<> endobj 269 0 obj<> endobj 270 0 obj<>stream -H?ީܧ٣ס֟Ӝљϗ͕˒ɏǍŋÉ|zxvsqomjhfda_ ] [ -X W U S P O M K H F E CA? 0Q endstream endobj 271 0 obj<> endobj 272 0 obj<> endobj 273 0 obj<>stream -H?ߪܧڤآנԝқИΖ͔ʑȎƌĊ‡~|ywurpnljhfca_ ] [ -X W U S P O M K I G E CA [TRn endstream endobj 274 0 obj<> endobj 275 0 obj<> endobj 276 0 obj<>stream -H?߫ݨۦ٣ס֟Ӝљϗ͕˒ɐǎŋÉ}{ywurpnljheca_ ] [ -X W U S Q O M K I G F D  6S endstream endobj 277 0 obj<> endobj 278 0 obj<> endobj 279 0 obj<>stream -H?ީܧڤآ֟ԝқИΖ͔ʑɏƌĊÈ}{xvtrpnljgeca_ ] [ -Y -W U S Q P N L J H F  S endstream endobj 280 0 obj<> endobj 281 0 obj<> endobj 282 0 obj<>stream -H?ߪݧۦأנԞӜљϗ͕˒ɐȎƌĊ‡~|zxvsqonligeca_ ] [ -Y -W V T R P N L J H  ٽT< endstream endobj 283 0 obj<> endobj 284 0 obj<> endobj 285 0 obj<>stream -H?߫ݨۦ٣ס֟ԝқИΖ͔ʑɏǍŋÉ~|zxvsqomkigeca_ ] [ -Y -W V T R P O M K  AT endstream endobj 286 0 obj<> endobj 287 0 obj<> endobj 288 0 obj<>stream -H?ީܧڤآנԞӜљϗ͕̓ɐȎƌĊÈ}{ywusqomljhfdb` ^ \ -Z -X W U S Q O N  )Uq endstream endobj 289 0 obj<> endobj 290 0 obj<> endobj 291 0 obj<>stream -H4@H 5>!Th ;g9}~SrK?_1sC]SCz_[}\y;b1k^ c~ZBiP?to_km endstream endobj 292 0 obj<> endobj 293 0 obj<> endobj 294 0 obj<>stream -H4D)(yUb$; +iAgD@kW~p/oi5rMoT+,e ^``no endstream endobj 295 0 obj<> endobj 296 0 obj<> endobj 297 0 obj<>stream -H<0# h5X@"G›gOfg+xj<%B634 -z' -iQ8G4Gdn endstream endobj 298 0 obj<> endobj 299 0 obj<> endobj 300 0 obj<>stream -HD BP31D%$Ւ}c==1=;X@/]ix់zFQx[KGn ya`oR endstream endobj 301 0 obj<> endobj 302 0 obj<> endobj 303 0 obj<>stream -HD… @ ?t !p;R|#pVϢK'6,nB5{[ZTq#o endstream endobj 304 0 obj<> endobj 305 0 obj<> endobj 306 0 obj<>stream -HD… R1ꮔpBk\sw^) G$ llW6_=ureƿ [v[VFO*p3 endstream endobj 307 0 obj<> endobj 308 0 obj<> endobj 309 0 obj<>stream -HT YnE)/zPŲYۏU҂9|h7|}H$p endstream endobj 310 0 obj<> endobj 311 0 obj<> endobj 312 0 obj<>stream -HT@0wkQAY@״峰[FS&TaQ؞HCuѾ\ c]q endstream endobj 313 0 obj<> endobj 314 0 obj<> endobj 315 0 obj<>stream -HT ذDaH_N;ugWǶ*<,cC+q/ӭ`s|Oq endstream endobj 316 0 obj<> endobj 317 0 obj<> endobj 318 0 obj<>stream -HdQPLTI`M8 ۿWx%}$s/ONq endstream endobj 319 0 obj<> endobj 320 0 obj<> endobj 321 0 obj<>stream -H?߫ݨۦ٣ס֟ԝқИΖ͔˒ɐȎƌĊ‡}{ywusqonljhfdb`^ \ -Z -X W U S Q P  XV endstream endobj 322 0 obj<> endobj 323 0 obj<> endobj 324 0 obj<>stream -H?ީܧڤآנ՞ӜҚИΖ͔ʑɏǍŋÉ}{ywusqonljhfdb`_ ] [ -Y -W V T R  V endstream endobj 325 0 obj<> endobj 326 0 obj<> endobj 327 0 obj<>stream -H?ߪݨۦ٣ס֟ԝӛљϗ͕̓ɐɏǍŋÉ}{ywusqpnljhgeca_ ] [ -Z -X W U  7WD endstream endobj 328 0 obj<> endobj 329 0 obj<> endobj 330 0 obj<>stream -H?ީܧڤآס֟ӜқИΖ͔˒ɐȎƌŋÉ}{ywvsrpnmkigedb`^ \ -Z -Y -W  ٔW endstream endobj 331 0 obj<> endobj 332 0 obj<> endobj 333 0 obj<>stream -H?ߪݨۦ٣آנԝӜҚИΖ͔ʑɐȎƌĊÉ}{yxvtrpomkjhfdba_ ] [ -Z - 2X endstream endobj 334 0 obj<> endobj 335 0 obj<> endobj 336 0 obj<>stream -H?ީܧڤ٣ס֟ԝӛљϗΕ͔ʑɏȎƌĊÉ}{zxvurqonljhgecb`^ \ - 1Y# endstream endobj 337 0 obj<> endobj 338 0 obj<> endobj 339 0 obj<>stream -H?ߪݨۦڤآנ֟Ӝқљϗ͕̓ʑɏȎƌĊÉ}|zxwusqpnmkihfdca_  `Y endstream endobj 340 0 obj<> endobj 341 0 obj<> endobj 342 0 obj<>stream -HJ@6R% B#ĈHth)**QjJ)E%! -[:2?*%.Ty?MLk,4χ<%h4> endobj 344 0 obj<> endobj 345 0 obj<>stream -HJ@||Q$"$QJ"Fɘ([FJij$FEHL0+wuz'wS>5>zH7MG-Y)I+A}hĨGPݥ607[׹Z -erA-9Y$uue"yFHҴUĄ=tV[ endstream endobj 346 0 obj<> endobj 347 0 obj<> endobj 348 0 obj<>stream -H kAϮ-2ɲ֚&<2l D-s2E/s2yfd"210 3 rtpuG׼_Qt9gOɝ>&eD҈xh@Г=>{v WK^̣MsC` \I endstream endobj 349 0 obj<> endobj 350 0 obj<> endobj 351 0 obj<>stream -H/яfVcceYf5cdiWRW.1iVVƚ'&cC yWs2tt/h|ӌ!ш.vkcajGTyQ9 .[oR@ s맰Fǵ*.,,Z 9Oƒ<<˙if"<)!b 0@$] endstream endobj 352 0 obj<> endobj 353 0 obj<> endobj 354 0 obj<>stream -HOA_,ee iѦ5Ŝ#y<{1 c9,%U"{~LLwr ''3G+.y9m/Oݴhp!; #9TlT-LG Փ9 f -]bj";U7-ſo] endstream endobj 355 0 obj<> endobj 356 0 obj<> endobj 357 0 obj<>stream -H /᷿lVV1MkYh;Cׇ[r"&K Sư|tna[|UHo* -/%e"O"mqI7m7\gZrIg+qN1h,Ǩ/PR26K9 aA~${^v=n -.v' ^W endstream endobj 358 0 obj<> endobj 359 0 obj<> endobj 360 0 obj<>stream -H OO4-cZ14b&Be45x]]: -"<Y~3,D~R|'ŘF3 #7;F zxEIANƓ5M 3+TL /ȝEԐVRP8#@8%vBT΃1a)# 0 _ endstream endobj 361 0 obj<> endobj 362 0 obj<> endobj 363 0 obj<>stream -HOߟmb&&3MiG^w71# ͳV5 }߾žζ_oUF-S:ϗJ3G4G ḅ"LLz0 @O4<_Qzr@#QQRtJތtx`B05ѓ>"uHRGBK_ endstream endobj 364 0 obj<> endobj 365 0 obj<> endobj 366 0 obj<>stream -H O3bŒ1L-S劐|Ṯ.YgWc'}fSf]bUeY~S3K0103 -1 2ѻ{ _^>=|\~EMEI󒆃oyQ=C8E8blLDH@^O-i Cj*Jb -r"2%E(>`q endstream endobj 367 0 obj<> endobj 368 0 obj<> endobj 369 0 obj<>stream -H O12a)[1b0D35BcCb9TTXP^`/6oMuUeEWQ#BLLL|0~fcM#v>iѰQjbldxC` ']KVC抷KjR*J -rb2bR"b"BUua' endstream endobj 370 0 obj<> endobj 371 0 obj<> endobj 372 0 obj<>stream -HOA߿N+dX#j9s2QX1WC&|ߡAb_Nd+WdS`gc72yYiI  ?~} <@//m7w\44|ynvCŊdAld͈x`@SQВא$&sAZEꜤSb'DDd$a endstream endobj 373 0 obj<> endobj 374 0 obj<> endobj 375 0 obj<>stream -H OsaV0Hs_9Qm#dʩ©_oC}}]4$8(,"BLLL}< 9:ih==;V-̼()xUAxEᒼ )q 11/" b endstream endobj 376 0 obj<> endobj 377 0 obj<> endobj 378 0 obj<>stream -HOA\hu0jēcO#!̕|TF*/cO7O$_/llqV,,"|>13 1 2 03120p3pw{c=;и튺%9Zgd4դT$$NNˉ;"* > endobj 380 0 obj<> endobj 381 0 obj<>stream -HOA/:13-/{Fc+KdvE -e+C`bU8Qa!fwLL| !dD2ӓ!j5dHF8 _c endstream endobj 382 0 obj<> endobj 383 0 obj<> endobj 384 0 obj<>stream -H‰OAIE9ZYG9r3˱}"}}]?m$kuUeE ?fL<~ŒB|ysuqvrдӰQRP5S1vCH@IOAGAtM^CNM -񂴒Wsgr'e?7d endstream endobj 385 0 obj<> endobj 386 0 obj<> endobj 387 0 obj<>stream -HOq&9b9j+u{T$r99 rgKmM+/&X%XED 31 2 03120t'\:8hӺianvKBLDHF0 둯)kiȪ\!.yW  q er endstream endobj 388 0 obj<> endobj 389 0 obj<> endobj 390 0 obj<>stream -HiS b"L*k(vȑsl9:X4VgWaWBPl ?: %2]M;W#(;>"ȷa7^1dpA?D/Hnw?3:>^ZpSwꤶLA΋dE )(:r 0f1 endstream endobj 391 0 obj<> endobj 392 0 obj<> endobj 393 0 obj<>stream -H Sabdr4GQE"ǢiIfiyvl+l_f#Q\=`0,-XaVL2M0ݠТ|Dx31: 2F _ѻ킎9.化XR=+((#`f endstream endobj 394 0 obj<> endobj 395 0 obj<> endobj 396 0 obj<>stream -H‡nQ"6AЊ+ߦjj=9*2/WI|y[kKKZOqNrJrLps ߬B,,,}|LL> endobj 398 0 obj<> endobj 399 0 obj<>stream -H Sa%9R;a*q*3ϩ©̱d.W7!>.+n3llY+ g$FiI820= ~>{;4ķՃz˗ kŇC_Qf6+e g, hW endstream endobj 400 0 obj<> endobj 401 0 obj<> endobj 402 0 obj<>stream -Ho 5⌳BTcTko68ɣ7_kM^Uo<9S1!>..6&!c|>ɏ(0KY1$cea2P9:*+䫕E̴h 0_i endstream endobj 403 0 obj<> endobj 404 0 obj<> endobj 405 0 obj<>stream -H -@wc؍(`Zݹau5wWgG{A咑4'ucC}Bbll"rf %NFj; @mogk=m=-ljih 04i endstream endobj 406 0 obj<> endobj 407 0 obj<> endobj 408 0 obj<>stream -HE@wA -).ŊK:ے|7x&Uyp/s+kkK1)1#4zC}BrcZ-bdd`gc337SQaQm ,o=j endstream endobj 409 0 obj<> endobj 410 0 obj<> endobj 411 0 obj<>stream -H?]ѿK"vv - CbG?OcG?N# r endstream endobj 412 0 obj<> endobj 413 0 obj<> endobj 414 0 obj<>stream -H?]пKxE9,7*u s endstream endobj 415 0 obj<> endobj 416 0 obj<> endobj 417 0 obj<>stream -H?.S]]ć .ltM endstream endobj 418 0 obj<> endobj 419 0 obj<> endobj 420 0 obj<>stream -H0J8 R]@Fmێ+|^88yX?n`ۏM?nͯhiO&.iT $-pG9DaDb͋T7T%DDL ;w߾ -U[PXyqr) endstream endobj 421 0 obj<> endobj 422 0 obj<> endobj 423 0 obj<>stream -H?߭ޫݩܨۧڦأע֡՟ԝӜћЙϘΖ͕̓ʒɐȏǎƍĊ É ˆ ~||zxw >` endstream endobj 424 0 obj<> endobj 425 0 obj<> endobj 426 0 obj<>stream -H?߫ުݨۧڦ٤أס֠՞ӜҜњИϗΖ̔˓ʒɐȎǍƌ Ċ É ‡ ~|{zx 2` endstream endobj 427 0 obj<> endobj 428 0 obj<> endobj 429 0 obj<>stream -H`DjWFc_Z &ij:=]:|k*[& Vq}" -P9,ޤyJ&Nc)c"X0RL4?kW endstream endobj 430 0 obj<> endobj 431 0 obj<> endobj 432 0 obj<>stream -H?ުݩܧۦڤ٣ءנ՟ԝӜҚљИϖἘ˒ʑȏȎǍƋ Ċ È ‡ ~~|{y Ia endstream endobj 433 0 obj<> endobj 434 0 obj<> endobj 435 0 obj<>stream -H‰`B Mm4b> endobj 437 0 obj<> endobj 438 0 obj<>stream -H /oihB_kƘKV-YZjZ}_+Z0ްʰ_?|eb=[(/aC<x<zxhrsIIcl\ns&gS]bldh`$o#Y0:֎VƓˢf"G&#SyIhn&TRRSȏf #xa= endstream endobj 439 0 obj<> endobj 440 0 obj<> endobj 441 0 obj<>stream -H,@E4=tt2f.32(G#~}| wyoof7uyT=/qWM>:U^Z^JK;I7!7_Ql endstream endobj 442 0 obj<> endobj 443 0 obj<> endobj 444 0 obj<>stream -H?ߩިܦۥڤ٣ءנ֞ԝӛӛҙИϖἘ˒ˑʐȎȍNj Ɗ -ĉ Ĉ Æ }| /?as endstream endobj 445 0 obj<> endobj 446 0 obj<> endobj 447 0 obj<>stream -H4@sD$* b!Oc1 R5*!%\s?|1# UgyGG/l>y]i6r-m endstream endobj 448 0 obj<> endobj 449 0 obj<> endobj 450 0 obj<>stream -H /Bѯ)SG~o X--LaJq+n鶲a194=-m  ~|_χ3^> endobj 452 0 obj<> endobj 453 0 obj<>stream -H4‹`(SdBFCPI7v3GݠPC">z'۳l\9|hjCEaxOS+,?kt`nQ endstream endobj 454 0 obj<> endobj 455 0 obj<> endobj 456 0 obj<>stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|ۼ<]1o endstream endobj 457 0 obj<> endobj 458 0 obj<> endobj 459 0 obj<>stream -HD@0ȨУ"gngE Q-kL9ەGՁƽ7S huh`Ro endstream endobj 460 0 obj<> endobj 461 0 obj<> endobj 462 0 obj<>stream -HD HÆ]O w-qOVx+}J:J r\37%A?0G> endobj 464 0 obj<> endobj 465 0 obj<>stream -HT @ зu$D$2g@wپoVU¥ -8dx -sNqT endstream endobj 466 0 obj<> endobj 467 0 obj<> endobj 468 0 obj<>stream -H\ 1ph+ -~h7މq#=7<߇֕E,`r endstream endobj 469 0 obj<> endobj 470 0 obj<> endobj 471 0 obj<>stream -H /BobafhҢѰhcXVzܺw=%4ZZYΙ> endobj 473 0 obj<> endobj 474 0 obj<>stream -H OAOaSR-ZZ5rha$ J4gggO7OoCAq>b(o^/x9s)O'ixH>0=BԃR.@Oe{v7MN uE1q6)*UjyJ\Rm&a$,ڸY[¼dMXb endstream endobj 475 0 obj<> endobj 476 0 obj<> endobj 477 0 obj<>stream -H O7,J\ZZh)SF1$G4Y,V&Ʉ.W'waA~0!:-4/hv)/.N*'TyvP>tHΓ -<77qFrrd6 Qj]I4&NEQZ5^Z )K EHQ*b& endstream endobj 478 0 obj<> endobj 479 0 obj<> endobj 480 0 obj<>stream -H OA/VhTjԬEZ2hռ].dj12 svKEF"~sd0L1L0яҋ {I93ZA儦1u7G<x@EIu=**vwۡMƭMD̕IRؐgsƹAYWyAL.+:U\,FK^b\ endstream endobj 481 0 obj<> endobj 482 0 obj<> endobj 483 0 obj<>stream -H ‹/_&uXjX1)F-by5nI5y~3K?G^#Py?#^ty>Axq. ZmhlRߠΕK5j\p쿇2U7%ʋ\(8Mӹܬ9;3NO&GKbBu\TDf`hVb endstream endobj 484 0 obj<> endobj 485 0 obj<> endobj 486 0 obj<>stream -H OWKH՚4Y,DS +-5,w[-GSQzfbdK30 J?G ottNhy:! yrSߣˣ> endobj 488 0 obj<> endobj 489 0 obj<>stream -H ‰OAM)jRba-Ԩu,{!re4Zj $"8(~t/9 -/-cGiR;O]JNJw(nţ&9 Y3 &Rܭqk$*VaJ\V28]kU:0/{sb endstream endobj 490 0 obj<> endobj 491 0 obj<> endobj 492 0 obj<>stream -H Oᗆ2Yiֵs>+T:itϞa(}0!~|K9gvBZ44xNvnuכ7(S4S0Q073]#'Jj2 J#kbKZQɄiaa& )c( endstream endobj 493 0 obj<> endobj 494 0 obj<> endobj 495 0 obj<>stream -H‹/GY)V,b%h0XDݝӺVE$j]/CUQ$"4K:)$F#N;93ZQ|0Cxe.;TnQ">HyuJkܭrf2%r^E2dFݣ{Lu+ez圐6izRO 0cW endstream endobj 496 0 obj<> endobj 497 0 obj<> endobj 498 0 obj<>stream -H OW)*bb[d9J9rWd 왧% -řG3cax~5!zAzWнs>=ܴ\44Ψ.PQRP:h``$D@dY˓zq$ZIﬦZbk]ܔ -X0c endstream endobj 499 0 obj<> endobj 500 0 obj<> endobj 501 0 obj<>stream -H‰OA"!̑kc&yMRjDX۷|de!0Yi4;&)~nNd|(|y1ҿwN)o'Fx |D ihyipDr R[S=@!S٣KJBѼCy*m) c endstream endobj 502 0 obj<> endobj 503 0 obj<> endobj 504 0 obj<>stream -H OAab„ƒaVɔu:!ae1 \X{'6u5[i)fILoę\u88(" B b^]?/^|3Z.yJANFDZXx3S7Q:hԼV^$P`c endstream endobj 505 0 obj<> endobj 506 0 obj<> endobj 507 0 obj<>stream -H Oc#цkU}M۰ -{s3%&ؾyeUU(Gafbbd/120r3cbcc}MD󊆑OZaUCE%se%%EQ.:/y$d+ endstream endobj 508 0 obj<> endobj 509 0 obj<> endobj 510 0 obj<>stream -H Oqӈ4Tbja\SF6Rj2gw ykWa̮̾M#y,-S_IIqqJ%s-Wh 8j1B/wHTQtt>d/3Z|titq,;ipf+Sb6 0dd endstream endobj 511 0 obj<> endobj 512 0 obj<> endobj 513 0 obj<>stream -HO/B[ɣWL_$] sט>Hb,&'1QPoQ(a!A7k~|Z/ɍtŷ%]'_E>EZ6>M+ u@ c*G-̼xƽYd endstream endobj 514 0 obj<> endobj 515 0 obj<> endobj 516 0 obj<>stream -HSaB>䣖ֶCiwȑ3gqo]=.SWEysY _i{Z;qq> endobj 518 0 obj<> endobj 519 0 obj<>stream -HSaQܹR+Zl,!`D}yNe%Eyq._mW~ӬS_X%Y=| P1f{wDDkC|2 03xQ<\ 5]lېHW|^ҲкiCkqN( TTϨ`e# endstream endobj 520 0 obj<> endobj 521 0 obj<> endobj 522 0 obj<>stream -HWsQ -F"e6-yː9ܾkKKs5)I>~w6kUeL\DG1 3} 1 203xQ<šw{,l4-44Lԍb@ՀGQyDY]ea endstream endobj 523 0 obj<> endobj 524 0 obj<> endobj 525 0 obj<>stream -HiS0!!qK9u5"R\Te%ES`9`.%I6olr22gEX! 30I͋aȍC'?ҳ&߭tXP(&'e endstream endobj 526 0 obj<> endobj 527 0 obj<> endobj 528 0 obj<>stream -HƒQ ۵l mcq뿝oo̻īȳ >V^qn.q&v&6VFqhfhb`oѕjhhiIU44de endstream endobj 529 0 obj<> endobj 530 0 obj<> endobj 531 0 obj<>stream -H$N@v%{ʔ) - -"ETRV) ˻ X=ybav9[xŨaTW_^d"Zm=ڞ7-W)$je\XDY<0J% Or^) f+ endstream endobj 532 0 obj<> endobj 533 0 obj<> endobj 534 0 obj<>stream -H -'n1fn5[pے&|xUy*<2Z[XZ912ȉbbdw0m,tf:& "fa endstream endobj 535 0 obj<> endobj 536 0 obj<> endobj 537 0 obj<>stream -H‡P 6-BZQOPiBH=9)>x9G^.:jp۸p 4q®XCE `_]9d^XIXJJ"FFa`1f endstream endobj 538 0 obj<> endobj 539 0 obj<> endobj 540 0 obj<>stream -H,Wg=-8d(vm3wg,#^Cw']nKKsr8VU*s(c0(`ٻzV2Z-6)j\*1((0+gee@.}rS?:f endstream endobj 541 0 obj<> endobj 542 0 obj<> endobj 543 0 obj<>stream -H,@@w;IqbJ-5a1ߑ yx&Ͼzx]poK6qNZ\Ǣ<r۬d4+52!8vLH+bgOGg+ endstream endobj 544 0 obj<> endobj 545 0 obj<> endobj 546 0 obj<>stream -H,@#P,ذ{E}b Vl&[⻐xx8"M<&߆|𥏸N:jsh%79h Qg -O-S y_Uyu&R`Sgp endstream endobj 547 0 obj<> endobj 548 0 obj<> endobj 549 0 obj<>stream -H$U`o{lbXKzWn76c^Kd 0_Sg endstream endobj 550 0 obj<> endobj 551 0 obj<> endobj 552 0 obj<>stream -H$UPE3QݭKf"&v|cD.L?S}p/C0}kG/m&vYeK̢n 1svaiK%Y  gg endstream endobj 553 0 obj<> endobj 554 0 obj<> endobj 555 0 obj<>stream -H,WPe ؕ"{Ũ;7o2M&AsqrߖJ.||Ư)?]=sM8c߇|/}ipR|H@+s,h4 endstream endobj 556 0 obj<> endobj 557 0 obj<> endobj 558 0 obj<>stream -H,U6 c-bŇopW% o;ׄ1v xKO}zjvRu&k ;[mED6e-_h{ endstream endobj 559 0 obj<> endobj 560 0 obj<> endobj 561 0 obj<>stream -H?ؼպӶгΰ˭ɪƧģ}zwtqnlie}cz`x]uZr~Wo{TlxRjvNfrLdoIamF^jD\gAXd>Ua;S^9P[5LW2IU0GR-DO)@K&=H#:E 7B3>0;,7'1!) "  cVF endstream endobj 562 0 obj<> endobj 563 0 obj<> endobj 564 0 obj<>stream -H B09Չ10S>Au|' 'uG]$]Lte;!C8ꆚG4~A ppj&F()x?e0+I^QQ'IˆV-]tUuc;02˴˺W endstream endobj 565 0 obj<> endobj 566 0 obj<> endobj 567 0 obj<>stream -H?ީܧۦ٣ءנԞӜҚИϗ͕̓ʑɏǎƌĊÉ~|{ywvtrpomljigedb (Zj endstream endobj 568 0 obj<> endobj 569 0 obj<> endobj 570 0 obj<>stream -HJ@ыf(IF E(D!fKEQTLe#{#bhbDR2;g~`[ -2_E> |gey-@^DG-Њ<OAN?qm͏zDe%7} -{wɹ&EjI'W(kWy%QEM’)8`[ Z endstream endobj 571 0 obj<> endobj 572 0 obj<> endobj 573 0 obj<>stream -HJ@kS)HP$ ,K6T́23L[6iUG2oy)$ͣXa$3> endobj 575 0 obj<> endobj 576 0 obj<>stream -H /S1Y2L3fYʹfIi9Tsk}LQ3h.ӿG/eMsCG-uAC3GS"oA^TT|˓ܔ\mS"$ INjm5+ė,q> endobj 578 0 obj<> endobj 579 0 obj<>stream -H /W?ke̲˘1ej̬Ɩ%Uqn}PjƘV+e - [K3G-N7JG="/ǴC<y@cG=v)Pڦ&7.d7ȬqBz ;وZXMdZG&cpjr, -\D endstream endobj 580 0 obj<> endobj 581 0 obj<> endobj 582 0 obj<>stream -H kAo4mMd-ZdH1]=*-Ҕqa}][m?6E -|YXfXx=[8/1QfwLŒC  oyvrtp oۨYZ(_#)xh` '#{IFKZCJ̓^)J -YD.; -0/?\ endstream endobj 583 0 obj<> endobj 584 0 obj<> endobj 585 0 obj<>stream -HO/oZXZ5ZeZ2r].ՕLHѰZcF6I, IO jtnVih*4d~$"0U||F ^ -n^]y9"{H}R{$$$<۸pM6P׹\CYE^A5#,#,Z .?k -0Q]< endstream endobj 586 0 obj<> endobj 587 0 obj<> endobj 588 0 obj<>stream -HJ@[QFQXRTHa>f/I a9;6 k:?*" -_9ZY LS3͇ zSj q^cTNx9C(GqÎp -a`lclD@]Ba|d H>$/g9'Sr9] endstream endobj 589 0 obj<> endobj 590 0 obj<> endobj 591 0 obj<>stream -HTB R4*A{.kWT1OwZe]ιy|6/᳭-䄳1Cm"5hC=vI?th endstream endobj 592 0 obj<> endobj 593 0 obj<> endobj 594 0 obj<>stream -H4kBP3$G&p9}F?A}NN!>{ o]L`mI2yyAA)k|`i endstream endobj 595 0 obj<> endobj 596 0 obj<> endobj 597 0 obj<>stream -HLY0л JwAN|FO&I|՚ |}0/X\_2:q{#opXiG endstream endobj 598 0 obj<> endobj 599 0 obj<> endobj 600 0 obj<>stream -HLkBPo3A.*P)-~8>Z]-_gc7>LM1'bh3]y<!|@囯.RAi endstream endobj 601 0 obj<> endobj 602 0 obj<> endobj 603 0 obj<>stream -HD@ _ -.~&$vVԲ{gxKdH_h&_zx>8҆Z3_i endstream endobj 604 0 obj<> endobj 605 0 obj<> endobj 606 0 obj<>stream -HT0 0 -=&wȇ3jPϫ, |俻䛞k|RGC`>Υomhpj endstream endobj 607 0 obj<> endobj 608 0 obj<> endobj 609 0 obj<>stream -HTY@0 .)d7Yj~T߽h /4s9 -;H{ 0jV endstream endobj 610 0 obj<> endobj 611 0 obj<> endobj 612 0 obj<>stream -HL0 r9FK;k{XN5W+F -ǷtwZ`s~&TM̧GHC9xj endstream endobj 613 0 obj<> endobj 614 0 obj<> endobj 615 0 obj<>stream -Hl[SܩΜhп'r̞ϣn]ىj -#8j endstream endobj 616 0 obj<> endobj 617 0 obj<> endobj 618 0 obj<>stream -H7 ڍ܅@?v"Hh; -[y3 m``uk" endstream endobj 619 0 obj<> endobj 620 0 obj<> endobj 621 0 obj<>stream -HkAm emk-˹3 Bl9Bf߷W̏_Evllr|Y,X'řƘ|D{y>y}O뎦-u'7T\Qtth``%oLDHڀG%uF q Q5 -AIDAAx/^9 endstream endobj 622 0 obj<> endobj 623 0 obj<> endobj 624 0 obj<>stream -Hk-[hdQ&ҶmggEt[䑅Qhy|ʶƦ -Ey~r|gY%fi)& όEF8_1Qz|ѽsC0 ~T%7 \(NE;3Ȟ [y9F2248ɀQpq-1 {"^ endstream endobj 625 0 obj<> endobj 626 0 obj<> endobj 627 0 obj<>stream -H kWo-G!2լiMbȝ6PP_}]mUeEyY(0 #?C+?n.:/~u;5V*|)()j5jUdHߒ!$qM%!A) gxN8 -0_3 endstream endobj 628 0 obj<> endobj 629 0 obj<> endobj 630 0 obj<>stream -HOߟ¬&&3L+kGns<> endobj 632 0 obj<> endobj 633 0 obj<>stream -HkmEАXBFu;:ĥƐGf4Y &:* -M"?V2,_>%>Dif)L$$3K/J0AZ~>ԼT> endobj 635 0 obj<> endobj 636 0 obj<>stream -H O3XL5&b9fsڗ+ iVx}}]2O -ll -s,3,$'313$䞱7.NZѾuC5f&jWTT t)ג;%{1 )5)#JDeD%D<;` endstream endobj 637 0 obj<> endobj 638 0 obj<> endobj 639 0 obj<>stream - - - - - application/postscript - - - Adobe Illustrator CS2 - 2008-05-07T15:15:31+02:00 - 2008-05-13T12:05:55+02:00 - 2008-05-13T12:05:55+02:00 - - - - 256 - 108 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAbAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWP+ffO2k+SvK175h1MlobVaRQKaPNM20cSV 7se/Yb9sMY2USlQfFHnv8+/zH833Uvq6nLpmmOT6WmWDtDGErssjIVeX35mlegGZMYAONKZLz5Lm 4Sf6wkrrcBuYmDEPyO9eXWuSYPoTyt+bn5kflfdaXb+b7n9P+VdSRHgkeUS3cURAPKNmPqfCCPge q9lIyuUAW2MyOb6o0bWdM1rSrXVdLuFutPvIxLbXCfZZT89wR0IO4O2UEU5AKMwK7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+dP+cz7u4Xy35btFJ+rzXk8 sg7c4ogqfhK2XYmnNyfNl35F822eg/p6702WDTKrWaSiMBIeKMYmIkCMej8eJ8cutppA6J5f1vXb 0WWj2U19dEcjHCpbitacmPRVqep2xtQE787+TPOXl+LTrnzIGDXySLAkjMzx+g3BkcMBTxUrVWG4 JwApIL6I/wCcNvMs915b1zy9M5ZdMuIrm1BP2Uu1YOq+weHl82yrKG3EX0TlLc7FXYql/mC81Cy0 a7vNPgW5ureMypA5IDhd2ApvXjWnvlWeUowJjuQ3aeEZTEZGgUl/L7zwvmrT7iWSJLe8tZOMsCEs ODCqOK+NCPoyjR6rxQb5hyu0ND+XkADcSn+rarY6Tp0+oX0gitrdeTt3PgAO5J2AzJyZBCJkeTh4 sUskhGPMsW8ieddc803FxOdOjtNIhJVZyzM7v+yi9FqBux/rmHpNVPKSaAi5+v0WPAAOK5lmmZ7r HYq7FXYq7FXYq7FXYq7FXYq84/NT88fK/wCX4FpKjalrsic49MhYLxU/ZaaQhvTB7bE+1MNK87g/ Nn/nJPWV+u6P5Lhh09vihEtvMGZT0PKWaLn81UY0qa+S/wDnJWZteXy5+YOjny9qbusQuQskcIkc 0Alimq8Snaj8mHjQb40r3bArxDz5/wA5HSWfmKTyv5F0dvMWsxO0UkwDvEJU+0kcUPxy8f2m5KB7 4aVI5/zY/wCcldJhOo6r5Mgk05BzmVLebkqdz+7nkZKU3LKaDrjSvT/yn/N7QvzE02WS1iay1S0C /XtOkYOUDdHjcBeaGnWg9xiQrPMCuxV2KvGf+cjdPgvLv8vEuChgk8y2lvMkgBQpMw5cq7caLvlu Pq1ZOjA7vzXH+Z/5XazpcqwP5iRHng02CCSCSynt7xEhgeWZ2WZriFiaqF40evtXn1GPDvOQiPMr GBmKAsoXQNTT8n/yqF3JpqTa9fa59UvJpY3FLdU9T1EVzEX/AHalY9+HIt71jh1mHPKsc4y2vYi1 ljlAbhr88dT0zzp+Tul+cVeKS5sNVl0+3vIopIVuITzFVjkPOPmqKzKxbiwIBpvmTHY0wnuLQ/8A zhlcFfN3mC3ptJp6SE1/33MB0/2eDLyTh5vrXKG92KuxV2KvG3UeQfzOD7RaJqvc7IkUrb+w9KQf 8D880f8Ai+f+ifuP6nph/hek/wBsh+j9Y+1vVr3UPzK80JpWnM0XlywblNcUoD2MpB/abpGp+fjh ySlqsnDH6B+L/UjDCOhxccv72XT9H63qkFvpug6L6UEYhsNPhZuK9kQFmO/Unck+ObYCOOG3KIdB KUss7O8pFCeUfMf+ItI/Si2xtoJJXS3Vm5MyIePI0AAJau2Q02fxY8VU2avTeDPguzSdZkOK7FXY q7FXYq7FXYq7FUg8/ea4PKfk7VfMMwDfUIC0MbdHmYhIUP8ArSMoxV4V/wA43/l//iW/v/zJ81D9 IXc10404TgMrTg8pbkqRSqseMf8AKQdtloSr6UwK8Z/5yk8m2Oq/l7Lr4iH6T0N43jnUDm1vLIIp Iye6guH9qe5whU+/JbzDqfmP8nNOuTIW1WK3mshKx3MluWiiYt4lQhJ8cSrxv/nFbzH5Z0PzBrun a9JHYa5eeklpcXZEZPpM/rQcnpxcsVNK/FT2wlX1YrBgGU1U7gjoRkVeTeSPySvPK35par5uttQh XS9R+tBdLijZSiXEgkVa140Vl6DDavWcCuxV2KvHf+cnrAXvlLy7EZmtlHmG05XKU5xhoLhQV9y5 UD3wTyGEJSAuokoMeIgebvL+m6SyvepbwfWZp3upGjjjT9/LXnKAgADNyNTnlXamszZchMyd/u7v c7zHjjEUE3ltrH0Zo5YovRuK/WEZV4ycgFPMHZqjbfNbGc7BBNx5eXuZkXs8X/5yPhsYfJWg2VhI LW0sr10tNJgVIoCJY3Z5BEoBJRgACNhzPjnfeyuv1OWcoZCZxEbs7kG+V+e/Pu2dV2jgjGII2Nsc /wCcUfMEOkfmstlct6a6vZzWKBqgesGSdK+/7kqPnnZ5BYdbiNF9rZjOS7FXYq7FXiv5iazP501t dE0C2F5HpayytcoKlyq/vOLfybBR/M1PbNFrMpzz4YC+F6js7CNNj8TIa4q2/H4DKPyU1DTZvLEl nBEsV7ayn65T7UnqVMch+gcf9jmX2ZOJgQOYcDtvHIZeI/SRt+pf+cUOop5ea+g1SS0t4l9CWxjB pc+uyqQ7Bl2C124nvj2kJcFiVDu77R2PKPi8JjZO991IXQdF1Xyl5Lu9VuNXlmj/AEaXttOKlI7e aYBxQ82BPqNStBkMWKWHEZmR+nl3Es8+aGoziAiB69z3gfsS7yvpf5heaNBt559fm0qxXn6M6l3u JzyJLsweNgo+yPi7dO+V6fHmywsyMY/a36rLpsGQgQE5fYPvRNrqHmDzrqVyLDWH0by3YP6EU8T0 uLhlp8RaqtuN+tBUbE1wxnPPI1LhgPmWuWPHpYjihx5Zb+QVrK917yr5x03SrrWJNa0fWCyRvOfU ljlFAPiJY/aK96UPTJQnPFlETLijJjOGPUYJTEOCcO7ku1LWte81+ZrzRdH1L9D6Pph4Xt+hpLJK CQVQgqeoIFCOlT2GHJlnmyGEZcMY9UYsOPT4hknHjnLkOlIa9n17yVrGm3B16XWdHvp1t7qG7f1H j5U+JSWbtUilOlDkJyngkDx8UTzbIRx6qEhwCE4ixSK8/a35mPnXR9E8vTmO5aJpXTkRGS5O8oHU IsfKh+7J6zLk8WMIHf8AHNr7PwYvAnkyja/xXvtKvOdp5t8o29jrI8y3V/dS3IjltXLCFiVL/DFy ZePw0Ip3yrUxyYQJcZJtyNFPDqDKHhxiK59fmj9X8u+eX0G88wal5juLG/hge6GnWrNHBGEUv6R4 utWoONfH+bLMmHNwGcpkGrppw6nT+IMccYlEmrPP3/j7GG/ndrWqah/zj3YXd69bm8vIEuGoBzVH l4k08fTVjmdo5meME83Xa/FHHmlGPIPRfyKt4Lf8pPLKQABGtTI1Kfbkkd36f5THMkuGzvAryn/n JvXoNM/Ke/tWcLcatNBZ267Emkgmk2Pb04mFffCFRH/OPOnjRvyi0QXjrDJe+teAOQvwzSs0ZFad Y+J+nEq1+YX/ADj55E863smqt6umatNvLeWZXjKafaliYFWPutCe5xtXlut/lB+cf5aWM2seT/M8 t/plirTT2kZeJhGg5FjaSGWCQKK13r4DG1es/kZ+aU/5geVpbm/iSHWNOlEF8IgRG/JeUcqgk8eQ qCK9R4YlXpGBXYq7FXz5/wA5BfmFpWo+avLP5d2C/W70azYXOqOlSIv3gWOAU6uwk5N4Cnjtdjj1 ackujIb7yPr+mX3PSFeS2Y1MHNUdParkAr4b1/XnKdodhmRvGAQenc7bBrI169imOleWfMd7MEuo fqyr1d3EjkE1NCGcAfM/RmDpvZqZl+8PDHyr9Dbk18QPRuUr/Oz8p01b8u76W2YPqWjxtqFkwU8w 0K85EUj4m9SMEU8aHtnX6PT4sA4cceEff73UZpSnuTb5Q1fz7qF9qukazb20On6xpKxH69bLxeaa AgxzSeLDgOuZ9ONb7x/Lvzrp/nTyhp3mGyIH1qMC5gBqYbhNpYj3+Fuleooe+Y0hRcqJsMjyKXYq 80/M3ztdGceU9A5S6ndkRXTx9VD7ekp/mYfaPYfhqtdqjfhw5nn+p3nZmiFeNk+kcv1sm8h+TLXy vpAh2k1Cej3twO7Doi/5KV2+/MvSaYYo/wBI83B1+tOed/wjkGA3xPkP8zluwPT0XVql6bKqSt8f /IqT4v8AV+ea2X+D57/hP3fsdvD/AAvSV/HD9H6x9qdfnRdwta6Hpk0np217eepNLWgEcQCMSfAe tXMjtOW0Y9Cfx97i9iwNzmOcY/f/AGIj82dYtpPI6xafLHcR6jcxW8bQMrqQhLkKVqNmjAyXaGUe F6Tdlh2ThI1FyFcIJ3/Hmy0aXJa+WP0Xa7SQ2X1aEj+ZYuCn78y/DIxcI58NfY67xeLLxnrK/teS +QPK3kHV9JYavMYNXt5HW5heb0Txr8LBWptTY++afSYMM4+o1L3vRdoarUY5+gXA8trTnyxof5fy edBaaJbXF0+m0uG1ETcrdXQ7D/K+Lb3+WXYMWE5agCeHe72cbVZ9SMF5CBxbVW6SeTfK/lDUb7Vr HzLK0GsW904VHm9LknenL7RDAk+2UabBjkSMhqQLlazVZoRjLELgY91ppB5b/LY+bbTRdLt7jULj +9muYZw8MPD4vjO4NKb/ADA65aMGA5BCNy+Ljy1Oq8E5JkRHdW5Tjyv/ALk/zW8x6l9qLTo1s4+4 V6hDT6Yn+/MjB69ROXdt+hx9V+70eOP843+PmGvP/wDuS89+VNEG6pIbyZPFVblv/sYXwaz15oQ+ P4+S9n+jT5cnw/HzCZ/m5qX1LyRdoDxe8eO2T/ZNzYf8AjZd2jOsR82jsjHxZx5boDzz+Xkuv/lD L5UtwFv47OFrSpABurfjIASdh6jKVJ98ycEOGAHk4WoyceSUu8l5T+Q3506X5V01/IvnZpNLm06a RLO5nRuMYZizwTUqyMshYqSKUNNqCtxDS9d1b88fyp0yze6l8x2lwFG0No/1mVj2ASLkd/egxpXh creZv+cgvP8AbulvJp/knR3Kl2/YiYhnqwqpuJgBsuyinWlSeSs3/wCcpvJVzc+QdJvNItq2nlyQ rLbxD+6tHjWPkB14xmNAfAb9BgCpx+V//OQHkHU/K+n2usanDpGs2dvHBeQ3R9KNmjUJ6kcjfAVf jWlajp740qr+ZH/OQf5f6P5dvI9J1KHWdYuYXis7a0Pqxh3XiHlkAKBVrUitT0A8GlSj/nFHyXqe ieU9R1rUIWt316WFraJwQxt7cOEkKnoHaVqeI36EYlXuOBXYqwX85vzJt/IHkq51VSrarcf6NpMD b8rhx9sjusY+Nvu75KEbLGcqDxz/AJxY/Lo6nf3P5j+YW+t3sskv6JErc3aVmZZ7t/8AK58kWu9e Rp9k5bkl0asUer6baNGNWAJyhvbVFX7IpiqySS3oUkdKEUKsRuD2ocVfnf8Amd5Ubyn5+1vQeJWG 0uXNrXvby/vID/yLdcy4mw4khRZd+QH5xS+QPMJs9QZn8s6q6rfpufQk+ytyg9ujjuvuBkZxsMoT ovuSGaKaJJoXWSGRQ8ciEMrKwqGUjYgjMZyV2KpNpvk7y1pmoNqNlYrHfPy5XBZ3f4zVjV2bc9zm Pj0uOEuIDdycusyzjwyl6e5OcyHGS3W/Leh65HFHqtot0sBLRciwKltjQqVO9Mqy4IZPqF034NTk xXwGrU9T8qeXtUsLew1CzW4tbUBbdWZwyAALs4YP0G+++Rnp4SiIkbBOLV5McjKJonms/wAHeWvq djZmxU22muZLKLk9I3LcyftfF8W/xVwflcdAVtHkn85l4pS4t5c05zIcZjur/l75O1a7a7vtNR7l zWSVHkiLHuW9NkBJ8TvmNk0eKZsjdzcPaGfGOGMtvn96aaPoWkaNa/VdLtUtYSasEG7HxZjVmPzO W4sMYCoinHzZ55TczZQGueRvKuuT/WdS09JbmlDOrPE5oKDkY2XlT/KyvLpMczchu3YNdmxCoy2R Wh+WNB0KN00qyS1En22FWdqdi7lmI+nJYsEMf0imvPqsmU+s2qaXoWk6XJcyWFuIHvH9W5YFiXep NTyJ/mOHHhjC+Ec0Zc88lCRvh5OfQtJbV01l7cHUo4/SS5JaqpvsBXj+0e2Jwx4uOvUozz4OC/T3 KOtaf5d1SOKPVRDNHA4miWSTiA4FOWzLX6crzeFL6yPmyw5MuMkwsXsrvruhps+o2y16VmjH6zid ZhH8cf8ATBgMGQ/wn5MM84+Vvyc82P6/mCGxubpQF+txyGKeg6AyQsrsB2BqMh/KGAfxx+bMaTL/ ADSxO0/J7/nHeymFw6fWuJBWOa5uHWo/yUK8vka4D2ng/nhkNFm/ml6Jp3mz8vtLso7HTri3srOE Uit4IWjjUeyqgGR/lPT/AM77/wBTL+T83837ldvzA8mEFW1KMqdiCkhBB/2OH+UsH877D+pP8n5/ 5v3PN9d8gf8AOOOr3L3M1vFaXEhq72TXNuvWv90g9IfQuH+UsH877D+pf5Oz/wA37l/l7yV/zjno Nyl3bQw3N1GapLe/WLmhBqCEkBjqOx41w/ylh/nfYU/ybn/m/c9GX8wfJRUU1aAAjYEkfgRhGuw/ zmP8n5/5pV086+UHJA1qyBH808a/8SIywarEf4h82J0WYfwS+RTS1vbO7j9W1njuIzSjxOrruKjd SctjMS5G3HlCUTRFPj78/NYuPPnnXWTBeCPRvKfDTNOt/tvd6hK/F0gjH2naQUYitFQHMuAoOJM2 X09+Xvkmz8r+VtJ0wIv1iytYopWRRGplCD1X4KSKvJyZtzueuUylbdGNJnql/pAljE6m4khY0RBU A9+RJC/s9K1wC1lILo/MWnkgMskSU+2yfCP+BrgpfEC+70fT75fUGzMKrKhqDXofA4RIhJiC+c/+ csfIE36H07zeqBrmyddP1CVf24Hq0Ejf6j1Tx+IeGW45NWSL5y1LQtRsLe3uLm3kt0uI45UWQUPC UExuPFJOLcT7H6bbaiH1d/ziZ+Y0uteWbjylfy877Qgr2LMfiayc0C+J9F/h+TKMoyx6t+KW1PfM qbXYq7FXYqteSOMVdgg8WIH68hPJGAuRA96QCeSFl1nS4vtXKH/VPL/iNc1+TtnSQ55I/Df7rbRg meiDm816VH9n1JP9Vaf8SK5gZPafSR5cUvcP102x0cygZvO0S/3Vqze7OF/UGzDn7WQ/hxk+81+t tjoD1KBm88ahv6UES/63Jv1FcxJ+1OY/TGI+Z/U3R7Pj1JQM3nLXW+zKkf8Aqop/4lyzGl7Q6qXI ge4D9NtsdDj7kBN5m15+t7IP9Wi/8RAymXa+qlzmfu+5tGlxj+FATarqkn95eTv/AK0jn9Zyk6zN LnOR+Jbo4YDkB8kBNJJIau5c9asSevzysyJ5ltAAQ75IMwoPlgZBbHbXM7cYInlb+VFLH8MthCUu QtJkBzKOg8m+aLmnp6bMK9PUHpf8nCuZ2Ps/PLlA/d97TLW4o85D70wg/KvzTP8A3ggt69fUkqf+ SYfMzH2NnPOh8f1W0y7VwjlZTC3/ACZumobnU0j8RHEX/FmT9WZcOxJfxSHy/saZdsjpH7Uxt/yZ 0FafWb25lI68PTjB+9XP45lQ7GxjnIlol2zk6AJnb/lT5Kipzs3nI7yTSfqQoMyI9l4R0v4tEu1c 5618AmVv5G8nwU4aPatT/fkayf8AE+WXx0eIcohplrsx/jl80zttM021p9WtIYKdPTjVP+IgZdHF GPIAOPLLKXMksf8AzP8AOlt5N8jarr0rqs0ELJYoxAMl1IOMKAd/j3PsCctiLLVI0Hyv/wA4reVv 8QfmY2rXtZoNDha+JcluV1KfTiLV7jkz18Vy7IaDRiFl9h6td+jCIlNJJqgf6opyP4jKYhvkUht0 jklCBQscZoFpTfvthJak5EcfHiFHHwyDOlGxd7LU/qW/1e4BeJeoV6FjTwBAP04eix2NIT8yPLie ZPIWvaIRV7yylWD2mRecJ+iVVOGJospCw+B9CmudROqQ3k0k4/RkpVpGZyotFEsQFSaBfT4jwBzK cUMn/wCcevMj6D+begy8uMGoSnTrha0DLdj00B+UvBvoyMxYZYzRfeuYrlOxV2KuxVLtdsPrdi3E Vli+OP3p1H0jNL29oPzOnNfXDcfpHx++nI02Thl5FhbdM8tDt1F8sDIKL5MJUXywMgovkwybh0++ ujS2t5JvdFLD7xmXh02XJ9ETL3BEskY8zSYweSPME+7RJAD0Mrj9S8j+GbXD2DqZcwI+8/qtolr8 Y62mVv8Alqx3ur4DxWJK/wDDMf4Zs8Xs0f45/Ifj7nHl2n3RTO3/AC88uxU9VZbg9/Ueg/4Thmxx 9g6ePO5e8/qpol2jlPKgmlt5b0C2oYbCAEdGZAzfe1Tmfj0GCHKEfk48tTklzkUxVFRQqAKo6ACg zKAA5NBLeFXYq7FXYq7FXYq7FXzP/wA5gaP5r1K+8tx6daXd9pqRXLNFbRySqs4ZAWcRg0PBgFJ9 6d8P5nFi+uUY33kD72ueOUuQJRP/ADhjYCHSPNNw6lLh7q2t5FYEMPRSQ0NfeQ7Uy3KeTHF1e3eZ jLHe2Min4H5RsCNhUqfvP8MrinJzCyP0lV3pRqVqPbJEJVodSXYkcqdvc9MhSBJfD/pOpwPvyjJY sPDiR9xrkjyZcyneQZvzws7R7WTzDJAqhphNZWSkrGrLJLSQry49EWg+eZduJSA8n2V//jfQrWKN heNqNosKjrzM6BaH54SdkAbv0ezDcx2KuxV2KuxVhev2H1S+biKRS/HH7V6j6Dnl/b+g/L6g19E9 x+kfD7qdvpsnFHzCWJBNM3CKNpG/lUEn8M1eHDPIagDI+QtyDIDmmFv5U1WehdVgU93O/wBy1zfa b2b1WTeQEB5/qDRLWQHmmlt5Jslobmd5T4LRF/42Ob7T+y2KP1yMvdsP0uNLXy6Ck0tdB0i2oYrW PkOjMObfe1c3ODsvTYvpgPjv97jT1E5cylOo+fNLsdXudIisdQvrqyWJroWNpJcJH6ylo1Zk2BKi tMzwGlkFvdRTRxsDxeReXpPQOvSoZa7Fa0OKoPVtf0vS7H67cy8ofXgtR6X7xjNczJBEgC9zJIuK rdU8x6XppsRO7O2pTNb2iwr6hZ0hkuG2XsscDGv0YqirK/gu7W3uF5RfWUWRYZh6cq80D8HjPxK4 U7qemKq4miLcQ6lqlaVFeQFSPnTfFUFBrmn3Gt3mixMzX1hBBcXS8TxVLlpFiHLpyPosaYqvs9Vt bpJXXnCIZZIT66mIsYn9MunKnJC32WGx7YqivVi3+NdmCHcbMaUHz3xVpZoX48ZFbmOSUINQO4xV firsVQtzqmnW3MTXCK8dOcYPJxWlPgWrd/DMPUdoafDfHOII6Xv8ubZHFKXIMM1K6+vXktw67Psi t+yg+yOrfTTvXPMO1NedTnlk/h/h93T9Z83bYcfBGlLyemnaHr12Vi9JdcaISSrsvrxBlTkPF1bj y67KPl0vs32wdsGQ7fw/q/HVxtVpwfUOfVnV/YxXluYXPEgh43G5Vl6HO3BdbIWkl1a3FoGaRSYl 39RQSKe9MnYYHZC2ZM5KWSFyep4txB/ymIoMdmMTfJkWn2ItkLMeUrfaPgPAZAm20Bh2qaleTeYN QWO8mFvCY0iSKR0UViVm2QrvyJzgPaHtDPj1JjCcojbka6B2umxxMAaDzLWPyE/LvU71bs209rJ6 hlmSGd+EtTUowkL8V/4x8cxcHtXrIAgmMveOXyr7bYy0GIm6pNvL35TeQPL+tWWtabpfHUNPkEtt JJPcSAMBT7Luy9/DbBj9qdaJAylxR6io7/YyOhxdB973PPSXVuxV2KuxV2KqF1ZWt0EFxGJAh5KD Xr9GYmq0OLUV4keLhNhnDJKPJVihiiXhEixqP2VAA/DL8WKGMcMAIjy2YmRPNdliHYq7FXlek6bq 0fnDXLrUdD19ZdU1jlFf2V3BFZfVYljtreSRFu43ZRHDzasRahpQ9MKpJe/l35jg0nTdX0zQ0fzb LDrOoalNJIqSfWNQV1W0aVJEbpeOyhHC8kryBNSqkemflz5lsA4XyhNPpU19pct3pZOn23q2dglw WqkUro0vryIxWR2ZlCguSTRVN5Py780tY30FhpDaXp2oHVLiy0xZIibM6r9UsQlFdo0KQfWbhlQ8 V5cVqcVTK68gzwpHrj6bHaamddvNTn1KYqz2On2cE0dpRgXYLIlvb1RK9fiG2yqA/KOLTtT80aI9 ppkFnLoOjyy6tdwXMF213fXsixxzySwNJzLpHO6tIefxnam5SrL9HvfMGl+cPM1xdeWtSul1a/hW zvbc2Zt1tLe3jgjZjJcxygcxI5AjPXudsVYf/wAqs1fUfLGqfpnSFuNXfRoLPToZTG6xX9/LPdX9 wo5lecU939rr8B4nfdtU1/RXm+C4ezby7czW0fmOfWbu8EtqVuYLRGbT1iX1OfNjBbqS6rxI+5VO fys8napoN7qj6zZqly/F9NmikMkFtaXLNO+nQBiWUW87NVqDmCvhxVKvRMCoXVXaPS7yRGKskEjK ymhBCEggjMXXSIwTMdjwSr5M8Q9Q97A0ChBx2Wm2ePHm7xdgVSubeO4geFxVXFMnCZibCss8o63J qNi9vdGuo2JEd0aU5g19OQf64G/uDtSmeq9kdoDU4Qf4hzdRqMXBLyKe5tHHdirjuKYq8ttf+Otq i1rxlQV/55Lnm/tT/jZ9w+4O20f90Pj96Ozm3JdirJdC1/mFtLxvj2WGY1JbsFb/ACvfv8+vf9h+ 0Ay1hzbT5CX873+f3+/nrdRpq9UeSf51rhOxV2KuxV2KuxV2KuxVbM7Rwu6oZGVSyxggFiBWgLED f3OKvK/Kv5p+YbnT7u+vNJudTmlR9XisrP6qiWekOzi1LSvKvqSSrE5C/aJU9FpU0rLNB8/wa9r0 2naVpt1NY2yRPdaw3ppbIbi2S6ijAZ/UZykq8gq/D3wKxu//ADM8zDVZrS30eRozr6aTp6Q+i81x Fb2xuLz7cwQHlGVDHiFBFdwaGlXTfntoUVjDM2nTrdC3mu9QspJ7OGS3jt7iW2dQZZkWZzJbycFi qSBXaoq0rI/NPmTUli0Ox8vmMah5jnEdrdzxs8UFusDXEs7RgpyIjSiKSKsRXArEdP8APcPlq71W J7pfMEEf1RUtrOw+pai13dXRthH6fGGGZG6qwNdmG+FU2sfzMvZtQu7UaReXWptM0NvoUQthLCtp BDJdyPcGf0WVXukSvIfH8Kg7tjSp75A8w3vmPQH1q4jMMN1d3YsIXT05EtYZ3hiEi70ciPkfngVk mKuxV2KoTV3aPSr11NGSCVlPgQhOY2tmY4JkcxGX3M8QuQ97BE48Bx3FNs8dLvF2BXYqlmq6jqGh uNd0yOOW7t0ZHt5SVSaNt/TZlDFdwCGAND2PTN52DrjgzC/pPNqzY+OJDflj/nJf8rNZiCX18+g6 gp4zWWoxsnBhsw9VQ0VK+LA+wz1PgPTd0XiDqm+rfn3+UWmW7TTeZrWegqI7QtcufYCEP+OPhlTk DwH82P8AnKnVvMFtPo3k+GTSdLlDRz6jIQLyVDsQnEkQqR4Et7jLY465tUsl8mf/AJL26w+QdNIF OcSEj3KAn8TnlHtHMy1cvIvQ6cVjj7mdZom5TnuIIIzJM6xoOrMaDJQgZGgLKo+w8v6jqYpNG9lY ts7yjjM61IZUjPxL0+04HiAc6rsz2ayzkJ5fRHu6/scTLqox2G5ZznoDq3Yq7FXYq7FXYq7FXYqo 3tqLuzntTI8QnjeIyxkB15qV5ISGHIVqKjFWJXf5W6TLHHBaajfadZNp1vo9/aWrxKt1ZWiusMcj PE7oQJWBaJkNCR8jap/5f8t6doMF1BY8/Tu7l7uQOVNGcKoReIWiIiKijrQdTgVLtL8g6Vp2sJqc V1dSNFcX13DayvG0KTakVadhSMSH4lYryc05sOnEKqkT/kp5fD2zWup6nZhLWOyv/q80aNexRSNK GnYRchIXkbk8XA0JHfDasn8y+VLTXIbKlzPp19pk31nTdQtCglgk9NojQSLJGysjlWVlIIwKldr+ WmmR6sur3epX+oakbm1u5p7l4aSPZxTRQqUjijRIx9ZZ+KBfiofGrauP5a6fHdre2OqahYXxkvnu LuB4fUmj1GcXE0Ll4nAVXVRGUAdANmxtU/8ALuhWegaFYaLZM7WunwpbxPKQ0jBBTk5AUFm6tQDf FUwxV2KuxVbJHHLG0cih43BV0YVBUihBGCURIUdwUg0xq78h2Z5NYXc1mxpxQkSxrT/Jaj/8PnPa j2a08943H7R+v7XLhrZDnultz5P8zwNW1ura8jC1IkDQuSOwAEi/ewzV5vZI/wAEgfs/W3R1seoS a71GTTXEWr2sthKfs8wDGxoCeEiko1K70O2c9qux8+E1IOVDJGXIsX8x+ZGvwNO0uCS7uZvhit4V LyO3sB+voO+ZvZfZWScxsuTIICyxPSP+cQNb1WeTU/MutxaZLdyPPJp9nH9ZZPUYtwMzNElVrvRW GenY5CEREdBTz0oGUiT1ZPbf84a+Qlp9Z1rVZdvi9NreOp9uUUlMPilfBDr7/nDXyG8LCw1rVIJi p4vObedQ3YlUigJHtyx8Ur4QRnlK4ttAin8tahKIr3TJngYsCgcKaK6hqHi60ZfEHPL+3dHk8eUg HoMRuAruZRDdpdTra2FLy7cVSGIg0UEAu56IgqKsf10Ga3R9m5tRPhjH9iZzERZZfoPlmKwC3V7w udUNSZqfBFUU4QA/ZFDQt9pu+1FHpHZnZGLSx2Fz6ydXm1BmfJPM2rjuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRvfqX1Sb696f1PifX9fj6XDvz5fDT55GdV6uSY3 e3NBaF/hn0ZP0D9S9HkPW+o+lx5U25eltX55HFwV6KryTPiv1c0zyxi7FXYqx/zL/gL1k/xJ+jPr Ppn0fr3oet6dTX0/U+Olf5e+UZfD/j4fi24+P+G1Xyx/g305v8NfUaUj+s/UfS5U+L0/V4fF/NTl 74cPh16K+CMnH/Fad5c1uxV//9k= - - - - - - uuid:E5FA3B3F1DD811DD86BDF21B8BE353A9 - uuid:9149C83E227611DD96FDE93621064FD0 - - uuid:E5FA3B3E1DD811DD86BDF21B8BE353A9 - uuid:C90DC6BE1DC111DD86BDF21B8BE353A9 - - - - - endstream endobj 640 0 obj<> endobj 641 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<>stream - - - - - uuid:5211b95b-20e8-11dd-bb5a-001451637df1 - adobe:docid:indd:3cfd1026-228b-11dd-8acb-e160abe3ef62 - proof:pdf - - - - ReferenceStream - 72.00 - 72.00 - Inches - - uuid:9149C83E227611DD96FDE93621064FD0 - uuid:E5FA3B3F1DD811DD86BDF21B8BE353A9 - - - - - - - 2008-05-13T14:30:06+02:00 - 2008-05-13T14:30:07+02:00 - 2008-05-13T14:30:07+02:00 - Adobe InDesign CS2 (4.0.1) - - - - JPEG - 256 - 256 - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQACgcHBwcHCgcHCg4JCQkOEQwLCwwRFBAQEBAQ FBEPEREREQ8RERcaGhoXER8hISEhHystLS0rMjIyMjIyMjIyMgELCQkODA4fFxcfKyMdIysyKysr KzIyMjIyMjIyMjIyMjIyMjIyPj4+Pj4yQEBAQEBAQEBAQEBAQEBAQEBAQEBA/8AAEQgAtQD/AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7NirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVaxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqF7fWenWst9fzJbW 0C8pJZCFVR7k4qwK8/PHyTaymOEXt6o/3ZBCoU/8j5YW/DFU+8sfmH5X82yfVtMuGS7oW+q3C+nK QOpXdlan+SxxVk1cVdirsVbxV2KuxV2KuxV2KuxV2KtYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXiH59axeNqmneXo3YWwgF48a9JJHkkiTkO/ERmnzxV5NNDNbyNDOjRSIaMjgqwPuD iqazahqlvZ6ZLHb/AFE2RJtr2NSkrODz/vBQ7V2yROzEAAvpXyRrzeZfK2n6vL/fzR8Lim372MmK Q0HSrLX6ciyT7FXYq3irsVdirsVdirsVdirsVaOKpLpus3L6pPo+qrHFdIA8HpcuMiUqT8ROYuHU SOQwnz6OdqNJAYRkx2Y9b6N6prrQXa6TpiLc6lJQ+m1QiL1LOR7Yc2p4ZcEd5I02iEoeJM1D7fgm sHrein1niZuI9T068eXfjy3pmRG635uJPh4jw8lTCxdirsVdirsVdiqA1vW9N8vadLqurTehaw0D NQsSWNFVVG5JOKsQ/wAQfmJ5kiS/8qafZWGmS/Fbz6mz+tMnZxGn2QfkfY4qtHnTzJ5Umgi/MO2t Y7O8f0odR08uyK/XjMjVPTeu3yOKsi82+bbDylpa6hdK08k7iG1gStZZWBZVqA1BtuaYqx8y/nLO /wBZjh0a2jO62sjSswH8rMvU+NDiqbeUvOB124vNG1K3FlrelHjewIS8R34843PUf574qyjFXYq8 t/MALbeerC/iSKa9/RjJZRSqGrIlxykIDUHIQPIVqeuRnkjjiZSNAKImRoJfD5SMvmoeaZbCB4ha 81sCeKG9SEhfhqwVDIopuaVzVn2j0QlXEfk5H5LJXJLPzBnudQ8n2k/mVIbHWIrz07dU/wB2RenW X4UMnwhzsT7fM5+m1uHUxuEraZYpYzuGY/khKH8ltGHEggvZkqK0FVikpuB/Pl7F6JirsVbxV2Ku xV2KuxV2KuxV2KtYqw7zvcR2V3YX1rJx1KEsVUCtYt929q/rOa3tGYhKMgfUHc9jYzkhOMh6D96Z +U9Phh09dSaQXN3fj1Zrg7nc/YqfA9ffL9DiAhxXZl1cbtTPKWXgqox2AQthqOpXvmWctbSrb2yL A0RkXjEz/F6jANQkhe1crxZsk9QdjQ29zbn0+LFpB6hZ3uufki7bzN9efjY2csyJKY5piQkUaA05 lz123oO2WQ1nGfTH4tOTs7wh65AbbDqWv8SzSRveWmmz3Gnx1LXPJFJC9WSNjyYY/myRxCJMe9P8 nRB4ZTAn3ftRN15gs4YLWSBXupb4VtoYh8bilamv2QK71yyeqjEAjfi5NWLQzlKQPpEeZLVlrby3 o03ULR7C7kQyRKzLIrqOvF074MeoJnwyFFc2jEcfHCXFHr0Q48zSXBuV07T5rs2kjpIwZUTin7QZ u5/lpXIDWGV8MSabT2cIcPHMR4gsXzW1xaG+sNOnuLeJeU8hKoEoKsFrUvTvTANbxR4oxJHVJ7ME J8M5gE8mF/mjKvmLU/J2gqWWy1a4FxMDsSjGJV+kJI+ZUJCcQR1cHJA45mJ6bPU440ijWKJQiRgK iqKAACgAGSYME/Og248h3QmpzM8Agr158wTT/YcsVXa/5PufN/kLSbJJvq+qWkFrcQSSEgessKqy uQCd6nfxxVLE87fmD5VtwPOHl5r62gFJNRsXUniP92SKnNfv4Yqy7yrfeWPMED+Z9AgiSW8JjuZv SVLjktKxzFamo27nFWQYq7FXm3nKcXfn/StPsDHLdwWM7zIftKGZHQcuxPH7sw+0tGdVhMRzbdPl GOdlHW+pSyt9XaIrODQpvWo/yabZxMuysvicIBJdtxQ4bJ2Y3+amiajP5ah1CZT9Ws7hJLgChcRv WOq/IvnUdidjS0dzkfURVOt1WqGXaI270F+S2u2ena5qHldLr17W9pPYyMpTlJGPjHE9GZP+I5uy 4o5PbMCXYq3irsVdirsVdirsVdirsVQGs6rBo9i95N8R+xEg6vIQeK/hlWozjDDiLkaTSy1GQRHx SnQNEmlE2q66vrXt6pXhIP7uJhx4U7VB+76cx9Lpybnk+ouXrtZGNY8W0Y/aVLy1M2k6jd+WbhjR GM1mzftI3xEfdv8AfkdHLwpnEfeGXaMRnxRzx90lPS9UtobDW74Sr9aaW4n9OvxKq/BFUfPBhzRE Mkr3sllqdNOWTFGvTUR+tEQ2M8Pkk29qh9aW25lVHxMZPjb5niaZMYyNJQ501yzRl2hxSOwl9yWI +lR6XEY9avZC0axrZQyLzLEBfTEfD6MoBxjGPXL3OWRmOY3ijz+oj7bXXFhbWGq2MF1eXGnW6WXC 3nDKrCTmzPGz8StaNjLHGGSIMjEcOyMeeWXDMxiJni3Hw5q0H1Fb+XUYLy71H9EwSyi4ldXgDMjL 6YIUEmhrtk48HGZCRlwjn0YT8Q4xAxjDjIFDn71eyJ0ryQ9w1RLLC8vLuWnJCH/hlyWI+FpL8vva 8w8ftADoDXy5rr5W0vyStuopLJBHFxHUvMRzH/DHDk/d6SvL70YD4/aF9LJ+TG/zQ0TVLa10DzJo kDXFx5akUyRxgsfSHptyIG5VTFQ07HMyEeGIDrcs+OZPeU5sfzX8jXlkl3JqS2rFQ0kEyuJENN1o EPKn+TXJMGK3dxc/m75jsoLG3lTyjpMvq3M8w4C5kXso9x8IHUAkmlaYqj/M3mLV/Jv5gwajqsly fKt7CsXwcmghk48SeC1HIMladaE0xVO9Q/NXyNaWMlymopeNxJS3hVmkkNPs0ZQBX/KpiqX/AJOa NqGm6Bd3t/AbMardG5t7YgjhFxAU8TuK9vYDFXoWKpJ5v8y2vlTQbnWLkgvGvC2jP+7J2B9NPv3P tXFWGfk/ohvLe688axIbrVdWeRFkk6rEGo1B25Mv0ACmKvSVjgYniASpofY4bKFDVbSy1LT7nSr0 r6N5E8DqadHBXb332wUm3yY4v9B1ZlR2tr7TZyoddmSWFqVHyK4q+mvInnC185aHHfR0S8gpFew/ yS0+0P8AJbqv3dsVZLireKuxV2KuxV2KuxV2KuxVZLDFMAJUWQKQyhgDQjuK98BiDzTGco8iuwoU zbwNKJ2iQyrsshUFgPZuvfBwi7pkJyAq9lps7QlyYIyZf7z4F+Levxbb4PDj3J8We252VQAoCqKA bADoBkmBNqAs7CKU3IghSU9ZQihv+CpXKzHHA2QA2eLkkOGzXcsuZtMlT07t4JE/kkKsPuNcoy63 SjaU4/MMscM0TcQVD6/okMJt1aJYehjRKr/wKrTKT2toYiuIU2fl9RI3RtSl1vRjH6DD1YhQcPTq tB0+FgBlU+3NFVXfwZx0Wou+R96hN5l0p1CPBJKqkEBkQio6EVbK5e0OmP8ADI/L9bZDs3ODzAU3 84W6/ZtpD8yB/XIH2jx9IlkOyJ/zkiuZ/KlzObqfy1ZTTMatJJHEWY9asfRNcB9oh0h9v7GY7GP8 77P2o9POa26LFb6ekUSCior0CjwAEYGP+iE/zPt/YzHYg/nfZ+1ZN5wF7G1rNpaXMcgo0TnmrexU oQcnHtyUuUPt/Yv8ixHOf2ftQtjDY29wt3YeTbeKUGqyxwKhH+q3oCn0ZkQ7Qzy5Yj+Pg1y7N08e eUfj4sii1fXpf+lGyjxa4jH/ABJRmRHUZz/k/taZaTTR/wAr/sSmNvPfyEevarAO/wC9DH/hVy+E pnmKcXJDHHlK/g8d/NS+fzT5ysvJtkWkNuqxqi/Z+t3HEl5D/LHFRvvyxqL1zTrCy8v6XbabZpSK 1jWGMftNxAFSfE9Th5oOzkurtyTFGnDc9x89640GHEVdGhvAY54wJF+0p3I91OPJkCJPEPzl8s22 neYLbWuXpW+qROJjxLVuLdRQfD0MilRXxqcQkpD+W+vz+VPONtC7n6lqLR21wDsGSahgl9uJdW+V cCQ+lsVbxV2KuxV2KuxV2KuxV2KtYq7FXYqk15f3sMzxcgvE7EKOnbrXOO7S7a12DPLHYFHu6fG3 YYNNinEGkBLe3b/ameh7A0H4ZrJ9qavJzyS+dfc5McGMdEI5LEljU+J375jmcpGybboilJqf5j3x DNSKk7AVPhSuWRBJ2ZXsqx6Zfz/3du5HiV4j72oMzMPZ2pycoFrlqsUOcgio/K2oSbyNHEO9TU/8 KP45sMXs/qZfUQGmfamIcrKLj8nwf8fFwzeIRQv/ABLlmdi9nID6pn4fgtEu15dIoqPyro6fajaT /WYj/iPHMuHYmlj0J+LTLtTOetIuLRdJh/u7SLboWUMfvauZUNBp4coBpnrM0ucijEjSMcY1CDwU AD8MyBER5NJkTzXYUOxVAa5qEmk6LqGqRR+tJZW01wsf8xjRnA/DFXif5NCbXPPl9rmot6tzHbzX JfYfvpnRCaf6rtir2m+fldeiTSiAjbxLDJR5MJGzTomSIcCR022wEMRsqqUa7jZKVAIJHcUrj0Z0 LYF+e1sk3lG2uP27e+jIPs8cqkfqwMnhuqO8V9GY6q8EVugalPjiijUn6GXCUAvra0la4tYJ3Xg0 saOy+BYAkYEq+KuxV2KuxV2KuxV2KuxVrFXYq7FUt1i35xC4X7Uezf6p/oc532n0PHiGUc47H3OZ ostS4e9KY7O5uD+6jZh49B95znNL2dqdR9ED7+nzc2eaEOZRcWgSNvPIE9lqT9+2brT+y2Q75Jge 7dx59oAcgjItDsI93VpT/lk0+4UzaYPZ7SY+YMvf+xonr8svJC/pzT7S9uLKO1aOGyYJdXfK2igi /dpOxf1LhJKKkgJIQ5s8WDHiFRiB7nHlOUuZRaa9okjRKmoWzNO/pxASpV3qF4r8W5qwH0jLGKEj 836HPZLfQXCyIxoyq8fJBxlk5SVcBV4Qsak9sVRK+YdDZXJv7ZTFtKpmjJRuXplG4sfiD/DTx2xV fJrWnrHZzQyi6j1GcW1u9uVkVnIkYnkrUooiavyxVptc0qO6eynuoYZ1kEKpJLGGdiIzRVDlusqj cDc+4xVUbWNIRBI99bKjIJFYzIAUYOVYHl0Iiah/yT4Yqi1ZXUOhDKwqrA1BB7jFXMyopZyFUdSd hkZzjAWTQSASlmo6hbyW728R9T1QUfY04nr1G9c0HbHbuKOExxSuR6jo5Wn0suK5DZj+kafpuka6 dXhiWA3MP1WcoOK7sjo7ADsVpXwOa/sHtiWOfh5DcTy8m/VacSFjmyy5tRNSRdpFFB7jwzsgXWEI JoJw4HpEsOhHT78lYYEb8kbbW/oj1JCOVKUHQDIk2zAph3mCyXzbYSafqE8i24nMsRg4qylC6pQ8 DXZu+cbqvaDV4NTIAigTsQ7OOkxygNmK2/5U6DGVa6uru64sGCu6hdj0oE74Je1WqJ2jH7f1oGgx h7DG3NFYftAH787DHMTiD3uvIor8kh2KuxV2KuxV2KuxV2KtHFXYq7FWtj1wEAq3hV2KuxVisWia TezXTrfw3KXdzJJJ+7iMhIcF4lm+0VCrwNO2KqV/5UsLq9/SMmrFBPcJKisVKeskjSoIquF5bqOl fgX5Yqpw+VNIurKBn1Y3NusMFpC6+kiehFHLHHHRRSrJcPyPevQYq1ruiDT106bTblfr+n/FbxzE 7kif1pSscM5PNpt/hoNjWuKo2LSoUtNDiGppHd6YhZXULIss0kDCSXiadVZ2B98VX2nl7TpzetDf NcS3E0UlxKnAlXjuGvlUUBAqHVf9UDFVBPIsf1eK3m1CV1gS1RAqIq0sR/ogYUaqo5LkftN7bYqy vFUFq4rYvvuChHv8QzWdvQ49FP8AHVv0hrKEjo3+dfDOB4JdxdnYaaPmpVhUEUI38MIhIHkU2Ez0 nU4xGLK9mVJ4yFjMjBTKp+yRypUjoc7vsTXnU4Kl9UXWarDwSscinGbVx0k8x+a9G8t2M11fzK8i D4LWIhppGPRVQGv09BiqRaNLLc6bBcyJ6bTr6pQknjzPKnTtXPOe0omWpmQOpdzChAe5HUb/ADr4 5icEu5lYTDTb2ZZEtSvqITTapKf2Z03s92hqRIYjEmHf3OHq8MCOLqnWdW4DsVdirsVdirsVdirs VaxV2KuxV2KuxV2KtGtDTr2rirD28kXwsG02DUIkjlhgEs7W5M5nt4+KOH9YAJ6o9QrTuwr8WKpt qnl5rjTLXTdLmSwSzWRIv3fMKHtp7RSArx/Z9bliqTaj+Xy3dwZILoQwMr24gpKqpbPBaW3Bfq9x BU0tj9qq/GdtsVTTWvLt3f3MtxYXEMH1u1js51uInmAWF5JYpI+E0XxK0rbHY7eG6qXHyG3oIn1t HlRpJS0kRYSSc7X0fV/eVZVhtvTYV3DHpiqf6Hpc2l284upUnuby5lu55Io/SQtIdgqF3Pwqqjdj iqZYq7FVC8tUvIGgdilaEMvUEGuY+s0sNViMJcizxZDjlYSaXRNSj3gmimA7OCh/DkM5zN7KSH0S Hx/Bc2OuieYQM7z2P+98LW46B/tIe321JH35qNX2PqdPzjt3uRjzQycixDzbDceaoDoWjQG7uZeN KbKgDA+pI3RVFOp+WbP2e0WWObi6NerlGOMg80HYfk15zW2WC48xC0ipT0IHnkQA9qViGde6tRuf yA1JYme11mGabqFlhaNSfd1klP4YqzLSLy2WxhgaRY5IFEciMaFWXYg755xrdPkjmlY6u75p9p+m tfATz8ktv2APhaUeNeoX9fy67zsb2fEgMmYe6P63E1Gq4dop5FFHCgjhQRovRVFAPuzqYQjAUBQc Akk2VTJIdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVaKhgVYAg 7EHocSLVbFDDAvCGNY168UAUfcMAiAKCSSV+FDWKoWbS9MuJfXns4JZf9+PEjNt/lFa5CWKEjZAZ DJICgUVk2LeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/2Q== - - - - - - application/pdf - - - Adobe PDF Library 7.0 - False - - - - endstream endobj 3 0 obj<> endobj xref 0 4 0000000000 65535 f -0000285835 00000 n -0000285885 00000 n -0000298141 00000 n -trailer <> startxref 116 %%EOF \ No newline at end of file diff --git a/doc/xtreemfs-userguide/latex2html.sh b/doc/xtreemfs-userguide/latex2html.sh deleted file mode 100755 index 41ab4e2a006b8c143b8b22e381d5665bd44d06f1..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/latex2html.sh +++ /dev/null @@ -1,2 +0,0 @@ -mkdir html -latex2html -split 0 -show_section_numbers -noaddress -noimages -dir html xtfs-guide.tex \ No newline at end of file diff --git a/doc/xtreemfs-userguide/package/README.garamond b/doc/xtreemfs-userguide/package/README.garamond deleted file mode 100644 index 415503c43a76713ac20cdafe1ffc8d139b3974d6..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/package/README.garamond +++ /dev/null @@ -1,231 +0,0 @@ -============================================================ - URW Garamond No.8 -============================================================ - 2005-07-07 - w-a-schmidt(at)gmx.net - - -This directory provides a set of Postscript Type-1 fonts -which URW has made available for free under the Aladdin Free -Public License: - - font name: files: - ------------------------------------- - GaramondNo8 Regular ugmr8a.pfb - ugmr8a.pfm - ugmr8a.afm - - GaramondNo8 Medium ugmm8a.pfb - ugmm8a.pfm - ugmm8a.afm - - GaramondNo8 Italic ugmri8a.pfb - ugmri8a.pfm - ugmri8a.afm - - GaramondNo8 Medium Italic ugmmi8a.pfb - ugmmi8a.pfm - ugmmi8a.afm - -The original distribution site of the font files is -. - -The fonts are accompanied by the TeX font metrics, virtual -fonts, font definition and font mapping files to use them -with the LaTeX typesetting system on the PC or Un*x -platform. The layout of the distribution and the related -installation instructions suit recent, TDS-compliant TeX -systems, particularly teTeX, MikTeX and VTeX/Free. - - - -Installation paths ------------------- -The files of your TeX system are arranged in one or more -tree structures, the so-called "texmf trees". The names and -paths of the particular root directories of these trees vary -between different TeX systems. In the following -instructions the install paths are indicated in a form such -as, for instance: - - /fonts/type1/... - - stands for the the actual name of the root directory -of the texmf tree, where you want to install the files: - -teTeX and MikTeX require additional files to be installed in -a particular "local" tree (rather than in the one where the -default components of the TeX system reside). Its path must -either be indicated in the documentation of the TeX system -or you should have defined it yourself upon installation. -With MikTeX 2.4+, for instance, the root directory of the -"local" texmf tree is usually "c:\localtexmf", so you would -in fact have to substitute - - c:\localtexmf\fonts\type1\... - -for the path name in the above example. - -VTeX/Free, in contrast, has only one single texmf tree, -whose root directory is normally "/usr/local/vtex/texmf" (on -Linux) or "c:\texmf" (on OS/2). - -Note that paths are indicated in "Unix notation" (i.e., -using slashes as directory separators), unless they are -specific for Win or OS/2. - - - -Installing the Type1 font files in your TeX system --------------------------------------------------- -The Type1 font files - - ugmr8a.pfb - ugmri8a.pfb - ugmb8a.pfb - ugmbi8a.pfb - -are to be copied to the directory - - /fonts/type1/urw/garamond - -of your TeX system, and the related .afm files should go -into - - /fonts/afm/urw/garamond - -Most likely, you will have to create these directories -first. - -Feel free to use the fonts also with applications other than -TeX! The related PFM files are provided for this purpose; -move them to the same directory as the PFBs. - - - -Installing the TeX support files from the archive ugm.zip ---------------------------------------------------------- -Unpack the ZIP archive ugm.zip in the directory , -i.e., in root directory of the TeX file tree, where you want -to install the present collection. Thus, all files will end -up in the appropriate directories. - - - -Updating the filename database ------------------------------- -Many TeX systems require manual updating of a "filename -database" after adding of new files. Please, consult the -documentation of your TeX system! - - - -Configuring your TeX system ---------------------------- - -The present distribution includes several font map files for -the URW Garamond fonts. You need to configure your -TeX system so that an appropriate file will be used in fact. -The required steps depend on the particular TeX system. -Particular sets of instructions are provided below for the -following systems: - - * teTeX 2.0 and later - * MikTeX 2.4 and later - * VTeX/Free 8 and later - -With other TeX systems (or older versions of teTeX and -MikTeX) consult the related documentation how to install an -additional font map file. The name of the map file to be -used for Garamond is "ugm.map". Two identical copies of -this file reside in the directories /dvips/config and -/fonts/map/dvips/ugm. - - -* Configuring teTeX 2.0+ -Delete the file /dvips/config/ugm.map, which is -not needed with a recent teTeX. Next, issue the following -commands in a command shell: - - texhash - updmap --enable Map ugm.map - - -* Configuring MikTeX 2.4+ -Edit the file \miktex\config\updmap.cfg. (In case it -does not yet exist, create it as a new file.) Add the line - - Map ugm.map - -and save the file; then execute the following commands -in a command line window ("DOS shell"): - - initexmf -u - updmap - - -* Configuring VTeX/Free 8+ -Make VTeX read the additional font mapping file ugm.ali. -This is usually accomplished by putting an appropriate -record into each of the configuration files - - /vtex/config/pdf.fm -and - /vtex/config/ps.fm - -Edit these files; in each file add "ugm.ali" to the TYPE1 -section: - - TYPE1 { - ... - ugm.ali - } - - - - -Using the URW Garamond fonts with LaTeX ---------------------------------------- -See the file garamond.txt, which resides in the directory -/doc/fonts/urw. - - - -Fontinst sources ----------------- -The archive file ugmfnst.zip contains the Fontinst script -and additional mtx files which were used to create the font -metrics and virtual fonts for URW Garamond. You need not -install this material, if you just want to _use_ the fonts -with TeX. - - - -License -------- -Distribution and modification of the the URW Garamond fonts -are subject to the Aladdin Free Public License - - - Copyright (c) 2000 by (URW)++ Design & Development - -The font GaramondNo8 Italic has been modified, as compared -with the version from the original distribution site -; credits to Ralf Stubner -for fixing the broken quotedblleft character. - - -The TeX font metrics, virtual fonts and font definition -files for URW Garamond, i.e., the files in the archive -ugm.zip, may be distributed and/or modified under the -conditions of the LaTeX Project Public License, either -version 1.3 of this license or (at your option) any later -version. The latest version of this license is in -http://www.latex-project.org/lppl.txt and version 1.3 or -later is part of all distributions of LaTeX version -2003/12/01 or later. - - Copyright (c) 2005 Walter Schmidt - - -== finis diff --git a/doc/xtreemfs-userguide/package/baudelaire.pdf b/doc/xtreemfs-userguide/package/baudelaire.pdf deleted file mode 100644 index 2cc22e56777845b1b4c711916dc2c5943be1bdae..0000000000000000000000000000000000000000 Binary files a/doc/xtreemfs-userguide/package/baudelaire.pdf and /dev/null differ diff --git a/doc/xtreemfs-userguide/package/baudelaire.tex b/doc/xtreemfs-userguide/package/baudelaire.tex deleted file mode 100644 index 2872bc518bf62e61235fcf70531ccf506f1341ae..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/package/baudelaire.tex +++ /dev/null @@ -1,1351 +0,0 @@ -\documentclass[twoside]{article} - -\usepackage{multicol} -\usepackage[landscape,left=3cm,right=2cm,twosideshift=0.7cm]{geometry} -\usepackage{textcomp} -\usepackage[T1]{fontenc} -\usepackage{lmodern} -\usepackage[french]{babel} -\usepackage{garamond} -%\usepackage{aeguill} - -\begin{document} -\setlength\columnsep{1cm} -\setlength\columnseprule{.4pt} - -\begin{multicols}{2} -\garamond - -\vbox{}\vfill - -\begin{center} -{\Huge \sc Les Fleurs du Mal}\\ -{\sl extraits}\\ -\smallskip -{\large \bf\emph{C. Baudelaire}} -\end{center} - -\vskip 0.5\textheight % Ugly way to skip a column -\large - -\obeylines - -\vfill\filbreak\vfill{\bf\Large CIX - La Destruction} - -\bigskip - -Sans cesse mes cts s'agite le Dmon ; -II nage autour de moi comme un air impalpable ; -Je l'avale et le sens qui brle mon poumon -Et l'emplit d'un dsir ternel et coupable. - -\bigskip - -Parfois il prend, sachant mon grand amour de l'Art, -La forme de la plus sduisante des femmes, -Et, sous de spcieux prtextes de cafard, -Accoutume ma lvre des philtres infmes. - -\bigskip - -II me conduit ainsi, loin du regard de Dieu, -Haletant et bris de fatigue, au milieu -Des plaines de l'Ennui, profondes et dsertes, - -\bigskip - -Et jette dans mes yeux pleins de confusion -Des vtements souills, des blessures ouvertes, -Et l'appareil sanglant de la Destruction ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CX - Une Martyre -Dessin d'un Matre inconnu} - -\bigskip - -Au milieu des flacons, des toffes lames -Et des meubles voluptueux, -Des marbres, des tableaux, des robes parfumes -Qui tranent plis somptueux, - -\bigskip - -Dans une chambre tide o, comme en une serre, -L'air est dangereux et fatal, -O des bouquets mourants dans leurs cercueils de verre -Exhalent leur soupir final, - -\bigskip - -Un cadavre sans tte panche, comme un fleuve, -Sur l'oreiller dsaltr -Un sang rouge et vivant, dont la toile s'abreuve -Avec l'avidit d'un pr. - -\bigskip - -Semblable aux visions ples qu'enfante l'ombre -Et qui nous enchanent les yeux, -La tte, avec l'amas de sa crinire sombre -Et de ses bijoux prcieux, - -\bigskip - -Sur la table de nuit, comme une renoncule, -Repose ; et, vide de pensers, -Un regard vague et blanc comme le crpuscule -S'chappe des yeux rvulss. - -\bigskip - -Sur le lit, le tronc nu sans scrupules tale -Dans le plus complet abandon -La secrte splendeur et la beaut fatale -Dont la nature lui fit don ; - -\bigskip - -Un bas rostre, orn de coins d'or, la jambe, -Comme un souvenir est rest ; -La jarretire, ainsi qu'un il secret qui flambe, -Darde un regard diamant. - -\bigskip - -Le singulier aspect de cette solitude -Et d'un grand portrait langoureux, -Aux yeux provocateurs comme son attitude, -Rvle un amour tnbreux, - -\bigskip - -Une coupable joie et des ftes tranges -Pleines de baisers infernaux, -Dont se rjouissait l'essaim des mauvais anges -Nageant dans les plis des rideaux ; - -\bigskip - -Et cependant, voir la maigreur lgante -De l'paule au contour heurt, -La hanche un peu pointue et la taille fringante -Ainsi qu'un reptile irrit, - -\bigskip - -Elle est bien jeune encor ! Son me exaspre -Et ses sens par l'ennui mordus -S'taient-ils entr'ouverts la meute altre -Des dsirs errants et perdus ? - -\bigskip - -L'homme vindicatif que tu n'as pu, vivante, -Malgr tant d'amour, assouvir, -Combla-t-il sur ta chair inerte et complaisante -L'immensit de son dsir ? - -\bigskip - -Rponds, cadavre impur ! et par tes tresses roides -Te soulevant d'un bras fivreux, -Dis-moi, tte effrayante, a-t-il sur tes dents froides -Coll les suprmes adieux ? - -\bigskip - - Loin du monde railleur, loin de la foule impure, -Loin des magistrats curieux, -Dors en paix, dors en paix, trange crature, -Dans ton tombeau mystrieux ; - -\bigskip - -Ton poux court le monde, et ta forme immortelle -Veille prs de lui quand il dort ; -Autant que toi sans doute il te sera fidle, -Et constant jusques la mort. - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXI - Femmes damnes} - -\bigskip - -Comme un btail pensif sur le sable couches, -Elles tournent leurs yeux vers l'horizon des mers, -Et leurs pieds se cherchent et leurs mains rapproches -Ont de douces langueurs et des frissons amers. - -\bigskip - -Les unes, c{\oe}urs pris des longues confidences, -Dans le fond des bosquets o jasent les ruisseaux, -Vont pelant l'amour des craintives enfances -Et creusent le bois vert des jeunes arbrisseaux ; - -\bigskip - -D'autres, comme des surs, marchent lentes et graves -A travers les rochers pleins d'apparitions, -O saint Antoine a vu surgir comme des laves -Les seins nus et pourprs de ses tentations ; - -\bigskip - -II en est, aux lueurs des rsines croulantes, -Qui dans le creux muet des vieux antres paens -T'appellent au secours de leurs fivres hurlantes, -O Bacchus, endormeur des remords anciens ! - -\bigskip - -Et d'autres, dont la gorge aime les scapulaires, -Qui, reclant un fouet sous leurs longs vtements, -Mlent, dans le bois sombre et les nuits solitaires, -L'cume du plaisir aux larmes des tourments. - -\bigskip - -O vierges, dmons, monstres, martyres, -De la ralit grands esprits contempteurs, -Chercheuses d'infini dvotes et satyres, -Tantt pleines de cris, tantt pleines de pleurs, - -\bigskip - -Vous que dans votre enfer mon me a poursuivies, -Pauvres surs, je vous aime autant que je vous plains, -Pour vos mornes douleurs, vos soifs inassouvies, -Et les urnes d'amour dont vos grands c{\oe}urs sont pleins ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXII - Les Deux Bonnes Soeurs} - -\bigskip - -La Dbauche et la Mort sont deux aimables filles, -Prodigues de baisers et riches de sant, -Dont le flanc toujours vierge et drap de guenilles -Sous l'ternel labeur n'a jamais enfant. - -\bigskip - -Au pote sinistre, ennemi des familles, -Favori de l'enfer, courtisan mal rent, -Tombeaux et lupanars montrent sous leurs charmilles -Un lit que le remords n'a jamais frquent. - -\bigskip - -Et la bire et l'alcve en blasphmes fcondes -Nous offrent tour tour, comme deux bonnes surs, -De terribles plaisirs et d'affreuses douceurs. - -\bigskip - -Quand veux-tu m'enterrer, Dbauche aux bras immondes ? -O Mort, quand viendras-tu, sa rivale en attraits, -Sur ses myrtes infects enter tes noirs cyprs ? - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXIII - La Fontaine de Sang} - -\bigskip - -Il me semble parfois que mon sang coule flots, -Ainsi qu'une fontaine aux rythmiques sanglots. -Je l'entends bien qui coule avec un long murmure, -Mais je me tte en vain pour trouver la blessure. - -\bigskip - -A travers la cit, comme dans un champ clos, -Il s'en va, transformant les pavs en lots, -Dsaltrant la soif de chaque crature, -Et partout colorant en rouge la nature. - -\bigskip - -J'ai demand souvent des vins captieux -D'endormir pour un jour la terreur qui me mine ; -Le vin rend l'il plus clair et l'oreille plus fine ! - -\bigskip - -J'ai cherch dans l'amour un sommeil oublieux ; -Mais l'amour n'est pour moi qu'un matelas d'aiguilles -Fait pour donner boire ces cruelles filles ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXIV - Allgorie} - -\bigskip - -C'est une femme belle et de riche encolure, -Qui laisse dans son vin traner sa chevelure. -Les griffes de l'amour, les poisons du tripot, -Tout glisse et tout s'mousse au granit de sa peau. -Elle rit la Mort et nargue la Dbauche, -Ces monstres dont la main, qui toujours gratte et fauche, -Dans ses jeux destructeurs a pourtant respect -De ce corps ferme et droit la rude majest. -Elle marche en desse et repose en sultane ; -Elle a dans le plaisir la foi mahomtane, -Et dans ses bras ouverts, que remplissent ses seins, -Elle appelle des yeux la race des humains. -Elle croit, elle sait, cette vierge infconde -Et pourtant ncessaire la marche du monde, -Que la beaut du corps est un sublime don -Qui de toute infamie arrache le pardon. -Elle ignore l'Enfer comme le Purgatoire, -Et quand l'heure viendra d'entrer dans la Nuit noire -Elle regardera la face de la Mort, -Ainsi qu'un nouveau-n, sans haine et sans remords. - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXV - La Batrice} - -\bigskip - -Dans des terrains cendreux, calcins, sans verdure, -Comme je me plaignais un jour la nature, -Et que de ma pense, en vaguant au hasard, -J'aiguisais lentement sur mon c{\oe}ur le poignard, -Je vis en plein midi descendre sur ma tte -Un nuage funbre et gros d'une tempte, -Qui portait un troupeau de dmons vicieux, -Semblables des nains cruels et curieux. -A me considrer froidement ils se mirent, -Et, comme des passants sur un fou qu'ils admirent, -Je les entendis rire et chuchoter entre eux, -En changeant maint signe et maint clignement d'yeux : - -\bigskip - - <> - -\bigskip - -J'aurais pu (mon orgueil aussi haut que les monts -Domine la nue et le cri des dmons) -Dtourner simplement ma tte souveraine, -Si je n'eusse pas vu parmi leur troupe obscne, -Crime qui n'a pas fait chanceler le soleil ! -La reine de mon c{\oe}ur au regard nonpareil -Qui riait avec eux de ma sombre dtresse -Et leur versait parfois quelque sale caresse. - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXVI - Un Voyage Cythre} - -\bigskip - -Mon coeur, comme un oiseau, voltigeait tout joyeux -Et planait librement l'entour des cordages ; -Le navire roulait sous un ciel sans nuages ; -Comme un ange enivr d'un soleil radieux. - -\bigskip - -Quelle est cette le triste et noire ? C'est Cythre, -Nous dit-on, un pays fameux dans les chansons -Eldorado banal de tous les vieux garons. -Regardez, aprs tout, c'est une pauvre terre. - -\bigskip - - Ile des doux secrets et des ftes du c{\oe}ur ! -De l'antique Vnus le superbe fantme -Au-dessus de tes mers plane comme un arme -Et charge les esprits d'amour et de langueur. - -\bigskip - -Belle le aux myrtes verts, pleine de fleurs closes, -Vnre jamais par toute nation, -O les soupirs des coeurs en adoration -Roulent comme l'encens sur un jardin de roses - -\bigskip - -Ou le roucoulement ternel d'un ramier ! - Cythre n'tait plus qu'un terrain des plus maigres, -Un dsert rocailleux troubl par des cris aigres. -J'entrevoyais pourtant un objet singulier ! - -\bigskip - -Ce n'tait pas un temple aux ombres bocagres, -O la jeune prtresse, amoureuse des fleurs, -Allait, le corps brl de secrtes chaleurs, -Entre-billant sa robe aux brises passagres ; - -\bigskip - -Mais voil qu'en rasant la cte d'assez prs -Pour troubler les oiseaux avec nos voiles blanches, -Nous vmes que c'tait un gibet trois branches, -Du ciel se dtachant en noir, comme un cyprs. - -\bigskip - -De froces oiseaux perchs sur leur pture -Dtruisaient avec rage un pendu dj mr, -Chacun plantant, comme un outil, son bec impur -Dans tous les coins saignants de cette pourriture ; - -\bigskip - -Les yeux taient deux trous, et du ventre effondr -Les intestins pesants lui coulaient sur les cuisses, -Et ses bourreaux, gorgs de hideuses dlices, -L'avaient coups de bec absolument chtr. - -\bigskip - -Sous les pieds, un troupeau de jaloux quadrupdes, -Le museau relev, tournoyait et rdait ; -Une plus grande bte au milieu s'agitait -Comme un excuteur entour de ses aides. - -\bigskip - -Habitant de Cythre, enfant d'un ciel si beau, -Silencieusement tu souffrais ces insultes -En expiation de tes infmes cultes -Et des pchs qui t'ont interdit le tombeau. - -\bigskip - -Ridicule pendu, tes douleurs sont les miennes ! -Je sentis, l'aspect de tes membres flottants, -Comme un vomissement, remonter vers mes dents -Le long fleuve de fiel des douleurs anciennes ; - -\bigskip - -Devant toi, pauvre diable au souvenir si cher, -J'ai senti tous les becs et toutes les mchoires -Des corbeaux lancinants et des panthres noires -Qui jadis aimaient tant triturer ma chair. - -\bigskip - - Le ciel tait charmant, la mer tait unie ; -Pour moi tout tait noir et sanglant dsormais, -Hlas ! et j'avais, comme en un suaire pais, -Le c{\oe}ur enseveli dans cette allgorie. - -\bigskip - -Dans ton le, Vnus ! je n'ai trouv debout -Qu'un gibet symbolique o pendait mon image... - Ah ! Seigneur ! donnez-moi la force et le courage -De contempler mon c{\oe}ur et mon corps sans dgot ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXVII - L'Amour et le Crne} - -\bigskip - -Vieux cul-de-lampe - -\bigskip - -L'Amour est assis sur le crne -De l'Humanit, -Et sur ce trne le profane, -Au rire effront, - -\bigskip - -Souffle gaiement des bulles rondes -Qui montent dans l'air, -Comme pour rejoindre les mondes -Au fond de l'ther. - -\bigskip - -Le globe lumineux et frle -Prend un grand essor, -Crve et crache son me grle -Comme un songe d'or. - -\bigskip - -J'entends le crne chaque bulle -Prier et gmir : - <> - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXVIII - Le Reniement de Saint Pierre} - -\bigskip - -Qu'est-ce que Dieu fait donc de ce flot d'anathmes -Qui monte tous les jours vers ses chers Sraphins ? -Comme un tyran gorg de viande et de vins, -II s'endort au doux bruit de nos affreux blasphmes. - -\bigskip - -Les sanglots des martyrs et des supplicis -Sont une symphonie enivrante sans doute, -Puisque, malgr le sang que leur volupt cote, -Les cieux ne s'en sont point encore rassasis ! - -\bigskip - - Ah ! Jsus, souviens-toi du Jardin des Olives ! -Dans ta simplicit tu priais genoux -Celui qui dans son ciel riait au bruit des clous -Que d'ignobles bourreaux plantaient dans tes chairs vives, - -\bigskip - -Lorsque tu vis cracher sur ta divinit -La crapule du corps de garde et des cuisines, -Et lorsque tu sentis s'enfoncer les pines -Dans ton crne o vivait l'immense Humanit ; - -\bigskip - -Quand de ton corps bris la pesanteur horrible -Allongeait tes deux bras distendus, que ton sang -Et ta sueur coulaient de ton front plissant, -Quand tu fus devant tous pos comme une cible, - -\bigskip - -Rvais-tu de ces jours si brillants et si beaux -O tu vins pour remplir l'ternelle promesse, -O tu foulais, mont sur une douce nesse, -Des chemins tout jonchs de fleurs et de rameaux, - -\bigskip - -O, le c{\oe}ur tout gonfl d'espoir et de vaillance, -Tu fouettais tous ces vils marchands tour de bras, -O tu fus matre enfin ? Le remords n'a-t-il pas -Pntr dans ton flanc plus avant que la lance ? - -\bigskip - - Certes, je sortirai, quant moi, satisfait -D'un monde o l'action n'est pas la sur du rve ; -Puiss-je user du glaive et prir par le glaive ! -Saint Pierre a reni Jsus... il a bien fait ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXIX - Abel et Can} - -\bigskip - -{\sl [ I ]} - -\bigskip - -Race d'Abel, dors, bois et mange ; -Dieu te sourit complaisamment. - -\bigskip - -Race de Can, dans la fange -Rampe et meurs misrablement. - -\bigskip - -Race d'Abel, ton sacrifice -Flatte le nez du Sraphin ! - -\bigskip - -Race de Can, ton supplice -Aura-t-il jamais une fin ? - -\bigskip - -Race d'Abel, vois tes semailles -Et ton btail venir bien ; - -\bigskip - -Race de Can, tes entrailles -Hurlent la faim comme un vieux chien. - -\bigskip - -Race d'Abel, chauffe ton ventre -A ton foyer patriarcal ; - -\bigskip - -Race de Can, dans ton antre -Tremble de froid, pauvre chacal ! - -\bigskip - -Race d'Abel, aime et pullule ! -Ton or fait aussi des petits. - -\bigskip - -Race de Can, c{\oe}ur qui brle, -Prends garde ces grands apptits. - -\bigskip - -Race d'Abel, tu cros et broutes -Comme les punaises des bois ! - -\bigskip - -Race de Can, sur les routes -Trane ta famille aux abois. - -\bigskip - - -\bigskip - -{\sl [ II ]} - -\bigskip - -Ah ! race d'Abel, ta charogne -Engraissera le sol fumant ! - -\bigskip - -Race de Can, ta besogne -N'est pas faite suffisamment ; - -\bigskip - -Race d'Abel, voici ta honte : -Le fer est vaincu par l'pieu ! - -\bigskip - -Race de Can, au ciel monte, -Et sur la terre jette Dieu ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXX - Les Litanies de Satan} - -\bigskip - - toi, le plus savant et le plus beau des Anges, -Dieu trahi par le sort et priv de louanges, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - - Prince de l'exil, qui l'on a fait tort -Et qui, vaincu, toujours te redresses plus fort, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui sais tout, grand roi des choses souterraines, -Gurisseur familier des angoisses humaines, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui, mme aux lpreux, aux parias maudits, -Enseignes par l'amour le got du Paradis, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - - toi qui de la Mort, ta vieille et forte amante, -Engendras l'Esprance, une folle charmante ! - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui fais au proscrit ce regard calme et haut -Qui damne tout un peuple autour d'un chafaud. - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui sais en quels coins des terres envieuses -Le Dieu jaloux cacha les pierres prcieuses, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi dont l'il clair connat les profonds arsenaux -O dort enseveli le peuple des mtaux, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi dont la large main cache les prcipices -Au somnambule errant au bord des difices, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui, magiquement, assouplis les vieux os -De l'ivrogne attard foul par les chevaux, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui, pour consoler l'homme frle qui souffre, -Nous appris mler le salptre et le soufre, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui poses ta marque, complice subtil, -Sur le front du Crsus impitoyable et vil, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Toi qui mets dans les yeux et dans le c{\oe}ur des filles -Le culte de la plaie et l'amour des guenilles, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Bton des exils, lampe des inventeurs, -Confesseur des pendus et des conspirateurs, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - -Pre adoptif de ceux qu'en sa noire colre -Du paradis terrestre a chasss Dieu le Pre, - -\bigskip - - Satan, prends piti de ma longue misre ! - -\bigskip - - -\bigskip - -Prire - -\bigskip - -Gloire et louange toi, Satan, dans les hauteurs -Du Ciel, o tu rgnas, et dans les profondeurs -De l'Enfer, o, vaincu, tu rves en silence ! -Fais que mon me un jour, sous l'Arbre de Science, -Prs de toi se repose, l'heure o sur ton front -Comme un Temple nouveau ses rameaux s'pandront ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXXVI - La Mort des Amants} - -\bigskip - -Nous aurons des lits pleins d'odeurs lgres, -Des divans profonds comme des tombeaux, -Et d'tranges fleurs sur des tagres, -closes pour nous sous des cieux plus beaux. - -\bigskip - -Usant l'envi leurs chaleurs dernires, -Nos deux c{\oe}urs seront deux vastes flambeaux, -Qui rflchiront leurs doubles lumires -Dans nos deux esprits, ces miroirs jumeaux. - -\bigskip - -Un soir fait de rose et de bleu mystique, -Nous changerons un clair unique, -Comme un long sanglot, tout charg d'adieux ; - -\bigskip - -Et plus tard un Ange, entr'ouvrant les portes, -Viendra ranimer, fidle et joyeux, -Les miroirs ternis et les flammes mortes. - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXXII - La Mort des Pauvres} - -\bigskip - -C'est la Mort qui console, hlas ! et qui fait vivre ; -C'est le but de la vie et c'est le seul espoir -Qui, comme un lixir, nous monte et nous enivre, -Et nous donne le c{\oe}ur de marcher jusqu'au soir ; - -\bigskip - -A travers la tempte, et la neige, et le givre, -C'est la clart vibrante notre horizon noir -C'est l'auberge fameuse inscrite sur le livre, -O l'on pourra manger, et dormir, et s'asseoir ; - -\bigskip - -C'est un Ange qui tient dans ses doigts magntiques -Le sommeil et le don des rves extatiques, -Et qui refait le lit des gens pauvres et nus ; - -\bigskip - -C'est la gloire des Dieux, c'est le grenier mystique, -C'est la bourse du pauvre et sa patrie antique, -C'est le portique ouvert sur les Cieux inconnus ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXXIII - La Mort des Artistes} - -\bigskip - -Combien faut-il de fois secouer mes grelots -Et baiser ton front bas, morne caricature ? -Pour piquer dans le but, de mystique nature, -Combien, mon carquois, perdre de javelots ? - -\bigskip - -Nous userons notre me en de subtils complots, -Et nous dmolirons mainte lourde armature, -Avant de contempler la grande Crature -Dont l'infernal dsir nous remplit de sanglots ! - -\bigskip - -Il en est qui jamais n'ont connu leur Idole, -Et ces sculpteurs damns et marqus d'un affront, -Qui vont se martelant la poitrine et le front, - -\bigskip - -N'ont qu'un espoir, trange et sombre Capitole ! -C'est que la Mort, planant comme un soleil nouveau, -Fera s'panouir les fleurs de leur cerveau ! - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXXIV - La Fin de la Journe} - -\bigskip - -Sous une lumire blafarde -Court, danse et se tord sans raison -La Vie, impudente et criarde. -Aussi, sitt qu' l'horizon - -\bigskip - -La nuit voluptueuse monte, -Apaisant tout, mme la faim, -Effaant tout, mme la honte, -Le Pote se dit : <> - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXXV - Le Rve d'un Curieux} - -\bigskip - -{\sl Flix Nadar} - -\bigskip - -Connais-tu, comme moi, la douleur savoureuse -Et de toi fais-tu dire : <> - J'allais mourir. C'tait dans mon me amoureuse -Dsir ml d'horreur, un mal particulier ; - -\bigskip - -Angoisse et vif espoir, sans humeur factieuse. -Plus allait se vidant le fatal sablier, -Plus ma torture tait pre et dlicieuse ; -Tout mon c{\oe}ur s'arrachait au monde familier. - -\bigskip - -J'tais comme l'enfant avide du spectacle, -Hassant le rideau comme on hait un obstacle... -Enfin la vrit froide se rvla : - -\bigskip - -J'tais mort sans surprise, et la terrible aurore -M'enveloppait. Eh quoi ! n'est-ce donc que cela ? -La toile tait leve et j'attendais encore. - -\bigskip - - -\bigskip - -\vfill\filbreak\vfill{\bf\Large CXXVI - Le Voyage} - -\bigskip - -{\sl Maxime du Camp} - -\bigskip - -{\sl [ I ]} - -\bigskip - -Pour l'enfant, amoureux de cartes et d'estampes, -L'univers est gal son vaste apptit. -Ah ! que le monde est grand la clart des lampes ! -Aux yeux du souvenir que le monde est petit ! - -\bigskip - -Un matin nous partons, le cerveau plein de flamme, -Le c{\oe}ur gros de rancune et de dsirs amers, -Et nous allons, suivant le rythme de la lame, -Berant notre infini sur le fini des mers : - -\bigskip - -Les uns, joyeux de fuir une patrie infme ; -D'autres, l'horreur de leurs berceaux, et quelques-uns, -Astrologues noys dans les yeux d'une femme, -La Circ tyrannique aux dangereux parfums. - -\bigskip - -Pour n'tre pas changs en btes, ils s'enivrent -D'espace et de lumire et de cieux embrass ; -La glace qui les mord, les soleils qui les cuivrent, -Effacent lentement la marque des baisers. - -\bigskip - -Mais les vrais voyageurs sont ceux-l seuls qui partent -Pour partir ; c{\oe}urs lgers, semblables aux ballons, -De leur fatalit jamais ils ne s'cartent, -Et, sans savoir pourquoi, disent toujours : Allons ! - -\bigskip - -Ceux-l dont les dsirs ont la forme des nues, -Et qui rvent, ainsi qu'un conscrit le canon, -De vastes volupts, changeantes, inconnues, -Et dont l'esprit humain n'a jamais su le nom ! - -\bigskip - - -\bigskip - -{\sl [ II ]} - -\bigskip - -Nous imitons, horreur ! la toupie et la boule -Dans leur valse et leurs bonds ; mme dans nos sommeils -La Curiosit nous tourmente et nous roule -Comme un Ange cruel qui fouette des soleils. - -\bigskip - -Singulire fortune o le but se dplace, -Et, n'tant nulle part, peut tre n'importe o ! -O l'Homme, dont jamais l'esprance n'est lasse, -Pour trouver le repos court toujours comme un fou ! - -\bigskip - -Notre me est un trois-mts cherchant son Icarie ; -Une voix retentit sur le pont : <> -Une voix de la hune, ardente et folle, crie : -<> Enfer ! c'est un cueil ! - -\bigskip - -Chaque lot signal par l'homme de vigie -Est un Eldorado promis par le Destin ; -L'Imagination qui dresse son orgie -Ne trouve qu'un rcif aux clarts du matin. - -\bigskip - -O le pauvre amoureux des pays chimriques ! -Faut-il le mettre aux fers, le jeter la mer, -Ce matelot ivrogne, inventeur d'Amriques -Dont le mirage rend le gouffre plus amer ? - -\bigskip - -Tel le vieux vagabond, pitinant dans la boue, -Rve, le nez en l'air, de brillants paradis ; -Son il ensorcel dcouvre une Capoue -Partout o la chandelle illumine un taudis. - -\bigskip - - -\bigskip - -{\sl [ III ]} - -\bigskip - -tonnants voyageurs ! quelles nobles histoires -Nous lisons dans vos yeux profonds comme les mers ! -Montrez-nous les crins de vos riches mmoires, -Ces bijoux merveilleux, faits d'astres et d'thers. - -\bigskip - -Nous voulons voyager sans vapeur et sans voile ! -Faites, pour gayer l'ennui de nos prisons, -Passer sur nos esprits, tendus comme une toile, -Vos souvenirs avec leurs cadres d'horizons. - -\bigskip - -Dites, qu'avez-vous vu ? - -\bigskip - - -\bigskip - -{\sl [ IV ]} - -\bigskip - -<> - -\bigskip - - -\bigskip - -{\sl [ V ]} - -\bigskip - -Et puis, et puis encore ? - -\bigskip - -{\sl [ VI ]} - -\bigskip - -<< cerveaux enfantins ! - -\bigskip - -Pour ne pas oublier la chose capitale, -Nous avons vu partout, et sans l'avoir cherch, -Du haut jusques en bas de l'chelle fatale, -Le spectacle ennuyeux de l'immortel pch : - -\bigskip - -La femme, esclave vile, orgueilleuse et stupide, -Sans rire s'adorant et s'aimant sans dgot ; -L'homme, tyran goulu, paillard, dur et cupide, -Esclave de l'esclave et ruisseau dans l'gout ; - -\bigskip - -Le bourreau qui jouit, le martyr qui sanglote ; -La fte qu'assaisonne et parfume le sang ; -Le poison du pouvoir nervant le despote, -Et le peuple amoureux du fouet abrutissant ; - -\bigskip - -Plusieurs religions semblables la ntre, -Toutes escaladant le ciel ; la Saintet, -Comme en un lit de plume un dlicat se vautre, -Dans les clous et le crin cherchant la volupt ; - -\bigskip - -L'Humanit bavarde, ivre de son gnie, -Et, folle maintenant comme elle tait jadis, -Criant Dieu, dans sa furibonde agonie : -<> - -\bigskip - -Et les moins sots, hardis amants de la Dmence, -Fuyant le grand troupeau parqu par le Destin, -Et se rfugiant dans l'opium immense ! - Tel est du globe entier l'ternel bulletin. >> - -\bigskip - - -\bigskip - -{\sl [ VII ]} - -\bigskip - -Amer savoir, celui qu'on tire du voyage ! -Le monde, monotone et petit, aujourd'hui, -Hier, demain, toujours, nous fait voir notre image : -Une oasis d'horreur dans un dsert d'ennui ! - -\bigskip - -Faut-il partir ? rester? Si tu peux rester, reste ; -Pars, s'il le faut. L'un court, et l'autre se tapit -Pour tromper l'ennemi vigilant et funeste, -Le Temps ! Il est, hlas ! des coureurs sans rpit, - -\bigskip - -Comme le Juif errant et comme les aptres, -A qui rien ne suffit, ni wagon ni vaisseau, -Pour fuir ce rtiaire infme ; il en est d'autres -Qui savent le tuer sans quitter leur berceau. - -\bigskip - -Lorsque enfin il mettra le pied sur notre chine, -Nous pourrons esprer et crier : En avant ! -De mme qu'autrefois nous partions pour la Chine, -Les yeux fixs au large et les cheveux au vent, - -\bigskip - -Nous nous embarquerons sur la mer des Tnbres -Avec le c{\oe}ur joyeux d'un jeune passager. -Entendez-vous ces voix charmantes et funbres, -Qui chantent : <> - -\bigskip - -A l'accent familier nous devinons le spectre ; -Nos Pylades l-bas tendent leurs bras vers nous. -<> -Dit celle dont jadis nous baisions les genoux. - -\bigskip - - -\bigskip - -{\sl [ VIII ]} - -\bigskip - - Mort, vieux capitaine, il est temps ! levons l'ancre ! -Ce pays nous ennuie, Mort ! Appareillons ! -Si le ciel et la mer sont noirs comme de l'encre, -Nos c{\oe}urs que tu connais sont remplis de rayons ! - -\bigskip - -Verse-nous ton poison pour qu'il nous rconforte ! -Nous voulons, tant ce feu nous brle le cerveau, -Plonger au fond du gouffre, Enfer ou Ciel, qu'importe ? -Au fond de l'Inconnu pour trouver du nouveau ! - -\end{multicols} - -Verse-nous ton poison pour qu'il nous rconforte ! -Nous voulons, tant ce feu nous brle le cerveau, -Plonger au fond du gouffre, Enfer ou Ciel, qu'importe ? -Au fond de l'Inconnu pour trouver du nouveau ! - - - -\end{document} diff --git a/doc/xtreemfs-userguide/package/garamond.sty b/doc/xtreemfs-userguide/package/garamond.sty deleted file mode 100644 index a31baab57725aa37155aee57841c185b1cb51b8f..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/package/garamond.sty +++ /dev/null @@ -1,17 +0,0 @@ -%% -%% This is file `garamond.sty` -%% -%% This file is under the public domain. -%% Original author: Gael Varoquaux -%% gael dot varoquaux at normalesup dot org -\pdfmapfile{=ugm.map} -\let\rmdefault@garamond\rmdefault% - -\newcommand{\garamond}{% -\renewcommand{\rmdefault}{ugm}\normalfont% -} - -\newcommand{\ungaramond}{% -\renewcommand{\rmdefault}{\rmdefault@garamond}\normalfont% -} - diff --git a/doc/xtreemfs-userguide/package/t1ugm.fd b/doc/xtreemfs-userguide/package/t1ugm.fd deleted file mode 100644 index ab6bc98c7121aed2680bd458ade7ed8891cf1366..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/package/t1ugm.fd +++ /dev/null @@ -1,38 +0,0 @@ -%Filename: t1ugm.fd -%Created by: tex inst-ugm -%Created using fontinst v1.927 - -%THIS FILE SHOULD BE PUT IN A TEX INPUTS DIRECTORY - -\ProvidesFile{t1ugm.fd} - [2005/01/13 Fontinst v1.927 font definitions for T1/ugm.] - -\DeclareFontFamily{T1}{ugm}{} - -\DeclareFontShape{T1}{ugm}{m}{sc}{ - <-> ugmrc8t -}{} - -\DeclareFontShape{T1}{ugm}{m}{n}{ - <-> ugmr8t -}{} - -\DeclareFontShape{T1}{ugm}{m}{it}{ - <-> ugmri8t -}{} - -\DeclareFontShape{T1}{ugm}{b}{n}{ - <-> ugmm8t -}{} - -\DeclareFontShape{T1}{ugm}{b}{it}{ - <-> ugmmi8t -}{} - -\DeclareFontShape{T1}{ugm}{m}{sl}{<->ssub * ugm/m/it}{} -\DeclareFontShape{T1}{ugm}{bx}{n}{<->ssub * ugm/b/n}{} -\DeclareFontShape{T1}{ugm}{bx}{it}{<->ssub * ugm/b/it}{} -\DeclareFontShape{T1}{ugm}{b}{sl}{<->ssub * ugm/b/it}{} -\DeclareFontShape{T1}{ugm}{bx}{sl}{<->ssub * ugm/b/sl}{} - -\endinput diff --git a/doc/xtreemfs-userguide/package/ts1ugm.fd b/doc/xtreemfs-userguide/package/ts1ugm.fd deleted file mode 100644 index 4790aa1285396a5c8e04a373c111423f5f72a3c2..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/package/ts1ugm.fd +++ /dev/null @@ -1,34 +0,0 @@ -%Filename: ts1ugm.fd -%Created by: tex inst-ugm -%Created using fontinst v1.927 - -%THIS FILE SHOULD BE PUT IN A TEX INPUTS DIRECTORY - -\ProvidesFile{ts1ugm.fd} - [2005/01/13 Fontinst v1.927 font definitions for TS1/ugm.] - -\DeclareFontFamily{TS1}{ugm}{} - -\DeclareFontShape{TS1}{ugm}{m}{n}{ - <-> ugmr8c -}{} - -\DeclareFontShape{TS1}{ugm}{m}{it}{ - <-> ugmri8c -}{} - -\DeclareFontShape{TS1}{ugm}{b}{n}{ - <-> ugmm8c -}{} - -\DeclareFontShape{TS1}{ugm}{b}{it}{ - <-> ugmmi8c -}{} - -\DeclareFontShape{TS1}{ugm}{m}{sl}{<->ssub * ugm/m/it}{} -\DeclareFontShape{TS1}{ugm}{bx}{n}{<->ssub * ugm/b/n}{} -\DeclareFontShape{TS1}{ugm}{bx}{it}{<->ssub * ugm/b/it}{} -\DeclareFontShape{TS1}{ugm}{b}{sl}{<->ssub * ugm/b/it}{} -\DeclareFontShape{TS1}{ugm}{bx}{sl}{<->ssub * ugm/b/sl}{} - -\endinput diff --git a/doc/xtreemfs-userguide/package/ugm.map b/doc/xtreemfs-userguide/package/ugm.map deleted file mode 100644 index 65fb4994dd09c8232caa4c29ef77d5a324da3366..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/package/ugm.map +++ /dev/null @@ -1,4 +0,0 @@ -ugmr8r GaramondNo8-Reg " TeXBase1Encoding ReEncodeFont " <8r.enc ugmrc8t -}{} - -\DeclareFontShape{T1}{ugm}{m}{n}{ - <-> ugmr8t -}{} - -\DeclareFontShape{T1}{ugm}{m}{it}{ - <-> ugmri8t -}{} - -\DeclareFontShape{T1}{ugm}{b}{n}{ - <-> ugmm8t -}{} - -\DeclareFontShape{T1}{ugm}{b}{it}{ - <-> ugmmi8t -}{} - -\DeclareFontShape{T1}{ugm}{m}{sl}{<->ssub * ugm/m/it}{} -\DeclareFontShape{T1}{ugm}{bx}{n}{<->ssub * ugm/b/n}{} -\DeclareFontShape{T1}{ugm}{bx}{it}{<->ssub * ugm/b/it}{} -\DeclareFontShape{T1}{ugm}{b}{sl}{<->ssub * ugm/b/it}{} -\DeclareFontShape{T1}{ugm}{bx}{sl}{<->ssub * ugm/b/sl}{} - -\endinput diff --git a/doc/xtreemfs-userguide/ts1ugm.fd b/doc/xtreemfs-userguide/ts1ugm.fd deleted file mode 100644 index 4790aa1285396a5c8e04a373c111423f5f72a3c2..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/ts1ugm.fd +++ /dev/null @@ -1,34 +0,0 @@ -%Filename: ts1ugm.fd -%Created by: tex inst-ugm -%Created using fontinst v1.927 - -%THIS FILE SHOULD BE PUT IN A TEX INPUTS DIRECTORY - -\ProvidesFile{ts1ugm.fd} - [2005/01/13 Fontinst v1.927 font definitions for TS1/ugm.] - -\DeclareFontFamily{TS1}{ugm}{} - -\DeclareFontShape{TS1}{ugm}{m}{n}{ - <-> ugmr8c -}{} - -\DeclareFontShape{TS1}{ugm}{m}{it}{ - <-> ugmri8c -}{} - -\DeclareFontShape{TS1}{ugm}{b}{n}{ - <-> ugmm8c -}{} - -\DeclareFontShape{TS1}{ugm}{b}{it}{ - <-> ugmmi8c -}{} - -\DeclareFontShape{TS1}{ugm}{m}{sl}{<->ssub * ugm/m/it}{} -\DeclareFontShape{TS1}{ugm}{bx}{n}{<->ssub * ugm/b/n}{} -\DeclareFontShape{TS1}{ugm}{bx}{it}{<->ssub * ugm/b/it}{} -\DeclareFontShape{TS1}{ugm}{b}{sl}{<->ssub * ugm/b/it}{} -\DeclareFontShape{TS1}{ugm}{bx}{sl}{<->ssub * ugm/b/sl}{} - -\endinput diff --git a/doc/xtreemfs-userguide/ugm.map b/doc/xtreemfs-userguide/ugm.map deleted file mode 100644 index 65fb4994dd09c8232caa4c29ef77d5a324da3366..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/ugm.map +++ /dev/null @@ -1,4 +0,0 @@ -ugmr8r GaramondNo8-Reg " TeXBase1Encoding ReEncodeFont " <8r.enc > -endobj -8 0 obj -(Quick Start) -endobj -9 0 obj -<< /S /GoTo /D (chapter.2) >> -endobj -12 0 obj -(About XtreemFS) -endobj -13 0 obj -<< /S /GoTo /D (section.2.1) >> -endobj -16 0 obj -(What is XtreemFS?) -endobj -17 0 obj -<< /S /GoTo /D (section*.3) >> -endobj -20 0 obj -(What makes XtreemFS a distributed file system?) -endobj -21 0 obj -<< /S /GoTo /D (section*.4) >> -endobj -24 0 obj -(What makes XtreemFS a replicated file system?) -endobj -25 0 obj -<< /S /GoTo /D (section.2.2) >> -endobj -28 0 obj -(Is XtreemFS suitable for me?) -endobj -29 0 obj -<< /S /GoTo /D (section*.5) >> -endobj -32 0 obj -(XtreemFS is ...) -endobj -33 0 obj -<< /S /GoTo /D (section*.6) >> -endobj -36 0 obj -(XtreemFS is not ...) -endobj -37 0 obj -<< /S /GoTo /D (section.2.3) >> -endobj -40 0 obj -(Core Features) -endobj -41 0 obj -<< /S /GoTo /D (section*.7) >> -endobj -44 0 obj -(Distribution.) -endobj -45 0 obj -<< /S /GoTo /D (section*.8) >> -endobj -48 0 obj -(Replication.) -endobj -49 0 obj -<< /S /GoTo /D (section*.9) >> -endobj -52 0 obj -(Striping.) -endobj -53 0 obj -<< /S /GoTo /D (section*.10) >> -endobj -56 0 obj -(Security.) -endobj -57 0 obj -<< /S /GoTo /D (section.2.4) >> -endobj -60 0 obj -(Architecture) -endobj -61 0 obj -<< /S /GoTo /D (section*.11) >> -endobj -64 0 obj -(XtreemFS Components.) -endobj -65 0 obj -<< /S /GoTo /D (chapter.3) >> -endobj -68 0 obj -(XtreemFS Services) -endobj -69 0 obj -<< /S /GoTo /D (section.3.1) >> -endobj -72 0 obj -(Installation) -endobj -73 0 obj -<< /S /GoTo /D (subsection.3.1.1) >> -endobj -76 0 obj -(Prerequisites) -endobj -77 0 obj -<< /S /GoTo /D (subsection.3.1.2) >> -endobj -80 0 obj -(Installing from Pre-Packaged Releases) -endobj -81 0 obj -<< /S /GoTo /D (subsection.3.1.3) >> -endobj -84 0 obj -(Installing from Sources) -endobj -85 0 obj -<< /S /GoTo /D (section.3.2) >> -endobj -88 0 obj -(Configuration) -endobj -89 0 obj -<< /S /GoTo /D (subsection.3.2.1) >> -endobj -92 0 obj -(A Word about UUIDs) -endobj -93 0 obj -<< /S /GoTo /D (subsection.3.2.2) >> -endobj -96 0 obj -(Automatic DIR Discovery) -endobj -97 0 obj -<< /S /GoTo /D (subsection.3.2.3) >> -endobj -100 0 obj -(Authentication) -endobj -101 0 obj -<< /S /GoTo /D (subsection.3.2.4) >> -endobj -104 0 obj -(Configuring SSL Support) -endobj -105 0 obj -<< /S /GoTo /D (section*.12) >> -endobj -108 0 obj -(Converting PEM files to PKCS\04312) -endobj -109 0 obj -<< /S /GoTo /D (section*.13) >> -endobj -112 0 obj -(Importing trusted certificates from PEM into a JKS) -endobj -113 0 obj -<< /S /GoTo /D (section*.14) >> -endobj -116 0 obj -(Sample Setup) -endobj -117 0 obj -<< /S /GoTo /D (subsection.3.2.5) >> -endobj -120 0 obj -(List of Configuration Options) -endobj -121 0 obj -<< /S /GoTo /D (section*.15) >> -endobj -124 0 obj -(admin\137password optional) -endobj -125 0 obj -<< /S /GoTo /D (section*.16) >> -endobj -128 0 obj -(authentication\137provider) -endobj -129 0 obj -<< /S /GoTo /D (section*.17) >> -endobj -132 0 obj -(babudb.baseDir) -endobj -133 0 obj -<< /S /GoTo /D (section*.18) >> -endobj -136 0 obj -(babudb.cfgFile optional) -endobj -137 0 obj -<< /S /GoTo /D (section*.19) >> -endobj -140 0 obj -(babudb.checkInterval optional) -endobj -141 0 obj -<< /S /GoTo /D (section*.20) >> -endobj -144 0 obj -(babudb.compression optional) -endobj -145 0 obj -<< /S /GoTo /D (section*.21) >> -endobj -148 0 obj -(babudb.debug.level optional) -endobj -149 0 obj -<< /S /GoTo /D (section*.22) >> -endobj -152 0 obj -(babudb.localTimeRenew experimental, optional) -endobj -153 0 obj -<< /S /GoTo /D (section*.23) >> -endobj -156 0 obj -(babudb.logDir) -endobj -157 0 obj -<< /S /GoTo /D (section*.24) >> -endobj -160 0 obj -(babudb.maxLogfileSize optional) -endobj -161 0 obj -<< /S /GoTo /D (section*.25) >> -endobj -164 0 obj -(babudb.pseudoSyncWait optional) -endobj -165 0 obj -<< /S /GoTo /D (section*.26) >> -endobj -168 0 obj -(babudb.repl.backupDir experimental, optional) -endobj -169 0 obj -<< /S /GoTo /D (section*.27) >> -endobj -172 0 obj -(babudb.repl.chunkSize experimental, optional) -endobj -173 0 obj -<< /S /GoTo /D (section*.28) >> -endobj -176 0 obj -(babudb.repl.participant experimental, optional) -endobj -177 0 obj -<< /S /GoTo /D (section*.29) >> -endobj -180 0 obj -(babudb.repl.sync.n experimental, optional) -endobj -181 0 obj -<< /S /GoTo /D (section*.30) >> -endobj -184 0 obj -(babudb.ssl.authenticationWithoutEncryption experimental, optional) -endobj -185 0 obj -<< /S /GoTo /D (section*.31) >> -endobj -188 0 obj -(babudb.ssl.enabled experimental, optional) -endobj -189 0 obj -<< /S /GoTo /D (section*.32) >> -endobj -192 0 obj -(babudb.ssl.service\137creds experimental, optional) -endobj -193 0 obj -<< /S /GoTo /D (section*.33) >> -endobj -196 0 obj -(babudb.ssl.service\137creds.container \040experimental, optional) -endobj -197 0 obj -<< /S /GoTo /D (section*.34) >> -endobj -200 0 obj -(babudb.ssl.service\137creds.pw experimental, optional) -endobj -201 0 obj -<< /S /GoTo /D (section*.35) >> -endobj -204 0 obj -(babudb.ssl.trusted\137certs experimental, optional) -endobj -205 0 obj -<< /S /GoTo /D (section*.36) >> -endobj -208 0 obj -(babudb.ssl.trusted\137certs.container experimental, optional) -endobj -209 0 obj -<< /S /GoTo /D (section*.37) >> -endobj -212 0 obj -(babudb.ssl.trusted\137certs.pw experimental, optional) -endobj -213 0 obj -<< /S /GoTo /D (section*.38) >> -endobj -216 0 obj -(babudb.sync) -endobj -217 0 obj -<< /S /GoTo /D (section*.39) >> -endobj -220 0 obj -(babudb.worker.maxQueueLength optional) -endobj -221 0 obj -<< /S /GoTo /D (section*.40) >> -endobj -224 0 obj -(babudb.worker.numThreads optional) -endobj -225 0 obj -<< /S /GoTo /D (section*.41) >> -endobj -228 0 obj -(capability\137secret) -endobj -229 0 obj -<< /S /GoTo /D (section*.42) >> -endobj -232 0 obj -(capability\137timeout optional) -endobj -233 0 obj -<< /S /GoTo /D (section*.43) >> -endobj -236 0 obj -(checksums.enabled) -endobj -237 0 obj -<< /S /GoTo /D (section*.44) >> -endobj -240 0 obj -(checksums.algorithm) -endobj -241 0 obj -<< /S /GoTo /D (section*.45) >> -endobj -244 0 obj -(debug.level optional) -endobj -245 0 obj -<< /S /GoTo /D (section*.46) >> -endobj -248 0 obj -(debug.categories optional) -endobj -249 0 obj -<< /S /GoTo /D (section*.47) >> -endobj -252 0 obj -(dir\137service.host) -endobj -253 0 obj -<< /S /GoTo /D (section*.48) >> -endobj -256 0 obj -(dir\137service.port) -endobj -257 0 obj -<< /S /GoTo /D (section*.49) >> -endobj -260 0 obj -(discover optional) -endobj -261 0 obj -<< /S /GoTo /D (section*.50) >> -endobj -264 0 obj -(geographic\137coordinates optional) -endobj -265 0 obj -<< /S /GoTo /D (section*.51) >> -endobj -268 0 obj -(hostname optional) -endobj -269 0 obj -<< /S /GoTo /D (section*.52) >> -endobj -272 0 obj -(http\137port) -endobj -273 0 obj -<< /S /GoTo /D (section*.53) >> -endobj -276 0 obj -(listen.address optional) -endobj -277 0 obj -<< /S /GoTo /D (section*.54) >> -endobj -280 0 obj -(listen.port) -endobj -281 0 obj -<< /S /GoTo /D (section*.55) >> -endobj -284 0 obj -(local\137clock\137renewal) -endobj -285 0 obj -<< /S /GoTo /D (section*.56) >> -endobj -288 0 obj -(monitoring) -endobj -289 0 obj -<< /S /GoTo /D (section*.57) >> -endobj -292 0 obj -(monitoring.email.programm) -endobj -293 0 obj -<< /S /GoTo /D (section*.58) >> -endobj -296 0 obj -(monitoring.email.receiver) -endobj -297 0 obj -<< /S /GoTo /D (section*.59) >> -endobj -300 0 obj -(monitoring.email.sender) -endobj -301 0 obj -<< /S /GoTo /D (section*.60) >> -endobj -304 0 obj -(monitoring.max\137warnings) -endobj -305 0 obj -<< /S /GoTo /D (section*.61) >> -endobj -308 0 obj -(no\137atime) -endobj -309 0 obj -<< /S /GoTo /D (section*.62) >> -endobj -312 0 obj -(object\137dir) -endobj -313 0 obj -<< /S /GoTo /D (section*.63) >> -endobj -316 0 obj -(osd\137check\137interval) -endobj -317 0 obj -<< /S /GoTo /D (section*.64) >> -endobj -320 0 obj -(remote\137time\137sync) -endobj -321 0 obj -<< /S /GoTo /D (section*.65) >> -endobj -324 0 obj -(report\137free\137space) -endobj -325 0 obj -<< /S /GoTo /D (section*.66) >> -endobj -328 0 obj -(service\137timeout\137s) -endobj -329 0 obj -<< /S /GoTo /D (section*.67) >> -endobj -332 0 obj -(ssl.enabled) -endobj -333 0 obj -<< /S /GoTo /D (section*.68) >> -endobj -336 0 obj -(ssl.grid\137ssl) -endobj -337 0 obj -<< /S /GoTo /D (section*.69) >> -endobj -340 0 obj -(ssl.service\137creds) -endobj -341 0 obj -<< /S /GoTo /D (section*.70) >> -endobj -344 0 obj -(ssl.service\137creds.container) -endobj -345 0 obj -<< /S /GoTo /D (section*.71) >> -endobj -348 0 obj -(ssl.service\137creds.pw) -endobj -349 0 obj -<< /S /GoTo /D (section*.72) >> -endobj -352 0 obj -(ssl.trusted\137certs) -endobj -353 0 obj -<< /S /GoTo /D (section*.73) >> -endobj -356 0 obj -(ssl.trusted\137certs.container) -endobj -357 0 obj -<< /S /GoTo /D (section*.74) >> -endobj -360 0 obj -(ssl.trusted\137certs.pw) -endobj -361 0 obj -<< /S /GoTo /D (section*.75) >> -endobj -364 0 obj -(startup.wait\137for\137dir) -endobj -365 0 obj -<< /S /GoTo /D (section*.76) >> -endobj -368 0 obj -(uuid) -endobj -369 0 obj -<< /S /GoTo /D (section.3.3) >> -endobj -372 0 obj -(Execution and Monitoring) -endobj -373 0 obj -<< /S /GoTo /D (subsection.3.3.1) >> -endobj -376 0 obj -(Starting and Stopping the XtreemFS services) -endobj -377 0 obj -<< /S /GoTo /D (subsection.3.3.2) >> -endobj -380 0 obj -(Web-based Status Page) -endobj -381 0 obj -<< /S /GoTo /D (subsection.3.3.3) >> -endobj -384 0 obj -(DIR Service Monitoring) -endobj -385 0 obj -<< /S /GoTo /D (section.3.4) >> -endobj -388 0 obj -(Troubleshooting) -endobj -389 0 obj -<< /S /GoTo /D (chapter.4) >> -endobj -392 0 obj -(XtreemFS Client) -endobj -393 0 obj -<< /S /GoTo /D (section.4.1) >> -endobj -396 0 obj -(Installation) -endobj -397 0 obj -<< /S /GoTo /D (subsection.4.1.1) >> -endobj -400 0 obj -(Prerequisites) -endobj -401 0 obj -<< /S /GoTo /D (subsection.4.1.2) >> -endobj -404 0 obj -(Installing from Pre-Packaged Releases) -endobj -405 0 obj -<< /S /GoTo /D (subsection.4.1.3) >> -endobj -408 0 obj -(Installing from Sources) -endobj -409 0 obj -<< /S /GoTo /D (section.4.2) >> -endobj -412 0 obj -(Volume Management) -endobj -413 0 obj -<< /S /GoTo /D (subsection.4.2.1) >> -endobj -416 0 obj -(Creating Volumes) -endobj -417 0 obj -<< /S /GoTo /D (subsection.4.2.2) >> -endobj -420 0 obj -(Deleting Volumes) -endobj -421 0 obj -<< /S /GoTo /D (subsection.4.2.3) >> -endobj -424 0 obj -(Listing all Volumes) -endobj -425 0 obj -<< /S /GoTo /D (section.4.3) >> -endobj -428 0 obj -(Accessing Volumes) -endobj -429 0 obj -<< /S /GoTo /D (subsection.4.3.1) >> -endobj -432 0 obj -(Mounting and Un-mounting) -endobj -433 0 obj -<< /S /GoTo /D (subsection.4.3.2) >> -endobj -436 0 obj -(Mount Options) -endobj -437 0 obj -<< /S /GoTo /D (section.4.4) >> -endobj -440 0 obj -(Troubleshooting) -endobj -441 0 obj -<< /S /GoTo /D (chapter.5) >> -endobj -444 0 obj -(XtreemFS Tools) -endobj -445 0 obj -<< /S /GoTo /D (section.5.1) >> -endobj -448 0 obj -(Installation) -endobj -449 0 obj -<< /S /GoTo /D (subsection.5.1.1) >> -endobj -452 0 obj -(Prerequisites) -endobj -453 0 obj -<< /S /GoTo /D (subsection.5.1.2) >> -endobj -456 0 obj -(Installing from Pre-Packaged Releases) -endobj -457 0 obj -<< /S /GoTo /D (subsection.5.1.3) >> -endobj -460 0 obj -(Installing from Sources) -endobj -461 0 obj -<< /S /GoTo /D (section.5.2) >> -endobj -464 0 obj -(Maintenance Tools) -endobj -465 0 obj -<< /S /GoTo /D (subsection.5.2.1) >> -endobj -468 0 obj -(MRC Database Conversion) -endobj -469 0 obj -<< /S /GoTo /D (subsection.5.2.2) >> -endobj -472 0 obj -(Scrubbing and Cleanup) -endobj -473 0 obj -<< /S /GoTo /D (subsection.5.2.3) >> -endobj -476 0 obj -(Setting the Service Status) -endobj -477 0 obj -<< /S /GoTo /D (section.5.3) >> -endobj -480 0 obj -(User Tools) -endobj -481 0 obj -<< /S /GoTo /D (subsection.5.3.1) >> -endobj -484 0 obj -(Showing XtreemFS-specific File Info) -endobj -485 0 obj -<< /S /GoTo /D (subsection.5.3.2) >> -endobj -488 0 obj -(Changing Striping Policies) -endobj -489 0 obj -<< /S /GoTo /D (subsection.5.3.3) >> -endobj -492 0 obj -(Read-Only Replication) -endobj -493 0 obj -<< /S /GoTo /D (subsection.5.3.4) >> -endobj -496 0 obj -(Automatic On-Close Replication) -endobj -497 0 obj -<< /S /GoTo /D (subsection.5.3.5) >> -endobj -500 0 obj -(Changing OSD and Replica Selection Policies) -endobj -501 0 obj -<< /S /GoTo /D (subsection.5.3.6) >> -endobj -504 0 obj -(Setting and Listing Policy Attributes) -endobj -505 0 obj -<< /S /GoTo /D (section.5.4) >> -endobj -508 0 obj -(Vivaldi) -endobj -509 0 obj -<< /S /GoTo /D (chapter.6) >> -endobj -512 0 obj -(Policies) -endobj -513 0 obj -<< /S /GoTo /D (section.6.1) >> -endobj -516 0 obj -(Authentication Policies) -endobj -517 0 obj -<< /S /GoTo /D (subsection.6.1.1) >> -endobj -520 0 obj -(UNIX uid/gid - NullAuthProvider) -endobj -521 0 obj -<< /S /GoTo /D (subsection.6.1.2) >> -endobj -524 0 obj -(Plain SSL Certificates - SimpleX509AuthProvider) -endobj -525 0 obj -<< /S /GoTo /D (subsection.6.1.3) >> -endobj -528 0 obj -(XtreemOS Certificates - XOSAuthProvider) -endobj -529 0 obj -<< /S /GoTo /D (section.6.2) >> -endobj -532 0 obj -(Authorization Policies) -endobj -533 0 obj -<< /S /GoTo /D (section.6.3) >> -endobj -536 0 obj -(OSD and Replica Selection Policies) -endobj -537 0 obj -<< /S /GoTo /D (subsection.6.3.1) >> -endobj -540 0 obj -(Attributes) -endobj -541 0 obj -<< /S /GoTo /D (subsection.6.3.2) >> -endobj -544 0 obj -(Predefined Policies) -endobj -545 0 obj -<< /S /GoTo /D (section*.77) >> -endobj -548 0 obj -(Filtering Policies) -endobj -549 0 obj -<< /S /GoTo /D (section*.78) >> -endobj -552 0 obj -(Grouping Policies) -endobj -553 0 obj -<< /S /GoTo /D (section*.79) >> -endobj -556 0 obj -(Sorting Policies) -endobj -557 0 obj -<< /S /GoTo /D (section.6.4) >> -endobj -560 0 obj -(Striping Policies) -endobj -561 0 obj -<< /S /GoTo /D (section.6.5) >> -endobj -564 0 obj -(Plug-in Policies) -endobj -565 0 obj -<< /S /GoTo /D (appendix.A) >> -endobj -568 0 obj -(Support) -endobj -569 0 obj -<< /S /GoTo /D (appendix.B) >> -endobj -572 0 obj -(XtreemOS Integration) -endobj -573 0 obj -<< /S /GoTo /D (section.B.1) >> -endobj -576 0 obj -(XtreemFS Security Preparations) -endobj -577 0 obj -<< /S /GoTo /D (appendix.C) >> -endobj -580 0 obj -(Hadoop Integration) -endobj -581 0 obj -<< /S /GoTo /D (section.C.1) >> -endobj -584 0 obj -(Introduction) -endobj -585 0 obj -<< /S /GoTo /D (section.C.2) >> -endobj -588 0 obj -(Quick Start) -endobj -589 0 obj -<< /S /GoTo /D (appendix.D) >> -endobj -592 0 obj -(Command Line Utilities) -endobj -593 0 obj -<< /S /GoTo /D [594 0 R /Fit ] >> -endobj - -598 0 obj << -/Length 199 -/Filter /FlateDecode ->> -stream -xuO -0 +rlMuUԡ7 :pn(x %G2AE -Z#T[1Y}3^чԒ3KLbg0g&Dl jE -#Қ!]lF2˦ۭ kESiۻ.P*;ڕKpDUH1QJOgsKKJ -endstream -endobj -594 0 obj << -/Type /Page -/Contents 598 0 R -/Resources 597 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 603 0 R -/Group 596 0 R ->> endobj -595 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/final_logo.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 604 0 R -/BBox [0 0 192 56] -/Group 596 0 R -/Resources << -/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] ->> -/Length 31868 ->> -stream -0.8 0 0 -0.8 0 56 cm -q -1 0 0 1 0 0 cm -q -1 0 0 1 -100.84152 -759.30717 cm -q -0.441941 0 0 0.441941 154.35506 536.04966 cm -q -0.19215687 0.30588236 0.49411765 rg -264.85608 638.39467 m -266.91831 634.0015 272.84253 633.23285 277.09198 634.0065 c -280.66651 634.82514 285.36589 637.66102 283.65362 641.98533 c -281.55389 646.15328 275.94213 646.89343 271.80517 646.25189 c -268.16815 645.52936 263.2313 642.85196 264.85608 638.39467 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -290.04028 643.06431 m -292.06501 639.10833 297.26433 637.95848 301.3263 638.54215 c -304.62586 639.17957 308.45036 641.72461 306.73809 645.53574 c -304.68836 649.2535 299.7765 650.33636 295.86451 649.92328 c -292.48996 649.4151 288.40299 647.04091 290.04028 643.06431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.24986 646.23389 m -314.17461 642.79822 318.54904 641.30279 322.29854 641.69636 c -325.33565 642.1748 328.02279 644.51774 326.38551 647.71807 c -324.44826 650.93003 320.3238 652.30237 316.74927 652.10172 c -313.63718 651.7795 310.68757 649.60545 312.24986 646.23389 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.44613 613.61667 m -247.69583 608.90854 253.84503 608.16489 258.38193 609.2585 c -262.4439 610.44584 267.0433 613.98663 265.30602 618.75225 c -263.13131 623.43664 257.05711 624.19779 252.5577 623.17917 c -248.39574 622.03432 243.62137 618.49103 245.44613 613.61667 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -272.26761 620.45203 m -274.34234 615.94012 280.11658 614.97774 284.516 615.94262 c -288.39049 616.99498 292.58994 620.29205 290.99015 624.77521 c -288.97792 629.19463 283.36615 630.18075 279.04172 629.35461 c -275.04225 628.38724 270.59283 625.09517 272.26761 620.45203 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -297.33932 626.15753 m -299.20158 622.03557 304.27591 620.75199 308.38787 621.56813 c -311.9999 622.48051 315.41195 625.54386 313.94964 629.55833 c -312.12488 633.53906 307.26302 634.82764 303.25104 634.19397 c -299.47654 633.40283 295.82702 630.34823 297.33932 626.15753 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -319.44892 630.60944 m -321.0987 626.99367 325.33565 625.36888 329.09765 626.03129 c -332.39722 626.80619 334.8344 629.67832 333.50957 633.11287 c -331.87229 636.57241 327.83532 638.15095 324.1858 637.70226 c -320.72375 637.08234 318.11159 634.20647 319.44892 630.60944 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.85753 594.66791 m -256.18222 590.166 262.09394 589.49359 266.51836 590.63969 c -270.49284 591.87328 274.81728 595.40781 273.105 600.02846 c -270.93029 604.6416 264.95607 605.36526 260.51915 604.2729 c -256.43219 603.05431 251.92028 599.40854 253.85753 594.66791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -279.84162 601.87321 m -281.84135 597.48004 287.40312 596.67015 291.61507 597.74626 c -295.45207 598.9286 299.43904 602.32441 297.98923 606.75382 c -296.13948 611.17074 290.6277 612.06438 286.44075 611.10075 c -282.42878 609.97215 278.20433 606.46886 279.84162 601.87321 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -304.16342 608.38361 m -305.8382 604.3004 310.71257 603.20554 314.63705 604.18791 c -318.24908 605.29527 321.54864 608.53359 320.3363 612.58181 c -318.76151 616.61503 314.01213 617.79987 310.13764 616.97373 c -306.32564 615.95512 302.8136 612.60931 304.16342 608.38361 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.6981 613.94913 m -327.07292 610.31586 331.13489 608.86605 334.72191 609.74343 c -338.04648 610.7583 340.49616 613.84164 339.45879 617.38993 c -338.13397 620.92571 334.23448 622.43927 330.70994 621.75186 c -327.1854 620.85447 324.58574 617.65364 325.6981 613.94913 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -343.93321 618.48603 m -345.07056 615.37519 348.30763 613.57168 351.54471 614.33658 c -354.53182 615.25146 356.11911 618.19857 355.20673 621.19068 c -354.09437 624.19029 350.99478 626.00005 347.83269 625.45137 c -344.64561 624.68147 343.00833 621.59438 343.93321 618.48603 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -262.35641 576.93274 m -264.63111 572.80703 270.24288 572.44958 274.31734 573.56068 c -277.94187 574.72928 282.19131 577.9751 280.59152 582.28703 c -278.51679 586.62647 272.73005 587.03391 268.63059 585.95155 c -264.88108 584.77421 260.40667 581.35716 262.35641 576.93274 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -286.97818 584.18679 m -288.84044 580.07607 294.13974 579.65863 297.96424 580.74724 c -301.53877 581.94458 305.47575 585.15416 304.22592 589.36736 c -302.56363 593.5993 297.22683 594.12673 293.37734 593.11061 c -289.65283 591.93577 285.45338 588.55996 286.97818 584.18679 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -310.11264 591.15462 m -311.56245 587.25263 316.24934 586.59522 319.79887 587.64133 c -323.21093 588.83368 326.54799 591.97076 325.58561 595.9065 c -324.28578 599.83598 319.67389 600.64588 316.11186 599.7085 c -312.51233 598.56365 308.9503 595.26408 310.11264 591.15462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -330.74744 597.50629 m -331.87229 593.96675 335.75928 592.95064 339.03385 593.94301 c -342.20843 595.10035 344.79559 598.13995 344.03319 601.67699 c -343.02083 605.17153 339.25882 606.35013 335.98425 605.49649 c -332.62219 604.41038 329.87255 601.2008 330.74744 597.50629 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -348.38262 603.05431 m -349.24501 599.97971 352.3321 598.55115 355.30671 599.48478 c -358.18134 600.58338 360.0186 603.513 359.39368 606.58885 c -358.56879 609.57845 355.63167 611.137 352.68206 610.3721 c -349.60746 609.36598 347.70771 606.25014 348.38262 603.05431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.93071 607.73869 m -363.61812 605.17153 365.96781 603.34427 368.64246 604.21041 c -371.19213 605.23652 372.31698 608.05365 371.77955 610.65081 c -371.10464 613.12424 368.86743 615.01774 366.23028 614.34658 c -363.50564 613.43295 362.38079 610.40709 362.93071 607.73869 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.57918 611.58694 m -375.14161 609.51596 376.90388 607.35625 379.27857 608.14489 c -381.49078 609.09102 382.00321 611.79691 381.50328 613.93288 c -380.94085 615.92512 379.25357 618.07234 376.94137 617.49741 c -374.56669 616.68252 374.11675 613.74291 374.57918 611.58694 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -247.29589 554.86438 m -249.83305 551.43108 255.03237 551.26735 258.80688 552.23098 c -261.88147 553.15086 266.08092 555.86925 264.19367 559.59876 c -261.83148 563.36202 256.28221 563.48325 252.44521 562.48713 c -249.29562 561.51976 244.98369 558.60764 247.29589 554.86438 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.30537 561.38228 m -272.46758 557.72151 277.72939 557.7665 281.31642 558.77637 c -284.47851 559.80748 288.76544 562.62087 287.31564 566.5241 c -285.39089 570.46234 279.86661 570.42859 276.24209 569.42747 c -273.01751 568.37886 268.44311 565.37175 270.30537 561.38228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -293.27735 568.39261 m -294.97713 564.6631 300.00147 564.73059 303.33853 565.74795 c -306.51312 566.87031 310.48759 569.73118 309.45023 573.61692 c -307.98792 577.53641 302.8386 577.56265 299.47654 576.58278 c -296.20197 575.46418 291.90253 572.41708 293.27735 568.39261 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -314.987 575.46043 m -316.22434 571.83341 320.73625 571.72967 323.81085 572.73829 c -326.92294 573.91938 330.33499 576.78151 329.62258 580.48852 c -328.57272 584.20928 324.07331 584.48425 320.97372 583.53437 c -317.72414 582.37202 314.03713 579.32867 314.987 575.46043 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -334.52194 582.22329 m -335.40932 578.85374 339.20883 578.42004 342.04595 579.41616 c -344.99557 580.61725 347.73271 583.44688 347.25777 586.85893 c -346.49537 590.23474 342.82085 590.88716 339.94623 589.97103 c -336.83414 588.79993 333.89702 585.78908 334.52194 582.22329 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.43222 588.42998 m -352.05714 585.43662 355.05675 584.57048 357.6814 585.55536 c -360.39355 586.74395 362.46827 589.50984 362.10582 592.55944 c -361.56839 595.4928 358.71877 596.58516 356.06911 595.70402 c -353.19449 594.55917 351.00728 591.60456 351.43222 588.42998 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.56787 593.93926 m -366.01781 591.39709 368.26751 590.06351 370.6797 591.03214 c -373.10438 592.18449 374.55419 594.86288 374.26673 597.52254 c -373.84178 599.97096 371.74206 601.49826 369.31738 600.65712 c -366.73021 599.56602 365.25541 596.68265 365.56787 593.93926 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.04136 598.70613 m -377.37882 596.6414 379.0036 594.86538 381.20332 595.80526 c -383.31554 596.90387 384.21542 599.47978 383.94046 601.75323 c -383.603 603.72047 382.0907 605.62522 379.91598 604.83908 c -377.65378 603.81546 376.7789 601.01958 377.04136 598.70613 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -256.10723 542.52975 m -258.51941 539.61513 263.29379 539.76886 266.61835 540.59126 c -269.11802 541.30616 273.47995 543.51462 271.71768 546.7592 c -269.50547 550.01752 264.31865 549.76505 260.96909 548.91391 c -258.41943 548.16151 253.90752 545.76183 256.10723 542.52975 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -277.36694 548.38523 m -279.35418 545.2194 284.26604 545.63809 287.35313 546.51673 c -289.99028 547.37412 294.35221 549.72756 293.06488 553.1721 c -291.34011 556.64665 286.10329 556.18171 283.0037 555.30308 c -280.34155 554.43194 275.64217 551.88352 277.36694 548.38523 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -298.60165 554.94687 m -300.10146 551.64731 304.87583 552.16849 307.68796 553.06462 c -310.4376 554.05699 314.43708 556.51042 313.61218 560.00246 c -312.37485 563.53824 307.4005 563.05831 304.57587 562.17967 c -301.78874 561.1873 297.40181 558.5464 298.60165 554.94687 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -318.77401 561.82222 m -319.81137 558.53015 324.1858 558.96509 326.74796 559.86623 c -329.5101 560.96608 332.98464 563.4795 332.5097 566.87906 c -331.69731 570.31611 327.28539 570.01989 324.68573 569.14376 c -321.83611 568.0489 318.0366 565.35926 318.77401 561.82222 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -337.1466 568.65757 m -337.80901 565.51299 341.55852 565.68546 343.92071 566.59659 c -346.60785 567.76519 349.46998 570.29861 349.23251 573.49944 c -348.73258 576.69527 345.07056 576.74526 342.64587 575.86413 c -339.84624 574.70303 336.74665 571.99838 337.1466 568.65757 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.24448 575.17172 m -353.64443 572.30209 356.64404 572.07088 358.86875 573.0045 c -361.38092 574.2031 363.64312 576.72027 363.54313 579.65238 c -363.23067 582.49451 360.39355 582.99569 358.10635 582.10456 c -355.46919 580.91721 353.05701 578.22507 353.24448 575.17172 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.90519 581.17718 m -367.14266 578.67876 369.39237 577.9601 371.49209 578.92123 c -373.76679 580.11857 375.46657 582.587 375.42907 585.21415 c -375.2291 587.63133 373.15437 588.6262 371.00465 587.72632 c -368.59247 586.54773 366.8177 583.89682 366.90519 581.17718 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.16621 586.57272 m -378.31619 584.49924 379.90349 583.27441 381.86573 584.25678 c -383.89046 585.43037 385.09031 587.82256 385.05281 590.13725 c -384.90283 592.10075 383.47802 593.5718 381.49078 592.67442 c -379.34106 591.52957 378.12872 588.94616 378.16621 586.57272 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.24002 591.32585 m -387.35251 589.68856 388.40237 587.99379 390.20213 588.98116 c -391.95191 590.11476 392.7268 592.41196 392.66431 594.42294 c -392.53933 595.95024 391.57695 597.8275 389.78969 596.95261 c -387.93993 595.85775 387.19003 593.36433 387.24002 591.32585 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.27115 528.66657 m -247.80832 526.53685 251.84529 526.56185 254.91989 527.13677 c -256.71965 527.53672 260.85661 529.10151 258.85687 531.53869 c -256.43219 533.97712 251.97027 533.8134 248.85818 533.18723 c -246.95843 532.73854 242.89646 531.01751 245.27115 528.66657 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -263.88121 532.72479 m -266.13091 530.29886 270.48034 530.70005 273.37996 531.38746 c -275.32971 531.91739 279.81662 533.68591 278.22933 536.44305 c -276.19209 539.20144 271.39272 538.65276 268.5056 537.9441 c -266.55586 537.39293 261.84398 535.43943 263.88121 532.72479 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -283.40365 537.89661 m -285.21591 535.21321 289.75282 535.91812 292.38997 536.65802 c -294.53969 537.34293 298.92661 539.27643 297.82676 542.25104 c -296.28946 545.24565 291.3651 544.437 288.76544 543.6971 c -286.64072 543.01219 281.86635 540.88497 283.40365 537.89661 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -302.91359 543.89082 m -304.23841 541.0337 308.75032 541.90858 311.08752 542.66348 c -313.41221 543.50712 317.42418 545.5656 316.79927 548.63895 c -315.7619 551.74979 310.97503 550.85491 308.66283 550.11126 c -306.35064 549.27387 301.91372 547.03291 302.91359 543.89082 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -321.58614 550.37372 m -322.43603 547.45286 326.68547 548.32899 328.7602 549.08639 c -331.18488 550.07001 334.67192 552.21973 334.40946 555.27183 c -333.80953 558.37142 329.46011 557.57903 327.36038 556.82788 c -324.9107 555.848 321.04871 553.53331 321.58614 550.37372 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -338.75888 557.02035 m -339.22132 554.15323 342.97083 554.85438 344.87058 555.62678 c -347.28277 556.71539 350.20738 558.92385 350.19488 561.85722 c -349.90742 564.81933 346.22041 564.30064 344.25816 563.52825 c -341.77099 562.43839 338.57141 560.0737 338.75888 557.02035 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -354.00688 563.55324 m -354.20686 560.85485 357.29395 561.22355 359.09372 562.03219 c -361.40591 563.18704 363.7806 565.4205 363.90559 568.16639 c -363.8181 570.87853 360.89348 570.7698 359.00623 569.95865 c -356.60654 568.7988 354.04438 566.41162 354.00688 563.55324 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -367.15516 569.76118 m -367.20515 567.3365 369.55484 567.25276 371.29212 568.11764 c -373.44183 569.30249 375.31659 571.52595 375.49156 574.04437 c -375.50406 576.41406 373.35435 576.804 371.52958 575.94287 c -369.29238 574.75302 367.29264 572.37459 367.15516 569.76118 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.19121 575.50792 m -378.16621 573.43445 379.816 572.83078 381.51577 573.7569 c -383.44052 574.94425 384.86533 577.12646 385.02781 579.40241 c -385.07781 581.37465 383.6155 582.28828 381.86573 581.38215 c -379.84099 580.19231 378.36619 577.85262 378.19121 575.50792 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.22752 580.71974 m -387.19003 579.03871 388.26489 577.91136 389.86468 578.88873 c -391.56446 580.05858 392.60182 582.17205 392.7268 584.20178 c -392.7643 585.76283 391.83942 587.16764 390.20213 586.23652 c -388.42737 585.06917 387.37751 582.79572 387.22752 580.71974 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -394.47657 585.37413 m -394.45158 584.0818 395.08899 582.48701 396.5638 583.48938 c -398.00111 584.61423 398.75101 586.66146 398.80101 588.44998 c -398.826 589.63107 398.23858 591.42958 396.78877 590.50721 c -395.26397 589.37735 394.57656 587.19514 394.47657 585.37413 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.44508 521.71248 m -255.79477 519.98771 259.4193 520.17518 262.15644 520.65012 c -263.45627 520.91259 267.7682 522.12493 265.95594 524.11217 c -263.70623 526.11191 259.65676 525.74945 256.93212 525.24952 c -255.5573 524.96206 251.25787 523.59974 253.44508 521.71248 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.56783 525.12454 m -272.63006 523.1373 276.57954 523.69972 279.09171 524.27465 c -280.57902 524.6496 285.10343 526.07441 283.71611 528.35911 c -281.86635 530.65631 277.45443 529.91016 274.97975 529.32648 c -273.52994 528.94153 268.74307 527.33675 270.56783 525.12454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -288.45299 529.64269 m -290.07777 527.39924 294.27722 528.29287 296.50193 528.90654 c -298.2267 529.43772 302.58863 531.02001 301.67625 533.53968 c -300.32643 536.0706 295.70203 535.03448 293.55232 534.42706 c -291.90253 533.90838 287.11566 532.13112 288.45299 529.64269 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -306.35064 535.02699 m -307.48799 532.59855 311.76243 533.70591 313.67468 534.32333 c -315.63692 535.02199 319.5864 536.72676 319.13646 539.38891 c -318.29907 542.06606 313.69967 540.88497 311.83742 540.28005 c -309.93767 539.59889 305.52575 537.71288 306.35064 535.02699 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -323.57338 541.0037 m -324.24829 538.46778 328.37275 539.64763 330.03503 540.2588 c -332.14725 541.11494 335.5843 542.92345 335.50931 545.61935 c -335.09687 548.34774 330.80993 547.18914 329.16014 546.58172 c -327.07292 545.73558 323.22342 543.77084 323.57338 541.0037 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.58378 547.28913 m -339.87124 544.73696 343.62075 545.83182 345.10805 546.44924 c -347.27027 547.43411 350.19488 549.32511 350.36986 551.96601 c -350.26987 554.64441 346.52037 553.67079 344.99557 553.04212 c -342.80835 552.05475 339.58378 550.02627 339.58378 547.28913 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.99439 553.62705 m -354.00688 551.15362 357.19397 552.00601 358.59378 552.65842 c -360.7185 553.73578 363.14319 555.68178 363.45564 558.20269 c -363.56813 560.72986 360.50603 560.08995 359.01873 559.41129 c -356.85651 558.32268 354.20686 556.2467 353.99439 553.62705 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.59273 559.80373 m -366.46775 557.50529 368.96742 557.98022 370.35474 558.69763 c -372.35448 559.83123 374.32922 561.80097 374.70417 564.16066 c -374.90414 566.44411 372.59195 566.25164 371.11714 565.50174 c -369.04241 564.35064 366.93019 562.25216 366.59273 559.80373 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.35382 565.66672 m -377.15385 563.62823 378.97861 563.62698 380.36593 564.42813 c -382.20318 565.58798 383.77798 567.54772 384.14043 569.72493 c -384.3529 571.69217 382.75311 572.01463 381.27831 571.18474 c -379.37855 570.00615 377.71627 567.91642 377.35382 565.66672 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -386.34014 571.116 m -386.14017 569.39873 387.34001 568.87379 388.71483 569.76118 c -390.35211 570.92353 391.57695 572.84577 391.88941 574.83176 c -392.07689 576.4378 391.07702 577.28644 389.63971 576.38781 c -387.93993 575.20546 386.6776 573.15448 386.34014 571.116 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -393.67668 576.0966 m -393.5142 574.72928 394.21411 573.69191 395.53893 574.64929 c -396.95125 575.78414 397.91362 577.66389 398.12609 579.45491 c -398.28857 580.70224 397.70115 582.01332 396.36383 581.08094 c -394.87652 579.9161 393.95164 577.93136 393.67668 576.0966 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -260.48166 516.47567 m -262.65637 515.10085 265.89345 515.40081 268.31813 515.77576 c -269.2555 515.93824 273.56744 516.92561 271.99265 518.48791 c -269.91792 520.11269 266.2809 519.62526 263.86871 519.22531 c -262.90634 519.03783 258.56941 517.92548 260.48166 516.47567 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -276.22959 519.35029 m -278.11684 517.738 281.66638 518.38792 283.87859 518.86286 c -284.99094 519.12532 289.45285 520.30017 288.26551 522.13743 c -286.59073 524.03718 282.56626 523.17479 280.44154 522.69985 c -279.39167 522.43739 274.6548 521.07507 276.22959 519.35029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -292.60244 523.26228 m -294.06475 521.41252 297.92674 522.39989 299.814 522.91233 c -301.20131 523.31227 305.46325 524.6246 304.72585 526.71183 c -303.5635 528.8228 299.22657 527.6617 297.43931 527.17427 c -296.17697 526.78682 291.46509 525.28701 292.60244 523.26228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -309.01279 528.0454 m -309.98766 526.01192 314.02463 527.24926 315.59942 527.73669 c -317.24921 528.31287 321.0862 529.71893 320.79874 531.99363 c -320.13633 534.24959 315.72441 532.91351 314.2371 532.43233 c -312.6998 531.8899 308.37537 530.30011 309.01279 528.0454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -324.9107 533.47094 m -325.41064 531.31872 329.42261 532.66605 330.73494 533.14598 c -332.5722 533.88089 335.92176 535.38444 335.99675 537.73913 c -335.75928 540.07632 331.53483 538.70275 330.26 538.23032 c -328.48523 537.51416 324.71073 535.86188 324.9107 533.47094 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.80875 539.30018 m -339.94623 537.09047 343.68324 538.42154 344.82059 538.89648 c -346.75784 539.77261 349.61996 541.36865 349.94492 543.71835 c -350.01991 546.06929 346.2329 544.79695 345.07056 544.31077 c -343.14581 543.43713 339.95873 541.71986 339.80875 539.30018 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -353.38197 545.30439 m -353.25698 543.10468 356.53155 544.28452 357.59391 544.78321 c -359.53116 545.76808 361.94334 547.44036 362.41828 549.72131 c -362.68075 552.00976 359.50616 550.97614 358.36881 550.44621 c -356.40657 549.44759 353.75692 547.66783 353.38197 545.30439 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.44288 551.28485 m -365.15542 549.17013 367.83007 550.06876 368.87993 550.62619 c -370.75469 551.68605 372.76692 553.40707 373.29185 555.58054 c -373.65431 557.72276 371.16713 557.05035 370.01728 556.44543 c -368.10503 555.36182 365.93032 553.53581 365.44288 551.28485 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -375.89151 557.08284 m -375.54156 555.1331 377.56629 555.63678 378.66615 556.28295 c -380.40342 557.38655 382.0657 559.12757 382.59063 561.16856 c -382.96558 563.08705 381.16582 562.86958 379.96598 562.16967 c -378.17871 561.03607 376.41644 559.19256 375.89151 557.08284 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -384.77785 562.58462 m -384.42789 560.87234 385.81521 560.90234 386.96506 561.65099 c -388.53985 562.77584 389.87718 564.50687 390.36461 566.40412 c -390.68957 568.03515 389.52722 568.32512 388.30238 567.52647 c -386.6776 566.37037 385.27778 564.53686 384.77785 562.58462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -392.16438 567.71645 m -391.87691 566.29163 392.7143 565.8167 393.86415 566.66658 c -395.25147 567.77894 396.36383 569.49121 396.73878 571.23598 c -397.02624 572.55456 396.33883 573.33071 395.15149 572.46207 c -393.70168 571.30473 392.61432 569.50871 392.16438 567.71645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -295.9895 518.40042 m -297.30182 516.88812 300.83886 517.90048 302.47615 518.32543 c -303.576 518.62539 307.70046 519.72524 307.11304 521.43752 c -306.11317 523.17479 302.0637 521.97495 300.5764 521.575 c -299.60152 521.30004 295.06462 519.98771 295.9895 518.40042 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -311.06252 522.61236 m -311.88741 520.93758 315.69941 522.19992 316.99924 522.61236 c -318.38656 523.0748 322.08607 524.23715 321.92359 526.1619 c -321.41116 528.02041 317.19921 526.63684 316.01187 526.26189 c -314.76203 525.83694 310.57508 524.48712 311.06252 522.61236 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.7231 527.49922 m -326.09805 525.71196 329.97254 527.11177 331.0099 527.47423 c -332.63469 528.10664 335.83427 529.34648 336.03424 531.38746 c -335.93426 533.33346 331.8223 531.88365 330.83492 531.5237 c -329.31012 530.92127 325.6731 529.53771 325.7231 527.49922 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.59627 532.82602 m -339.60877 530.97252 343.30829 532.39608 344.17067 532.75353 c -345.92045 533.52718 348.67008 534.86076 349.13252 536.93174 c -349.32 538.92772 345.54549 537.51416 344.68311 537.15171 c -342.95833 536.38306 339.88374 534.9445 339.59627 532.82602 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -352.3821 538.42029 m -352.13213 536.53054 355.45669 537.87911 356.24409 538.24781 c -358.01886 539.13895 360.38105 540.56001 360.98097 542.60349 c -361.36842 544.60198 358.10635 543.33715 357.25646 542.9397 c -355.46919 542.03732 352.88203 540.52751 352.3821 538.42029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -363.88059 544.0958 m -363.46814 542.22104 366.28027 543.38214 367.06767 543.79709 c -368.80494 544.77321 370.81718 546.26426 371.46709 548.239 c -371.95453 550.18 369.30488 549.17513 368.42999 548.71269 c -366.65522 547.71032 364.49301 546.13928 363.88059 544.0958 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.00426 549.70131 m -373.51682 547.90405 375.74153 548.77143 376.57892 549.26387 c -378.22871 550.29873 379.91598 551.82978 380.5659 553.71578 c -381.07833 555.52555 379.07859 554.88313 378.14122 554.32945 c -376.45394 553.25959 374.65417 551.64731 374.00426 549.70131 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -382.74061 555.1181 m -382.26568 553.46832 383.87796 553.94575 384.77785 554.54193 c -386.30265 555.61053 387.71496 557.15658 388.32738 558.93635 c -388.78982 560.54739 387.415 560.34616 386.41513 559.68375 c -384.86533 558.5764 383.37803 556.95036 382.74061 555.1181 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -390.15214 560.25992 m -389.7272 558.82011 390.77706 558.84761 391.73943 559.55627 c -393.08926 560.62738 394.3016 562.17467 394.81403 563.84195 c -395.22648 565.20428 394.36409 565.46549 393.33922 564.70934 c -391.93941 563.58574 390.72707 561.9722 390.15214 560.25992 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.61232 518.43791 m -313.31222 517.07559 316.89925 518.31293 317.98661 518.63789 c -319.17395 519.01284 322.69849 519.97521 322.6485 521.6 c -322.26105 523.0998 318.24908 521.74998 317.2867 521.46252 c -316.26184 521.11256 312.24986 519.96271 312.61232 518.43791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -326.17304 522.79984 m -326.423 521.35003 330.16001 522.71235 330.97241 522.99981 c -332.42222 523.53724 335.45932 524.54961 335.75928 526.31188 c -335.75928 527.88667 331.7848 526.46186 331.0224 526.19939 c -329.69757 525.68696 326.22303 524.53711 326.17304 522.79984 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -339.08384 527.62421 m -339.00885 526.1244 342.62088 527.52422 343.28329 527.79918 c -344.87058 528.48034 347.48274 529.58395 348.03267 531.40246 c -348.30763 533.0285 344.60812 531.61243 343.9582 531.34122 c -342.4209 530.66881 339.48379 529.47521 339.08384 527.62421 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.10726 532.78103 m -350.79481 531.22373 354.09437 532.5973 354.6818 532.86977 c -356.33158 533.67216 358.58128 534.87076 359.28119 536.68677 c -359.74363 538.36405 356.46906 537.02047 355.84414 536.72676 c -354.20686 535.91437 351.71968 534.64829 351.10726 532.78103 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.05583 538.09283 m -361.58089 536.49679 364.44301 537.76663 365.03044 538.07034 c -366.65522 538.96522 368.61747 540.24505 369.36737 542.02482 c -369.94229 543.7146 367.19265 542.53225 366.54274 542.1873 c -364.89296 541.26867 362.78073 539.92759 362.05583 538.09283 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -371.82955 543.42213 m -371.26712 541.83234 373.61681 542.9072 374.25423 543.2734 c -375.81652 544.23328 377.5038 545.57185 378.2537 547.29288 c -378.86612 548.93641 376.69141 548.01278 375.979 547.59034 c -374.37921 546.59672 372.59195 545.1969 371.82955 543.42213 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -380.39092 548.65645 m -379.816 547.1304 381.62826 547.91779 382.32817 548.37273 c -383.77798 549.37635 385.22779 550.74867 385.95269 552.39596 c -386.52762 553.92826 384.94033 553.35208 384.15293 552.82965 c -382.65313 551.78604 381.14082 550.35123 380.39092 548.65645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.77745 553.70454 m -387.24002 552.30472 388.50236 552.72716 389.27726 553.28959 c -390.60208 554.30696 391.87691 555.69802 392.50183 557.26532 c -393.03926 558.62514 391.95191 558.44766 391.11451 557.82649 c -389.7397 556.75413 388.47736 555.31057 387.77745 553.70454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg --87.686408 585.51161 m --101.65891 605.54773 l --85.394209 605.54773 l --78.571354 592.40446 l --71.231067 605.54773 l --53.874595 605.54773 l --67.956497 585.51161 l --54.856966 566.49286 l --70.629896 566.49286 l --76.880326 578.01385 l --82.692064 566.49286 l --99.966797 566.49286 l --87.686408 585.51161 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --12.796235 566.49286 m --52.887224 566.49286 l --52.887224 578.01385 l --40.100152 578.01385 l --40.100152 605.54773 l --25.579558 605.54773 l --25.579558 578.01385 l --12.796235 578.01385 l --12.796235 566.49286 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --8.4293081 605.54773 m -6.1012853 605.54773 l -6.1012853 592.23073 l -9.4570949 592.23073 l -10.420718 592.23073 11.258109 592.34072 11.966766 592.56069 c -12.675423 592.81815 13.247848 593.37558 13.68529 594.23547 c -14.030245 594.80289 14.312708 595.57154 14.530179 596.54266 c -14.712655 597.53128 14.858886 598.5824 14.966372 599.6985 c -15.130101 600.77836 15.266333 601.84947 15.376318 602.91183 c -15.485054 603.9192 15.612537 604.79783 15.758768 605.54773 c -31.336724 605.54773 l -30.661812 603.56424 30.174376 601.27079 29.874416 598.66988 c -29.524462 596.06773 28.812055 593.70179 27.749695 591.57207 c -27.09978 590.49846 26.274888 589.60607 25.262521 588.89617 c -24.262652 588.15127 22.959073 587.64133 21.368032 587.36887 c -21.368032 587.25888 l -24.100173 586.58397 26.299885 585.42537 27.949668 583.78434 c -29.561957 582.14205 30.37435 579.84486 30.411845 576.89024 c -30.37435 573.16823 29.087019 570.48733 26.549852 568.84505 c -23.950193 567.27775 20.365664 566.49286 15.778765 566.49286 c --8.4293081 566.49286 l --8.4293081 605.54773 l -h -5.4388722 575.16047 m -9.7695539 575.16047 l -11.40184 575.12422 12.835402 575.35294 14.07024 575.84913 c -15.247585 576.32657 15.855005 577.45517 15.8925 579.23494 c -15.8925 580.17231 15.731272 580.91471 15.408814 581.46589 c -15.066359 582.07206 14.582672 582.53075 13.955255 582.84321 c -12.684171 583.35564 11.213114 583.59436 9.5420838 583.55812 c -5.4388722 583.55812 l -5.4388722 575.16047 l -f* -Q -q -0.19215687 0.30588236 0.49411765 rg -36.948488 605.54773 m -70.094138 605.54773 l -70.094138 596.15272 l -51.134126 596.15272 l -51.134126 590.83216 l -68.894296 590.83216 l -68.894296 581.43215 l -51.134126 581.43215 l -51.134126 575.88787 l -69.719187 575.88787 l -69.719187 566.49286 l -36.948488 566.49286 l -36.948488 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -76.380813 605.54773 m -109.52646 605.54773 l -109.52646 596.15272 l -90.566452 596.15272 l -90.566452 590.83216 l -108.32662 590.83216 l -108.32662 581.43215 l -90.566452 581.43215 l -90.566452 575.88787 l -109.15151 575.88787 l -109.15151 566.49286 l -76.380813 566.49286 l -76.380813 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -116.26308 605.54773 m -128.61146 605.54773 l -128.77394 574.82426 l -129.01141 574.82426 l -136.21046 605.54773 l -148.32137 605.54773 l -155.7329 574.82426 l -155.84539 574.82426 l -156.08286 605.54773 l -169.01866 605.54773 l -169.01866 566.49286 l -147.62147 566.49286 l -142.7596 587.83506 l -142.64712 587.83506 l -137.71027 566.49286 l -116.26308 566.49286 l -116.26308 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -180.8921 605.54773 m -190.8283 605.54773 l -190.8283 589.88104 l -202.62675 589.88104 l -202.62675 582.16455 l -190.8283 582.16455 l -190.8283 574.20934 l -203.17668 574.20934 l -203.17668 566.49286 l -180.8921 566.49286 l -180.8921 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -209.28837 604.69284 m -210.31324 604.96531 211.70056 605.26527 213.46283 605.59273 c -215.1876 605.97393 217.19984 606.18265 219.52453 606.21889 c -224.11143 606.21889 227.76095 605.11779 230.4481 602.91433 c -233.17274 600.74711 234.56006 597.54253 234.59755 593.30184 c -234.59755 591.84453 234.44757 590.5697 234.14761 589.47734 c -233.83515 588.43873 233.36021 587.52885 232.7478 586.74645 c -231.51046 585.21665 229.99816 584.0968 228.21089 583.38564 c -223.574 581.25592 l -221.88672 580.50977 220.72437 579.81861 220.09946 579.18119 c -219.47454 578.56127 219.16208 577.76013 219.16208 576.77776 c -219.19957 574.35558 220.87435 573.12574 224.19892 573.09074 c -225.67372 573.09074 227.13603 573.28197 228.57334 573.66442 c -229.94816 574.06436 231.08551 574.5293 231.9854 575.05673 c -232.43534 567.37899 l -230.84804 566.72283 229.19826 566.29538 227.49848 566.09541 c -225.79871 565.91293 224.19892 565.8217 222.68662 565.8217 c -218.53716 565.8217 215.1876 566.81406 212.65043 568.80005 c -210.02578 570.80479 208.70095 573.67316 208.66346 577.40767 c -208.62596 580.12232 209.25088 582.39952 210.51321 584.23803 c -211.73805 586.09778 213.91277 587.66383 217.03736 588.93866 c -219.32456 589.84104 l -220.11195 590.09601 220.79936 590.35098 221.41178 590.60594 c -222.0492 590.87966 222.54913 591.17962 222.91159 591.50707 c -223.69898 592.14449 224.08643 593.07437 224.08643 594.29546 c -224.08643 595.53405 223.69898 596.52642 222.91159 597.27257 c -222.08669 598.09371 220.69938 598.50366 218.72464 598.50366 c -217.83725 598.50366 216.91237 598.39367 215.975 598.17495 c -215.07511 597.97498 214.22523 597.765 213.40033 597.54628 c -211.80054 596.98261 210.6382 596.51767 209.88829 596.15272 c -209.28837 604.69284 l -f -Q -Q -Q -Q -endstream -endobj -604 0 obj -<< -/Title (final_logo.pdf) -/Author (Bj\303\266rn Kolbeck) -/Creator (www.inkscape.org) -/Producer (Inkscape inkscape 0.45.1) -/CreationDate (D:20070525075700Z) ->> -endobj -596 0 obj -<< -/Type /Group -/S /Transparency -/CS /DeviceRGB ->>endobj -599 0 obj << -/D [594 0 R /XYZ 98.895 747.976 null] ->> endobj -600 0 obj << -/D [594 0 R /XYZ 99.895 717.021 null] ->> endobj -597 0 obj << -/Font << /F18 601 0 R /F17 602 0 R >> -/XObject << /Im1 595 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -610 0 obj << -/Length 748 -/Filter /FlateDecode ->> -stream -xuU[o0~ϯxS;#lBHiv&cKM}}߹|.W1,:H,Rdze,gWq*A3+b-5x:E<s-4s/OęTy+ N/jhoW&D 5Li*$1\$)K&jצtRIv  pX64oSb M{zxM|V϶>$`!X5$#@K!Т -%#U"B*WQ)p>M.KW#jm!^J0vS,!sS-ZAmAA4Jkci 5 m0AfU'> endobj -605 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/xtreemos_neu_logo.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 614 0 R -/BBox [0 0 841.89 595.276] -/Resources << -/XObject << -/Im0 615 0 R ->>/Shading << -/Sh16 616 0 R -/Sh17 617 0 R -/Sh18 618 0 R -/Sh19 619 0 R -/Sh150 620 0 R -/Sh151 621 0 R -/Sh152 622 0 R -/Sh153 623 0 R -/Sh154 624 0 R -/Sh155 625 0 R -/Sh156 626 0 R -/Sh157 627 0 R -/Sh158 628 0 R -/Sh159 629 0 R -/Sh20 630 0 R -/Sh21 631 0 R -/Sh22 632 0 R -/Sh23 633 0 R -/Sh24 634 0 R -/Sh25 635 0 R -/Sh26 636 0 R -/Sh27 637 0 R -/Sh28 638 0 R -/Sh29 639 0 R -/Sh160 640 0 R -/Sh161 641 0 R -/Sh162 642 0 R -/Sh163 643 0 R -/Sh164 644 0 R -/Sh165 645 0 R -/Sh166 646 0 R -/Sh167 647 0 R -/Sh168 648 0 R -/Sh169 649 0 R -/Sh30 650 0 R -/Sh31 651 0 R -/Sh32 652 0 R -/Sh33 653 0 R -/Sh34 654 0 R -/Sh35 655 0 R -/Sh36 656 0 R -/Sh37 657 0 R -/Sh38 658 0 R -/Sh39 659 0 R -/Sh170 660 0 R -/Sh171 661 0 R -/Sh172 662 0 R -/Sh173 663 0 R -/Sh174 664 0 R -/Sh175 665 0 R -/Sh176 666 0 R -/Sh177 667 0 R -/Sh178 668 0 R -/Sh179 669 0 R -/Sh40 670 0 R -/Sh41 671 0 R -/Sh42 672 0 R -/Sh43 673 0 R -/Sh44 674 0 R -/Sh45 675 0 R -/Sh46 676 0 R -/Sh47 677 0 R -/Sh48 678 0 R -/Sh49 679 0 R -/Sh200 680 0 R -/Sh201 681 0 R -/Sh202 682 0 R -/Sh203 683 0 R -/Sh204 684 0 R -/Sh205 685 0 R -/Sh206 686 0 R -/Sh180 687 0 R -/Sh181 688 0 R -/Sh182 689 0 R -/Sh183 690 0 R -/Sh184 691 0 R -/Sh185 692 0 R -/Sh186 693 0 R -/Sh187 694 0 R -/Sh188 695 0 R -/Sh189 696 0 R -/Sh50 697 0 R -/Sh51 698 0 R -/Sh52 699 0 R -/Sh53 700 0 R -/Sh54 701 0 R -/Sh55 702 0 R -/Sh56 703 0 R -/Sh57 704 0 R -/Sh58 705 0 R -/Sh59 706 0 R -/Sh190 707 0 R -/Sh191 708 0 R -/Sh192 709 0 R -/Sh193 710 0 R -/Sh194 711 0 R -/Sh195 712 0 R -/Sh196 713 0 R -/Sh197 714 0 R -/Sh198 715 0 R -/Sh199 716 0 R -/Sh60 717 0 R -/Sh61 718 0 R -/Sh62 719 0 R -/Sh63 720 0 R -/Sh64 721 0 R -/Sh65 722 0 R -/Sh66 723 0 R -/Sh67 724 0 R -/Sh68 725 0 R -/Sh69 726 0 R -/Sh70 727 0 R -/Sh71 728 0 R -/Sh72 729 0 R -/Sh73 730 0 R -/Sh74 731 0 R -/Sh75 732 0 R -/Sh76 733 0 R -/Sh77 734 0 R -/Sh78 735 0 R -/Sh79 736 0 R -/Sh80 737 0 R -/Sh81 738 0 R -/Sh82 739 0 R -/Sh83 740 0 R -/Sh84 741 0 R -/Sh85 742 0 R -/Sh86 743 0 R -/Sh87 744 0 R -/Sh88 745 0 R -/Sh89 746 0 R -/Sh100 747 0 R -/Sh101 748 0 R -/Sh102 749 0 R -/Sh103 750 0 R -/Sh104 751 0 R -/Sh105 752 0 R -/Sh90 753 0 R -/Sh106 754 0 R -/Sh91 755 0 R -/Sh107 756 0 R -/Sh92 757 0 R -/Sh108 758 0 R -/Sh93 759 0 R -/Sh109 760 0 R -/Sh94 761 0 R -/Sh95 762 0 R -/Sh96 763 0 R -/Sh97 764 0 R -/Sh98 765 0 R -/Sh99 766 0 R -/Sh110 767 0 R -/Sh111 768 0 R -/Sh112 769 0 R -/Sh113 770 0 R -/Sh114 771 0 R -/Sh115 772 0 R -/Sh116 773 0 R -/Sh117 774 0 R -/Sh118 775 0 R -/Sh119 776 0 R -/Sh120 777 0 R -/Sh121 778 0 R -/Sh122 779 0 R -/Sh123 780 0 R -/Sh124 781 0 R -/Sh125 782 0 R -/Sh126 783 0 R -/Sh127 784 0 R -/Sh128 785 0 R -/Sh129 786 0 R -/Sh130 787 0 R -/Sh131 788 0 R -/Sh132 789 0 R -/Sh133 790 0 R -/Sh134 791 0 R -/Sh135 792 0 R -/Sh136 793 0 R -/Sh137 794 0 R -/Sh138 795 0 R -/Sh139 796 0 R -/Sh0 797 0 R -/Sh1 798 0 R -/Sh2 799 0 R -/Sh3 800 0 R -/Sh4 801 0 R -/Sh5 802 0 R -/Sh6 803 0 R -/Sh7 804 0 R -/Sh8 805 0 R -/Sh9 806 0 R -/Sh140 807 0 R -/Sh141 808 0 R -/Sh142 809 0 R -/Sh143 810 0 R -/Sh144 811 0 R -/Sh145 812 0 R -/Sh146 813 0 R -/Sh147 814 0 R -/Sh148 815 0 R -/Sh149 816 0 R -/Sh10 817 0 R -/Sh11 818 0 R -/Sh12 819 0 R -/Sh13 820 0 R -/Sh14 821 0 R -/Sh15 822 0 R ->>/ColorSpace << -/CS0 823 0 R -/CS1 823 0 R ->>/ProcSet [ /PDF /ImageC ] -/Properties << -/MC0 << -/Metadata 824 0 R ->> ->>/ExtGState << -/GS0 825 0 R -/GS1 826 0 R ->>>> -/Length 117748 -/Filter /FlateDecode ->> -stream -xڜۮ$v:NV7@~%d8FDf--5 g/FEfry??.}>~#}̖??Z_w9}RyM#|>~?ӿ??ӯ_ZGmG3QG}#=T|x2gs{7OEԺ>ԞߓgN|g\ITlI-{w_㏒g=',nM[I3y=s?Oj|$}f|zؔ=v򹧆an1䏟?'i~13qx~?94;3<^{Q~XlŽ's'_ݟ1 rHycνegJIo8Vp9αi,/O-6>>x2ʶgפ՞q@c>AP'^D-烽 q_Gٯތ}Js߳_\8>G[_|/ -sMRu>MFFL6T+ٟ(_p@ONpT|e=O7ssrq~m/z~{z7fB&>e^#c3?~vs۫FzuNqtc9۾y/>Iy?t,qgaY?{O{;j7Ks-}+fe؂BluX&Df76<bҮ'{#O=U~>Oj XMH) >yRa -r 9`}os(׸ſ5BnnEWv'14q&/Ԅ33.1t6*/g_o-xɖj.'?v@Ǜ H'܇``eM -II? 䙺@n< .`h&k}|c %c3|?)]d~`d3]D2Oy^9 !O`w|>_ˆ>^=6OO&9an߂Jʚͫ(ՖA=ysse7 nXI /͉{<bYny* so -dj %`r^[oԪj dzPi=i|gx/9Pp3S)uµ|ho{7ԞB1Rba, -gw'f<NBi)_W<хq2z o1:O6?{@6߱_Skvq7½Lϳp/nyk۵o7F.aO!*oAPK&BM -6l$Do' 烽xȔ.E &z}76eL~jCy"[ߔiRE4O>(&z? %[*[R }#(7li,& 'Թ7A!TqZGX=bes'[mǧ"g?M;=)*G}=\)P?:C mE_-0 ]Cϵ'NО~ C -W˞H$373yBe3 j Bt*0|1vTRŎV_0Ϭ*?ciC;&XQAR2ȀX?~2?I%.ˀڧgN.x *m\_(*U=)'-PX !U'bs=WIOi.Խ^ |  |xkY * p8ϵ#umpћ1ڭQ_=oG?TZ?QN@rz=~ 5QjP$cR:3 Ԗ_~v1~qUzbg N$Fhgx & ̆V?EJHb_^7ܐ"E j[b [4s=ǛdfhFf/D-4[5'KBn .Xc]Gf7tao&@=h4U1 O' "lvcMSrۀЖd͠!Ά| :t -x^4iѝ.-q{dKItޘn7\ĘS~`Nz#O>XT=E\ D73lz͐Z|׃*o!CVO~Gb ʦՄ_t#^o+Yh[ ,`{%L8D#:HI>BA;OV{~.Sۖ-h2hSV3X7niyȁK&Dg6#ȴSOOZ)/OarQyO1 h-GO$0n[9dܽn/K4dAo)ϱDߐ%m6`΋9m$ -eނY%0iu PwmS[ԸmesȢ/^~[/:MVpZ2+mn$o;' -[漤;h#I=l(nb> ,UZx>.)@ xq; -/y^YY р_tԟ2C đ怵| -sƯ |"Ol2;^zWTpa 1%c0ĞyO_!PBFl<ʥ0 -:yKVO!3q`_(ݔxY07c|>i?PLOtO~Vh Xcs r.uUedOoN -_sS'`X$gɇE__/cpU d0nDR%xIhEo6p]NZ/|Rܙ=k0{W Rz{}`(߿zLRb һk\+M꽌~3p>âCNGO?2z\vrN9eTcKa 抻ج3AwMW@bGa7[ \/~x[3HT"?qr7q?٘ y"c-3"Ut*k; k8)47.p p-9ˎ‚ 6E^(~C!!b20d1]$' J/$piJ̔ncJs{G\fZŠ<:fDDD!ޒᆶǓga݆7? SV}f۬Ǖ7yBuYKbnk.VC"\Xb2|XU qlo.aO6$_ФkxEAzc1Ej^rMDT1a5ԇ0jDo=VAy{AGe ]/dz x -Wg񔞳c8&^nLVE=1?dƎaˠZt<{poʱZ0(GN^[0w̼O"3 qh^JZ0L[Y 5Xz܇'eNO^c`JP'!{V 67`bZFHƿ 6L𤮏Crؼ}\2y,`NAW>%`Xy=A>241j]FpڶǿhÕk05ր8gcT&Fc:1̷ٟ@J -O1Ӂkobm Œmn1n~bcGN>Q?m@0p.ij˛ B- @P^䁟ҥ1H_9+c~b6Em^Ewyf2"x =dB~:ޔ0 ol߉s kW6U@<{_ Lҽ6(~Dž]kJozVZ8꿯d߿19H=[_EE[!z!T8xv6ۅ=-_?k~? z0$g%+RJD8=U+cor2nz|ZB1\A2x# kKqN@>X3uJŤP0>n a=CGft (Wjϵ][s2GAq?`\ۉ>x o@@/:#yd]hJL̙l/O Y Ka0z+MǺ?F~p;ڽ;ڼLtyQp;3C2a>4Lpކ_kLjغ-ܬ Ģܙ9FcᙣHmDw -yϿ&1<ɶ SeZWb{a`&WtH~ df .YwVZ X[N[8s'C.S>\)'0g/JO" &hjћYl*m7'(5LO~P:-:A5C1%@WnM6i"ԒyT$lY@-L-#F11ک8.fIjjNPLV)rغݘ"n 4F;E"v*`YLmNSx 6&\hFK z?DEne0RIɝI-AO,"H':Em)BgC@79&CCR]F@AB6,r\({ &[$>=d,Svps:lnM&B!SH,PY@&6(c[Y7`(hVg ׇ*+\KNbEbn}1ިֹSXIUd( 1@&onU( Ap&y&g驘IG{'7Ҫ-t_|eSutiXn&sbwQg7VKNoo2\;êPq#,uœ[ý){J>*ay͎` )2%";L wΟ -A)ŽNv .O+`TI9Ыe\d6v$`ʟ+z5G  N0$ݡO`ڹPbB@nt -wO2Lq![F_3 BF䦘pNE3[|f)f7O-![Ҩ`6lᛳwEHoqe2Zp0l˒DkCDE˴ϓ7ḱair}yZ]a -f{|.*8E#)pfT+>xRaY :{;(!)'G2iYŠb]xr}Q9Rg13jDFI-npX`eg<; vJ0Ze;4xt,&µYN| >ŲCp{$ǒi!YK ))f1.>ީ8S,Ԟ^L.b0mc}\D]Kd&.j󒭀R{͋aI}j&QM.p`Z'Ei-UxD4.#U3ԖltY ءVX"6ZAonyv*V;&x0}DI0RL77Yhf(xyQl(&KǷ7g"ٻ6HpRlTJDVTxPaG*MIY37z[4+ֿt4Sʐ˳:D]xç#}#*Twg md ^Ě)ߙ*y$v(>&u;^*voR(5j*?$Ef̔q4Bm\Z7D؁ǰaAqg0|3]`rlI!8`{ۻ^LmD?WtjWg`"fZ}`Ž,Q53&w̲ wȭJh:CPCUJ;&Z)n7fy= g82$x ܭsZIٴOzs9Yd1%ʔDUDprw@9k S\`_g/Hdm8,z$W9}ȶ Y)hݨI  h-I@c&Y.XiH.( 96\d='nl - -e!Oҭ%cb+Ι/Luhrc4J;E*\/XM ".K<8F=2xA"g f bzm&W%*@nwbD\zc-f 25QێMY_N.J0ufkɹ4vLj%]*t!˰D(AM)FC;bJrEq+>- U_tI&wN[K {Yw#u!T$YpW(#K^ >wI8E(6FmMY>rǬ1"wZvL0蝿K}x|:Y, uHt]V3'&X V^Uq-Be|ޢ+1`XjX5~kՏv՝Y_@3֕BxUq2L/ lDS -Ays0+ "<j^pgYn_aLr2 .1#^w}ћ.'A^`no,0g!0deL,JnwWuY.f/XbeAyuzYs 924XT4 ٞ-+P^/J+3K00_% =*M\+&Wy?m] f-c4_v^Hh֓n=Uo:vlC0Rȃh@&Hjd8nQ0'~ớ.pŃ閤HA:DP1lf+RQ\lyYp)B-1e7L[M˛sIsy٬T7 -$k:(ҿ,˦VL &w8PY]P5_O8}=_^FPv,=MOFcOJt9۾Խ,opo ƫX \*YJZ ScǴ-+9i]kۧbF ~gTGz|n6&!e[m]ӀdDS MIL,8С5[M4k&ґ⊆f)F%J'7js T,Ϩ}tccuɆ&[ʙ,"'͔|:0@|>\;Of0=ʒ )|ŕl$#xSֵ%$Aw({,Ҏf s%M6v+`PtəUMxʺ(dwVP5þO;:@@BL!yӦ5_AWZWI ,u֋ĸxI|o"%o*5:n3m6$.YA\DP' J`$#QM\!oΡ $-+ΗKJmDDM^|{U&) -_gbX -:БiTN;wTWpQ*U>I)o~ >lu! F(n6ՉḩXv$q(g_mL6F3,z^ݦ85vso0ޗN;opvO^J7\wP)vFjU;zïsۛ+w]Z"5܇CU{vǿ:vlFj!X c@ߦ vcB:`OWF4%9ru½$@q;CLߴ=JO>$ QmV%,1n6Yuᨧ21$s,:# )(i˦lQP͗1:6w|v z?)'6HH)+)]7i_fpS(IF1 Ɍt<@^lc>D[wSjkA^⣻%F@|7z -.ժ=LkZxL9]dAPn/ f2]V}d΃bQ2C4"KVceDa!B+b^ - -kcS5'9 }x2{M5ڧMKR2 xw. &b } -Fۻ|יі(c<|1} d<'%]٢CnNjC9u3:3}$ \qOG^qmҗD|>dص9j5\~mg/ ;--vkx7åd SG⚍ Ʌd]oPTLN;=(TN,Tw_؝u?T/dḺL]4P!uM 8071˦{L;>D*,u0}=08N0l<[o1)66q=ؖ;Tkax*Փ@k3iw%'UAW:[aO7_GUYJ\M]Zш#NB&6. 4,'Ч.3%8ԢmM9| Θ@8=K x,g^( -cg5t6HsbȢS0.&3Ajͬ3èmI>Gݰ]\teH`9RW -NPM9/eEA~!<c)YIA 4$Hkgf٠T& CshDUeu+jU:p&eŏeX]׬$n'項>6V,$j IQX jB5!w'CoC1g,:U>b0wb,-*t**I8J _`%M!&lm}I(O8l-Z0m' kPnΠQ6M;n޲[$N!+;#wnۜ_ ݠtܲ]7kWuqfڟr-'*^ut&g,.%Y|q3ZOw1Q:G&OyctDr3ϸGHrPHLz* B=6k= ӌHLdn9Dsܠ-Aos,qn C PV=Vl@$"Se֒0X`fCʪU Lj"[Su8Pާo_ys9Ũ)|z$Mwq zjӥ@i)=Lfժmf(K(@" ?ft^]&o~5P7taM_F ?Aaru̒ϥx2. wT$O -$2˛AT<9w6 -}Ёj -}DzqB>#(J-R%YU mu"2BE).wVKm:wcT^cP'`xsw\]De=;;,RroBĿCR?i]<$АE(}j҃"D[?aq #4@M1W8sNSxL+6QJ6 -뢯5@ -G.j -cZͦPBV=W* ;'FY72ݡ#PY㭼~5Sk*y- *A̮zԽCwsN"GGjEC\ZJ"phTYtU+#ji($ɮu?[TVJC]o3cw7J_}<' -#dәp81R#$J~2 J \GJ|Sdk>*j=Xyh%qatgl ;eiHMRbaE&4E*%LcA.XovO %ԝþˍ;}= TvjWk -'j~:TwoiU9rkBŚ -Љ-a,BNo39VU7mU@c.)숒V?pObd^;~g'P%RԣUAcGf2P'5NT>.]`d^.%t!A袋)KDWQFX0Dr2>t5UU*ǞqR_pKO -sBMacjQoz Xr@J#5pd -UԳV= d!Mٲ_s7DV3Z"Z̈́[@kn7Z[ le7Zl'jbeŹpbJϼHV c+Ob]({qcrUT ss2bxHQq`k:̖Tr$*`٭2T&19*wjVh \Z>B01a/t_3}LkPri_(|E;b׆Q)/4|߽'H- ^GnNTJ/?l- ]fB a<C[˳{Ug#H6s ,'$xav5CȃCiX% -o Xq1HxI B"*,K*j>5ڵ8FEM l+C5!dW5U@;kE -QB Uid>\0/Yd Q޺y!|=UZP-qB@k ;VEVWؿ@|l6ZdM -FZs YY +~wr#Ry瞉-r7` El*[MvIƓnFf_ @PN%㤠kwP5$Z Ԇ@!oB+V([+!z7`/8Cwe -{{gc1]m-&xD]9^/Se~ uZ=_,74c]hNti!F4X|$cR&X'.Տd$+dDIpalt.iКU_5L@#pIaY}4;+khREu[إcIEm:}VP;܋P@o -5c.Cڭgj++7 0R-*!`[iķlNL,p6q/w6]6Oe&sU8ӝ78P )B"./ރg;Z^ϪH.vv5FxR-6Fx) Y:妄]DnQzU$^JuhЄL, x#X7 5s/<aN{‹{f}2X? E][xqZ66(4y.x/~WP"Yu}Tn|Ȗ>_4/ia[VF% XRPWSt"\̾pR6RΉ/P]jJy@yRXZjS(u;, t#{ ۡ) µAP*t?etԼ~}ƽkk񧜅&_(ekcBߏw:/"G,A 4A`z)T?j=&0sibz|[E]_ E:Ռ&pĵbWP$]VWL+IJ{VϘZpOu^®SbWZF -alژ5'p/vE'a- a@XJ_CLՋ-_*G|}#1ǘkhBGM"_+ S[ڱa$}0M䑍IEUVWt%*Җ:KN&Sڭ ͇G*u3fynb0h(|Qڡd_YQVI#'$"[U \VP!]Y}Xth/<}O|xoTO9 `yۂ[p_ށ4='uknm7SYwdTF6Ba܀0v 3HWUv0`EUa#`Ce8˔V΢SVjk58lָIezϧY"?CV -a-U7M ,IrB_F ztF0ŠU0s Wm΂sZ4!?O&x ˧ l}H Ieep -cT0 0vwC:S%&l ꉱ^&Ʀzaz$2 -9n6ix#OꆓqbHaL*kuM# A0%RQcJW)MK"!6yiVH*BD?crcJx=!FCՑ!B[ߏwY/K9أ b >&`h3N Jb n`-GO]TC~ -VϫAUK1SA!\\²e'De!l#3J*D 13N86'A:Kca>QvÊ~02]e x -²XcY{e F|߽b&[@rb#}h: i=;s!lH쮀:Gb{'Wce?@Xc ]Hu촓BNѕutoyxz1J?zSA+ɊTөvx.@ג7Na ԡ.쨞r`Gד^AD2%JUa^z};dteÿ'kf 8P --T†M̄=}ŧH\X+B -R[G6p~Cw׽{U~biQM]p}n$hthaMe>@"(]^ll)/PejՓMXdc*OMPs*U.ZLJO@Yer;T!@Й"[HV݄EW!XQ -FUissݳ@ ֦m"ڌB@;z+fY1Y}wWn5gj8N[E|Q |uӢ*|5 -*%b]aBkrxT#$_i Za  W e<|!@R[TC%D"B7=J%.ϸuP"{E@E/{jRq˱J!,`%CB|1u+*Wq}qË{40RVMkdRͽ˹T%aüšE9T`jgIp;=P4 WW.0O)(JgUm+:G*Wox/;/ş ^ADfԎVi]t݇aYf##€|c.5'ֺ԰!H al<kZrG75.$]!X:S$8Ğ -jxIt^O GlxIԹX?w/z?l«O5_ynRz,P+d%vXAH>,}/EgJnY1آOPt1*-55$V"ɐrB(x ejuP{`aRWW%_w麭]V+V,1 V?~կEߪ.+d9,b#$+8d] .Ma V蜟YC- F}tVĴR |߾'t=P;A W+~exz'P.k[^>%:Xش 瞨EAXㅔ1BrK2]q FPNڋX1Ċdwa0T[FՃ&Ċd^v/ƂWF܍Z,\scr^x=TzITӄڎ3l1A=Z* =2D%c-K=, +߶ 1R-: -1#`5Vk{NgnH&}*%1c0yȊT` E't:61DV? `LV##1:V=.Ub,찘 yW:;к3$o)Үӣ7l "ܒU(`zRi`4#V1 0Ul8Wȼ\CY}X2:WRh6DFt0`VbbWΏ{"{`>_B_[Pp^~әW޲aofK_͑' ٳtoFdC]*QL LQP\5tuőp`DSu*ꖻǑJ}˜vd& 1FG9!QzxJ@30V18W`U̸UL'f* ջ}^jRp,Xs^5uUEA z߳`~wuX8',ŖnsyIX"lV-dv5[ j0yCܱU;߷ \ׂ/"?'FAݒ}<" K|/Hb\^M -ebE B#>DXסe6zҽ9[5W9!j,HUʙAƷ``USgp2'ĸɵ!B;I -QcBp:,k8S!c`4%Bv큀 (͞_W'?yO C!CjV`}x6xm1KR^`C\ʝ`BV]f'"b(5VoRI.K4P"LNV-=<#L.EEFz^wK_) \B%V}If:Ol+e-9j3xM&B7FUԪq{W ءZ Z!b\ o/1=qU/ʈW\A^熛痿N%515ZbK/U 4撂mvK(|B5j-0 YOy%~y F{P-bGw*rv$cr^M#Mo#謌7Mm4`'J5`X"r}_UvdIjXYYB F M/>T|FSv 0R=00T~G6V&AY9\LF Շg<5RST@>L)a19+fKtNPx~Kbj<1!.?!)<'w1VmwLBL I9gaq!lY8! ^"?lj嶜 -'@2} -ݐhTu;&òycU`7GpBf%(q Y9Yۭ|ۺxr-?1 -ᅟ[!!;ASZUqOh`bwM}M.Bʣ_LEU7F( p;<`]PG5|HLGdzŨU ]]x6@c789y9ȱTQEk_Lk> ݚb ډQ*f6Td~2AVTEY~L[$XxW^ -^ş|߻'Hw`(xwM:V,:V?鬭;/ n|/M) (QKIKimP>f~@X+ّʰĮ*UtBs;Ud9>G~JoB^~A˞i : VcxT"իYXX>RrSa=5. IЊOlRbFam& [Q b`ex{O~P;N^b -XCO;ݔGf;87k)"SRe!7`E~GׅlaYdu)a)"| U;m&KcIvDIa 0$^׫8&>JF,qZck1r̺AcCU:3_ke\[3[9ӒjM< -4ԯaH$D   y+5qnv;]Xr m[(W |) -Z ł7@|QKPd$ ]钑#ic5Ǒ,% W!CTFC8b`-$ŒI4s"F{ fĐ -#R -{uϗd$ѥlH\# -`QEEk?!wW5B{L&򎫀%Ee]d"ult~/Uel$>Rt!xIōpQ\UhF>]Iԉ6<}!9,KW G$*]pePPJK X85NpzlV]Ǽ.ëg (j2˺btR*W -c{bcP9ۉ^wU` ):+^~YEMdԦv]_` ZڙeI6͚t(ɫEeUy0e㚈Ɨ"rF1t xu&8s@\ɼ\XԬc, ۡKbA;z$tfțDnU6K\I5,EQBT5sw$쬃,W 8e"[ V T^NHeVw3zjĸ`2; kje0ӱ -Q!RrOUWhZS{<=Nvj -=U z^+q`ldže ׀VZԖ0HBzZx^b[;Z6A+؋,gP&lKrqram>\.ҩ:FyHy8Uèq|߼'Hw2_~ur|V@R>CTLJ`"+bw/1;NceYɰXrnYR0WX#T0 ,.%1jd+[B; k :%R@$51]Ļo1:ڧ J*cIU5htQ*^x߹'HpنG=DBX18Ͽ^f:j_D/4ajaBPI, t) u "w^'IEvs^R*D&ʟjTB u<8!hͪh FhLТEX|&:7Ļk9j!@T 4pZ/"{P?a9պB;gi%ޕ2eߞ -[X-`6BMi,#?By/cVJe /pU"0qҒV}Fpk=3uUi7lи`-+e0X2bW5'9%\/U#Jٖ1ΧySJ,ۢ}$eK)TEwb<k f<7u-he*S: -8Ώ]{{GTw#l$Ft6|'?Bŷ9t `|ŷO: Y5+(d1(ҕ[qxxfZ@sOrqU?W`%0@؃Z3BGIŽŽ V4個A0@pgwK>Z:UPɠ{"&5[j֌8̪'M/XI=/UĔyi* kO5LSs#ށ@"GvPSTߏw:cz{V-|w}ֽ=S~,،0B@ȉZFKu$_DMv=HhRW5a:1WH*הcn4[(z7կD9dOLj)0TCs HXs=pUX.I_|!: +/X[ 19zʏ{L21Acu| -^o?~ +[gj/j@[#5;b0Dp ` 2IWo`rn)ػ]aWjv$ΘRc @$Z7i]ؔt>!֥N%Vy11G%͌vTȚ)iٷ!&ubvt6ȋ좪nP A}u7L7!Y}'d?#+3; -r`׏/0X[06AcabM]*G}YHvn eP^bKF+,NG-9Bw@XaURV3";kMiX^ `aƪOv`*ᅝϩ-)z&`"e?ҁߋ- $kVAu.*@E6&8u}r2>.ω,߼#k=4;]uv3EcAgRxNE/gn.l*LĖru>Ҹ|ksE͋d`k&c+aLA ϔ6|uZT 3YfB5'(VNJ[w5c+-ĺ1U*@:,E}3u=$%^{қQZJxB}LO'w7RvG \HG $X߳ RɣLC@c+DzDBp@K86i_&'P#<]ŪWT5Y+EOnz439X'~3]*LL/ɫJF)v:Wh_C)/21_iÐ(1\\`Ru-w /'Wc/S`5QG)R[ NlMz=vg9+b, ->vv_Y-eB,DZyICڽ|єė:u$_K+luVY %xQ#̪wO_{^3߱XHvJW8Ҿ69,Thac݋3f}C'E?wb+_{B5!ַ*P{|[dV4|C`/ Sdrw=UѺ~Uvt'ybE{c.D0kmblޜ -%Ɔ0 b,\Aa^$ 9axR$p",GBX ǖe>re _釰dwuQ[fS ॅˌhb4~cx߹'HW&ES۳[ !sdCHX9?0o}hOݾi<P>5!a@,fɞt}v׫EI~Z!Ԓ}qK^m&Va92V llU=E6}$o'l߻ƙ*ц'(\kl X3, neNp"j7:EFF(#Spol"؝"WY,14.XwCy/ޙ2^1X 5 pTP!Z<'(Ө*V舘q5.:nƼwooxv6[wHMz&W0J~q>gq:(jԨכ5l%rFFQvjw8lTQl[*+2[ݹCQr6J[#ɠ/:мVAƵ lc̪qix׎=& &0mОM{js"^ q]unyZ*j#{KPE'B ~)U ҩ6>6G}d7% Z W?d/zU P1{El%͂vb/]QN(Je/$p6N&YC};%pfuW'4${5/$^KHb1Gt5cneIP Z) =_ssLŋn(]i4%%|3 'ZNzv1=um7yjvFC -':Z]"PvO. sPk\Cv "=—U|=@ AKe2hVR5qʕ /4wk}` .uph-N6sFnx/Sg6!˝.HKUed-ICd [ -xmP1`Í+3:Rk2hێtIX?h;Y6/aZ6`]}QOp}G< EWVVtDlUɌty\_sF,u;5]a%ڄe %h`ꨉz>_pt(V 0 -t`t;vXGK@zMnW64*]qԥrQPojb!e"iKSI0Y`ȷbh2"hœ|ns1>RgBx.XJؒ Iؓ>!\uO $Lm,qDnMi!1gma6o 'F |q !֖QHTbl)S !PkD yh'djeOd,Ky܃`Iqzٷ Lm _?Y':sU60|`;WĺnzVWyB2V:ė5bqtZC!+a|vt] -'k|>.!Įuɓ/!5]V8X-nՅ0Nx,`LDR2Γ3$j6ABNj4U  ,+"LZB /lb#c]R,4`&錬޶;Ό߇"v$c;]:8;H⹃0'0 ~k">:|+FGD'AaBg _N T &?v4D,]-|T0ix-Ea 7v`n|<oUk2iBkl -StvU{ O2e㣁Uhrr톗: &:Rab^7Gg -T ?v6/zqAt Z5NHӑtC3~;\ӭuާʓ/uD%b@UNZNQΎ5V8F{SዢY<%>vT> -5慫ΐJdӾʴU六TxqRK~z9i˴dq67rna^yh%sep~mѠzա9# jE2cq/de-lR5+z9 2 d؋XuaߪHZT ·F"а A*z@4 NuY]ۗŶėӏ植kž2.xP,+?˲PxU~|qC<%)4l~c-േ[{5V}Gse3)^.TyۆCѲnQ2uv/Kqmxa8b_33'Xaˆݛ$ -ߥ_ȴl]߷R޿bFYs~gMMMK=מæ%:_Ivb&{2lwuK22Yᓶ!u:R~]E4g -]7s +2Pn0Ls^9pdNx_9)O]TInO]-iq ֊Z KPƜY iݳ`5l U6kja'drx 2+Kːӗ֛'8A=L ʺV5O\"o79+pPchaq610O?bW@,8NYbSt5{*6`>uwģ`ڛ4!"UALsp?ʈ - b:Nc? SxiiL}mEY DXɜ,'ܞQyI ^cZE!e尋}e"lhCWYlz+kLW+2AkE34rئpR2<Ďc2z6Cs'Zj/C'>Y -LfF蜟uII^;?h\gMJ_Х<1 t:3U;;CtH xoۧndY][jX 1>uSBz Dq uA]4׳?sϐ3őǂQe &F2 -73l ^f-޽!dQ ֏;A0 f7r[\г,`v$O|E\c"r:MӴq vO0qZUaS_^! Y-v$V#L;yD˒d/` ,P%'s ; L$84RМӕ39nV>hYla֗Ϻ$p ^AZx-@?Hʉ#D <#Qa)KUכ肃A~i)Eq"+!9! -7qCW eol !+V kPtcOaRd} ,` UE@$f!̧'Asa9 =K _ '4w`HsVh7=;!W8XqY>KK<0- @|yXdƘ:(Ɔ nU^+F_#yĄ-I5 A"GJhLtJ4d|/TT\Aa -P #wQQ,3;WXSb&A%jVa/ZpU1Nw3R'7'Xi kNCnM yjd,qDĕ١U{eؠMy'J:~YO /#=K>օ%13cwliΓ?*k"64-/BV,iYG}*1lv(y",5dVVԔ 7Ćb`piOaC0ĆXլiV Kp1bU10QDfE8'sv ,MT1+q(H<;qYW Gb+[D1 -6[Dn3xK!{S߉1/+!򁱁Fm\S9??Wv!j`x(Z2† NTWSLexjsf$g`aZgZ>4=`x_IGalb}1 -&9*(!bmV>w,!\"5|ȵtA -Q<90U٢Q#댴*⎡k+W3 -Ct4#>뒒]ɐ JLx/"+ ٕ}dy{^ca?W\+c0s"jk|AW"*ۺ/a߯C@K,`'=NP[c #fYKGCJou=, "rI U`_"?hfմu5ZYUVf{ǜWk{tn-Qoq×EJ-aQُ݉,gMdx||;u-D#"'oh{~AVOM#bkgahWKwc0.2pJ꒥?mE\JOg&6[;նB_hOleEv|wߎDaZs{VWxb#hWWս\Sڶ>zrAC"yRMm(<Ѻ~U\.؊h룽^k*Ყ+ZwKvX#q$bZ¾x@؃t.F 23_ -ճloJfFВp8&tcx$V1fM;] 6 Þ~vG0̇kcX6奉HQ#!]nMM%BH΀|4Gc x0cUXPKɡϻg~<-'.M z|\R q_ VU L6tWf1;{I -(z@YEVdڷ\Pܳ -gWV'ԹN-I~lh*9 -i˳bE'dazeRW:0B(=H ;ƚ5~3T+b, -1o)ƊF% I'ٟJ =MCql>wB?Ah}t4,]'+]6j |\Q+&_{:rJ_0X>&cS=z5jѦmo/hX@Il(c. urJaMV ㈫fqÍPt7Y|RKJ1j/"o=iKFF&L]r/ŽgOdj4-9ՓwlS,kCsꢄ,A65avEMMOFњy>`^ ʈ;.ƆmC}'Z/ T{sV ^S/K4. -pHs { uуs XxpE f͂Ofb: !<|[} \^8fsS$$Iujٗdtm"s؛^4%90YDK­Iw!t7I 8Clué>lZj؛a}'rG%6Su0=LtcE/>0K:+:^YU78͠evSu]9c)'[B~*Ј=iۋ}9 JM[UV^IˆZw{8 aȉԛܚ>T* mGeФUٓ c ?4kBT ̟`Dr&*:(&& (O|tZ%JiK'|M+`XN%@@@?׿azC\G -=!_{W -&w\ "ǿacޒqTd:܏%K$=?W/_o+0 <3F=_.C*" C !6G5rq@ul_^ L=KV(%GdVDbG>5I0[8#o)B[:Ξx7e]ZH?Y6C` mMEYzŸ n_h\9UvԷXzJ0;7 F.B={I\XmI8ӂϧ~^|,e>hW=!9xBw`!5B!w=6q!,< -= -K|&%&Bn\?B0,x,Ů@$(gd&e] K|%1S-eX(Q-An*Wl@-I &UN%L6"U[LJxQ;&HxiOt(DM%~wq,~i(.Pl$M(.møC2HLn@#15!rH饴4/Yc ^iLpX?Y$n F$KJXn-s9w,,!*56LKBJuu_ʧFGa&uw]/LvAI@GhXC -Ura%^!?E{=fĂ2| O+_!qS_MJƻl҆6DH4CqD3;ȃ"wO}5kvXU% +(Б:Y ȡIܴJN_'>x8MSUV , -RX2M,G)ϯCie,aR,W!mCh7)شtN<,!OHiv;;$nı=QþRl<l -| ,@b)ŵx=q"!%,n6|7cgI-։Dps7ϡ5B!,/,Dz;/b7 -ܵ}ؐ9o/I;c,[aZR M5Iay^z4yYXh~x - lt'p.C#+K_$$Qop.sG#RǮaiBWn#qa;W>PEM )>b OScP5!E؆swh 0%n~1,;'^JnJJX$[ EA %q3@iy$iHE!"ӡ4%i\4V1, o1 - nullxڐB I)/)/x?\O>nסcX!o;oдT۽BH^Wvpù7biiOoIPBv6[_%ZK~kQ%-2;48] \+U7Nye&,qίX ->)HuJlw|\!_*P3'Jܵp5Msj.i]a[頩Ob'1 ?qjؘl{'}v|^-%%SZ7V#ihZӴԬW^qvv_Q< lO -0xb;Jt"))?BX^Z!`O*Xj2KIHڤW::5ҦfqGB6C.Y=qC` -~ޅ`]Co6׍gYz,;`Kl8u2E -Biڱjb9NU =4,;Y-pkGR'OzNTmQ5"0#:fuэ#NJ+W$@1,1MKjH ]-=B^y)!ne]ju oS( Hve5ĝ?2X\ڕѻ~Wź@AHkFeh T -<-I?{6ֲյؕ%Oo-k;36;TzʬAxaiVW;Y6J=ދ XkiGj[5< GDam>UY3H/ov3[ -`9iLj&oH3]ŗ30얞4f/$]DU#'ChdM - D95?wvO)$p5 $r7AoN+mxY 'mq#_%vhk;TYm:N=Sl#`O;ޥu5q#-tK4X@ȭJt l.aJ^qT6Z(x1%q1,1聜X|KWmgђ?I+gE#8~X*Zߧ9By>.ijU[Q2Ljy: -O#^[ - ~W_wk˘vt8fܡ@wqmM%.%0-ُUYD7!,AyOh[2I,xG9UA[WJfev{wy9m7:e~syv>J_a'E뷳E*5`M+ߔ.kci2v4;刁MIeF `q+\dћ[K)W\}.K@KʍiVMajWڟkUdan?] KܳU~$ᅘ%䚂Nf: =&=,o-5 $]뼣qm98[؎ciijyR0 <>#"ix14*M^:qߖ_j{b8wPv$76O!,fE{]2tANN6k>(W,Pxp=ūO;,58]u5c۽F#k2XZ5&SRمC$ĵ< U_nGH[we;_T뾡ےifKaAzǑB`g,5p,7 -o~X8g:\m ̈́|5IX@~= -3w|?|y`"LPK+WYY yCg -m'RH<"'kC3I!)7L˛ƭo=,~R>ƛée-:$6Uݨ6қjqzOq2X\)vPah`Y^"*i%5@j6AN2e'eqX#i;i:ۼ'<(k&dM$<{{UGN5Ded%|pD>ǹi yY/:Pz`$=wlϻ$>Csd&ߪhF.q;;~Q臬&:W9F߫2_Hޟ阷¦Ogpu>y:EB >e34e읆 V[3EYp"ENv2'ݼWig@;aɜI.fj\}p0wuUJ<0I7c֯C2jdbdZBXNyg@G^ .g6G4v=,Xm]ͼI6khgW2+k-wŔM --dG\L7LqasNEZ j>M ;߽9E()6f{;n 6ucI\Y9&w_LژV|| Cz# ȍj -L>_=l5j6;J+)zZhU!ؒA)zQ?mp>9Y$\HU%8H<&vj?`0Tty[k,*^2dIT+E89DUMg)Z2:h)DV04[o};-U]k bСW_H,W-r*x0pi@ILS6w X.\]. -ؘaF)_cM sU;L̖w pj\cUum;,,@& UCe+aZ6C:Ǩ D90`5t49) Lg+G~QXrY[Rmv*9\ h.5?#KAݎh&V#ZC2utBVo !,n&d[I0.=E2# Uy_oEJQa楳_4׮vSQ ][ ?CceW[9.5] l P" e8w1l`\~w/qߨE-_7Oodp${~ݝzl>bdW%ǥzYd*N-3z?9"Vir3֯;v⹈\~MhN28ώ̀~S'SUzx=N]oF}\oz\:9'= 95뽬ʶ5bfaAnO {<lG}V'FTI2C艝}`ߡ)cqك;ߦ-ZP WXo wڈ.;Ja%kwU,hU'~3WuE$& -@<d,m9h{]o|u\ꂘl_v౯y.k7Ρ͚>d|-7N|[os\mp/Q"ǿQ!W!;݆e]JDNx}5loD1س<ڢωW d'cqZi4VG77ISmjla# _Xr+4 u# =|Wodۊb(4sBOJfM~xR3!=Cuƍ$}6+nTiMzqW#y%6ښjH۸ԅeM$Wf[PGg)[w>!@M[}{%<31oO rEY;p.GVsRGmzL?cE0q+{ϱ/)N - Vߖc9ͽxljt/;sV[ .(56:r[]fBcXL6r{#]ۢ~!.p {W90O⫝V/ -H"cRbA0rle,d\܈Ӫ94}~36*Qn ks;:+{&uE/ձѸ f=іCg3> n#*PkDb a~c R{iu{ǧr~JRu]ViüXo_\> -nP"A'*cSգ!,9,hl|]o]\Cէ xb;5aw\aËΥG^#)uQrh2:ݘۡ=dQ o)vDעgqG3q.~V {)N,P~qݑܸb݁T{-b𘽕'QUcIe'ā"E{<,n8r-kv6j+D`~=:wXv^دljcSG3mdKHnv9-OK:զ6m2~ -/?gaz吝?3kY5[Fˎ؛?kZ_Q,Ԍo|` '7#,]98hXZ_hl꼩Xhi p#=@* 7tcŏG9"ܞ:Etn+^Zga)/nўk?l#p(ݏIDCm_W5|KYeSm(IǪ~Jo`mfz7Z"iNCxmCrΏ;磏sA_ڶ@Q(/'w{LNPv. %Zf6U=6}G 6(C@Ɂ\r`~l^oWh酆o=؃XPan2pci@r颶U5G뮼U/\67QkGs*Y.CCCG,8??WH})b'"vo|Q ja;Ho1kx|68B}1z!}R HH@|X -Bf&u;R{!< ߾N(fZ{˳sd{$ۓyg,KC3*L*lOᯡqBxf2q"vo~QSHP>zB}@1I+mX{j:ޞsk/YZ{eP{kfۦfq9#=kAZReY \N  \`hapN RBP!1>TX.usf].q Ux=4>NyCgBH*̼ LV,j;vo%m|WWDy=%qq=7t?&є%a LCImu8WfgMɲ%9-Gdv4jXhNR@ׁP`\ -άL:%T`uFҥа*1n X+{$W -tdIcm1l.!My{*窛,qh1^.BH&wj-힓|[Sޔ.C2twY[ Gw9} ,Ohx <1 TEuK}!]yjNnq ԇxRӤP^ޝoQ{/j6|k> -*^+gwerh2jSw]|>.Jf׮5$Xǹp~~& Y{"<+ʫ^Rعv@1Y6tjq݌Sh΢C?w@s7M 5inQmz9"b֜޳2hnW Mxb1Ş*f>1 ϳA9{,c{m呚E4W;/XyIM;ͱ[L7X`uW1ɡ Q3 ggr1GhTM63'2 oT޴a -|<<7qXZoo].1@Y"^hTcXW*N@ -2Sfʻp!tau(/'PbqGtZy?o\'S{ԪjC{2X:dVԪ aho53 8_̣=KgYΗk;,]~A?܊/|\B].] e_Ǯ+#gDo-诳T_ t-4!=@K!󈳏&]Q{(Jh"7r$OC]e.1ԇXu^㎄cjuP/R\NQ6K4 C{;ioljoL:lʹãpK啳A)XcF)L E, B::Gw1R}@ƣBM׉6~OVu.@_unqqUHr0,6*YlvшT8M ?8.\ 9CD+a%ﲱ[_aR_~nF)Z\±vPGBE{.f@v׃뎦5PJ#XCU?ytѠA=p)؉%i U0k`NQ:(kC{-6&̒¬8._t'R4x6lTUND7J8W,p-d-Mg|䦋uI#/{guٗ4DS ʝ~S.2m͑kWAβIMinrEZh?>zk3A4Q 譤/zc{UzKtWxS~R\huOǝݷ M:]Vli./0~/VX-.r75v7g ^uZ -8EC+<@KU!X,Y'] Ĺ]1vw*S{xE/6c5uȦ09~ޞͩ95ݟXj>/4*^2_>HЖ?C-/AeȽ.z'l})yX7C -$÷W1-R:`SQٽQ:ORt7=@)PL`ꞌ\R=T(̅"Ij'hY/j ]hURz+NЖg^,[$Xt1s;,>I]ǧl1X!Ws 7+[O9?Un -ǭ*zj8k2շcyQՎQ΢x#ԬNy8 -)ā'575eI]He|>.}fA [`ApU)I,Fm=(|;&Y̶@'A6[A뎸Dd9ATdui@SZI9t{.Vu!=lN'gs*Ya8tm{hMB%b&i0Yڿhp95647{^,DRDqBGsbV%olH3`+bo ~ZpY{x74k/r~)=S`ʫAi%)lLXǏ?}saKpw =/ӮlNQ>KÚcP^+͌!;Z +XNrt͵Dܑd.Cgɀ)]vBS5}1'q'$Vߚ+;Mck]c'coqy>-\ґ̚qƒyV¨Ƌ8PMs*P8CNf_kKG 9>P뒢+]s5]T mn-OJ&+tIԃ? G$b3kX.hz({Wmǚ0a!! tyO*>Y'[}Ц]-moNumMa 5ѴkU>:vT VB0̹x($D˸x]GpɜxM?txhs= -V.qAA;A~`Vw G,$= S?E#; *Nj ո.}v)r3I*ZJ-& XHEbOQ}]PYMG9IBѠ4MM "qȄ)ϺD ^R_a=OZh`cBEPVHl -:}}cg&485 TkhpBGqW[hm< -5PV QlSdsK{{:)!^&fZ>c\q -h>/*9YB,$8= x=ЬxjBQ[l5:סjG_{,nnRfֲ>ő`b,B`hBU;̩H(:U^-PY{`k5ѽR}Q~U~#&e#6?[ g}1l, uo/e,#+R{RBFcI*I׹Ai1F=_Hdiw>G w?KkN2{+ |>..OvoEygf1Ps'mTQѦrVYײՇ2+wѱN`QahOʓMj;ouT[p_w>SҸT:ۇjY5p@}|>.-:m ]m z<.i{֓bQLw :bNפ?&J綫R**g4fFpX-w] -[Цl71~̩>ga,Pߵ9]a^k:Ϻda84՗3]JՈ!l rIKV W>~{@n.g}Q'un-`]mSN)bz3Au~JGZϦUI ,.~ˣ;KgalCwh7zS}WlY$Dˈk/*uѝ2L 嵦J6IebOɪXj},KB]\st>fKUzH X⸩xM`ZcA] o),OEt\ D95H -OCޙe4)]^q8V(}F__9~ CZ.]GpvcN;c__ssގ64AFR9nCTmp9#h4T >|}(gDPRg%ɜڣ|f+g'CoC:ֆꈣ/>Ү|h"N H NIR{#{>+,5.o{qh) -ta޶(2A#RR&}Qu >歉;U߃6L⎧r+.D pHdQ{]cR;?뒌0 ȧuu,?|pLz͉OH|o֭c^gQ{ɒ[YM&(l -BC5]B}ǧtгkfpQh پD9o(*}9#Lky#Y0Y.-U14-8^V6wl.̝?wNw8kmٟ[`cd军 so8,V%BƱX֤!#0u)pG ^G֐è-T 8n'kn߇ zwRbLc/kA|]cxHbΈd&mu.y{Ȭ8%9uzL 4nLӦowh?yH&eZ{2;b}z`GYl>twg_ y 6{@{d^~H_G* c[};+&:(剼4K{qMtua r-PgXs78S}XĤFl{HKHgIB^DDq̩S{TQI4ixlʻ_%jY;7(oOjB.Ṩ*Y:[jKڢUѤn}$I} cƱ7TxdBVWX1ɴqL.D]~WIҐYڧFyh -XkQuuĹ zpiq4x}r.kԗhp' sPwAVڎ~7swĪ14Ytxu"UQˣA{3FvCӬIijzq㜮 % -M;̩洳zi/k@bv|<.p܄NT^ZyQG4ߢ%VW֚/Ǡ0ǡ)| o90?z|u ‡ni&E~eׄa_%mMlMod9BL -Ͽ=S{Ҡ(Ry΁T^Q-V@??P{e klzk/ګf4G9cpMR6ڵzyջD93S# 8݋Xf'qCftdc3MB| -QP1֨@vG(ZL -쟡2lc.px\@樭Ťڋf"@ -dp<ЖvJ'Ěe8ԃ>,:3[6[tsE|_YMf Y߰`Ӡ{N<Nۭ?S}Q9ՏBlye6{>S2Ѩ}<<ܓD. ˣI+ U-XL UW '?SLyf2|(/&$+ ?> ܉; -.D\1iJK8x^5eQɉIU/*ji -[!+lEWa׏N?67mR[}N7WKiQ}1刧jJ2VݢGYpOP>a@g8x-@gǝ-TU^.1=1w.ˢހ?r|V4kiNPVmn8!I6 `4xYUFtP A2ܖ \NGa$Gg8,=oW{)XCkR;Hk?AI^ZhPa^z.2}QH_}EXVIM[ _0ˠ47зc&+*",I6= *hLƌd -*1K 6an;d>Xno PcJ"bCcCc4f-C'1"CƠ.c-n z-??f:pf_C0uKR_a4$iUpSF-KpLV"䅿} ?>5f}*3vP,FgjLȱ#F=[6QP16fk!TӸJǠ1,h -CcUۑƟ1dx:#2s1_[eF׫'RQ'`&3{M95܍.v$⾬VBjDBD21R֣Q_,""[;7_#k&|>uoyFÐO&{/5f[aa@}0d/mZ_sMR 6|$՞ES -:ꋈ׈"dE{,TiuҖkP0' D߿h kN1IbUeZXe9>8m q&%'L첫,ݺ -_,Y>_,d-V{=֖{&3P. 7*E)7NYɇP:zMu5a(m `Y15B(ߥ3 ",QYkr`X1DSҕ{]!$ t_tyӈY3n+= z_\hfV+%WB"g,m)x x˙,1+CUHX[%}a^%w}˹Sjf}"^.S,,g^Jո5o_И<~x|ݒE׿5:^-̈́|ޥ39J~~n܏Cettq*3y@+%3۾l>vi ?3,Xhb"T) dR$U+L,160_9c -S;FmòG%u Kq+ ߧ)Hy?Kd˝lR_"!ӿ5(Jk]'0l,̀ -IMC1&REgSu nJ!h: -(R0nMAT^to( /<2ґf;Y< δs lTRL!OpIf[|ΰ. (z£\[gF=/°ƼDKKإq j8# O-:T;uƸ!jL 1MjY P#aL j{k|tJmᢌNxoSmO51햘TFkҖ&I -B&uR[ĥG`O(K)bΛe@vr6*^L*NtSF+RT߰}{AgDUD(п SwaMQXimQ^id"!h -;Q5}2t 3BT‚/ĭ-|N[/tkJDFAz__CCd$#pI]3u):֬֗%w$F<&+F"i:j7T+>BHp_eoeF/`a?]fhc($eSiiBYca.T&&:uVԄP=:vF]{gg|ӈӥ\[eFRʴdFm\@R+YkTͅ^Py4~Q̓] ]pSxf#A ,4irLq`USQqSjլ_TP"D[iSq ^3h֘*5ưRmYcj*CK e%"tr.R;*̹O*c Hy2DbQ$50ދq _*;VR{B-w6/CCL2MkHP/ZCcdd^A{ -N]yDY6Lk[M,~U.=W'w4,L:vk\DbT #0j+QάЙl fO !U *3E}ZgX .~>0akE kc9nθ{M (MGېii -￯!&4qܚsG,EA0ەm'I`̘afN$]' S2:gdkAHVFgWtrp'ty =*ΰ:Ӭ3VB (w#ϣw/((& -y=6]P60Y -SFT!NE!}8B?p^}БehB}9G$jl+zE_v̲b=h}Z_TKyfF~gֵj|]el~bzlpc_v!H]-{NVg0b%7hcե՜U<#Mx~KQe=Bx;|@&\2—4RLN_C+{;8)WUGs9&:Fv!;[[FZN[Ifܙ.n^pY\\շh <uq DcS,"Ci] VbuSLs9]O[WRe\26"0أs%nu -J .̗9-j!:GRb_El0iA[ֺs f+KA}-qGČaL7"?S4:T9Dlſk~))`Lj]Y֕xw!<XshvkX?R拉b\t/gDvb[wM: e -k$qRnG,䘤U rjuu֑r -L(1xQAe܏AT+3ni7nBB嬺Ts~`Lf@媩9bR36UdW \)dǘ$MZ ttZh Yڲ5"38|%TH^Oணj`!d.ziJ\+NKW/†+f鷵 ЖlBsgrqxqT/ϩjrjPY[\BPNDOQk}6y|^pz [ڒW!8jK,QYüT٧<ʲU SZ<.U_5FdSC[*xO| lD-RtU3_0 Ka/ -nPCܳ#2'۬u3qס1#"Ga[vSME"Id̀O/RUvE8z0)B>\9òuڲy,Ub./) +cQ3>%zpfZ[QTqoRO~B"iNpN} 2RTf'`&jR#TE]C|ВvEW 4*VCIP -!vОgg'pEIZ.u'eZYD'A#{e17ɞ'&2,ICQڢR%?֗mݩ01a)kɼn2(߳Fs1laz[cznx;m(eBDTx6MGQĢh2a\n7L͐E}n0nGPg.vTjh:p("RL e6L %&`ևtЙ)3'¬|ukc[}.h_b4ʴ*K艿n`YPi^j8zuf3-uFh,3j_3Qe03@`>>a:èXkjfc.UvpN,aplw8BT@ -Y׷3-4gҴPB$" Ci(TUKL֙]B,!rGC=l6qL#A_<םi325,bS~FPcNXz_TcV6N9u,4ވ_͊ףdLSt{p2edp`)CD1PnwUc<#25fɋjBaFD]VlPNl0 -3ld"2mmSW9FUci$(}N.v˩Mx;kqKC^2&FJ0P^Za&y KMӼ1m$teIn>jIe?> TD;zm8M=܄{RzeXY++1_2;VY+yXWvʐOta)j*O$ɋUlݷ6]T)r+8nMt0 =kq -ߧĔLUivJCj{1>KQGn>J˒bV鋚춰#@e!J,wfup:9YkQXk YY(L5 fq>Ka Tӕu:Gh̴ƘgTi ȡ1=RFQa/9sJ3DZ;jS0,?YK,!bM ;aq˛k5]-A Ӥ&yLU^_C؆A[2mǷ%kf)RTof#\\{\Fèv S`C-$YN9R50.1nձR3U[-}^͵/=d`ݗS/?1>6/D #`HݺJ`C@ܙ`攔*ٽ -?*y!ԗcD.ne_$hk1HLSo({'-z]#- -LrebOҘbiqkG)i< -v(L \B~qJAИn: -\ucTK 4nQ7 E ӨR34Kejt\q ߨ.LX FXˈ^Sf-Hc8wQ ĥ/{I,`tN%Iz9bXG JXmURn\|uBbpQMTICFs J;Bg8p7glFPn ق3B.`4߼9f0k5nTGU -9~LJ/6Kg^&7frδ_tY&]}ƭ<K_"񻺥e`>L5wLwq=:t9|K T81PLCepe{Mۙ*L_4G3]YGx#zX6B tpi|8(A8,u%݋_ljvgJ:Z x*XNe/BT$F^n*MHұOm:7``p*[uM"%H`,)AiJPPCayZas$,yK`XVpeN S%w4g=9Β.;=̱I͝b5@]SLvj5o:[a/ -_:~E5R_d-xÄ&onЖs^VKQi9 VM^i?K_䈱t;T8iF/|-`:ԗ Fnf/m؟37֫*+|_ - -4%tA>,QGTrWꯑjM*ז Cy<\k5&^/ n L32)a ) 2=}Ю׀1<:C]]dNFӾR֯TMzP-A] IM5'pc~\5#9\P‡bM!,AVf2@-R2|Yڲ|Fv^[]>=fEu?S.}aB}@,ͷ*~Qn͡<ԅP42/R2}C%0q${y[n f*J]%K( QG[&VafT5(Kl8q՘eC|Z+Ś(R>L~HR{nUйIEA*'[*h*xyk8yH|ӔT@l7CX:CSt$eKwuz"..Tìm;yˤLv|0']XWgr?]QnK0g,b9\H&9 #3hjgKOTj0zCYGQ"=g -[22$lKYIYwEIxzpJ'IAX-(RXç4* 4&^fLՐ|fX8#)x-W## -]ҕbk&݁o5_gs+ˎ)92zhKꢪ%+&ψ,n64u݋q+K/A6 -P)eΟ]B}P㮓}gHv:}ڐhS+ib?.e"vꁳԦ=:^G+uN8x%?#*ǩ/M:fi/3b.g6êۨ7֗d}@}E2pA<^.˚UfD}6<|aIm1nu>F'R]f_))nYhJ$=_Cx\{p.( -qC4hL6jStMI/5uUiaP? -gU&ˁ #VK6GʸWs&EznBOG2I\1A,)-٘.xSrՓl[/|ܥJ<JAջ49kfEHNuwC i2x 2N[B97bY(`ZF6n4@S]{ *p14ku>Kkrj\inS,Pkb3x*fZ(ً6<ɝ!hq -H@}CWna]NqLjWTݽkw* ?&w|ٖ]D_@u[o41fL/E1+ - J-MۃΩ^YȢ*tA/ᵙO;Y*ìbʸuvmFmŕDէTMPaAơ|!3mq!%CqQUXʾHwA0 d$ p+R - X]-#aB]|(wZݗ_tE%Q) -i+ -BWd.( Bv Ͱ&zgFiËYxt(;EQUMuq]vkMO_\0lɾ l%ّs-Vjs+P&_ȟן%mn3r:3{F,_ME 55Jsbn ;(M܄ڜ&N%]g;)45N%V', -cGX/fKWJ qYJ"FPievٽ[JQkjli1;\${3qiLf*jv.δ=W Yяw"kXa[f>E}I?1xA;HoG{ַ!ltؽ0җLU6#'uɬؓ[j@-)Tvf a}^BWw%U`YRAeqsV8Pb5Pi`R(Oô4lGLEa&]Eeq?Z54r ;ڄһ{!my*7Fcr$ `NC5]5Vq ^Җ bmWP튄 /ԘRº,ߔf]KHjk<:B_) t|\gf,)l ΢"`hh Q1; 1Yúh5F -Sg!$3s|2h2Y:Sk*#3\ b.[Aխ1&X&<Oe&{)̘l) c*[|6UHʥ{!Jǥ/JRuk0%ڂR]m!#5_[˃i/l b?(n Q>┇y.2B$pr(.#.fji]1]) m>i_WHiZQz$91'6,dGo`wI.n't%BKOZ'>e )Xڬ'.Iv /*)M"3ʽ!Rz?_eG2MHY@}W+|5" ;.hbVet]h8 S *^CceH2#$5 ֛:֩/Sfa2 2v_'C_B[0.d&r>kgVoz J2ݪ͸bpD^ڭ75.H:.B{җn#ЧCaxd`_s*u4zi s+B&s^-SbcLUf0[N7#ToR\ID_׽~䯪)Y\yLY,\O>w2ϥ8'"V4$B $kѐGI$qɁ^!z^1FUQhr9`,-X.*hY]kb80?'qY8~kxJk~#t_ۡ̽r Em/L³%$tEZ)(3K^)ÜǵPnO//[qc34&zw%w lݏvs|-n")M?f?8q'<$_wtU ^̆J~yЂI5 1kGsP1-UO_N/֫*޵Kox'pCErj%pmtl&+ƩFviz|oDG7!N/ղ9٩Bx:9m~oO4V+2ٛ9‑|'~Cy8>}n)Z>]灰1/iXD<{s~#hn}rë6rBe?O\p:۸Ӈ˜!{省ë^~6w˯#(^YüϮ;\A<;7V|:^ 2U -'A;%y(MfI$:Qbht?7xtx CBtG ޜço+g~2}FKS[ԑxzh0&]H/c͍31~8 t-&y}njOrۙ۶,ӻ~Ŵ)>[;9Zr2]u\Iv~E?=gʖx+÷B{<ܯR ""Uh8YgV>Ǵ yz J^ǛO24^i&m)]ϳg8kqKns?\(.Ǒ|,(I?d/ ṯJڼf?\il_cEV{S2)4>$ks]e`Ztd^b6IOٶk.-1BS6&`.#zٙxtΰmV'`%;pKZ7^HSxLu -&#=h(,x#tÛ~z~A㺪dCr{0[E -2=q~wM?k-pI͒H?G+=',?Ӭ4,m^o)$*…k x|~|һӏX7}j$,.%͟W^å[x/ TY64BEHD# -UV}^Β=!%$lG g4#G2j3]J$Bڤ*9Ғa5])ضcdFm= {y彤'i !!pї{:g6gVyp^8!"7- sJYxWgK1kdjC/M  -lR[_=T\@ds`'vW "(!:Dn'QDNWm[;1(ro׈)R6-.=sK4["_rHs9V"wmx^]l,YoL дQSDK Y# r=D>ݴWRTXKoIq4=Tr/oƳ{M<ͤopV/@LyyĮL H-%}4N^}yF5c&V/$.5Xܬ+C]ĨugA˖8J# 1n֧`[*XUzKaT\ -^S,s#φjq%mjDnŧS\is<qA!7y6{O5]q'p0 䍔u=N@Y޾A*Jqk{6K7AZcki/!,-}+GgkÏƙY7?,_2iZ>6@\-I"&0YByy?lzSKmvi^ƈ WRBSЛEqz)[es$"o^Hdzo]Qu"[`2x9jVCofE|,o2jyVwD首䨐Wy8׀iÜRܸuK[Z-_>:ܺN.K%ߪ;p2qݻܸ0֬""9.+dv1Uf| ^Gsv Q_luo},9ϩ i{mcEKf0gw/1uub#Qe4Ļܝg'E$tTvY,%Wj-3AL($1Hh;{( yC9;F߷ K Iܞ}/jׅ' lJQFގ!$޺:6vF[,*ۚ]Uկ[x&+{Hd2y>2kj!nAL0ŵY,o\򥢓hگlgHn]}lis\򉮾đJq5%engvmé!B o$xY`9vc`8(-5.YBh@aưsb5\U#~S._}?RH`8F.^.{ͱ!z( a%Q.E `(.K3JN{M+AE50'-eTn8*mY - (lBY:v;ۦE6aMiӈKO~#UՇnux0yKː;a!\;/g^m:5~u"2N (t^|ef>>Wh0ɅGpXeI0ĬEnr|'orlt(5WX '&o ܯSwMi*{i/7K Gx7\440:b#:RWl)b~K.W6C;LD}<FmH%iV4x5ZњN׮~x A^WGU#LJYqΪPz@\k"O7. SIK; 'a]Qrxz]vc<$@:r]jQ[y-E 155b]EeDq6W6&28u)JCCY -p ߎCPԙ$x8zڱ]Q/FLI1XgwbkJiE?İ͓ٮ)%D$.KHbio<~ĤѳO$Vr)1@ -]|w;xlXfaf4yJ'0* :%meIz,v+o -^>p؊jFL&COa}w |aY=yOFzm[]>%^WD,gggs/}rjdTWjQ9 ph#MbSYם۽)#ja]:Sղ8!k~XVql5` -EAN&،tx Sʒ<[$p,tjaySTeQeKg٦TbL'N4#+ 7)$}|X8R'TTSZqSu*v)}jg?j=eⶸz.clc{٪>2XZf&ݎǟDu ゎѬ\:KvbܥW 9N|euN.2/ 9[KK#(z%eWmDEV+ -+ʡ/j6g.r%JSoXҩ>}˽Lv/-ej1eLmt;AD߶_yUYS=DҙzўUy):d/TѴYM -`?PX>D 5H8bc )(FS*M^*(U374?S(H5GyjVjV)ǷN@wu˙/'!a{ʎb)>y"N 0Iꬺդt5nc/}Dک]E+Co -SAܼ -".-L#r@憡Ħۮ5$^Vki@ &sȿ_ˊ7(0"Gb|kXnQoDĄTj#efCQV!E/ U+XT5B,Bdn |3[ҷ"oVr|kXUDl<ٛ5YD>A yN~v>Jb#A,1$TC[uN1y]o -jo+ W?&\wqM;]yʈIe)s<% } -?Q`QGi]9(3s?&[`^z Żna{~{9 G6š=Ĝ߆UfLnT CmSoM -9lh.,' !;w<k@T'ʼnYe)T 8rMqbw'Z^_^]Xy!ŷFpvia+F̧*W>LhrtАxE[Z-3S&r$@ϴp)Vb,[o -3REd=]ؿ8%o#Bl'Gyj#dS牖7ynxDҩPk`rU^$!cDz+ozˢ$Lp5o[u ~d> J1K+$_ -2-ŷV YFZLMP`nnA)&^^m;8 -MfvYV[,g}qE֩@ri2[Hz$)8mn[ڮn%sl(`H&D(O$.mSo -9axVTz3]֘]#vN#5N.,cKOZ((Ƃ@Xի;,-/ ԟ2|SpuZ0V=,傼My{= ^9͟9gvwJNvjR:HV0!ǷF aFo{J}_as \/I?n<˅Z&ch !<9qrdQ>d} -9**k5vvd)x67^vv&vS>VhV9;_Wy@AQ ,CMP re+,v5јfbQIa"U}5Z-͂rwWz$$vfqKO! H alxkO۹*.*+b?vy.jbS)os8Wԕw'yĜ]u} -(;UUCZ֬ǐҶ縥&b5G2Dx%uj[R5,'S:[B,{Q!h RFn yQ!r$kTUӇ) y=!HTlD~E!+6tK=\U|I;jgAuF(@עJju݋`Oh֣]Pe[ Q{M`w7Bm—2,"{XyYbuỦB -<5泲$֦>PHd6C`;V|I-ŷ~pxtwF("K+l\,o d̞y.{E:d@UR*мUWbJ _XAk4c(5G_㣍ӘVxJHt~n<]? >4do)u-d{ UFnƱKv1αw"FplPq:YD$Mvh:AZ 128@~oh%X&+[b;)2-o 9g0XF);(zi]yUM<^ss!Gkq;[S*E]`OYCnh)pϖ˶RT77@D;SVt$M quL6]ݻ:iq\F. iq՛Dˌf[0E}YW.Q;_t MdymRqPs n1.d3-;;c,}&ܪ}'*P)jz\Q~C ,#=V;aoM~Hu!?!TXZ]]=gVNxK}7O SB&Fȏ'CiLt`. ML/ɥb|]@@/<$E#b^Nq+Zl닲k'f|Y9JG`,,֤KsQHΚm& -yI+lՆL zٽPf_‹SDϨ^z9R{|^n6(6à-UG[iI _2 C 5R'!cWJߝAX6)pdx_ *zfA{L~!wٮ9ɿeScKJV0]TI*,~풷_Y:I]hK-%r!aC)\*ʈrƠNyXr7@qF7zT/,tBuq@rʫzƦ+[& \B4h؞xCuvC{F@48!V Z7~[+͂9rԡU/8ېjUII"J .X,@~<إ@qgE-t#XH -%|ac+Bcp -CT0cIIXeM1"HLe!]8\Ek@#R\k2YaV]b|%YhahI45]<ʛS$I[0 -Z% ([RY(pgcL7ix a1Ρ30?JZ-o(%䆇 MĚU{ -d)-~cЎ$V -æLR`d_)xUY8;&KU) [ix;, -YrSs7yŠD>E4J/YlR|YhMPA _DoxkRV :;^BYG`s"W5+S'iL wƖzAt?ʳHjC7Gʲ—T@MoýJ^!%6C^^ryfyG&-#F,`2nsj6FHő#4u-/j(B !n n &HQ,OV,W -\K-ݶX2» _YC%y4 5KD<n -`|®mVf%nawX6`t1+ɂP8tHA_^\Ej)[ev@`5+вHөeP$*l5$ܼ |DF%r ̪-9,41Bz' (qfd$sWӼ -P/R y*[ݘ6iV}9HI9r?(~H$qbh$o;>Iޮ x8EAm=L$M]ه[/ m:gLUEYX(Q9\WfVC9 /9hI:h x;^ xQT{O%Yo,4*(REP#҈JSʷC>57qΘ6;uim*Ɩㅌ1ezٻKʊbALkbC Xڊu/i^vQd pcJGySwM(7w.4SqKc9|SRѪL, -\{+E o~6X`G1͸.XzoYǖRL9_YL9!ww΃/as8Ѳ/%ޒشص<+&5w9o:,tzU9_9uN^J'p1Z}:l܄Cޙ!mOuIThU@AKvhʶچϟP!PJOJsYz'%^[pL}f^L"v'ѶLkY@y/)x8(nw9-4Wq/{aM9Kh{soݐay$›P(,j+m=q6ir|\Pa֛#ޤЭ;5,F/Em7y¾-Zx -/][_SAm4ñtoKS-Wȏl+M-,>N: %nMOsd.Ѷ%G˖xcaYޑrh: g vyAB##zt4exh)g\aL!^bYw.&=!:E:=RX|xB}+B=2&KqمڭX\[ϙENA"dwt> 9}<)WR0.N.Zfo];CGnnN84}h3r#z70JNtp #S6T8J͔[/!/T<* -wn9?GlqͷŒo4^tnT^7U^ʾPš;9% ;qd=Eu L[L[vuX#ȜCywF[m}iF>Q/17Be I}X-[my𛙄>MqLoa͇ G |ڼzc;3e޼ݻ5 +yYnhYgpOJ܀e VvّT9fp֡ͥ;&i%0毂6\B|`5qWg' >VmunaW@^s&O<V6Hw<}n 7lo!0ȕu -}vx#r2}54KZs3iޥ`@wl:ީlp#s{O&L`O)b}~2ʡ#yn6ƏuRmv,W8}G2JFWu탔H-Qhmc0Mq ~@1Pfk#de^WߒW2e9fP0QmK?dݲLi >V):,2^R|!`v[%n%癫ӏ>j>W&_3KF\v;k1_dضnG#VNX|`3ĭۙK{񕀡WuH .ƞJlvr;QbΤ>]:ֽov_Gv3i\֋UqR|%`9vEKZ:e1:,{TdPD.Z6Oy1ȡr.;g_b-9Tp$%u"8*2^y:~hRUA8SnѰC?89fV1C Б:lيMkDuu=H )rA}w4rB!0uō&͛40 -pP#CS"ϪyhXOlSYKefdogk!?w☱ _*\&6ko+;=m,1.Lz{IPZs=3+)6pu9":y:z| -񍁡$jr1նaGhDj[Nedb |nb<D.XA'2(K[>BPq)[[um6hS0Cp/1vHp=A Tjl^`yDʿU |a_ִq5j̩68oW' -iA)[1GV[{տ/r$]] 9B^ {[]AC \uOy!pI_fU'h6.nNO[# -~j.Ece j N'Љ<"(I|@]ҷa Uw*~{j0<7i0yt9ɳܫVu;zŒN'd]L%N=?G`fCeId1uEvG' *\f%a!@f W s[=#8-FUK3V'ԕcs;Y PWM[ZsohbD łA`ez#mUs(Z1bd`N9oìTU $%]1 6rO+ "(U1A&Q."3笾ӂaz-eͅ]ԩ  mV ?@CU+,+:ͫ>&R~i)UT^M`Ns@o'n˒5})ф`i&MUHvUa*+\I -wݏ934+zJ=}BlLMI}+b Ⱦ<}$*yBxξijo#';'^|=,aL BR+5pҠșٙ6d°[ 'SK2'sۓ/1"p4|_Ԇ,#o?=ltHc|3> GVnkO,f*\;N'(.*?&\=MǵgmβD5fif Fg_)ӟZ"zzwqӷo桥vaan3jp$FRAޅ>FqLD-4iSɬ?g͟Ǥrh~:s;3]-"tO>k5܋4Ϛ5oeٴ]Csld/̦6.aPX=y1/9!# j$tPobe9]gT9B=a˚J:.fA%9mQ߂۵qawSzI})WHY -Z)DPBOT|̿lOoVBb Evn{A cV_꠱M0۬lB36w `S]u9wkuJ - _(_c=]Yۖ/ Y!"^ᭋ*vKY6yz釺.~[2vCW3ܜ(Oӷb"wabWڌ7F MpS\'0۷Gei*W+:B#?/]V]*Ceq;D[U^oW2Oup,}x$;}$ǤBej -!:tGD@F'Y۫~̞~ۚf٨qܷ|3`Ss&Pz.R5wuѠ|6,84:gYL`{Mӯ^iϘ韐SX,/1o5CIZbI!kHbeuDN$ixS eNH92'Q|F!MY}>_G10{ri`&6/UWCG)t>^R4FBj`֡6/ԷjP`7ghfmcAG؟"7mE*6Ǥgm'm<!i^XqZd.2ԻKklOwK4>gHcs['?Jh0'rőMrsX>"h68E6zmגDV}"9tջgدa0 ;%=osX3])3O]v(Ofaj 7?Q5^0M'4rʀCk(PwPuF}zXϕ/)eq'T&n!] -=I})uJ:茵D]] >e6<N9Y:$C 8[o7U􈸙?8jfוBcri[,m`s\.jq;㢞8*"S63Agd0Zd"Q-=eKfзi'uGȥ+A\){⽌R!mUǸoh@>tUtUK\tOB*s>2Jŋi8̞R[C=rXdɃXuEЁIs8 /P_iXkw$Bu]<ˉIH?JՏK-s]Z(+SJ{s`bE P'c=G&·iX@4$\e-ݳw!s48tN$xD2:@ -hz@l!PYo t^xqâ>2T12StH+(WCPAc|y3m\.45|smSF8 Y4q5^8ҕ)v@[yx6=!xIYu.uw鰦@9jJ*JVdG3J(2m!JeH"T -s$?duRU=#`g˜s*e.G(B2UViMi3k:3.ke3By(K,3vVy U@qh[/[{5㊲$2 Zio9v{"#k[ET}zQ5G0T+yf?_Ex󾲒hɡ!/?mm5]Lˢ?l]zl3#mϼ#^_۳{mϲz6؟t(ߧţQS-|(`sܞ޶A;.nH̏϶=k;%hwfֆY_Yvg#}|kK??؛}n ۍ= {i]š5@&QC K ȀrŒ0=?glGJZq\ n7DZn34GpO#,Bf_E<?lRM;}#.C#ub56C!/&Vbg-"5ش.LU]\+͍/4Cs\3 F~J-f|KMWUpL+Qܝ91 lb 60mod^ 8~vx@)"w%fhVy> MfLBxC#(a8R1.C.$Y;wGgThfSɩOY)0ê)ϷY^"u%@rglcx:iw-Eb (ɀ$5t>S ;Iytb?!Aޓ6Wt45!P؝RZL, Wt1 dUϓi<=4"?zAx\!|!Ο4v-+sPpD끹$I i3"ȴ=_$Ss&06Oq`% 4]Ѭ17s$BC ZzML+"| ʋe]=c{ށTD˪?@헭J з F/wɂՕ=Fp?^댢lF)UvQg3̐ -n:HF5? 1S] =9ǽu%J kx PT_Ɏi+Y -eC0 bg r΢ėaIX07Z6)g˹Y, 7r;';H q鐞=if0tA$#>")R"mt!SWGIcz7f+78"^3D468sVؽcͰ F~CtX'tEɫv,_/|wqoLz!Q(DDɬuُP <$.x:'?GD3=־BՓDZ+`UjdXx@y jY)? n(oSryBܶCl^o VhZ삟P+6F᝜Ú?q)wGhpL^8$r9~ϤJ~퐥:A,boONnPv PYiX.FzQs'0HмS4嵵D9Qm$6 OCLN6G3c2VG`ÃgD/R;(mJbfQn"}*Eô *sW&{2b$njE,Ky-'Au3 L?A:Anc!t#ۍ;IL4(_Su.ɷtBeS - \H8W{^*nR~++;cNOEd"ڪ(θ{ХPgmJ}ڟĴ*:;~P‥]CM.*jz&jSkfhtWf琴s} 64=.bg* -SR֒ضD>۴.K}-wԂOJ,`i0!XXK%XKZq>άrt:߸|{;&cb -ɕQ~\)fE^Kc)Y(\T+I>;YU-ֲM?.>Z -2ZjiXMIzWTP$P -ۖSG['βVF r>O9'ml -([DVCd`,k-O)$׉$1[ᛍZ?ڹlsbyW-~yħ|6R@|R }Gd3|X>"+KYI6Ze8DrǕ?" @ZJ V?fmnd/~2V@sS~WFyBR`bIb)Kܲ[ŸQ.xX<0W%;!p!ot"2 3>G,h6Vj)WӸ(F0lV&pN fW])_e-'O:b3)Ɋ: ¹mSg) P~fZr2%S>ɟ̊f I;F -xYN*CT 0kZ]|s$12y}kI41*me!qa6?3c))á3E4^$.*i-Er'v*_Z%9 -#ح`~bpq~IP)eY%@JdOgh%&jεȆ#)R"|J?VW!d`47wԓaj5hhٯP*1¡'iS=+Khv1~;>91XeL@ic[H'يȤoV3 -Any§D_6҇3O 徠)TU8x -1WVb$;O4ԪH&G8PT#;;_2``xa(M57LSe{.rlhCG`00>j6.kC0SZm;ψ~3=gNp> lҾuXz86a,6ݍXg_7z YOEhoE vdF3 /`+Gi.#dNaQ5U%G #.1 -Ez s̿]vK+~9 3 ,?USq*l{Yg~33 ح-5qC kjv[Fp #U$!&2V'Ġ(ێt{0<@b$X_Qmd@debN0@?0ޕG^=g1'VM 'd˿z~`gX-`DlnNm{d9 C2fzz7sF3gNp=B\xnbp|]VRFs$ad>7O! sny5:bz~ 7ag8D f\9 3 C'ij١ >smm_9EQ3^)#-=SO-" ڕcXgN v;w닊Gp=bQUS"Q5|˜vcfEL#>E=HYVRt:6bQ:v?ۃ_PѳJ {^#mۘm`HznMp,*,EO_Xt%& 0}!&M? Us^g3ɓ\csCZV܍f*gyT'7>+h#sLVUs ^\ bYSd=(Ba/[lv$*F0Jlax@IMNY\SWSيEe-iMg0 -m8B=X1e.I8Pc"ثLv% w {C> iWX'qYv YfP}V if+E`nt'"qHԎAs| EOЌ )C_%bgNCJY"!e>Re3k95&Nr\% bB@ -2@Uѫ:*iIt^ 9>|M>Q?MMx~COd+,Teq:j&6@&zvV9M~?q (,(QgTH' lI_p@Ԯu _xF#;MJm -*]>VdAO*CFmÈu\``# -&CoF6~|3zz&`m+L{XgU@ڧYtP@,nh&?:baxW 9 4em`sOO&'0b̙~O{A޸Hd&z%趦UQc`0KߏΓ+z*~2M)+Α0>zY/S;H-tlmu2pYOV:LI9m#R9G3 Sڲ(n'GhQzٓ'e.Oz\Џ(V>- G c}>9y3y.N-ב[#@m~UOYhW8i#r3K"k@O͈ucr4LW Iȡ'ߍXf&;p5nuF\  nGfIDy=f'w f^9w@-y0Onwn&f蓖'X+cS=]|"%^'y;>~F;=>l 3ce.d N3#GGg]L0q_~"BDRA_+ȷQQ"M E[O1]z 3o= -QDbn=q v?;Lp33mAaYL=-Kf3;LW1wy?=&xތ`+oMR:2lXfܱ/iC*FO-㛳yqD cOk6ٔ$L {m=?:dQr%7e ^ȓȮ/@x_4;T,gBSqvFJ>M"M -܂f=33C[~wӵ" -!"~~4f ĉD1S=@xkGؤ>g%M'&GN=i-opFw`T=#{cyFkGo7 Gcw|s̙_*t [|X8N]zB -= E6r~\Gl3S>u -A][s\G,~xP9(~) ̻䔁"TpI %nmTgn#FЩ:`Bla>Xfq~P= Qm X'6pBr>#ﶅM#42shZ[@ ⅷ(5@]&ѧ~P!;a<3;LǮLS=u@ -d4EmSXSi\&|S#d -a"0cw6T=u{~C>Xf D̜#誣>5 #UO@z\""rf85':DT4D5®w(_?hQYq7hescP!'&vDĨ>C0zRn)'0~Qg`g 8'7 G *Q.45MH;/9K΍mfy~NJ}m`Ou. G|js/풟3dߪGqsײOr -5#6 - -?0GK~z9@WsC%ֱR֘IFg8ەe z:i*2'(3YC6b`4diŭb$ c$]xF3lCKaU=E!E!.dr53LKb,z z6b(m9tT%#Lh, & fc&zcV I6lq!tCC8h+@V5M6=z l0i3ճE m:Zv,'2 m*/f& :1#ڵYFf~EpNKH4[cti\`an3o(b5W Ke hmEfᩖkE1o~~lٷbw{)o9#ǙҙH_@!] -ITo|hC}1/1U[.vYȬDC8yy8?!k(M'B@Qfk-5Φkʇ-c,|/D}ṵ~Cqh:FG"Dxΰ,+A5 -T]WE x`M_7HB}aa+ɣ]ڃہ}oi.bU?&̲o%`T2KI`PCV0J=A0;J&Gu4%B ~T%K-2)tt[SWE=Acg6HřRRCo|5wI^U'c )(˘wy(cAgL%3IXGA'ѥÿ'G!qyn8UeOl=YGik5$̂MÎ8Mxl5cw9_!{= ژ832]'?LGU4VVwB7fxv|M I٣dŵvI,a5ҙ2G(uI=A,{yQ It8e|n[k|m͐ p3_G)6|{ zpTVI 1xma}0/;0 -LNJ!X^z^c=4;gL+/h/x=+<==)0;z8*klŌd 'IIjϴB4>$2J`ݜ1vfg~O s o2h̡:=•;Ffk͈u%gHu˜4WoYn#ַ. -#`mǟƫo#<?+1:)ޫ(!qAvpNPnsE+0TŊgq?u~=O̊fSTT&(a8 cGe|7=^EG FS}^C' wXnyH?a\=Ҧr2!~v 5:W=ۙG(Ss7M[HdntP:CZ+ߤ\6Q_C#>/_ A̿=Up ,+P){HWr;g3p>Oy( jY'q X9&WAQr`pIl \3;>7[1}7~ ے6& -[{;x|Gs\vG뭹܌O& JU1?fUqsw ί6Ǧ@L/`£3q5gB9%.q_{bF!7{=Vz#(=i Vgb$[,QE3Jz7KԔs/d\lb p󅠽ڃn>sWEoYݕ[xS7zWw5}WGu=00Ƅ`}dN|K9A{m `!,av@7HH Q8вP/[g :CF&sF`JP'fd[[*.dD)2ɖiS5r[OA=)=Yhf -jsE *%Gh^U%0 -{sY@G ;z'|FR$f.%q`2"^l:(<z$?d6rCAؚVB{L4aԁ> a8 8:IpѦ㻉3s?t$7CA4*>ft,I$` ­-XfrƘ#` I &eρ'4/݇ѭ#5B=A8 EڛS-ؚ!K٘ls6xRS! YP<n3Q,͞θv3 -*y-x5_кЇȐF@a߁f Bg<0@e"%Aat < -DC?D }C'У=E~5YEǰ|'+L1:4fQ 9  w$۞WYA{р́bO/DG@BALd6lOg sԳ3&S݋R+?aTp'9ōFY,q26VΒZV{ܝnꍖ?J{pۼT^Ֆ#jzmd 6;bW76 %_<hRҫHj|o`<_i#`SDjr\w F0?HvHNnH>=Xj^ YI0, -Id=0 #_ٵ.D;@Ȏ}n̿amGߣz<__LWt:7 RƲ٘۾&emNŔ9:&g̮CM'2^ESxkNN -Mξh4B1YKc^q`K}zXByH7&kG #*tM8s1' qQ*vV,ȥtCLCH=A,Y h"t -6s鞆mdnW%WN4[JUaXG yq vtʨ}F*T"؇1ɝN:BX~ )o -9;}!^0? &+ ~F}bO-}cFYכֿz,pݪpy$,xm=zgG&O}ky"i#k`Ig%r" cq S<Y?z"eK\4ƔY @-iM x,Șխr0mQݲMY -L  0Y? KQZ(zX; _8Hﬔ77mu{9ޓEp8#(z-ium.''[t3 -n>/GڵjmtxIռ.= دLz@hNnnmĉ0.]w1:lh_;h×LJbu0xY4Vn7wݻk~u\͎7L}/=ar~7j8gYɴ?r?XCn뻳6ݮxcz\rp~+CZ1ǫ-+.UfN[%oh4Y-3)>mU8VoDyKVooimAv`QW¿TwS3y5'tnz]u3>n>_j=7l#w;I\ZU~Ic5GI)44_ -^}6GgwA뢺8jTYi%!jm&Ҩ/?r9:3+IY.U}(rSH-{ԗ]4+xGй7^z<(-ǝ^R90'!+Cd(1 Ɇd86>Ý# RUH2tk,V)'5N;/QOK|'.)]^[bzX,clsA=!2g"-t9p '1+@I,9]!a;by%"(D@Dz{[86 *q,7㮳c?G~ßWc`>ɿoand˘EGO -$$}Tɓ>zS}hzǞS ecفiնATv;83$zL;lHB${c;yۃM9g[xqe^ǻ7gF% no)%VkO:E'T+i.QcwtI!S-H'oA.Rsug - 511/*9=rrKpH&MJ#/]e8B7Ly~P„P9'^6αBF{zjԭ@@ea6zp_lq=:S?ތH#Gٕ?5]q;m6ßVxԎ;qW,wsQtgΟU9( EHa_-_OV[+W -B6Hmō|=RT7WZλzm@2wޝ<ߐ q]\;(d-̣̎ߘW3^)n6D4􇜔Yv&ۀsd~I7ؓ}y±,n6κZbl9wn:`wl~Zo ڳ{wl}w6οVS|yu3_A5YO>ȓӺwDxToϞTVKZci87NIM:;Wt/p>G#e=?&)΀FnKFoBVr|K$fݱ7F%_t1Ph#-o(c@7d*pFfu3aPzgzR;zu)o.  >Wa"SCnrf:h<6_=>> -0wMW Z={:(q8ʩ$AMޔB]I1-wj|5CJpcIܡRS݆Fój%؁0!hU`WPzY 6M|fͱ< l8t g^#O=7 \y_P\"P2+IYwjY\&w.2{dV#*^rq]25Vaک"X4ҭZ0|B%Rnu.DN?"\K\=5ڞzӪJH/eU?{x┦/)'E.hF'μ̜m TYlY-xh7'vJvvF]'j Jv-DCF#''ͥ+?4^9+|r`o,SWt=+_;JX,GϏ>df|T7pM!A{;9_QO1Zaƿ-Ǭy𣖱٪},u ؏l7=٧% 6[=wc!' ߖ.h(Xt_t(,{umճ3ae=~Vm>' A=K|1iՑ!3U6ת}=x8#mJ a&UՋT"-󐵃4IOS -f]sW(UX6VjDQB̌ _BUgXɴmŵeN gwԪ,{jm+ǵ^üٗWd3$d'31NVIf||ښfydeRζgd9_?VjZg^`$/zLpN)Xe4=+yy.œm6c4uwpJ 8d1tQ4;3ܢ{ӊ┢6"+ͻh6f$>ɾxD۫\6>yW6ťgW;b&[ im5/NCb77X#VOфE`ӘricFJ6 %$,R\=alE -_yX-y6u'z7G%a{_U=AAiqgN6!ANs/+v]K̊,@keQ.O)l2Ɵh~e!Xе9j8Gbޭ&= dmf݌XBZ=5x -]={V2 ?.o|N3=a cF%yߘ,(G0`Uއ(GgE.9,j\̞YtTR9kR O|_h;3$fic !EjV}[}QE6)*`&HW9Al޾hג*v; -F2h -iUX<ٝ>8[ގHpD RK_P tH7\.W}1ozR3gw c^r.njVoHtz.h`αA5/_j>c uYɣXL2ϣ|99d{+GP\>ٖ ƅkDω %7i̚m!pQ2ǾL1;2 .%Gb3W b}(n2ɢR2D9-J' kյ@P2ɇtV@ FUܑ`*zoR}j`F2+!T5/Tuf7`|K .ٞ*[%%Io8)oհ6AJ"\>V^x|ug#\mhUUi8Zuw|{'h ٗ aGlբ1:jsd Hz gz\!>zD\f hg&+k~*F)%VYk6|}mA2}ڐc\__"2ݙ۹I[O㿟5:sq]=,4Ul:@d֣9jwRCiwzFiLᔳ?yOl'!n~# Gy$lnղ6o,d׃\r#,հ&wMyFPZVܜ_Ok eUBak?sGj?Z˥_h)ʘX=ڜ1c)-cO{%> -tзf[}ړk|5Yvŵ][]0!`\>aPb]Q7z(ԡ׃ʴiUڵ+f+x*Jv0-g6v?^C +V/Yfj44~ֈ)=_[7{<;ro3:5a=l Cc"<-'4P J?lO>*eZp^у -UӴ琖CuYߛdۛOvє`i5Ftf̶VItɖT7z-1ml -"UvwwiB>F&=:7f!"_# 3xd!1=1_LJ$X"VժAK|ڙj[dϝ&ζ6k߽=[ Wfs V{c]B䳰݊l _iG3az?hWR.*E{*$̩2peINjvKYd%i\Ͼ奆^7մa醇Y=W -I_ V#¬ j={2Jξgo zcκ̷ue:5md_Zb&j7- _Sek`-+@/q` -ͶCfHngh}M)}Nydsg$WO.9LExM?уRn/Ν kN>i_݊Mma%\/~o={.g3 ; ׿DX Ii|m~S80UBAح>?\᭲)7q}1Wt6 0ҭ1!Y+Y5mYdׯ{vWzP-:K%]zuL%TUIY,Ki?d]!Y4b]?AXarfg~j>ГpW޿mKV{ -k$V;go|P0•Tv%}>ꩈ+'UfV{^,xLfwDds7IKzgo8[r^?vRUݹ_S/F"w@Yʤ(!FAO59 ^j^ByWY{|OcUcTqΞ'96cZ:!^j<,B< ke˒IΝn=3BS358_z1cQ&c:D[K |-j} yFp:3px3|RLVG6KD9 鱁YGA@=H}"M Tewexob\|w=D}cz -[OPݐoQyPcy\X^[ş:zy>ˈ#$#j^8xeK^Rwg,phgID>hkLiSwD%'V?onؼ ltIOJ 0*ʀ&Qq -gj>qrC  I/O(}4ÂzpeZJVbH:A\ IuLZ;kvZAUaiW4TD[࡞Xx~B)9 Qz+cN&.o,:հJPX1/-۟EP"DIx9KS$omr*}Dla -zr7mZUq2 - v -"5.Lu3.qV1kĔS4DE\ -,ΪYK֍* K|l|K:1"mJ<]\ٯmO_ܯ|-l$!2\}Sre\ @5wruqB-=lASϲ=O {cZG*Aڟ]qg=#2a S\VzYcX#)w:cUvڹ'6d+ =SAkEO2DC܎Iζs'0g\=VÎ@!ߓ!5usZG=^2U%P^f (}{j{8Ǝ[Peξ?}s|G<{*ܣv%0yVM=ygi=T:HӐ^!qqS8}+?]9PA -7~@;6\S@L¬^cSKu'y!,;l~]0$>AozI!ÜW=i)B?H]vXe]"Ң֎lsGpO$hڢp nʙV,=Ok+Hy%)p5ӫS*K*"6 }TB(X$zHݾuo8򝞾Oo}l=lM+mzm=|bڤxujy/Ιi紧vͯ/?q h9:Gܳma& J#!iڱc -=x?f Vmy>f'^nj$eRaP7wsLLYi0]-¾5$m;B:|+i֓Ppt6tDn$qdG ԫ>A&UW:4rX3ˋ/b?& 9s -&8 = ;(Ϙ 9#airX'&i# B+8<Ҭxߟ}eMVÎVC >jQl6`"CUS@[PL4s}A V cA+вӹȘH~b`u^9ЕMlY_g_~Y?'bk#{ 6UtSGۤA^e@ς.҇)Gbpvqݝ0%hdQm¡,8^JhcR~̔>ೳ,BS3 CZ. F1I=x_#/⬱לjs7TJY3;_$XC[e;t#^Bz I[{ZUX;{8fe"0-\R\"$R-4Bv潶?wcynr p4S]0e,l2DWȃţRzM_99=+%"`zJ*$$+UcڙlߖFBak/)d=lyoz kƢuB#Ի{BkYX[ 53 D>\ zש͞* -i51Ʃ r?a>y~Ȝq0T`ȨP -XJ(e -.}KjC6+BnG  -*[GTOKcy̎_ꍡdz'zֽz+>UpxJ@`xԵ'O!C[00f9R Mɻܾ-Md$,.FqqIk3-vlg֌=9G8PU/n=[RY~KH(;VmH䷾/A.=zo9.=Э' Mz2$W? v󀅗n5>vA1,K zZϽV^JpR S&xUUQZ㤘XV^Y+bAtzј[YW}֎/}Dȉ|g?뇣zTۇDUGc )6dT,Gm4+^4{p*R>Ǟ'r^}NI[F|oW`r]-Ϛ}{c'Gs&Oj\}x_wNM[piꥂAZ5U;\e}tD;Q)=S2tGRt i6DDH[L6cn# zK@аm(/^Io6a@ÀXnP-FNDM,s* ǬUEfO30xRAsC<8Suj2LlxŖ9+ۋ.wu~WkU$ce_`l+ͫIlL3`I} -x=0 -w:Q`IsR9oF[LYUMYe;V~|u4KmSc1옕U/(oߍ B#n9rSkOQOps3Z=rasi)u>&]"T53)r >r$/=YM+LYU5Yj[z=FJe -dA $iN}]UwH%,e#E1JIyhJ,Bչ:v&$._$뜰L{'_/>Og92;-1g< uٹ{rҏos?/l2h:缰ե>9g_|}΋)uH9~!J -UI9Q}  -Gb7+f(ï5ZX|n M ;U1$ݾp7dЋġ\tsS!IS@TdsN}ƲU{#ߖ9:9ަ.,u+2%f)mCY^G>P9 qt o|s$6\FΑ:s||6uB}_|=->-WޏǍmJҮ /jz4AhsSqLem)ÆƅgzF\bI&eXc.o›iV` E1b#?}1OU9&ŠN(Ue3$=z''zђRis+-ejsRgIUHjBUJ׊i>_:Q]u?AE -Hm`2BG`C)@iDQ}\uYYCώ6e3v9|FGXDZ0E7,HJG|@RrS% loh+e@|r(, u:LS0V'}B|](JW܍>X6!ښPo/{aQ/= No!F$Z\4QSr|LSBvo.B*6Rn|bm&8f#U,WfZV !<Q%Ɛ*߯2}ιΕi9\|>+Iy+z뜓l>Bz9Y ۤR%-s]燲]by#QztKt&q5Vj~J)?! FHDY5J醛ι뤫XqysP\#zta緥}ιSD e(z0'"j~jc]"#k9]7_59:A2:)~/suա ^Nٚ8Rh4ͯR낷sug)O*<'|c`L?%?]ι˅2k?l~]@x؉Ni T=ZeJr)Xh/*:Fc;OV J|+p%=e/-)T|*sjgeF?9vATp*|&ZE&C0?Vvm {4EN|,S\c ѩL}2V+ô(~~{sm^б ZS=ѩqc#o  Ek>Oxc82@]-Z5v -&f3py/Fmyϓxӡw§ӓG]Çe]O@##@ 42>uDOcWn'릅:jà Sm/D \q,հe |\$>J><=g]T OI OYG'C"+Oi`7|bmj p~m 6!d|@^-R9Ozm}ϗ48@\+>  'uB(Q(ҪȮ4p07t5 šgoxX:-\G GjD :'y~ -ߴB"H `(cP)1ޡy~'BaB*U.;!56]~p0:FFvYaP0,ɱ,3v6(n /[NmW?u,h<3 =RiB- h؀e'^4t -^u~T2] BRJfI/ Ⓣ{_$;֣x71;De!8%X›eۓѩ:h!$AA@kK:.O?rg\,š-B> b (vDbD{, 2Kһ!˭+bXA<'Z[A$(H$0KB|nj<(ۂ"lLi2dZ^±"uFP8G: -AʒGG4f ׫8ħ1.^_J=TApI.RǍB>4IKC۫RO^Ԉ,O uek޾vNG@uD7XEپh;"Q˄)Z6YD]ilDBl 0:h h$SilAa0v[m4~E_t+FI`N^x~!q\w<@f+ -[פA7X[JSPaio3Ս()B[i`XSPUʢuuZÓZKBtj׎bjV5+Z@+0J:,7OAW}d=H>Y odEZ OhBCF$v{&~_9Yڹԫ8Ph{(Ѓ^ԉPL~dl$?mY3/jvpȃd$tSAB2$DeU]h<2%'D|83RDU|+4< 4) KXH) *0#D# A rBbB"Q,%vHHu - Hf&?TFB3Xɺ'10 -rP~z| /aёS &3riΔ|RɦgAeD(7fơ -FB4}붅\b &BUn -D(B>X2Ih%Dt\6p#]IH_''-JZMӣC@*5{/rş00 -E'I-O_ !^OesܻGm]gٰEurՄn,ק(ICΈM֥&'8pf9v$k52R$Gi6LsB}`sAS$׶4Ġ IuY">f8*}ܯXB^DDpUCVM9{*m$O(JD7@ZM-&СP z~8}B/r>!yI(moCjF)N<N3g7cM۹3Av2{vm ?˟-Gg!+~}5%.ymJ)utj46,a .{?/\t5+?u;=;]SΪwW{~g^YizuSe~<% Rԕ3eM:[5`͘ouJ%rw%6g뢣wzƘ.G񷺨}G›ֆg;h;.sauzKyk5zS0@nLLHTGq+U$T/D"‰=½ iPdrm+h(vݯAm`={ݍJLvx8{BMj;҄>RQLlLmlHmS,ZWDx(ICCy n[WuK/4KP@h;p=O5mF~hOk6&ywt7+k>.z\& ]jD`kGxNoa6`&Gp%r3F2X g`ޢUѪ_uQ#L `imPG|U@TI0$ Vϧ7WuƚE~M1/8WqR~y$_#s/6]:ZAfD}Z5##q˳(7 _F^go0<&Tyi>ZO}-b޽\E[.g"( qP&NA^qc/yQ A=(q0vC30U -g|I׏uƕ=8؝&qK\Hfhr-|q%  D`p}Ou4.dѐ`(E)hzj\x"˛@4(9;#4ƈEL8_"#ivBi#|1''YsM+cι}w>uûhGս5*$Jgأo:~Z|ᾈug qة]+;/cV釻N7חwHQ$⿘ss(39_JE/Ŧ>(L2ZIڵ^Z(bRG_jdpÈO' hUÅ}ĤӞ169boi?Gs{{pȑ☃U;:pqh29b$ΑVY~UGg02IUSxAy:-e4s֊f gX01hwvIF\P^e]-w䰌߆} $a)2 2Bȧh!cjBF+ tryy-*ҵh瘣8 4Ů-5CT,,;)RK,iRFӀ%f@H#OæE]Jz "r\- wb._S@=.}߶S֣#uiw[T#OjoGrL.cNiΈDJ7 Y^#!숌l2NIE$ޏ7~]䦥;j-_Qqwfgl7ھNx; s[:K锽>0=EXɄpⷑ;n!7J[%pBqsԍ,],Rғ<>8j<[a/ps*J3pNc${!XOY;q5+vT4WR ׀ftY\Z!o *)#,6˪5^BC(:uo飲" -3si}B״rˣc/g27L 4iKę%Y8r&H:~+ }*c{%Po;]\1k# -\PuF`MHnDȻɏpBF<]eo|HrW%)j*~u~uXV`Ȓ"dz-Ru^M;3q+ۤjʟeT=\L#lx 2G.uv5Fut]G(lIV%.ՓY;#dqrI6" Sq#6"HU eФ:ZX2%HB:r?X@H5a5(xSY GЎAo̢ MXAAo/n+h1D]*KteԶK==+ɴID6gDYPDydv%3NȄ/Oiyk< -U]GSϦ`KzPֳc] ^jܫ9Uu&%2g|lS\* أcw/5f^]k] 2 $0!`X1/fv(郏(xAe Eʜdc-PhY"_Q95Уx6"A$Oq}`b3G S֐>,%zv< Uo,"LPAT(V95Ym#p.~3q`ҦhD'+pm8ܟX0D iG#$E$p&ƌ >5$QQVi#6S~Ut}YE>]7(W"UA`1:7"Y/!knPszZi;~Oݷ Ym"勑:"Yϒx:MEXV Vo@&Q6<9,ploJh\͑xtQŊ&=ݍbn?x'Ǐ du~/?A6r -endstream -endobj -614 0 obj -<< -/CreationDate (D:20080513143006+02'00') -/Creator (Adobe InDesign CS2 \(4.0.1\)) -/Producer (Adobe PDF Library 7.0) -/ModDate (D:20080513143007+02'00') -/Trapped /False ->> -endobj -615 0 obj -<< -/Intent /RelativeColorimetric -/Subtype /Image -/Length 1983 -/Filter /DCTDecode -/Name /X -/BitsPerComponent 8 -/ColorSpace 823 0 R -/Width 124 -/Height 108 -/Type /XObject ->> -stream -Adobed     - -    $&&&$++++++++++   - - - -    l|" -  - s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& -EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT -&6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?9f]$$`;sjRܒ-?>'Wr>yN|R~.*MT%1H%aɆL=HDCjͨ(y.YAߌ`/L&h*IOq&S"bFbEiZNߺc -bgZn潺m6;#} -~aFJIagxx_cx+Z %P>I'{nlj6dGqYK= cv9)sT͛6nfTRheǨ:ӹPdHj'űeca3C!bш^رTvܓ%|zj(]la-ZnȒ(T'NB$)֘֋z 6FL)Z0͍UsfGl ms>7~vap:U'l7ͮql\wU=Gp|+:.#Hd4v dZݘp'QЄeœI~bI끰Pe#e Jx;dVu24-kHґˠ1D ]7V`!Ne;Ӻf)o&ҤR% -v.:q8n#J\K?N~.5m^GR/GzgFk-/_PI `` ["l\ yC-Y}G!Lbllb{q9~D+f \ l F8^c2K RJqE2S$(HC4QJ q)_l( "ҵkU+KnZ -*r;e"CPpa@1h#|=1@KSqظl Z< 0Smz%_HHjSPup -IGR|pIpkigނb|M %cJy&)]&hg$|00Sc1x H91ݶ ixrV8nXŹx;cǃf!Ihi`pӐ> rt*ܰ8|rsEI ED0ˊoh䵚[9~>y&­_ލOk鑍!durWI>@|KJ,SM\}b1-5śdI͕bce>׿\z^Wӆxk -endstream -endobj -616 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 827 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -617 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 828 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -618 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 829 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -619 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 830 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -620 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 831 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -621 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 832 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -622 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 833 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -623 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 834 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -624 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 835 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -625 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 836 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -626 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 837 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -627 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 838 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -628 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 839 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -629 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 840 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -630 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 841 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -631 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 842 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -632 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 843 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -633 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 844 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -634 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 845 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -635 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 846 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -636 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 847 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -637 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 848 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -638 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 849 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -639 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 850 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -640 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 851 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -641 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 852 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -642 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 853 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -643 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 854 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -644 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 855 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -645 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 856 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -646 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 857 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -647 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 858 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -648 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 859 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -649 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 860 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -650 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 861 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -651 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 862 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -652 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 863 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -653 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 864 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -654 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 865 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -655 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 866 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -656 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 867 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -657 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 868 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -658 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 869 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -659 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 870 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -660 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 871 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -661 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 872 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -662 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 873 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -663 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 874 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -664 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 875 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -665 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 876 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -666 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 877 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -667 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 878 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -668 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 879 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -669 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 880 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -670 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 881 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -671 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 882 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -672 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 883 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -673 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 884 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -674 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 885 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -675 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 886 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -676 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 887 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -677 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 888 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -678 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 889 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -679 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 890 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -680 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 891 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -681 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 892 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -682 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 893 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -683 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 894 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -684 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 895 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -685 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 896 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -686 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 897 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -687 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 898 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -688 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 899 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -689 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 900 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -690 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 901 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -691 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 902 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -692 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 903 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -693 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 904 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -694 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 905 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -695 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 906 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -696 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 907 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -697 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 908 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -698 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 909 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -699 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 910 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -700 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 911 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -701 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 912 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -702 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 913 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -703 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 914 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -704 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 915 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -705 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 916 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -706 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 917 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -707 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 918 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -708 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 919 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -709 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 920 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -710 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 921 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -711 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 922 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -712 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 923 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -713 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 924 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -714 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 925 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -715 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 926 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -716 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 927 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -717 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 928 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -718 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 929 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -719 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 930 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -720 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 931 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -721 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 932 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -722 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 933 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -723 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 934 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -724 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 935 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -725 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 936 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -726 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 937 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -727 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 938 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -728 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 939 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -729 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 940 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -730 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 941 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -731 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 942 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -732 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 943 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -733 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 944 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -734 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 945 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -735 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 946 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -736 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 947 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -737 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 948 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -738 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 949 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -739 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 950 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -740 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 951 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -741 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 952 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -742 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 953 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -743 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 954 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -744 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 955 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -745 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 956 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -746 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 957 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -747 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 958 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -748 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 959 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -749 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 960 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -750 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 0 0 0 1] -/Function 961 0 R -/Extend [ false false] -/Domain [ 0 1] -/ShadingType 3 ->> -endobj -751 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 962 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -752 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 963 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -753 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 964 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -754 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 965 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -755 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 966 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -756 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 967 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -757 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 968 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -758 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 969 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -759 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 970 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -760 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 971 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -761 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 972 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -762 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 973 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -763 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 974 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -764 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 975 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -765 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 976 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -766 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 977 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -767 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 978 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -768 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 979 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -769 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 980 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -770 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 981 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -771 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 982 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -772 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 983 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -773 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 984 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -774 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 985 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -775 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 986 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -776 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 987 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -777 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 988 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -778 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 989 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -779 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 990 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -780 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 991 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -781 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 992 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -782 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 993 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -783 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 994 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -784 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 995 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -785 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 996 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -786 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 997 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -787 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 998 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -788 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 999 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -789 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1000 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -790 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1001 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -791 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1002 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -792 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1003 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -793 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1004 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -794 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1005 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -795 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1006 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -796 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1007 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -797 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 0 0 0 1] -/Function 1008 0 R -/Extend [ false false] -/Domain [ 0 1] -/ShadingType 3 ->> -endobj -798 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1009 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -799 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1010 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -800 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1011 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -801 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1012 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -802 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1013 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -803 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1014 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -804 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1015 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -805 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1016 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -806 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1017 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -807 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1018 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -808 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1019 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -809 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1020 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -810 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1021 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -811 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1022 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -812 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1023 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -813 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1024 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -814 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1025 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -815 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1026 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -816 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1027 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -817 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1028 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -818 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1029 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -819 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1030 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -820 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1031 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -821 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1032 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -822 0 obj -<< -/ColorSpace 823 0 R -/AntiAlias false -/Coords [ 0 0 1 0] -/Function 1033 0 R -/Extend [ true true] -/Domain [ 0 1] -/ShadingType 2 ->> -endobj -823 0 obj -[/ICCBased 1034 0 R] -endobj -824 0 obj -<< -/Subtype /XML -/Length 16788 -/Type /Metadata ->> -stream - - - - - application/postscript - - - Adobe Illustrator CS2 - 2008-05-07T15:15:31+02:00 - 2008-05-13T12:05:55+02:00 - 2008-05-13T12:05:55+02:00 - - - - 256 - 108 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAbAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWP+ffO2k+SvK175h1MlobVaRQKaPNM20cSV 7se/Yb9sMY2USlQfFHnv8+/zH833Uvq6nLpmmOT6WmWDtDGErssjIVeX35mlegGZMYAONKZLz5Lm 4Sf6wkrrcBuYmDEPyO9eXWuSYPoTyt+bn5kflfdaXb+b7n9P+VdSRHgkeUS3cURAPKNmPqfCCPge q9lIyuUAW2MyOb6o0bWdM1rSrXVdLuFutPvIxLbXCfZZT89wR0IO4O2UEU5AKMwK7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+dP+cz7u4Xy35btFJ+rzXk8 sg7c4ogqfhK2XYmnNyfNl35F822eg/p6702WDTKrWaSiMBIeKMYmIkCMej8eJ8cutppA6J5f1vXb 0WWj2U19dEcjHCpbitacmPRVqep2xtQE787+TPOXl+LTrnzIGDXySLAkjMzx+g3BkcMBTxUrVWG4 JwApIL6I/wCcNvMs915b1zy9M5ZdMuIrm1BP2Uu1YOq+weHl82yrKG3EX0TlLc7FXYql/mC81Cy0 a7vNPgW5ureMypA5IDhd2ApvXjWnvlWeUowJjuQ3aeEZTEZGgUl/L7zwvmrT7iWSJLe8tZOMsCEs ODCqOK+NCPoyjR6rxQb5hyu0ND+XkADcSn+rarY6Tp0+oX0gitrdeTt3PgAO5J2AzJyZBCJkeTh4 sUskhGPMsW8ieddc803FxOdOjtNIhJVZyzM7v+yi9FqBux/rmHpNVPKSaAi5+v0WPAAOK5lmmZ7r HYq7FXYq7FXYq7FXYq7FXYq84/NT88fK/wCX4FpKjalrsic49MhYLxU/ZaaQhvTB7bE+1MNK87g/ Nn/nJPWV+u6P5Lhh09vihEtvMGZT0PKWaLn81UY0qa+S/wDnJWZteXy5+YOjny9qbusQuQskcIkc 0Alimq8Snaj8mHjQb40r3bArxDz5/wA5HSWfmKTyv5F0dvMWsxO0UkwDvEJU+0kcUPxy8f2m5KB7 4aVI5/zY/wCcldJhOo6r5Mgk05BzmVLebkqdz+7nkZKU3LKaDrjSvT/yn/N7QvzE02WS1iay1S0C /XtOkYOUDdHjcBeaGnWg9xiQrPMCuxV2KvGf+cjdPgvLv8vEuChgk8y2lvMkgBQpMw5cq7caLvlu Pq1ZOjA7vzXH+Z/5XazpcqwP5iRHng02CCSCSynt7xEhgeWZ2WZriFiaqF40evtXn1GPDvOQiPMr GBmKAsoXQNTT8n/yqF3JpqTa9fa59UvJpY3FLdU9T1EVzEX/AHalY9+HIt71jh1mHPKsc4y2vYi1 ljlAbhr88dT0zzp+Tul+cVeKS5sNVl0+3vIopIVuITzFVjkPOPmqKzKxbiwIBpvmTHY0wnuLQ/8A zhlcFfN3mC3ptJp6SE1/33MB0/2eDLyTh5vrXKG92KuxV2KvG3UeQfzOD7RaJqvc7IkUrb+w9KQf 8D880f8Ai+f+ifuP6nph/hek/wBsh+j9Y+1vVr3UPzK80JpWnM0XlywblNcUoD2MpB/abpGp+fjh ySlqsnDH6B+L/UjDCOhxccv72XT9H63qkFvpug6L6UEYhsNPhZuK9kQFmO/Unck+ObYCOOG3KIdB KUss7O8pFCeUfMf+ItI/Si2xtoJJXS3Vm5MyIePI0AAJau2Q02fxY8VU2avTeDPguzSdZkOK7FXY q7FXYq7FXYq7FUg8/ea4PKfk7VfMMwDfUIC0MbdHmYhIUP8ArSMoxV4V/wA43/l//iW/v/zJ81D9 IXc10404TgMrTg8pbkqRSqseMf8AKQdtloSr6UwK8Z/5yk8m2Oq/l7Lr4iH6T0N43jnUDm1vLIIp Iye6guH9qe5whU+/JbzDqfmP8nNOuTIW1WK3mshKx3MluWiiYt4lQhJ8cSrxv/nFbzH5Z0PzBrun a9JHYa5eeklpcXZEZPpM/rQcnpxcsVNK/FT2wlX1YrBgGU1U7gjoRkVeTeSPySvPK35par5uttQh XS9R+tBdLijZSiXEgkVa140Vl6DDavWcCuxV2KvHf+cnrAXvlLy7EZmtlHmG05XKU5xhoLhQV9y5 UD3wTyGEJSAuokoMeIgebvL+m6SyvepbwfWZp3upGjjjT9/LXnKAgADNyNTnlXamszZchMyd/u7v c7zHjjEUE3ltrH0Zo5YovRuK/WEZV4ycgFPMHZqjbfNbGc7BBNx5eXuZkXs8X/5yPhsYfJWg2VhI LW0sr10tNJgVIoCJY3Z5BEoBJRgACNhzPjnfeyuv1OWcoZCZxEbs7kG+V+e/Pu2dV2jgjGII2Nsc /wCcUfMEOkfmstlct6a6vZzWKBqgesGSdK+/7kqPnnZ5BYdbiNF9rZjOS7FXYq7FXiv5iazP501t dE0C2F5HpayytcoKlyq/vOLfybBR/M1PbNFrMpzz4YC+F6js7CNNj8TIa4q2/H4DKPyU1DTZvLEl nBEsV7ayn65T7UnqVMch+gcf9jmX2ZOJgQOYcDtvHIZeI/SRt+pf+cUOop5ea+g1SS0t4l9CWxjB pc+uyqQ7Bl2C124nvj2kJcFiVDu77R2PKPi8JjZO991IXQdF1Xyl5Lu9VuNXlmj/AEaXttOKlI7e aYBxQ82BPqNStBkMWKWHEZmR+nl3Es8+aGoziAiB69z3gfsS7yvpf5heaNBt559fm0qxXn6M6l3u JzyJLsweNgo+yPi7dO+V6fHmywsyMY/a36rLpsGQgQE5fYPvRNrqHmDzrqVyLDWH0by3YP6EU8T0 uLhlp8RaqtuN+tBUbE1wxnPPI1LhgPmWuWPHpYjihx5Zb+QVrK917yr5x03SrrWJNa0fWCyRvOfU ljlFAPiJY/aK96UPTJQnPFlETLijJjOGPUYJTEOCcO7ku1LWte81+ZrzRdH1L9D6Pph4Xt+hpLJK CQVQgqeoIFCOlT2GHJlnmyGEZcMY9UYsOPT4hknHjnLkOlIa9n17yVrGm3B16XWdHvp1t7qG7f1H j5U+JSWbtUilOlDkJyngkDx8UTzbIRx6qEhwCE4ixSK8/a35mPnXR9E8vTmO5aJpXTkRGS5O8oHU IsfKh+7J6zLk8WMIHf8AHNr7PwYvAnkyja/xXvtKvOdp5t8o29jrI8y3V/dS3IjltXLCFiVL/DFy ZePw0Ip3yrUxyYQJcZJtyNFPDqDKHhxiK59fmj9X8u+eX0G88wal5juLG/hge6GnWrNHBGEUv6R4 utWoONfH+bLMmHNwGcpkGrppw6nT+IMccYlEmrPP3/j7GG/ndrWqah/zj3YXd69bm8vIEuGoBzVH l4k08fTVjmdo5meME83Xa/FHHmlGPIPRfyKt4Lf8pPLKQABGtTI1Kfbkkd36f5THMkuGzvAryn/n JvXoNM/Ke/tWcLcatNBZ267Emkgmk2Pb04mFffCFRH/OPOnjRvyi0QXjrDJe+teAOQvwzSs0ZFad Y+J+nEq1+YX/ADj55E863smqt6umatNvLeWZXjKafaliYFWPutCe5xtXlut/lB+cf5aWM2seT/M8 t/plirTT2kZeJhGg5FjaSGWCQKK13r4DG1es/kZ+aU/5geVpbm/iSHWNOlEF8IgRG/JeUcqgk8eQ qCK9R4YlXpGBXYq7FXz5/wA5BfmFpWo+avLP5d2C/W70azYXOqOlSIv3gWOAU6uwk5N4Cnjtdjj1 ackujIb7yPr+mX3PSFeS2Y1MHNUdParkAr4b1/XnKdodhmRvGAQenc7bBrI169imOleWfMd7MEuo fqyr1d3EjkE1NCGcAfM/RmDpvZqZl+8PDHyr9Dbk18QPRuUr/Oz8p01b8u76W2YPqWjxtqFkwU8w 0K85EUj4m9SMEU8aHtnX6PT4sA4cceEff73UZpSnuTb5Q1fz7qF9qukazb20On6xpKxH69bLxeaa AgxzSeLDgOuZ9ONb7x/Lvzrp/nTyhp3mGyIH1qMC5gBqYbhNpYj3+Fuleooe+Y0hRcqJsMjyKXYq 80/M3ztdGceU9A5S6ndkRXTx9VD7ekp/mYfaPYfhqtdqjfhw5nn+p3nZmiFeNk+kcv1sm8h+TLXy vpAh2k1Cej3twO7Doi/5KV2+/MvSaYYo/wBI83B1+tOed/wjkGA3xPkP8zluwPT0XVql6bKqSt8f /IqT4v8AV+ea2X+D57/hP3fsdvD/AAvSV/HD9H6x9qdfnRdwta6Hpk0np217eepNLWgEcQCMSfAe tXMjtOW0Y9Cfx97i9iwNzmOcY/f/AGIj82dYtpPI6xafLHcR6jcxW8bQMrqQhLkKVqNmjAyXaGUe F6Tdlh2ThI1FyFcIJ3/Hmy0aXJa+WP0Xa7SQ2X1aEj+ZYuCn78y/DIxcI58NfY67xeLLxnrK/teS +QPK3kHV9JYavMYNXt5HW5heb0Txr8LBWptTY++afSYMM4+o1L3vRdoarUY5+gXA8trTnyxof5fy edBaaJbXF0+m0uG1ETcrdXQ7D/K+Lb3+WXYMWE5agCeHe72cbVZ9SMF5CBxbVW6SeTfK/lDUb7Vr HzLK0GsW904VHm9LknenL7RDAk+2UabBjkSMhqQLlazVZoRjLELgY91ppB5b/LY+bbTRdLt7jULj +9muYZw8MPD4vjO4NKb/ADA65aMGA5BCNy+Ljy1Oq8E5JkRHdW5Tjyv/ALk/zW8x6l9qLTo1s4+4 V6hDT6Yn+/MjB69ROXdt+hx9V+70eOP843+PmGvP/wDuS89+VNEG6pIbyZPFVblv/sYXwaz15oQ+ P4+S9n+jT5cnw/HzCZ/m5qX1LyRdoDxe8eO2T/ZNzYf8AjZd2jOsR82jsjHxZx5boDzz+Xkuv/lD L5UtwFv47OFrSpABurfjIASdh6jKVJ98ycEOGAHk4WoyceSUu8l5T+Q3506X5V01/IvnZpNLm06a RLO5nRuMYZizwTUqyMshYqSKUNNqCtxDS9d1b88fyp0yze6l8x2lwFG0No/1mVj2ASLkd/egxpXh creZv+cgvP8AbulvJp/knR3Kl2/YiYhnqwqpuJgBsuyinWlSeSs3/wCcpvJVzc+QdJvNItq2nlyQ rLbxD+6tHjWPkB14xmNAfAb9BgCpx+V//OQHkHU/K+n2usanDpGs2dvHBeQ3R9KNmjUJ6kcjfAVf jWlajp740qr+ZH/OQf5f6P5dvI9J1KHWdYuYXis7a0Pqxh3XiHlkAKBVrUitT0A8GlSj/nFHyXqe ieU9R1rUIWt316WFraJwQxt7cOEkKnoHaVqeI36EYlXuOBXYqwX85vzJt/IHkq51VSrarcf6NpMD b8rhx9sjusY+Nvu75KEbLGcqDxz/AJxY/Lo6nf3P5j+YW+t3sskv6JErc3aVmZZ7t/8AK58kWu9e Rp9k5bkl0asUer6baNGNWAJyhvbVFX7IpiqySS3oUkdKEUKsRuD2ocVfnf8Amd5Ubyn5+1vQeJWG 0uXNrXvby/vID/yLdcy4mw4khRZd+QH5xS+QPMJs9QZn8s6q6rfpufQk+ytyg9ujjuvuBkZxsMoT ovuSGaKaJJoXWSGRQ8ciEMrKwqGUjYgjMZyV2KpNpvk7y1pmoNqNlYrHfPy5XBZ3f4zVjV2bc9zm Pj0uOEuIDdycusyzjwyl6e5OcyHGS3W/Leh65HFHqtot0sBLRciwKltjQqVO9Mqy4IZPqF034NTk xXwGrU9T8qeXtUsLew1CzW4tbUBbdWZwyAALs4YP0G+++Rnp4SiIkbBOLV5McjKJonms/wAHeWvq djZmxU22muZLKLk9I3LcyftfF8W/xVwflcdAVtHkn85l4pS4t5c05zIcZjur/l75O1a7a7vtNR7l zWSVHkiLHuW9NkBJ8TvmNk0eKZsjdzcPaGfGOGMtvn96aaPoWkaNa/VdLtUtYSasEG7HxZjVmPzO W4sMYCoinHzZ55TczZQGueRvKuuT/WdS09JbmlDOrPE5oKDkY2XlT/KyvLpMczchu3YNdmxCoy2R Wh+WNB0KN00qyS1En22FWdqdi7lmI+nJYsEMf0imvPqsmU+s2qaXoWk6XJcyWFuIHvH9W5YFiXep NTyJ/mOHHhjC+Ec0Zc88lCRvh5OfQtJbV01l7cHUo4/SS5JaqpvsBXj+0e2Jwx4uOvUozz4OC/T3 KOtaf5d1SOKPVRDNHA4miWSTiA4FOWzLX6crzeFL6yPmyw5MuMkwsXsrvruhps+o2y16VmjH6zid ZhH8cf8ATBgMGQ/wn5MM84+Vvyc82P6/mCGxubpQF+txyGKeg6AyQsrsB2BqMh/KGAfxx+bMaTL/ ADSxO0/J7/nHeymFw6fWuJBWOa5uHWo/yUK8vka4D2ng/nhkNFm/ml6Jp3mz8vtLso7HTri3srOE Uit4IWjjUeyqgGR/lPT/AM77/wBTL+T83837ldvzA8mEFW1KMqdiCkhBB/2OH+UsH877D+pP8n5/ 5v3PN9d8gf8AOOOr3L3M1vFaXEhq72TXNuvWv90g9IfQuH+UsH877D+pf5Oz/wA37l/l7yV/zjno Nyl3bQw3N1GapLe/WLmhBqCEkBjqOx41w/ylh/nfYU/ybn/m/c9GX8wfJRUU1aAAjYEkfgRhGuw/ zmP8n5/5pV086+UHJA1qyBH808a/8SIywarEf4h82J0WYfwS+RTS1vbO7j9W1njuIzSjxOrruKjd SctjMS5G3HlCUTRFPj78/NYuPPnnXWTBeCPRvKfDTNOt/tvd6hK/F0gjH2naQUYitFQHMuAoOJM2 X09+Xvkmz8r+VtJ0wIv1iytYopWRRGplCD1X4KSKvJyZtzueuUylbdGNJnql/pAljE6m4khY0RBU A9+RJC/s9K1wC1lILo/MWnkgMskSU+2yfCP+BrgpfEC+70fT75fUGzMKrKhqDXofA4RIhJiC+c/+ csfIE36H07zeqBrmyddP1CVf24Hq0Ejf6j1Tx+IeGW45NWSL5y1LQtRsLe3uLm3kt0uI45UWQUPC UExuPFJOLcT7H6bbaiH1d/ziZ+Y0uteWbjylfy877Qgr2LMfiayc0C+J9F/h+TKMoyx6t+KW1PfM qbXYq7FXYqteSOMVdgg8WIH68hPJGAuRA96QCeSFl1nS4vtXKH/VPL/iNc1+TtnSQ55I/Df7rbRg meiDm816VH9n1JP9Vaf8SK5gZPafSR5cUvcP102x0cygZvO0S/3Vqze7OF/UGzDn7WQ/hxk+81+t tjoD1KBm88ahv6UES/63Jv1FcxJ+1OY/TGI+Z/U3R7Pj1JQM3nLXW+zKkf8Aqop/4lyzGl7Q6qXI ge4D9NtsdDj7kBN5m15+t7IP9Wi/8RAymXa+qlzmfu+5tGlxj+FATarqkn95eTv/AK0jn9Zyk6zN LnOR+Jbo4YDkB8kBNJJIau5c9asSevzysyJ5ltAAQ75IMwoPlgZBbHbXM7cYInlb+VFLH8MthCUu QtJkBzKOg8m+aLmnp6bMK9PUHpf8nCuZ2Ps/PLlA/d97TLW4o85D70wg/KvzTP8A3ggt69fUkqf+ SYfMzH2NnPOh8f1W0y7VwjlZTC3/ACZumobnU0j8RHEX/FmT9WZcOxJfxSHy/saZdsjpH7Uxt/yZ 0FafWb25lI68PTjB+9XP45lQ7GxjnIlol2zk6AJnb/lT5Kipzs3nI7yTSfqQoMyI9l4R0v4tEu1c 5618AmVv5G8nwU4aPatT/fkayf8AE+WXx0eIcohplrsx/jl80zttM021p9WtIYKdPTjVP+IgZdHF GPIAOPLLKXMksf8AzP8AOlt5N8jarr0rqs0ELJYoxAMl1IOMKAd/j3PsCctiLLVI0Hyv/wA4reVv 8QfmY2rXtZoNDha+JcluV1KfTiLV7jkz18Vy7IaDRiFl9h6td+jCIlNJJqgf6opyP4jKYhvkUht0 jklCBQscZoFpTfvthJak5EcfHiFHHwyDOlGxd7LU/qW/1e4BeJeoV6FjTwBAP04eix2NIT8yPLie ZPIWvaIRV7yylWD2mRecJ+iVVOGJospCw+B9CmudROqQ3k0k4/RkpVpGZyotFEsQFSaBfT4jwBzK cUMn/wCcevMj6D+begy8uMGoSnTrha0DLdj00B+UvBvoyMxYZYzRfeuYrlOxV2KuxVLtdsPrdi3E Vli+OP3p1H0jNL29oPzOnNfXDcfpHx++nI02Thl5FhbdM8tDt1F8sDIKL5MJUXywMgovkwybh0++ ujS2t5JvdFLD7xmXh02XJ9ETL3BEskY8zSYweSPME+7RJAD0Mrj9S8j+GbXD2DqZcwI+8/qtolr8 Y62mVv8Alqx3ur4DxWJK/wDDMf4Zs8Xs0f45/Ifj7nHl2n3RTO3/AC88uxU9VZbg9/Ueg/4Thmxx 9g6ePO5e8/qpol2jlPKgmlt5b0C2oYbCAEdGZAzfe1Tmfj0GCHKEfk48tTklzkUxVFRQqAKo6ACg zKAA5NBLeFXYq7FXYq7FXYq7FXzP/wA5gaP5r1K+8tx6daXd9pqRXLNFbRySqs4ZAWcRg0PBgFJ9 6d8P5nFi+uUY33kD72ueOUuQJRP/ADhjYCHSPNNw6lLh7q2t5FYEMPRSQ0NfeQ7Uy3KeTHF1e3eZ jLHe2Min4H5RsCNhUqfvP8MrinJzCyP0lV3pRqVqPbJEJVodSXYkcqdvc9MhSBJfD/pOpwPvyjJY sPDiR9xrkjyZcyneQZvzws7R7WTzDJAqhphNZWSkrGrLJLSQry49EWg+eZduJSA8n2V//jfQrWKN heNqNosKjrzM6BaH54SdkAbv0ezDcx2KuxV2KuxVhev2H1S+biKRS/HH7V6j6Dnl/b+g/L6g19E9 x+kfD7qdvpsnFHzCWJBNM3CKNpG/lUEn8M1eHDPIagDI+QtyDIDmmFv5U1WehdVgU93O/wBy1zfa b2b1WTeQEB5/qDRLWQHmmlt5Jslobmd5T4LRF/42Ob7T+y2KP1yMvdsP0uNLXy6Ck0tdB0i2oYrW PkOjMObfe1c3ODsvTYvpgPjv97jT1E5cylOo+fNLsdXudIisdQvrqyWJroWNpJcJH6ylo1Zk2BKi tMzwGlkFvdRTRxsDxeReXpPQOvSoZa7Fa0OKoPVtf0vS7H67cy8ofXgtR6X7xjNczJBEgC9zJIuK rdU8x6XppsRO7O2pTNb2iwr6hZ0hkuG2XsscDGv0YqirK/gu7W3uF5RfWUWRYZh6cq80D8HjPxK4 U7qemKq4miLcQ6lqlaVFeQFSPnTfFUFBrmn3Gt3mixMzX1hBBcXS8TxVLlpFiHLpyPosaYqvs9Vt bpJXXnCIZZIT66mIsYn9MunKnJC32WGx7YqivVi3+NdmCHcbMaUHz3xVpZoX48ZFbmOSUINQO4xV firsVQtzqmnW3MTXCK8dOcYPJxWlPgWrd/DMPUdoafDfHOII6Xv8ubZHFKXIMM1K6+vXktw67Psi t+yg+yOrfTTvXPMO1NedTnlk/h/h93T9Z83bYcfBGlLyemnaHr12Vi9JdcaISSrsvrxBlTkPF1bj y67KPl0vs32wdsGQ7fw/q/HVxtVpwfUOfVnV/YxXluYXPEgh43G5Vl6HO3BdbIWkl1a3FoGaRSYl 39RQSKe9MnYYHZC2ZM5KWSFyep4txB/ymIoMdmMTfJkWn2ItkLMeUrfaPgPAZAm20Bh2qaleTeYN QWO8mFvCY0iSKR0UViVm2QrvyJzgPaHtDPj1JjCcojbka6B2umxxMAaDzLWPyE/LvU71bs209rJ6 hlmSGd+EtTUowkL8V/4x8cxcHtXrIAgmMveOXyr7bYy0GIm6pNvL35TeQPL+tWWtabpfHUNPkEtt JJPcSAMBT7Luy9/DbBj9qdaJAylxR6io7/YyOhxdB973PPSXVuxV2KuxV2KqF1ZWt0EFxGJAh5KD Xr9GYmq0OLUV4keLhNhnDJKPJVihiiXhEixqP2VAA/DL8WKGMcMAIjy2YmRPNdliHYq7FXlek6bq 0fnDXLrUdD19ZdU1jlFf2V3BFZfVYljtreSRFu43ZRHDzasRahpQ9MKpJe/l35jg0nTdX0zQ0fzb LDrOoalNJIqSfWNQV1W0aVJEbpeOyhHC8kryBNSqkemflz5lsA4XyhNPpU19pct3pZOn23q2dglw WqkUro0vryIxWR2ZlCguSTRVN5Py780tY30FhpDaXp2oHVLiy0xZIibM6r9UsQlFdo0KQfWbhlQ8 V5cVqcVTK68gzwpHrj6bHaamddvNTn1KYqz2On2cE0dpRgXYLIlvb1RK9fiG2yqA/KOLTtT80aI9 ppkFnLoOjyy6tdwXMF213fXsixxzySwNJzLpHO6tIefxnam5SrL9HvfMGl+cPM1xdeWtSul1a/hW zvbc2Zt1tLe3jgjZjJcxygcxI5AjPXudsVYf/wAqs1fUfLGqfpnSFuNXfRoLPToZTG6xX9/LPdX9 wo5lecU939rr8B4nfdtU1/RXm+C4ezby7czW0fmOfWbu8EtqVuYLRGbT1iX1OfNjBbqS6rxI+5VO fys8napoN7qj6zZqly/F9NmikMkFtaXLNO+nQBiWUW87NVqDmCvhxVKvRMCoXVXaPS7yRGKskEjK ymhBCEggjMXXSIwTMdjwSr5M8Q9Q97A0ChBx2Wm2ePHm7xdgVSubeO4geFxVXFMnCZibCss8o63J qNi9vdGuo2JEd0aU5g19OQf64G/uDtSmeq9kdoDU4Qf4hzdRqMXBLyKe5tHHdirjuKYq8ttf+Otq i1rxlQV/55Lnm/tT/jZ9w+4O20f90Pj96Ozm3JdirJdC1/mFtLxvj2WGY1JbsFb/ACvfv8+vf9h+ 0Ay1hzbT5CX873+f3+/nrdRpq9UeSf51rhOxV2KuxV2KuxV2KuxVbM7Rwu6oZGVSyxggFiBWgLED f3OKvK/Kv5p+YbnT7u+vNJudTmlR9XisrP6qiWekOzi1LSvKvqSSrE5C/aJU9FpU0rLNB8/wa9r0 2naVpt1NY2yRPdaw3ppbIbi2S6ijAZ/UZykq8gq/D3wKxu//ADM8zDVZrS30eRozr6aTp6Q+i81x Fb2xuLz7cwQHlGVDHiFBFdwaGlXTfntoUVjDM2nTrdC3mu9QspJ7OGS3jt7iW2dQZZkWZzJbycFi qSBXaoq0rI/NPmTUli0Ox8vmMah5jnEdrdzxs8UFusDXEs7RgpyIjSiKSKsRXArEdP8APcPlq71W J7pfMEEf1RUtrOw+pai13dXRthH6fGGGZG6qwNdmG+FU2sfzMvZtQu7UaReXWptM0NvoUQthLCtp BDJdyPcGf0WVXukSvIfH8Kg7tjSp75A8w3vmPQH1q4jMMN1d3YsIXT05EtYZ3hiEi70ciPkfngVk mKuxV2KoTV3aPSr11NGSCVlPgQhOY2tmY4JkcxGX3M8QuQ97BE48Bx3FNs8dLvF2BXYqlmq6jqGh uNd0yOOW7t0ZHt5SVSaNt/TZlDFdwCGAND2PTN52DrjgzC/pPNqzY+OJDflj/nJf8rNZiCX18+g6 gp4zWWoxsnBhsw9VQ0VK+LA+wz1PgPTd0XiDqm+rfn3+UWmW7TTeZrWegqI7QtcufYCEP+OPhlTk DwH82P8AnKnVvMFtPo3k+GTSdLlDRz6jIQLyVDsQnEkQqR4Et7jLY465tUsl8mf/AJL26w+QdNIF OcSEj3KAn8TnlHtHMy1cvIvQ6cVjj7mdZom5TnuIIIzJM6xoOrMaDJQgZGgLKo+w8v6jqYpNG9lY ts7yjjM61IZUjPxL0+04HiAc6rsz2ayzkJ5fRHu6/scTLqox2G5ZznoDq3Yq7FXYq7FXYq7FXYqo 3tqLuzntTI8QnjeIyxkB15qV5ISGHIVqKjFWJXf5W6TLHHBaajfadZNp1vo9/aWrxKt1ZWiusMcj PE7oQJWBaJkNCR8jap/5f8t6doMF1BY8/Tu7l7uQOVNGcKoReIWiIiKijrQdTgVLtL8g6Vp2sJqc V1dSNFcX13DayvG0KTakVadhSMSH4lYryc05sOnEKqkT/kp5fD2zWup6nZhLWOyv/q80aNexRSNK GnYRchIXkbk8XA0JHfDasn8y+VLTXIbKlzPp19pk31nTdQtCglgk9NojQSLJGysjlWVlIIwKldr+ WmmR6sur3epX+oakbm1u5p7l4aSPZxTRQqUjijRIx9ZZ+KBfiofGrauP5a6fHdre2OqahYXxkvnu LuB4fUmj1GcXE0Ll4nAVXVRGUAdANmxtU/8ALuhWegaFYaLZM7WunwpbxPKQ0jBBTk5AUFm6tQDf FUwxV2KuxVbJHHLG0cih43BV0YVBUihBGCURIUdwUg0xq78h2Z5NYXc1mxpxQkSxrT/Jaj/8PnPa j2a08943H7R+v7XLhrZDnultz5P8zwNW1ura8jC1IkDQuSOwAEi/ewzV5vZI/wAEgfs/W3R1seoS a71GTTXEWr2sthKfs8wDGxoCeEiko1K70O2c9qux8+E1IOVDJGXIsX8x+ZGvwNO0uCS7uZvhit4V LyO3sB+voO+ZvZfZWScxsuTIICyxPSP+cQNb1WeTU/MutxaZLdyPPJp9nH9ZZPUYtwMzNElVrvRW GenY5CEREdBTz0oGUiT1ZPbf84a+Qlp9Z1rVZdvi9NreOp9uUUlMPilfBDr7/nDXyG8LCw1rVIJi p4vObedQ3YlUigJHtyx8Ur4QRnlK4ttAin8tahKIr3TJngYsCgcKaK6hqHi60ZfEHPL+3dHk8eUg HoMRuAruZRDdpdTra2FLy7cVSGIg0UEAu56IgqKsf10Ga3R9m5tRPhjH9iZzERZZfoPlmKwC3V7w udUNSZqfBFUU4QA/ZFDQt9pu+1FHpHZnZGLSx2Fz6ydXm1BmfJPM2rjuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRvfqX1Sb696f1PifX9fj6XDvz5fDT55GdV6uSY3 e3NBaF/hn0ZP0D9S9HkPW+o+lx5U25eltX55HFwV6KryTPiv1c0zyxi7FXYqx/zL/gL1k/xJ+jPr Ppn0fr3oet6dTX0/U+Olf5e+UZfD/j4fi24+P+G1Xyx/g305v8NfUaUj+s/UfS5U+L0/V4fF/NTl 74cPh16K+CMnH/Fad5c1uxV//9k= - - - - - - uuid:E5FA3B3F1DD811DD86BDF21B8BE353A9 - uuid:9149C83E227611DD96FDE93621064FD0 - - uuid:E5FA3B3E1DD811DD86BDF21B8BE353A9 - uuid:C90DC6BE1DC111DD86BDF21B8BE353A9 - - - - - -endstream -endobj -825 0 obj -<< -/OPM 1 -/BM /Normal -/CA 1 -/OP false -/SMask /None -/ca 1 -/AIS false -/op false -/Type /ExtGState -/SA true ->> -endobj -826 0 obj -<< -/OPM 1 -/BM /Normal -/CA 1 -/OP true -/SMask /None -/ca 1 -/AIS false -/op true -/Type /ExtGState -/SA true ->> -endobj -827 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1035 0 R] -/Bounds [] ->> -endobj -828 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1036 0 R] -/Bounds [] ->> -endobj -829 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1037 0 R] -/Bounds [] ->> -endobj -830 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1038 0 R] -/Bounds [] ->> -endobj -831 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1039 0 R] -/Bounds [] ->> -endobj -832 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1040 0 R] -/Bounds [] ->> -endobj -833 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1041 0 R] -/Bounds [] ->> -endobj -834 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1042 0 R] -/Bounds [] ->> -endobj -835 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1043 0 R] -/Bounds [] ->> -endobj -836 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1044 0 R] -/Bounds [] ->> -endobj -837 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1045 0 R] -/Bounds [] ->> -endobj -838 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1046 0 R] -/Bounds [] ->> -endobj -839 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1047 0 R] -/Bounds [] ->> -endobj -840 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1048 0 R] -/Bounds [] ->> -endobj -841 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1049 0 R] -/Bounds [] ->> -endobj -842 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1050 0 R] -/Bounds [] ->> -endobj -843 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1051 0 R] -/Bounds [] ->> -endobj -844 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1052 0 R] -/Bounds [] ->> -endobj -845 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1053 0 R] -/Bounds [] ->> -endobj -846 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1054 0 R] -/Bounds [] ->> -endobj -847 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1055 0 R] -/Bounds [] ->> -endobj -848 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1056 0 R] -/Bounds [] ->> -endobj -849 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1057 0 R] -/Bounds [] ->> -endobj -850 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1058 0 R] -/Bounds [] ->> -endobj -851 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1059 0 R] -/Bounds [] ->> -endobj -852 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1060 0 R] -/Bounds [] ->> -endobj -853 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1061 0 R] -/Bounds [] ->> -endobj -854 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1062 0 R] -/Bounds [] ->> -endobj -855 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1063 0 R] -/Bounds [] ->> -endobj -856 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1064 0 R] -/Bounds [] ->> -endobj -857 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1065 0 R] -/Bounds [] ->> -endobj -858 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1066 0 R] -/Bounds [] ->> -endobj -859 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1067 0 R] -/Bounds [] ->> -endobj -860 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1068 0 R] -/Bounds [] ->> -endobj -861 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1069 0 R] -/Bounds [] ->> -endobj -862 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1070 0 R] -/Bounds [] ->> -endobj -863 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1071 0 R] -/Bounds [] ->> -endobj -864 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1072 0 R] -/Bounds [] ->> -endobj -865 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1073 0 R] -/Bounds [] ->> -endobj -866 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1074 0 R] -/Bounds [] ->> -endobj -867 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1075 0 R] -/Bounds [] ->> -endobj -868 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1076 0 R] -/Bounds [] ->> -endobj -869 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1077 0 R] -/Bounds [] ->> -endobj -870 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1078 0 R] -/Bounds [] ->> -endobj -871 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1079 0 R] -/Bounds [] ->> -endobj -872 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1080 0 R] -/Bounds [] ->> -endobj -873 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1081 0 R] -/Bounds [] ->> -endobj -874 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1082 0 R] -/Bounds [] ->> -endobj -875 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1083 0 R] -/Bounds [] ->> -endobj -876 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1084 0 R] -/Bounds [] ->> -endobj -877 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1085 0 R] -/Bounds [] ->> -endobj -878 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1086 0 R] -/Bounds [] ->> -endobj -879 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1087 0 R] -/Bounds [] ->> -endobj -880 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1088 0 R] -/Bounds [] ->> -endobj -881 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1089 0 R] -/Bounds [] ->> -endobj -882 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1090 0 R] -/Bounds [] ->> -endobj -883 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1091 0 R] -/Bounds [] ->> -endobj -884 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1092 0 R] -/Bounds [] ->> -endobj -885 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1093 0 R] -/Bounds [] ->> -endobj -886 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1094 0 R] -/Bounds [] ->> -endobj -887 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1095 0 R] -/Bounds [] ->> -endobj -888 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1096 0 R] -/Bounds [] ->> -endobj -889 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1097 0 R] -/Bounds [] ->> -endobj -890 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1098 0 R] -/Bounds [] ->> -endobj -891 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1099 0 R] -/Bounds [] ->> -endobj -892 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1100 0 R] -/Bounds [] ->> -endobj -893 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1101 0 R] -/Bounds [] ->> -endobj -894 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1102 0 R] -/Bounds [] ->> -endobj -895 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1103 0 R] -/Bounds [] ->> -endobj -896 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1104 0 R] -/Bounds [] ->> -endobj -897 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1105 0 R] -/Bounds [] ->> -endobj -898 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1106 0 R] -/Bounds [] ->> -endobj -899 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1107 0 R] -/Bounds [] ->> -endobj -900 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1108 0 R] -/Bounds [] ->> -endobj -901 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1109 0 R] -/Bounds [] ->> -endobj -902 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1110 0 R] -/Bounds [] ->> -endobj -903 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1111 0 R] -/Bounds [] ->> -endobj -904 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1112 0 R] -/Bounds [] ->> -endobj -905 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1113 0 R] -/Bounds [] ->> -endobj -906 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1114 0 R] -/Bounds [] ->> -endobj -907 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1115 0 R] -/Bounds [] ->> -endobj -908 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1116 0 R] -/Bounds [] ->> -endobj -909 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1117 0 R] -/Bounds [] ->> -endobj -910 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1118 0 R] -/Bounds [] ->> -endobj -911 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1119 0 R] -/Bounds [] ->> -endobj -912 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1120 0 R] -/Bounds [] ->> -endobj -913 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1121 0 R] -/Bounds [] ->> -endobj -914 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1122 0 R] -/Bounds [] ->> -endobj -915 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1123 0 R] -/Bounds [] ->> -endobj -916 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1124 0 R] -/Bounds [] ->> -endobj -917 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1125 0 R] -/Bounds [] ->> -endobj -918 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1126 0 R] -/Bounds [] ->> -endobj -919 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1127 0 R] -/Bounds [] ->> -endobj -920 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1128 0 R] -/Bounds [] ->> -endobj -921 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1129 0 R] -/Bounds [] ->> -endobj -922 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1130 0 R] -/Bounds [] ->> -endobj -923 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1131 0 R] -/Bounds [] ->> -endobj -924 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1132 0 R] -/Bounds [] ->> -endobj -925 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1133 0 R] -/Bounds [] ->> -endobj -926 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1134 0 R] -/Bounds [] ->> -endobj -927 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1135 0 R] -/Bounds [] ->> -endobj -928 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1136 0 R] -/Bounds [] ->> -endobj -929 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1137 0 R] -/Bounds [] ->> -endobj -930 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1138 0 R] -/Bounds [] ->> -endobj -931 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1139 0 R] -/Bounds [] ->> -endobj -932 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1140 0 R] -/Bounds [] ->> -endobj -933 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1141 0 R] -/Bounds [] ->> -endobj -934 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1142 0 R] -/Bounds [] ->> -endobj -935 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1143 0 R] -/Bounds [] ->> -endobj -936 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1144 0 R] -/Bounds [] ->> -endobj -937 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1145 0 R] -/Bounds [] ->> -endobj -938 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1146 0 R] -/Bounds [] ->> -endobj -939 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1147 0 R] -/Bounds [] ->> -endobj -940 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1148 0 R] -/Bounds [] ->> -endobj -941 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1149 0 R] -/Bounds [] ->> -endobj -942 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1150 0 R] -/Bounds [] ->> -endobj -943 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1151 0 R] -/Bounds [] ->> -endobj -944 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1152 0 R] -/Bounds [] ->> -endobj -945 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1153 0 R] -/Bounds [] ->> -endobj -946 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1154 0 R] -/Bounds [] ->> -endobj -947 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1155 0 R] -/Bounds [] ->> -endobj -948 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1156 0 R] -/Bounds [] ->> -endobj -949 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1157 0 R] -/Bounds [] ->> -endobj -950 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1158 0 R] -/Bounds [] ->> -endobj -951 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1159 0 R] -/Bounds [] ->> -endobj -952 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1160 0 R] -/Bounds [] ->> -endobj -953 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1161 0 R] -/Bounds [] ->> -endobj -954 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1162 0 R] -/Bounds [] ->> -endobj -955 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1163 0 R] -/Bounds [] ->> -endobj -956 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1164 0 R] -/Bounds [] ->> -endobj -957 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1165 0 R] -/Bounds [] ->> -endobj -958 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1166 0 R] -/Bounds [] ->> -endobj -959 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1167 0 R] -/Bounds [] ->> -endobj -960 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1168 0 R] -/Bounds [] ->> -endobj -961 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1169 0 R] -/Bounds [] ->> -endobj -962 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1170 0 R] -/Bounds [] ->> -endobj -963 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1171 0 R] -/Bounds [] ->> -endobj -964 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1172 0 R] -/Bounds [] ->> -endobj -965 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1173 0 R] -/Bounds [] ->> -endobj -966 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1174 0 R] -/Bounds [] ->> -endobj -967 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1175 0 R] -/Bounds [] ->> -endobj -968 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1176 0 R] -/Bounds [] ->> -endobj -969 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1177 0 R] -/Bounds [] ->> -endobj -970 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1178 0 R] -/Bounds [] ->> -endobj -971 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1179 0 R] -/Bounds [] ->> -endobj -972 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1180 0 R] -/Bounds [] ->> -endobj -973 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1181 0 R] -/Bounds [] ->> -endobj -974 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1182 0 R] -/Bounds [] ->> -endobj -975 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1183 0 R] -/Bounds [] ->> -endobj -976 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1184 0 R] -/Bounds [] ->> -endobj -977 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1185 0 R] -/Bounds [] ->> -endobj -978 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1186 0 R] -/Bounds [] ->> -endobj -979 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1187 0 R] -/Bounds [] ->> -endobj -980 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1188 0 R] -/Bounds [] ->> -endobj -981 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1189 0 R] -/Bounds [] ->> -endobj -982 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1190 0 R] -/Bounds [] ->> -endobj -983 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1191 0 R] -/Bounds [] ->> -endobj -984 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1192 0 R] -/Bounds [] ->> -endobj -985 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1193 0 R] -/Bounds [] ->> -endobj -986 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1194 0 R] -/Bounds [] ->> -endobj -987 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1195 0 R] -/Bounds [] ->> -endobj -988 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1196 0 R] -/Bounds [] ->> -endobj -989 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1197 0 R] -/Bounds [] ->> -endobj -990 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1198 0 R] -/Bounds [] ->> -endobj -991 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1199 0 R] -/Bounds [] ->> -endobj -992 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1200 0 R] -/Bounds [] ->> -endobj -993 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1201 0 R] -/Bounds [] ->> -endobj -994 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1202 0 R] -/Bounds [] ->> -endobj -995 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1203 0 R] -/Bounds [] ->> -endobj -996 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1204 0 R] -/Bounds [] ->> -endobj -997 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1205 0 R] -/Bounds [] ->> -endobj -998 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1206 0 R] -/Bounds [] ->> -endobj -999 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1207 0 R] -/Bounds [] ->> -endobj -1000 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1208 0 R] -/Bounds [] ->> -endobj -1001 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1209 0 R] -/Bounds [] ->> -endobj -1002 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1210 0 R] -/Bounds [] ->> -endobj -1003 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1211 0 R] -/Bounds [] ->> -endobj -1004 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1212 0 R] -/Bounds [] ->> -endobj -1005 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1213 0 R] -/Bounds [] ->> -endobj -1006 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1214 0 R] -/Bounds [] ->> -endobj -1007 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1215 0 R] -/Bounds [] ->> -endobj -1008 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1216 0 R] -/Bounds [] ->> -endobj -1009 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1217 0 R] -/Bounds [] ->> -endobj -1010 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1218 0 R] -/Bounds [] ->> -endobj -1011 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1219 0 R] -/Bounds [] ->> -endobj -1012 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1220 0 R] -/Bounds [] ->> -endobj -1013 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1221 0 R] -/Bounds [] ->> -endobj -1014 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1222 0 R] -/Bounds [] ->> -endobj -1015 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1223 0 R] -/Bounds [] ->> -endobj -1016 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1224 0 R] -/Bounds [] ->> -endobj -1017 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1225 0 R] -/Bounds [] ->> -endobj -1018 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1226 0 R] -/Bounds [] ->> -endobj -1019 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1227 0 R] -/Bounds [] ->> -endobj -1020 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1228 0 R] -/Bounds [] ->> -endobj -1021 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1229 0 R] -/Bounds [] ->> -endobj -1022 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1230 0 R] -/Bounds [] ->> -endobj -1023 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1231 0 R] -/Bounds [] ->> -endobj -1024 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1232 0 R] -/Bounds [] ->> -endobj -1025 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1233 0 R] -/Bounds [] ->> -endobj -1026 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1234 0 R] -/Bounds [] ->> -endobj -1027 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1235 0 R] -/Bounds [] ->> -endobj -1028 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1236 0 R] -/Bounds [] ->> -endobj -1029 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1237 0 R] -/Bounds [] ->> -endobj -1030 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1238 0 R] -/Bounds [] ->> -endobj -1031 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1239 0 R] -/Bounds [] ->> -endobj -1032 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1240 0 R] -/Bounds [] ->> -endobj -1033 0 obj -<< -/FunctionType 3 -/Encode [ 0 1] -/Domain [ 0 1] -/Functions [ 1241 0 R] -/Bounds [] ->> -endobj -1034 0 obj -<< -/Length 2574 -/Filter /FlateDecode -/N 3 ->> -stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km -endstream -endobj -1035 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OAg4 be2,u„yŘH2;Evy69^XgYILH\`c+$88(=}/=]7;ZN4n~E풪svJ6gY)Xx5735#"HkI!&I@?&&#*%,ሃ[a@ -endstream -endobj -1036 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOAߟP UӊaƜSscFQC -%~|/ʲͰINJfbd`gceaIANF#V4nAA2fbltMQϫ9 Y5sRg$O'DDd~a -endstream -endobj -1037 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA߮a CVUrz^atk9B#}ġΡ_ȮĶF`S7:*OeEyGf1Q&aB  ӽޯyuEs$;u5+ e3 񌒑AO^GNKVCF͓ q bL -endstream -endobj -1038 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA?IV-Lj:cZϕ#YG͛(kj*K-˳{'wmM$R I`g0b1AN=;ڷnh^Ӹn%U U3e#%E=y9#JcR*G$r b -endstream -endobj -1039 0 obj -<< -/Length 57 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H7ڍ B*'[1G3mB kc -endstream -endobj -1040 0 obj -<< -/Length 49 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hڅ܉`oǍ7L"-їP` k -endstream -endobj -1041 0 obj -<< -/Length 39 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hs'qhcAߑ6|V@k -endstream -endobj -1042 0 obj -<< -/Length 33 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H^s'h>c;چF)l6 -endstream -endobj -1043 0 obj -<< -/Length 25 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HVX<: 7l -endstream -endobj -1044 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߰߯ܭ۫۫٩ب֦եդҢѡПϞΜ̛˙ʘȗǖƔœÑ ~}{{ `3 -endstream -endobj -1045 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߰߯ޮܬ۫٩با֦դԣҢѠϟΝΜ̛˙ɘȖǖƔĒѐ - }| `| -endstream -endobj -1046 0 obj -<< -/Length 204 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OAѯVSK{X+,knyyj,ZZ,X9cqQ'y9YziI: cF O o׼:yفlGQtAJSOXH2> -stream -HK/2J2s`) MQILL4"̙{:"HHBR$2|Ģ˟oyy:5LK|2e=[Q(/0k!]x\?G - <4OisQ;l_)V VYx-gYϚ72Gi3uHe`;S zh:,a( -endstream -endobj -1048 0 obj -<< -/Length 200 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /BѯUS \M #ZXd ]nSݒe+ 3n2n0VT-SWY3xM9Ɠc0!ܞ=sD琛\qKOkKm.{<6np좴NIAΙM3k2eHF\.LEsڐY  Ga~ -endstream -endobj -1049 0 obj -<< -/Length 178 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O2d"+V9rsMƔ"z"<,;mMu8W~#B4WO?/c#7CC'O>йmeyGw jf&T ()kiȪTJ2 -җd$$.K=#,_|cb -endstream -endobj -1050 0 obj -<< -/Length 176 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OueE˵0Hss12WzK99)1!>_]]mMuU,}̼L=LL\]  >YZih|anJUϏ e %53y%9Gܓ#~K5 a1+" c -endstream -endobj -1051 0 obj -<< -/Length 177 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OAQs+esX/=ɕQ93RlIlDV1Q~~_XD -1 2 03120t3pws}>i?Ѳ|=;jVTn([0S2Q4R4PГ&#{E)-$5Hj$oJg -brr^Od 0&dQ -endstream -endobj -1052 0 obj -<< -/Length 177 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOм!bʔ%;R9E7BM<{¶ʶ¿̦̟ouqg'E=-if)7|%fr@39óA(SzaBtNh|DGKÓŅzHŁlFيdA2S:h`` / 0Jd -endstream -endobj -1053 0 obj -<< -/Length 176 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiSQFn Ck0ֶkD1nr6y..VOf#~c-b%JLxeg'4$8(0?{LGK÷{D{RdhJB.x?G=C=%k&cB1>A>F:B2 I" `meh -endstream -endobj -1054 0 obj -<< -/Length 170 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOqJ5bLˑur&W2W25ǾϞ;ssSI<8Hsl3lObd`*.XFyaafA&~>y/C8pws}A·Eli=R}GGQ|KIKQCAt"$*e -endstream -endobj -1055 0 obj -<< -/Length 169 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOqbVއy3u/T;ywBZgWcgjFuE\e" V+=;&YFiF)$8[:״h_Һf 3#,vJ/ cG<EÇq~EFq!;f| -endstream -endobj -1056 0 obj -<< -/Length 170 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H SaRQ\Sc)wm, -I6vy:!a* -lo ^`'**we̓,gi -vd kW0K|Q(~}m734\4Nx?(;HlTxR`f -endstream -endobj -1057 0 obj -<< -/Length 162 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H K1TQHT̃BGV(n>v2M\~S19tWXPWv/lٖ扵JcYdY`(,Oi{iSL|%g;~ʛuu0 J?B/LO  -%M? 5/5Í +g -endstream -endobj -1058 0 obj -<< -/Length 161 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H…NBa_A2rhƝrҭĕs-s9q8J E5eafbd7O\\_>,C,< cg^O <]\t(;m+- -3M3G&jFz*:C_+h -endstream -endobj -1059 0 obj -<< -/Length 199 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‹O_VKl+L,eZbgg']tmVKT+1߾ƴDe2*3c/W_7ONvV8_1>Dޣ4oa^x |3TOЂhT<P?C9@rOCM~oƥ:3}9O$W ҦQ0M$Zע`1_7a -endstream -endobj -1060 0 obj -<< -/Length 196 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA_&SiʬV+ṯ!{-ce\+s4߾IJBd.20-W$8(0 M?E?O^^_!>|xi{h=tӼqGW銚Nmx:%o%g!kY˘e&yʸ> -stream -H /&gZ5b7Xbe,N%.]3-sCanÐy l&?&_|^L_-qOx-9S£̃!m]nq8{\rC3Ec˭Iu8z } -e*K-RE=ꂷ4?t*pa<;fƲG %4)TOdb| -endstream -endobj -1062 0 obj -<< -/Length 194 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H KObJ.J@CEy0\0$%+Bh7ט?2S֘(U -2"}D7_ 4?"I|iҺ=L#D#[W?/7ԯ|hh> -stream -H‹Oizk=T2j1S׹:ղ^XBZ߾P緆a^]aPГ,(x?Vf/)xJQRfccaMhAT(Q|^˙*NVldm/,Ms 3Yaqr 0c. -endstream -endobj -1064 0 obj -<< -/Length 189 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA_X1r4cr_y5VˤDLaY|V;""u5U~*K̊L |12f3ŇH`= F z缞rJ(0O<yhi"yup!:;SQR9Oi. yF,˚"mPvTIS_i5c -endstream -endobj -1065 0 obj -<< -/Length 184 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA_,^JQ,15xXQcm%5E6"%EV~,s,|gJ0312fA~^n^o. ';근:H7TyBQRdhFpγ )aT8QƵر:z 0c -endstream -endobj -1066 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOכ3DUJ09w^w.cyf 2k[fWb--)ɳβʰX,,)fIL_$>3DGKjܼߡݢPuQqQvR -ՁjGDQ352ҹ^<;L ct2*d8 -endstream -endobj -1067 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA៴#a(9<=^sUαs,}C2{;;[MuUeEyYY?LbL# _Bt|?KCM#jvj|!ېT,-HH7͈&D#5Y-"9I]*ӄ,~q~`1d -endstream -endobj -1068 0 obj -<< -/Length 175 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‹k߰6^zt=ti#44Hv$-5+U 3J&F -򆫜^%ԂN^K:d -endstream -endobj -1069 0 obj -<< -/Length 157 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡nA߁*ym%f.JVksѸFQ#ɹskk˛h -endstream -endobj -1070 0 obj -<< -/Length 151 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡nAJQ#X!h{S\F;9*_(s/[kA^s?-)$v 8jmMT#*2"gcceau3r1r2~3p0ӷѳkcILLD(jRѣK` i -endstream -endobj -1071 0 obj -<< -/Length 140 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H -@wc؊X(݁kw~ʧ"e^%%Eysgd9I`ۨDX*2(#gnj'cQv M- 0vi -endstream -endobj -1072 0 obj -<< -/Length 141 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H`!*V{ -1jTh}c#vpOl`7ـ!pVf fy>p!FFIc#xUKQB܏U/T S j5 -endstream -endobj -1073 0 obj -<< -/Length 136 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiB9 0' 7ெw]vT8~a`7*+5pe\dk|C%Xpwyls:ff -`CR"zz s(O#`j -endstream -endobj -1074 0 obj -<< -/Length 135 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H`bbOԨM{ooO~mjlh{CҮaW嵂U*qQ<ǜtzcK akK -endstream -endobj -1075 0 obj -<< -/Length 129 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HWP(v4N,_A1*X{d" ќÙ:߄&>&c#C~ ˏlĥq58VPf}wEcZfJd;[RƱ1 k -endstream -endobj -1076 0 obj -<< -/Length 124 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,P]-v슁X ,$$k%163S~N8#!n}\{S-oؗUxvpKpd<2VV1Rl[ -endstream -endobj -1077 0 obj -<< -/Length 123 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‰P_d%_ $;%ww5||朹H]|gQ 1F}~6=ܻE 7k/->7cZDXA6WxW歮%6 Vl -endstream -endobj -1078 0 obj -<< -/Length 111 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‹B`/&ˡ! -SjB="#Hw8'_އ5+z]8TۼॉW_沊~a{mu -endstream -endobj -1079 0 obj -<< -/Length 177 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HyKpZ]hL4osNF#5oLԒ\nةVa[ƦO"++<_Yfif)I& / c |J%zb7G {;BbvPl`04ѯ}h^K((gNPP9rCgea -endstream -endobj -1080 0 obj -<< -/Length 166 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H{kAq{in!D6zpD؆Xj\\UXXPa_f+YX|//.rf0K3M1I?qc|EF0z=G};hOZM ՍfjblAydF6!)>n e -endstream -endobj -1081 0 obj -<< -/Length 169 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰n_\qL}VMl A\A|rUƳI(pho_ʶ¦̦ĺȺ*2""<<,4a01e1B|y|МhoWg$;'Dၦf3 -endstream -endobj -1082 0 obj -<< -/Length 163 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H o`3Ĥ2g0mW -܋s\\\t: -GpٗdW6yr2o}yYiI;#1D鿉0[4}4^0<nBw;> -stream -H,‹N`KVl%oj5Ye5FEʿyv[ W*OW[nSCf# -߰fqż.1x;,a)OY>38D'hqJ~Fg -endstream -endobj -1084 0 obj -<< -/Length 162 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H o`a1q!&s+ZFhʔO{=sVW98*X2]~;<šAb/࣎Yì^(av:*'.,3,4DO8Z -8"¼9C~><(d7 Tg} -endstream -endobj -1085 0 obj -<< -/Length 148 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, a2#{D\f㓧GW;m -/gS| (g -endstream -endobj -1086 0 obj -<< -/Length 148 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡ -A_ B5" Dkm_ʻ!_u^5U -{{[kkKsScc}mBnrce00'G^n.wʞCvtlhV4liQMF~ )hQ -endstream -endobj -1087 0 obj -<< -/Length 150 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, o q HQUL8戫[hO[ak\;\nm<596[* -fSG廄Q(S*l9Vr$Yif|4$8.G1>>0,C-k~C{t/Hh -endstream -endobj -1088 0 obj -<< -/Length 138 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‡ -ACff{F\#7.7~5 -2"<> -stream -H,‹P#bB%&oP^ -Wt,KMs\?gH'\>1.#.C!>Çow9kZH-:`m -endstream -endobj -1090 0 obj -<< -/Length 101 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4‰B`/d$YAyTv3י#r7W}bb#B}y[665~g6xo5zxbqO~. n -endstream -endobj -1091 0 obj -<< -/Length 96 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|X]To -endstream -endobj -1092 0 obj -<< -/Length 88 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD03I>: r :(=e$%VQs<2}&/\RBѧQ~{զV16z%Uo -endstream -endobj -1093 0 obj -<< -/Length 81 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HL0 QeЭ\N *%oN)>=[׈/٧'x|;xPm[3 hU> )Yp+ -endstream -endobj -1094 0 obj -<< -/Length 74 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT‡ @ʎ% `/ihǻljanw)̟s2;Mtc:F#Lp -endstream -endobj -1095 0 obj -<< -/Length 74 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT [ -8%pUˡj>cr`: \n2Yѵd"g -0qqH -endstream -endobj -1096 0 obj -<< -/Length 68 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H\W P8e,B1 $oOS߳#䁸GWͯ[ צTy`q -endstream -endobj -1097 0 obj -<< -/Length 59 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hl @Ay5Bf'=7pwY5IQ(#s0BrY -endstream -endobj -1098 0 obj -<< -/Length 54 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Ht ?M]P>e.w&NhN[jJr -endstream -endobj -1099 0 obj -<< -/Length 63 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hl н͢*Gav}󂅐n)ߵ^ʇ{k5éSI> rn -endstream -endobj -1100 0 obj -<< -/Length 57 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?].#пK0tŁ\~guł~NC0~ 5r -endstream -endobj -1101 0 obj -<< -/Length 46 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?].Et/s}~ÆDsX -endstream -endobj -1102 0 obj -<< -/Length 43 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]!]FG.aX_џ DA9s -endstream -endobj -1103 0 obj -<< -/Length 32 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?2B:]$ -t7 -endstream -endobj -1104 0 obj -<< -/Length 26 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?.t^2%IXt -endstream -endobj -1105 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?~}zxvsqol j -h f c `^\YWTQ c -endstream -endobj -1106 0 obj -<< -/Length 136 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, -@w{X݁.ZhM:|VZA-({[k^^r2䐐8(\XY'^&nF.9tJŁb}+} =$;_m=-0i -endstream -endobj -1107 0 obj -<< -/Length 139 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H, dwfENct0-&zwW]>k> -stream -H,‹ -`&& 36ȝ22b?r:‚Cwxxkη:U.8e8%>88-`m7Ӽy)cyg LO> -stream -H,`o"f=h46%iK?#1!Nvv6^ -?x4جÔqq¨̗E<98dx]o$J2Z ZVPCguj -endstream -endobj -1110 0 obj -<< -/Length 133 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HP_ 5k/B̒ ד#,)``>{xu> -stream -H,PŖڤ?jB|'7K壿;[i4xuj{U*.cE.j^L&߬eئ٤:)VUL. 0Gg9 3 1F~9` Lk -endstream -endobj -1112 0 obj -<< -/Length 118 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$QE?Cmg;(1ZYX;~wm=͖MUu5]eK<u,>]V 7iS\%Lpa5q4I'*Dl5 -endstream -endobj -1113 0 obj -<< -/Length 116 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‰c_C -&ehZtΜll-WHHHdlsd9M9'?Eh{¯1?G!Joqԕ|h&:5Ux[fT 0Gl -endstream -endobj -1114 0 obj -<< -/Length 118 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‰@} -%rT捹. [J,9DŽ&|C\Dg'Iqڼo!jrP:vU+elKFOc m -endstream -endobj -1115 0 obj -<< -/Length 117 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4PE8j -/ggd }>>Znr 7RsMOU=VLW+EEt5-Vˌ.Q7dY\$W}m -endstream -endobj -1116 0 obj -<< -/Length 43 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]пKE9t: s -endstream -endobj -1117 0 obj -<< -/Length 33 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?2CIC..^ Bt -endstream -endobj -1118 0 obj -<< -/Length 26 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?.tLC :tx -endstream -endobj -1119 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧ٣ס֟Ӝљϗ͕˒ɏǍŋÉ|zxvsqomjhfda_ ] [ -X W U S P O M K H F E CA? 0Q -endstream -endobj -1120 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪܧڤآנԝқИΖ͔ʑȎƌĊ‡~|ywurpnljhfca_ ] [ -X W U S P O M K I G E CA [TRn -endstream -endobj -1121 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ݨۦ٣ס֟Ӝљϗ͕˒ɐǎŋÉ}{ywurpnljheca_ ] [ -X W U S Q O M K I G F D  6S -endstream -endobj -1122 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآ֟ԝқИΖ͔ʑɏƌĊÈ}{xvtrpnljgeca_ ] [ -Y -W U S Q P N L J H F  S -endstream -endobj -1123 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݧۦأנԞӜљϗ͕˒ɐȎƌĊ‡~|zxvsqonligeca_ ] [ -Y -W V T R P N L J H  ٽT< -endstream -endobj -1124 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ݨۦ٣ס֟ԝқИΖ͔ʑɏǍŋÉ~|zxvsqomkigeca_ ] [ -Y -W V T R P O M K  AT -endstream -endobj -1125 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآנԞӜљϗ͕̓ɐȎƌĊÈ}{ywusqomljhfdb` ^ \ -Z -X W U S Q O N  )Uq -endstream -endobj -1126 0 obj -<< -/Length 111 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4@H 5>!Th ;g9}~SrK?_1sC]SCz_[}\y;b1k^ c~ZBiP?to_km -endstream -endobj -1127 0 obj -<< -/Length 104 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4D)(yUb$; +iAgD@kW~p/oi5rMoT+,e ^``no -endstream -endobj -1128 0 obj -<< -/Length 104 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H<0# h5X@"G›gOfg+xj<%B634 -z' -iQ8G4Gdn -endstream -endobj -1129 0 obj -<< -/Length 97 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD BP31D%$Ւ}c==1=;X@/]ix់zFQx[KGn ya`oR -endstream -endobj -1130 0 obj -<< -/Length 86 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD… @ ?t !p;R|#pVϢK'6,nB5{[ZTq#o -endstream -endobj -1131 0 obj -<< -/Length 86 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD… R1ꮔpBk\sw^) G$ llW6_=ureƿ [v[VFO*p3 -endstream -endobj -1132 0 obj -<< -/Length 78 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT YnE)/zPŲYۏU҂9|h7|}H$p -endstream -endobj -1133 0 obj -<< -/Length 74 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT@0wkQAY@״峰[FS&TaQ؞HCuѾ\ c]q -endstream -endobj -1134 0 obj -<< -/Length 73 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT ذDaH_N;ugWǶ*<,cC+q/ӭ`s|Oq -endstream -endobj -1135 0 obj -<< -/Length 66 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HdQPLTI`M8 ۿWx%}$s/ONq -endstream -endobj -1136 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ݨۦ٣ס֟ԝқИΖ͔˒ɐȎƌĊ‡}{ywusqonljhfdb`^ \ -Z -X W U S Q P  XV -endstream -endobj -1137 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآנ՞ӜҚИΖ͔ʑɏǍŋÉ}{ywusqonljhfdb`_ ] [ -Y -W V T R  V -endstream -endobj -1138 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݨۦ٣ס֟ԝӛљϗ͕̓ɐɏǍŋÉ}{ywusqpnljhgeca_ ] [ -Z -X W U  7WD -endstream -endobj -1139 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤآס֟ӜқИΖ͔˒ɐȎƌŋÉ}{ywvsrpnmkigedb`^ \ -Z -Y -W  ٔW -endstream -endobj -1140 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݨۦ٣آנԝӜҚИΖ͔ʑɐȎƌĊÉ}{yxvtrpomkjhfdba_ ] [ -Z - 2X -endstream -endobj -1141 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧڤ٣ס֟ԝӛљϗΕ͔ʑɏȎƌĊÉ}{zxvurqonljhgecb`^ \ - 1Y# -endstream -endobj -1142 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߪݨۦڤآנ֟Ӝқљϗ͕̓ʑɏȎƌĊÉ}|zxwusqpnmkihfdca_  `Y -endstream -endobj -1143 0 obj -<< -/Length 203 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@6R% B#ĈHth)**QjJ)E%! -[:2?*%.Ty?MLk,4χ<%h4> -stream -HJ@||Q$"$QJ"Fɘ([FJij$FEHL0+wuz'wS>5>zH7MG-Y)I+A}hĨGPݥ607[׹Z -erA-9Y$uue"yFHҴUĄ=tV[ -endstream -endobj -1145 0 obj -<< -/Length 196 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H kAϮ-2ɲ֚&<2l D-s2E/s2yfd"210 3 rtpuG׼_Qt9gOɝ>&eD҈xh@Г=>{v WK^̣MsC` \I -endstream -endobj -1146 0 obj -<< -/Length 196 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H/яfVcceYf5cdiWRW.1iVVƚ'&cC yWs2tt/h|ӌ!ш.vkcajGTyQ9 .[oR@ s맰Fǵ*.,,Z 9Oƒ<<˙if"<)!b 0@$] -endstream -endobj -1147 0 obj -<< -/Length 193 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA_,ee iѦ5Ŝ#y<{1 c9,%U"{~LLwr ''3G+.y9m/Oݴhp!; #9TlT-LG Փ9 f -]bj";U7-ſo] -endstream -endobj -1148 0 obj -<< -/Length 192 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /᷿lVV1MkYh;Cׇ[r"&K Sư|tna[|UHo* -/%e"O"mqI7m7\gZrIg+qN1h,Ǩ/PR26K9 aA~${^v=n -.v' ^W -endstream -endobj -1149 0 obj -<< -/Length 185 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OO4-cZ14b&Be45x]]: -"<Y~3,D~R|'ŘF3 #7;F zxEIANƓ5M 3+TL /ȝEԐVRP8#@8%vBT΃1a)# 0 _ -endstream -endobj -1150 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOߟmb&&3MiG^w71# ͳV5 }߾žζ_oUF-S:ϗJ3G4G ḅ"LLz0 @O4<_Qzr@#QQRtJތtx`B05ѓ>"uHRGBK_ -endstream -endobj -1151 0 obj -<< -/Length 182 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O3bŒ1L-S劐|Ṯ.YgWc'}fSf]bUeY~S3K0103 -1 2ѻ{ _^>=|\~EMEI󒆃oyQ=C8E8blLDH@^O-i Cj*Jb -r"2%E(>`q -endstream -endobj -1152 0 obj -<< -/Length 180 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O12a)[1b0D35BcCb9TTXP^`/6oMuUeEWQ#BLLL|0~fcM#v>iѰQjbldxC` ']KVC抷KjR*J -rb2bR"b"BUua' -endstream -endobj -1153 0 obj -<< -/Length 181 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA߿N+dX#j9s2QX1WC&|ߡAb_Nd+WdS`gc72yYiI  ?~} <@//m7w\44|ynvCŊdAld͈x`@SQВא$&sAZEꜤSb'DDd$a -endstream -endobj -1154 0 obj -<< -/Length 179 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OsaV0Hs_9Qm#dʩ©_oC}}]4$8(,"BLLL}< 9:ih==;V-̼()xUAxEᒼ )q 11/" b -endstream -endobj -1155 0 obj -<< -/Length 179 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOA\hu0jēcO#!̕|TF*/cO7O$_/llqV,,"|>13 1 2 03120p3pw{c=;и튺%9Zgd4դT$$NNˉ;"* > -stream -HOA/:13-/{Fc+KdvE -e+C`bU8Qa!fwLL| !dD2ӓ!j5dHF8 _c -endstream -endobj -1157 0 obj -<< -/Length 178 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OAIE9ZYG9r3˱}"}}]?m$kuUeE ?fL<~ŒB|ysuqvrдӰQRP5S1vCH@IOAGAtM^CNM -񂴒Wsgr'e?7d -endstream -endobj -1158 0 obj -<< -/Length 172 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOq&9b9j+u{T$r99 rgKmM+/&X%XED 31 2 03120t'\:8hӺianvKBLDHF0 둯)kiȪ\!.yW  q er -endstream -endobj -1159 0 obj -<< -/Length 172 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiS b"L*k(vȑsl9:X4VgWaWBPl ?: %2]M;W#(;>"ȷa7^1dpA?D/Hnw?3:>^ZpSwꤶLA΋dE )(:r 0f1 -endstream -endobj -1160 0 obj -<< -/Length 169 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Sabdr4GQE"ǢiIfiyvl+l_f#Q\=`0,-XaVL2M0ݠТ|Dx31: 2F _ѻ킎9.化XR=+((#`f -endstream -endobj -1161 0 obj -<< -/Length 159 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡nQ"6AЊ+ߦjj=9*2/WI|y[kKKZOqNrJrLps ߬B,,,}|LL> -stream -H Sa%9R;a*q*3ϩ©̱d.W7!>.+n3llY+ g$FiI820= ~>{;4ķՃz˗ kŇC_Qf6+e g, hW -endstream -endobj -1163 0 obj -<< -/Length 155 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Ho 5⌳BTcTko68ɣ7_kM^Uo<9S1!>..6&!c|>ɏ(0KY1$cea2P9:*+䫕E̴h 0_i -endstream -endobj -1164 0 obj -<< -/Length 142 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H -@wc؍(`Zݹau5wWgG{A咑4'ucC}Bbll"rf %NFj; @mogk=m=-ljih 04i -endstream -endobj -1165 0 obj -<< -/Length 139 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HE@wA -).ŊK:ے|7x&Uyp/s+kkK1)1#4zC}BrcZ-bdd`gc337SQaQm ,o=j -endstream -endobj -1166 0 obj -<< -/Length 51 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]ѿK"vv - CbG?OcG?N# r -endstream -endobj -1167 0 obj -<< -/Length 42 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?]пKxE9,7*u s -endstream -endobj -1168 0 obj -<< -/Length 29 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?.S]]ć .ltM -endstream -endobj -1169 0 obj -<< -/Length 159 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H0J8 R]@Fmێ+|^88yX?n`ۏM?nͯhiO&.iT $-pG9DaDb͋T7T%DDL ;w߾ -U[PXyqr) -endstream -endobj -1170 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߭ޫݩܨۧڦأע֡՟ԝӜћЙϘΖ͕̓ʒɐȏǎƍĊ É ˆ ~||zxw >` -endstream -endobj -1171 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?߫ުݨۧڦ٤أס֠՞ӜҜњИϗΖ̔˓ʒɐȎǍƌ Ċ É ‡ ~|{zx 2` -endstream -endobj -1172 0 obj -<< -/Length 132 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H`DjWFc_Z &ij:=]:|k*[& Vq}" -P9,ޤyJ&Nc)c"X0RL4?kW -endstream -endobj -1173 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ުݩܧۦڤ٣ءנ՟ԝӜҚљИϖἘ˒ʑȏȎǍƋ Ċ È ‡ ~~|{y Ia -endstream -endobj -1174 0 obj -<< -/Length 127 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰`B Mm4b> -stream -H /oihB_kƘKV-YZjZ}_+Z0ްʰ_?|eb=[(/aC<x<zxhrsIIcl\ns&gS]bldh`$o#Y0:֎VƓˢf"G&#SyIhn&TRRSȏf #xa= -endstream -endobj -1176 0 obj -<< -/Length 117 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,@E4=tt2f.32(G#~}| wyoof7uyT=/qWM>:U^Z^JK;I7!7_Ql -endstream -endobj -1177 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ߩިܦۥڤ٣ءנ֞ԝӛӛҙИϖἘ˒ˑʐȎȍNj Ɗ -ĉ Ĉ Æ }| /?as -endstream -endobj -1178 0 obj -<< -/Length 112 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4@sD$* b!Oc1 R5*!%\s?|1# UgyGG/l>y]i6r-m -endstream -endobj -1179 0 obj -<< -/Length 204 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /Bѯ)SG~o X--LaJq+n鶲a194=-m  ~|_χ3^> -stream -H4‹`(SdBFCPI7v3GݠPC">z'۳l\9|hjCEaxOS+,?kt`nQ -endstream -endobj -1181 0 obj -<< -/Length 96 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|ۼ<]1o -endstream -endobj -1182 0 obj -<< -/Length 84 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD@0ȨУ"gngE Q-kL9ەGՁƽ7S huh`Ro -endstream -endobj -1183 0 obj -<< -/Length 79 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD HÆ]O w-qOVx+}J:J r\37%A?0G> -stream -HT @ зu$D$2g@wپoVU¥ -8dx -sNqT -endstream -endobj -1185 0 obj -<< -/Length 63 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H\ 1ph+ -~h7މq#=7<߇֕E,`r -endstream -endobj -1186 0 obj -<< -/Length 201 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H /BobafhҢѰhcXVzܺw=%4ZZYΙ> -stream -H OAOaSR-ZZ5rha$ J4gggO7OoCAq>b(o^/x9s)O'ixH>0=BԃR.@Oe{v7MN uE1q6)*UjyJ\Rm&a$,ڸY[¼dMXb -endstream -endobj -1188 0 obj -<< -/Length 199 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H O7,J\ZZh)SF1$G4Y,V&Ʉ.W'waA~0!:-4/hv)/.N*'TyvP>tHΓ -<77qFrrd6 Qj]I4&NEQZ5^Z )K EHQ*b& -endstream -endobj -1189 0 obj -<< -/Length 197 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OA/VhTjԬEZ2hռ].dj12 svKEF"~sd0L1L0яҋ {I93ZA儦1u7G<x@EIu=**vwۡMƭMD̕IRؐgsƹAYWyAL.+:U\,FK^b\ -endstream -endobj -1190 0 obj -<< -/Length 197 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H ‹/_&uXjX1)F-by5nI5y~3K?G^#Py?#^ty>Axq. ZmhlRߠΕK5j\p쿇2U7%ʋ\(8Mӹܬ9;3NO&GKbBu\TDf`hVb -endstream -endobj -1191 0 obj -<< -/Length 194 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OWKH՚4Y,DS +-5,w[-GSQzfbdK30 J?G ottNhy:! yrSߣˣ> -stream -H ‰OAM)jRba-Ԩu,{!re4Zj $"8(~t/9 -/-cGiR;O]JNJw(nţ&9 Y3 &Rܭqk$*VaJ\V28]kU:0/{sb -endstream -endobj -1193 0 obj -<< -/Length 191 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Oᗆ2Yiֵs>+T:itϞa(}0!~|K9gvBZ44xNvnuכ7(S4S0Q073]#'Jj2 J#kbKZQɄiaa& )c( -endstream -endobj -1194 0 obj -<< -/Length 193 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‹/GY)V,b%h0XDݝӺVE$j]/CUQ$"4K:)$F#N;93ZQ|0Cxe.;TnQ">HyuJkܭrf2%r^E2dFݣ{Lu+ez圐6izRO 0cW -endstream -endobj -1195 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OW)*bb[d9J9rWd 왧% -řG3cax~5!zAzWнs>=ܴ\44Ψ.PQRP:h``$D@dY˓zq$ZIﬦZbk]ܔ -X0c -endstream -endobj -1196 0 obj -<< -/Length 185 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‰OA"!̑kc&yMRjDX۷|de!0Yi4;&)~nNd|(|y1ҿwN)o'Fx |D ihyipDr R[S=@!S٣KJBѼCy*m) c -endstream -endobj -1197 0 obj -<< -/Length 175 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H OAab„ƒaVɔu:!ae1 \X{'6u5[i)fILoę\u88(" B b^]?/^|3Z.yJANFDZXx3S7Q:hԼV^$P`c -endstream -endobj -1198 0 obj -<< -/Length 174 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Oc#цkU}M۰ -{s3%&ؾyeUU(Gafbbd/120r3cbcc}MD󊆑OZaUCE%se%%EQ.:/y$d+ -endstream -endobj -1199 0 obj -<< -/Length 172 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H Oqӈ4Tbja\SF6Rj2gw ykWa̮̾M#y,-S_IIqqJ%s-Wh 8j1B/wHTQtt>d/3Z|titq,;ipf+Sb6 0dd -endstream -endobj -1200 0 obj -<< -/Length 174 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HO/B[ɣWL_$] sט>Hb,&'1QPoQ(a!A7k~|Z/ɍtŷ%]'_E>EZ6>M+ u@ c*G-̼xƽYd -endstream -endobj -1201 0 obj -<< -/Length 168 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HSaB>䣖ֶCiwȑ3gqo]=.SWEysY _i{Z;qq> -stream -HSaQܹR+Zl,!`D}yNe%Eyq._mW~ӬS_X%Y=| P1f{wDDkC|2 03xQ<\ 5]lېHW|^ҲкiCkqN( TTϨ`e# -endstream -endobj -1203 0 obj -<< -/Length 160 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HWsQ -F"e6-yː9ܾkKKs5)I>~w6kUeL\DG1 3} 1 203xQ<šw{,l4-44Lԍb@ՀGQyDY]ea -endstream -endobj -1204 0 obj -<< -/Length 151 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HiS0!!qK9u5"R\Te%ES`9`.%I6olr22gEX! 30I͋aȍC'?ҳ&߭tXP(&'e -endstream -endobj -1205 0 obj -<< -/Length 145 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HƒQ ۵l mcq뿝oo̻īȳ >V^qn.q&v&6VFqhfhb`oѕjhhiIU44de -endstream -endobj -1206 0 obj -<< -/Length 150 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$N@v%{ʔ) - -"ETRV) ˻ X=ybav9[xŨaTW_^d"Zm=ڞ7-W)$je\XDY<0J% Or^) f+ -endstream -endobj -1207 0 obj -<< -/Length 138 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H -'n1fn5[pے&|xUy*<2Z[XZ912ȉbbdw0m,tf:& "fa -endstream -endobj -1208 0 obj -<< -/Length 134 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H‡P 6-BZQOPiBH=9)>x9G^.:jp۸p 4q®XCE `_]9d^XIXJJ"FFa`1f -endstream -endobj -1209 0 obj -<< -/Length 135 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,Wg=-8d(vm3wg,#^Cw']nKKsr8VU*s(c0(`ٻzV2Z-6)j\*1((0+gee@.}rS?:f -endstream -endobj -1210 0 obj -<< -/Length 128 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,@@w;IqbJ-5a1ߑ yx&Ͼzx]poK6qNZ\Ǣ<r۬d4+52!8vLH+bgOGg+ -endstream -endobj -1211 0 obj -<< -/Length 125 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,@#P,ذ{E}b Vl&[⻐xx8"M<&߆|𥏸N:jsh%79h Qg -O-S y_Uyu&R`Sgp -endstream -endobj -1212 0 obj -<< -/Length 122 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$U`o{lbXKzWn76c^Kd 0_Sg -endstream -endobj -1213 0 obj -<< -/Length 118 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H$UPE3QݭKf"&v|cD.L?S}p/C0}kG/m&vYeK̢n 1svaiK%Y  gg -endstream -endobj -1214 0 obj -<< -/Length 113 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,WPe ؕ"{Ũ;7o2M&AsqrߖJ.||Ư)?]=sM8c߇|/}ipR|H@+s,h4 -endstream -endobj -1215 0 obj -<< -/Length 110 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H,U6 c-bŇopW% o;ׄ1v xKO}zjvRu&k ;[mED6e-_h{ -endstream -endobj -1216 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ؼպӶгΰ˭ɪƧģ}zwtqnlie}cz`x]uZr~Wo{TlxRjvNfrLdoIamF^jD\gAXd>Ua;S^9P[5LW2IU0GR-DO)@K&=H#:E 7B3>0;,7'1!) "  cVF -endstream -endobj -1217 0 obj -<< -/Length 164 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H B09Չ10S>Au|' 'uG]$]Lte;!C8ꆚG4~A ppj&F()x?e0+I^QQ'IˆV-]tUuc;02˴˺W -endstream -endobj -1218 0 obj -<< -/Length 206 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H?ީܧۦ٣ءנԞӜҚИϗ͕̓ʑɏǎƌĊÉ~|{ywvtrpomljigedb (Zj -endstream -endobj -1219 0 obj -<< -/Length 202 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@ыf(IF E(D!fKEQTLe#{#bhbDR2;g~`[ -2_E> |gey-@^DG-Њ<OAN?qm͏zDe%7} -{wɹ&EjI'W(kWy%QEM’)8`[ Z -endstream -endobj -1220 0 obj -<< -/Length 201 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@kS)HP$ ,K6T́23L[6iUG2oy)$ͣXa$3> -stream -H /S1Y2L3fYʹfIi9Tsk}LQ3h.ӿG/eMsCG-uAC3GS"oA^TT|˓ܔ\mS"$ INjm5+ė,q> -stream -H /W?ke̲˘1ej̬Ɩ%Uqn}PjƘV+e - [K3G-N7JG="/ǴC<y@cG=v)Pڦ&7.d7ȬqBz ;وZXMdZG&cpjr, -\D -endstream -endobj -1223 0 obj -<< -/Length 190 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H kAo4mMd-ZdH1]=*-Ҕqa}][m?6E -|YXfXx=[8/1QfwLŒC  oyvrtp oۨYZ(_#)xh` '#{IFKZCJ̓^)J -YD.; -0/?\ -endstream -endobj -1224 0 obj -<< -/Length 195 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HO/oZXZ5ZeZ2r].ՕLHѰZcF6I, IO jtnVih*4d~$"0U||F ^ -n^]y9"{H}R{$$$<۸pM6P׹\CYE^A5#,#,Z .?k -0Q]< -endstream -endobj -1225 0 obj -<< -/Length 194 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HJ@[QFQXRTHa>f/I a9;6 k:?*" -_9ZY LS3͇ zSj q^cTNx9C(GqÎp -a`lclD@]Ba|d H>$/g9'Sr9] -endstream -endobj -1226 0 obj -<< -/Length 109 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HTB R4*A{.kWT1OwZe]ιy|6/᳭-䄳1Cm"5hC=vI?th -endstream -endobj -1227 0 obj -<< -/Length 99 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H4kBP3$G&p9}F?A}NN!>{ o]L`mI2yyAA)k|`i -endstream -endobj -1228 0 obj -<< -/Length 100 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HLY0л JwAN|FO&I|՚ |}0/X\_2:q{#opXiG -endstream -endobj -1229 0 obj -<< -/Length 95 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HLkBPo3A.*P)-~8>Z]-_gc7>LM1'bh3]y<!|@囯.RAi -endstream -endobj -1230 0 obj -<< -/Length 80 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HD@ _ -.~&$vVԲ{gxKdH_h&_zx>8҆Z3_i -endstream -endobj -1231 0 obj -<< -/Length 79 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HT0 0 -=&wȇ3jPϫ, |俻䛞k|RGC`>Υomhpj -endstream -endobj -1232 0 obj -<< -/Length 76 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HTY@0 .)d7Yj~T߽h /4s9 -;H{ 0jV -endstream -endobj -1233 0 obj -<< -/Length 73 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HL0 r9FK;k{XN5W+F -ǷtwZ`s~&TM̧GHC9xj -endstream -endobj -1234 0 obj -<< -/Length 69 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hl[SܩΜhп'r̞ϣn]ىj -#8j -endstream -endobj -1235 0 obj -<< -/Length 61 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H7 ڍ܅@?v"Hh; -[y3 m``uk" -endstream -endobj -1236 0 obj -<< -/Length 188 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HkAm emk-˹3 Bl9Bf߷W̏_Evllr|Y,X'řƘ|D{y>y}O뎦-u'7T\Qtth``%oLDHڀG%uF q Q5 -AIDAAx/^9 -endstream -endobj -1237 0 obj -<< -/Length 188 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -Hk-[hdQ&ҶmggEt[䑅Qhy|ʶƦ -Ey~r|gY%fi)& όEF8_1Qz|ѽsC0 ~T%7 \(NE;3Ȟ [y9F2248ɀQpq-1 {"^ -endstream -endobj -1238 0 obj -<< -/Length 184 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -H kWo-G!2լiMbȝ6PP_}]mUeEyY(0 #?C+?n.:/~u;5V*|)()j5jUdHߒ!$qM%!A) gxN8 -0_3 -endstream -endobj -1239 0 obj -<< -/Length 186 -/FunctionType 0 -/Filter /FlateDecode -/Encode [ 0 63] -/BitsPerSample 8 -/Domain [ 0 1] -/Size [ 64] -/Order 1 -/Range [ 0 1 0 1 0 1] -/Decode [ 0 1 0 1 0 1] ->> -stream -HOߟ¬&&3L+kGns<> -stream -HkmEАXBFu;:ĥƐGf4Y &:* -M"?V2,_>%>Dif)L$$3K/J0AZ~>ԼT> -stream -H O3XL5&b9fsڗ+ iVx}}]2O -ll -s,3,$'313$䞱7.NZѾuC5f&jWTT t)ג;%{1 )5)#JDeD%D<;` -endstream -endobj -606 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [295.196 596.876 373.584 608.951] -/Subtype/Link/A<> ->> endobj -607 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [279.173 544.842 447.342 556.842] -/Subtype/Link/A<> ->> endobj -611 0 obj << -/D [609 0 R /XYZ 149.705 747.976 null] ->> endobj -608 0 obj << -/Font << /F21 612 0 R /F14 613 0 R >> -/XObject << /Im2 605 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1273 0 obj << -/Length 960 -/Filter /FlateDecode ->> -stream -xMo6z!R!ŏS&E[`ۃh!Fb;)6nֻ@#)_JŤs.kv98?m[N5# S6˖+\!d1cL8zOf=(vs#ܶp1`yIykIqk?-}HSm_+>ou /eW`p$T,4<"l r  "I3c`^ajnPR q_)fVH5Zlm堬桨p5/_,MaaR} ,$U=vylŨȗHH ; }). C߱bMIN%weqeoQ.ɢ]cXٹyn1v -f)|ǹc޶h@>yXAo;Ū -M]ضe4՞.@bLȲ +?TeY@c!/xú[>ħʿ#8&X|60"w|z$TIbT-] V R n}뙷gĠd%t:,>K)r=:Su!楔CO}. jOHNΣa嵿)jOCі<igdւFl7d[ ҁDj-?SGr2u -+^Ip% 'M*Hb(<=^z?soJ5#g8![Xt9ƝeYnf|/킯 -endstream -endobj -1272 0 obj << -/Type /Page -/Contents 1273 0 R -/Resources 1271 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 603 0 R -/Annots [ 1242 0 R 1243 0 R 1244 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R 1250 0 R 1251 0 R 1252 0 R 1253 0 R 1254 0 R 1255 0 R 1256 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R 1267 0 R ] ->> endobj -1242 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.899 553.167 167.502 565.142] -/A << /S /GoTo /D (chapter.1) >> ->> endobj -1243 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.899 528.311 190.834 538.468] -/A << /S /GoTo /D (chapter.2) >> ->> endobj -1244 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 511.804 218.53 521.348] -/A << /S /GoTo /D (section.2.1) >> ->> endobj -1245 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 492.755 399.432 504.755] -/A << /S /GoTo /D (section*.3) >> ->> endobj -1246 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 476.088 394.54 488.163] -/A << /S /GoTo /D (section*.4) >> ->> endobj -1247 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 462.027 257.405 471.571] -/A << /S /GoTo /D (section.2.2) >> ->> endobj -1248 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 445.434 261.559 454.979] -/A << /S /GoTo /D (section*.5) >> ->> endobj -1249 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 428.842 278.217 438.386] -/A << /S /GoTo /D (section*.6) >> ->> endobj -1250 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 412.25 196.114 421.191] -/A << /S /GoTo /D (section.2.3) >> ->> endobj -1251 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 395.657 254.874 405.202] -/A << /S /GoTo /D (section*.7) >> ->> endobj -1252 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 376.535 250.341 388.609] -/A << /S /GoTo /D (section*.8) >> ->> endobj -1253 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 359.942 236.035 372.017] -/A << /S /GoTo /D (section*.9) >> ->> endobj -1254 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 343.425 236.124 355.425] -/A << /S /GoTo /D (section*.10) >> ->> endobj -1255 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 329.288 190.565 338.832] -/A << /S /GoTo /D (section.2.4) >> ->> endobj -1256 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.526 310.165 301.121 321.637] -/A << /S /GoTo /D (section*.11) >> ->> endobj -1257 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.899 285.938 197.728 295.477] -/A << /S /GoTo /D (chapter.3) >> ->> endobj -1258 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 269.43 185.315 278.974] -/A << /S /GoTo /D (section.3.1) >> ->> endobj -1259 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 250.307 222.814 262.382] -/A << /S /GoTo /D (subsection.3.1.1) >> ->> endobj -1260 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 233.789 324.294 245.789] -/A << /S /GoTo /D (subsection.3.1.2) >> ->> endobj -1261 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 217.197 265.574 229.197] -/A << /S /GoTo /D (subsection.3.1.3) >> ->> endobj -1262 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 200.605 197.31 212.605] -/A << /S /GoTo /D (section.3.2) >> ->> endobj -1263 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 186.468 263.422 196.012] -/A << /S /GoTo /D (subsection.3.2.1) >> ->> endobj -1264 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 167.42 279.641 179.42] -/A << /S /GoTo /D (subsection.3.2.2) >> ->> endobj -1265 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 153.284 233.086 162.828] -/A << /S /GoTo /D (subsection.3.2.3) >> ->> endobj -1266 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 134.161 275.327 146.236] -/A << /S /GoTo /D (subsection.3.2.4) >> ->> endobj -1267 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 117.643 312.488 129.643] -/A << /S /GoTo /D (section*.12) >> ->> endobj -1274 0 obj << -/D [1272 0 R /XYZ 98.895 747.976 null] ->> endobj -1276 0 obj << -/D [1272 0 R /XYZ 99.895 582.291 null] ->> endobj -1271 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1313 0 obj << -/Length 1233 -/Filter /FlateDecode ->> -stream -xrH~ --Qըv2v*O2*dʅ-QF@Acy9i"![#ި>qޜ>\5^|9 р91D+EΣfҫ}&eR]&Z4χ sPGV1eBs%4J.3(n ?~ x\Moj, +e&1vÉsՙA:r[HڗlR ,&UUc aihj?޶yPstkVe㐒AǤJ˨ǿAH ECv„b$6n l28+X /ovv{հ5*}&UTYa0KO~^k(Y 9hp]fs=b(,Ƀ"Lws?J*(VQ43H˿Ve}9 -_=!RJwuBhnOj"FMҝ&A~4paT]q!{0Rou?mVP -G rM#l D<7Qd7q~t@ (n,bԖ og{BYMj$W-k-$9CPrYUNXp6 l[Wlq+FYVqT/ṋWXjt+ʛKDyzb٤}6ͯm^=MZUcfwc5 M{w1$t8ɭKs%b7\$Կ+3ő,,nVN'%B&Ԡ>PGL9͞Iy`QN*qS(9DN;!?y&Ӎ,`8G:h?Ȭ3Y1Df9-f^EWv7 -endstream -endobj -1312 0 obj << -/Type /Page -/Contents 1313 0 R -/Resources 1311 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 603 0 R -/Annots [ 1268 0 R 1269 0 R 1270 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R 1281 0 R 1282 0 R 1283 0 R 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1317 0 R 1293 0 R 1294 0 R 1295 0 R 1318 0 R 1296 0 R 1297 0 R 1298 0 R 1319 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R ] ->> endobj -1268 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 703.372 432.607 715.446] -/A << /S /GoTo /D (section*.13) >> ->> endobj -1269 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 687.197 276.423 699.272] -/A << /S /GoTo /D (section*.14) >> ->> endobj -1270 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 671.022 345.962 683.097] -/A << /S /GoTo /D (subsection.3.2.5) >> ->> endobj -1277 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 654.758 330.102 667.022] -/A << /S /GoTo /D (section*.15) >> ->> endobj -1278 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 639.149 341.738 650.145] -/A << /S /GoTo /D (section*.16) >> ->> endobj -1279 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 625.029 294.665 633.97] -/A << /S /GoTo /D (section*.17) >> ->> endobj -1280 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 606.234 330.102 618.498] -/A << /S /GoTo /D (section*.18) >> ->> endobj -1281 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 590.06 361.484 602.324] -/A << /S /GoTo /D (section*.19) >> ->> endobj -1282 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 573.885 351.023 586.149] -/A << /S /GoTo /D (section*.20) >> ->> endobj -1283 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 557.71 351.023 569.974] -/A << /S /GoTo /D (section*.21) >> ->> endobj -1284 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 541.536 423.063 553.8] -/A << /S /GoTo /D (section*.22) >> ->> endobj -1285 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 525.927 289.434 536.923] -/A << /S /GoTo /D (section*.23) >> ->> endobj -1286 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 509.186 366.714 521.45] -/A << /S /GoTo /D (section*.24) >> ->> endobj -1287 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 493.012 366.714 505.276] -/A << /S /GoTo /D (section*.25) >> ->> endobj -1288 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 476.837 423.063 489.101] -/A << /S /GoTo /D (section*.26) >> ->> endobj -1289 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 460.662 423.063 472.926] -/A << /S /GoTo /D (section*.27) >> ->> endobj -1290 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 444.488 433.524 456.752] -/A << /S /GoTo /D (section*.28) >> ->> endobj -1291 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 428.313 407.372 440.577] -/A << /S /GoTo /D (section*.29) >> ->> endobj -1292 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 412.139 495.412 423.79] -/A << /S /GoTo /D (section*.30) >> ->> endobj -1317 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [149.709 400.183 327.88 412.447] -/A << /S /GoTo /D (section*.30) >> ->> endobj -1293 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 384.009 407.372 396.273] -/A << /S /GoTo /D (section*.31) >> ->> endobj -1294 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 367.834 438.754 380.098] -/A << /S /GoTo /D (section*.32) >> ->> endobj -1295 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 351.659 495.412 363.923] -/A << /S /GoTo /D (section*.33) >> ->> endobj -1318 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [149.709 342.324 286.057 351.968] -/A << /S /GoTo /D (section*.33) >> ->> endobj -1296 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 323.53 454.445 335.794] -/A << /S /GoTo /D (section*.34) >> ->> endobj -1297 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 307.355 438.754 319.619] -/A << /S /GoTo /D (section*.35) >> ->> endobj -1298 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 291.18 495.412 303.444] -/A << /S /GoTo /D (section*.36) >> ->> endobj -1319 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [149.709 281.845 286.057 291.489] -/A << /S /GoTo /D (section*.36) >> ->> endobj -1299 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 263.051 454.445 275.315] -/A << /S /GoTo /D (section*.37) >> ->> endobj -1300 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 247.442 278.974 258.438] -/A << /S /GoTo /D (section*.38) >> ->> endobj -1301 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 230.701 403.327 242.965] -/A << /S /GoTo /D (section*.39) >> ->> endobj -1302 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 214.527 382.406 226.791] -/A << /S /GoTo /D (section*.40) >> ->> endobj -1303 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 198.918 310.356 209.914] -/A << /S /GoTo /D (section*.41) >> ->> endobj -1304 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 182.177 351.023 194.441] -/A << /S /GoTo /D (section*.42) >> ->> endobj -1305 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 168.623 310.356 177.564] -/A << /S /GoTo /D (section*.43) >> ->> endobj -1306 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 150.394 320.817 161.39] -/A << /S /GoTo /D (section*.44) >> ->> endobj -1307 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 133.653 314.411 145.917] -/A << /S /GoTo /D (section*.45) >> ->> endobj -1308 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.447 117.479 340.563 129.743] -/A << /S /GoTo /D (section*.46) >> ->> endobj -1314 0 obj << -/D [1312 0 R /XYZ 149.705 747.976 null] ->> endobj -1311 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1359 0 obj << -/Length 1015 -/Filter /FlateDecode ->> -stream -x]8@Wh6uwgmՉԕbM&L߯ILH2I3m^'NBoWnh 0o{ -ہ`nqWn4gno>q`zz ^7uw'!ES#}K)c;\^`z8 zSH!{j`dZ LD,8\K=|ATU6ƒ -p2mDD -<R uV<͕EYeV x300,^Xk[3`UD^lɶuk|)(0p-XYAVZMc"Wz?!)DtlRa*#퉯euO8Ke%KCӜqJt][k*]VË[D$+P&5LFW[X6E--sY99pxV#b■8qh{kʕ͙XQ4<1v t#O#DYJ+s>)6MYi>.*++lH$$*d/.DY6dzҲYt,#KnLRS UȘ1*ܖ;rDo"u`۬k-B3ײ0'5ƭU@fec!EOe EK7w"K"GJDJm/iF:yN;B i;!+]ҬcieN˭ Ar";"= $W~_@I#O ʪb^ُqV]xz]q;d$b N#Pb_qh$忭1ARNnng\ -5YmvZk> 2#;]߿#ϐ\$h͇җEsfcDᆢbgHM*ތr 8`\=^Pi -endstream -endobj -1358 0 obj << -/Type /Page -/Contents 1359 0 R -/Resources 1357 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 603 0 R -/Annots [ 1309 0 R 1310 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R 1334 0 R 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R 1344 0 R 1345 0 R 1346 0 R 1347 0 R 1348 0 R 1349 0 R 1350 0 R 1351 0 R 1352 0 R ] ->> endobj -1309 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 704.398 254.316 714.844] -/A << /S /GoTo /D (section*.47) >> ->> endobj -1310 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 686.618 254.316 697.614] -/A << /S /GoTo /D (section*.48) >> ->> endobj -1320 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 668.823 247.91 681.087] -/A << /S /GoTo /D (section*.49) >> ->> endobj -1321 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 651.594 321.135 663.858] -/A << /S /GoTo /D (section*.50) >> ->> endobj -1322 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 634.364 247.91 646.628] -/A << /S /GoTo /D (section*.51) >> ->> endobj -1323 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 617.7 217.703 628.696] -/A << /S /GoTo /D (section*.52) >> ->> endobj -1324 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 599.905 279.292 612.169] -/A << /S /GoTo /D (section*.53) >> ->> endobj -1325 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 583.241 228.164 594.237] -/A << /S /GoTo /D (section*.54) >> ->> endobj -1326 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 566.562 270.007 577.008] -/A << /S /GoTo /D (section*.55) >> ->> endobj -1327 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 548.782 222.934 559.778] -/A << /S /GoTo /D (section*.56) >> ->> endobj -1328 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 531.553 301.389 542.549] -/A << /S /GoTo /D (section*.57) >> ->> endobj -1329 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 514.323 301.389 525.319] -/A << /S /GoTo /D (section*.58) >> ->> endobj -1330 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 497.094 290.929 508.09] -/A << /S /GoTo /D (section*.59) >> ->> endobj -1331 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 479.864 290.929 490.86] -/A << /S /GoTo /D (section*.60) >> ->> endobj -1332 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 463.185 212.473 473.631] -/A << /S /GoTo /D (section*.61) >> ->> endobj -1333 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 445.405 222.934 456.401] -/A << /S /GoTo /D (section*.62) >> ->> endobj -1334 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 428.726 264.777 439.172] -/A << /S /GoTo /D (section*.63) >> ->> endobj -1335 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 410.946 254.316 421.942] -/A << /S /GoTo /D (section*.64) >> ->> endobj -1336 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 393.717 259.546 404.713] -/A << /S /GoTo /D (section*.65) >> ->> endobj -1337 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 377.037 259.546 387.483] -/A << /S /GoTo /D (section*.66) >> ->> endobj -1338 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 361.312 228.164 370.254] -/A << /S /GoTo /D (section*.67) >> ->> endobj -1339 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 342.028 233.395 353.024] -/A << /S /GoTo /D (section*.68) >> ->> endobj -1340 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 325.349 259.546 335.795] -/A << /S /GoTo /D (section*.69) >> ->> endobj -1341 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 308.119 311.85 318.565] -/A << /S /GoTo /D (section*.70) >> ->> endobj -1342 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 290.34 275.238 301.336] -/A << /S /GoTo /D (section*.71) >> ->> endobj -1343 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 273.66 259.546 284.106] -/A << /S /GoTo /D (section*.72) >> ->> endobj -1344 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 256.431 311.85 266.877] -/A << /S /GoTo /D (section*.73) >> ->> endobj -1345 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 238.651 275.238 249.647] -/A << /S /GoTo /D (section*.74) >> ->> endobj -1346 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 221.422 275.238 232.417] -/A << /S /GoTo /D (section*.75) >> ->> endobj -1347 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 206.247 191.552 215.188] -/A << /S /GoTo /D (section*.76) >> ->> endobj -1348 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 186.561 248.299 198.561] -/A << /S /GoTo /D (section.3.3) >> ->> endobj -1349 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 169.257 354.182 181.332] -/A << /S /GoTo /D (subsection.3.3.1) >> ->> endobj -1350 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 152.102 262.197 164.102] -/A << /S /GoTo /D (subsection.3.3.2) >> ->> endobj -1351 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 134.873 271.123 146.873] -/A << /S /GoTo /D (subsection.3.3.3) >> ->> endobj -1352 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 117.643 207.322 129.643] -/A << /S /GoTo /D (section.3.4) >> ->> endobj -1360 0 obj << -/D [1358 0 R /XYZ 98.895 747.976 null] ->> endobj -1357 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1397 0 obj << -/Length 1221 -/Filter /FlateDecode ->> -stream -xMsFg|2Grjr9MX2%J~}0hf-isLCEO''Ա@K*2PDX3=/̭]I3Z}kXC^'Ĭ+fV,Dfvy7*p+B([=a`~a@ajm M1'mH@snَ85 lIx}B+?Uě!hU"kZӄ㤜'PbpBV? 5Fs`b-xi/\$Jőaj_cN?AP7 -1٤,w; -/IXI3P犋} ^b4+~.GI΃?.ra"RJ -Ԍ0 4,$̬\&B$:**HCO$Wiq)bF0%h*P#Q]mW՗$kiFb{^l)[ߩXI9"̜7PnJRL0c -S> -I~-?4SG9gr"WlAuQD6ᆈS0S( -]S G>E5p -B4Z{LShO;ßB^N)y=~<1*q Oi &ܹj!?S)Ѳ}cwrTț@oz4C8]4̌{#}xG1LY=񲬠=eSq@Vi=8C2MJuz-X+g?3rL.ObISFRH;oEKA>񬊽/H4E5Jplh ZNT<j(C}@N.чP1n +pT(QRW0y=27w-E$GjiWkT~\E1qʨ}>j&vyO(Bp0FӰa:n\aCJ )ɶ7lAAR2JzIyfv=p{uyWJ,4`oWJNN- -1:/g]swi5^zcfwI?)ZI.ч6?Og -endstream -endobj -1396 0 obj << -/Type /Page -/Contents 1397 0 R -/Resources 1395 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 603 0 R -/Annots [ 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1361 0 R 1362 0 R 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R 1385 0 R 1386 0 R 1387 0 R 1388 0 R 1389 0 R 1390 0 R 1391 0 R 1392 0 R ] ->> endobj -1353 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [149.709 705.818 241.156 715.974] -/A << /S /GoTo /D (chapter.4) >> ->> endobj -1354 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 689.734 236.124 699.278] -/A << /S /GoTo /D (section.4.1) >> ->> endobj -1355 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 671.036 273.624 683.111] -/A << /S /GoTo /D (subsection.4.1.1) >> ->> endobj -1356 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 654.943 375.103 666.943] -/A << /S /GoTo /D (subsection.4.1.2) >> ->> endobj -1361 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 638.775 316.383 650.775] -/A << /S /GoTo /D (subsection.4.1.3) >> ->> endobj -1362 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 622.607 277.38 634.607] -/A << /S /GoTo /D (section.4.2) >> ->> endobj -1363 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 606.439 295.432 618.439] -/A << /S /GoTo /D (subsection.4.2.1) >> ->> endobj -1364 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 590.271 295.014 602.271] -/A << /S /GoTo /D (subsection.4.2.2) >> ->> endobj -1365 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 574.103 300.593 586.103] -/A << /S /GoTo /D (subsection.4.2.3) >> ->> endobj -1366 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 557.935 267.706 569.935] -/A << /S /GoTo /D (section.4.3) >> ->> endobj -1367 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 541.767 339.168 553.767] -/A << /S /GoTo /D (subsection.4.3.1) >> ->> endobj -1368 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 525.524 286.565 537.599] -/A << /S /GoTo /D (subsection.4.3.2) >> ->> endobj -1369 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 509.431 258.132 521.431] -/A << /S /GoTo /D (section.4.4) >> ->> endobj -1370 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [149.709 485.672 236.802 495.829] -/A << /S /GoTo /D (chapter.5) >> ->> endobj -1371 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 469.588 236.124 479.133] -/A << /S /GoTo /D (section.5.1) >> ->> endobj -1372 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 450.89 273.624 462.965] -/A << /S /GoTo /D (subsection.5.1.1) >> ->> endobj -1373 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 434.797 375.103 446.797] -/A << /S /GoTo /D (subsection.5.1.2) >> ->> endobj -1374 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 418.629 316.383 430.629] -/A << /S /GoTo /D (subsection.5.1.3) >> ->> endobj -1375 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 404.917 267.467 414.461] -/A << /S /GoTo /D (section.5.2) >> ->> endobj -1376 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 388.749 334.117 398.293] -/A << /S /GoTo /D (subsection.5.2.1) >> ->> endobj -1377 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 370.05 318.127 382.125] -/A << /S /GoTo /D (subsection.5.2.2) >> ->> endobj -1378 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 353.957 324.353 365.957] -/A << /S /GoTo /D (subsection.5.2.3) >> ->> endobj -1379 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 340.245 234.501 349.789] -/A << /S /GoTo /D (section.5.3) >> ->> endobj -1380 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 321.546 371.507 333.621] -/A << /S /GoTo /D (subsection.5.3.1) >> ->> endobj -1381 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 305.378 330.461 317.453] -/A << /S /GoTo /D (subsection.5.3.2) >> ->> endobj -1382 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 289.211 316.154 301.285] -/A << /S /GoTo /D (subsection.5.3.3) >> ->> endobj -1383 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 273.043 357.36 285.117] -/A << /S /GoTo /D (subsection.5.3.4) >> ->> endobj -1384 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 256.875 408.667 268.949] -/A << /S /GoTo /D (subsection.5.3.5) >> ->> endobj -1385 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 240.781 371.676 252.781] -/A << /S /GoTo /D (subsection.5.3.6) >> ->> endobj -1386 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 227.069 218.989 236.613] -/A << /S /GoTo /D (section.5.4) >> ->> endobj -1387 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [149.709 201.023 198.944 211.011] -/A << /S /GoTo /D (chapter.6) >> ->> endobj -1388 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 184.771 285.479 194.315] -/A << /S /GoTo /D (section.6.1) >> ->> endobj -1389 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 166.147 365.469 178.147] -/A << /S /GoTo /D (subsection.6.1.1) >> ->> endobj -1390 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 149.904 424.398 161.979] -/A << /S /GoTo /D (subsection.6.1.2) >> ->> endobj -1391 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [187.567 136.267 399.731 145.811] -/A << /S /GoTo /D (subsection.6.1.3) >> ->> endobj -1392 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [164.653 120.099 282.062 129.643] -/A << /S /GoTo /D (section.6.2) >> ->> endobj -1398 0 obj << -/D [1396 0 R /XYZ 149.705 747.976 null] ->> endobj -1395 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1414 0 obj << -/Length 652 -/Filter /FlateDecode ->> -stream -xW]o0}C3*7@H 9TЩ ZϷ]h⤁|v6yk [=h`ktu<9kܒovЈ~>+8cV?:WePvC$f~ ,x=I%h7rQfhk(GR{$>QuLobDQ׎ ;^?-况lQC+yiQm!R90ou=z?+ -endstream -endobj -1413 0 obj << -/Type /Page -/Contents 1414 0 R -/Resources 1412 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1416 0 R -/Annots [ 1393 0 R 1394 0 R 1399 0 R 1400 0 R 1401 0 R 1402 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R 1408 0 R 1409 0 R 1410 0 R 1411 0 R ] ->> endobj -1393 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 703.372 283.367 715.446] -/A << /S /GoTo /D (section.6.3) >> ->> endobj -1394 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 689.659 212.911 699.203] -/A << /S /GoTo /D (subsection.6.3.1) >> ->> endobj -1399 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.757 673.415 247.711 682.959] -/A << /S /GoTo /D (subsection.6.3.2) >> ->> endobj -1400 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 654.716 239.462 666.716] -/A << /S /GoTo /D (section*.77) >> ->> endobj -1401 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 638.397 244.533 650.472] -/A << /S /GoTo /D (section*.78) >> ->> endobj -1402 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.638 622.229 234.481 634.228] -/A << /S /GoTo /D (section*.79) >> ->> endobj -1403 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 605.91 205.161 617.985] -/A << /S /GoTo /D (section.6.4) >> ->> endobj -1404 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 589.741 201.594 601.741] -/A << /S /GoTo /D (section.6.5) >> ->> endobj -1405 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.899 563.565 151.492 575.445] -/A << /S /GoTo /D (appendix.A) >> ->> endobj -1406 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.899 537.359 215.213 549.239] -/A << /S /GoTo /D (appendix.B) >> ->> endobj -1407 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 521.011 271.492 533.085] -/A << /S /GoTo /D (section.B.1) >> ->> endobj -1408 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.899 494.909 203.517 507.407] -/A << /S /GoTo /D (appendix.C) >> ->> endobj -1409 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 481.091 191.492 490.635] -/A << /S /GoTo /D (section.C.1) >> ->> endobj -1410 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 462.616 187.118 474.392] -/A << /S /GoTo /D (section.C.2) >> ->> endobj -1411 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [98.899 438.557 221.997 448.714] -/A << /S /GoTo /D (appendix.D) >> ->> endobj -1415 0 obj << -/D [1413 0 R /XYZ 98.895 747.976 null] ->> endobj -1412 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1419 0 obj << -/Length 106 -/Filter /FlateDecode ->> -stream -x3PHW0Ppr -w32TԳ432SIS045370U0763ʄ(DkeffjƆx[ 5434Vikh e v  -endstream -endobj -1418 0 obj << -/Type /Page -/Contents 1419 0 R -/Resources 1417 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1416 0 R ->> endobj -1420 0 obj << -/D [1418 0 R /XYZ 149.705 747.976 null] ->> endobj -1417 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1426 0 obj << -/Length 1680 -/Filter /FlateDecode ->> -stream -xڵWn6}WE޷6Zԋ@R\IkeaI}B'FKp̙\9̷?n/Qt{'˼4Xζp>׺rQv_۟/t2/U|g^e,{9Եq7*]Cu|L 1 ߸R*uW'G38zY:{OبOLN=8 -`-TUq +`' %!b-o5 = uƬ3`Uݡ̍*W0Mk5፼O3ջ(ɧxOuÃ6iJN/T8xԭ d -~$hg@h!ӑ{aEu3̜RKcaPBxomw9:8nv#۶YIƛ#ã?$H0+> ޳ `= w#_E/@|@r2 _ ;@y<@p0fԴn;Ի]^bi?T&V% g ^hoݯ!R@60}vϑ CڗrkP[xwޙQ5!#./3{)mW>Yk -p%dY-ڃ$ۦT`QaS}vPΙsemyLEEL4fe'Kĺ?__0 Zz ,΄)V&!3Hfm[ iR1=3Q! <a" ¹<!|yW_!H}ۡW^}ŨXʼ Gy7eY׼RGqLdÕ1'' -+>.Rb( rFDŽSxUp(B@ʉ/6uov2d2Z4 -ڜͻ,+-/˜͕Ãޝ9IE_[_ Y6./?i2-}tL^gnh+F05h" fm }(s@glNZsT_Zx5TںA,^Zl+8f#NU.E=6 -&R}}3D 0yICV^[ٜc/NQ>++4W8Qs.=& ̖FǗ'EMWCAY _0nO- Xp"?LL> endobj -1421 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [316.304 330.372 326.196 342.446] -/A << /S /GoTo /D (appendix.D) >> ->> endobj -1422 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [387.218 289.067 408.677 298.611] -/A << /S /GoTo /D (subsection.3.2.4) >> ->> endobj -1423 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [346.47 174.954 360.587 187.029] -/A << /S /GoTo /D (section.5.4) >> ->> endobj -1427 0 obj << -/D [1425 0 R /XYZ 98.895 747.976 null] ->> endobj -1428 0 obj << -/D [1425 0 R /XYZ 99.895 576.786 null] ->> endobj -1424 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F14 613 0 R /F37 1316 0 R /F39 1429 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1432 0 obj << -/Length 103 -/Filter /FlateDecode ->> -stream -x3PHW0Ppr -w32TԳ432SIS045370U0763ʄ(DkThƆx[ )4434Vikh ev #  -endstream -endobj -1431 0 obj << -/Type /Page -/Contents 1432 0 R -/Resources 1430 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1416 0 R ->> endobj -1433 0 obj << -/D [1431 0 R /XYZ 149.705 747.976 null] ->> endobj -1430 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1438 0 obj << -/Length 1410 -/Filter /FlateDecode ->> -stream -xڥWYF~qHE9?k*Wb:G9y@b$Q@%3\b7kE4y{y`T`4 v^8Q^(b*23y}HO~H%>o{+^hG\fJI [? x֗Fg$52t""t"B w^l4_|A yPuvƎYRUdTHtqBTcT8!HQT۴VuI"mz5g-5h{{\PI(-Z>Rʗ\ʢJkx+뤴̮O@o"TS,+Q$N'Θ|;No#Tk=s"&z26{\QDYy'a Zt@4Gr\.~+A0p9\;lCX 8ւn,$K/E&gyu!:ccՖ 6tҴz&WӲ` xW"#j2fķjx'/%]@l -,]D.r͸9u!CrL1&qbϒ!?#83ɩ $BhH!:s@]T{$A[sALT>uh9Vo!zqc{OkFow~@Υ+u{+v.e߭lӢ5~iRoGeu\*"3NO?$Ec%4 -$4J@lq ,_Nny]H :Ujm&H"1WIB<4o]d73+im?ܼnkL1twذ֜ӛSH҈ؾmαްuOm00 Im~5w/% ehLJ?А';t|NsݴTeh3~a6~{`WOۂq5\ys?1 -endstream -endobj -1437 0 obj << -/Type /Page -/Contents 1438 0 R -/Resources 1436 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1416 0 R -/Annots [ 1434 0 R 1435 0 R ] ->> endobj -1434 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [164.941 456.373 272.578 468.448] -/Subtype/Link/A<> ->> endobj -1435 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [159.472 180.618 254.495 192.693] -/Subtype/Link/A<> ->> endobj -1439 0 obj << -/D [1437 0 R /XYZ 98.895 747.976 null] ->> endobj -6 0 obj << -/D [1437 0 R /XYZ 99.895 717.021 null] ->> endobj -1440 0 obj << -/D [1437 0 R /XYZ 99.895 504.657 null] ->> endobj -1441 0 obj << -/D [1437 0 R /XYZ 99.895 485.625 null] ->> endobj -1442 0 obj << -/D [1437 0 R /XYZ 99.895 455.555 null] ->> endobj -1443 0 obj << -/D [1437 0 R /XYZ 99.895 439.97 null] ->> endobj -1444 0 obj << -/D [1437 0 R /XYZ 99.895 422.691 null] ->> endobj -1445 0 obj << -/D [1437 0 R /XYZ 99.895 392.731 null] ->> endobj -1446 0 obj << -/D [1437 0 R /XYZ 99.895 361.206 null] ->> endobj -1447 0 obj << -/D [1437 0 R /XYZ 99.895 329.681 null] ->> endobj -1448 0 obj << -/D [1437 0 R /XYZ 99.895 296.769 null] ->> endobj -1449 0 obj << -/D [1437 0 R /XYZ 99.895 240.857 null] ->> endobj -1450 0 obj << -/D [1437 0 R /XYZ 99.895 221.362 null] ->> endobj -1451 0 obj << -/D [1437 0 R /XYZ 99.895 177.807 null] ->> endobj -1452 0 obj << -/D [1437 0 R /XYZ 99.895 146.758 null] ->> endobj -1436 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1455 0 obj << -/Length 649 -/Filter /FlateDecode ->> -stream -xuTMs0W4}Xr\NP`)a`Zu\,989I{d=F4z7{K΢d(_ELRRB -'Ct^ -?̗b1قHtqu~_'1c)}3r,Rt~-@hP2Grb@5L Fw}iK.з 3ʲ^5~a|Tm$Cg%qR˜UdGc'/KެmWdǵ;:'kҘesJ_ڪ dQ".abYәnYqF2XS*qbd4U=wq,R -mFowAۺɮ \l×b'HPV%Ok( -l9豬õ)Μ)jfΑJװ aАA`8@YyG.}PXcʢqeJ5nu,;L7yٖE@7hC?}}%` Rzbw:Cwօ{ʔ\ &jZfC]3(!iWSςrB!~Ä񓌨$n^Aa~d?ur -endstream -endobj -1454 0 obj << -/Type /Page -/Contents 1455 0 R -/Resources 1453 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1416 0 R ->> endobj -1456 0 obj << -/D [1454 0 R /XYZ 149.705 747.976 null] ->> endobj -1457 0 obj << -/D [1454 0 R /XYZ 150.705 717.021 null] ->> endobj -1458 0 obj << -/D [1454 0 R /XYZ 150.705 672.964 null] ->> endobj -1459 0 obj << -/D [1454 0 R /XYZ 150.705 652.861 null] ->> endobj -1453 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1462 0 obj << -/Length 2041 -/Filter /FlateDecode ->> -stream -xڍXK-`Պ&>CkII9UѠՐF JqB@ѯNlO_>}-v&K]ӤuSJS&vOݿ/jIFuoJe_΋+ݾ&/xIe\`~kҦ4eXZ#c:kb.cձk;̒\MwTdiz[xb+/3qç \]=vL 'טd ;b8E޴NdP$7pk7Dž#w@"adoJ=1g@&Q8&6q濃}~|NLE4jpF;&D$HvQ`ȵJe4pۙM -v0[L0=s[OK#&d9Ф2ˋ$⟷?˷emu䤛JGf]-Ob B^ryۣN j;i.oҺ Ab Z'28~S\hutb -Ƃ!ZSiOH7h;+aq3jF`*8stZ~\`e*0qCmY0䗙; ?"i) `GzeFif^ȏȡEI:5}dq67? h%СνG b4 ͫ\Z+Q5cDktyA—5tSUjŴD2l91%:H:@zm3HL74׶2/2 rE+uXY>Dղa7e8AA$͕,"Xfĕ5ƻ=nE= -sw@VW`#F?[1>jEOhG@vDb'{r!=ZXwU[ƀt˜6@֝] 4FKs/4[Z {m@bQӬyC؅{\TehM#PWX.D,T0 qp i6R(%Ġ$mקBvjm-0 U \9 EޒJ~}Rj0Qy&H ْ ?D7|YFjgLb<(S$fdpD -|cP1^S<whm*ɷmS[7l{Jb1j7"FpҢy}pζ Ҫ|C:NJR cpÙ a(g?_L 'Ʃt⨔k.$߁vB7^nD̄\ZHe8O!@=BɇV+3owMPB5- F掫C!-aEbI4:!a<UvCjKh崛cЭd{,nzk¬^CS%1J!e9WVK0p]]M2; ->;XY̺+[IKX.*0)ݗ+SCג7#yL~P!4˾-eGN%*#!Tۖ)*,+dHa 0;DrzIXC~5%@ӭ,]~DĽ?3##K+^W#_) -[H|DweiN/\J@*PTf VQ^l -P}%'WE](;=*,_dzF<<_b)Fo-D:z{)P=Ƿz! j.0j;_L- -\'+aQy,e^'qpG`|zIZ*m_> -endstream -endobj -1461 0 obj << -/Type /Page -/Contents 1462 0 R -/Resources 1460 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1464 0 R ->> endobj -1463 0 obj << -/D [1461 0 R /XYZ 98.895 747.976 null] ->> endobj -10 0 obj << -/D [1461 0 R /XYZ 99.895 717.021 null] ->> endobj -14 0 obj << -/D [1461 0 R /XYZ 99.895 474.965 null] ->> endobj -18 0 obj << -/D [1461 0 R /XYZ 99.895 371.131 null] ->> endobj -22 0 obj << -/D [1461 0 R /XYZ 99.895 267.158 null] ->> endobj -1460 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F38 1315 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1467 0 obj << -/Length 2461 -/Filter /FlateDecode ->> -stream -xڭYK6WQ܊jޝE 1֋ؒZҶ$O&>^Ù"bW/;xa˽< i$.χrÒ0ϼ$a"7wB'͜y/}xE5i;0b?;=lΗNU]`?G= uS'7Lo|u}8'(snO>|ɍ#͝mz]VW^{ݜyeB⭅hXM@IEVˋn_aA n%K7])8:q -7ȝfmOx?Qxy" :u)Ք8ʹ| GIDY>QEr{9Aj.QgEAm=mMG6*g -&v9(ljYJ"uLSU%ϴ6ŀj`B5kQ* R#bvA:DKX.{ |tmZ<54h'^(Ɓn*{/V1ǣ%g;v?f]EfTu(}{Zݶ_ P07pc |Xf#00I pH^ܲ~'OQର+&6E sn^'eXIt`b 2RBG9~f08>5baKy#y[Wzr~bϽ4_@NcEG!s>S(q 8Wc!9P80诘I*d\z}Q)E{`(p<~t] XtLbFLXЎpSE\a lT|a.(^1}q>HH%)gkG] :+ x9`ӭgn@ǮjϡSU`'Q88?c:,n{ZfKeHdj*EVPp1 5qBDLOM -4-6(Ͷv`1Lf""Ov~ -hמK2݆yd{}'SgIˇtf8u` _81o NB9>չ" Aan4 ѻMhnCiIAx[/e?He+ɽ?7c`.`ZK/qChdotvYk]= )Zy~_ -H1W#`}(8njVJQDg@m$XK9xai̴ȼ824Ls,‘5rѓA:b׌k*mjyVG,a -՘>f?9g,X2<時7l1 0˷1VȁW, x9.;"shG$p\Kf~k 7(\Wpu 2r֔slQx=ոG^ -endstream -endobj -1466 0 obj << -/Type /Page -/Contents 1467 0 R -/Resources 1465 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1464 0 R ->> endobj -1468 0 obj << -/D [1466 0 R /XYZ 149.705 747.976 null] ->> endobj -26 0 obj << -/D [1466 0 R /XYZ 150.705 717.021 null] ->> endobj -30 0 obj << -/D [1466 0 R /XYZ 150.705 582.56 null] ->> endobj -34 0 obj << -/D [1466 0 R /XYZ 150.705 194.025 null] ->> endobj -1465 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1471 0 obj << -/Length 2818 -/Filter /FlateDecode ->> -stream -xڍYK8Wm!…ػx3{"LA͗ģ9JRCx߼dCNO<<>&B7O&ɼ~}?(>}|粒<'0dL&yh*oBp4* -BGBJUnFhԫ X *^}~bs\dztK?u-?b,XRˢ喲 ߹3. sT*㘗6ؒWګG;.iDa3hPPL`U++0WS/ԗhm{F'aeë{ aoIW6TZ|y3OF;~]165& @E<_l~;aHkcq-Z$'_^5 -M[:,*=vE]Rl+{Az}݌,B4fq i,YieБ%hȜOQn7H9|?IE&(Ίt%. =4e`ptt0T(D/ LƪRIalNEMuVd!K;fpeAJ5,NuJ`̆|yN %/˴w(8R53S|oDLt!Mٌ}. -rNl~K zXAIFB 4:pj&C1'Ɋ$I]4x>[C6j% wڭ_**4 ω2j>:t^h!R3zhx!aWJMzU.x_KCB&X2  uȞX2{pf l~\@xA%wB@­{bI?\zDzTqĎ -/\속ۿ(ZPS>TA2q=GchAP{XIQh."sI4>r-VZRŜء -DK Fځt,jۡT_C* JsfFTPb@w_eV:כ[i:ц\km60; ڔ}F(0!䛽arA8Zgț|D=7tMΚ㣈Ur<3#Av8]kW'1X{K*vY`V[cL}F\\‡.-Q^qE5jbB$xnA}i*JJZ}wo-l)o?8[j eg&йaý`ς$v 9k6_{RQ`tK EӕeX<_ހ\xu'mGjxsd^ tB(3N9]JO( -]w-t6,9ÐÙUx> endobj -1472 0 obj << -/D [1470 0 R /XYZ 98.895 747.976 null] ->> endobj -38 0 obj << -/D [1470 0 R /XYZ 99.895 615.626 null] ->> endobj -42 0 obj << -/D [1470 0 R /XYZ 99.895 534.745 null] ->> endobj -46 0 obj << -/D [1470 0 R /XYZ 99.895 416.297 null] ->> endobj -50 0 obj << -/D [1470 0 R /XYZ 99.895 232.117 null] ->> endobj -1469 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F35 1275 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj - -1479 0 obj << -/Length 2576 -/Filter /FlateDecode ->> -stream -xڝYr+ P%ht4[L%USeg10%W ʉ7<\(\l⇫>Gjy%Ba"q̪Z}Ygy*cho~Z} (μ~}yţV>}]"N]cQ -˗g{v XN^zuG=*#S:2MkbVE^]oAN= #TXϏɬPf^!iv;^UC=J3س4#뢯+r,ЂֲcƪzWvreR( Wr{H@d[2!l-{e6x=A݁(d+?qf~w ]VWuu=Q(aqsؖ(b1jP-R-%]{!CF 8 4Q55NH)7j\.Qqk!߻v8%{Ln-ـr"PApkmes1XNRwxTvU@P{oOmSEt>!9蝉ݴb z)rbpxgl9`b5*|{+z28\K_vr𝟈ӂAi -G3[3d'[(2(I'&Uۺ@W:%CeKW-_7HsV;q'1qG茉8qO #t'އpG<|XAюX]ͦX7u0;\@GɟCU5X[W'RT&J4XրxMHkNq}]1V~UC,>91/3OKy1^m3ΨXpTܣ2N?Tȓ 6g _,F*~%n$VqlDv 1 ^.An}L av#C&ٙ2،YR+hJiP&&(0yƚ+"WPfbC DYxII[D]SoIn ȜǺڥ#`y ,9{5VpWNXl!Yrݯa~!]소u3y1`'5x $ ASh&O5(@wir:Mp@E2=e$C36Gd0JhY\V~n! †\\ր 69fV$4ȳb$ Y ĪBͩ&`b4 N ~U -ȒܐX:cLmLLm2AoZ$ |^ش@)hFSjUqG xk.CrR2B3=َi|w8p> ou09SfX])\| -@0i$' -ܭ,tfg)xw/?{o-t9ϻ#ߛ5&L-9~`f@, }U*B`^)VbM0E2"N9feLa -`ݓkώy>R 9O\1 -/sweV6An0HSةJOL<7z=˹;am%rI#̫FZ^ÿ=25‹Z~c0/>qh\s}١$ǪarIuyKYO8{8˴|W_224ۗ|mC Uy~#!絓 "qU4am!WDesmЩB$G236n"zM\/8dd}8NV?s 8n>_MGEρ.'$J` 冾/f|6GTn~^[c%пG~9}c$qfJ:ߎ(aVB/z1Hb{/Rɖ -endstream -endobj -1478 0 obj << -/Type /Page -/Contents 1479 0 R -/Resources 1477 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1464 0 R -/Annots [ 1473 0 R 1476 0 R ] ->> endobj -1473 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [417.167 440.195 431.284 452.369] -/A << /S /GoTo /D (figure.2.1) >> ->> endobj -1476 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [337.614 279.047 351.731 291.047] -/A << /S /GoTo /D (figure.2.1) >> ->> endobj -1480 0 obj << -/D [1478 0 R /XYZ 149.705 747.976 null] ->> endobj -54 0 obj << -/D [1478 0 R /XYZ 150.705 717.021 null] ->> endobj -58 0 obj << -/D [1478 0 R /XYZ 150.705 493.841 null] ->> endobj -62 0 obj << -/D [1478 0 R /XYZ 150.705 310.075 null] ->> endobj -1477 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F14 613 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1484 0 obj << -/Length 814 -/Filter /FlateDecode ->> -stream -xuUMs0W|˖AH @v6Qȿgݤ۷O -"̮RGLd>2j\*6+4q&Vq&f1ܬ%=RS# *2c\lf br&1Ej8}p08[g7RP<9G@̕:͢TKuP~8c.H'Bi)vFOEʘqNpQh}<],$ -+j"UFpB52b=T3W,2Xoʾ],9aa" 5p(2˦K -6tݾ1&)V$UĕԳ&`K) -|HvnrH(Ud@"ͱsdK8OasL;teѠg[Jwu$04 !ׇP{ŋ6ĢwU6LV` ̻ܳDAֱ8f{;6BF]JktlQQaޮmxꛪu!!^L^htf,'G)$q,q C۽gF~B*xaٓn"ufs4{G RV60( PYm jJK. -wUa/{)f=a7z8,T|qk:R]QPw?/&LW j>`prIj0#` `Wvg -+j -i -ί8Np?_.pq< Ib -endstream -endobj -1483 0 obj << -/Type /Page -/Contents 1484 0 R -/Resources 1482 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1464 0 R -/Group 1475 0 R ->> endobj -1474 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./images/architecture.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 1486 0 R -/BBox [0 0 416.664246 256.894653] -/Group 1475 0 R -/Resources << -/ExtGState << -/a0 << -/CA 1 -/ca 1 ->> ->>/Pattern << -/res7 1487 0 R -/res11 1488 0 R -/res15 1489 0 R -/res19 1490 0 R -/res23 1491 0 R -/res27 1492 0 R -/res31 1493 0 R -/res35 1494 0 R -/res39 1495 0 R -/res43 1496 0 R -/res47 1497 0 R -/res51 1498 0 R ->>>> -/Length 94633 -/Filter /FlateDecode ->> -stream -x}ێm;{ITپ_ GJK(7H>1b:Et ƙi#F_G#>~}4?c1 g Apx_o24x"F#r/a64!yQwmv#%{>.9fiȱv?.(\/۬???>8ӻP C -`'GW(OFiGȹ|| -c -UBo6˨aXUB߭26OR>b,$X#~is>I~š017@erƬ2A?c!=,>[mq6k/.!HUbIXI_H?_舄?SI_!~JRIeZ_tbh=ӎO+jO5*x+! C[է'cNKC2p$k%T4.hXN::FmH3yz2igF=Q+~Z - D$$WSPszš=I$yQ?_2Zk\Kg ~a"x%MT4Dߏ!T:|K][x&/¡ M(tK9Brbm*ICqdI=F~9p~:-GgѶؗF݋o[B %} V)B['2)U?L R@Z3+|?Z8M)[-Av"1WYt,6&48cHDgu~#\ai>8~:G.ջu1DMpQ:;$bji bS?U l -B] h!OK-\ˀr&^g@2ҡ>Dn@C)cͤ[](E$nč>Q#c|` -0ގwV4QTZ ڪ;7˃K?.aUn.)t%)RX[%k2;B6ӟ3NvXQ"2~1KNE>XNK)ӦPc;\s $u)Lv,md;5C&ۙ^Jt"6|Յ -xF#{׬=NfӹCښ_k_/1Usq>nW"d0](P$mY/N?FGޞ5X!&Ex%6mX{oc5"Lu/7X#xץG*2ޝ܏Gqe |͖F7BQic O=@Zčḽ麇+q @=z.:!5Bca` |eXT(9K2TA` -feS[QRpfS&2PA9bEB'%G ұ(a=/ΐ1-"8ggxcAniɐ -mK-h{"k_=(߅~ hͤXBp&Z?gjah'E4%b9Fqv 22Zח1j8L )S8L봛Qh#_ZpbDZ?2 哜ϊh/J$Y=*l9`a" ad?G,YPտbc5'Ξɯs [j$~ct|-q~ .:C3£DaX:Dox"E@Ni5oC뇿8>I`p$I]ȗ[nk#c'}V~VG>+Km[Eng:Qw9ԥnbx߉q`8P[".{"g5W-c<q9\q8㙈Ӵݙ#咈5k".pࢷ<\7{MqꒆӤ# G\}Åt<\<\D~KĝRv$WqQu$j3Nd|"Lk:Tt>a]=ΰ=ɍwY#ޚ9}9~Fg"{ѪRq_3q\2q^2qdʬ8_3q?3qM>Z~H]&I9\kKM1ʓyM.ubN,t6:K5E& .%Gg<;[:e Œ{`f?^ZQ[ -^Zsx-Ȓ -f;xfo7QY^Rr9Rr8fzIi:푒 ӵ{IyKɍzKɭ4ylgJ-%wJّ{ -_CZ*-)Ok[qFS<sp{'q7y1Fr#A,5K=KnI3♤˴$]ͷ$Lҵ~IґyIL16>t-ܲtmt4S#MW=MW-M-MgcKsWw85wDBwJe sS/3bY$̈́69xvS0O0H5QĿɞ g1-c)Oל|]j&:2;ђTq7 s*jΩvJo:5a-atNkԼvN7S9UnS]369E{5eKʦ\;|elҵsʆxfls*6:K-awNs|(_gQ&ba{oڵg+4vIZoIMviyixib%i-is6U}S~mrѮ}\<zR_ 8ϘCwކA(}ەF`' 4Q}Xf(9=YNF6t'%rmp0!A7g-,#s7 9nkEgO<x8tp? G]&5L.`&vOvOzK[W LtKkWINvU7]UU5]Ulr/)tb%ٯK -Gbg -vK7]Uצ* NA%S4U7MUĄ5"9>gEGgQ:_ꋝ\c'#6vGU۫RernUt'rfDNDNDND&G"`ڭ\J?BNF vxv8qq9v\# 8Z>shtA>{V)\Y:S$-< ?Й"F} CB DuJ}$s 5{ <19{ D\wt<771rEAD*o:Ƶ^;ʽ*qKkUyyUWxt^)yԹu^7WҙΫj^;5t^vKkUy-WMUyUw^2Y ^)lzi'uf9Ih?+'Y|Ra.Е#dis\u{MP^Ww#(ł{ ֛kV.Σ]>/yX/XX/%h:ڀuz~kft/ B;;;y#o#2=hxޑ7ܑWkMzA^yқ %s\O|Is>\>׋5"vHH^s>9^#a5BCGJ2Gy+FeQFuKxxi.gs?nY^{l:c!Ùk'xry[Ml%s\k׋4yK[cfSㅬW ]Gapd-HÙGB|BA2+ xп @2ٷɜJ8tglp ^+HxMنA7~ރ6Qƒ<HÈ+}@u -ג]9 lU6Wy}—77{zxs^޾ׯ79x}o^oߛonߛ|]kok,Pj,Pgz޿׮Yrk(7% T8 El9xlXQ5T(>V{5mҚ=]:;u).ftG", ] -oAqC%%5-tK7wto^?ŇH).!Ÿh6@RVB&܍OD KFl l6ǟH}#/Q1-YZub"8s__fɬHuQ~?chOe|FJظƍWOm$&j铿-vݸq~? iADv$ >ҵdL7QZq)ņnw~07m4ί8.ix':`fO7W{O.eLzf! Hyl^Z\OO q$kpY zOKijY(3Ⱦ>/wߕÎ.~6B +qwIgL'0"!O.-Ë!<$q*"]*1 3<j4EDtt},m^G|>,N|֑䀹v#kQC/|e(w٦UE":^y­Cls2XE Dl Ģ`}ILz*x, @P b|dBdNAk iѨ\8+= /&k 5[]u섌tV[ -nxĿ!$1Q -|>NȈ.~ dSxpdqDGp8Y3gdk:<{mT$Wl4ۈ/9`@;>Ke Zd)OdK07ɝƬjGS3Ovbܚ'kTu p;L "kL0Z R:3/(go -ȫNsS*(.^3(#fh}8@28Y"![T^^q<8ЄqgeecYgQLCՄx^W%Kff^G L3ΨȪKGbmo|IOHSӄfшkUxacn̴ Šn`㡴 -[shCGHv=yAu5eY5xW(0--ڤK%r 9ҋT``tU1p9j0gn'" -;d:xz3m2 ƻLR`ӔeZU~iȚ-~&qFCQRBO1'-dqS"r;""RlD^15y trH8IC$YxM -l; cs,|k7/6o'k%̪#QRc/5q:eI^S敷Dzt.8@׀lcL\,j'K'#/%q'>Nvn[VA"aue>e`hL9Yͪ2q>v 5`@s蝃6"㝃sWJͼHuN8wsPc98iNX9 pr -5j9%㰝:pZ1$pfQ8u@R%Ҏ:,SyI RކNgQ8W_=½sV/sasvƜ\N3&a(soqAU9H\. wҜ9"efupW|9i,nk3PspL: ۶ u5䵯pS-T=ۖU{G=spU4.9L>VIrL./S@:Ec=I4^-H4gO&VHt:.E,CcO84T-'"8y@I4=%'H +Ə"paA%ѐ{jlqhZ^lT{2D9-)UyYQh_GɋBC⻖t, -WAc1㟋AX>aeԐ2hҮpZ U203dWAYlg|3XJ 42[v%rHUs.A3$C͟ L;L04|$m MZg'O)-h6=U~03Ab2W3 \dM(pV FZQ6o^VL|>:HVmdXnjB9#)6-HA5N։+Q?q[QA'>>{∸7 }N1w?Ǔm \#f8Pkb#ŹߦL|HWŎ؟U1{I-Dr\Iˈ?j&2wǨOU8H ӹX۫PMi ϫA!c++iz3'!$SoWKI&L7I~Mw˃ )zVhQr~(T%99*Nr_7\uQ?e :uQFT\j;ARA - -ܳGyQX(.ުVHRVɌUy\|^MlNTMBX5ZQ~NeG(M$Ʉ@wS6ѽh1C43:?u$^clN_@\Dtڕ_~)Eh# ſPZPp KL),۸̨uMH{ʍ|AG#Q<A`5EE%I5(Ԩ=2@&Fm$G!8-bX44"9&g%׈ş yEp,YKe9Z_' - ʃJ]"f%r%`2z?&WFeS7?׵"ʔXe^r?iU⚪DTt#赞>C_W=zŐȉJNdWŁɴ=.K0nEKe@I='-\^3wqiaJ*I )rtO]NA:ѾmDt ӥ 0\tstv;,Vs1π!*LTܸW -w+xP?"a)6W~\,HA,ٓ RvRNތ֠MuMd/q7{>f\OaMס槺ShlzGF'+`u'ኦ\IR2Hc0whJB%j]G } d&t#QBʠanhOUM<: -}߷giY'jjEQdf1[ -}NbɡuA X)S:(-R"8pᑘ<`"AJ1 B`.K}IGɥ&_ɧ(1[ *DR0Ɂ5 -Wh_Fʍp9?f$:! )PԞl@#~"övfȄ@*@,\Ȣ.{ZI DS,{.R2DH4km_!֥%_VjRdzN?/MYgű sO&Nm ׊*YOO'āƒEX }ӢS^Tx-TpqsAD翑*z9r`νVh,lPR%{] [)[(}ûjN ,†"c/dz䅑`=*b:E/J4w\TlUF7ҭsvxRʁO&ɏ&w)WU.?HI JBr"gD8'ЌqF5~rgTД"<E&8<-)'qFeAJk0jZ84}g:|J?Nzޞ9F7ӆ'qZ ne82g.yR]q"\~4EY.Zę XÃ8't8Cfg=s*qFEm<e%a!Όqh1GQY#%J(>3ʍx!ΨgrKQGã'qJ$i{"SFFt8%-ܴIk:@saE -z2W=%:m ,W ԠHuXJ-3<=f]#|#a"R6w blM^w>jŀ܅ o[,sSPwW`t7M``!IIƐBg;97B=HraNWf }OҚu"Q⨁y&j,Swm*@P`z K{ȼ=sǷPubE}!.Z6V)ZӪiYPuE!A}Q5.".B/I(% j".AS2$'@rdU(-HFڑG!bZ b^x- lQgQulMKLhY m] lB2.nPQ&. rCܓ!RĖu(_CBLe۲V(-W^o_OuX-CIQǰlrh~UeKXc ix-vA3w(>_$i< 78?GPOVn -NvcZRwPޝsz3x*ҵJ h:uWtS~1vr<];]&|cSrkHae(xnC׉cSp cJSI@h\ :B>m?=/^8YXO}xj &dt䋡ؚnU|1< pB;q0P%7g [^Fߜ6 -2Ш?q3 mqREwrfhc -zO.*`iD'dW3> &Bbc8s$O&OR&脛Q~[N6 rp-l9B||@e3)j02s r74$b-ۜExh?_7YQ]7V6,rE8[5:bErөUpo0 -Ė]OT6D -M>SՠIv_1yZFQF< :atxv -kʨG8*s;vc7틨71JA/ޘ?n~+=M(CޝTȗwQ"eVF![^{p"a!YyvTT_[ff UMl2]tJrkJ_NK -StÁ'Z{mlz3$_>ǙaT o#iٴ;4h5ZQjI6fz3_OaSƠ=Ѿ|elT͚P59'~տveiC__q0KJnivj^Qk.5:6Q$'6/8qqGe'Ep$rR㉹9.#UD|= ,n -Ee@Z42D/ZABye}b98CYÎ -C RYzI6_@T;EM62*2F˸Jz SJkvkwAr+ k81>"'Mzl~ButZ2Z?{e~]bMC3?1͝%_L%9!ƲוEqAQ<3x3DIk]&'$5;c~l 1\a}עJ:ښD6hJ&+cNa-a POٷF\v5Ek_:R^UsДgRMdmiLo^pED٪4u)Km1ȳaOQdO8KVb#uI|9@8',ƒ:|fg -W9GyY'41t(nXc,/YA1dهȸ+и]ɿSVX #^Okħջ-hK96%;.qm;MW"{ - L8p<Q7p"/x[)I(ڈZk(T\__m|1Gx:6J'1 PjanF\ 7b2^luLm922HRTi~ԉi[k\BІj-Up=\Q.gQJ-OԵKHb ,_Ĺ ']7s.%,pxzY)9 xڌ՘Ӏ.vż{GzPPɦz; ~GN&i849 4Ԧ}@x_tݼ;5fLp!5\iNNd{ x ]g(?TU>v/}cXcYjqW˳-C՗ UxF6U\~2GX;ķ2X 8)ӈMtZbâ|6b->-yY;p{s}XXVkRqjAn8wnjO܂̉ooWC6Og 1VZqGS!f5 \Caf:h Zm4V0&AW[XU7|>OaӢ7]E9nx1e7 M)$lL΍9cf/m$cE7 .ۆ83q(_' ǽ>q3-z֭&- _XZK竽$nKБ.:|fY`|O-$nY~s♸%qH/[>om&]Їul/'l ȻAbcJՏ_ +q G*G@gq/hjb]V+h}˼/hmw@k.kkxҁ -C|fls؛y+!yJ^2knoqf]7q_7@E\xȮh([u vmn 1_ۏbuZ5к]4]4v/8q;θ ͢r]8fpg5wjYڢeӝXaUmB_5լ{ ;U `ʵƘYU 4y(V,h4vFuGk钳,;d|0uX DW֎ -&!~7.X^] 9Pݘh0PUZ 5jz&B} W9jv8 3w"]j+-D2cG129͝һLU#+G>UW˜^iW= X8qc<0t^=c%0tΐCczpa2dov?Mf~S'n o]YV em#>75ҦƬ!:l4llܶLOtx7P 㮐p^~)} 9Ao ?`GY-JsLŰCXIvv?U~J.;8`k݃ -m͗뭆:#Y CEX|B[]\b])>a>BWo<7:uzBQ3z@@ a -'x3|nobB/&|Z󁏵eIkǧ̙ƙUCmp94RۣF.xMj L4Vh/%I4W!&J ҵ+/Ĵr"-"7 -Q(h[EP9ф*Kbz 8/]EnWnმ/~mw˪㑫y9o#bgve&I:`DR|;?]ΣmwLz_)Voy' -nw(ܶ齫2>.ja{ݱq߱QjXܷgx-1ү*`# i?vj]MYYlVCQ_q~ڰ¼|_:)K5. kC˶ `Ɋc2h|`Z/;ݱo"ݱ -F:VW*;i]D߾Bx -uSNcWmp(G'9z|G``D_qtV{/Mpq??l]1_ǬQdPڿ!*Zzbf~\a$X]UKY~S~-%/]DEaZpu7z0[KK8| h$ڬUJ)[/)苔Ra*L?11}vX=8 9wj/ySo%`jـf bd7Bf о2YhOpO/ x 81 ǀ|7Y/_Mÿ>bn~۵4-2$\E+*ѳ#X&#:*襏!'8G_pOlp$!AMjoGJ(j?g9ص4!|?iyL# ~˴iBFV@4AŸYD7.9Q-NњGOIPݭ72^G!MDM1s CűBU8~:S)B2Q2z=!瞢'tO$TaϧQIl'Q^큪#ih^5)Pۄ4-7^(bB"bˍyxkQif M.eq߉bXWYtprA[ը#YGlWv#W~BBC8NsxZg Jj?Qoc|q -#*X -%g [ F>"$Ts̈́ŜZxtOǟ -=x ?~ѳI8@]W@HL='DpSAD0 6jdGbܘG>䊆\HN ^pa桓V'QTpPX8KD?dl;fQ"HZH7Rap }L1aeQZM@H;I *v5BVx&FҋW:5ct"%ZD?PaRjVET=ޱP:58.ى\[UP'Kt`Θ94l3CS6m`Z,&hr(sr6yU̺^EӭsçΆ ,J4XO/c&x&p99!7єrEr@b:|>-9$1O 6ьzh#+V/F4O ej"פ'udŒ!4,#)K`M1)_(wwY3b}y먀jj/(C5t!w . R%e"`eU^bג`^a(>պn?XC Ҟj]V4jt "pZJHgW/\ ?>D{p%mDW9 pW{29^\ '&q%D|~p%9tʕx8W +c\ iWڄ^/5#Jp%i|Ju\i+ S+ɕpZ~p%8#/\ Z'ӄ•0\#σ+ӐJ?6gw\-J?BƶؔJҫ -:JNW'WBu7XNߝMVЈ^f2!F}YGC\z1xaQeSB"8ءDXמ5.QQ%+VZ X$HjQwZ` -M_w >w4ȱ.<7O;4&<9QBrwt=%B.0 U`E>"-p AdtchK%Ħ=k ļ]cG+wo#Fc5"1yqՎ؏nd2Nó DE b"b$ -&~ЯL=v̶CHK[;ƼY?iۦCaXgiA\edV~X\;G#)f5o1o<J=Вiii9_T6j,i݃p4i?߫~ hKV׷a#M,Zm@dqZ;Z?_Z~~|Pic֏w1=e5~~9m*_N=*ZSjZ,>Z@sAYkeGmlEOQ>?8 sl}Zj#\I kbKkG tPVb >1򨅵0",gX'Lh0@kZ"}X<%\lark;u4~Ga-FwXFZ9jՇ+.a-|ALv -R^Ls3>>e}X a!5 k%ԝѡa%cZcM a-d9wX 8ZwX 5\y -LΝ?XJrzZ! ‡sk aMrk-ЇZ9Yv.*?Z5m*+}ZXڇkJ)-]Z9Xke\ϓa-3\S;Q+sbBkyZ?a-L'(a;gD g,Els9R$,?;sY4F?E~/:KY}'vGP-Z(gnH[lLqXgc@a\'F!!"q<~{ɑ,y%+I99ttew] *YgqWS9kܓdZCݛ;zU5,ΙV21WK| X;NL5FM0 wo_JӤ=ɇV%=Ky"`R]ӿl뉍 6Vf/;۶jx |1y}RV eɄ[g,rF= ] 26m42Y®;qhbcA_JݳZDU\űv _%d+'jA6fAA6tJ{˹E,d7PųA6t![N̂l=DhWؒf' oAB#'xnA]q{pJ74A$Ăkv"3?i[RomG-BZ#ci [_ CA-bZ\hJRR.U(_;'ڬtXɣ0͗(9Uw,O y_ w8 Rv !Q9Bs r0h9-: QQ A/%w6.깏/{DL+HD*no%59*7'+;oIpCZw1h֢EJVຣ U>VVt}nGsP.wC;zlpGAFxN4Tk\ߩzzp!{L (ާ]@:(/}İXa~&.xuj,Bv\E2 ԩMg*fG`gԤi G-Pu)Uao[}gj:۝a4Pd/PViOV B 0T3;PAD,ð1a%hVmw_X;PAL ȖaS]N^C~j*{Rcvs0J7aY>Àْo?}0`#cT&C73 +x2v"%XU2 |PFZ0#qa],jx &Q||`H]VI,}AÿnDe+obXIRYPDHw#r/7qo A(9~s+  n[ = xLIG.̞=p4 )p:0,ԍ&BP.-$i{"9|6<{hI -NʙHƹHOq9U10B ?YzՅIY49 %XG! K4}T#Ks9/Krf!T'{ci.ԣ95.1:Ib}vXNF#oR&lZu$v>+% rL]d - >E,5|7숵,ڍ(^ٙWcڿRB>WNٺw{~σ+{oR<3kH6qkJkv|pOiD  8@,jrN > |Խ2׷Y#;b._@ؙȸ 6Ͻ&L8B}?G==4arDUq%_}r+%.9e(ca\3|b>2ڪwqd=i;j@q|n:Vӄ\;>I:4eHGʖ i R4A^烲zf/ڍi6)N}BC91DA6^l#mfkPʠs4Սqܻvf#xY3E%9AQɧS/4 zժ+j=2yF..ʾ~4eFטթ_roLQo_MP$LW$55oU2_-Fy>~H2?-iG Cop W_/RxD:˭wT88.zMLH N6uttU|R'wy%`O<;[䡟W9u\? DZXi ǖb``M-H>1,ourՇkJV]92_O9b%ie~@W |Iԗt0E0B? Vt#d9'[Ry|n}6 2u ز*6 X!Ȉ6klm/a6>vhFgr:0:w:7S‚.`؃&K՜]KA@$Uu$zڛI2 2%Գ rXy3t/IsSWhy(G__/^>}o,!2!¸SvI&Wb -욥s;Hw};xr/~yI -'f2"9e#Mծ0ZOo m2"t7QxbM";v (-Zt,w]}L?socf9hoef' jC&.J5vV뎿?+2e[лԻ$p̔~kwM^> wqs(U:t,j?TE;so)sV& -n3ʞ_)C7 xj ̭ {ح[9ʣEnG;>WyjۃAyGC.ne"ч9lQD<10),[TePG&Z.Uʈ9M-\jᢺ -e'RCB@<`O ~Y('4ìM3gS|81T/n Yza^H5zad5\/ z! D/ӈI/D]zR bHLtp$abxA/\zL/QK3Mjni^Q/$kU -z!B0ҔB,+dbr 뿲^#ik 'KӦN37,gp^`(/2ob ϶hPjUkS 4A$WpG·;ZBdqʨNw&tMmNbu!45腕B_l YwѴKR \>ӮVb0^B8q8QnEHΨҵq.d(.m|BWwu!й# BhbSZK=l[Q.B}=W7rn &5;#`>')|+/2݈"@@erↆ7K ZzRi //.ʳdZoE*xV%s X3[ؕDkMٷ>asJf"KLJes^<zV64I@Z jhZZHܪ`gp&)KYHr0pɂ<#QH<5 -U\?7G)4>Zd?ةGS7V?5*f$285M`BpuTA(VI#,^ -VC '?7eC Al5fZ ~b{BLj6F*R-vSbeMr79@>a\vC;׳nF)SQV0T&eF^T--u|3_2|&է:N+q:ʃy܉;*(QK/?G0)1KRW12jY/ӨvU:F{kHBu5Ba0 IXZIAe/ʭ[ KzGk{A~_vt~T[71$?g|3 u '꓇C'ߠF]?c5{:guG~c56c6ogO+N]Y.,W<XSȳbkcwxN$7>y̒O{C''$lcY4'䱈b$<pɷmnG<}Unl,+Xj`xjQX 9~ո='865gFS>ʣS>)2m?c5^N(Ny֤Pwcjry:t90t-tſƢx:qQ3VˮX n{4_'gh$,j!_;7n%oڑjJx{ &ZոCjdjyiכ6|jyǘ _~vn{P?C?S;*>} qCc;i=X=wzӓZ=;".&ciϿ;eZ*E̒ڬ]: hpJ@ I޺}5Jt-WsDžQa 낆^'qĆݤw6U܆=9W@Uh$?] Xf\#luoFp[:H$dk>/pg=, *:Uh=ui]-ߧkWuRF .'Za KS^Wm9HqN};bN!f3 Bnʦ1cyP'uOg 2MeOޑζnr/"_IߨN`% 'z.  +/M_(dFhgts ,e&pP#zI0X"^\x/퉅7PA}lz,W5^Kz7=%G2Fi1T5~7F7u=0ܟ9~m6Y7^`m̗ ju&|}9F)ӲhtRECRsR~5/#SwעdR^w#"` } Z%AXzaG^P3Uo"6[K']]8_-סDͻ#A%UE4]J}V4yQ~nW+lpP$jإ?_ˊTz"Ǔ@->ȋ17I(%ӉIR9G_I^lCErnP)-/rFLŊ9TJDovmZR& i8 An8bl ԋP>gg Z΃{ݝ0 0Ht$ܲ4 PɐPJIy|VH@X Vu(~΁%Rw5r ^j Q%OK2,~Zd Io!^kjaP6@?-CS1#yv)sԂl[.~2OCLK(G-e!YdYL ꇄЕz2Ui4mfTnc_>B\/C<@?( iNt k4X+_c^lf/#pomku!^~L*% ~=^i:%ڋHP1rq3~XJItÚ%X ӤDHŃP+yJŃPԃP`M2,D]wy 6%VMڙ).LK Br BŖOд:kZR<x=P_?_R<$&C;?^;̓am#2Bd>f>Z 3$ fOA '21D*%06aiN+ 00f8re_ Gf| 3Zfi 0ز~98¸o+S 3}OwZXs96=f+OB+ҴkLahY n <<F5;(FI0Ê"f.- kV` -lӴX 3Ǧ r 39tC8c"VAC*xR҈r퍏X˓bj5B6֘U5 MSVk|Wںj+qZH]eD8#ӯg4UjAnQ,Wfՠ_S7\5T \et{ל3Zs5%5g{ ė!.#Ӗ6~ ED 5JFjW!Rh}d7 - -Q*j -g¡YՐ*YՐ -L[bV5R,[$pdii4xV55~8I_,k?E4O _<L ,,׬jHu/xV5yV5uO0Ϫ[˪>B+1Y87cU,UM,yV5J UUmu5f<t`Z#9fUcX=Bs-d@2ogUggUGy̪rɪ>B+Uz=vp̪U}njɳ\&MJ̪SOgU_^:XV5UEWgUKQbYjDnrųi6}qm4x%fUe-U~D{V5U gDx1G~4#| 4 X j\+-Ьj\MX5wwݠhqwbx 3O;AWnsfe$w'^5=0HnR3W4m$7mA@z[yrwbw8N"Kp\Ř҆*mX_jH=D-T;-U 덚Un3<&THXNgUc{hU}]˪m͞U}1mīD%fUzdUߗ=U}U}Q*gU|zVuƬ,׬;`=aOU *UGP%xXEAʙra<-xG*w;Y -0b(TF$"PAA<>*b4 !PضB=R){Js=Iʦǒ1|$meUh)l9K"Iz[/+44˕E֜M MB5J&!’X g!,6hɛ -:4I%&O J*MBJn@M#ThWM(4Iң -LBIњKIʙߠI9^Iz3|I4 bV+Ap(w1hR8)Ԡ$C$/Tx;xf h٤$gh\MMB(H%s;'ɐ -M$=+4I^e4M$!hv $ʡҔxON$oWAgf@%ݠ@Bt%s-!C4p -+mrY|=xE:G+@.$]B̽m/h~qhC)-=M=5 ֔:j)x$هξ|PO1Ot& vc$LP5nUt7*9]Pwy9qz -I%Pn Cc<'N lp<{FEBy_Q힌wy= xEị趲꩕F HVC_r' -NDՊrr-gPrQ4 !H !rzoIp~MkdtX<3=^wygjM6 tk;0ޔۊ{R-wף%9_vBN7f!ۓV'Xvҏ#Gp~$Rn{쟈nyPm@ݙ.k"۰/.FIz҈e۱aGlNӥ6pHw>r%V&}62=ӎn^${ -a= P, nǖ~Z+nӂmn~P*khÖ&&G/-ʳHGDh"E?ҎYt?V֥U?9/3:4R k9/~YcpϓG䍐vkT|vcNfi67Yڭ#Ï^z1B/M9>UMkU)--(S@p:R׊ƺytVHy)/mB֟ 3zej֝_a?4AlHynݜW!vKSf9*Ss1шIC%!-IC۞\bKqKq |Ȕ!7o M C@~C<#Uk^!>9)\yXVSDWkN#CТ\"mÑ)"cMz+UFxK̟ -F?D19JvEia#%P.{6+EM21cKI1MKd9DE9}Ja6e*;)r8ZZp -vf6 -U(NteU(֏.6EF6b(#EKՁ[ -dBBR@zс(v|Z^t.TtxiT j4V-:P*H4mgӪ`ErS'EBIUjiU<(sBD:PTQݬUyW:P,`zv?B|[U ۺ2X2˪<+m[\$g蝳$ss S6_v _#Ru*6S)u@uhPu^uX -UL{2b -UsP~Bg#1kuTvG/l^Fj/jGpEit?A喀ZdԏZW5YCLoJQUKuc 7V^Ti$ -yH:0?w - Lyȭm,0_]}ofF&C YʁPW(55&H_ή5OUG9]K o*T6a4Lq!BI-K -R)äkU(:B[ 5]'Nޢ!eZR8, -+ fCjHLyJ W -SyhZ)‹LGa^ጫj#CJCKqVT] T1/IɴL}j"q? -K <ʮ<4rxin~8.;5? KAA>U=UKɄҧ*0ͺ|waQk@vr rHE\O#7dbľSv$K=#ʝ5 4A[H}V" / 1bm5ws0iXl M ;e].i$$^;5!4rQF;BpDQ=Jin\[6 -9]ى`9]sUJRBCZ9ޏr;8タm`܊  -×kznqW''HoW|.^xMG*i)iZE8~%;(D+&&[DLл 7-[VǢ '|N3oa06h|o;f#Z1^LWЯQ`CiQS)9bb:qn{n7ǻȘH2i:OݒޙmD@* H t$! ǯd}xcEp$\^[YmF+,H$aLǥq*E'?b  Ha΄ -HW׻$\r#>OߟC{bIx؆ YAUf%8E{Qs@JA2]ψ֨to;Nw9px)=HQ!ROov>=֣[ZGV<'ŁB WDIi(S=ރ=&`,`-q6-!)ģ,'D]>/$UV`ɩ !ٝ)n$q`2˕`ҽkhz"$T|7jUFIr)|N KftR+L"6|Q &QKuP%H0J0^L^yUH0Sɼ?`uS>k;biG<;9^([ʆf_[sDbʚdWT:kYk- w9<5TAi('6?VL~E9 :{fCC:C+R:f5({ʸ΁mtu5E a|ŒU9t6)qao,;S1ȩTH cߛN݈px!7sïDj_:HYS%^$OK4]i;Ks=5ATŋdw%{,<쥠߷q4%<Џ)ɓ w7\UrH#$'Kp& 2ޛХ;&6}=͡[@ XNR^v3$?8IxN!䋥xP9)4mЛbH#x֯)tGHݫc%X/9N`=a.8`Q^o{rSiK3+v0y1#;<O?3:ASN@I gPّ?]2|USy4v_̌C~f4\?h>?p/8Mgar. sG K?dsvS.Eo򎐱VG{ -S}y?|}< އEۈ?lţ_ UDelԫ|5Ay,)4=&59U*D@r/~VhM9rt0ކH> f?ʛuڕQzms~_\do(E2)̑ExҩHSqw1lzACiJhe'{)Pekw)?{Se4㯃;>Ή Hqtzvٱn\b"nqJxy;_c -ckPf*lI3 UQz~inIg£vDu 5޷{BBc,'ʑ6 4`5#okЖ8SH3ClK"PQ;яq! S=E6鹂x% G xW~ihFq_V埻*4bV-BɈ"vк~$d~](P>q<"|m~叉tXxB?4,!xk³: :^A1`_rQؗ}a:-`?,6N9 #51`;-Ӻ[;\:3VBu^ n/g>v!_I ;{ܼ."Y'ɗ"5,|vG].i}bJD+,>6ޤ7lY7aE *D²G|F;pTR# KqlQ '2kx& -u)괼22^N0nGE>Oe~oKOT\ok=]p[vYcƬk}v{PqE!h/>Q)4Ѫp7^ܐ}Z׋7@Zƨ>f+g}&F3&G{<3g>*O܏8F>}ݲ2&F=w՛_Z"N3@[wzOյȱxLPUM0YRz{y6\sxêE1w6{nFظ+v]Y=ʌ.dN]p%.>O/FnU~syCߞS{/G߯(^HksH.QYgB JkoPKS߀q\DaCn֜>׽цs4Æ*Cz`*V_~oBj!{<=hUd\zRuPIq0yqlTqU @tT9E-6T$rI -%P댉9Mf  -S~K 9I|79Nz*@{"şc!& MoEcU hMĐEژ}{zRbka}ޚ eо" /ZcmvM![3`MJx¤ϊ Կv=wk-`tw҅>[^[F,ٳfbX?;1ry^(Ж6+~%RU;ҩOcHz,Lو3Aazb6m1'_r9N-f>X(^(6UGՅgٷr>g_Qz#Fg=:F~nv7x754Γpnsi/wrsnҒ{K*맷˨ WW}L/R(T~m]b=c&i7 >*5}bP&'?;}ّleG,x6Qz6kF!7i&#/IɍNUinԪ&y 1{4K,eUh -ɜqX/Owp.U6! ő[]VXfgb%TU hmiZڃ-P< +`.q+ܚuM@/`wq#^DZi]JƕIR:]VE(gt=kl/i/'퇙@l ^/wgJ'GbYłpо(ڦ ȷe-~ 0G{1OgգPxPk|e8<.Gn@|qe]zpҨ@FtGUζg ]G{72UN GA|*۰#C/ -£xBX M4x`/PK~ƋvB'lx4=_oo9AynF_=x&\zۅ./ݞ=]^z9($m ĽmaφoNq[U2j4jԇ|P<FXeb+Et4$Qxl%Zot*P j-X1*6]p0(l$(s N(ֶI2MseWQX!U8|s3UdnB{ KޗE$}m@uy5 TUA8Sp+g *(TK⣫{1 ];3Ď;nt^xwǭspj8 /}DlDNVaٻsк]ktC!VUށDvcn f7'A|#~MA5 3T[]=\hLЄfvfu?mY8/FDS_f - H}*u^<{tˮ(mi/݂26*QnP#hlsY\(=sQ/bM,t" -Gwr5pk n 0|O#t[pĦ i:v_Xq{ǸX^v%Ԫ]a5!][j>3Sկ?{2[*Ъȗ>vYD|fgpÓvXuk$`vj 30(1[񏸍f7IiܧG$-~s_|Aنmm11ۆvn.]}̬ N[bb1-d>Qsn[ ʙp`,[m>38>E O(yFBC;+27:E&yFxRZ.dLR'?QzJBdE{NaMU;SPO!(*8,) O51MkrŀULCYURjz'Rʜ $ p|Z-6̍^ vk/7>n#U3?'a;w򺑿!;[ 9v },XE5`':]&:C 5*2-Mzx~EutVR9:5ÌG<1* {7Dt{ˎa==@FZ "⺺gj،M2%~tQWnO+Oɶ#Mz#ʈ48Z0-19vî_-G>~=yt n5}sCΐR"H!S@[`=Rw׈'A#j_nqp?F3?M*ް< -! B[ª-Tyi\T~^]sO<9hEX¿ۣ$w%Wht;@;0 yXjv#-lraj*"=d5]ufԿ(N; ^ykJA)ɨ[FZ&OVeX6OPBN3 [CuIpX>\t_ H1xվ% -.BT 2xL"jHS0*yvg/fwNJkr9i9Mz#N \@7E ϐTo304 s2P֨BPuN`o_Gک^WAlM;PJ[vMi;r)]q~ L/7Gq, qV;*o灐O+v(| n^v -қ>A@/& ޸/6XXՀcz(}\a.pl, 湲b^ldf%+$TrJө "t-Ҫt@r7S/octf!6mGS3JD>H  i#,飓pQ$>Hvo=;zb=L<+ e -b* r?Zk;{Ю=YULg0&m[l -U݌t`7\y6|_H}J~!e_D0Z1EvCHf1WUTA[{&Yюʹx<;`¯`oISɏ#.rU*W]5k(V!YԮEԤ<ՔfНIΑ|O.$)/,Kbl;obrB!z3;?Idơ6IJ sjS)x̍ܦKET21ۘ>`q.a諈ffVJ5\bz@?@2|ij} -D 4UOpDgbfZehߤWR[&z5>SQ>/'ۙr_Zp!ޢ%&)BP];cyKru-mzb~l! 7j2?u]}VDOSU0m&$"(1[qE|JQثrkKBԁ :MbPmK"a" 4&R.~?(H^.6.ϿHHO}nj/04>D1=vx0Pw k3ԨlArh;T燂m~5tᔻ&ވLC.?@7^4-?36ĈG"Es v8IԂZQ#sa;ע 1c}Vv$N/`8R_B4؞3X|M,&8XXD*?GDX?I#kQ}!I#-K/hqv~?!_~ćUQ IRP5ò<a6N7 -^q@bWip"*A|t >#$Ң6sAoVk٨l -6Gh07Mwa!Z)Md"My "o@ hy[n&Mi7l$#SM0>0pR@(}KfFMּ L ]3 WJT >h⣋//o -nLZ0{0ߤ0Nqir9'N0HpuBUڈǤ]m_ث%T>G:A7h8t{@;( Q5O1sx.!|{ٕ2s||/,{IfORdG=[ލl;{o[E?ND+;,D|DR|&|J8^|/}GSD%=ʗk!{T cFTB=: -o#= AρAvX6:ZKR^W7^- B AHA-C{rȽjr#a{("Ҥ_C]ehߞB CDtrނVio'aZҰH{p`{Ur ˽ō2.AhKȚvIтU~" K+6|W֞GqξŇְ( ^ GO1  5@{P=fH {n1]C -K) {%hEd/jPe!{QlZ%p= ׋A1ce9zXZd ss+z".yG s[1zYh^ y7׫ {ɤFmh͸5vG\ofp=\fO ׋ž \Z-rwS>qMzq:5X' Y==αF`=:c^FX/㉄`陏ula- -2a=7oz õtL͠VRb!Kb^ԡS3#|==:y ыg Y Gδ L՟=* #"zxCPiDD/6ew,L* zqѣv>eRya=Eu@/,4@/Cl0@_@L6}G@,B60 3#soe!w*m_[ -Kj835<He`yTnN`,Gj) =g;*v[`Ih -3vrJxJ\NfMڮ -gu< 5)'|US+K'soɟCP,49<}3iȏAp -)hD1繮\-)hupTx9S`HA?lti$V dAE%vJAMppRʱH|$?[mr`dHH/CR)O)w˘028"RƻS{p**ϣmN5 _Gv~?q_~NET7 -^edgnG!K cܯ:/? ` fD]4?w|?tpg #F4 c\+ &WP ߾;cQ/ҝUU}a RdzZhf_ pŐ+H'`V8J/ +K?Gi -g*zK09w\V`s]}{`*->J6Ò!`0zc0~NoSa5i0z—SQwY5T#LEqh0m>-`z'^O/Ĕ5ƱFa4h]f|U ~QG~$5!lVNXb*5^  *ھ-Ti PM8SkxfeG -kD!w㨝5}{!d5T4Uk FanEKk#S. T ->E7LɽV_j0P]`Ex[e"4* i/ufa % S(אTئN%y8T) -fEPft -[7SR5{pbqȊG|hTw…q2<5 ؞cGxJVOU -O_ -<Z<Z@)&TB?Y<>RA?)jU(F70O-45SoaTt -Z<Snc%p -OW)8NEShu6NA0S{A8;)l%NaPyeep -j{V̓)֌MO F/~ 标:`S&"x`S-#0l*NA^gyb8j"$Ƥ -8ḚrpZ>8SEp*|^N394Z\j^dDh -K6VX r@§Myn+bSX6y8<ڃ|+@LÜ>h͇U>E.S8|z/>SAa,|Z::se| -GɉqE94O,~I)w[x*6S[W #= 2>[ B)2Zb  -}$%x -p"PȔ4`dx!hDw1M/E",& S3gcaU*FQ\?Q-.k0Fƨ^7ԇ;<}NxkiwJCӹ>vWg %["Y[7Jx1Q3x<6`T^#G Z⹣) -IҀw-0!+/ږ+߾Ճ%k^eKLV$9gF閬S\뀑G~8eXo? ]$9;$N&N< q|zbs W3_H`R10'u䅇UmWAݿٟ7WZA*"1_v(JKU j --rQ2 zK./5;aߖ2I]*s^iB$PV}ز\6HAb UwҟEMUQKl!=.INK`V &[ -l+(ycYע -QL4=u fo#n4K:2@C%7,߁LMVe@Η^jźp}RN~;|/~1QfRPDsi?k :^QI.]VyU r* -o@r :Lڰ"]hldʾoE"^䌍lLEj:F&D1Vwj:H3|d)H eWg,16eh *̵`[\F3:xqStfK]iNUxTUTv `CfO{veKjb)V0@k] - -TǁK2~;qO - --*_|'ێ5)IG[G^)2/cfvN#1qGzY 0$&ya(nj]xBK \jr8.2|3c W6]a&F0AIo*׭W(O Fqp:'PtSPcx(D.Cka@=hnϠqǒp|G >=Aj!gQdbةbC!<A;[Y6U>O*$' -̼T"o{{M㇭uM [n \dZelຮ$^8_Mn,f?S-x&1[h.uf{{P4edm nQѐˠ+yp-Wk| anp;J:l~MܫBBXgN? P&?mJ0C ) ,H>vl-I@·J 1C@SV%kzb';1|xeMMCDMzpWto20-rA%~>I'/p/%w7o.'h栂߂> ź1$f%L\<&σRq@fJA>Q1X%O"YK1BtJ:7¿x»ឨܝ9h̼͛s ^Y,[fdqYpjoIR: vbrc <؊I8#1r^|e ;&Sj0y Yr0'(i=MMLc}aR/8noWVU򎧕+wh"Ko 9z$JX}GKK:$56/"T t:_ImPTçjBAotfF+z*+Rp쇟\~TmX|9o' -cZֱbZ(ȜL' ynwe'ؔ_5v\Zvbx10 ?ҍM//U+ ːcaO m#螵v/\jbc-Y/` ="SQAR,Ӱ :M$}6?_9evB:%~!V;L4[;{>AME.t) h[\t%%Nq VODN$-8$fZÖŪ}[ {Nlt<),7nO6'E@t[ܙn~y@g>IM?u|`|J5o[th$u>tjKW/BLW R*yQm $qT)vg:*H5XW_/Kw[0Ljw1NN4|ܗu5aj^՗nߗ4mdR՜Ԩkb榜Eu[p&Pw{ǿԪ:6B.H(wT= {{6GQt?ߚXS3UM[Ctt?=\PO:ZXSӼoyY M'<$bger*ů3X#Ar^-~qO>"X{"}>ܪ5KjtV >hXr -77!\hzG0[{ 'N;|iyT>lh7ZBiqF_Y_63 -dGt$$#dmc8/ߘ"e҇=Ia>jD/72{IDج N?~ױ,<'gDYl!_xo0$#E?&M8"_'hO',ARgM{B_-F+ʢ/$G)=~GlLF0f7$:`$ʝx Q챬o[mVs󘎈ZL@Z!#'81`; s*>4Bط#kiP^3iU26XLBtLT8$1?m<̝M%Lp ĸj1 ƁJL7ɶPЯC9c3tЀz%e"oV.<1QrESbLM=ZL-h,_ b:h T~p.t,)G۷"j ;ޢUxo'{ y6$|;_k;A9IKM?fizW!6DTM˞-޻, W8#?ދ6^~VX{7v jCڄ&#ARvg%?|(9!*{]Rތ3upW;\$zz/TM+8KSqԨ #θԞcRq؃0lZ}ZoNmJ/֦_a^Zn Zܪ)DWU#NZoD-⢈IʫFn-L+(PmQ-d}?9HhI`}+h;cp:cwp[#@]FnIe]csngHd<; ѻ$wA}82h_byl|+8Є xʂ׌^zUM!i݃[뷅$Fe֍S0#3z񏏿?mUɵʞ$*)95=p0v}}k m[[X#`LT[lC~`1Z&,7v h!z{"mkRWY -W^ &%JL(A'4:D|>NDLF(nN+hZ/~ȉUqps7<5v R? {a-b l -ocmGqlNi ֈ m=F P*-T`NP<9UB˄ZpRn[@DeZlWB;{~; r__^گ7ӎm'ÿ<(J-N -O'Ho8O[AyD-u-St -ٹ{KQD6hhm^dDEw9 -i.ZY;VVO˺rdS]Q0,$pIVAcƷP_Xd;|k"]Bc?u2\6 bzH }7|%Wk&.&LL[[%ߟAօWTO1 /V!,xJKÄQCA"x'L`]6S=kPxwk&o\\֨܃D^J ޒLW_m@ ^9p~,xP*\Oh%Ճz+mEN1]-m9p+|f[E=\ ^#DId0:W}xZz{5gpk!}-m+n!ZQp EuC{%*ɑ'>{ɼnRHn^ ؗe*ൿhRUl$v - >.g`ςNtO$)ȹbq ZVj_3ȷsIߗ~ruy#\inRTn…/nyۨ2  `8\W,7 8oֽu$x!Om' 5c-Xg:`!|i9&'d>fOb|!1CO#2CKSI6{ߎt$O7W`"iEt$2C$A?3" ٔ"U"28F;c#M-8qIt38/"TqdSu|&m4@\+2:%tdcu= hEU@gJ{=!(@E^ mQUFu zZױ&eqK;5`YRXxn, t9QfY. 0ʲr6Ũ*N*b*, Kj%X%0,UFOu,K|WkR-Q=A}@eѤ3-,K_DnRW, !/7[Dل>ȲLg9Arv=`gY䬕8r<ȩϒA>vӈ,~_9fj1C3NьNҖ<>I*:!ڃNvӈ@=^0A# -Zpɬv6^ :aҫr (g{M }= !O6IJϒ5I=)pD5D4&Gqk#(K*>jz_]QZ,HFM>kp&9%uu|hPlu!& 0YQj;hz{{i dC )Lo"M75D`cdu\` Kkjp61}Ə᫴FGe[+!g4`#]ZG<Wd(<'hCueEVS+ kSƐ]0?i[p-*ʕmGjT%-]CUE߁h؉s͓hQ\|--}7E5NX/<&(q:A8ȭJOMx t=sn:혠!"T<)"lςh"u7A< {DD OSu(&;&_%DĥD <|ԃ\MPo/<z])(LmPѰ^cuTOu,MDx/eLv{]rhAC09=CŋQOE9 UD~߇]/QaH:$c|&{a4Q*zB\\MQeE>&Q30# #t6:)ˆF%鸨EM$cؖu6mQmQUNƶ'll; -(a>[JF #\8o\d};عNvE1םkgʵ#+ΛvBv3&8ג|'v*w Zε `k怕yj[Q]Gv>\иI>logTͰ}r렞XH Zr`M"#Wѝk -E ``E>ɵìTkwW{Z*֗W~ѫqpپON9Ik;/W;tr\FδrmGjwEgr-Fe^1-("vmSEo7)_ڹkosNc[ԯd[lqb#(9Hk6](J0ڡ٢E ,w"lzOblv!u-MSJhwv-cۅ=F0 1Q-QN[cǘƕN%6LA0]0hX_/:M:&-]]~a7RuDFDmVOWEc-TL^1"q-1/ ؃mQn}ofM!DζS=A}@mђO͖: FٙO͖Fש>.7m.ٶ*m&,c[(/lpNiB($tml{ƶ%1x5}t چd4/d$%;4)"w@Z9+CrgR[ -«VMԗsmE l7xQtJ\ ^[&ZTPu/)Vh0bgLʵ4',De(}Q^騳LZiXrʟq -sm.6L! ,6an% -Hs%" )٢Eir-@XbBF7'dKm(mᙝD.ʶo<̡4XmሮζmH<%[bʵfcw0)R]Y~}Iδ訸$%Z_Чk}==~=_O׳~=g侞z~r_/O}<;990}<'侞ӳzzp_OO}=='辞˓zyv_/}<^˓z~r_Ϗ}==g侞~=g^˳zyv_/O}}GuO}zv_ˣzyw_/O}<'~PZ}v_fhQUo348P M 'Oh"<@>IT{*s$O+II2j=&iKb) -cS4oQAB\!J LQHź>&:V ;D](51qT|P`b,9 - S4o3gZ&¦VGk )̭sP( z=v\s$f[SlPSRAAiP$zTlPD"kzML?PudIA]^F\0%lJzdͽ~#OYryoq=mѱz!XlSpEEZN9X.(Q5s~[H]sS~ν [Tjzϭ=Zlxb(7IdsܦԠ־d9mM9e97ժJ uULT>-?qCk7CKH;92u#n.rHIH$>.5 ͸d7*d;$d;](-(f;:4["GIK -fx4]H=4[lues=@|@ļfK$ -}%[ujؗԛUrD}Tt_XKF1Q'[daa.%}] -d8oH.V0=Oa<p"8ܵ-uL}i`0OG q=!Pvu*uAÊH;y<*;{ `#䔕Ξby>88IO6I= ۣ*a3va20a*밞unTJY ܋sw,̽9w'Wo܍Ոuq`wnəpĹZH f+ܦ1̹X N;m 42Jq2+y s1#xw#Β_r"G}66.PwQwFW>n<’>-7XEutH@e@ BӑK'ao5@`bG`nhi:$ M,6Pr*"5*,BP':@ -qWON=F~ D* ߆yV zcK:j 2Cp#.ppr. . `8M*\)*_1&-(2IkJe4`M1N%ơ@%mu*iRE\jTjQVcMÿ?ɏ_2}-._#*6P8zw -*ۤ2ؐlГ}̿_oOdnp{Np. wÚ gsv¥ZH"`pآpo NQ e8p;; 9axaq}휡F%\e$g n-6̫ ׈ ^GnxL9ͅp7U@ pn{Z -g\|:]M~&ę㷻& _T=wiqȸF"g^~θ'h1.5t4Y}ȸ٪~¢>m? 'ȸ9HJKٮ"[6G9"S;{"i}ZQNrȸAf}7ƅ<]ō3.j,v֗;KV#Ewҡž]Ӕ؂c `?<͡4:Mťr4*!+g0qlom^Gp5==\ ^G")хÉX"?HȸwXx`Paܡ6'aGK@˜F)iKEy/yo*nw/p8 - ~pP'n@\|4Nq^wx9 wA섋l82rwN  F657.㘿9ˆ_]ō.== v]0.|%.2.%ó181Jxp"k;U~xX59:QBG夹N4*uo߆y!ջ8zBܓͿѱ@" \vUǜ -@D -N#p#cniѺdθ0^ -*&īh Q΂*pȸTb#bqJh3 oC[cK0C;"OGZQk*Ƹ/oOv6,I܃M`˷'T@&uH&ߒ;-I^L[KD~vPLJ'A]\'̸=qāG9dP&~NH#:*kҿ~E -iPv[|B28(A u\Ba{PVzf4 brf -FH̢uEpBE -j(PBޞ8&\Ar{j>8OaH#@j"T6D(P'!]5˽ 06Pὲ -[ZT؞Fǿ61/ Dx~SBbeI:鯡 aayÌ D?<߇f͈R(-Tw5[YW;KFRٜBBm vxv_/0q2XD!ˢ:>auDNFIz>sQ Pok΅K83l9)Ηf[ 0b#xKX; -<,0jD%\+z"7H'r.a.>&hhj4je2H=aU~]==^E rh^9[j(O+r驪%7n3> qރ'OU>i=> 0Wh'V{3 NP&ьJ'u@'GU1(z6}s߬b`0Mla^G(`k0 -^#[ ut,I%lPqGhɤuֹCR9. `I*\-2p 4+Y )"4K{Rw ,U+x%h-VSDF1T,if }_oT&؏IJ T c5 +L'dA%b>$%ФّaKnEJ K3'z.ޖp5Nt"߆;FU=+=\^G"MBhH2AD;Q@BE{  - ڴ7a$0:UXdZPވ̡$Dћ)]i: =4;mJTM[Tq#lKkZ2<)3.*t31*b]WD /$'7icn+@)]~ yAW|G g΍4{_yD!fv,]qDkيyo%q=ѱSL UQh3.z=X~ ^θt9Q B(UQVP%< kTFJ,X=ÇdpE^cU5߫h )g UQ m*X~UQ4%@d\tVRo8Ҡ}|l3dI'0IROkOkFtgi1:v22++: `?1B e:{Ƀ$Mr3$V[ k;0b܂vXp.xl-h.lnVtr rl~r 2zsjt%-%p즖;t1Z>RIlr2e>Y%͟K01JZN%-Fi(46~B$*+t+Lq)0=W -S\a~+̏qqtJq$F(Cq GCq8G[qߋ8P(Cq8 - ^ŧuߋi8 -8 -|ߊ8Gqlh耯WQ)k8Q -oQQz(({qrG{+ x(GɻG1(_zq4Vf8 -hߋ`DoQ<G{qCq[qcIߗ[ , H%&i<30I57JBsIj*)fTR̲XA%^yl͸ TqXZ勺Nt@q:Bq ™/*5O$'~kbq=|`q=*mDx+DV~Sv0 1p|S`;eL`}p(~YQ p@Cu t)TTQo;a}B!{O԰EqпR|1IHxLR/L)0=_ S|a~/̏љ=CLdj -5 PC(\b BfX2'%}p54%5ttqm6ayNR;.q*{6,rPg"d7("Ql$3TR26jRUXRz!:aAi 2Idf:e&Qɡ49磌GE -GtBg&u,M\{*FQlc ̥6^.~Er Nie>PGgLjcLM ,K 2Bf'MX -Zjy!!C2"5\lQh;aPGNuям)d$|㠒a BPGH*1MԒ / -\↧KځK`nK<7?ne#B-?}rŁ |2 -̆V}KXu2a [,07j@'⒫*ԁZ|aIKFa ti -,N=AuH1PmÌ|IOpJF')C{BaCN9>QC |;;E}+ qLPECsߖ% >hyیW`XOHSmYàX壘PޞF=0UyMBqVLhvvPi{x&wE(&9|/匋8@Ђls_x+u -|c\ʎf:%Wf#PVg6pW,Xr0|cq` FoqQHe: uɒE]90pΉZ5!茋3" -&CSOax)VVr-Y.ꌋS¼1H5BBaCθhTqH:۔LfR %6|$yN|p1+jOE0>i|ATQpZ.% t\fv:)nD^!P8xc:Щ15TWW!|6 -V} z zci"M"+VLgb %uA&M.e04Ej%Caʒ͹Zj^)Zaь)Kih~H)Dj%"  \R5A|l4԰@%T/eqQɾ.H:먼!Oejhj\(h ]')D6yOGa=Ц{aFmX{3EqBjzov|;/:v^|8?)&|F -#.CvvY|BeZoo<怕[@6F[Z*0r84@0[Ƿn5=wXΒaVv\v:Â9QqU%?o'5ŐI,@4%@`ikm۬u-ʞLd[< O]m l0-~iζrQ}=5&7ԁP=*MeqzPkM]qy)oMqrT|๙ep55pp)eeӺ0%JB}9a#1GOc6G֧+Ⰻl̫yyp="Qd/pi بd1DS|9[^%.C$=4IbfOGhri6kX>pY#Gy0H$)}_cuTO{W&kDHZ#^+u⭢ݾ.i9y&OOQoϿ{n՟l e죂7_pq5)+@Yrm{[]ؽM57EDBl:6P\nO6H}i[#_B=ȫ4rGdiB[õ '?tE&½7_ceBz1*|(NQ7ηM8{5'ܾ|OqY|ڷ$clJCr2ù'NI\8嵤x%yM+dW!x˵_`dj^H1VfԨ  vw{ -Ӟ߷ډȣ}{s# k8Qo%9}GM٣:VWJwIFp5h -A%tO5[ƷJCn*P _DJ>[ d3Ait/{:=j[fw"tfJZX9}Zmo4ip:'r$-Qq>KVei;h#71f< hƁ#>uG;oItCXeRcYpA.B[^!\kKg7󴊘Jg(@X,2.?h }I() G1K*Rxݟ};n(:A{"q/p-xDHABmFS<γTw+½[_D5uMhElSSᴴ" -NjPm )\S nɂ|r} j[(X+OU7Zݵ{(!Om)K+߸szn -5CZO&A<]x:|Vb -=6ʔnIAK}(d!Vד'8񽵠с[ݔ|S|g7Pu=aPܲT*; IxD'A,%'q,h)ͳQSzRկg)|Ny{{QwizþAWDn>k~vr*8e.*K|g|dOLϜI<ˋg$%ֳp$ 泌$<GQyyN}۽ΜpndO;GFQ BRc^0!9{inƾv>ᱝ|g}I?<6aFDPb ||[F*% #!t|c;A iz!Vی$zH;KBo"؅ P̝?:N;*^TU[djY㦂~I,gdwܻPIH~QպG邭HoR~/ sLB9dp.:Q(<Y1 MeY#t/PwЄi'p_hSV*>ɐmot33bhc+,B")xh :E|/xh2|C?vڽ[0G&Bd<Hx(붿]֥K::" -uwH/f-av˹Uk0<' 'j(HCťQV_7I1\ܷkKUg&*Bm=ʊ%|Yo#t E@M]Z(2:ʶq599!D %2xx ([[ʏw;u+ ёoS+qy}4QGB7^|JxL(716qz!n%cevۖ-II\ЯI'!f7 تk*d3ބ;$s?PD $xTut>};s/ -K7oL -´~י=\l|@ED@_l~ݑg_vGuܱX|@'9 -siD+bud )Y$_7) Y1,ZUڔMpn"N'nn7F+߹zߦXz"&^\E"K XL)3x8,M6Q>]_TjtGFNR 3@)H7YhA)=PRpMB|Ы_m3N=G' -'uʊ"Öx}o.!`t'DeN, %D2 @͋g DO5CX -TvbYt7bY K@b x ejK½P]$<IJW0'$FYGbI8߅g:||SWNb'4X!:%xK#1^EYÉt#ĒX0IXD qFX6>1u'IXX0GC~$ǍK%oXObhݜĂci \#Xꗋtt˞)UjǘI, 'P'8ډ ڝXd]Lּ_Wu09*nF3ø-:KT3(G źm5g F},f\8R[Pn#6=qnś 穊A؃kإRb/ϤBB ]Bb&&o "'r!yR\b|:6x\4}ʜF_4L٨)au2Uo{~%^"~WOxv>wdr)tM͂e^[(wWyQH$2AVa@F?3y辬"{ӐqpK=U׉|h; a$% Caы܃q䗸y+QOb -rG3ċ*GP(aHM'C=^wFyzphp #מ:bADra0e jZfv7 =H Mpfck/5 o\;w.O_Ϫ!Yv,Pdeqq"E0FIbV -Q`4rj+1 Ht!nB XMjD/^YU`dpX!P1Y<&m@^ZPP)#H -#7o᫃M2T]%H ]2w"3SnkM :.*9ma;ٞs`9=ajoaLר-¨[g~\ȟe&wVI$T2a>,@gg-.VlD๥`% i(@FNA{6KxHɰ蚄k/M { 1wB-tbޑ ,.6?M!$'c7’2Zw9x 6uYlYx}d_o3"Gzm^AK@F . n( ,­ 3T'Zip%PPKP_w5lp=>lp.mtn} n_++NHvEa`&+g !.9kT.fO-o+[y7Ku!ҜUtL= vBٗF<}}X}>9{!6?G;3)ERq'LA3[ KpX['@)lj4}p{@M`8uفbvUGHo=:{ +I6‰$pFeog?`-z}'f@|\PrfHn eƚ a^ߤNU{n+ĮМKJ]tH. $S#|r|@`2ZT`9~ͥ+=nZY&fwpB]p\֔&'-A0yWD]lbOdBfp.n7ś~@ 4vj|z#Aë`/r+bdM\ p`W;Լfx/J;eJ0xӸ!(!B?ѝgӈDy|Lddl%'N5n7(4(2~ې79)ύ),Q="Rk XkܠX?ٻeTAUvWCU|ʓK`2L-O[0P;| ߇玞Zl5x=N?!3r&I,ԉsUMXڛ|JMc_[>ʫtD(Ql@^"[0_e [9Nɱ#HdN(LC|m1N{ ͜W#<|ͯ;wJ ppĤ.sSb3?>gnzԂҟ)-+zSfOT)wg/ܺ5 #ΨP* -y.DVzd>O+ntIO1/HAnS -"T*p{§[ÐĹo^ -,3m1&885g]A$"*O Rm%jYuq3%jglxhr?pF|H%> ArmdUEEԩ*lS %m7n6CИ>eهy'ulx6E KAH -~/őg]yte|>躤bM??\ $dP|я[7uwt`~2,'謹8+#Xơla~ cK2:ׁ<@&G9Ųn*SƁA!4ZWrl)X LIpK 2ɬUЀiAűtJlQzdž7P{H6D' @OѦNv":UFYAЈdzвAt!%[STUGuui _뫩Ckx)%.vmǭf5{Wَ5d㞾K?k4kQ%JGQ9r|*wKanf'/g<Am~=AWg"-E I6x0m_ho_ncjJ~䚃\,s*ANy{a}YT w(HMܾQݾl|wЧчUi:Ŧ;90v]p2mj?ZN\d0~&pdK5 EDHJ.kŨ O8, W WнMϗJF6"J%wÅ=]*cDTJ6 =w9sPE-3Gf9.6{'~_EW ?f|ihTz_mz -:Ԥ8w$=x^(h,MD~Zw3!OǭKvAtpoƽ9 U#a -W.M8~0}>͙(zΝ3b0.ȈtU&G(ȭ:er7(ո2$8"%<4Tчġ΃KEm2<dmGiʿJ]_ CiR`; p C仱9. 8LdL}";Jc <&G}6آ@5s~j[;i{='e$JGx8#pRĎ.ox]:@q<_B PQ i߹jHgՇy/&\1|3Gbu2[Kp$F,I{*!Z,o -ҎG-Z -#8uI;l "2hDHԔQV)?TЭ%@sN7uUK_G?/E\}3{p4g$p0rEPY 𚩑扙o5zNBtчzӛ>]Q`¦ܗK֘]B2 PT4dᠠR^f߈S1:fFA.IP!MԳ sU28ñY4w;"Q;/$ܱ!Di QEBZ"5ӿJ]H6_LZhdC#ܣnl -A} uӆ[0R 9I~:244H2Gbܒf?S5)R@YaVb@ع5\!\MFE dD#ԓ#gςBļVBӾ$,eRZc_%dYͣdteɺeY؇9'H #]U+)jMg \VR2]wJTBI2!O8+C h0dlBX=0Q~n:6Nl"S|DԬ끄z<ɡ -hmO#jp21MX ND:SӤ"W>ƾۀ`1 kw٠g3u*~tk\mqﲑ!;Ӡ‬_h -&ApK٘$꺞6&:zU?qNV :Fnz)2K(n/mhђ 6#IWrV[ټ]}zV/3/;+ u^ FT#I\y蚄+8̭ښp.Rr^$fBxgII D|iU˃KDžF܈ň0q!J[sOWUZ;&R y٦ UjI!°> &TL' A#tgmOg&Q -ƃ(o!hSkBf56ClF3au%se~fw<0X#漮"Ji/8,Ԃ&I| J}a,/d$&uSpe7RZi|z:zSC磠+i_ 6$i dNW3neQ~\ڜ87sΈf\5g|FOTZޅ7V%}, :N<.Qջ]1rN01V :\4*`aDM;{HzfG9~^PJہa<U -aQR\K(^DK|Ũ260U(t0H߬8S[%Y':υa-J橱YВ -l-[˜~/c|&6㔻nKh Ui n$xG%D5jKC.*=ݹJ Z.ԘG2NUGHF.9A[K YT3Z2;᠊\껼JVi+%r+FbcB;QhiuCnoFʟNk(CzI3|

GfU-}h&=ˢYEzxìMT/0>಼͗MXe' MH(NrzDzsIkܵ+ӄSźYBx•9*1y 9K-=ײ٠!/sY~'#z\℆A%'s6K~nbd0M{5%_o*\knB4MGQO+ۉoB& ٟ&43fD2L'n~=ϝ}hEB QDZJea(nӕv&*WM9`5Kb %Z`&44 0\9`XTo-+UkZI{+w;2]@^oZ̟O|DM`5TcM~7D11Ϛ^{ };!% [Y=u8Ne'814okw\7%FMW1^lplpmGݵݵv4v4v\\^lGsmGwlGݷõñҪ({q>mǃcGvpv1\1\_lGwmGsmG{͵͵ݵv v v1\1\1\1<]_lGwmGsmG{ͳ͵v4v4v\\^lGlGsmG{͵ݵvtv v1\1<}S<1ڎ#iTk~E]@O{9Ss{,%s]wB% =pP'9{=W%<\꺸(qP -qJ9\<@>WT+P8ч+{zi>W`w/@i>W4+P'u -@+ -@n\ߧo7_qP -pQ+7W@q+@ -(@1+7WD?\ -L -`x7Wg{\+e7W DWD/^|q 3W@e+@ -@+@ -pyc+9Xě+@ -P\% -8q -`n+q\}xqx\\앛+@ -PqV7Wr{\7W'W`>\ -P+@ -rtDț+[ -@*<$ -`\*>W3_ -Pis\Wq\6^{s\Ws9\:\̻qh\0<U+@ -`.nU+@ -L -@<u+@ -|[< -L -`tW}s{\+@ -`F/& -`\,v}S%5\|@MW&+P -qj5z\=@>WF+0Q+5Px\߹+++P\\+iRN'W2<@Wd+P( -qNqW+P\@%+{>e=8\ -p+P( -`2nD>\7 -8F@9+&o -xsY\\\ĩn=W`WQ+0Q+P( -L - usJwv;s+;Wts\̔l\z\<$ -8RUU+.97W$\\4>\ -k=y+cO+G$c_\_qJw\=Dӱ+ -س1?\6>W`wZq\\o"Wus8Chn -p;+A\n~tqYzrshqp%tqJ;!3W_ < -n+4ŒW`W+ؑ@T -pT - q8{q< 5]\ - yqټ[ - yq;_q({\ -p8 -p -p -`nx\ DW`nD y7WL{\JW`,WZ<\W@ - tsy\j>WÃW+V++qx\jWoWW+{\\W`W`Gw?=+@ - -D]\9!W\o@ W_z\> -endobj -1487 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -152.933318 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.009125 772.787292 548.73114 772.787292] -/Function 1499 0 R -/Extend [ true true] ->> ->> -endobj -1488 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -152.933318 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.11319 744.746704 548.835205 744.746704] -/Function 1500 0 R -/Extend [ true true] ->> ->> -endobj -1489 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -19.458502 149.381366] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 81.842133 223.03125 164.564133 223.03125] -/Function 1501 0 R -/Extend [ true true] ->> ->> -endobj -1490 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -118.647606 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.009125 772.787292 548.73114 772.787292] -/Function 1502 0 R -/Extend [ true true] ->> ->> -endobj -1491 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -118.647606 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.11319 744.746704 548.835205 744.746704] -/Function 1503 0 R -/Extend [ true true] ->> ->> -endobj -1492 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 14.82721 149.381366] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 81.842133 223.03125 164.564133 223.03125] -/Function 1504 0 R -/Extend [ true true] ->> ->> -endobj -1493 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -84.361942 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.009125 772.787292 548.73114 772.787292] -/Function 1505 0 R -/Extend [ true true] ->> ->> -endobj -1494 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -84.361942 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.11319 744.746704 548.835205 744.746704] -/Function 1506 0 R -/Extend [ true true] ->> ->> -endobj -1495 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 49.112874 149.381366] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 81.842133 223.03125 164.564133 223.03125] -/Function 1507 0 R -/Extend [ true true] ->> ->> -endobj -1496 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -50.076172 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.009125 772.787292 548.73114 772.787292] -/Function 1508 0 R -/Extend [ true true] ->> ->> -endobj -1497 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 -50.076172 309.960553] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 466.11319 744.746704 548.835205 744.746704] -/Function 1509 0 R -/Extend [ true true] ->> ->> -endobj -1498 0 obj -<< -/Type /Pattern -/PatternType 2 -/Matrix [ 0.347138 0 0 -0.347138 83.398644 149.381366] -/Shading << -/ShadingType 2 -/ColorSpace /DeviceRGB -/Coords [ 81.842133 223.03125 164.564133 223.03125] -/Function 1510 0 R -/Extend [ true true] ->> ->> -endobj -1499 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1500 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1501 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1502 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1503 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1504 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1505 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1506 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1507 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1508 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1509 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1510 0 obj -<< -/FunctionType 3 -/Domain [ 0 1] -/Functions [ 1511 0 R 1512 0 R] -/Bounds [ 0.577408] -/Encode [ 0 1 0 1] ->> -endobj -1511 0 obj -<< -/FunctionType 2 -/Domain [ 0 1] -/C0 [ 0.317647 0.266667 1] -/C1 [ 0.517647 0.760784 1] -/N 1 ->> -endobj -1512 0 obj -<< -/FunctionType 2 -/Domain [ 0 1] -/C0 [ 0.517647 0.760784 1] -/C1 [ 0.317647 0.266667 1] -/N 1 ->> -endobj -1475 0 obj -<< -/Type /Group -/S /Transparency -/CS /DeviceRGB ->>endobj -1485 0 obj << -/D [1483 0 R /XYZ 98.895 747.976 null] ->> endobj -1481 0 obj << -/D [1483 0 R /XYZ 202.561 495.141 null] ->> endobj -1482 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R >> -/XObject << /Im3 1474 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1515 0 obj << -/Length 125 -/Filter /FlateDecode ->> -stream -x3PHW0Ppr -w32TԳ432SIS045370U0763ʄ(DkiƆx[ +435Vkdbakjli ruu eu:d! -endstream -endobj -1514 0 obj << -/Type /Page -/Contents 1515 0 R -/Resources 1513 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1464 0 R ->> endobj -1516 0 obj << -/D [1514 0 R /XYZ 149.705 747.976 null] ->> endobj -1513 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1519 0 obj << -/Length 1300 -/Filter /FlateDecode ->> -stream -xڥVKo6WDHJCv7ivAldKȒkIq;á^-ЋDp`?\[-db]$ h& lKfKk4S_;@`G!WQLrG풄VZb7@E-u/AW0l㉄ 8aHfKÊuNjOD!i]TpBM˒(iѢb-m#kg={Rƛ"sz+?^[Hwo$^KD^SWҶ+>`)PK2\KIB  -h^y0R*R.\cj͜z*a܉ԙ5‹`=yJbpp[/jg Ё -\;d7Q%d[$(;N3b=bKw -H]:**]sPq>y0/W^U|FmmMv=4 -q)Epgћ9A`؟A<ذf?-%b,ȖA:ڲ[\O c|^ZAơPg,)N=ʆ'q8wXշɈ{Z_#m|чh>tWل7[$|]U*sEcp8ƕl:O/+C1> endobj -1520 0 obj << -/D [1518 0 R /XYZ 98.895 747.976 null] ->> endobj -66 0 obj << -/D [1518 0 R /XYZ 99.895 717.021 null] ->> endobj -70 0 obj << -/D [1518 0 R /XYZ 99.895 489.827 null] ->> endobj -74 0 obj << -/D [1518 0 R /XYZ 99.895 362.707 null] ->> endobj -78 0 obj << -/D [1518 0 R /XYZ 99.895 264.375 null] ->> endobj -1517 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F38 1315 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1524 0 obj << -/Length 1938 -/Filter /FlateDecode ->> -stream -xڭXo6_ MQ\ha -\WڪwJrf8Vʉsȓ1⫻_OWDYtޮ„3ɓag]e/E٘0Ld1$s/b~D-vz~Eb&BXBbDsViUu!:Ju5{E1cԺ׸NNm}!fk{T{Pw>0׷=_~,Tr8AQ[ `di~"!u8,e|,,Ib2dy/F242g Ab] bIX:j'T~fH&އ-m}kzHORi^3*)&@&*^Ym}pA$lYWmjj:l0lX@A,fQ:Ŀ{zIs$*=vhkU+C;EH!,!!MÞAeAݔ;691`Ol8{F0aiNnTrt܀0*>DR) -nCuW7G cRofNoDhςČq1KaV=9)͍K&ٮ)n)f` O OT`R|{P φZmg'-IFj%aӔ _%E. O>+$zo,씏\ŚRڛhw&dC=2Bo+˒!0D:hmek+6֪70,!!PQE a -eΌ^u(8CMtp,ؗBoU%rxL\k-Dz\IdER ;"BYJE?P?`KMз~ iO[,60񰜍a -U.Z8V eT|\ΞQܻW{͊ᄽY?*gKzv?6{`{=^Uq8mjW+G{FsXۤ#_Tھl@R'1<:>= \Vų,F!9S)Y2L B>'q94V`hG9癶l3|3\许xj W`/@ΚVw/7 -JVZbgX,-Q’|_frw-aHeЊ82z -M4mPA.yFtH@yܵpg[H9.%> endobj -1525 0 obj << -/D [1523 0 R /XYZ 149.705 747.976 null] ->> endobj -82 0 obj << -/D [1523 0 R /XYZ 150.705 425.538 null] ->> endobj -86 0 obj << -/D [1523 0 R /XYZ 150.705 228.791 null] ->> endobj -1522 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F31 1526 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1531 0 obj << -/Length 2790 -/Filter /FlateDecode ->> -stream -xڍ]s۸ݿB};'I>ԝ4$\g.%R(R5Ÿ_ @v" Uzw[ -HtٯϋdpV)GNt~ -ݻ^V޿7h-slA $ -dO0Y_$IkC2힡 PReHU )xͰpF~ i}]o QP82,5H{.5߼(UPY^ƚUuwnA$+Qg/Udۚa嶕3 Pߚ]M+JesC<~ה`@y3tU};q8.c˝t Ғl؛=֜t͡_( 5GƩmH1lQѡGʮ=.heY+cT0{Kк_{q@jA5gʁIu-%5(c։s*9~ әiX;g}q!L;e1a8Y!,LN}ӝz:ԓ-'XD] a@PL/j -I>ɼJ#P8 +5Cw")= ލ-3XdZ -6Ͳ]xNSCK #gQc9k0'lvcR`q+ sh\KԀ0_PzʶB 1ɚ Pܜ(^ȑ`<ȥyH$i` -1|%"{S5| C|xO|[wfL7aO{}\ax3y $7bFrc}:; A:gΈ%DP u3l4n0(޿2 gFq"5F3pmŮѪ GR'':q*F`̸4>y: U1 - 1x\$A`=ȶ3/d -tO FrL)S1z%Ī9ieY <3?)jzf8Cx@QXM+/ -+z@g &%m ư6<,&j4>l:1x:1"#):(2G#X/AAyL(u38J*4SU 4c#`sqw5'R F@R^I!x)!9 -l -q =ƛvI -TacE'vP HAfXQ>\ (>bɟ!7j=FC PVM+Q%Om\Hk#cܰN۟NCg8bw!oTAS+Z-K%Y^"}|%]hJ vc&+#fOu/*D ty'|@n>ˠvlKrs:6T8ٕ'8ljP -40aJ7.qn{ FS}y@~(.Ld[ӿ닸1TqbQVVwY:ǯerw'S"2V\A^>1z  0L"He^,TBR.\NBX5 ff+9>m]V< ֶݺ$ĉPǦ3.lœ,̣m)4 $V q mfD{r,) -^.ljm">ӶpFcSnd#|j/_: - -G,V7SY.f zLzeap{%GfHX6]R[ } s~jSklJ/w$ɹЄ8ГczI sU<÷?y 1Nj9}Je,\{@dkLҗip2Y$FI>pɅ%-VRPv7%Qߡ' *P,oխ/n З~U}tH'.)%vohy$=kߓ|sA-ג&brd29@sl!qaDԏ_Y cLP𺘲AE#Kؚ~jLJi5`z쫱!& Ŝ2Aq"xΑu-ebEۏ`lZz-)R?E `l] -endstream -endobj -1530 0 obj << -/Type /Page -/Contents 1531 0 R -/Resources 1529 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1521 0 R -/Annots [ 1527 0 R 1528 0 R ] ->> endobj -1527 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [218.647 220.535 240.097 232.61] -/A << /S /GoTo /D (subsection.3.2.5) >> ->> endobj -1528 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [212.164 118.615 226.291 129.643] -/A << /S /GoTo /D (section.6.1) >> ->> endobj -1532 0 obj << -/D [1530 0 R /XYZ 98.895 747.976 null] ->> endobj -90 0 obj << -/D [1530 0 R /XYZ 99.895 717.021 null] ->> endobj -94 0 obj << -/D [1530 0 R /XYZ 99.895 403.245 null] ->> endobj -98 0 obj << -/D [1530 0 R /XYZ 99.895 183.741 null] ->> endobj -1529 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F35 1275 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1535 0 obj << -/Length 1960 -/Filter /FlateDecode ->> -stream -xڽXo6*Y@[ bc "3YLM(Yٮ-}8ng짣R/x?%"|Yg0;~1"h_N.7}&<ǍĂ].NNN_/iu ۋd |#ƞ n Xtj!gJKćI:UmgmQWl a:`Oa+hP_\*m႔=7r5\}벬EuKgՍD kuw9("%{~A`$+n-PpKlbΝYE22+\D^P#+lk2~L* $%/Iq8ؕSZ+e1V/!^gyf6;%1(C/ ÉW>OL̒j[JQ^^o6u塥]Yyo'=ƮYegFY„F޼RS%]zj,6M)/#?"]!xG|   @ц=4z$J`c 隈nCB KWB׮ZyzpR^:Ζǽ$hF9+&x!.)Nb\f]xfM{f89(CEWu)i:S$-m0Ɠ`m[ $+K}C2)dk׆wE\@ HtӖV'd]4=BI28C iر!>Kl^"O1f0_8b-^G:KtI fEnig^Cў&Cz{\SA}ڲ2uXV2Do`{})X+֗PYKW*"kMTJ841"B״Jà+H}[,Ɲpr6pOdJG8P܇>I;kt|J^TC]({R1,^0MXU4!k!Cic \`}Q4)5ƫpTwٽ"Hk|$wN}_ r`ܔv: W9&jk,2AeHC5ˆV0e+wzzGeUnINr $*n+K9]wfQ0"kY,01HLfB\e"4*ݦ2 9.MuXi4Q_A8`̓W4RK[$aOrL_wrcnnX+(JC/I$dts~4s &EXm668EDQtqcdjrK>~V#O+!7kBHj^NVȆvI$"4dSkL,n2xP^A}9^]$H#N ay'8ڥkAF.UM#I=6=2HЕ2a;I Cp@¥`6eM_LQ4)CCi렏/P -^M8m?ۚ??~-Ojl !㾱 ǰ ) B /yߪ98zWLy^`iF/SfMZ'G_"oy/ubhJ9ifQz8lir.<0%45GZeG5k.I.0?pB;a%z(auFVJ'؋ [n! -ǟӗ&=isRؕ\mkfX0"^:rݞp~aW'lǿP6ˍ+ff^]t\53gWOX:Y JG -endstream -endobj -1534 0 obj << -/Type /Page -/Contents 1535 0 R -/Resources 1533 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1521 0 R ->> endobj -1536 0 obj << -/D [1534 0 R /XYZ 149.705 747.976 null] ->> endobj -102 0 obj << -/D [1534 0 R /XYZ 150.705 515.922 null] ->> endobj -106 0 obj << -/D [1534 0 R /XYZ 150.705 232.59 null] ->> endobj -1533 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F14 613 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1539 0 obj << -/Length 1901 -/Filter /FlateDecode ->> -stream -xڕnFP%p9H9&Ehjd1梒T}ߛ7MT}Vݳ7g/.x$j[% `ys_m, f;[vb}pyO(6W?n_\@|X(|晫sp2>sG>˖.w 6vE^u5mR\u ,42*7zap.\0TiJ Xy,PEw䚒m?jJ;Pljs)RHE@$N1 )}$#eN`C< -BS% -\gݐrr) CsN(GA]>75Y]M(x@%#(+A^Z>d^-% TQ N&Nshǐݨ}RL-+m96-jT4ɾ﬐c7 +"c'/!:IKTJՍmNnٗ{ {< {`N;д vB -;XݡyߡiM%(3ZvBo{c[$۷>ԑsV" Q5~AFL@ߞԨhyS,6'(ю= ЧLf5nx j' o.$Ovr|@j| uvknUecniCY:Bڨ\ʻzXNAΥKXuyA4=8Vsެ]}<3 X\]^]ެ{E~.Jb] :nRxs#\uZY,Ir2zQ@t-"'m zbZ} M[?Dѳyy^C6}}֧+q}uXz4۟w4z3zv#;Tٴ1y,oe732״(mS,_oYJ1 -endstream -endobj -1538 0 obj << -/Type /Page -/Contents 1539 0 R -/Resources 1537 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1521 0 R ->> endobj -1540 0 obj << -/D [1538 0 R /XYZ 98.895 747.976 null] ->> endobj -110 0 obj << -/D [1538 0 R /XYZ 99.895 644.062 null] ->> endobj -114 0 obj << -/D [1538 0 R /XYZ 99.895 384.933 null] ->> endobj -1541 0 obj << -/D [1538 0 R /XYZ 99.895 346.083 null] ->> endobj -1542 0 obj << -/D [1538 0 R /XYZ 99.895 323.9 null] ->> endobj -1543 0 obj << -/D [1538 0 R /XYZ 99.895 289.58 null] ->> endobj -1544 0 obj << -/D [1538 0 R /XYZ 99.895 199.921 null] ->> endobj -1545 0 obj << -/D [1538 0 R /XYZ 99.895 151.96 null] ->> endobj -1537 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1551 0 obj << -/Length 1746 -/Filter /FlateDecode ->> -stream -xڵXo6LfQe^(V$С -Ub-r;0 Ŧ;#zg?9tx-4#Fv&ЈĘfR]0PwnQ}.2;7y۵O'Ī+Q!(\'MfB6H;g -0+zCF av]d*̣$bE8 -R8"vj=_H-sp;G9|W Pp;'b1&ș$F:9~ e5x _@O7)6 00O)\Έa[; :{܁! -еu^*W*]' rlhNE$PoBW7kn+q׷nŃKi`lܫ:r޴NBtD4iR| -,tk v6!dw)pRO~Q\WxꍁA.V3/me;pWWAC>d'@`~EF[!sns-r@OV Rz(8.8y8 kwR>Hd! ,ilX~cc6G3sHp Rwv -uq``YI&՟~##jCOLKnZ*.)eM*esTZ/PV("oS|FSHP1yW=)K+(ED1-cA! -\DkkUb Ȁѫ -ztmegZ*t!>6RO޺rmcUoLA$@3C(/sCH+*&|iQ9j&m~UjxN` -fx l7̝Cwv7U+rdzr>*IVnB⾖vlXEt -ץfT1EbHȉӹBaLU0q}I=/i0ڟ*$կV$l}`ByZ]St=f:p[9/|n'7 #o*-t%}BlR00~-,mބvHfO>3fpB{^5q)Ѵk[A: -7R4}0 rﭙwIXWtY9]]pw \rQrJzK*u9paU֋,EwmȀ,u <@p<՛g&:ʲ+UWtwmyUQ)mJX - i38ȨzSP ֧E)UW EUTWxq6盌1[\nа4E-]r"ai8/\N0"G_c"O HYjq-u'F?rQ폆:y_B>ay}u<5#Lƛ q/sg>T)7HU;V>`AQQN+,ZM6kvYiޤͫG/}1YWٺŢehl9[_Z -endstream -endobj -1550 0 obj << -/Type /Page -/Contents 1551 0 R -/Resources 1549 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1521 0 R -/Annots [ 1546 0 R 1547 0 R 1548 0 R ] ->> endobj -1546 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [344.259 288.824 358.366 300.898] -/A << /S /GoTo /D (section.3.2) >> ->> endobj -1547 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [340.742 186.03 362.201 198.104] -/A << /S /GoTo /D (subsection.3.3.1) >> ->> endobj -1548 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [300.324 167.221 321.793 178.997] -/A << /S /GoTo /D (subsection.4.2.1) >> ->> endobj -1552 0 obj << -/D [1550 0 R /XYZ 149.705 747.976 null] ->> endobj -1553 0 obj << -/D [1550 0 R /XYZ 150.705 717.021 null] ->> endobj -1555 0 obj << -/D [1550 0 R /XYZ 150.705 686.844 null] ->> endobj -1556 0 obj << -/D [1550 0 R /XYZ 150.705 621.209 null] ->> endobj -1557 0 obj << -/D [1550 0 R /XYZ 150.705 543.143 null] ->> endobj -1558 0 obj << -/D [1550 0 R /XYZ 150.705 453.121 null] ->> endobj -1559 0 obj << -/D [1550 0 R /XYZ 150.705 409.337 null] ->> endobj -1560 0 obj << -/D [1550 0 R /XYZ 150.705 317.783 null] ->> endobj -1561 0 obj << -/D [1550 0 R /XYZ 150.705 203.033 null] ->> endobj -1562 0 obj << -/D [1550 0 R /XYZ 150.705 183.45 null] ->> endobj -1549 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F49 1554 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1567 0 obj << -/Length 1483 -/Filter /FlateDecode ->> -stream -xWn6}WPiEQVZAMQ )Yz֥dpmȋDs᜙3 g?/fb~\9iS$BAȝeg}דb^)~{ylyucjv ;#BD> 0\Y`:R?&"Hh k79[,^RԁM*HD+ZxpØ8b{Z+7Dm2/ PJRJӔurCoUV~."tp)whfoݨY6UxH.Zͪ6ϪuYt?74%V]OG /\;Gr$ޓA޴CӓaZP  -gsXa"_;CŃ0 4X>n'>~)[Ճ>: yq>ǯ0@J:TqF~$n+]%@3$XvEm!areu,|ꉠMD6%|g,ueX ig=֙ };E6pYf gߩur4( TQ(l7OJ!ƷϹm\A2#yBdy+}X*z*GPA޹p -6vF1f2M.ZC-*$P"Ihqa=n!6χTSh* -7IHC,{M8&38Y)4޸A'6AmuhRCT6$d܏}̸$%賦7īvUHP1v.s5 a덆-(24ƀC8m%tv'3QӺD_9z ri`6kX4FiF+Z*W4d껡Swّ-ALә`A-=l2B@+BVe˴~l7H?MxOxK8M%8byec+[(zq1o,/lCOP*A.WxŞ06\鬇y;kDc/Ҕfcz0-m/+KӅ2Pp1U%Tv",'[H9A!tz=E늀=bOT]av4ؘXVi,y492qīruY? MK]vUjӍNZf<474tIiK>c{=✗~<Ԛ5TMPb/;u yVMw' zEґzyQk49 b*F^%}lЍ0bPU0y>^o<8]CnQ║a-){'%O;sNSP,w zcp* FQZŗ?,Mo -endstream -endobj -1566 0 obj << -/Type /Page -/Contents 1567 0 R -/Resources 1565 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1571 0 R -/Annots [ 1563 0 R 1564 0 R ] ->> endobj -1563 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [239.95 616.649 254.067 628.424] -/A << /S /GoTo /D (section.4.3) >> ->> endobj -1564 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [321.444 115.277 342.894 128.248] -/A << /S /GoTo /D (subsection.3.2.3) >> ->> endobj -1568 0 obj << -/D [1566 0 R /XYZ 98.895 747.976 null] ->> endobj -1569 0 obj << -/D [1566 0 R /XYZ 99.895 637.037 null] ->> endobj -118 0 obj << -/D [1566 0 R /XYZ 99.895 457.242 null] ->> endobj -122 0 obj << -/D [1566 0 R /XYZ 99.895 310.609 null] ->> endobj -126 0 obj << -/D [1566 0 R /XYZ 99.895 182.647 null] ->> endobj -1565 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R /F35 1275 0 R /F39 1429 0 R /F51 1570 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1574 0 obj << -/Length 1104 -/Filter /FlateDecode ->> -stream -xڵWn6}W4/om[`El, -}$aYI_!vDN7up!& |bv-DQx\Mxh¢I"#`fYL$< ^:4"M[sˏ/n4F2%,o>]/ptiL|ZX`z* Y_d4ӝ;4Q$)"= ׊ܕ頕(Ao>@3Jɧ~/)1圪(_,P]v CNtֵUbp_ʷ "3V8ն>!iS1 &90#Y,.6'ncKց`.iaGʕIxs-(6 -ʰ9+gqqL#A8(\Z_^+qrkACWcC[AmI"}vm*״]^*E͒ -r 8B (Qyr+fX0` g QS)l - uanu `Zxwo@>\턅[%v} RКk;G^˜)hUڻ+G6CGӳR509"ö͚/aqt3s ~`ku2 Td:FGpL>/9Ao8Ũ{+.~VqySaw؃ j!T}7b&x+]TDӘMW⍕{jYPx'Nƌ\eSF&4Q[o{3x[{jy/j.U -endstream -endobj -1573 0 obj << -/Type /Page -/Contents 1574 0 R -/Resources 1572 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1571 0 R ->> endobj -1575 0 obj << -/D [1573 0 R /XYZ 149.705 747.976 null] ->> endobj -130 0 obj << -/D [1573 0 R /XYZ 150.705 696.488 null] ->> endobj -134 0 obj << -/D [1573 0 R /XYZ 150.705 512.497 null] ->> endobj -138 0 obj << -/D [1573 0 R /XYZ 150.705 364.371 null] ->> endobj -142 0 obj << -/D [1573 0 R /XYZ 150.705 192.335 null] ->> endobj -1572 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F37 1316 0 R /F51 1570 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1578 0 obj << -/Length 1237 -/Filter /FlateDecode ->> -stream -xڵVKs6W̄@$[lwqV{I{HƄ"5dłdrqOo1B,&Ę0z+DNf+SqHqî\\~ ]^}~^Ri,u"~,Ym7/B>I*3PI`~:ftbC`"D (b-  -\3H&BٝEf 计.^ k=O2?O=ؠtr6VVoqwCBwG!e+>xMG裺/7+SɎ Aʏ-%gq&dЦ>km!estd2uQ JL*}k2a@"At+e;\hztAkz߉g~k~k\vCOG{HB''@ҶuMw]U\vGؾ܍$]ή?yFo M'ֳ-7$Y_rkwH0#Gr3bm !ӡwy{n#Yc>4y,@3MAGY H )W'oޗiku,nZG8{z)l 6~e)*Z5(^o/n:OB -  "`Khw/ZhZ~žM :o;3͕ˆ^Weі܂KGaǫszE; u.O"7$qdk4sCd~G+x[}`Ņt"B2:©ޕ6gn@K" -Es/Qf^oj뾅2]U evÓ\ -endstream -endobj -1577 0 obj << -/Type /Page -/Contents 1578 0 R -/Resources 1576 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1571 0 R ->> endobj -1579 0 obj << -/D [1577 0 R /XYZ 98.895 747.976 null] ->> endobj -146 0 obj << -/D [1577 0 R /XYZ 99.895 695.259 null] ->> endobj -150 0 obj << -/D [1577 0 R /XYZ 99.895 355.336 null] ->> endobj -154 0 obj << -/D [1577 0 R /XYZ 99.895 224.647 null] ->> endobj -1576 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1582 0 obj << -/Length 1839 -/Filter /FlateDecode ->> -stream -xXYs6~#89ӺtR["!cHC7$Ew=?,% [nbYxJT8PΪX)k˳A2LbOC2?^]^;K?"p -Ջ;ěTx"9i^ZK?bP:ݔ)lxJbkWsbїmU,ǭQ$vW[D[(ZmVmS;/ZzzHC -$3,q0TAXx-~2QU <8뉉{NcP -0ĕ I$z5>\:ˏB9?L&Ud}6 <Ъ@KQcaMٔ ybxP-K8]|?4B5 e(vymSBz(st1 ̈́nK:mu-m#וu>k) ]סx=v}Ã^ t*pN*bKX{@(h'P+{6cD6l8+zra#9sX+UiTrcZUt<L~ ƹ:'Fd22rY~7.Gf0;\_`_)Y{ [wmu@ ON\wjMDCm{'fY0P3 ^96<6\cОObFf}#?jr8r7X?e}W\Cꛖc5qTݧe8p\4!m5z֔]͒]bGQ,q6nWSƧBٞ7ԥew3E``{?xfYF)^o,گ'w/}^N= -endstream -endobj -1581 0 obj << -/Type /Page -/Contents 1582 0 R -/Resources 1580 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1571 0 R ->> endobj -1583 0 obj << -/D [1581 0 R /XYZ 149.705 747.976 null] ->> endobj -158 0 obj << -/D [1581 0 R /XYZ 150.705 697.828 null] ->> endobj -162 0 obj << -/D [1581 0 R /XYZ 150.705 545.878 null] ->> endobj -166 0 obj << -/D [1581 0 R /XYZ 150.705 286.331 null] ->> endobj -170 0 obj << -/D [1581 0 R /XYZ 150.705 182.201 null] ->> endobj -1580 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1586 0 obj << -/Length 1186 -/Filter /FlateDecode ->> -stream -xn6*.Ec,R"qC-1R-i}JJҞ4[ݯŻ+Q$9WJJZlU2DPN8%!_o -I7?ڣ!RdIh.XP -8c^@ =趦:2=*.(KLGq"?>D/qKw{tQ7:> endobj -1587 0 obj << -/D [1585 0 R /XYZ 98.895 747.976 null] ->> endobj -174 0 obj << -/D [1585 0 R /XYZ 99.895 697.18 null] ->> endobj -178 0 obj << -/D [1585 0 R /XYZ 99.895 430.432 null] ->> endobj -182 0 obj << -/D [1585 0 R /XYZ 99.895 295.191 null] ->> endobj -186 0 obj << -/D [1585 0 R /XYZ 99.895 183.86 null] ->> endobj -1584 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1590 0 obj << -/Length 1100 -/Filter /FlateDecode ->> -stream -xXn8}W -XǮnQhBXjܴCQRXp6Obpxf8dr3!?:gtbLN +"& L`eM> OW\-LkSLzv>Bq -lvuDb4agC`b-pYoyj?;>41Ә.4[ BPծ 4()~FmPoI )c -H,Nc)a CWx6^8oEH)6BIwxQM*8~7UƏ? -;]Td_Te -)oS_ `=J *)º@֦;f~!_6 W}T%Ê^>:Y;J(V*j_IG`XkEuQkBuΒ -Tl8jͺJuow!A IѸHy1z+)wNZw4O׷1Ԙ _ m|7 XI#64-d M<}C;,I |%-fCufXC5&͈ĩ%3[2-w(fi&<+ F?U^.讎a{hBF]ĐI]c!cp%Gyn_ z"<`dvZ:8(TN!msEʠu*(`ȣ#Џ+C:Z[a,0tLRj,o}856< q2͛իɦՈ3z(wt{?A3w()m#up[V6 zQ/1DQ_JsN͜$dSsϥ_sRB׏p.11K'zBAt/~{nɟ|xV$xݿl~¾ -endstream -endobj -1589 0 obj << -/Type /Page -/Contents 1590 0 R -/Resources 1588 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1571 0 R ->> endobj -1591 0 obj << -/D [1589 0 R /XYZ 149.705 747.976 null] ->> endobj -190 0 obj << -/D [1589 0 R /XYZ 150.705 697.009 null] ->> endobj -194 0 obj << -/D [1589 0 R /XYZ 150.705 547.91 null] ->> endobj -198 0 obj << -/D [1589 0 R /XYZ 150.705 434.676 null] ->> endobj -202 0 obj << -/D [1589 0 R /XYZ 150.705 309.487 null] ->> endobj -206 0 obj << -/D [1589 0 R /XYZ 150.705 184.298 null] ->> endobj -1588 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1594 0 obj << -/Length 1684 -/Filter /FlateDecode ->> -stream -xڥWm6 ~"%vmoڷknXKh8q#EoC")|fO3oջ۹LfUfL)7Q, >3 -;L{?yt;'Rp\yP8QlV٬ܺ.ӱOqO{8Ӂa@?j˸K#Yybi;"LXu1;Uу1D0$ &Vo z(È IG7h%g [i`bκɶ܏YzMx>6p1xXEl}`זq?PJ^2]`2U'\/V&Bu;(f6HxQJl;:<7Pjz)x2ZҺ>s}u~6$=5%WHf GJID+gkN"Ũ@>iH A#J9B7zmmh* r)XKSn{'yv%Xc|>:ȗc=[Gw4Б'1 LT5 B[)ZҕR 0 -lLl^_$n%CʹHKĵ+p+uGɮcgRO!AuCAZѦ)\o"hهי]8$kO\ki59Fn(uZ4 kǮLPB~j)NB陪c9)(TʖM;-<"ؐZ^>W:9$".삎25/, -Cc=pu B@N?h5RϬprUs"'(HTdfmEܤVEU-jm50!\x@ -w,"zh(#86wn>Jtqt#&k/Gb;z(XWA2QlSqpY# jYZr=Y]ڣܞ2Qxjpe%!qh/ ܧPE8)q| aXJeTqeY|I^B{1Cpdo"};"MJ[L|$hYXJ+"hjl,i_dڍyJO}F_- uR;龧@BJuZ?xX:Ez25jLvl} ofphn}Z70(--sE0C6GtN/hr-4_0}fZ4*#\I=>~ΐHm ދp7T);By|'MM&sa ; Jvx}K&qDC~҂QyMflqGJ$}V~4gAm _ЃoT5%bIb9Y-M5#`s"4$=Iz\Q>?> e܂zхJ`E - S BBhA!P2( -O!U^4,0 WݴZ7kvF%|g?D4KUω#a&ay/) -endstream -endobj -1593 0 obj << -/Type /Page -/Contents 1594 0 R -/Resources 1592 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1596 0 R ->> endobj -1595 0 obj << -/D [1593 0 R /XYZ 98.895 747.976 null] ->> endobj -210 0 obj << -/D [1593 0 R /XYZ 99.895 693.279 null] ->> endobj -214 0 obj << -/D [1593 0 R /XYZ 99.895 528.601 null] ->> endobj -1592 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1599 0 obj << -/Length 1625 -/Filter /FlateDecode ->> -stream -xXKs6WVpb೷vZwIkk2$B' -dbAԋ>2mf|՛իR0Od2[g"aY΢$~_|ƒY,=N?.n8Sa0U~^޾{@%* М4{s¢ z9|4p?ԙ`M%3GHY[6H繈T(rE<3fS2fi.03>ר . qL?"47lOQ-d6A=)ҝ;SDtWs|ӒTGI︌RJsGS:!,YAg1uRV% 9[J2k`d-~(D4b$*}hʶɁsE-Z)wݎ>n$u5.F2g1FYk]Z&I*9BfDVhN}~>pA7$c 9W%3Ds7F@}vtUq~Wg_)4%XMUV٠ ±d{kcM9+ЂX]SxISeO Q=PKޘm) -()0X #pV-+ziO*܂d#-0s [n! -Wюoah_~`f@qu"Ƣ.3L0gJ)x^lFv -e4{)8J*.Cƅ(:RQ &íÌ3$pu SnR[/A-X/75E -Q7v$T -cYoP1ppUUjK,#͛HITML'!/,w S z`qꍶD. h%O=q(==Q5-;9I6=Uc=B !@,~/IED9gd.qm@MX*64 c UEGzRc`:&~NX Df<[ko0rO]n6[^5dH'-Dz7(/@ te}.mN2B \L=K~>ے<*lYH,Q&LE:i) K`NyG qVA'q@%U{u@jhT\0;Z|)O t8shC4{hZea -#՚eY v10OS`*̷<yo1ѣE:2f uc~\&. v}F=(XȌSP0HD=X&шbF6 b+B1[n<- :XhdhPGqkc%ԗc [A -@Hcմ}P5%T@G~Yy{CWޔ &V?Vҥ޿sCKƣk˝GqC.y8a./?ɅƄ7uaԑM8)Q0aNt.NE3wѣ1OMY#k&eAaثB/7+dgN_} -endstream -endobj -1598 0 obj << -/Type /Page -/Contents 1599 0 R -/Resources 1597 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1596 0 R ->> endobj -1600 0 obj << -/D [1598 0 R /XYZ 149.705 747.976 null] ->> endobj -218 0 obj << -/D [1598 0 R /XYZ 150.705 696.802 null] ->> endobj -222 0 obj << -/D [1598 0 R /XYZ 150.705 533.444 null] ->> endobj -226 0 obj << -/D [1598 0 R /XYZ 150.705 324.277 null] ->> endobj -230 0 obj << -/D [1598 0 R /XYZ 150.705 184.829 null] ->> endobj -1597 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1603 0 obj << -/Length 984 -/Filter /FlateDecode ->> -stream -xڝVMs6W̄>͍;xQ{Ir)HfFR^bەyMxkU&\jJBiƥHV QL2jUwԐO7~!O귷 -TƄ. E\2s:y -c[]l[;>F3S_0i l4<5TIn?_`ȝ -ZrSY&Cs27`uI6TEtLteztsͽ #P84]KS!9'7^K% XpOEF:W$TI `ο,TW],U:08ߤX[qt6'~u7 -endstream -endobj -1602 0 obj << -/Type /Page -/Contents 1603 0 R -/Resources 1601 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1596 0 R ->> endobj -1604 0 obj << -/D [1602 0 R /XYZ 98.895 747.976 null] ->> endobj -234 0 obj << -/D [1602 0 R /XYZ 99.895 695.921 null] ->> endobj -238 0 obj << -/D [1602 0 R /XYZ 99.895 531.539 null] ->> endobj -242 0 obj << -/D [1602 0 R /XYZ 99.895 377.101 null] ->> endobj -1601 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F39 1429 0 R /F37 1316 0 R /F51 1570 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1609 0 obj << -/Length 1773 -/Filter /FlateDecode ->> -stream -xڭXݏFo]xٷ&W)mtJIb>T ;] zQbٙ|`-ǫ7ﵻe`.\_PR:[|Z;~Dc(:@y׷R{J,}ַޯ(n^Pb 9I^:!Yv2M|W!H|H=-*)wb2RQ*?X)(nn_ҏć[~ۯw(-]W>&&e繰.DYl<}t@GZLrxߒwR\%d?7uʯنI/Azo7e 22cBQغk`|a ,#)Xp 6bbk z=pF(P <^˚!YC%װz|, фJyMxecZ≪&"5 CRtX" Z6GS~+C`b𞁴~d4E]g={P+I,k(Y.!sȷ4haݎɚyJ>~R h& B4 f҇>M?v$NhH)Ye>gf$ q2ră̠-C_"DT,ZJ H7QcĽAY6s:[3fO -(-96z& -Of:[W5;3XI -B(CAOq?3?rz33sd5um-, lq -̕~NK?Vd -CC{/]_4Bn.1+ltV^3J*5}aoٯto 5mꮝw^#G.:h+Y6"IRaYFN2*OO P2;Kd4,!IѨYFR4 `LmTiv5 -3 3YMĊXv:CU1@pW]C"Q>CNQei~ ՘QP =5$ʦXº9i}=LŁK,2mE O*&[ ƥ'xI/;Fey+yŸA NϟYq -ňu(ꦽ0Y2ڕ5OO4$Uϧf|2Me& Ӕr:cxIcİ[ktA+f;ΚnRXsx†'F.+3Z]I FM/y> endobj -1605 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [474.797 249.572 496.247 261.572] -/A << /S /GoTo /D (subsection.3.2.2) >> ->> endobj -1610 0 obj << -/D [1608 0 R /XYZ 149.705 747.976 null] ->> endobj -246 0 obj << -/D [1608 0 R /XYZ 150.705 698.166 null] ->> endobj -250 0 obj << -/D [1608 0 R /XYZ 150.705 338.268 null] ->> endobj -254 0 obj << -/D [1608 0 R /XYZ 150.705 192.989 null] ->> endobj -1607 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1613 0 obj << -/Length 1325 -/Filter /FlateDecode ->> -stream -xڽWo6_G -UEqk,3 hBG#xԗ| bh^DW'd0IDX- SZ0|* E,LهO.o~ -aOV?Aq &sy`ьRh8$SM^?iWcq*#;6Ь-*xip0 \ڥ0m+m;Bqк<4JAlG>ǜ(}_k`h%~ӂxA|ɁYiak;gjHp;V܋ctakaׇ[AuqyT  -HP)a~i1!~?΁~j:>wR \j:TVauNt_V'*K -endstream -endobj -1612 0 obj << -/Type /Page -/Contents 1613 0 R -/Resources 1611 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1596 0 R -/Annots [ 1606 0 R ] ->> endobj -1606 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [274.49 603.929 295.94 616.9] -/A << /S /GoTo /D (subsection.3.2.2) >> ->> endobj -1614 0 obj << -/D [1612 0 R /XYZ 98.895 747.976 null] ->> endobj -258 0 obj << -/D [1612 0 R /XYZ 99.895 696.967 null] ->> endobj -262 0 obj << -/D [1612 0 R /XYZ 99.895 559.358 null] ->> endobj -266 0 obj << -/D [1612 0 R /XYZ 99.895 445.658 null] ->> endobj -270 0 obj << -/D [1612 0 R /XYZ 99.895 298.105 null] ->> endobj -274 0 obj << -/D [1612 0 R /XYZ 99.895 184.406 null] ->> endobj -1611 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F39 1429 0 R /F51 1570 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1617 0 obj << -/Length 1553 -/Filter /FlateDecode ->> -stream -xڭ]o6=3Hco[n5H:$BeɰѲN$wn"&2;:yI$N&ۉ4LRe|7uw*cf) x~_FX x45*cg"\g - p{[8]/՚mx@smWn,\ 4cؚqi8}:C TJC,> Z2IS`1ʌHn5` -埈Xʼnʎ=U"x"Ր4CNO$"p(1g-)+QeSGS f`S[qIڃ[,e&XהF@,Y>ɜN//N P4u -|%a,R ;{᥌%li?)넵KW_ݜ.{Z}'-4QBt.")$m0 5pco7H ;k)ɚ͊P> -z M`cS@M{A"objӎ)iSִd[Zm%7\`6FΠ4$ 79ycj -[]|^=@AtA(h(+aa"#vy7ӓx]fvob`9~Qz0Շ|00`\5--cdb gS%B,c.s׺pc6&j>ƅ29t1G(%ٛ}Y` 1i*YέWqN.R.aAi/I"sn{u?\GL&7*٢u?M}vP]HDJuoˮW$y".p)R9b⫮@XSi3/)Ԋ;İtLCD7<}upg+jlK-lY`y2 -_9{c9o*5ߠ n]kwZixx @POvGv/5tⶼ|ffQN`|NPi4nM/Ƃa  46ga f[|;LTqz#R.[]K`ϻ>i%Z3"Y묳icP3j?&xC޳ fFj7՝RU|Ce1rGM> endobj -1618 0 obj << -/D [1616 0 R /XYZ 149.705 747.976 null] ->> endobj -278 0 obj << -/D [1616 0 R /XYZ 150.705 698.522 null] ->> endobj -282 0 obj << -/D [1616 0 R /XYZ 150.705 551.788 null] ->> endobj -286 0 obj << -/D [1616 0 R /XYZ 150.705 428.39 null] ->> endobj -290 0 obj << -/D [1616 0 R /XYZ 150.705 269.127 null] ->> endobj -294 0 obj << -/D [1616 0 R /XYZ 150.705 169.64 null] ->> endobj -1615 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1622 0 obj << -/Length 1587 -/Filter /FlateDecode ->> -stream -xڽXYo6~ϯp( %Q'P=6 R"qv[ÔrpHYCsq8 oy_'s27xef,lY>33x~s2v}u~y/N9p~Z?P3‰HxnADN:u۔]++kQVM!wEn]ֽy2 -VI7 }͢DrҘG9>ӇN2Q;TjJw@8SG:>%3x^[D(w?Wm.M ~#q*[HBW (cyLֈZs!;A^r`U h+@FEsI(7>?>S \q ט<p~K-ĮWR0 }Bb/e=})N.!HƴjȦ6\M%hiS掟 l*;Qmd(JM#HTi΄5ɁaHT;Q6肈kA޽j*y][xGp!ې ߄ln|٦]Y707N=yP;T* g;ltI>^^~eLcVD!x^BiۈnN!/^ZCKxFeE>?l`ǐT{9w1X L[ʙt8{t !PA1K) RQKLN!h4)hd)\A'JU1`P'IX ehy3$PqDCU q" (rF8gKc^FgxU+t졕Ԣȿ>D8J162'ݵ9S$W6y՛ }*2X+im^{sڔz2TS[|*փ`%D%KJx B'ɁQzLUgp ҕ[H ῶTCж ƅIV f/6{SxB zcDwfaM;KWVw7U?ܕM'wrJ°(|GhdÆ+)3YBDXeQ4[ˎWUTb'F,ne$N䳶*'A9!ldyG]~O -:2i5+˰ cEFxHiJ<`cl*O>A߳ɿV4 -endstream -endobj -1621 0 obj << -/Type /Page -/Contents 1622 0 R -/Resources 1620 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1624 0 R -/Annots [ 1619 0 R ] ->> endobj -1619 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [361.24 128.129 375.357 140.204] -/A << /S /GoTo /D (section.6.3) >> ->> endobj -1623 0 obj << -/D [1621 0 R /XYZ 98.895 747.976 null] ->> endobj -298 0 obj << -/D [1621 0 R /XYZ 99.895 698.261 null] ->> endobj -302 0 obj << -/D [1621 0 R /XYZ 99.895 595.874 null] ->> endobj -306 0 obj << -/D [1621 0 R /XYZ 99.895 482.105 null] ->> endobj -310 0 obj << -/D [1621 0 R /XYZ 99.895 319.943 null] ->> endobj -314 0 obj << -/D [1621 0 R /XYZ 99.895 194.219 null] ->> endobj -1620 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F39 1429 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1628 0 obj << -/Length 1653 -/Filter /FlateDecode ->> -stream -xڽWmo6_}Z!E[]u b(#ӱPY,^w#eّӗ $;=䓇 >e~v* ̗q?$ae|`A9Lii -vů/oW497do޼ Ә3nԙ LJ`ub*',I@KRҚ-lE%YzQ.^/|.82ϢߡPK`,FuhbRKO$Lue K& KWŠ+o*Νki&8G7U40![m=*hZht%ͼs/l 5+P&!)tvC$ajs?Pb `cttdMuؙ`Z1a@H|U4J_ȁU公hý- Z59\'?d*!s,qK%CpnFm!j07 gtzA1;OQjfiLk+DnPf +s'Qkm88dvE.7[n5dF~85[TYm-=ǙݫWr_/Q38Lɡ:`W qD18{E`IV -p\>>Me-%vAc@pK_:'hъnUP98VUG$38ᠪٴG{d? S[)஄ْRY˜>Lhpla*b_tC -,fOH'Xw]lΞot܃bn =la 5 Z! -z?>+,2rPuӨ@x&'kt(kRs Z2fV00+?ɄKkhlmŭF+!Q( 8Д} X> Q$-?ƓeisߗlOCpaU JQG4m5Scpj6ZXU٩"I†r[G'!YTQQAVGG y#Wp\&vg`&B< Eꁍ?UOG}Ć$08{9ԕF(L`OqӮUTi?EsWN v6OrWpf>y&55E {=b|tYv0OɿtRLMashbS*Canɘ]xOhUeus$|lߪQ0-/1kKZGoELF;\' ;*yЂa|~CKt\X8j: a"ٵ]oVuW. r&k^>epnU$t<JP2Q ]KӤG[ʼܺfvٯ289RC>zḬ -֐6_6*$g<{+u#c_ -d-H0r3]Al0!X ե_CEOE҃dS( \o!6c]$ӤZ U7 @j~ -endstream -endobj -1627 0 obj << -/Type /Page -/Contents 1628 0 R -/Resources 1626 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1624 0 R -/Annots [ 1625 0 R ] ->> endobj -1625 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [410.988 499.857 425.105 512.829] -/A << /S /GoTo /D (section.6.3) >> ->> endobj -1629 0 obj << -/D [1627 0 R /XYZ 149.705 747.976 null] ->> endobj -318 0 obj << -/D [1627 0 R /XYZ 150.705 698.624 null] ->> endobj -322 0 obj << -/D [1627 0 R /XYZ 150.705 577.49 null] ->> endobj -326 0 obj << -/D [1627 0 R /XYZ 150.705 468.885 null] ->> endobj -330 0 obj << -/D [1627 0 R /XYZ 150.705 373.819 null] ->> endobj -334 0 obj << -/D [1627 0 R /XYZ 150.705 264.641 null] ->> endobj -1626 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1632 0 obj << -/Length 1185 -/Filter /FlateDecode ->> -stream -xXo6~_a`/){뒥H6C ֡P$9X(7ߣ(ɖ-N%eځc$6JRzIV!3ȹYX)),Fo{<]O]LH)6P<_9.E˸ -NU@*#!l 8fU(^+BwIo 4FȶNJ_ -;RY8\VE8xI@-XCi+gהa(<ބ TPX*O:1LYDLa=Ʉ:Z.PXWyBAW{J١vf.$wMRQ>ȚFG´i;gvNyElzH+4mx ۂF>PP*bQ"_ܹg:Ƹ4e@lQzD?$T̝ѸNjԻ,}aá0Z/%z5G_$ -fP@t6:ZTKQ$^msfk`pk8ۻDw87ń -m3$hR(-#G{lNM+n\~8(l˲&YL~{pX^۱6Q<4A BKj0:@廽vcJyۭCbCK֚SdGtW&CDI9ۚċ3 gsQ=mncÂ#`{⮹GmwQ7L!ob5 ŬT8$2 Bw>)ڑ>4˧?”ד2Uð@oV+N>X =VRMXְRa^relSjyMu$6oY;iTv,w>}ss!GȌSlbO\z}^GQb#"-Jb79Ng/E!h{w~Nm>ȝ1[Si65uQH? ƠT>SsYٛy8]7ҨNŊWJsX$쳤Lor2?d^0{/c9D{eLo7r -endstream -endobj -1631 0 obj << -/Type /Page -/Contents 1632 0 R -/Resources 1630 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1624 0 R ->> endobj -1633 0 obj << -/D [1631 0 R /XYZ 98.895 747.976 null] ->> endobj -338 0 obj << -/D [1631 0 R /XYZ 99.895 698.065 null] ->> endobj -342 0 obj << -/D [1631 0 R /XYZ 99.895 527.908 null] ->> endobj -346 0 obj << -/D [1631 0 R /XYZ 99.895 416.954 null] ->> endobj -350 0 obj << -/D [1631 0 R /XYZ 99.895 306.573 null] ->> endobj -354 0 obj << -/D [1631 0 R /XYZ 99.895 184.237 null] ->> endobj -1630 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F39 1429 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1636 0 obj << -/Length 1499 -/Filter /FlateDecode ->> -stream -xڵWn6}WC( y-Z_ZpZx7AԕMCj:wLrgg)z\o..o_%4 EV<`4b*e0W{o~teQǮ_67/#z~ c~pss5L!ywwu6/Id%nж%}C]K#š%$SИEE[D뻇W`1 -|iJq)qA܈%DkxDҾ"^6CKHWDtdmtVƘйعCLW - qmFn= -Yۺ΋ȓԤm{ !{@K y27֡BOg]CtkS XXLf4dYj\3RD i@qL QUEP.vǴ>Ç8/#( z:]&ባpp+n<bnp -"GOH΃ة)n35 JL#Iꈁlc p?rޱа6ݪ (85$w;#maY@sl!ڱE5 U8 ya$FdMANXX%ZKaI0saHd//pʨsquޥRbsleV^s*TϬ+Lg\dV. \ʹm C*Jv?=EzujI^52 -R&'-~z4˜T֬\.#1Qt - 0^YZ B,!q%]Nb -TQW :r$M_/T4Iy:Ͷ6;v,L}D0Њ-`p%D_ \TPq E'44``pHy`) 3@<m -#xc #T{.?k 'eY}{{OzR[q`K(rWg4'+LӌR8"D$-QRv}ٓ=STj%#ӛ1~fOqz%bKzV(a1δܪxsjʡviN/.1?E-4|(L-꼱18Dn`Ef*ھ}&L>f e -ͷ" .qOk}x IN[R/z׸m~I&(} WdIy `dJ}T㓵礱~aYhmA&[L5me' jRS E9ؤaRjl?ݦIls -Q풨fܟ^"l~;=B\.1 U|S\8TB s3vRPcEi 79f -endstream -endobj -1635 0 obj << -/Type /Page -/Contents 1636 0 R -/Resources 1634 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1624 0 R ->> endobj -1637 0 obj << -/D [1635 0 R /XYZ 149.705 747.976 null] ->> endobj -358 0 obj << -/D [1635 0 R /XYZ 150.705 698.422 null] ->> endobj -362 0 obj << -/D [1635 0 R /XYZ 150.705 597.822 null] ->> endobj -366 0 obj << -/D [1635 0 R /XYZ 150.705 487.425 null] ->> endobj -370 0 obj << -/D [1635 0 R /XYZ 150.705 394.236 null] ->> endobj -374 0 obj << -/D [1635 0 R /XYZ 150.705 335.672 null] ->> endobj -1634 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F39 1429 0 R /F37 1316 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1643 0 obj << -/Length 1442 -/Filter /FlateDecode ->> -stream -xڕnF]_]ji EcH(D*"ߙ]4;;-m<὞/teupFPIB? I˪0 h!]o'jՄblsCQncf~@ؾ;h#7ta$NebM]ey4}dEc2\W [l)ywl `r 狙'cSiznyBRex6@% {.Κ: R͘Y$M<<6u.|Ȕjs -shJIĶ^r3m+ځ4C$—i[ɓ!vpM=7.e ,tL?̮.N .KJ/3PaAE > endobj -1638 0 obj << -/Type /XObject -/Subtype /Image -/Width 962 -/Height 942 -/BitsPerComponent 8 -/ColorSpace /DeviceRGB -/SMask 1646 0 R -/Length 75584 -/Filter /FlateDecode ->> -stream -x\#ұE4-&1E@4Et|i^>cDl&^ H/*FW; . -~fνw=G.\'*>yRKnTWl)Kx:\A&O*Sld2Q}j.{7Kƚˤ,2ZeLQ-!4gFXCh֗ -Y-DR4*.us_)yrKW՞K/T Ht)tㆬDӞ?#:!pړeˣ/ON+bJBsClYwi-).Άf66P͈ȳl $#"jԬ2 ťVZE&e {`lddohh[E+Kl$ɯݰgNj~*{GZ2sVۓOz2AIW+6(@G&WXw?F~  4pzERfSFW y).bUí -#"RͰB3I~o+U/? ihYĥ[k7+C -0Tي-]Z6Ӝ&U5Qq{rUDNx/ E-Xj﹊lNu2„aykTXqWʪ/ҟD - :$\IXHַt0pk=ۊў /Y/$4gYO5oMyEn/cd1>gx;aklB=[.eڇ;fyhC1:߰l<Y*7RH[87o]ee20gđ_WUﻞᨸ1=%nT997u|{J+C^/έLpMG˕L S\?N'6䤲],FRF_鉙+B&zfmj&q]TsVȸ4u|6xDy~+' ECc|Uhop$'EXlXQYai~6p9_/c6rzQ@JFT}vm,o: nn=Xh8ց'fm^iU?^+bR3ܠ(1"5Q22\F=Ky/h'I-s.(:Ҿs9 $lHo A66ED[.==F^U;k)/Vm -3Yfx}o`9-܂ĕ-Z#E=g)"K+*J岦ia! -g 5tZ:Ve5[0 -2'/=蟥¢RR+'ٹ/Y`Ee5EW(yVN}'>/o*7p Kv[ٺR}A|q)yWѷA38u -rPʭ.4#[yKZ\u6z}Rօs$wiWd\+Uf6S?-(*cG%m ~$IĦHǨY+bJ.H#>bg\4bgJ~M7d*^Kha[9NzBnUhygRKnlDn"ʙD2\*tr?c7%a93 qiMy!9n }m挜 ~>οtYDʻOpiL)gBj)/V)sòi14ruqAلy3Sȩ YS?gy Y5>="'㒐^]R-i/2voY+ -\[AQP p?pd\"w?߰E -VɽTtHΌ0NNܐd%oZJ}[O=$z\{kxԙk57/h'}u KqۖHrKD+_.Tɤ*2I)BJH5ԯoliZTSpLܰL&%=ES(ϑLn ,^2CI\o˂i#K#"㮨 aNFNPsm'g -kHx׫js:q!a/Vq?I>? -rBh`"*Bs%{}_pT4|ݠU bW[yP^ҬVNe2MY9mXc&FزUC*C{nRA.k1x ?zVWXt]'Lq@[rZz 1'`7 $eqbfE!13Ĵ $̈mltw糎SN=|EV}14s 9~MλaGƦoؾ7*.:>paӁ~Iw6zD~ -nL&*jKwi:iSO ieY~;*{VddV^ް)ɥ0-Un23lMZ8mL ?e&3l\TH@7:>N3Vl-==\8S3S?iz:\!'X -G1futߥa9Ӯ&7yWTVR~ɕXTTFťzgcYŪsSj!gSϑKK+.D9qȅe$RO_L\ -矱6M(WA=Fޥmk~LlFz卖M>I[Jy`4܉q0>N;GnS -4:>iL_fRV`}ԒK/f[pؠIWv&\Ϙku2u/$}I_빤Ҽ3icJOʼ~M1lΩ\vZIתãã+j+K2t2zϺ RS\,npC|'-$qp]v"}rنM[<]%'R_>Ao|f13)a;+^9TW#~Sʒ?D\´GrB :4!1u‰Ogfgd_=`*suyt!\mWl7եToʘ/Mù.^Vܨ3#;D?Y"k5ugJEguaz^bF6;kr.*{yJz! LHBWVVn9?ϔfDoEem 8hKPg˙OMM1L*թUyIْdU,tb}K.k jbIu3Fc.Qm >Iۺ5NEZхh#*.*Ħ[̮KHK^NxgVQ𨳊j8d13w粠L| ]$I3F<9b$y{L -{,Pߑ,dP4(u˔<~ x͜aWQx\hP,'{8˳cXcHcXK~G.-b>gWIRzag^*S(k¥9{]c羄.b?ytF|6ppƒQ iymG11?o B4sbbIWTVoiᵊ<Ϳ Lw*$C?7ϕ!u*~ʴ={,q4Hm -f[D"b;ibgV8K'Nw ̣{-\ϑ#˄`>~o?mЧת`E,8*Ҷ-X\#n-b]O.ʂ!HN$ -40IBۇpy劽2yYM]iUrH.vK\u1gc0p dӵc`f=713*<_1~fcIuR77}i>};wR׾!!mꭴCH\mIS˼-?oȩ +fKy׷. ~ISmݰj,xLf &_"`0H1 Lзp.L^zҠ&B8PhɖNt!8ܲAV@u!>l9pVaæwi^Er >C&A;14cF(³r J-`PVlr`WXOĥ*Kn26u}c$]6~hA!&ˉsun>Tt\l$&BW&*<()3DBKL \F$hs*WbCNm[:H.ax^Y=OewҎ<ꤰOĥ1 N[d<Ty\_{*|l .bkd䳱n$.`CðTH{,oȩzUT4$4Z0VmVj}ٌy!Na,gړejYfD t0 -͟y;Ğ̓҉b7_ӅX+YQYk麈q/߰=UaIy^_Twk5 #x RU7md! mL*-:2 hbXnfp3v[($˕ђ.q ΅MSpjPOa%ɺ4hҠ]V_YT:fs2eyYPUtVXVREld~TL(+Og#c" -_h=IPU»C?yw*3ZaDW W[ -,6(&\Kr JND?܄p:a]Q^/ZS>?a\u -mJopGCaOȣɧj7~2."酅w8z 29ѳtV~9Iʫn5'Su H)%B 25MϦoj@=QX¹. ڡt\v4yq˪)=-]|v1̊[yMJ6&.qAQgxì;}&v 5EsBsXV&%Ϲ,ҝShchڌ͹Q1eMʔS,&s*1<3bmgA9Lqi=Wn7f5fZSCq }7BπБS?ykR6π`6k]{Dȩ ãIL)=4**o0H_Lj K!\PM2@Y6E82tnt>ӽ,4/:>M3'g[|gsQ ߟw1hN6&Nݕj\0Yi]WQYk(W 3m=U|AX.3/3 ؐBgo?L֎y3895uW*9XJzȋF'RBEsӨpts*Efv۞VFO*DǟK:/x"S֦17ᒭH˗`bznA@.$8"a_'RK@̍)[+ [vp&՘\g2R>uj*ZF-e ƍ- 2F*9[r*9քDc.:tD:1*6@ "7Cq+9nC\R?~&!uV3TIR0GӠy‘y(<6}^orE򔨜OtX6"-RzC0+yYhイ<xDd$ZϒϞc¦1"Lp"-iW$NEƧ2Lz - m̿Dŧ'f}%|dK2 %V33uDlJ5S{`G r˅'tK,HW#E'7"MR4-3زXa(H"2,s!t]̒kK\3'C$NuʢL 3>o.QTѡilMg :?R[ xnDFuvg%,E\Yj2PB~ oO Qs$e(9nƸ~YYQ+)<4d\y -; Mv&\9Wa2 .!|_}e;#[IGKoܡ VZR.]h:шNn݆ 2qD .h?悂˗Omڴ+W?XC$]^39BV&̭1s!53oun""0\褍BGX3%Y4S >Xz'c jdo7peqvsZ%31[~DoƽnU⪑ٰ\OݙE~aOr 8at`ܗS}~ |:|tfN-(E9n#*"z+$ٙZZ˫h"7iЬ V03;B堼d?K"[si۳~ ϥ^j\Vo+'2X9rSrp tTVV6&[lSrذa-9|6iSR%Kh̙X=y3g<2 *+kɭ\^;.R`,F16aO^&}ZMbtu\XoP ,S;)Ps*zR2wp i/ H8uk(8P|}V ,Vk>õ|?!e#KGC2Fjgi_Clъz{+&I,}();Z&k8CtΜ9 K+sۍ :)Vs&p2X:ҋT@Mb !fQ'^k^\|m[֟荈eawqΣC./,*uLT\4<2.&AoUylyperYC۟đ#G+n<%s0Ԙ>}hT4T4TP@UA[-\c3q6j(̶#/|7W6g1LGfTǖK5! ridlrŜUF᳥Xqvo})Ys!ՋάܑK(qnu5ݟ2?$Dn2U:٢yYyC!9i%M<.kE38 dKBr!n\{'޺RUgHXVS6rҪE-9$ &d.ʸܫJo*/ICRy΋Kbz+_%,fR<@MW|Ɇ]əyEA} -ryE2ez7jHzطo_?kjjN<9sLhh軭 ɤRNriRHqDQ,O4UJHM^Y'={.:>Q͘ԂRT@=^.`W1LJGGVsĦICֲ, 2'N6vYnl\9ߐ9'+vsN8_tVWY9 22TNJڕ ]uAin\wªIv%]ޕx6̭@%uT*no\Ltuhx#mfgiϥ-ٸsSD"`xqC8귁etfL(45<7:SXx&=ZeѦΆ TꘚWVl*ٷo_hh軪inLt KciHicNCxLBMq8EETaݔJ֬)Slp#;T4KjE츊L%r!I1OLSûa\!]ڊ8UzU6TVn9ȅ۰;pqT)ۓ82gqͩ2&'5\\ O -Iy1qI܋ɜHf*%3I>8-rZ)I:k?%\nRSYY٭[7jk֬i録{V=%'gѢEǏ߿NϞ=G5{px)4ƍׯn޽G9}K9sFtNeWtF^`رcIƘ1c<<<8<`tlL[a9d*/>FaKfﳖv>k4IG>W3Jzq^l=#On0,f^*6]ϲI& ƍcՖ-[&N<$DU*uf͚RgҥCxRd׮]Nbbb?~'w꾫耀۪_%uʕطoKl9,wC@k ngbq:yOp?[d_-SH\1mMCifC"P.FO"xCy̅j"[.wC@>JJv^OIGGG:}J^xAɓ'﯊^ :MEl~" _uֆS&bbb,EE(mNtW< -F,Xɭ"%14!JsgTX |þB~z{8g7g\9f0{+m;Sg٭['.|577oS_|im*<*՚7ލhZ]]b999tjW^ Sʚ=ZeϹs窫ʎ?iffvi.7xʍ7jjjj;ӧ@/C Q7.Y$--&&&~T?nݺۓȠ4ϥG0afW%y2NHsN,9h$΋V3Ssj {|i,aoFXk7kD5[\mzibf|u߹&gr1ݠCg2XWRR:SN_~X* F<ݻ:uJu6 Qy˖--U?fڵkս7Km -V^,c–yZ N>>lRuttd*Nmw}̙3tRVVVs>?x8?h L- WR&!Բ0Ѽ~⓭ܞ|E-t]]Y:[\*$a|2͙}PuS$jDhiX}4Iw)9|fW|﯊~T]zUNEEmK3dg޸q#68AS~M6TmT/^\-_4ʼnNHFWWWZS, '=w58ƒ?n=*ɸԄ$̩)V|@٢ѴSGKϻfWKCn<%{LXϪ?s}TѭZ"[ZZZTuHGFFvGfܸqwPUSSuYt/V?/ -mNwW<RLѤQ1XJ["`EE\>X`Ze `nd1фg! -,)xH,KұO>rqHŭ[J>h Vݝ:uJe}bKb3Ԏ644{`]sa4@E+mkUtkZ#U+?+g*4RIn+YJ}> -\ᯕ6S#U*rBϻ/B\٪:Z(#֭[Rg՜\P[yh!NB[b CdzﻊVXV%sss]ڌJX%I܊R#q]̥bS0g392R+pjB[w_mzJ[Lv?NGó,##C\.N ƧիW)yQ~JJJ~Έqmf.occR-((֤/[lڴiIIHP NP_=l۷T# Rͨԗv4w@UԷp3:ώ3V1tnTzMNFsAIUIE:GQwv577/--Uj*5M YS,NOOW֌rUUU~- !W^+Vh)BZZzD;d K/N=E`` ۻf]4͎~F/_޵kWU\\]]Tt3mhs՘ON<I_o3ʹᖎad27H;9Wn9`?gSD\^/Ќ~U4駟י4iUҥK+utt"##IVݸq#66O>/kT]&;;:߻wU,:! =z) .S<mbbboo/$''WTTHRjOR#پwBKYEN8QSSS[[_i*BrWݩf/HYd栠 !k>s̹|2էK/vw@rh>' bRȴ'h7nlHN=,-fnF.1oV(}sz.~ij+VP-""Z;SLѲÖE3*}FkGeq4i$lZ;]k}m*q~:]P~F1q)Ge5.#*,*V{83!m6a^T\\&ĕ3P{INn/fN/n?%X?F `޽[h`,Ck?vmۦ*z…md ˗/2UkVk'5SUtmp`VDQ|3gM[πR&7Tzmꛤ 2>% ???Æ Rok~>c?2 --^dggWIٱVD!CTlw6><|p# -ͺ2RRR&Nx'&[KB˫O+*y,c",'BVm:+oLX4G?h9DwܸqgΜSSS,YbmmcPeCC - -sbN:5o޼g}{kffF#l .Y755Ąꫯzxxl޼ʕ+&yyyׯ3guۿLMi|'j): ^pww饗}Ѯ~nƏw^aJmuttkQQ_|1l0j[o4a$%%999OWW!11QYfߟٳ}4ӧYM_ʕ+$''3)ⴴtm*7((K.BD*h㫯tޫW/uܧOAQǏmSSSAH?C|||YYYVViRQQQޫhiԏ?}%K_P0o<*9wPM%O=X:t(33dPȈ - - Vδi&a/mSzeAxS+ ۷oiiiqqq޽+ac=H r'?˖-U7ׯm{iJISI.]p5}QĴiӘ5xƍ{R! :lIEYet5 @ #6b3LG<pUtxx8)R[[FDDxo^ٳUDll7|C*MMM՛0u^^Њ5ۢ}Wuttt2b],ҥKUʏ9-((:FFFMi;,,L"8;;CE-[tw},Tի򊋋?i$===JJJɓ՛$&&2$22>ܧO$hБUt~~m79yG}4l0@{cǎ]|fAK|ʔ)={}'fϞ-,!Ti`ffE;:: -*tX *hxU#pٸqo3 8$$GϏʅ*Ĵ G0aBݍMvy\bM{練Ԙ wpu҅1DҬf;zkjjkiiIrcx[5f매u4iRjjmYfŚⴟ @ĝ_uUfdd<˗/g_n޼4{+W+ :;niWXX؋/xĉk׮رc+2M}rA4x%?d?}d յ{zzz0??ťO>Fڶm {ÇO8[n&&&=OIɓ1>}իWoDTWWj;{56mѣGPפAE߼yH:{~_Rܸqx-էөS꠷-UwQRGъNV@EzD"=O *zo'c_MMM+**T~R~-,,*ZeZWҥK駸:iiiq#F-ºupc7>|L)I%n,)'髯^MYRR .!1 TniS||믿CWhHwtՕݜEEE ÅB?7nP*ZG ^:-hniZZe2CJJJuv裏jѦSpqq jUJ p5qIuuunݴ٫)j %uA\Z*cǎ=3tbC` OOϛ7o!RT:z *zܹ^ZRњU*(//w,qww߯_ gM/p~:=JJJyMk Vb{_K>|p\_"H$oދ5jTQQ!Ct@=:LEkf#~444{G='''/X@}.]JtFVVV@Eg|KyΝӧOmff~]Rr>ޯ>/^޽;vޙ3gHlgΜСT4Mqqqq/rK-Zw*i:tf>S-o[WӋǛ'<:;_'OuVq###~嗖yo{Yf,-|dOP[ ͛74T*̞=m?.}%駟WZ%۬5qqqӧQHދvޝ:l'|SCzzz dgg?s=|m  mC7.11Q7>>W^foϞ=UbۆwiR0 777iB}R}ePE9s5kh>.x(..~]]]WZޗ^zرctwnd322r\V1*f(K -355/9r$ AEԿcRA^a׮]TWWwM`V/'OOW___cnn.++[5+^}}XEkػwށ>|.11ۛ~jv۵kתPQw|\?[FUTTԬ600 \;dȐ\G)GC{e˖_~9,,Ν7NN U=ŋBSSJqG]B'hر>>>ݻԶ 77WߖYay̙7|S3YΜ93 ྨh333%ЪUYUC7KqA%22rРA{Q)JJJ6{ qrrmi6-dgg纺:mTSHDJ ,h_mdd$Tt޽U֭ۢ[싃Nʯo4-諯o%_Py -5f̘{VoqAmfffz{{d2+|||o߾*G}WuuuWE?X<8 ŋ7o.AW^MjҥK… G)IKK[IؿkvHtt4RX ; -z[^ -,,,"""]6{Р6V\v\t'$'LЫW]2䧟~jmۊބ{e! -Izxx 4HOO%n^EEXԜ%Q斕%;ylB4tF ם[[[nݺٱZ566{?͸m5m9.v0} 5P@E T4Pw@QQ̙3{ꥣcbbB%lcǜ<6AT'ϟ?l0CCC]]]sss+VA?cҥK,|rWP@"sݻ833sҥݺuk_SYYY踸8=='x@PRRkQy;k׮T\ :^` ^s$''~ꚙ988$&&ЄYf___gݳgJfkFFƜ9s ReBa;44t̘1:::lW``AQ}2eɓ'[Dpm<}Ç<{}!YZZzq655$?C|||YYYVVIQQQ*^{x.))믿4HTtPPP.]T:)jww˗/Ә]]]uFk9v9} hCCCR;;;SM6 %M%NNN-PRT+hTI7|Y$VE:t(33SX,.]GrlraS:999B mS $#IRI.]TfffFLӘ T*k[>xTO>Iz/..NC},62HZJ*UC 7SSSoom۶>}… m>xTٳI\RC}R<5c[Iv~~~KJmT<22.$}IA#ݑXzkjjkiiqƲ2vjff6uGA_>k֬޽{[ڌ󶻄 i$ׯyfh}qu@V^G=zzz&&&cƌYvwϞ=~~~/AϞ=|p]\\uttueϚ(f̙3bĈj$ =UZ?piӦmڴڵk$KE R΅w2e?_TT^YBE? 5jʕ tߺu+%%^W[b[WWwi++_~Eh~ѣG-'$ղgmyUtttt˳ AIZj۶m14xWEپ}e2*4m[K`C a%%%cƌ^{nm[t={~Ujjj44y'/t FDDh~bbc>}H;ȑ# - vvv&<$n[XXJIOOO?[#9rȖVWWkJlڴznm[tMjuG}TCҴ澾~aRRR&qgƍۺu+Wn޼yf{ RCr -Emz-\__͉BEEϜ9R;v<3lʊnfz4䡍CiٳmйT4=oܸѪV˗/裏44INN2eСCtl&kggwg7;ö6l ޻vZ'''[?A~ -S-)..~7o̾ۛ^jjjH?Y˶*Z%EKHl~#G$R_&yY^^or{zW\155efff%%%*\x;>fO<+lٲE}/]q+++&aEbxر}[t.=dȐzt0H"GXC}R ll/^&OX@4P999 R)=z4ݱB*q [EEϜ93 4/ - mmm=*f:t8`SO=y$_|qgUOG$*RDFFҥ߳gJQFWjֻwomznm[t}ԩDJ ,3Y /Q9D=V\tRr__>LH+sa,\mYQñjjjpu|;&d믿*? ooN\u{O[EE`\Ç߷o_UU)G꫚4C:tb$Q 5+--6lزeΟ?_C,R t^z%ٳghKJJ~ʕ+ls~w#88<==]ñƏ?ΨQV^v -w9xh6z/9 _ƦdϞ=tSW-:&HBO0W^]v2dO?$H$?>s uA7kpfv]p!fڠ|uttLMM_{5kֈGLE={v$i׿._,gkkEO8QpnXTcquХgʔ)^iBNN{ףGccI&%''kٳޛ*hwQUǓA@db_)Q1EG,3/ ^lp`f9fʥ%Es /D$N2ޢA -v  7{o;9:}>9}} +++44T. N&Cא!C>jW;{w۷omڴqvv=zh sf̘~z&E[U^z@{{֭[s͚5jmRR҂ ~:::4>38q=+O/ 'p~I?r=z)z۶m?#GjjjvaR4~***t -裏 ֞>}WͻwC灣GJ܍SWCBBP"Գ< :T^]vCwݺupߧh;wJlԩӹs%uuuSL4T||+_hs۴ic677W咒={gkz1Yŋ@_nExݖ^%'M$/+ĉ=<<wء-;;;""}ΒZf8==}ذao K>}i͛7~a*Zɻv毧d?[oeHy 4:ok:9LӧOC/?-[fmk"%'Oo>kN~&&n(gKΝg͚UYYiAtP]]=]ʆcbbn|&]={6((R<'co͛?m=9rD[+~~~r^^,J><--N))((2yLMMONNVjϟ?/UX^˓-m=33g˖-WoW4y(/U6ݿ߿V>H]ׄ^lZ~7ճ|}}oܸakf@k=;`%ϱcǮ^ZRҷoR9P儑X=HB{3nڴH𼼼ŋOE;{vE +{WW%K\|Y~!!!2~U~ذa^%5N8::Z^%)))o娨X+>n8; Uu6-ԇkZ'N(H[$Z曞7o޴iԇ3f̐w owMg͛7F1 @0Rbr$#F4kbɫ*ɶB֏m۶tKsSt [[[gKmqv͞=ɓ555?~h7J}ndǏhoP?.U^ܺWII˜`ի|5+W l-1112B ՚0 ڷo""/:t"u[jp2/)--uwwoפA:ud9,nWOuƐ=wg}V򡧧@޽ϟ/& 4h_~۷o7ic+ y˼cǎBrrraa\,X 888''/xRS^}U+_%jZṲq]]37x㣏> 6DEEYYg͚裏Z nzر~,l޼922ҮY-iYmMw4H_ݚBv$(>۶m۳gϙ3g-OvssNNNFҦfjH'rm~]"[nZ.Ƶ%rI"#^zpB[n}9s_~i嫤np}0yءC r<ؤݯtppf/tjj˂dÇ[joigZhZ kҠLk -MNE=4nOPן?ܹs+VѣGStMM27-|ʕ+ڵg 2y\է?SJFEEipĸq,ݫl0ۼ^Fe{ҥM<䣅gΜQbp{ai]v]n괷4[]ӌN-tpIы-1cF&њB贈1H4=m{0վltaG}aÆw.]2o9{%KhKnjcMϏ<ȡCYYYݺu ]SSs…={+O//F -xՔ(U+WWbצM{{{ˋ~MJJ\xܹsРAv*//pa}{ai+VW4cf@kq֩n)_޺uKJJ.]*_޴__hZêUN*rH - -j^@hh\WZ7|S{E[KZKUU?ooeA. -,/{sΕ-IX:wƍ;v(׮];:O -wwwyьD:૤$@y ]`Z1b777sϩ67=={ª6>~СC}駥˗Uq 2 !C6}y4jf@p46xpL}Q'''9g^y+=ILz&䗴ǯ:c9KW7::ܹsK)OD8gUk|0… &mt5rcǎ]t0BNNΘ1cڶm3Ϝ:uʞy}+'ϥڛ7IW1 gXoK??x k -=H ζ@GFFF,GB>Kp9󈨰2dȇ~X]]}oJ%E? &Nmcc„k"$O>dȑ=z(**"EyHHeeeh^Dܹsgxxx}}=) ())ٳ'<"Θ1c܉'zxx888رCÉ'^|;::kk ^{`0Ȃhk^4~᭷2i,%Rޑo͛}ɘe (((>>:55?99Y_~;w,--ZG&E?c-***qF^^^\\Njթd]]o~^m%]ޑaaaN޽n/iHђ' ,GGGoٲE[ҿK=ر矷&EϜ9s޼yGe*AVMV͘1CR5+ڵ={\9TVVJϘВcrhEE%=zxxXsssoK ڷo/%\UUաCbkV$E?lmmM> A:44MͥNzWe;;b:{{{kR4Snhy;v~( 7o~ER}u׮]Ӗȥ3KgΜ_*^^^W^eUV7o޴Jv̿y)Z"555$$D|Ç[")-r劜 hRDO9DTTT\\=,],q@[+Z]emITtuݺu")7{%KhKnjF#bMMͅ 3nܸ'xŋj\ ˗//..+,,LHH~pڴiUUUֲe˺uVZZeE({n4--SNXbr_+{rϝ;ҥKׯ_OJJܹsff&3tr}t%Q4l#ICRA,XTI7x`0xyyM2Evݕ+WJT󓼝ͥ stttqqyꩧ<ضmFG=:T\rcǎg ;R"''g̘1r9;;?3NbNh8p ӧKKKkkk322 ´:-[zՔ]jh R4@n!CJS%В@&EMZ322ƏߡC;;;//qƝ _u@H) EN~~W/ή^KKKoK&T[f^$2rVVV@@)v+ˇիmLh&?@gOaX*#""ڷo>L_jjtٳ5k$1ϱcǮ^cٲe[6o,eي~–y„ R%C*CCC9I.>;++)Z:srJ{6jɘCCC%ڒ7|S>g5)i>P__ii222Ff0{5k4uoLLA,Xм3Ǐ:T姟~:==]Cxdݻwli$DHwww;;9sTWWsV75?7<z|7UTTrii󽙢+dq S>˪U^z@{{֭[s͚5&m&NmccPF jf E} ~B? yHH'|RVV0JP>ܫW/])$iM6rIIIϞ=UN<o>m܉'J;vhוӧe˖i---Z___0s̬,KE7O?k)]ɂhә숈;;;O2e޽ Cه:?i$vI/_~W|||dg͚7-鹺z]v*oo}i/;{lPPoo޼g Р}&&&J╤$iSjZZR[PP !$>>LjSSSu[O%ϱcǮ^ZU{ŋ߸qHRN骼\Zht"]8nZQQ!&%%7[X>|Lo]]5knݺ{%%%! d_JEkr/A?={ 7(%aaaN޽n/g x9ydeyݺuuUG,GGGoٲE[ҿuݛ7ojkF׿Ο?R3_j̙DTTTll%;k}-믿pBK{vttI~{9v͞=ɓ555>34qFey >>&VTTl`VZ)yyy֧hrssOMM-YSIF~h{-82O>mY=Hr_ݯ_۷+%M.%HFhT;vh>Kuuu-vvv5Ě'޸q)Z[(Dn4Edg7?οNυQQQnnnR4jԨq귿g 7BYnݺk״UUU/?>E7nڵMM-Ya0*++:=zt||9 (((JVk{6!#׾+辘g߿O>ٳ,Ys̘1HkkM 8pӦM&/^mu QZj,Zn%&&Fj0$鯛=wg}[nj3Ϗ~8??y)Z[-YM7Zs_Chzʕ+:9ƍڒ:TY0UjR[XX&%NNNFi-7>7k֬G}Tg۷?۶m۳gϙ3g48:OZn)%nZB>rnWnRɻCj;jիWGR__sέXGTY۵kg.hSUeeκ>>>5~%KjNՒu=Wo$E{9EGDD|>+66622RY7nڵk>:99YSe}>|lO<䣅gΜ Q o(1ϤD^4?b&jo&wqK0r[-YSHA#BN0i&;:$y{{gee)7x$&&Jڔr$-_XiaaaBBP WF7ߔhURtZZZNRSS%ٖ'''}l߾6##cȐ!;4)~@˖-pvvvqq ߽{}6>E׏ `5%E) Eh 9E|}O>D:)ZY.--5Rlٲ_Niwk)ZJ?LLR-4ӧO rO?ԤԩS}}}1c6nhccvL -7QTT4s.]8::J.\GK=pS,={TKrrr$J=pḏcJHޱcv*yuҥ/^})Mxzzʲl(22w5yheĉ>>>Zںu*vvvҬRJ˗/7;E7X/_%Ecǎy{{n:--M4,. rss-d \ZZjAP7o޼ѣGwAFuR~{vh!9V2NNZ8dih"ۧ,<@$y}gZj&`PKڶm+%%%% y{6[~%d޽ŭZ,..NMM8q 00PBDYVe_ӧO6ht]v5kVff|rYgU3H￯U)Z=zZ_K]t1 l۴i{ I &٤Ġ 'Mn@ȑ#]]]^~eNaHKcѢE3fPH E͙3g6mڤ|GG||wVV0^~[^~dҥݺu+--Ujsss/_^\\\WWWXXt!hp:~СC~ӵロ:uSǎ_y˗/kוooo:hР kܖ$h L h__ f&no߾8;;UXXX'|œ!!!Y{Ķmۆzȑk׮]~СC}]n3,駟^{5___ FN͝8qCpp;VK)|99t;C>ܺuk``teoo߹sYfUVVf0??ҤImڴ~hD?3Q^^c-Zƍyyyqqqj^-(( - -/++NMMONNi<(a[7o>_}Z;pM6ZxɓuzkPJVWWD,[uɒ%/_~mHHHRR31syY -[lV_?kW͛7ozUUU۶mkkk9vh7ʹdoo߭[7??Ǐ3'J...2,,hԨQ555ڪs>쳒[<===X9phcǎ$''nڴi999 rE14h%c֭۷?۶m۳gϙ3g$fWWW_ѫW/B[p¾}23ڵ3yYS^z_~'O Q?<˭w333uz En^?TQQk >?StV7 ڜ_ŋOM&Mދn7BR4ZG9t萶$++[n FZZZNRSS%Ж'''w6`!)Ů]d0 _2'ٌF@G>}o^ZZZ[[1dȐбlٲgggݻw3'  4ꡇ-Xm6ʚ8qZ` Ϙ.p!!!} ?\NO>̤{?+**jjj=Ǥ >>&7VTThʠH=wg}[nf֧h[[zmP%%%aaaLP߸qR{!:YwO>ms̙jR45[v횶0$$Zڵ35zyy]zUgu㓙ӌ{ApppFFʕ+-9pRRL >?`#`0߿rWi;jK,і$&&3F}aÆw.]bN:J-//ONNt3<mOTIR4M'NhժU֭ - - - ]\\lllI@Gǐ!C$P -z)+;$EJ۶mܫW/m={JaBBZ1~:yyy7ɓ yof̘1m۶uqqyɓ'oyFQ]]O ?Sh̙]tqttÇ/\ ;/_+ѣJIZZLСCeaZQ-eKEjJ{[d٣cǎ͛7O9)Z<666vjR)t۶mjo߾!)Z.Ej߾}滦Sm08 )wU%KLN<ީS\tI~xxxdddGGGggg_>}zKR޽{[jՏ?(}N8Q2@bY233KJJ/_.+>e܅kEWIOO7n}ёj6AAAIdݖh_K]tIxnӦMhh{ァ#G^~e!;R4@H}`_?NjteTgϞMKḴ=]HѫVQjǎW^mf߾}nӦѣFv -;;;//!C|՜0_S3<<I)ɓv޲e$%% EQQQMʜZ2¶mZjcǎ2di6_.'mll$aÆ5:{OViK***\\\%s[ΝvAmf޾ãj56E+l%&&F:4 ϭO:{_aaaTTd?IFQjHyU޸q}'|r۶m{9sLQQO]WWgooߌQ j*33SÄ$Yf=)ԩSj_ϟ;wnŊ=zP -^6.7ڒ+S:):??_o3FenK,iJ%ZZA?EϜ9/lt#iPoABc\\)Zq֮]``PCѮ];.]׿2w!ٺR"7M<䣅gΜ Iџ~z;*9h4֖;˗//..XXX`Ӆ333}||%.^z5%%eJUxxʕ+{Zjԩ.\~ - - -$~iSiӒ.^lٲnݺ6cT z===׬Y)R2sLΝ; k׮rIm~_tMMŞ={"'Z3Itww 3gUKwuu`j322Ff0{9JyzzzmmmR+HottsmIMx GV2eʥKhҨ$1cǎM\}d ...C 9xv -X^DmF?CZZZVVp=ٳiiiF ~I &;ܷo۴iCkfѣ&Lspph۶AVZURRb L!-;vzj+Yϻg.]R}YM+V1I;ed...v<2`!C6YÆ sgw&%%-X෿>0`!,,O>[m۶=G)++۵kWxx 1\BKHHlNJDġ [hڏ>HbtvڀIM|K1cȲH̼Ǯ]޽BQd]~x+++LJrrrSHܖ.]ڤ3Ss~~ԑ#GѣHmsEƍ&׮]{ݻHOO W.$*V{СrbKׯ_?tP߾}׭[w}ԩӹs%!LҤ߸k`ǎWHܯ_?I5:׿ծ]ϛ1c4oꫯ$d̕ˮiiiKђ$,@/˒%K si1ݥK;۹s\w̝;w60/fo[">r>+>>>rUTyW]]=|yvppIHH0y3kr~~Iڴicooo.'Optt ݷo ;}M~.[L~z$x Y0vvv:/NOO6lX[dUѾ}{ggg {=}ݹ7o||۶A͋r(e*++Mjp,uF;09}W\xK/Լ/XB+WOY.// ~zwc:`Y4hOѿz~r߾}wA[{ sWr&Orsm?Dž<~2a„5k֔֞?~>u^¤diiiuuu'&&Jf)X}мqϞ=eesرꝨZ{Eݸq#///..NWMgfflٲE͛ٳg*23[nU.?plkTXXG}ɖ蔔{LSU@hͫȂĤۛ9| wܹy):00P{Xޒ ޏaN5xƍ/m6lv,Wʲ?7)ڵK~[evuu +oV>䷆ 8::VUUY&%wuɲɗ'H~ˤ͛7Fc@@??S_EV&UGO0,id,~6/Et%\4Ɏ=y;s.]$2 )w/[ 6LYjk^mϱŏ?g,qFYQح[7??Ǐ߮{D޽ϟ/iSB~<&5ؠƒXZj,6)El"_B5YEIs իܺCӿ***b0RRRsYf5c-o[PPɮ̃?ޅT}7)b4zε^ S۷jjl-]_WN>].nK6>C)Z~9D-9v\ '''nڴiV~$ (777yP1j(mI&/iMMMښ&ڻu;{7xCaÆ 2-9N%h=MJJ~EN)$JL}뭷c~f;uԩSUr -ɂ[#O:Hf)fff6N:YsGG5H;222?cheCꫯ*r\ܩ!!!rh {_hK.\طo_R4S__sέXG7E7#EkMMM{yy*;t`MV1[%=QYY9ƒ 2f}}_lݺuƍ* ~|A SN-}zQՋhYqw'E7x4ڛ?3g/尰0O?~'9V)_7<˥ -&E'Կ EYR_ކ Wi7a4bcc*ƍӹyذa{ҥKSɓM>Zx̙f_n9a„;ٳ{*>>ǧ#-)СCrIe~KHye&twMۛ͏~&<"~z;3gg -Νk) 6w3O1GC-֭)p? 3%%%o+Wjof&E[n~ttRy,--mFtԩShMK@ڴi d=BMIIQLxNΝ; k.;ÇKh³gJՆ;l2ej̙;wd')˖-SroaXze׬Y)R"۵o>*ֵk߿ߦx[REGͿ[J-h<_paϞ=rO\xQmSTT+ қr?+'mۚu?ȅ@ǎX.gL[^ :22Rǁs~*=={?e>EwSNurrWW^y-JS/;.,,婧:x`۶mu^p7}C*OY322Ff0{9pjlEfOL3_ /ٻ(|m[sSPB+"z\^^T*'Mz OÆ k/Jt,Xgu͵t_zyy?p=)M?=Rk-_hcnPiӦCd233'~@fpss۶m[ZZZMMͣG.\0z}a,O> +>>@__o߾k֬xɒ%rʇϷ=z_T}}}XX3Ͳ NHHhv|@ZL&8uꔰBZZS4HѢەAcb[z@RXTTh"nVAA\.M211ˋQ~M - -ƧOj'N6o޼hT*i 1116E3ȑ# -Νfeeէh*Ԙr#G ěT*ԦhQIyy7mmm]VV&J`))Zv*~z6zhRxÇǎ{С'OfffPb䃥^cc/-..V(Tbhh8sfgII eƺ\jiHHH޽{ibV 26;@fgg)m;aTPP1x`)ƍro|2=5mT]#}̙Vtujj*5211{@G׳gO9W;5#--FTR>}ۿ%СStmGuֺu6nܨ-s޽6JKK5y&Yaaa w}hٌK^hii)<<Wmh @הeggwAoҸ͋P*111~YT8pƒGS4e#GPpNAs4ar<>>211ˋǍWKIImaaa ʪs'O4iŋ_lK={K(6ϝ;duuujjժ0)%<3L(QIi;E+(5R^pݻUӣca =o\vK.u݋m @gmm]VV&,)--GIQ2[FFRVEEE-JѢr )`hFUX__Oz{)’a:m\_~/%]l$( -WtqqB077$ihh8s|>- lfSږpBBBK i]i<ѕ+ hCK&kkkщ\zhcc#,ijj*((͍ -6 FV=-L5gΜy)zѢ/*^reرm+ţGd26kߵk$***00PmZCCCnzƌ«sݢy+WJl#E0.xMNN߿6 K֭[Ǘe)))F҆tMֱ1lmm~R,++[v-]ŋ(UTT?~ӓ/^CZ֭[]]]˥4{POMJJ?~MMM|Ǐ;88 W/g|ׇ9;;,[[y_{s544p%7otqqӧr'cƌ9rHyy9ͥiooOOQ - -hQkjj*++Yޱ%%%EEE-bц,;;V=uzӖ7.55B;WT7o^tt4R*i#$Bxx!bz= -K( -K(Fge Y???)UPDEEIiU]]]=mf! `Ϟ=¹3wܶr… vލafd2p4hW -KjjjLMM5///QmmmKKK6#//oݺuSNuuu200`!`mm]VV&K+Ur---߿wȑaaaGBВWKh_PΨF6>|xر:ydfffII hatuuEk궴ݻ&߯P(@{~ӧ9Μ93??)@^IWoܸ!˥dTճwVVjvh-Ʀ--$f]#}9О܈#Ehիu'͛W\)%gϞ;r\ v΍ - lK 9] RFFF>=А4h]XX}҆℄ /^ò[Kɨ39Bt:NJJ?~Z/E@ $rrr - g/ ?uw6DEE ݬaÆ%&&bhmll_xf)UVY[[蘙VІ{_==&.//766 ݲe˃4ۇ/mmmlGGG>}1b Oݻ7R4(;7O?1B8G짷?`)KK% -BF.,,?GœimpppBBBK|ΝѣGgff>%p899&mv͛7]\\***(3>}Z.8q;o޼hT* - -bbb<<}ktb+@n~1b Oݻc^_/딗FFFWt.oܸ` -\aaa--- (=zT؀<^z/Y$99Y*QK|}}MtEQђ0gggekkЖqqqYpPsrrέ8p`xxxiiicccII OF~Ν;ܼyd\\-ӧr'0>>211Km&YYYvvvziբ[2o޼hT*U111|{@gE9t޽ s[/XE*744$hvK -9Μ93??-JOHjŽ{Z45@2{QFbfTPP1xGd21Nʕ+tdd!gƌK|)jJO -b߾}{njkk%vDEEJL얈Ъ ұ)))F)򗿨^}E人Ǐ{zzJOх۷o/--mhh(..NHHvR:֪sv!#33:66GG\\mvvneׯ+ʲkRލt BC%ZٳgtJ &D9cƌdgϾ|%r\__lĉ6m禧ђMpvZZ.%g+W&O/LJW-*d"t``Shhh}}nO|}}`ZȌ3w,,ٙlkk6?O?մFr^HdN>7>>ɉHѷo5ks{elldɒd}Ҋ:fj~d .U3g56mĈ)))ܬ>}455?~vhv= Ykvܹ͛...qqqN>-O8!e*6pƒ -cRy󢣣)J &&Rj5ʖ6l`l#{9N9BٞO1=m>\ooXj'Zh"n-6bvMMMeeebb>iE]N+b,eo4Ў.\7.55Ls>Q`U.G‚nݺSZYYO---U]]KDz~E)6Ғj*~wFtM%uUE'T)XPS̙3jeeebbbFrDcǎ=tɓ'333KJJ(| -]u[Z'QB/+:FBBBKinaEM\Q޽{S4 777""b|֭[C ٳgUkZڍ7r97mgg'=ʕ+h4GGG!]Bnoo3gδe7`0@L -b߾}ΞjƌGE/544U?~Ν;Arx7o^r%7ݳgO9<J@@ZVDׯ[NTʭ[ZJX뛜ܿU1FFF oF {kBGG۷644'$$_+cUuEJnuuuǏԔ=<<(]~]T]@X5k֬?\JYxq||ÇiLWWrnndd;s-ڴ7oRfvqqWeggG(KV\QRRbooOMQO޹s1˗/?q۷KqEڱczF1zk'Oz fff'NܴiĹRSSnj#gϞ}eM)Y``Shhh}}vR[ts%ʆ{^lituu) -WGbdd4m4,OZw4n&&&ʴj!!!6kk%KFnX&*OKKsss'JhF@?j@V5lذD-Qzz #Й&̭is#x-)Zs`LLLܴiСCe2ĉ{QzQm۶---ѣG.\=z}Z'H=㊎),,ӧR4tqiii&ODzzpn^^^,Y(WsBzj``L&8u#&QZ?>U600pww?zpnyykoooddzlvbNׇ9;;zmmmԶ~5x'''z~߾}׬YS[[젰{YњjUSo6gj=((rRR,nzժUaaaR.p2a]]MЁ[r]!Bѣ=aȫ.oW^Ewӹi:4Xpp7۽{7Mf?@Y[[b-7MPYʛMѢYjnggGLXԔEEESt#GM6##CT>Gbf芼uM:g3Aѣiu~aÆIOѴᖖt}}=TUUMWWWSeo2HWWQXРMӄh.)֥ -[ZjjHN+ -sss*4449sf~~>_$ųfFW>|xر:ydfffII K7cmG~Ȑ!QjTX)Zݻ&O~.{F֢Ɔ+:S.֭Ǐ7nr1VT޽{StUTPP1x`w}w-ʓ+a4ѴFWeeeij-cP=FԼfk --KIѴᎎC -egΜa?W&6ߵk$***00^TNq͛ -Ռy+WI -BxSb3f+HgZϸ[oEcMkE~SAHHߖ,Yzzitss>'JIЁRDEE1n舮UÆ 5FDGtpmllбq)$C@@@@n%%% -\GG,ƍfffK.aOVgN2%((HҥKiUiǏW4???ڹw˗Sw>m_~=-s֬YֶnK~[n&&&7oV(..655IKK㲥#Tu)==fe§==+77Ymxii-~6n)tM&MDpΝ - -ϖs̡[ѢFo<MU^^6|֭ɓ'3-:DPtuTg?ݺu9rZ||<;w)+IKK[hQ޽  (zHzzܹsmll^*eܹ+Т3٢-~D755?)ڄ/Ξ=GT"z^^޵kh{ell}).J QQQcDz)}K)?SrPj_sQawM5KJJBCC!C<R wy$n"=|l߾]!;vP=8gG}Dk÷~R([&''ĨQBmԩSmIѢL%:8| MSܹsٛ|=JŒobK.]Jә_~j_XX(*)**zu߸LHHBK_\]]ȑ#Sv횾۷KKK{I)%;v,M'&&޺uƆO$ES,nݺ1J$??/i*r&sqtСj-җ_~% Զ<٭SϴAQj6=twwǮR45kw4&&&fϞ6[;vGvZygU UpwTdϢӼ-eKƈ.HnV.uy߾}T_Cccc<s7_j%qwwfG瑢| M7{.20߿hі4[Z:MLD=ݺuM Cٙ-eSt`` :t/1AO-򌨨f{E[$p͢pWP"E7u~Y~~~K,h퐢?S.mٲ-Ӟﲵ[zE>}RSSܹC;::ZZZkZ5UW^y(E7dLfjjJ ?,--=}`u)٭c۷iFFFr\@StaaS4ȖChV߼IZZZ@@5wG@F&'OlݺUJϴtK7|o`w矷.E7u7eȗ_~}RtO?QNKѽ{ - pY~}RJΔ^ H]tIGGƍ~c)B[XXܺu {8R4R4@M/dO?k?@??h@?Ch?hxJU~~+x!7HDړC~@!E(͞=[ֶ#f-[\.%"j[ݻrapjw@WOY~0>>_ - ϟoiii``~QB}||LMMMLLN8A_޽{|4___nM uƍ t]__?##|SS_§6G[6-xzzmhS:99©=}]fMmm-7kÆ ?3_ٳ7ndZo{XS)f.7mff]\l5ssP,y啞N\ᇕ|a|[@F)*?`t-b׹sg}33׳_^ԩnÖv{XN/'g#czyo;T E?x#!C\zUn޼WQQQ__i\NA_VWWWVV\СC;{7YYYvvvz0''_kvܹdܸq|RRR_==C~̘1UH|RHy;<<|ѢEܬ3gPnrxW_X|aMѪ.{{ܴLW_%\_Aq˖׹߇ OL|G`h::z2ٴsGp i\+W>%V/#c=Źf[xWšrWONN^?liױ;bƍ3Ft44ԧ4ɓNBJ,,LDۅM4o'ON6M47((RIIIojYeeezzz\K,,,退={sR*¹ .*ݻw(E\_W -UH|Uuuu«PVXk.*V6߲{Xb$K_}RaK[noR뺺~啞=4}o‰˚=H*iEsUt6v7׉}fψ=@XҊctNϞ|K1ѣHJ4W=P:ѷuuuY46V_@:H E9ށR0aeC~]EE555j#-QbmmMR8VSZUUU4]]]miiyhQ>yz[$//oݺuSNuuu200Υ=d̙=.Guj7Ú"1U]'E}>zt_a?98JN^.(T(jED%KLZ9HcĈ˗/8q\=== 7YR%O~Hk!!!{+ -[vma{IXՒÇ;СC'O̤L -DujaOiU]$Em2Ğү(r<.rLɆ {j'#F'3bKa%/_>aDgչj-w F ۿޛĨPTiAf)WRҦ.R-oQױ;DV]Stvt0%[WtTUwÔչ`)]B*--)a|//'O=sLS4{[sѣZvvvyzz^zuȐ!] d%wfM|k*Ѣ*1gii*%|]WΣGQ]2zt_jݣXNm:v縻,*={kmױKKmΕ+ԡ:)455YF\Bo߾g~yQQQ뛜ܿ:ZžFI-߳gOQ6}wI.{H@v}J)z7'LpζfKUՎ+4>{vq5߳gYvڴ|@Mմ䴴Pe-hQC"]>ݲu#G:JFCC_[Ot;QwRts o^ZZP\\ vimmA"..6;;ݞD+++ --"=788%EGFF;nݢ߼ys...ܳg8ȣGsjWMv!jnUOz{4fw?_ڲqP𫅽{?vuκ]y99=І{)}׏?9:EOvm:vܾM.I;.גqBwˑB hptJJ:[L+u@4$9\off6qM6"F+WL(((77a%+j-F:}ߚ}ł//\8Zx -:_H9jTCC}## zWzRLZh,%V\{)P{Ϛ5ҥ_Ey) dDtdW{0N2is}L_A@ZɌC._^+{ɮ&&&w;9DEE6|W!!!]m]QxyoBW_-``;Cu`ذa/ yyy]mH ;\mzm@umncc h^ᢠ6Cuh?CN%%%EOOo?3Wg̙ݺuּvڰad2ٌ3 !XF͎o/j8)*++NJ=ӦM?ycǎ666\.zgddd}}}|||pppVuu۹J!h;wNmmmbbRLJJٳ'˜!V[͍U/L4Ϩ{+)V\IǶ4s5k֠CڇѣG= oPT&>|ؽ{Ǐ CXU|򉙙Y~^Q# ͛Bbgg?H9TRRBQVᑗ'L<ÏG_~ʔ)u+VP(ϟWm ?M4~p.w7|pF'S4h)mp+RC }:Pm\|ޫ{j -))ETN<ٳ3f{]]Ǐ͟g♯wΜ9nJNN3}1MHCCÏ>޽{NQ !/)Z) *//g?]Xx)hqӴ-w%(0 -5}PݻwsqjS -e:rTs P{ΐ7nl޼繮cn BQv'l>oqqq9CFMmbB==7DEE׮]gꫭ<,X_~&&&-jZ;zdKp`TStccR4@{DAOZ$tuuLMM\n۫郕QvїTkFDDXBtOѯIMv^JQ WPPdJ)+4FY5gggʍTS XTt]InTښÜ9s$nځ߿ rssi;Et;vxjfJ.>p"\\\Wt/ww>r#t﮿;}hp)B矪5?K????&i"66?!UUU;vkj&''O:QXP(3]jTtJ믷sOII)))y7hrW*:gm^ch4E_|N!MJMOJm/M?[[lᏀv(b\RpZ:/E?)SGoR^\&1jvYbwk׮իW#XyW NQO`v]uLMMoy{{S0aۅn-(Osss^h"333*Ւ^Rm' AAAIk.\(;E/2$$DS'` 0G}z޽q>|cDŽpajTٚZ5j iJozRx5:7"_Tsځ?AC"Mt;n~n{VV^^q7@o]sԢcNws}.7D-믿r_V5a ctwﶷWOT )Ə92;tĉ_\UVVr7P6mڃ|tttՆ.Q 6&[2r׿ܮ]&HӻSmmmbb"zMYZ⪫;V\2""&vܹf-RԳgO1!8-M)]5_Znĉ)))߈>z(??SLa/v'|bff֯_?et.B}bgg?H\>RRR2i$ZC0mځwòi+VP(ϟWsᯄҀ:::~¹Çgt2 4Ԕd?O}C,ɨ\.W;L6eCe˖+Hzx=zа2I5uFǿGe \٬^q7@Qi{!/C.{ߌɗ0… BD~p֭> -MFUVM>Q^{w`R9ygrg̘AouuuǏ?~6 cƌ鹎ќ9snݺg$M)رc?up礝>wiBBBh vVt -'O#f=5;vC.]cen_xqUU_xqQ#Ϝ9cmm;F~(z1Hp`^۸qcMMMTTظgLǏ͛}||]Vl)R⦍ܹCoߦFlLwށNȫMє+!wA5 //vHѵ\- -};v>fW|󍋋6 2jv`,X_~&&&-jVdKp`^rrr{.MСjl!Oߞc/S S4'SSS-?MTWW+I~~蛕5#""VX!,޽_;۷I\ѡ60S~R ))F - - -LC\YY)eEƈ;LqT3i=dΜ99mذ!77fStKFo)(q80p/ee}!Bϟ,:zݹs>U )ļ.Sۮ齔D||>>ׯm۶W#t*w>SHR3i=䭷ڲe xa8Xiii+WT=);Fmʔ)􊣷p)/.0jbeeݿСj^;Ɨ[YYumĈ—_~̓?iZ.zݺunnnN)qM0ABB~!¿qbddD?`| -PĘBkwHnD7'gG:Yp.1E/2$$DS'` 0G6mbH{͍EÇ)Qfkv&Լ4T=U4:4(drvvo*1p2x_ɫ| ;`ZCL&|Ojk <fv^tiĉܯeXn4mڴh8;;/ ]𭦣!8mMvWw1pe!>o޷o_a/2i$SD5;VWWG0 -HQ/u^r%aΝ;׬Y壣T*z0=)|.уxRէkz{{=z6>>~„ Bv'|bff֯_WrEEEH:~j.K]񬒒:rQ?Yh7NNN - -VXP(Ο?XuttosiW>|8]6h SS׫~Z:4x`LFrabԶ!({,[^AÃ; +cਝT[ntKZkѸc4=p@+(4M51p/eE0… Y_}Ւ%KǏS 9s-ymgggzRfr nPJ\iQUO(T~ez~TpV;RpӨ\._|y~+<44t˖-‹UK)եp>s_URt+9ЇmtuuKuC&en|U[)ⓩ)5>XfDDĊ+%ݻw}k}?i+:f -O^!%EӨ >4ĕRVijQQQqT3i=dΜ9?mÆ 4[:M6z#UMь7@Ák nܸqaӧO]]Y} -б@aa],--?HB~sN[f]mMww>&4mE^q4OtEUUՎ;DZSNmll* -LWDP>z m휢SRRJJJ=]9 )I.F.41"wCqyƌgh37z\K.c~ӘL0!RH*Rh(y:tN9~q}Z{>~{ذarT4޽{JUF - -;w. ˖-cgy3##_sirR%j7n 1%G%%%0&޽{SwѢEr:;p|)w2sssYRs{n???hPtؑlddľ]J|`llܾ}{=@}[P(N - - -HqCtr A7oN4 -*|24lPٞ$í(Zo(ѯFtSRRh^3f̘/TDLLLdd*#i_`;#ݛ5kw޽*ܹ>.Qk-f9NLqׯ'Sot~7deeyxxzc?TqMd'zJ=kɻFي1ޛ7o=\jr?~,$9뿆6hf$L̎egϞ͛7*nҤI;vPUwD777JOquu1c+DrF94 :NΥ8p@L -u떧mHSiiiNNN?8$$ĉUUU7nܘ'$$Pxۅ|8p WEh$sϜ9ӳgOkYuɶ>2448|pڵTS -$10~k׮ Pޅx㔗oY!ݼy~ Z5wɓ'P _Ms۷ .\He˖ahBB@or/YEEEOhtFWHQnn)Shz~Ie R &:;;߿_M{FrJ֭ -ܹs%|%w߾}{6m( nb7--/zMHHpF< DZ[j%qPd4U)7 &LsUUU.]藆.ˋNt&> Eo~~>;VF6mZ^=wwSN1rзo.Y4 ;k, -6mZ9{,SNU\YYI}_iC$R hСoNNN5*w^%d_x9{3L^$/_%w'1pȑ -R)B&NrJﲑ?3cME<~4;Ɇ7|#q q!u'Ou̙֭[4 ҍ˖-#6lH殇u!˯'Sܻw6޽kaaTew㏭ZJMMUk:4r 9T}UHwDH*J4625^f3}Ϟ=$/#e]Vk-dիWGݲe+-R;YmK %pܛ=RRR/tuu-,,|NRRp 3e^P}p(S]U4'%4䖗zN@A666씱SLXZZm&|$- M^e\\ZZ*'#U>⮪yxxű*e]ZСCնl׮](&HU4c8tC${ a 6nXfӅQ/^tss۸q#?~x9WZY&;^t)3gׯH dѣG+WZ}>,,ʓ}іjAE;88 6L~ݻs_4rPPܹsil2vF 7322U>'&'e]Zȸq/^πSq$Ο?_RR| S8Moݻ78~-Z$s)?MUJ8!u ###P4p/_6V:{{{⍎;;wN4Iز100g9m]tTTB:)(( +Ctr,͛Ӷ9˗/3ܷDr60ɶTk*:%%5cƌ4HUF&g7hЀ{@͚5w^avIRҫMYR^^st;X."iwxMVV1@C%W"4 %zoƍU9w^uٳ\`ii)Ÿ}>| rJ)@ k_eՔ*4X?]lhhq7U``Z3Wkw\K6}EEŇ~(R=z8v6,++[b5ƈXXjՌ3@:S^ٳg&Mѣ!!!vPPjk'ʝ(**ڵݻw߹III56=M =q ?6;eʔ'O .jٲ nݺ~dD9PtC000RvЁpIvvvV -ܹs՞h;wn={FK7hЀvssy e'OXZZrz0`/>2j'̝ixxxM7IK`jr -___\Һuk%3}mڴ133dNNN½DWUo M4d...#$$$רjS[S888޽QxM%Vp\-8:=t۷o''':,YBqΜ9\`߾}g͚EӦM߿?#PDRN.O>ݷop:}7՞D{ysPC:~&jH8-X>8o殲T9< m߻w6޽kaa{Lp"H( -|Q^^R^R@Ӎ]4R\^Bh ONNMRRR_·Rq2))Iӧ|*“r<;wi-wU-DRE}}}sss.RZZ*'#_^E|r8U6CUk=FDGG_v*ZӺ%=zH,,p\M;ԢaÆUK.̙3Fbb"m0(y #E!{;w.eh"mVtTq0pʔ)܉o͚5ӧOF]xmƍ|zrT֫wWZ̝˗5CyB$U4޽{JU. - -"tcٲe$wxyFFF&MD\e&)͸q/^,vXqqqVV'|bhh{n8S*ƍs'NH333999ҲeK8*͛_Նvqq1e 3g`v-SE/:ѣG-lffP(V^}ƍⴴQF*ZU=vܜije.] -G:P@E T4u[E+!xZC/_z'藶aq#!!v*ZѢ Pۨٯ>zG}diiiaa1hРj-}Q\z=Qf֬YSA2cǺԯ_wڵ>*V)7m$ʗ.] -Vwޗ/_VR[[[wܙ{_FFc;x tڵ333ٳÇW\ml>} 42dȵkԚ%..o6m -]5Q&v\~~~fwر9Pђ8;;!hUQ۷oϊݻPzڵ!""I&F - +++oݺEB:,dYY%P˩t&ncUn2wIKK)wuttܲeˣאzqrr}qyxxdRRY;v444Sx]X-[9x)R_TA9gǒHAu? ]\\ܹ(ӧ?/^l«5Nr6&&_jzA{ޥK 6h/oC)4!z*q%9t_@~駷T72J'2 &q֮믆 *_++'N誐]Q'giiYՐvwwxQQQ5!H$^fvcϧ,T;h HFցf5jiDE}*MMD?剎NMMkP;ܿʔ)洑gllj{pppFFF0s7n̬cǎ>fjjjbb:cƌǏk4`3f߾}Bے#p<7o=eFjҤ gݢzWrrrPPB ׯtG}ękȐ!djrkFT ^]Sj52Q-;v,7'''44zi0 ZJWzzzVhroh X??L9w… u&B>3ғն.\mMG3vٱ4k{0sF3v>p@-#,*SoRm)Lyʕ-ZϗDxMFBjVZ}EEEϟ?'q%Z%ʢtBBwi֭D)ٳ:gHB;;;:u= >>ψ4CxxF0F'Ջ圩CBBN8QUUŅܺuN۶mP!ҜkR^*++EDDdm׮݁SQY?X'O - -\...ԏ$._LKn;77COnE&&uȑӧOkilhhH&kǎ7<}o(*Z$hU>9B}q2pU޽{iЖSqv,ٟZ0FsssUnٲeZVGXx@FT|cbbhxbnmۖ|L>V [Z:ܹs>|8cڵ#GT5L޽ѦA4txxx2wUVV -CƏ/z9)){R^w1660I>DΝ;gggG'tiګhecW*ZիG-_2ɓ'mi^#vڥMNShBKy/_~W\=>b_MpTtqq|`W۾}{B% Te=k,)ը[D#kdR-Ѽ:2۰BjZu!5 -Z)??_={B/T S%%%M4DEEӇbʈehQʴrB}(/:1B^LxͤI$̴TƮ&T(PSsQԭsմ&?~wmΝ#%%FBssѺb9*Z[UU@4= yAtVS;P4 <슳c:Dc)***.\0sL*3aBmu iˑH{\Sjٳgi"@28>>~>>>ׯ_':#hFa@AT4e0###Qb"jaJ89k׮۷o?rHfffQQ4UѥtqM6ϒQTZE$mb.SEN3fpwwסf 4-ůP0UC*N4Ѩk3{ j󵶶~hW...ڬم5S999m۶zeT\m,AqN4СCttj% iˑH{\SjoǎEwQ.\إK N.Se"hjFb^]M6U5Lݼy4Ny9*z̘1} 2* t[C*ZhjjZk*]wPEic#G.^X2êzXM芊 -Q:&T~~~'tW+VJEرc4ʬ8;V~2fͺqF5lDǫgRm51100d:k K$$${*6D\\܈#TK,6m/ׅo.,h:ԯ_?o>}D7EY(Ώ·0VW*:<<\\Rfff۶mQ6*]wPELPUFSs۸<B\)!IwkRSS;wmذaY|̙#z#**J>{GǶmӔrtO޽{7&&(Ws۷B|}uEx%àʕ+OYbEqq1Y0mbuӳgϽ{;)뢕+fWT4U6lt/ m5uT:q_]_ڦӧi<35j~!LJ#eA]Ç4*FՊ -j7n!EMюrvhZTTXVV MASN\oOתхehnڥ2BmשSQroc o$b164Yf;&|G|C튑>-~~~fff -?>~8z^2DSc>ĄFdd9 &Fh?~kP/\Py*7rgDˤI$T` ,>V+:(!C#+VkwMEZ N"E4U,((\$bqlT kذ!}$-YUKtkk={VeTfƍ#P"da좑 Mkvz ٟD_j/2U΋]qv͛3Ff UPۖ\m n7UZTkँ;w\^=j4/NII,nݚq!  MUE+lHĉٌ3#ɓ' rBBS;wTVV\800~ɚ5k[Aߘ5k8#&&&44BPxaa޼y۶m;Aeeilmm HHY7߸S9s/^C=^Mho_٣FIBF]t)88X޽{_|vbqqqy~Z]SѿK۶m8Qݻwl56mrrrj:୐ܵ{ oDE)ܹ뫬9ϟ*b:͛G411GդISSSݻw={6o<4iҎ;^1K>/322\_}3B111b䄆6nb„ r/|8v"k\re٢PsۉnnntJ:cƌǏ;|pppg=)Si#//XUٝ;wnС33; -yݕK ((HPPWPPO?}G\ BVDGGoݺUUl.].\ !t֭c%&&*tCBBN8QUUŅܺus۶m<qZZO?tڵUYYq:pQݻw?vd]|K;ԡO>Yf Kǡ,H:{UURתU/ҦMTTّ۳gOII ISN{С2WDDIv8p :uرcU-~~~ԩSƯZ[[֮S6665+i6atUDEIV2~xRV$Rܶ$nj [nˋ/H)X8TcNsΝ}:m1ى{P:Ν; !*ǭjiԨ̙3/\PQQc-Z8|0+ʗ퀚|0*tE!+ :u4o޼]v]tI$={#.++kҤɿ*ܶ]qqqT4ըr۷o7nܘpBiӦ¢DEEԔ]|Ν]vݾ}#G233h$-'i*~UMLْivB#Vԯ_}1Q涭!hUF 1#Usmkk+:+k׮ƶiӆ49 2%EњSI0--m۶A?4-#;*_A[mnn.|qک~6l %ky=644Th$_CBB'bfdɒiӦʮFEkh9sŋ!vbu]U+V(..*,,ܱcVHUVV޹s {Y:?z())?ԉ_rpvHll g_|۷8nݢ6*:336>>{iƶm첳'N---ށHj~88HYo„ "ue%]Smv_>x`E޽/^(LډFE+HzB^^^@@oÛs;w,)) LJJYmM6e|\4111 -Mtq -endstream -endobj -1646 0 obj << -/Type /XObject -/Subtype /Image -/Width 962 -/Height 942 -/BitsPerComponent 8 -/ColorSpace /DeviceGray -/Length 1781 -/Filter /FlateDecode ->> -stream -x! & ֿ֗ -endstream -endobj -1639 0 obj -<> -endobj -1640 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [246.092 211.758 260.209 223.758] -/A << /S /GoTo /D (figure.3.1) >> ->> endobj -1644 0 obj << -/D [1642 0 R /XYZ 98.895 747.976 null] ->> endobj -378 0 obj << -/D [1642 0 R /XYZ 99.895 523.789 null] ->> endobj -1645 0 obj << -/D [1642 0 R /XYZ 251.502 260.891 null] ->> endobj -1641 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R /F35 1275 0 R >> -/XObject << /Im4 1638 0 R >> -/ProcSet [ /PDF /Text /ImageC ] ->> endobj -1651 0 obj << -/Length 1846 -/Filter /FlateDecode ->> -stream -xڵXo6~_ᧁbF$%J..M $^ѡ٦cYRdQR#~Nޝ0?xd&gV|=Qq(0$&!W„o/ޚX3MNSX\}3 : -464w0Z< yrb^eڪh[mݓqJe v>ްSم4x*/q[^h \Vd*]ȱ_#c ir0*Snu={̠FQSSZdI:K`xYgݺ-};@~&KG',qi| Fۅ&wV4)a> endobj -1647 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [271.781 546.686 293.23 558.462] -/A << /S /GoTo /D (subsection.3.2.5) >> ->> endobj -1648 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [390.525 362.468 411.985 374.542] -/A << /S /GoTo /D (subsection.5.2.1) >> ->> endobj -1652 0 obj << -/D [1650 0 R /XYZ 149.705 747.976 null] ->> endobj -382 0 obj << -/D [1650 0 R /XYZ 150.705 717.021 null] ->> endobj -386 0 obj << -/D [1650 0 R /XYZ 150.705 643.367 null] ->> endobj -1649 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F37 1316 0 R /F14 613 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1655 0 obj << -/Length 1450 -/Filter /FlateDecode ->> -stream -xڕWɒ6+t,,\s!OVRIUDBP"Jߧ PS_ B,~y%իtPgJ͢,yQL\Ū^n>13D~'ބE.W,T2Qlt6;'/y,0 1mt -"tVDfogmmkLXO*; gy +Ri[slzq2<;mwh̢+hLS2~gH,,g%hCdΚ7H H)Y`&W)tk\ֳizl:cZ\iÝy<;2-P?ySI&\'3'\"7E#6Q*nj"D3s^(v$n6Q"Ɲ-#% - r{H別[QWQS*<ŅB* -ٿ? TrFR2{ WOZk09D^dA3dΓ$ wU pAk@dNtR)4/" \V$Ag pFܟh\lNv{Gy^L; -Ț=՘\,ٗHezGPEC%?ㄅ4l<"hhBٺ {"xC"ԄyesDi:xt8tol9. -߉ _Tc叵эo$5;5CCCix(S/h W,eڹM)P Ic\ =Wi,ϩGw,xeY腏*ЭT3[.N a>c!n /R׉a3 2`lG'p1gT)P'rC./ fa& yN*{CiDYrn1bnZ"AA@J9PL39*9+IɸʈY? g;N_%%[&rKh!`;h+e"I!1CIuizWM+ޚ~*,r6m=ak \{)4>y}Y -^ZPL+p xrs՚UW_(5W W JyS/ĨpX9` \߷FR>`F}.^GMg]\?a h=:[onH;@DQO7a'ts7mT>ԴA(|!Z~T7z&ym3)xAkPў KS;]!q=Tay1NQ' r.Prf?C -endstream -endobj -1654 0 obj << -/Type /Page -/Contents 1655 0 R -/Resources 1653 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1657 0 R ->> endobj -1656 0 obj << -/D [1654 0 R /XYZ 98.895 747.976 null] ->> endobj -390 0 obj << -/D [1654 0 R /XYZ 99.895 717.021 null] ->> endobj -394 0 obj << -/D [1654 0 R /XYZ 99.895 477.32 null] ->> endobj -398 0 obj << -/D [1654 0 R /XYZ 99.895 366.616 null] ->> endobj -402 0 obj << -/D [1654 0 R /XYZ 99.895 258.258 null] ->> endobj -1653 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F38 1315 0 R /F31 1526 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1662 0 obj << -/Length 1961 -/Filter /FlateDecode ->> -stream -xڭXYoF~C.Y./@ 8:[M}ȕD"U/%&u>q͐|[ūg볧/H$b]x!wc.b?t9ܬoO_!e^Mkg)Y}Z__^}yC\][#3nH_ZKáO_:b;nWW'bE׎ٽ3u=ΎL$1k`/"7B{PQr}aiJSΚ,QFOeI][FX/~pfHP'p*&aHO&rK*"\sήPL- D|Gl q1緩21!iC?&&`P/?h=28#=1˲eɘvrg221Iz;6nxxs./ /.=g񬏲RSl0LK׽4ו<<WjM{غ"Z ;hcJqu aK!8 BA5Ѝ)>:1hRI6(}&_7$t.o[_>8B"A,{lx;B[ WMhAs k=k\Y]e$ִ- -xv1K,EB;Hz* -B*:Iu%#R2kp™R6T' ­QXE`jׁaݹc]fK3,4Mt@F~ Ng:03iʍ$Ƿ7:Q7v$prsP_% G>;zc/*)sEK786̌2gTlɥ(dۛnx" iI+֙P 2V7t rv=SﰥM7iADL 2< R]9 F;$C<ĎՇۭrax+sŞnPbB`z85ieۍHo(Z L^z@Hi@W-TBy^$Cu68(>&<="3z hEG(؜қogQ@DCL`" # ڲY8% <|i<˖ G(/X :|0x|=~<Gȝfqn/yYp1,œPbjR?,CL>{03m0DQ.eL_5Tg<iƊ\ 4n5j 䅋!W/8QvyC:4_fbf٤eJ>bg/mCѪ8.MuMxAF}?ԛ2.ǰLg:%&a7N<pM#Xoz:$};+]0 [55e.F҃Yy?p-O}ZM3[r}7? -endstream -endobj -1661 0 obj << -/Type /Page -/Contents 1662 0 R -/Resources 1660 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1657 0 R -/Annots [ 1658 0 R 1659 0 R ] ->> endobj -1658 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [172.884 220.623 187.001 232.697] -/A << /S /GoTo /D (section.6.2) >> ->> endobj -1659 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [450.039 193.006 464.166 205.081] -/A << /S /GoTo /D (section.6.4) >> ->> endobj -1663 0 obj << -/D [1661 0 R /XYZ 149.705 747.976 null] ->> endobj -406 0 obj << -/D [1661 0 R /XYZ 150.705 679.382 null] ->> endobj -410 0 obj << -/D [1661 0 R /XYZ 150.705 408.56 null] ->> endobj -414 0 obj << -/D [1661 0 R /XYZ 150.705 303.314 null] ->> endobj -1660 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1666 0 obj << -/Length 1790 -/Filter /FlateDecode ->> -stream -xڭXmo6_aF -d]RthbN0(,ϲGʒ4˰ExO xGO.t0$*Y\ċT\(,kYoEH2ͫ@2'pV$K-Gpb S::ӡJaQL*fuǿwe٬;Z -s߾Y4~pC1O\Rrt{s6Uxv{jZ%:yܾo)g,z.*t:<R2WO`,c9)hɈ7y%:wo"0e՗.? + r*1LLnU #E-7EGo!).wˋDTE -|ȈpVkyZLX!=jSU$ |{g9@ -MDJ^%]9RJ^2d\l$! $_Rwgu 8t!|(ʂrisi%dG:Ɗgj@o(ҙ0R3Ud;;1^8}]BȘN-,K6tVH -5퍦AC1mY+wo|dUlq{A3}.#˪|74jgLAE47AW(vrU!^j9iktiW^`a% +D4 "^hYjx юU?Pa֮UL\N.vY:AS$WJXۆd&2SJ xA9I;QbƟL!3O `Bib2Ǚƙ MX88Vey::.f+proʲNq[Moq`mG!zn B,sA: hE[a6~>9UeM>il.2/Cn4}Um6%4zxnC?F@&uS"RA۴E s6/aGCo$^ -n֪&%@̱k:}ع9EڌC% 0Xuqjk!^k#fcQ¶\3 ~'@hf/Iw > endobj -1667 0 obj << -/D [1665 0 R /XYZ 98.895 747.976 null] ->> endobj -418 0 obj << -/D [1665 0 R /XYZ 99.895 611.993 null] ->> endobj -422 0 obj << -/D [1665 0 R /XYZ 99.895 440.288 null] ->> endobj -426 0 obj << -/D [1665 0 R /XYZ 99.895 319.807 null] ->> endobj -430 0 obj << -/D [1665 0 R /XYZ 99.895 258.717 null] ->> endobj -1664 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1670 0 obj << -/Length 2672 -/Filter /FlateDecode ->> -stream -xڝYێܸ}WCHCR `{YzanC#i<|}X$Ei8"/-,u=WwWo^]`E*ӫJ$e<ʢqXW 8ׯܥ,R&(W?y!ɘ1 wI?ܼ{f_}sY=Z;t'3ac7<(ϡAC/80 [|;ҋ6Z̕^,瑑0}&Nv%U<ƾ/Os,Yy,$,O2vdBosM?^Vg֗ձWux"?ISkq%>NL9eA{bi&9xn~h&%`,(>64ui*ņ!l $!Y.Sv'm}Qh`v+*XVXE̩qtOJ\S•cz3J.LT.lt;\zh&-sw8XgQ6(jUt6'U[ri@=HSF:E܍ۓjGG3bS 0(SE:PI]WH跐Ʈ:>"dڐsI^ͤHE痌z`l{ ɜQH8xiLHz4M RpZyb2f}GIׇudO\8ac(IʘKX\NPX1YpX5r-@TqO0Ns[ãn>_ -| b1gi,rYXAG!6vSR4J5| C)"(&F1D~GLfiiBa't,YrũBL zy1t2kJQ5j -L|*r*"f ^m1E$F\N --{%]VS?b-X-,ֿw#!*y}RE&m~zK,v=|S8[!œ(PcYo%x g!GʩmcJ.a|YE,E橥/FEf QbMQrXU$5zV=*f [H2;&iP};6d35ǯyρzp0x:Klw)pgqtͥb€ۊVgU7kծIUC3H{,K+#J/1aGAY99b4b 4$WRdbb59W-Rۀ#D dL'_VGf-[OM)T []i% DN cjK]I:·0A|VS -Zs0+>D4NBIJ&n=Pk&7st*quQpXjUb鐫瑶ؿC0nk"pOlSSͦo]k*8NoaVOy-.0qUQP6W\AoPx)kQ%VK>ȣ#(\9Iwm݀)rrSUɐfռ5'.c_ u2 w/iY`<Ҟ:e0}k[ϔ BO?jy%,Qfnu 1^,JYmꁈz(:AUWI,d%cA"eTuhv7u JP;dl&Ԓ8<;"тiQYsސ (u 0>58mHBLY&uSA1BV;Bs5x_:s>R8/JHyzfu\j>Ӑ1R\tWJ%_,)C4t(]'rL0RD l+W&890]7ф'B]sUPsD8(NZ&miRe;D-{?<aL -KC󡯒mPI*l#S9=ij[qGWfK -endstream -endobj -1669 0 obj << -/Type /Page -/Contents 1670 0 R -/Resources 1668 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1657 0 R ->> endobj -1671 0 obj << -/D [1669 0 R /XYZ 149.705 747.976 null] ->> endobj -434 0 obj << -/D [1669 0 R /XYZ 150.705 431.137 null] ->> endobj -438 0 obj << -/D [1669 0 R /XYZ 150.705 190.536 null] ->> endobj -1668 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F35 1275 0 R /F31 1526 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1675 0 obj << -/Length 2263 -/Filter /FlateDecode ->> -stream -xڭXmoܸ_ -T"E$%Q:)&l= w8ZW^+m Үpy!*Zx{0Oe۬(ZU~ +@/νnCA}zݞŃzUB{Wg\ڎ(l5O9#'ZRD_{fMs-Svm5-!i6=т kj>4`uVy</GN瀜 pgmxSD~CQ=FCN6 A#C 6 o,C0TVD$unY"IOXc8[ -]#z|44}m#R Ϛ}Zk˲.p J_oK}%ғ`=/T?PAL)Z0izRXrZ׶[ 8&\w8#i ̹(%K _/;)8f`\N0JsDl8}]񂨸 ;.x{u3NJ%)q[ܳh9 *U,A? $i UXMۢ{c#;7 ~AS8~ -W{ K$R{Y8m^d90:F,Bvs[Դ%}%KĸT&uA>^!Q )يViA ) 9 H⛣ 9\d*\e&iT &Pv6TZǎqoJLyG{f֞Dt3zٹʂp 'p|8,40~ -ibTcåǂ. /Y#)p%J\Fx3#< rWrMp {iv~@^ud w #d}ZKx -9zpPt-j(8t-9n<7I"PwP,X% 26D˦> W|!$(=&X_ģiMV3I4<:B `W{FŦXc ;d͕E5QK*_!lNɮ/`4Gd>?KH$ʉ pY*9!Jg؋`w,D7!]C9܃1S37ɀk2P ͧ=/v~ -9)FfX0z I؛f*޾{=ʏ8Z?<.CuEtUrhs?Q `hb )ȕHtkT" Lkg;=W*1UC)5CЎNkw@5~IH"ԑz7S iDBlB[#G`ģ T}jdصGa3GSE9`W$2~4MgЧ0})Q<Ԭ+ eC,|d0xG#E>8)DSqX]K)*gf4Z[ޝݰ_I1>] -E! -endstream -endobj -1674 0 obj << -/Type /Page -/Contents 1675 0 R -/Resources 1673 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1657 0 R -/Annots [ 1672 0 R ] ->> endobj -1672 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [172.493 393.952 193.943 406.923] -/A << /S /GoTo /D (subsection.3.2.5) >> ->> endobj -1676 0 obj << -/D [1674 0 R /XYZ 98.895 747.976 null] ->> endobj -1673 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R /F35 1275 0 R /F39 1429 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1679 0 obj << -/Length 1623 -/Filter /FlateDecode ->> -stream -xڽWo8~_F*6`QU&*݇Ӊ.*Ulߌǀz{Xa|+z{Zj٭D̃ǫ$' pjjs[ϗgQqfnn]$7Wlر NVTA4 2|!d+(vs'ITgYt-F침ViV2{RŽ$m8ex"qL>~ˮ-5 i>N7Z=W~',-_,a^w,Kf yI>ի+Ua+z$"2q&'0ފ y[wMd  y^qV?<JH^' ɞ"Q-!:U5=|CYݕ[Zt6M-` %F wJb>}nORh{PѻV)nړ'ŢfH{@BȄ!s7 af`SpVm -^<p! 0Xo^fu& -taipE2{grfg#&!~wi̥ڴS#δ$69{k%Ͳ1]j_- VޓxjIكM2-;Gڕm,N鋋xRlRiF7pS5?.#4Ǻg}0#XU5MU9y#Ah{RK [=P`G3͔,Iļj:ۡGi=֩iƺۜ"-+b.&f dI 5תJ&==:# L3FE)S5{ssjh)R/p -7XWMu27;tXw$ ㅠrp ?NWq6UM>iv*ݭ.=)0s̎a%MsG`b[4c3>fp CcCfRKVКB(s|sncJ ֒6O$-@L@21Ǯ~a|~7_H=laUNd0 #38#&vњp!'y0nܚj!e[*9 򣟀CmueW %J߬(I8MW1M'?朽/Pљ -&t(СhEba" HD#&Lؑ۳%yu<@PA'cx9-s;-sǜ@BXb1V~sbYYd̀k0KS )"ᜐJbY|U(VH$i]w1:q -sC_Cm^Vyk5Cv -~yVQE  -endstream -endobj -1678 0 obj << -/Type /Page -/Contents 1679 0 R -/Resources 1677 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1657 0 R ->> endobj -1680 0 obj << -/D [1678 0 R /XYZ 149.705 747.976 null] ->> endobj -1681 0 obj << -/D [1678 0 R /XYZ 205.938 376.433 null] ->> endobj -1682 0 obj << -/D [1678 0 R /XYZ 205.938 342.498 null] ->> endobj -1677 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F14 613 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1685 0 obj << -/Length 1510 -/Filter /FlateDecode ->> -stream -xڍWM6WD,IC4MڦMhڒw%wee3k-X$gyCFl~z%o'z27æ(x^Mr.l-7eŊUk28&7& /rMvoh9kۺ#c%7/2 &'m$`-Cp&YUX - ȇsd}PH)f}U:'"ʞ{tq9[QRTG:ҒNagg/PJ^耎w3Stdn S$l{HltS=Omyt =%:`&L0>Zjϫw5Mߗ5p[.,"I{X_1}ɾm𔌵u횻QcSڮvS>iFSޑ&1 L!yAdT()!&] ?E1ެ`wGFtF(t |W EN>i2 &'B̕~`5=:KȔ'iB'ϒpAjy0b*FK -})"(9 /K cuǸɘvo)Hoi6|EU\Zʅۃa] )^uAa%ԭ-im087Aagp#?!)T!"rI|˽lWyڇ'#*{ziiiІ%2s5WnQ>VWdf0>ftM8o}j8qz8%τs$׮HhXx|NY@I yH I`M0>9L-Tl*2ohaDXyGpA.hmp1:삳Rjs+{#Z ?qYQIfեo1P/ -/&@iLXzK /ч%8 U'8`M7K\F¿Ht}jPϙkaFF\ SlJ)dlI78ڒOɅO"g7?;0)iz a -ng{FdRnwimEA -S|m%0&Ai%zjJ/\R0( -^ȧ# bG߯Gpg$ɿQkjʙc.\csCu_3[*RPY=,"͖n=g>]> endobj -1686 0 obj << -/D [1684 0 R /XYZ 98.895 747.976 null] ->> endobj -442 0 obj << -/D [1684 0 R /XYZ 99.895 717.021 null] ->> endobj -446 0 obj << -/D [1684 0 R /XYZ 99.895 453.161 null] ->> endobj -450 0 obj << -/D [1684 0 R /XYZ 99.895 330.403 null] ->> endobj -454 0 obj << -/D [1684 0 R /XYZ 99.895 233.901 null] ->> endobj -1683 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F38 1315 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1690 0 obj << -/Length 1305 -/Filter /FlateDecode ->> -stream -xڭVn6}WCH Eh7u؋6@SVֱCr}9sff_|BEHDfC~ .ߞ^d2)cϼz}~y~E=!}2AB>,//quIy}rm<,K^g1,hIn8ez5].urD >AҪ0+4&w[%1_mIU |9/oN)| ;7)DM%8^ "e~"|;4q’4|E89Yq1FW/FgO41#p ǀcADսz_V9q'Uؕi#I_7z''*{ą[E=s8,PKes?f2f `IڷyUS!h3CF$፠s!crt.6dJGgFq0p -{K{AyDCih F>R RLtYAV&w}YUc$e2Q*ye]i!R>鉂b.G^!C6v0% ǵ򛲪Tv8 ^qc4G"qO7OAleGJY89$Z3}Bh*@8&Z`lX/ OK^QFК4qvspCρ"Wͷg"%\xo:Oؚg*!Bժи3L"`X_ u\펭8"/f7k2'|]U8Ytԧ?I3S< Qywtx%z.)E/> endobj -1691 0 obj << -/D [1689 0 R /XYZ 149.705 747.976 null] ->> endobj -458 0 obj << -/D [1689 0 R /XYZ 150.705 383.696 null] ->> endobj -462 0 obj << -/D [1689 0 R /XYZ 150.705 185.689 null] ->> endobj -1688 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F31 1526 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1694 0 obj << -/Length 2336 -/Filter /FlateDecode ->> -stream -xˎ6CPױ~,2@8X%`L>U,RԊ^EXknw?>2?E;vYYKdsWLo?^d/?xA^" ;/JA7d .,B-^$B:2xs셂f^!+/}k8~"3i -5XT:y"ag^o 2vOۃ0(RM!,zM!b -+{h08?yJ3m -ɣ\ gO,G2%Py1CLgf4#F *oni WA!Cq9jN#m;EH26(eG'@:L$I -`ny - VHEk%7̒M$]éǡm더D~6Mkcu>ąM<@-4.U=eF`o5ce -DhpFk6:ܬRIVD bFDk1=mK9? )b̧@ ,Xf8w78osok*M⸶]sM6!ȞGF[X" -9% -ozQK 3"{wKH`WBf.Ih -#@#iτk"b(䞅\$ {Pv|4?_z$Oдs(L\Y՝YcA{uC16t,g. 5BH1&*h* 1DƖWp#56sWR^nŚ*$ehF bkؔB4 -+s*Xc+v̨\.I$]W:uz%]Q ߝ2j@~%GΌ%Y 8IJz斯c9O׹Jk" KdpQuZ1lŢ"{۪Gް(CbB60f-J[S?f (cj=NLAd:]( H)XNzԠ;'X(]V83ӖnTхYNE&G3E4'Ҕ1VAš %ukmwȏE!oBw2^B]9IcwS s*$ #$䆻,2/^b(kR9[<ܨϜ `w&InCPOGU@tLymW]i.!߅vtygMBUiހ'[J l-=R`=քw/dRG(#b3 tc`w1<"oWFhe TqְYT?z -,٢[4'!b#@lJ{Vi)|jO\DV0,dw1ю`.i&Ug|Ң?ݪuIO1fNiv9 @C90[(x31櫧}}$UqNPi]dnsƁ p-#M]:oW@eێ] Cj8/vn (M񕭈gI6'm9m#&WN.tC[SDsTTqr~szZ)8 m\ {ueJõwTw^5چ(> endobj -1695 0 obj << -/D [1693 0 R /XYZ 98.895 747.976 null] ->> endobj -466 0 obj << -/D [1693 0 R /XYZ 99.895 717.021 null] ->> endobj -1696 0 obj << -/D [1693 0 R /XYZ 99.895 599.551 null] ->> endobj -1697 0 obj << -/D [1693 0 R /XYZ 99.895 576.802 null] ->> endobj -1698 0 obj << -/D [1693 0 R /XYZ 99.895 556.584 null] ->> endobj -470 0 obj << -/D [1693 0 R /XYZ 99.895 207.518 null] ->> endobj -1692 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F35 1275 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1701 0 obj << -/Length 2316 -/Filter /FlateDecode ->> -stream -xڭX۸b?")ms!s8R$y'KFhgowCRWNZ_lj8|73Looқv^Uo6RVꦐ0io~4懻{Y9eB>绿}8Y)'J/ox@M,w4z _wH։((',?\D]HT;>VeMԃ8؜uOt(u;9'{OwۍMs"-H;w$M7*O8gR$bݿ3>I)Dh<Ќ [MiQEώ[l'70qO⪛W -wetZ'VDsIswLh -48("u@TAj#$q8v}p%'Q)xX3v)o'&]3Eh<:nݲ}^SX'!P6s4N^Ҝ>n ##q4FoΑIfq1\#>s=HF`Cp{C̻X{>oEC) 2"P? *ijFn{Ϯ~'RpM~qgC0Ɛ74t/tspҊXcXϲF?y:u A]s&gx e1F8ZtZ*3 84뻻3hN nZ\sxyχ0~6{ԯ,sMft|R9`?¹Lapό2,q@k1:q4];+.O\Vj dţ8VS;PĀe3O`bb-23^(>"i0c 7Lt㫡SJCi; )5q_DbT Z/\si}KGQBL.Aȗr -Nɠ=_XQ:%+Bp*/Q>OƧNVc*et2,HC8:ڹd_BT /'|,f*4ȳZt!u D ڌ8LY@/"%fݴ>͕zW0 8!?B*ط)E LjV3]A":֏1}j$Y6ŀźatE޼`U WhTβ$& RCL^&iPX=)!z5o(+_FwIJ0wlX!c ~~t-+,oNeC VGɅndf6V12 -[(mCk:u( -5ægb7𼎭䳖WE "ʕv;Й7G¢<|XXa§`V|w >0r[|:{p%꣒CSVܩYVl_w_)87r WQH^=9PlUi|XVC |zv;#V|^>pBNnʻ i=Lwjkԑ,硁:vyF˪harrYuBr@2XÕ%=;lJ D Iu{ЃϡG]tx'>D("SQ]eXGs?5ſ?4??\y_̢{z|7 -"0ݲw6/߫}Wn!dnW&4X,ը}yoX -endstream -endobj -1700 0 obj << -/Type /Page -/Contents 1701 0 R -/Resources 1699 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1687 0 R ->> endobj -1702 0 obj << -/D [1700 0 R /XYZ 149.705 747.976 null] ->> endobj -474 0 obj << -/D [1700 0 R /XYZ 150.705 386.723 null] ->> endobj -478 0 obj << -/D [1700 0 R /XYZ 150.705 181.128 null] ->> endobj -1699 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1705 0 obj << -/Length 1805 -/Filter /FlateDecode ->> -stream -xڥko6{? (D(i3tkX(dNɒgJy`eGI.#yo.gՓ/OD>+"jVA^$L$AE5Ȓ@?yQ /bo߾xνO{F8qB #ΓЊɌH}G;y֋8Q%Rz)r}r\Oa-Si򢔵Z PHi\TZ<3v% zrǽFK]^⃕@\uP|w,09ډSvo^zGLEvuh(@1Zڵe1RVwry0-54,Tm -Ⱥ9t/sr%2Օ&ԒZ+Ki,lӒQQщkv_<ϏSO}>I{Qd2,8#–ejL}$V0Ԋ/Y&PHKuP$T ;QOQ[7 CRHڌ#a\`OA]j$(A8/Qb7-l-!).Ӊx. fgx 1 -;}--ۭvI:`HcN -endstream -endobj -1704 0 obj << -/Type /Page -/Contents 1705 0 R -/Resources 1703 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1687 0 R ->> endobj -1706 0 obj << -/D [1704 0 R /XYZ 98.895 747.976 null] ->> endobj -482 0 obj << -/D [1704 0 R /XYZ 99.895 717.021 null] ->> endobj -486 0 obj << -/D [1704 0 R /XYZ 99.895 266.246 null] ->> endobj -1703 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F35 1275 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1709 0 obj << -/Length 2369 -/Filter /FlateDecode ->> -stream -xڵY[ܶ~H@۱-;A4ivkP=7]G[#}|3uhu{e=hW@ yݱ 'ꩬ*nMg nܽ&pJqSU*_zI#v3LQo;.?zu΍St+l R  -9f ]`?3w\h5E/~ ~)>Tr=wSY˵3M>?1Ox;Mp!>l($7|kyJq"V05ާe C38bly|}->,1O§;I;=)s:z!g[?dYx&anɥHu$^zo,*8̶3Tks0JXhhOAي8 p: v1J ƘK.;F&L6 9ګU- ´ٛ=6?>U?jI\;@CjzA=ns)\)3 E$W.b$[Gda˃V/G 7Njn`h+,@'?kt0y&M%,f1uy 3VÙ$@0*E@9^_9 ;|w -Lώ4lC1@\'AbЪԑA pQ,4 -mQAC5 `|5TV{ gƃuCL/QJDӍ7u%II2W]L->~LQG2)e1r^)7O#mȃTS8OG+`ݱ^K_C2DXF@ps8DG];ivv˜ -䅄U/KCu߉SuS J<6`lW֟PF2b}Mc/0V:k(Y؜o*]Ñxy*~='|z r> endobj -1710 0 obj << -/D [1708 0 R /XYZ 149.705 747.976 null] ->> endobj -490 0 obj << -/D [1708 0 R /XYZ 150.705 468.345 null] ->> endobj -1707 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1715 0 obj << -/Length 1781 -/Filter /FlateDecode ->> -stream -xXmoF _v"Ek H_e v i(پUYJ ->`, Q >FwX+Qkq`r'א}n5E$[H4/p:<" @le-ZzhR{ Ob,:7Ī0)P6HkCx}$N 容äyߍ^U:S`ZqeJYi&P}P _tN JsiR4<h$VN'㡍nҟD9NU?oR<4$ Vfɭ:;l:X/粪B\xL'!D'.Y檗?0?\_*5g-^eWov Z<6a(s+ -ꏚD,.K;o]>#ROF~nZoFK"*ƞNi2]_\]%;v!KVǮK㏯@ox~UYj̣1IkԲnՁ y܉}ѧ]7i yD5{4 :2GXf[,;֞'FS=x@P7FrYe7 -Յ8v -Q~T ](T_PU_ F<5z B ws:|.k5g^4¢zϿtNXgSUZ -O@83'bsM#K|P#"ʋmb*J2 ߮ 薙 [f( ghо0O˾x"!gluzǛ$+ߋif!-Sm=8rȇc.Ik,O >$SLĝ ^5|頦97g5PSÂg NwiM X*Rx9Oz:- FbCDݘ&`E LCtZK*Xvհ~o(.hY;`|yAxb4sN"#7jZ,U[T:$аD̰NB,(l[^0]TNCB,ӎg0h:aM݀v(Hu`, \L X`hIUJa{x^Z6 -Zқ[PR>{I &-`DM];yic#X~Zvv7fh -endstream -endobj -1714 0 obj << -/Type /Page -/Contents 1715 0 R -/Resources 1713 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1717 0 R -/Annots [ 1711 0 R 1712 0 R ] ->> endobj -1711 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.751 593.079 176.868 605.153] -/A << /S /GoTo /D (section.6.3) >> ->> endobj -1712 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [179.994 593.079 201.443 605.153] -/A << /S /GoTo /D (subsection.5.3.5) >> ->> endobj -1716 0 obj << -/D [1714 0 R /XYZ 98.895 747.976 null] ->> endobj -1713 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1721 0 obj << -/Length 2065 -/Filter /FlateDecode ->> -stream -xX[~?B,zb -8HGA$A#")dO}gvfyh>pv.\vi#7<|x^OcoMHIBK_Dyp7LS?R -X߾qU:܉߽#=%>| xDXI䤭;jX ?PZ|T4^iF?wWc}p8ZB?J%^9z*ΉD 'dhO}Mx{2YALVַdt*4<7JWz~&d=a+n>,z@J)ޠN}祢9g]$۪i >z!ѕMb,4qUiEia9 /#m㺠Of*`)U"ri(Z9ze@"ٝ H3cRMxZFJ*aFm[8;z"wD2/H@q0%(krx|[Ur!&CDY`1iɧo$,/l"lMbE߽0M՟M؁Nz!o.+5x9G [>G#hqhȺN~tAR1O!{0y}w⿩9G<kf,1žґLc ((t䭆.$[RߥB+4P4Ǒr+v3Z 4%~Ep"d4Ѷe*qP|*H"1h gGLYMU5^/uoEeWM~t~jMGjQdidgˊQq/Qq)3Eqf0x8)f/(5̙(@FR0gJ&TJ=֭Yh -Ȃډ ;xDq3iNG/KdcQ` J- CZpB `PIAp삣%E\vd}-il-h!8n81{c-+˟1Ew [[P7{SXdy--czkOu%H強 !\w9e'偣eLZwPxDGͨ+_9"А&e]DJQ4m[Z̅m84$zЂ=eBY")L`t0k9})ȹYV B[,T ~ȅkGl PlՋ[mE1F& J:c"AS_]{dhm.kl 6`ipQ.+Pg'O}T+|w~V[i0tt͚x8]e%eѨcB@4&ûmD1kQc#(j'#M@E7 + 'wz [e†նi@F;`h =.!`IޜUO{ } QA -bb 1>r$1كMer.06{ Aૄ\2oD`CVH ǫK -:c4a6ԓoc|* -\/ܓpwۿ/ 5[ +pP.C-+ +M2`YIİK_橱 JkuMI۾k@[FhDhңx} a!,0bbyAivHv>ޱBlզf|V9Y<,nHp/(YOl6HQD`ޮB;N/.JgQ8iqqFFF-p>(Y -7ӥ -:-++Jsh" -)gx)LS;|pvuG[>p\64K,H;~l&g0-KΟi$w-}ˇT!i/3 _YFT\= oOãǘo/17oCI_J _S -endstream -endobj -1720 0 obj << -/Type /Page -/Contents 1721 0 R -/Resources 1719 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1717 0 R -/Annots [ 1718 0 R ] ->> endobj -1718 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [338.221 145.447 352.338 157.521] -/A << /S /GoTo /D (section.6.3) >> ->> endobj -1722 0 obj << -/D [1720 0 R /XYZ 149.705 747.976 null] ->> endobj -494 0 obj << -/D [1720 0 R /XYZ 150.705 667.059 null] ->> endobj -498 0 obj << -/D [1720 0 R /XYZ 150.705 250.777 null] ->> endobj -1719 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1726 0 obj << -/Length 1720 -/Filter /FlateDecode ->> -stream -xXQo6 ~ϯ8 {ڑ%>a@6ņb -Kٗ~(;Z,E)|u⫗gϮ/zGy*v:WLxuU2(\/_ Bpv 2 ~P#e*MDwο`C-XG9CQbm`5MuiY1m`_"!c mpu[up8Vqnus2vkx„X0$@}]MWmC-> ℵDw>{;S׮i{'_3<&3(W΀I6@ fFz En@rvD#o u.t? "~3Dk'xZ!T4BO4.63u)ʅE2dMK/ΗYʜۊpFM`<u[8a7%ӽ=!k<@Ί:{f;J +p@F ۦ)8('JT̪DڹDw|oѦ"n5. e'P68<$hTBaIej} 14*=珊Ac%\*c ;^ͳFuO WOүOۄCYu2'$tEM&2fܠq~3@-sQ4[#bwndSM楰[Ē4Uc N&`q=❱3vi - ͊o^Z482buqngBGGH(MA ߥWI(UA)/d(q6[29@n1Tm؏nA 8|e]7;Uw.4|:/E"PNu:#F9,¼ݒP=܇dm.%uW 1[LA+h&3]ݒ-=.X\W֨,PIe6,2BBgBg:;\S CI_ϲ*C7Cc{f9cs^p8ʪi[_zTGNQ cD.0pQĖbxK:'~"և aG]WXF@UcۂFK`Hx9]~H.?d@$k׃-n۵dppE0Mx$CY(SΎO2qhwpj-MXԑ:Xq⊂uy'*tN6 o_|*Ξ*m%U/AEw&1 6cDxl)MCNu= "/TߟwfwI1϶{8qma C(#ꨨQM݆]lǧ}b=ᱞ G^R(0de%#EOs " Pja -WܹOv96G0N D$ -?JY ?0qYe[.P@̆* -l|Zf7X䬢 - -ro@=X1YNk5 -ϬyQ169Tdq3̜$͢<W[^x542ٻR*q>u$=_!gpCMDX&<ޯ>EL }J'`0)m7ܬ`(Ck&? SkMv׋] -endstream -endobj -1725 0 obj << -/Type /Page -/Contents 1726 0 R -/Resources 1724 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1717 0 R -/Annots [ 1723 0 R ] ->> endobj -1723 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [394.981 515.81 409.098 527.885] -/A << /S /GoTo /D (section.6.3) >> ->> endobj -1727 0 obj << -/D [1725 0 R /XYZ 98.895 747.976 null] ->> endobj -502 0 obj << -/D [1725 0 R /XYZ 99.895 271.674 null] ->> endobj -1724 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R /F14 613 0 R /F35 1275 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1731 0 obj << -/Length 1101 -/Filter /FlateDecode ->> -stream -xڭVKo6W h@lS"m, -l@脨,l}Җb͡3yo˫ٍH:$gAKdYIҿn|,Y,XzNCp" e7 . ww_h( ,(aq -:C+Oтd #9TR6F&!p&YfαFva f7eEL4Q -)1^5tׂU;79_*jߠ9)C1D: ! Pӓ"̆J~̸v*pZ'2Y{D! OúQ4a̼~Ѝ^ƪ#9N,+c&SuJxbs *j*+1IOmʦ1}YJ>p`ܘ,8!L*Gw/#}Dzu45\gmMۉNc&QwJm}vet+tgK 28]T]a , bc 1!WN歬qW5»B<qVzAWNkz|s[Naq\4R7kۊ@+KsRcH`HI>NѤW^2C!R&BNrvj A`Qؠ_gr7kjA5s:L\6&_X(8vM$׭j:eOj6Ggʧ۹0Fo.+,P~t)UZfx0=OQ$&d"s9*/@ǡ8*`qSs*$p]d/1{P{%@Ѧ۷V#5ptbV5IC^n8]֍ -a<yѳ73ttBzn(__,Ӽg +8fac^Av -ȕv5 -Jw8vB5?"eaN? Dk7Ww+*|8? Qnzy/  -endstream -endobj -1730 0 obj << -/Type /Page -/Contents 1731 0 R -/Resources 1729 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1717 0 R -/Annots [ 1728 0 R ] ->> endobj -1728 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [245.708 435.74 267.158 447.516] -/A << /S /GoTo /D (subsection.5.3.5) >> ->> endobj -1732 0 obj << -/D [1730 0 R /XYZ 149.705 747.976 null] ->> endobj -506 0 obj << -/D [1730 0 R /XYZ 150.705 717.021 null] ->> endobj -1729 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1735 0 obj << -/Length 1753 -/Filter /FlateDecode ->> -stream -xڅXK6W7 -/ImHAEh[,9wCe-r1ᐜ7#G."rO/^jǣPkv]ivPdw_dO%Ь+&_ 4p+TҹX[WEe:b. 3s'J+&={!;q}GAv2D{0<3js.> ';mW@%]p8^F!Jq)EJ܁&''4F&[6{hYyϻr.'#ꚁpKez= -7Ԧ91tdk Q3)pИ@ٗa*S|dEXq9Uw21)q/q`s].shgv\ X'|iHGx0]gJ0>%ki^ vNE,o8jj)80NUFDuҺ누FL! mxq⢺tIsXс: 1:Ey3HH[PM!$:v^niad';5a8E`<f5.,ZeY(Oi<9y P,kޕ JsFh)t -{L&t ☪f60-hx6 ^q`)wDlk:w[Iu6N6p&s: ꌋKm6jh\ɱ!XBjʊC.9/{\2P[*=}R$x@~,T`C74м{ -H&mySX"`nbWxbJ@q/^lUsoś&ȩx[H% -AdhFq5YpizKq@'.csx,$)-μŵ -efV#'ֶjbs:QV,(8e}[sk vEal]uJhbq I>9wSl::`@kWsH NIO 6[iw(~G+$tw%YYjO\x&Lwa `sހbwnvv&-~ܶoawRv>UEbbI8C[#Z.8@>Fv{ -ÑdRF1j+>P:Σ!GûCU:V%-4|g=}FlV _6"Qp#Z KC_9CM\Hmt넳w=t>$ˇ72߷GI =BQ'fLb.M, -Na73brJe(ѫƣ0φY}-o{:6µ%hWY|vTO%{6P0#Yp6j -@[kX&uWW-?}; -cm(XSv3HwD/ԴE Ve0{<9?xNool~xmN2I%c_nƸ;,(4"tm~@STD (UvlK/ [`([`?LJJ lҀ9,Ա ]_ҊRgSl'v^:fq [6tAGo/h/!N[M9_vaVS$(MU_i$/L^6 -endstream -endobj -1734 0 obj << -/Type /Page -/Contents 1735 0 R -/Resources 1733 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1717 0 R ->> endobj -1736 0 obj << -/D [1734 0 R /XYZ 98.895 747.976 null] ->> endobj -510 0 obj << -/D [1734 0 R /XYZ 99.895 717.021 null] ->> endobj -514 0 obj << -/D [1734 0 R /XYZ 99.895 391.765 null] ->> endobj -518 0 obj << -/D [1734 0 R /XYZ 99.895 246.138 null] ->> endobj -1733 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F38 1315 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1739 0 obj << -/Length 2580 -/Filter /FlateDecode ->> -stream -xڭYYs8~ϯX1$A𘷌z+v(X2_HJT&{8F Vo} -UQw+_ynU,vw&?L&L]G\_uz"r|}uxSVJhm8K8k)ʆF -8KjYpE9 AR2~ 0 T;1+ģa-–eLWǎY% Xfr7h'DAbSuM@}Eld))>L>݁Rpb Hu`U?j LSz"Ͻ)I8g g(g MSM+Fp,Ï4 -ӝrQv{y(E1q6P"2:D2]c`X,#gFmk0#ʍSA=QW|Cہ=Uˌ楞 K%"XI.("H2`ȻFmC?P"&GQX!h hx4\YԛKDlgmi.YSڅdjlq2Ø޿`ْp+뫋I'/0禸&st 'h@AZB F\zp(J6CO}B{SI2Bte]R.]ԮK^wPpN,ټAD=-|@~(vב'n*'Fs[p46Fn^s&&J7>֨`˷NA1X%gb' 8Z&>! %X T3X6n)R(PXx@M)l2mJ7JCAL*mydhm.w#[OO@*EϱP<{LY;e,>ZQ9͑Dx&H 2d!}ud{ [[ "k PR)f=XRwH Nt(g/g`=KmTe>g>_(\6 ,[uo" i0ts,Zme(̷͂͢ ] - ('p05CE:ҟX۶)h.IB #_3LsRF6>qRZKNm@'4<;KYVKDx7'BQMoV#a+O'~8y-cW B7r53iSN.ϰq:&I㓯@۲c&B#9uW}ӈ$" ٶ@N9Fw &a%6f̾N؎4'ߢZ`(JQ϶YvLcz& `^^CD`aɻKѴDɪWuAj!LAH ]~ -A/w{swȀsb_\}d㗝j d]\?=mbWyaʃ1e1# ~x*H, ~.n9ěh"~'HR;{dԝYǼN -$x9Iq|CIWNȦ])iRH|FH~0*ӠW]Be~_ʣ̟С*Ժ‣Up-9T=8TXEw?dt8g쥬0Dmnʊ^T8}V<3U,NnnͿgL -endstream -endobj -1738 0 obj << -/Type /Page -/Contents 1739 0 R -/Resources 1737 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1717 0 R ->> endobj -1740 0 obj << -/D [1738 0 R /XYZ 149.705 747.976 null] ->> endobj -522 0 obj << -/D [1738 0 R /XYZ 150.705 717.021 null] ->> endobj -526 0 obj << -/D [1738 0 R /XYZ 150.705 472.886 null] ->> endobj -530 0 obj << -/D [1738 0 R /XYZ 150.705 366.119 null] ->> endobj -1737 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F37 1316 0 R /F14 613 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1744 0 obj << -/Length 2806 -/Filter /FlateDecode ->> -stream -xڍYYs8~Ye1$Cܷz+3qŪ%Q+MvfȭJy8"NsQhyNvA7+G #;ܞ 4g,[ж6?ʪ=%0><,]Ǜ$Rٲl 3[4zX2&7\5DVx3ع.A~A=uln'"0\p:9\Ao墥βm]@y;gqɑF^Xy,"op3\]Fpa֪v@$=ll8>>l'2R;j'j#H9N2ﱭΕ5K1@m*jw_W!,J@hL/N~:{M$1^ G<1ګX@VK[U)4l `0#pqwq0fBPa3dH?AlVB$9gr33ӕt*8Idt6tnpS[Rh$ΑHAFZc| -(SFIۢƦi={8*'&&W+N -Wp ͼ\ ¯ 8 ôATD?^*c:guח՛Y z4zy(=?tǁerd5oJ%w3npʋiЌT#r(ftqD>Hx`:KTfY3 SN{8Pl3EyX@`1d#-"[ -ZH@ -O!OfŰu^lƆo5BrFSJ5';lG$_A7궔gcb7Shi!26zGh^RMy,꽻& ^mEMM -o - v3,.yٙKw"Y5^M|bpj:'>6O!8Qj@Bק>&#rlboZgC`W0HWab%c?5$6E4JHaC$#5hld҅]O -,'k㱮'l]gҊT *@e&Cա-mS!n/_i|P/}o~_j2젿ع+-I@||UcL6}.$ /7>YIIdTN2IIޮU:a$gtۨDA|毂,-M`,;ΈW{m -OB,Y3i)Ca"+J_ 4QVm -<^%F'#a0XgXOKȀIKwbZLHtp(%Uj@*AJf0j q貑hٽxX2iP+D2*6O ZKO9b8v$#. NSm)mS*[ IcW,o.TcN+(&v9_9Պthegc ‚(H㷠@?`ySN9)nB> endobj -1741 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [320.807 363.601 342.256 375.676] -/A << /S /GoTo /D (subsection.5.3.5) >> ->> endobj -1745 0 obj << -/D [1743 0 R /XYZ 98.895 747.976 null] ->> endobj -534 0 obj << -/D [1743 0 R /XYZ 99.895 641.594 null] ->> endobj -538 0 obj << -/D [1743 0 R /XYZ 99.895 350.691 null] ->> endobj -542 0 obj << -/D [1743 0 R /XYZ 99.895 247.83 null] ->> endobj -1742 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F14 613 0 R /F35 1275 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1749 0 obj << -/Length 1899 -/Filter /FlateDecode ->> -stream -xڽXs6 _QH(w}pҤn]O[w9E,ɋ_?$ږ-I$ >~%gw39{lsg(O˙J',CG"&Biҏ NOszqѲ@ -XvOWWp+B8>wi(W'ˆI}Hk $42+v`708IRtgFtI|rcn ç4,7FPQ'_1+5ei9]IBVˋS.gIRy|\%fǁXJK)ORҤ(iM"iDoY7贛ȦB'w(pĦΏDM^OپM"*ϠRx<0*y*6P TbҰv q=J 枦 {M5+M)MJRD%<@tXERH&HwCjXy2B6L5j)[C >[P p>TgH1 D 81>Xx@_4v[S62aNKFKz,huZ!4Qzv{fv,n6,HVmAC$N+Wx%B݄p d,W+-BKunv3^ -:,i] {8Bٮh6@Uڄd)_pa-jS@$sߤ$!޷AVAnc@yoa;#!O)bv|rfls D3iO2:\(N.;ڴ_i/x@aU]bwA/?Z -j̀`{sؽm7x:b;BWm=FڷOJ[ tWlAWRRq?iDf`/oF=pB Ng+ E#FmG[_"+1ݤ`vv1bSaM7c5 Qz-z}['b}ӵ͙qqU츎{ҏ=Gzqm"M{M 21 -灼S1pVcXe+ưӌ -iĈi{x7q -endstream -endobj -1748 0 obj << -/Type /Page -/Contents 1749 0 R -/Resources 1747 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1746 0 R ->> endobj -1750 0 obj << -/D [1748 0 R /XYZ 149.705 747.976 null] ->> endobj -546 0 obj << -/D [1748 0 R /XYZ 150.705 697.769 null] ->> endobj -550 0 obj << -/D [1748 0 R /XYZ 150.705 404.74 null] ->> endobj -1747 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F14 613 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1753 0 obj << -/Length 1767 -/Filter /FlateDecode ->> -stream -xXKo6WV -$ -mEFh@X][Fv_Hlmړp}8y??ywMF:͗8v'q0ZOo"fb~;^98qz1s:u*0)Ps"l,#WG," z${uؓȶ܍}9h|OtſRX'Gc8Hh?bW;cObDbՒ(n ,{ty͢pV&;+j"{qqzu?or5+]RK"c,aFIů1y:pbpBiyrѯa!J`F⠣oalXp'Ut؅A ö /9/S: -VQow2j]_{zNZJ{ƽu'MH:[(zMٹ!b 燢kcCp aFG"KZ5 $n[9*l\OdWTe0BwGɚē+ʌuK5F r']01]Wu;u(2T%cȖoRUdyYVfk`D2wDk;_Z6IQpM&d|Um-z_7(l !񜉭+mP6̏}̚t# tAj0Uh9͉[ULaH6M-^$~mb9FcOGf ζpd( πeJ@j/Pbz/^%f`)4S{(Nb*/L*[Go9v=) 」Q +Qj 2Vt +Ss1%BF6vIQ]bG G c2mu5g}7z]P7A=GaؔݲǍ%5̵ _6ap`*{J}n8QfZƕ1r se.? -M+z_+iWAoh}FhTDHV$L@̎yf˯`MyCk⏼}Cӵ #A; `$İq$H ط_i`~hxHy (ӴA|_$ {Xnt׈`aFèy mVX'{#`hwX=H#ԧU5Ag I Cl0|0N{Fp;h:-ZNtwɪ釟 m]JboH TS MiPQ5}ʼ> endobj -1754 0 obj << -/D [1752 0 R /XYZ 98.895 747.976 null] ->> endobj -554 0 obj << -/D [1752 0 R /XYZ 99.895 418.922 null] ->> endobj -558 0 obj << -/D [1752 0 R /XYZ 99.895 182.546 null] ->> endobj -1751 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F35 1275 0 R /F37 1316 0 R /F14 613 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1760 0 obj << -/Length 2829 -/Filter /FlateDecode ->> -stream -xYYo~ׯGl6G<(>v؍K@CRrTuU7# 2컫p 7?\Hl Odsw* PmRf̜ͯ%"8Gyݻ6C/ w7nqEȗݸ5m%w,N~m[V;wڱ95~};PxW'Z>"zȫp^o觇q8Uޝ/l+SFms/CVt[JxV WQM< /R9% }E-/Gxp yx$>t$c6eSfoފ\ -0+|9 -d≖4} BoRQbNU#z8gYțou9b=,(Mx[g?U"QM]iHkjAzo@أE=yĻcsy 7L4]SHpEvQʮ2Mӭ!2TDQ|9R =Ne ,߂>l>]vwfѽ/}dž2:sTdq]dAg܁yգ/#lbH&D1瀴i*kH`O t 2AQMY5G]P_ОME%ޡHN1 &\P# t}[OuIm<3ՑeIR#&B4X-6uaK;Q9ȥm; %j:cpQFlّ|R\xEGWQI<zz11r6 -˶hAcZEEA<Ċ_@zE5EQ,]pn [Aset3#a> *3v#VFaA틮gڬNt澳 0"-F;Jq+ۡ]z]tTk>X+JS !]6mh=*ƭ+g 8PCoT -B3r-v3Ȏ5m3>F  jȫab5{0ҧAr7M;0Z s.%.8!ޭ큃9(A׆pOXWM$9ؽjKW;6<9)83)hG_HpwŨ-./ִ܊P tA˳}6puDJxOU%o0֥ īpszP_ -@.'j'Hp - - @Fn|_CPrc3<4E+'7:b7:e0=p|'4fF(j40kcywI :'ZǨhH/T9ʴS[y's^iN Ȳ:?9m1 fM!pffY|iUE jH-\0q DPIU߶$?*j_d!?"vy -3zħPg{䚥ӟ ~p軠}p?<$7Kj'e˕D W8,bz[zVé 2xߴ$֯7? [7wwX!Ҡ.T |ۊN N>>M;)8vk:[g#Pm4j|7G웖ϵWwB Ehs$JIrسN {Y`gıŇ o"\P3!.n@"S!kl<9RtP{8nFN͎mh} -Ul'>}Z WCd6Z-2h Ъh]RhmfBd˧~;B$@{Q{B? lKӎfH7tpHokhq(9iHQը:ν'#9EX 5n n[^@;$dK#Dl]ta3}T+j}~\W)$`("bj3,n=WsBV[PG֒85F[ȩ B`ajD֚T&lCPO[bK@9IG]*U J~hR,q`P"f s]=w<8Y_aWc< +<.#w75_9f67i4^bh۽4XQ! lmI1R ~uM զߘ*pBT)Ñlm;.J,_ow:!h!(>-; &V4J'N)Vr]Z5&uñ.g,K4aK۾Y&)໻^ -endstream -endobj -1759 0 obj << -/Type /Page -/Contents 1760 0 R -/Resources 1758 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1746 0 R -/Annots [ 1755 0 R 1756 0 R 1757 0 R ] ->> endobj -1755 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [417.793 541.052 439.242 553.126] -/A << /S /GoTo /D (subsection.5.3.3) >> ->> endobj -1756 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [168.848 308.189 190.297 320.263] -/A << /S /GoTo /D (subsection.3.2.3) >> ->> endobj -1757 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [194.418 308.189 215.867 320.263] -/A << /S /GoTo /D (subsection.3.2.5) >> ->> endobj -1761 0 obj << -/D [1759 0 R /XYZ 149.705 747.976 null] ->> endobj -562 0 obj << -/D [1759 0 R /XYZ 150.705 528.219 null] ->> endobj -1758 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R /F35 1275 0 R /F14 613 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1765 0 obj << -/Length 322 -/Filter /FlateDecode ->> -stream -xUPn0 +rt5C4G& $C)Rv6<;=?[l})B3%1JbΉifT.$5l ˦>x%*ޢ*68$Ku&PMs_B -(Ω/[OdEq ?~TS\ɐ]#X'lKݕϫMT \wٴaVU_@+()a3#T\Y#Oc[?+e <(oz -t'v!f -~zAՏ;C}hl.x\2XI#u1^<^ҏm -endstream -endobj -1764 0 obj << -/Type /Page -/Contents 1765 0 R -/Resources 1763 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1746 0 R -/Annots [ 1762 0 R ] ->> endobj -1762 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [161.739 511.377 327.601 523.377] -/Subtype/Link/A<> ->> endobj -1766 0 obj << -/D [1764 0 R /XYZ 98.895 747.976 null] ->> endobj -566 0 obj << -/D [1764 0 R /XYZ 99.895 717.021 null] ->> endobj -1763 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1769 0 obj << -/Length 124 -/Filter /FlateDecode ->> -stream -x]10 E£=4uI"ZD`$$Ć7 >6ne%@uAgVQ=/pEMt]?cJLt>ڴ_o/Ib)zRa<[;Iq= @ ~ -endstream -endobj -1768 0 obj << -/Type /Page -/Contents 1769 0 R -/Resources 1767 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1746 0 R ->> endobj -1770 0 obj << -/D [1768 0 R /XYZ 149.705 747.976 null] ->> endobj -1767 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1773 0 obj << -/Length 1866 -/Filter /FlateDecode ->> -stream -xڥˎ60(`͐DI=lh`-4=2wWX[r-y7P/n$j8ۙ}&ً7a (b"bQ>m?bӴYj>Sd,!QH* Aquiy"idVMa5yfIRVq $#2EuB{ޣG&ND*oIOtCw~"z"%jsOC]~Xn610v tA6:WdR4 'EO(ZE]BpIiM -dW:lWWpA%:6 'MMX/ Kh?.=S]~1Atw"G| :^E Jx7ƶ_2'x)p7&uv2ł u wul8eT$em<.&\`t #= ?9-!G~s4deLEw5PwLE/FQ> endobj -1774 0 obj << -/D [1772 0 R /XYZ 98.895 747.976 null] ->> endobj -570 0 obj << -/D [1772 0 R /XYZ 99.895 717.021 null] ->> endobj -574 0 obj << -/D [1772 0 R /XYZ 99.895 526.411 null] ->> endobj -1771 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R /F38 1315 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1778 0 obj << -/Length 1311 -/Filter /FlateDecode ->> -stream -xڭWo6~_a`{)Jl@%E5)?XBX,i'IPIVWZLк [h܃ -Bp}o,3z~mÑZIt1OeWfȋHJoR`P!R-|AC2ɦck{g`BEgZ#vEk¬ xծ: SaVl*~}_ a -0b,+'$( =lZG|f֌uLnIJe3D@K/gUDZ9$ "g%SSsk:}ȍE'yh7+S۱!mw({LQe7L.-׷ 8MC;&܄rj1TL3@{mWƴYgRer_?޷Ә S2\&yRXujlZ'^2A_4 9i𰠦h& -D/՝WMb1MO4tkwU_~є\L9Sl4-Ï<}pFuЃ>]\*a8|(^hw -E TNA^Pmn|PЉqz -0cb É A0iL%zQQc춞Gp[zT;/&.z=яGaB*ޮ?X$[Y>VGmz<B- - -endstream -endobj -1777 0 obj << -/Type /Page -/Contents 1778 0 R -/Resources 1776 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1775 0 R ->> endobj -1779 0 obj << -/D [1777 0 R /XYZ 149.705 747.976 null] ->> endobj -1776 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1783 0 obj << -/Length 1179 -/Filter /FlateDecode ->> -stream -x}V_s6O -BHv83M=tw`s$ͷϮvq6vW%4}vF(KQYʢ4ͬF:[;nYq@ftShF1x_p$hĈXDR6c'V"e'WRʼnJ]C=ƙJYI6+dn zvӶƽJ%N;$'MC3`-v$D:}w:D_Vy5K *%Ky]U7D,?# r-řa86/G?(Gj(N!dž{gN Dlj.Jўh%P훑8!. -1RQuXPUj)SՃ -{9c+6DRQڞ^$z?t݀ܮ@!q扆{T\~&#XzYn`ok#Ο> endobj -1780 0 obj << -/Type /XObject -/Subtype /Image -/Width 783 -/Height 444 -/BitsPerComponent 8 -/ColorSpace /DeviceRGB -/Length 147931 -/Filter/FlateDecode -/DecodeParms<> ->> -stream -x^]`UE־ vQADw7W׵+(**TJH^JBR9>^޻ܙ3NIK,'6YdQq'lsVY6e'ϴmɾq^l/;Mٚr5e{Ahg;=vWva'uT谳+-ppu{75;~HJعp(چ]#v˄}Rn.3pR_c$}#B a|xqGvlՅ[Gx歈TTmŵV//ьզr"ui3=,WkH^jsGrkҁ|{x=4\D=SGk 5vb -gByl'˯oOBI]3_]H`+^Uz٬G|&dglסڰ]C6@J7NYg`FN4dJ;FJ0<փ0'1d7Ef*eMV1e^vБYo[)*v@7f5VlNh7ѤnIKHO -.q87~n6ZYnud*\-l1[-6Ymbglhh:fBWd.O-]>Y_LqPHz;0H(C_`AMO4OlVf/,7r+}CÀ㘘րZ&3Y+<-_8"tsM&]d t4lj' z-lvڰ1A1 -l4谵lga4LiC:wqƵ"S)l qW}fa 67bQzN3M Et ]tX %P|dQљl2cFK,Wv=idSBDc47a'mftђe -i$PR,.L,+ܠ%xdUbS8@*ӓ!+LA"$} H+r%Bk؅ ]1LeDEQoIɑP{*.(LYN6[iWT>RMf҄FV&!kp@W - |åW+TA@ח -=&40{4R9z,)&2&ZZ|%hJH96`1h {k8a 4p-wD' )83n?ԂUoO]gbv}#7O8!2d@KcP-*="&9MQ3"A;_~1{V{6Ȇ£kjׂbM}Oc>>QE<=WyF;HW3N ?AM3C"S?puq\k| *1qǥj5֪W Kolmmq d\TtqX缽y%/m7>o "<1]a&\p}E)2hw؝ n=@x"kF^vd.0iL@h5 751q<U-Kw7+@WVx,-mQ%'j'n<_3 j74NUUA>RH?tc*19wt/)=~EfUm`)(o܁pkl,! \ @EUւ_=2+؎"d ~Z1HRZz6&8yInU@;VC+DT4QqD -g΁ ́PBkq@.A*e_M*9]k9h4 6tst0jqK> @ `$7X-[ `IM%XjdsiytL[M]w^WrW"kgN4&U~b@Ks9h@K,X$CKh~ă,R:83ǓBXM6Al[_?q_?Ҡ;J[ N]G[GܷGB]PgF4e7 :hSq= -)W㆕W|dt~-u(#-f($3?k|QY܊1Dіd9u_?m>nQ~~}40T%d{50(vƒؐ#H#ay`VGe?BhmB&aіM˧CYuT )hϦ{6I}Dnh\T:e0@7I:GrUr@T漿?5,7R~w~ZIqlܘYp4vڂq`)p[cE_Yڟ~{244>ɴ59- hr!y#8*@Ա47,lHn)Xbxtx@3AAkaڂUeB   c&u[C?44i+~15@fi ΢yLJk\H} VW?mvLEh=?8qp18A吗gT8qpcvfG:|nXp(6"%L )sۗeظ)%у1U$۫"_9oBn8#\ASIѸX9+=woʎٯaZ>+w9&7<}?HF'c8٘:-dskRO??nړ'Q34h1#5ɆF#I)g&(FRH3cK%:$ݠ+b LB6P@7D@s 2x.}Nv/wsSc+.,L@1)hQRU8F݊%$|1E+NmٿyB#-JS3WhF -n#' xH@v2!n܇t9= -11p.X=hYٱju?} ׇ [o}6ObBЀWՖٺc cyi/\>}ڡ$V|= ڜ=)?J:0/.3^  -ivÂh| )$C h MvfYYÀpƀGa'sGR? H'~e86fН?CF_#\# -: ;>̋eeN5m{OEP #bG t*Dw@'(P<|9-!3{DSʔ n&8I!A~C^߻'Nilh6V-O - rä i{oU{մkq'$(Ph -. {jU9N  &xQ#4 `tǝ4i AbA - nI'6?JG<~1}+kݍ(1`QW I R #nTkuO?}(Ͻpy6ƒpi#G^SGţ -Bk -)@K~h߀5|bHyS_{&0(LN &+fV?Lv#ɨ.%^GtB}/W RN:T؈ж6Ճ=[ )ڐ}U_ i5g01W.øA`oͻ{D9y -;W7_miiR٤̋G8$@SU }ocGFg~+rƩl-?}@8 xNgF<|}\ X7QS ~ ~r6vCGYY$ބaPewRׂj(3tC%XXc|wAi5g5L{KwfwBiL^Օm -?d@|i-2Am&%,)`WΖғ=>\tâXI" LţP!%5! -! FlV[qnƗɮ|~&06ߙ`_Lpƨ+4Qݘ_=ٽ>oJ:y14}=٦B*ø)H>nqām7Q->ӟEPʨܔF*X#-PF}4j%@T7G܄@A.X)@R+:'P=w/4z荓-o&PUBA@:+2fZ[-u{ m);\O &/N[Ho7T7Uԗ{fя"fi$ vƀ'dh1i`0b&ÛUt$Ɩݵl)T:F8/oF˾R bz/o=b8 Reh)xi\K.|m[u@ 91[ 5tPprg*#g2-g^z&~'&KAK"nta lGv w -~S@md7Qyx8b]@Kۡ/~-]n>%gQC[&*~i/3y(Vz W:C;wÿK|8PULl_؞̜k)s:o -j}|v lںLZXd$?&+!!InK<G_3?\4>!3:11ApyT9sQ6U~c`AM(i⣷.-ܜZ-XD*۰qqzTshp0nlB&+Y ='W!/vBo ,h+F/65 +b]6~: 8E\D44b *eS"'c A%[zX-r^cpϏ+5JOD(ѐ;ۀ1ѐ}'ogida+l/ |.@46( ?n0V.~t ӧ-Rg[˜Zr?06@ ->q^}Vd]Љrա/? #)cWݤהiZ" z`S{ 9/PD/BT=Oo'_ tygCx [Դql 7O och`c/mL(Җ - M*yVs - -&F\٭&mm{;Tr ÿw4A_O")UFi¥_*CɡA#Ps.ꨓrF1),Z-`S1Gp? O${ -ΊrsG[jn9%n"~]'fr,GY{@KU=d,i^0&&<ΑaL~cߞfw[lm33;?|eբC7us{BHCnNW&1,hGNS,Eh}`F!yce2s o>p9Y=BX|V_-$݋F~V,Ftpa3ZRO^@܀b>4'+r~ F@E,z c+3r!-uEJtK -UP4ZlZBv5VMUu׆( - 6sޤi>}Uju-\ 4qAS^òZeuڣW1[.` -Y6Cp/0< /3?܆|?(CvR^$ -DF1q( -ԂQ幙pN< F) w5YW,e:%/ٿecCBljQcZce3ZRwlq\Ǝb)/$P?tWb02i>a!\uh?JVaà??wiC\_Ш %D-"ׄ -rC\(&FřDH>)Y rB -i圄\hamJN׾E `{ -|܌chI? $W@ˋg$nI'2~RppRjn*.qBKX񧂜;F6Ch+2ʗ]s\)+;tUr9% v` Hh-ZLɇg-T<0Caߝߞ=Dwv?V7NWk&QPvSwR(Yn;0Ṕ#g'J6F?8ٽiP}bI""UCbD銋t"}#%R@:)`|)|Se{-Ŏ @{4 郥Q>*h&_UZP`b9r[8 !X\srK7 ƺU~c>ɼ.@xzqO?#g+lkFBm 3?!sE%5DYi+>=6V* Y+E5ӏBi] +R$dвjb?Dum&͹} 7tR|V0Rؠ("XEb'޽ L7.Gm6Ct-XVhʌ -L3 f#/bM`[ ?sZ pn1y\:P~==|JdE΢XI…nnn~55\t& .5P*p,wn喽82y`JVEuVH)ޡymDg^l+3֟=tzҌ+L M/_8)>`F}@OHGKàZy#kv*o3*OxJ/~7VO*?a#!>،"QCȶdv ?Ć\ɩ -*?}-CNr%-v(A2N0H B'7t_ZϩƆB$ڎrtn P!CǤ)afZըI:`mnYSh G?>d%/[JvZ_u:D6JҴr:.%!1h)90c1 I*˻vlЍQp.*IJ g Ǜo}ӱc6|=>D;y mpvhjO[QiB$`"Aejkkj]8fe Z3P$RhTp6{2Bv0+,irLAmw0J+I~y%z#%) (#*(a{ @ -p-\*(aWh Ǎ&lz\^ucCs}?"p~ڋ[_)\!L'Yz+zw*n$? bF`V A$,z0kĵj[!7H?&X:\ooA@)|qRm*? xhiԎj(N , ,A#n=tX<da;ST+ -؄I(X3kTG7۰<\%}C -Ex-j8Ɩ -diߵUl 5l[|%s"i"aČ[[>Jsnj/on(ϻ$e6*pGz -Ԯ 8\EWZ3zܐ`CdFdPh(ь\v2SA_짼?*IwqUUin(H4xL` ?bֿ0ʚ %n -ᖨMhQpÍ$N7î3Yrz!όPmߡ@kF4qoXRf  B6r۠5 -ENT9b9`E cF"̰Zu )1w6 zIWNC,dpQd"WХ͠ӫ810=%R|,_ -)ԷX#qBVBH Z,HndY -`= -j[9 8 S=48%\cPm  -ͦ5Y` Gl\[ -mZfHΨÉfs`T;ZXn/ n1 ڂIsD7y!F 5?@Ƣ9ڔufV˜tv0A1 &I$%H9tUz3J}r z-p '=.bnmcFb3)AD*T8l*}isv''˪4kl%PRLڂEĐe3u_P$5YA00jv"Ê"A_ZP"Ҁ+N 4P9iJAcJS -ʄ#-R{46?ǁ+Sm!Fm,t uS/[( -M:cQM: &V#a',dD (DFA3lXyGPeD(5yZNAcl a`&g%ctJ{i\DV:{|f"sى(-`*yN'3,;>n[k"ʛ-a)`%6!bp-,JxOpI1UB* *u]1AfFeYĸXVpc(|d`0 )39q1ac 3SEZxLE40}iӨMFT. 5x&g'h;ɔloX_nFt~q++9fY7f56bJƇCB4j,p5̟h֚eA/z;dl8KNAJK$рx{l2q6y7v6}:4!L$2x7[`#dZTdTB..1ܑcВl-bF庰2\0978rpH4\/>/!$ % _ We1^42=Qso&R#l3}_0 K.e40pR!;vHaɍOUnTB' F -WV\web2rt-oFiiB(8RnF/3%ϴ`~d9b' ;m §IO ܀GT/K -1ċ$?LX|ŇI%dv\ &ageFr\Cz!6D}e&@31ϻzk:7c r_n5fw)sc9]A`3]2t u(C-]%4h?Ey͘\yz)7~/1o^6A87< -qiToyv^x\`rIt"Z h7\hx1|eG٧ tˊ ԝ5gh 0o(Ӎ26{vSFhhzђKhT2ye XWTpIgh7:~.]l`Wn卖Gڔ8]hDK. --y]~UܻriBl% R|Ʈ ZanƬvݾ[1ra0Ц(Ao]4 +HRLdW|涱歄v -$\#y݄fӃk]t^/An.1k )>R(7>l5dGzFK& YtZ?f{2D&kzwRCzB:ޝt󻎧[Ag5N\] zaFB> 2&V5],nH@zlU!A<(tMȩ#o|栊eܠKK~fV1q#ND^귝>_vi7mPN{(s1ZricRV.Doa0!&`p䂈.e;\]MCl&rE;)Xe{5x`r$7Lb^3[AK!b<%R7R}'D<յ3Qqђx]hsh36,n舖(v-ed9i0{A%V*շ>\{0В'TJĺu-]rx~S\Z@K}B(R -N+"Ig&Ze2OJp+ #-/;ހyi-! c?y.@C۳2^(g#y9=߇+K>ҽι<]pTݲbW虱\3-wf<*0ZrSg}{$xU#sY P0>-+־ǰɋCK.ANk<Ν煖XFhɃlfl]C#{ٖ<ؼJ@lۡ%ԡfy"i6*uK%08:%jxŶhɝh9%O;vǓ -.n%ظ)^ن:1ΣE]yvQВkvq%S97ZBEq#@-)5h05{^كLySFBK^⏤wcOtaǐ F/t~~ВI[b׫x(qw'QIxY;n3-ͮ)R7&6\-~YN=q"-8X&E0G3shĿ-y8$ 1=@KRj_x;}ynpKBKJ֡۽w q/{h[N޽؃p=3k.g=|R׹]y6CgNȣӵ v%ϝvڃ#VtTŽ0=ޥNQz?c8)[saxa.> +:lqq9[$);ox ϥt,]GK=Z<.Z4rG$h针UTH@H% В!BBH-%.UHH@,ŝ  E!'z3W$$ $pA $:@KW@BB+.Vrb?!!o ĮBB[-]n  @-n $ $Ћ$ R/zXRZ;R܉@?@K![yh=qEBB@Ks  \ t.N)$ $phb%'hO*$ $p% 喸8$ ВBBH-%.UHH@,ŝ  E!'z3W$$ $pA $:@KW@BB+.Vrb?!!o ĮBB[-]n  @-n $ $Ћ$ R/zXRZ;R܉@?@K![yh=qEBB@Ks  \ t.N)$ $phb%'hO*$ $p% 喸8$ ВBBH-%.UHH@,ŝ  E!'z3W$$ $pA $:@KW@BB+.Vrb?!!o ĮBB[-]n  @-n $ $Ћ$ R/zXRZ;R܉@?@K![yh=qEBB@Ks  \ t.N)$ $phb%'hO*$ $p% 喸8$ ВBBH-%.UHH@,ŝ  E!'z3W$$ $pA $:@KW@BB+.Vrb?!!o ĮBB[-]n  @-n $ $Ћ$ R/zXRZ;R܉@?@K![yh=qEBB@Ks  \ t.N)$ $phb%'hO*$ $p% 喸8$ ВBBH-%.UHH@,ŝ  E!'z3W$$ $pA $:@KW@BB+.Vrb?!!o ĮBB[-]n  @]EKNlplV f%oWjkl͛_ׁ\>nsIفoOߔk8mKH@HI@  t -ql$,,띲EFÛA6[YV9@&YvS̴m?eYZdàQ€/eY1d3ۘi6-A Bfphq(p9*|CY ǶrH --)`<[q B}P-*nIHKh ,iQ8ܦ7+ohjt1d`++D,ہTf٠9/Mx3S0do`cG%!U6Ngݎkpc)uH*%oZV\a?@K[rZ" cv6jbh$a ?uf3B9ZR%ZZ ~ج -1?[i9\hpl:zŌV]"HDY #77Jp4M:pZU_:%+4Wd%xob-o,HNjP|ĻF)7)_9 tGwzK~ %Gz^*%Dv#\ ;x$YZe  }E6wohsuFjc,QUNֆ=b!F"ELmͶ&nYgd4("A% ڊB3lЛtK%# t-sJ,G>cm;V/_:5rD{o7Ã_]DF8MFf"1ATx#C٬O5%k25PNh -M%;[9Ŏ' Pߦo2@;˃bIg'NO nIВEc{W&p5;? ' ͺI0E(Wn`;9 JaZ(汩%6EClN|)wV6-kW/tSI!,%t j,Џُrfժ4 fApæ:[4*3EX*!~ -K^S1 t-1 vAaP $BP[m|/rmׇDlqC -('{:pܒ`_k@ A@uiR@+H#H?C'jC\Mk$_ Fܴ-;̻6)P --9`!ɒ}:;zGTCtt2g -ٚj -['=3~>'LT~~(NuGKH@HIU0!cݚ߽q$]7Z22`VY_>$IhI"dʮm^nmkd@ Єڴx%=-?i78Ɲ+E5  STթq^ۋQ୉`|:n mٯs >xukR-Vc&W*iz X?"|/p푰1t켗w9@_i_Ɲ4sg v]߭1_t۔X W۰q3g?>>ףhtRq}Q]BKao$x~G˗2KcÂ[<T_I"f?,죳}"[Z3o gH. nɐGF_h6kKV^|!wdCͽåZPVC?$ Z;w*kn (˚c&K҈sVP7] -U />oqOB\.oX1-mX) @ --i3>_Rmػ~Ձҫ Vbk̛8fm>h'}'!PЩ%αsŌnːUL+\צ&D_to{ G`p?OEDӿ؁nKm55_ - -VbR571T^3q t -A[@%4rvI U[7-=5d;vWemUgcV$z?gCZ&9X"esS|[A,|-N,O\ʏ^|ʺ冂[C17ZCi#8aq0N#Z - -3*`h`'lw, % ia_}u**}ً`qKvwmYh[E\U8f k>5nm3}h%̣Inݳaި yKFG'ͬI!ߞ_?ҨBrwoƢme.\_^/óFtmg~H)XEy75$8J)in=uͰR`ؿgΡ]VH]On>R\r@g+ghk.[2jv Twv4/XF%tZ|17$]k^^_ -*%aZ6)wu0 Nh]gh=]ki¦8/p -𚑒\kt Aq@kr!·eUz ߹゚VԱTDc"׵iEw>{-!Ylv&%v{'BdC#^{S*o1N<M2oYIzm(B=8v V΄5"K1n0jd`TJ3sg690fVaɬ xi`44_||ߺd:]?nhu݃3p4J&i(^% t -)Kܙ4 5,rm;oܸLv[zçh 'T)УD-q摣 -P/RO\K\eQ{pA \/wCM <2aht#k23$Z94dꂕ5&<>N6sϾ8g|UcxqCҲ-ƥoOC&8)J=ɗzjZtW>*ؘXDGkJ!rPm7M@ݻOw*$л$p݋/~le3S6\ '_ףHfPe4sf"L5y/26,=,m=VfDr?~Xى#^Ȯ/[4x}NTJ\4$LM#n`&On]J[W/} ^ɭw\=? 'hkTxDVⓙv 6d1Wr%|O8rH"c6Go2LxǪgO!PD}whaPXP 56WXIo=r4G  kʽMNmg"CR [bafkq!QOkY܏@_-KGTv-Gtk|}Mzgm}mO;yuڤwn:Q?fmx8a4W(٤ p,)w/G8G A9p)p@)Z?Lc"].*oiy̐!vGpݒ-.,wJ;h ěaܰuB`z-"ԯl7ِ+ɀ$󫐫u)<B ©\QTfWΉq-ѩ # .` jPy$|Bi8v^,mJuT&@7#+F #VŪ}賐ķ8ґV\@_%^`$Cj -,.=IW8PW?PJG=nj?Z'MP7o]9u8lsZ_?7ߡIe>jpz8%T9T%h'#Y|k8?'*(VT*3^?< ſ׮^$L/bw{$5N-Q̑v26V _XFތ$]Q&JAj4C5ZhK:[V⍐O)<\JA'!MhZ4 h5B۠$-Dˡ0X!cKQ:C^X4 >R%zTWiR8{'["+LZs͉quUtۇa c`kynـL4R_e[v6YZRlBr&rvC9T\i6wirNB& +pBOM5/fA_|G|ZR\rv=\q7GKݝ͡P~#ZDv+E6>lIIbj Va#v#xe)PA7ZjςS\)x  \A ꔄ##C:QNu),Q t)fJWA`:  XYp9pPDXܛ&2yC?`ZIA#̓0"%lf4Z򾂝LZH| |CDq:#tqDV_Q#~fן&%H_N¾a3N>I>t;m/s|97 ]M?eōXp  \q  - (l/ZN1ggK,hj^TT '2(bEҘ ,W5` ?MNlڞdx&39`p4ݮ8lђN\2LGEzC'< ^{AKp?x ʠo(i [0Kဉ W;{|I!l ~V^:ܿ0,/υ:|HGHq^Kt!!+#BK`-olKRpp0?&%F<'jKRv -v?vǗ,*vǥbm]F6h'ڞN6Wdb>f]bqKWÉ - t-1CHݡK<c!JöP|X( ;oh,`!}߁x#eӟ3%пhGKٝްǎr_~5WK n@i.(S!!+([ -pC/| A?}> -8k'3$& pӍ-H#_%{lWXt>30.%{M-);40|pJt{8@; tR3yaD4j6brل,)܈Q.p*1¾IXW p.$'6N,!Jb4KH@HJK@Nk, X" -jD~YZR$0(QHx`Y`TQoB֕Wc~Fb$Y48J'>r>{ESX;yi^eID}b<=T 7paKQ545%J}Fd%RnMI$WU2Wa(̊mʥE,O2q(La1S?'n,0*sߑbBY&[k -a9pLBcyN':CT`)(n}j(?IN 'tHT|]#ߍ<6dr Hc% \eadgᨉ>)ѭ}~)?oRlڮ]KĽ -  (qKn0ي/a%p }%CEč-,.ɸaL̓MPA~.X0Np4<:>ΎSxgrP{$hKp!|9]9Uduǣt dy)Вzӭrq@#/K^9nÅx sYE7E -qt)Z蓋JAK -RRW1!Jt;c<;|fW:xczzz]_$GM_~^{[jZAI[S[ TM) upU>Bq}Kpbo<ΥtiP!Bf؅J"=dʛ0wGĶ\ {Tв}zۑPzog OL<5/_]FKݐ)fPwgjÅuA0*w˺E?)v! Rj22d$r!WWC7|=F%w@=8pS C# -M|L};SnB3GFh$0qj'H(`jj1%\h3 uI|P`g%隠#h ڣ%ֽRa\y7&r̋["#\^h{?_&c^s-&l> +K]\1\ -t|\7*Z/~p?zvI]zmq݈*Ws' pu'%8xaSLU,6* |jI_:Wz4!B0n~;f][;㫝ANP {sK҇Zg[6 -_O8:>.K# ~9L6C̫b0[Ee];O\G' !Xs|j=?{[Z%ۿNWtos^yI䅖sOw;{R;bcsSqU-|n=>][k㰚:"0O ܮOj7Y{tZ-cQCZsv-J(ƂBo>{lfgNv ?2wyrj -]-? $$_{6w܁K2XXȍos~-So?Hg&go-u033gFp1 $7TGa:ʟnfysy%Ǿ0nĮE8`m,V򤴩MWgDf91&xMhrpMq^V: I hTf'V.Y.ε5Э.C|"q)t nF/`q&_!KbV'VyR$sp߹@Kxp({z0elR6L G{jw9-l@hOc P~{)aVU‡4mГPaٌo\~-lJwڵ2:= ]1higO6XQqKׄYy=kWP|]ő*y,[;Ӕ+y)[چ:6P(ԕS7BPVWcy) ~mȶ@.!(0f56Zr1|.8쯁JY;|j(Iٓ3%: Lܒ)덀cY].qU8=+'8r"O{n:>,}kܚ :UPy˝J~aq`A?ђ_.b.KC%?K~f g 1:4bb`Yua x oQ޻5Xc{$N}tF }nlX#IUX zU u͍ͪU+,:ҿwr6&^&$:q!J.pę^W%ͨp*9Ӓ[tb5kx1zb5F4ʇ%z./{%,f#OJWa(|^] AU[x8r䆶6lAbE~iuyYt"ecv>;D^\lUrڱ~E)DkC)RX#ڔ#JT*i_ֶm_z_m~o6TPM({",n;TcL:W/cm_~۴TݑbEڟ%tآ:DH$=Vc>\Ԛ^YzӝK>aidT ; -ԛAcˮgk-Qe]rkro˝䮶r2'RZR\y[5Jސn|՟~znc1)l:.Mg"xQdU Ywko;EK|՘Ŵۮ3;}Ve)m5FW-BR;pR$'Iǜt@Kcڎ7Q=Վs-GkuϽ2;xs͂ݙ{Ķ@KV U: w7cGjT^ clrd$R`YVfU-﬒70Zj4Gh _  fyrk;qU -QF -Cn8oM=4ݝӲ^G%P]]~ȊN?rAŗGg:ui>)p&^zn19b״F B텫FOzlR K gk=#O7f՝iC} Klf'P(^G#K1cGqn'ʻjyWßdҢ+]o1֘ -st9ʼڼ5|Z燇 1q6 r?`t(X%ď"L{6U;Y*ǜm[ǰYR`cyC։.sĖ9dL_^!+}嶽kQ، 9׿;-6sC>#ev?.-0iy:j9WkN.2ENמjZ{kQr$_&s ou!m͎Ca ̞=q)}?IOU -hM(ņMU#n4%1DRfU :k4 +C{aP {B=2Os^N*3L|oyoIiRpyvhǎO( *O 43|45E꩚=9 mn`ٯF vLmt僵rjyO?Sҥ#L,^ ]߬ǯ ZKykѪy܉O+mmVVR2sW]nB4EU+ I5V0X?utEʙ iϗ8$.[XeP]ϋ[rŬoo>zjк UYb?.V\hf"8K{<;W(nOrJXdeMOg~E{g&LK.R`cHfˣQM>],mڱLr]ZybCjqtFضUT`nY..#4 2sFXcKg err[,穀ޑs/_в5G2shxJ\Tx j3)I -EFL\-ZHl *]2PF6NP;JwjR`[>"i ۏ/ߓ~Y)x]Lwz~cbRK6l73A,Rgms19`)16*ŖQ{8xg5(OƄZ8)A`Nkb4ȁw(,/DC,Daw)h`:Ձ2 -btW-Oygm~œ\jܝÂvU9wanN0jK [ u| ΂(ҍ{vҗJ8 -n @A1Q;e0A^x|*ӅjE)MZ{WO3m=]VUDjh3Ai#)=;Z9Q,n/2$V9P \kܹ1U?xqI깥{&J*\:+.oir·_³+%F=\QX++q 2;Q0glMN-hư|=YV)猪h'v_LM8sՌ_J~DuŪxBY|CkwyhIY|JY4`Jxdm̓q"JsG )W;Ki*-me-]ne ')N|N2GK^łԼ3+"Wd=-;r̤{7AuVz5V5uZMFr, ]fbl - ,%[b{T=D&[R:gl`-5rfqJެYE&΍["֍D EXZ^`С%/6/-ߵ̔\aߚ^RnV*o+V#Kaˑ@H`XTWþ=I>l\G_vlZ|̤sc%守=N7^h-T7%qPsYdbĔrZqlv$)Pɕau{7nE[dT7/`Ѳ=.?/QВ-7 b `.UG}1]@d0 re?vZ`ISje8‘=9){k{Zz0Zb -cz,:x̬;nW?(8g)G _!SI !2>t!ifwSZ7DX0a;Y3i1i~V֎3--S0lCK:KP:]o5y#U]-NJFptAhPaK*$[U<ˎBG\ 1t}5G[헯,sfqqg-P,ВD >kEY=g6ga@};ᄋ!jkJ%ĺ6ejKL1Hզ]e&0jk,eZDA|wzؓ>y}ǑY9S ԩͫt(]njR%3t؍6Dt}>In؜֨|.lUT+cK雮&4TaWK㹑jM N,M|7.W֦#-H]tø4)R}aȆܑX},*v`VZ͌G6wՖ,9$ٛR~ <3x\7ihK,m9UљZ'T,cb0,>$bsB4xH3!yOP)nk͏Ϟ=?`v|=ճ+&ύ=,L斬>ַw\c7s -^3a+y(ȶ+c{;)7҈LU:n]j` R](7"oW:XX!}\>>'9wR. KJ^k1ak{Yԉ9"rύ?pB;" mjeq@Rb 5o: -ЗTCx"!#"7V#Laaҹ'Ϗ?_ؓxF -(h%e>Iz WG;J UA] 5E<5ܽ Ud9GR3mG1Y&"Ǫө[fEϏ;`o{}ܸ *C-GKQBq: :`ѓU5l7u> dR| ~>F7)ZZ4$KZ'RODK<ڛ! a)IH@wv,0+-}?X}UkJ|&]^_곂F)\fQg(RP.'ZK++G-ޱHܼ PUHrDԔE@׽c{w_42 yraJԒ{͊YX8hѱcڠ&=8SUmERbaLpn#0! - ; 0\P$&gswG ̋==#/1d- O\#.A#tں5^X/-5*"5ĕh+n$▼cDK0ٚˊ5ut$RuRҠ;JoBUa$4J@FAv=:))l|4VTpfN)̈YZ6/ph3`8C0Q -Cq-Nʛ+OV֯hZ}qY˖4ݖtÖtS ÆL4 t޴[ҌN7wطn"5W-GdĢsP2?bZt=u3*)NJ-4?%BvfDʴ*Tc -P]/ ] - L"9n :gzc&izp ϡKCIbϢ} NN3/ܜy{Zߍ\h6ГT'Sb!ү \5䇆^C+J">>oWh[#ttw~=k{G&,W27!ovlԊ{j' -\&2>GI8Qаu8LQUf)3"%DC&G_bݑdEAаv&j8{̉K;/1q|„\L.P$,CKf~v=-)q0Ru,(wa)'+OPmoʲmIuacMM]zߚaޙޢ!*iQҙHt -U|01M,XX?DK`ҝN#lE)`xɶmul3浧u5[3 ͛23]o벭32[2xßlDPVPP;QRy(ՃB- -"hMFOwDKʪT@jyM9QVV+ L yu}lIwlMslKoMn0n4m4ggߚؚnGؑnؕٙ -d67)NR!ޑ017X@Kc -*J1FQb5peǙ!\MQ~0+'P r[3n؟jJnB>ڐ۟}yKK̥qx刀_:7@pKIpK~m{=zA:gB|KZټ-ð.Ӳ>Kޔ&o9yݰty}@ t& fOsC%8ZB]^)-NSm͐f*h3է >1n̐ev͒e90"#З1hn~eȵZ`"4;Gq(Iqn30 x<6Pp7ftc`pm=.@N@Ha-ͱ# ڰ;]-MTR.L9D,(顆ECyMvfػ zj*{T Ffggu]Dktr_+>֖>-؂S Ɲsvv<m̄qeWhk\:ΜI -Gli R 3>))tz -_ ҀRXdo&uޠ[ Ssxrﭙ>H͚s=Z*P$NʴGpK%$â-J:Yd+޵`0YʘAI#հ &W+0aDfB4Ee' 1+{Ē 9[BïAKFpBxtVgɫ1I=޳ٔiݑe싇JV?2ҋQ~iY)ZbV*GKd~?YѼ#x $bx[eH᛭ϲn *6g?sj۝YM㈠-r$ϩ''N%O'Kn"d5p-ZyőuYuY|p7ei7y޵tE-,=xœ\+,Hܔjڅ/wl2mɶF:7gfg7onwL=Xw Rae@gH_ĝrC9˒>ڗɼqE 1Lv%|";{2ɃٔlTWt=nnEѐ cM, -%W8,|ojy5:HS%'8V›Fp6 Nכ-`;B;aw[/+? $&!V1b@?>8(RI<!XZxaOҐL,'8]ghhjnL!-RDuP5N)`llVc͛Mk,-xWZiml~E[y>ߘaژw"ZN7So 5VsWHʛ0xfb5 80yYX/4سG'7gmhf uc ²[ xߞeMkr Sڜ1R\i9*RjiJ\GK\Xώ|IIr!DKGh8Z:6C^} -cm#]"<8,؅Yl.5]js`Sh{JfKDa&wh |%Li9Sf5qNȹֵw7ܒ;-34D7yfa ]%SfZ?疜6_fQ)VI.Bvw?xD#j08 t-VȦĜqx|^GKy-yFliqђKPN8ɗWd˛%Kly)jY㟻h"aվ&S -I $-aաqESʧ%WOOh,AҀQ*vkډcg-In.]Ƅ!-,9ݲZWra1͚#R𙾱!RcǕ,Iv'CK@K\=-ҪSSހx[?od+T:|w,L$pH!RJyhT)%̲ђؓ ;,1A0l -ZrC%vKx7Gpl:o91=8)mfJ>$R4˃!^`', ->{kwm4btx 񘴻7^h/WP 93;2;RD8 --h+]ђsP:X -i?<Ҹ=Wސܘ&Yii66Űem U}/ Y:p蝳,L)Z)sL~/x_2\awCu.gZ%[wɛ۲۳ 7gkexRg(Pvn˲<=GW|[ƙpjZ: aԀ[-a5]DyxsKٌp5QD vQlŠBg b)d䂙If${{~Bvx+s':醨#ȒB&7CL6Qn9VꄴzJ GKh -Tۯ%34GY&ǩ ڑGq{lf8&9tDsvǝ' GTAtS&-n@;H x(tt@+"Y,!(ĒKZ᪷Tɯ -CK{zTsEF7lBYã  3> (ve&U]؋p01o'r!x$"pKf-cJ˹% $0׎[b5Eae)|3QOΓCd1EI_7ZL:k?CF-Dp%BgZ)7'UƢt ;MH'$V{:`&(wTx8|v8BKざ\R,T l¨8%ā[hI[B=5JSmβaqDaI u3ߗX[2PqXDgvd@3tx-ano@JJGKlJ1Qi DZt%lZ2ZBCKPR*4q.8%!BKTB2K.! 1AB! oRgsדҥgJRiD/2H3ڼ J'c5MPp $?? &fbjZ*[rϾ,S CкL; hC)KeP~zGN(`aٕ(ۓl'J~a1'QjĹt431o_qXBRDϗŌ+qK.dkx3ʉCRO@K@K} >ԭ̖WW"NPvn|=K8cӼvr@6押-Áo)9Z -Dق"Q@K3s\yh;_Oy -hpbcbmNunZiLh Qȉ+%W<L -ED(2J&7l87srČ%BO,%})h!jkf߾;>\*)-]1_ tIz*@K_{ؕ>A{^-V>+=.-]n- .f~۾=/Zuc ;@K-uٷcK%zh?2SՓۻWǞ@K-](In'=_@K[zo[ٷcK%zR/d[@>f߾0hI^>f;ݞf~۾=/ZucPpK nIpKՅ{Q2M;%В@Kiur[PpK[ncowomǞ@K-1(^$}l(hI4˟$v>6v{}y $RpK[.fߋAoک=/z!Z/XA )`-N7ӲR߳J嗈[OWpK[ncowomǞ@K -%Ώ[ h)%2B ђ^0g*L*PA\jse`phS)˱%ӸT4`3 .N,_ixNriy@ 'fHL<\/˦ %/u/В|̽Y%/g:6fQ/t}SLl0DJf%VLhaBO^G33dFJ…yhuf~{`[1|d !%Jə;+Zڅ?H[eQ10Zh%3=5gzr2%0 H%QvZ9-?_-u:sorn"" ~QҩEqg$,Z:;',4;zԜ 0='seh[TXonIz'U3$>mqYL@KSK(\ _` &ͫ=/ntf03h &!̍q%f:e-В@K| -;@K]DKK5{Y @`pK-:mc- psc)h ^d lvBƐtˎ,SdF -4?¤sT`.U搫5>rO\;x В@K+\=]Xq0N13k25يck -z[Eq'͍/K0$B"ҷ#(8>톛R^j GKZRq-MĹNS,)oE,T8[xI nI8 YYܒ9Ӊ# " -T*<=5wZJٴjY p.N^xT+UN8En&0ßӓ+M}/݄҅)EƝ| ]M g8[BYB&`-͊-F9ʇk1"[pK=x{zKh(o%ʉsEJf1-5jJM@K,'.s\劔a+Wwv%ۗ.Yv -̺ž GL-pR^B䂏ZhzFJI*d8ZrG0 -nIpKTs.[Z꼂@ZJA6܂Ī 刮ZFK3 -*s/kvzyUh-N@=pJK15hiZJx*V|ZU!+DhW \1+|V\*>|FOUhsvr OKRb3- -$Φ0Ootlʰ#ޓrYf ːW#h4۱A|ɶ 4rE g#;Xu hig6y)E^hh q~ť9qQY%=vyJ)R5ڌYq$嬎RS*@KW[-GFlvrsK|%GK[Qޫ>Ywjϥ!5`aR" 1W-͎͟P0={I%Ky?tYl "V v.*8w`jʘm=/۱qKhi~R̄3nBڹ)uR ]s0`ШVNL:{v^\ޢ\r%HE4]0+h^g|KBXq qf,w -hg*\`;3Ee8oֽB0[,َKQo lzh+](ҶthiUrlٗ.ދ*_]iwڒ|X $\{-}9q7Oۙ EY|z9{_pbsnj5{ ou*Čٌs^=-*)e)hFb줳|c7Y@K7kiq-t+{4oB3ZS.ϒB(PgƤeYӡ5ip-]ϡD$UwnGW4/z~\OV&.f1@1L6I%7m&R=tى_qsW+ٗL9kڔX?7)؈%Ef&|fYj _ZS -oWǛ@K--K-]IҠZ EROAKbޓ;@=(C҇ X{L@K='jy nDx8&CK@K9% csF~Qk'wf(60*lfvҷ-NT^̹eֿ}fF\.&wĎ#N|mNyj: LL ZB%34 $@<;}Ǿ>]F zE / m5]9HEV>'nz\)|2`(ВJl1R[8o-̹%7#1w޼IޑKm'F~|}?K2z&ը^&(^-Vk_=psnvjܽݒ1Yo?f|8r=h^lwX 1EܒZOEiO-x3=JT3cF%RCKQ#:oឧT:d O\OPvyA -!y'!Qދ7,M)_;ʛ3l'N lpKhtIg&pn5|Gzc*EWȲFfvx}ZL+O-Xnlޜ)3wY_ -f^kj7/%Dyl^|GKXf~bCS|s -=Yg*߹%2˩oFOŜl+ -Ii]LV>ٙiؕ&M\V>!g*e6VP)$0|땩gQQp܎Ō`N/ф=,ň[ZzooJ͛'>h<) Ob-幸9O,؝=r~'hb֨$M Vl谲.E[g'NK*GIolr2sj 6DkcK-XdlhWqKhiV>NYx] -"oQ[RۺrkI਍ jibN rsz6fT~cK!*C$ݴ(6{~R{qs6_^rOfL()sEԧ|eoN[l -n:Mofʹ9-@u%LӺ,;[b { Kzy".DfPَvnKziy Qo)JS -QA`Qjܔs3O-H-{篮9 5ºa;(ʨh- MωPFL%Q iu;ڶdf:ew^%Eyg 9Z'μ{?aԺ[#18n68A zwf2 In-ֲ9ˆBh+Ny}Yuf^nx]ۓ`_QT-ƦL+]V)p¢=eFJ]vdiR+Kw3Ez27Tx[&r TUW:Po][TyE\UQ-K hzKjB o# ЉbKFOKGK? 2+hɵ$i@KN.QFK>i|7ͤ -,g='1ožs=N4 -f( `c%* =Z -Ϩ~Ҵ랦YtʺEAKYhT2ӊƎ1!:IF Yg𾈭?sW)g~›z/"mZbK*-]zKUt:=<}kK:Ydtt:[޵#[yz;@z?t%ƞXOBHw,v=A\37(=uXFz'wdeVe[Vf?:hl.Ӷ~ oL{e86n?iٜf˱f7}V) ޖ#+>.닅QGo+ d^%by k<]ZR$@Uj`ރ -Fm2˶>NH )R --EF[B[Q -( !V)#$8qu}ovAPI fvv;\y̯B-tLw ut0!36{/CK-=J!x^Շ%힑'6`My4> R4.nZ8LĹ T1؀y=}f_Op/?|EysjJ-J_R1 ֘VgT&2fsDh̟s,sLsm08!!&n -rưmA; #XvҺC?98e}ԣ?Ҋ}Ӓ3{#o!iOa.$-B ~WU,ۭ$)qR~UG~-KXYR _&잜5=eWow@ -=j`-ziDnCN! -3"lNX&g?ѽxYS3l ę[nh C+}`i[N>"ɼj@7 rc@<5";>St  0r -9č{ G?&ъ D 3 tB?+aMŗqVҥI5`i5͚f!uޡ%mh㟑KB`7Z EK lI|o /e[ -Ck -ߚC?C{}gZUA]7T:ߨyw+6ĵYIErb#=uEzmlz|nIlWwj7?V-b[wx榣SVvP /ZE4! WeccE"ycSWeOMq;}cĦ!s[A)*-ƠDND&9/ސeY!.-ƦK3D̑2 #@6gk^Y`Q-[̀ sĹIKVBK~?䥈U.Qg QU usK@@K&Qu"u-!]f@qfM_,@KT=i! % NΨ/6!kɉ11ތ_iX=.p\fH$ L%>˚ݪUit͊ +2g*@*$"[.d&g,Ēw-6[C~m -'fKOaܸc/@ ',?Ni[XpYWYeK?8Y|w^̵0yQSdT U>Դ)1DeP(<^NLEIv`qCK &>S=^f^h{JZU|:&LJ<`L37F󲬒'.hWbu폗Ta$ #CGnpyFtyYN0,I,/5zAD% 1Y&Li'gX3}e{Ӗ?C-I %$>CFKn7ܱhuEFEBz,=g<7 -Wx3OAA q`*G:\pORUʡ<{т娼V޵9- % RF %  .6aWu^L?[9|H.^.<)vˢY?b_DgNaUr0l)dN,%!~2"ME3<6jĦkS2C̯cnT22{`&cLcJn8b[ђ`Qҵh6VI%ӫ25L;Nl6%~EF4:GN3+wӎ󎛴ЈYi4iˢ8!Qx6 -]`čKuތT@[ܔn?Mf삑fO@#t5"[w[\reuTWL܉it}|BY2 4˲4cRtcJF3+`>̣hEdtebn9tL{h-pK!G+kӊ-aM|欼gdsjR"n?穑<3ѨX(yƽZbi2Vfq{#D`f8dX]_)^^v -dP-f.!%:oqO ƻG*@lFhf_U^MЎ=>ag=Ek=JS'"ækSnf3`kg10PGAPQvdx5%4(y)>w -:$J"8vUj@Kp' &V.i߁ (ףּ%9'-?ډ!_miRHh7 LnIFKdInd~l0ZvQ[v'U$8K iUʸmE; 8s V[ؤVAMk&hMZ6<ǒoԆ_KQIٵt'LsL~{Nfb 3,SY/ySoyUsOdzJޓ=q9%is[Გi7|G }$l.q,y%ye|%8ZDo&k #8/N:)TÝh oKs o"-U -I@]A 3cmBH~h*iV~NZðѨtx*+p32R۩\:3)vH"f(z Qoo{wuvjvhI14`qZ\X9b_?8+͉΁OZut*\`ޅP*>&O z#yzXL/y"PΓ6u6}m㽕?NOs{h{?D#cF_(7ˎy6R42 K|zeʬ)j=[oVVRZ)5L+PJ@9;˞@,ORixiJ -+Оz')_C~I@G@KX1DLZ?tdF &Is`1+pUErơ'J䭗n,Вgm@d\qBQd_~gƆu=ȴBaݥT}`f\ xqaLh A?<(cc8ђ#3Eȣ  LY8̆40\DF1z - 6 Owh O5ᆁ-Lw}hMYLE+<N - Z(,6T k1•Tkr&OPSUgBj+xfXt!pU Op&4N`B#0ڋi["d#myOʪ] - -O~c{7L#1PWsg g-A0̆hfQB9.TiEBBԐCDlWbXkfXa2i!B ?I=kI^-^|xG n/H|B yg6UQܐYdpAm1=Ln?;d2A^Ԣ] ?aP#{,GH6]r$R4+AbhRuLQM8-9~$Q6LbԉVcwE@8Bp;k1B{hm{TCڴm>-"=oJ&xXw@cwcn49/J1u21W"i` -Am6>4h1#j%WSYx@6q hvz S+@KOHQq2B[(@J6`hj@KnE[z̆_)-X --X45LmԋHǦ0 g4Q l[! "EJGK 1sqCIT+t~q(fT!ȃ(äZb?M]?Nq^-MRzگ$ʹ:ݹ̩]$ApXIAUhIC^qt_H^E@ahɍX:SgIIժKp|LѢ V7n@(DLYtrǢnUN^)]= ! dx:$eCqI!Ő$ ?g]Z -<$=0,JB.C T QԐmjgL#5 -_HQvAm -HD/#\%Dv ØlSKhcV+JBZR'S)Co\%)6y-|UjغԦF}$](}s.}VQ6 -] bqB5?qO@RFӘ7"~]L,2Jt6UGQXY"q;E]n/ezYx)nZ/r]> -] zz0E/B`q?, a-L@@V2a02&QqG=1ي+Af}G݉ЍAVs&옇oVٵOr7=\4Q P>p!Oy(o&>1d4|]]h=ނf:-'H{⸣ -aVW%Ew~acǿ\ ;CD^j\)KGt89LB`E ]"6Aފ 1O-߃%\E=7P4g{5GSmS_94/ A+2U۔L%r2`#&r gdq*0 %Vv,@ӤQzا0P\n3 -$D5hXw'k"Ÿ%X8B ^/Džc.\M+Zh -PhRJ^ԯ6R pt& rl`у؝ΊCf}m-d4@H4~r_KS7 :aBXZr2}`/&|@ r1彷Ei"4FK܅p,4:$`Y#[O{.BE,Mmh-ejm/miN\IFP /a -U-A~Ac+GF = 1ݸK -n"|~׾ygV -ŀx1.@#A1b7ںS"% SN0 -ss'OU#E A})Dwr2+iNބ`%M6٨fG0dq"{"h="Z-IA1tE `<4x.!rK)pKg-AoPM0 pWGx7`- -=33 OT9+.dEcܷ(iL]$&&Ťpcb#Cu "Q0bnN;aRuu4)fLlb+C ŎI!B1( 10-uWqV.Xt$7|fn|Z❧Mk[;%D arf9`hnS~Ag+S]r(D@ԪBPAh$8l GQk-bӪ((wmHz@0Ǭ!AFU`#4@%C(lPYPDC0a0f\$hl:0B#4R.cd!r*f5(7@ -*i0*-"\1qTai']ZՈ=L~Qg1!,υdtf -f:5ly8Iœkc+Ngv%? "MTeQ!P??6 U[h֗}#F w;_xrW\~# zOGF!_1ո<2?41e[V.[29\'#yР(@hڽ7K9CSh5x@K`1`.5A5 YJCY1j).oirYKK&Or~%zhL?ݿ%mnK+3D4Ipr9$O3EXċqOtbk)[rð@Q(1(<)l :]/i@]P6l%>x4<)"١?vf]+&cM-twf%l!/*q_'Y!lx6jLh OLbR2!~f#mC%:J6&#|#""-[]$X^#eW -=/}c 9 \n2' qD#[_]vjCg8qALSXTX,>DOS`rd@ - rt]Y*0c%2>k[lg*R#F{n6ՑmYB\|pGIBFy/Jd6}/J`;L6 -]yٗ=h!K]'VMG&/# ڀUл4e){Հ+*s@ÐDQ6 xSa)]vor_qQX|obb<O%inGz{ E4*g~(B»9pL.?9q.)[,-?n'trv@Uw>YO0;xh:!S,T_r^D -<4В*lD1ќ!FȴOC4?Y -E 0L -L%&ai-A -Ĉ1'Å% bMp/>PA$-5Kp[녥Rә6HaE,;rx,~H2j;vя/~ 2*,BRh{'āq TU򴇘6:BXJZJ13 mU7ub !ķex!s*8aoad!륇Fw(-3ҮmAC.WRj:{h?rk)^|`!DŽwZ\s)b>%0‡T<.2b0H9aşu7[m6ݝw9ini͡׍83Md;d -mW`caF(͔K|^hCrrȠ1l+L;] ˤEfLd: l )ƠRzN+S4 [J} 8u' tBjL:v6lȺαj9a Mpg{Ȧbsj7ΜsYhc|}AFy[6UWݪR}3KFNxvtf aM(i![Ԯ» vm+@s^Qoi~GsC gQMĴ\b1JÒ0>pp;ybvI 0 %(o;uLO_3'u?IQ곒{싥ȋ&P,ޖ1Br#2a_}⦰atr(k)hpM=C/5LlC6;@KhYeԢ+o_BhwAe/*<h~¯bIuwb٬FEUqXBgnŸB/Zu,L:Qa@b 1@DAi>L NݶC03ᆖsד] OXl/1T&gTt-k1IG_\1G-]W]Kh]+K>)*/0qUmw A__A'JL4ZZbdC1 -DWJ5)oNh&3&R~ќ'?XfBxc{~p[ kma /dl^puf#)BM -1OD`xw{Tt۹M -@)25^ -ӵ(5[3˶ l߃Vfqbq˦?lLi,ľZtÃXXi{1Z5HH': [|f"`*2gFvv .Ňi.LHݮU3` K =?}C͖y᳅C5g3GK)Bb"kХ{eFF g9D.c ,AP\>IgN%VӾM{X8DJ@~.](@apVb jTݯ]Q^0H)0dn'念BY/_mڝv_?`QЍw:3٪ECv:}T+^z0DR\Ы#Aї YD5%泒faQjzz -v?3qMDK,y -!ԴGԯh6Q *j]*fY^tY|k9[%:((N)̵ҨZuJP5Sޘ_żE¥(wc`0в!:l> C zΥXctf)QnIQad5a%Kќuׁ!r*R mFJz;lySgl='e;*p`a?臺'}oݨՊ+#6J.("e-0%e} :cmUQnD;!,[o~FE82-ؘBVmHee9pįZOP9%bWC*kM[[_QУkkFޢ-mm޹~,{ Վqx Ň QȾꛩjNuiUjn~tB}WDjlbָ`QUO~1 "&_t4csRTvmVy)dOd2g6>$0~KT[D~\7F4ϿQ!R5wrpGLxX]:Tdo|)-^XErCY-ڳk.Q/~ILuF T`ˆ B('D\h.-ݶZ?/MڱMUc-w__fhX%nxC -惺~:j9Mr:jk BcaR|Α!k@ʒuM'4>;t5G׃'i~4v/kj75*-3,b}_}aĔ2!5VwtOAKLj-G(Rw,Ij[c1C S_W. /~ -{}hY@!Y!]| uj}a7_!v.TAi cJM"\d BbPH'?$<=˺Gn'ͩ+/???f=-hݿj޻BPW6" gox۟y\헵ڭێ 4\ bB;a9*.wɁ[阭U%a+W{b+~]}#waurmOG1yQ½F>D=S4sk*t" RD-BK!BxpKhl/ֶ,줪Vc]u`j:ms֣Qb6dŏ^{[QK7wAn" -<*ymw"˪˷4|D‚ -?xbF/=66|;&@*=蟰bZ߱ck 2f -(vKe=p'[<9ՈՕ>v2J9 HIx@Vay":-7͉cz6gQym #:7|. - S}Zjo.!f`hHÿ)FrhUcrZ謰 -^eJ\mZa `g'#Xԛ*:O=$T(U2"30ncO1xN8pBҮ=\Pd$A MHUfܘY!qyNMWۮ0^j% _ρ5]:f`Y|@qn\N&yCS>PyJl`2Q'O{Wi8USnM~W降2]F%OGYAZhN롔YkOOZhX-2MnBb?HGӧ2tI%~ < TK97nfObhzTm}U~rfHaO5zLt0-Ўm:^x-=}yrBs -%  0KjA)PPJm׭o[|z L" *WC#RW{pj y[l*Dg0} flxNc@   GSP -i EcPuFpǽW#z=uɊw^^X-b&AMB%L\;^nݮY}"&ѫL h -VP- zQ4 7z5j/9H%T:]n\45n{&c2ȿ4sdw`PoM4 -/z_qkCYMh:3pȌ-Օ n{s"hQ8pZP"r $6bU2^g-A fA-N0ߖ m·XF=ae~B^Ibxa€.XX}y mhTp-Ov嶙ܑ{ -]VM{уsuacѫer*x&U7\5$ÿ}ypº?`.3o{fX`qm偝[m٢aJ95lyVo -p(-wG`#@%N_2?>ih-0\rG"bÑ\AkUP -Jlhuu6^PwA, *dw%9ҧəF)G Ґ(:pk|-&3V )DMߓst)ZhZ-J-fx1%ZdVSI|6cՒi(@YtpwpJ -<Ջg}fpԇ RO]3xH^eRYD4ɱӁ£y N^NX-9Ag,_BD?y^ɉ0b ױ;s9 3~zж늜eӅm[@|KNh{-'E8,XlUKzB1Sڵ]1iS>9}sf E$w@Eio=Tpνz}|ۏXÍxn; ?-ߊ*?rI5l|ZE ^N*|zZBѲuVE{CF2k>[܆=̆څĒeHȖ% ޙ[('Y4cH[Z;:'7'ϙǟlB갧jhv=2.e⋆EBdR%#gQj9J>}~=s)nfEEjȜ=V,#ﹲW!jPn`C] =T5TY9~2ب% ݢۇ^FdPiɧENvB`1OR4^GTq_8jazFh'*7JY91yAJqE'/텋NWIn ӦG,@jS_r -z< CT-|xh]Pbn7jT 6ZU ;{S۶+8E%wrlm=qݷ۱:F"N99;ׅEM`[iOq7c9%-_U%ݦ5Tx$1'{GAQp(k~7\3HZ4:XJa~gU:A>U=fG 2nݝEX|0h7fL2\ wŤpb"gXm;(+ - Fu /qTzwc'|=qT:v˼ߥluVv娰,fI\ُ[xDT,۠̇`^U zdn%hUN%ȩvB`DYữ? w2 vm}:\~aZ]`|f~BtXFt:2`).78зn@K@:U*NCZc=+䌕Goގ܎>+/3HȀ NJ9"њ1wO% DCb}|%j(P-~x^#+ -}.U O޹N%b1bUu6Ư\.StdŬOBiSg'*м>} E聜Q?|UjeK*_}ra\2s ڸa"FQ ~Z_ݿ$^\vsu U]1h8;8+oB~ݬÕضǏP?HdC&£ ٠8[Vzv?{h -KW/`(jT߳vRck.bXWHlM%!g8%*8Uuۗ*D@EA>^֗J -['-<*?z[}mFj ]R߾-Z˷_ahOحNcd!pQP -#7qUkaUTS`SC+6FK÷߀߅Al b -w jU.\GZOn1RaZ ?w :!k'ԩ*=tl'#+l)Q4r7XixptXH*(qwѮ6|F2odD2dl}f_P7OuFLw=FS h30\2Py!LRm_ -sJT1;yOPbJdhut ڹ-a;[/<».|SGPWcF -+/C.7k;m[2.GulBiȰ˯6XHC;ga}bQٻπ_FqWhM4FV'$ Ҳ1M=Yد芲Jlp!qUqϽ׆~('S)z+ ̮!뙠0Ps{+@`me~g;}Iflu= 5K&: 㣻ZW[͡ߓ`@kDAFwF5 -l֫90 -!ze@ ;7 AQ(x%SF{/>k8k|2K@kI[Bˀnh^ - a.D ZM9+8R} Ak -W??kAa)9xi`T;E(@E tRi:PO Ti *iѽ@sK\ӞG/%I"V2n4Gk@]_r;Y[Z- 1onmQ"F:4eW_{UNa>)!(ΕnxƊT\ !Up]daw_rTLUkds*YS} ߐk흗;`G4@Y^~pኡuPrm9M==†y^²xU4YhkEvY;ma?#Q:UynQ]{\\\!qmxpO<T[?cVDOܟ$f)3#:wUHGvy͏(Vѥ ں2~F*`gdPJzt6 -$MlFa;|;CL5 C6x:.Qk*V] H꺊CX3~įC6Cףgva{weҜH+'ص ʲCx1M]L?Bjݹ|cM^8Y|첤~>|cڂC]xuh]L4k ^R6`e`_o&ޢ)fu~6P}Wm[׷igo(utD -y06Kmm !c8F@S۴ aXfL&8w㖭.C|q=t#|>u ;o Wi Wj]Ł85_X q(CG3\d d B=w=W ISR! z@)czЋ1ɈDML+&Jmޜ;wK!ڎo(g' ݆[!!A W S -ɇ -+WPTVҽ[b1-| |KݷAG|A"#40#kavfYNL8_Xu{v>cMδ|=8a'ӿOOViW0 f&?JE.ZJ -#¢^ޛ1t H$թ[`P_iسJlyZ;% KHY%nyA{4d2!1L.P R)Dv3"Oﲘ5uRxbLs)Q]x4pN5 -Z™ D!-b|A=[M.hB!#U;Bq] lI]Vm@fG|Qoiԋ:M2[^˳Xd)("[zdB -5Hw&7%k̻rtb2[d\_\3?`%9 kZ8)?|ʼn%ȰYnj6XHhyI†~ҔRsO˭Ngo'scVАpr>\i1ss]@АKGb[Vm#oG}t `Vc\sfO4Z84_EeǟDFFFwP鑂H,pQ鋏 zM~ODץ`mqjࡨfC_-Q6ZdL]Y1Z!nMag>#L$XhuR(ɹV1l:NO?7X*8A!98!Q8[EtQ(cO*5a֪tX͍ -lX?p8ս~5aɆQݐ5'Y%&iR++  %vH`0l"hdl!`ogD5^œ41rŌY#' CL4% kJxA"L<c,أр@w32K;1 MNZ&H 1\ƈ#3[ԐÑ^؏w=~y'|~;tN[?%Q$-ˠRQ,1iftFB 5$q` - TxI$h҉ O RDS;QM,ٔtV+e8}3= BD ZLx|(Fw?0&pK!_-'Z)9v:ZDwu@CN/ėZb,K༕@3DKm[GT '?4s ≹aFYQZ `NװGV: (E@#@8lw V8/#gN)F Qe#|f03qci)%S"~̝ q o{2Z'K@ %o2#$8vkU.҈ˆМ_ -ϰSEc8i[jԝ(ߢF<kM}J%S|,YNaI<- -FZ цCo1SIig -Do_8xWzGo-moRs팓йNvC( W;nz2Z6,ߡ,Zt">ȭلZ$w{jk)n K)׿iur;:Ւ&sK-{%pK@6. @!-R)K@%p:HO,YX2Z:/'K@I@FKr?% KI@FK-[%z$ Ӗ8$ G%$ &%pR hId  td [ hJN,Y!-%p% s-qzd @2Z,Y-H2ZjA%ߪ,#-Dy -,?,'-56H,J@FKr% K?˗% KJ@FKVrd 8 h4'T,s--kד% Kђ d hAR j,Ve  h$ hC~xYI2Z' %p$Tqę!IINDIpВD(*->0N% K@?I@FK$!{Y΂HpY҉% K@@$Tt1H} ]D}DG:DbfMg(Y[ ZI!O%$B1tete k [ ď%Eutdҿn@/ Zr8вlvP-&(٦uLnl`В,@bh+88=D`Ը\rG)1Kn3 z zJk(`ٜƊzKNQM.Ũ=qgMSh%rD04P6\IR {6f&nh8,*(opK_o A:hOf@(jY.>_ -Bo%ꭈC%pV$t԰IZB(e7^W dv}]N3{F !O W -hIo9B@Yy<d . ZNh40aBǎwލHO_+.à of*w0N0h)pQ7Y鴮!?,)%k8ŤWGvZOh EsF^qMjSRJ{C.e -k" 8Hq~SW%$%f5ہ~˗/p+lYB>b1;p xoZu|TQ7ķLd/(7ʜP<|PI'J&*m:1*)RJkhd ^ 4-1Up`JT3{WXr%uDSG'5-C'2{w. -%-ٜ:j%P$F*'@b[x{W=]QRJֆ9s& t7].A8u`!0lM?DG _W[$.'? ahz\Zѥ_7{DEt+7SyLo@K,7X:/{-DȳaO?|rI}W"ȃ6E.X 6PE.p?(.mٴ;w`! ${rjr+A%vu&@!ECAu ƮZR co/mҾP$TgwZM솯@CY 2Zj!WOgRwez;.msQ6Z #.2G薖Iť^;: -!{~Z ->\2|K? ꉲR:5fɉ b7_}ާDxi7 |>y -Zn¾F-Ez)VNE[ڷ{? hPUj_d 4O .Z"j#&s_ٵ&5f2t1[/Bc-xɘ3:Ɉ ۔}ab͚G AˬB@|;{;y|TOm5sm |ds~2dhJg2[ |@jTe.ߐ )]#:ve||K,f'-ek?%*!KVիeK3f<9@4#(+~˪@!O'dZ]MMn7=f zj_Ƞ_g7TC^7w( SOYu`۶'?RatcE{޳HHq5E\bӼO>h%*DG-Hznf%@SrG8GI_ -!p$9f+Z-sun@!}^+:7(J>r - *UOzY !b -78Et!q=RDQ_{疛oӳv&l{ojئ^yۣ+5$`ԤW>e3)HԢ$#OFK%<%=q]Y,j?8uݶkbu FFS!ZswqHPmDFMu9쯿VoD8`_~4 8PM ڌ@ywA5햧:Bi3sI*)GyLdA,C-<-ߕ,YL( -wu >%}J@e"E9} /]@tt"ھ6љV[zc7]r}^/& ??=|úΊ'\ -6(K) MVD.{,YOZBܒUՁqm1(@_]Q# -;牱:w.:Dc˅xm*C/!N3!S*!!:TS-~Ug:;G ~® 2OQ:O% IhIi~ˢWT09-0^PBφv@KDbkw Upil)ص]wA9Dq-ν,\љzg-H^ E􏳢W0;wd!60ReI!PpW999Drb=NXdqK%l%`ܸ,.bĂMZ#³ބZ!;(wB|;d|BD֦тf5qWԅoE7 Bqu -N2Meё]w/Bf@(*P&jelZ E,ONj)!&}(} (I_d 4W 4-#B,=# BGL! /[1ӤmȢ͚'cXH{}ّɯB0W?+j"r6M}Wtƺ#îA͡XEg~QMi,K +l6:}@Hr* -7f¾D-*³GH15ҋqPeu fvTWu UAeBg$hͱ$KA\b۬ޒÔ׳D]f6温s:y$̸%OoD햲eZ=FFv-*A*.⮫|p4ӂͤb;GMaR߂f`AM) R=ai"Ld5UPzE:@VhVhL;ͤSw EMF9㧏CǼ:qҠCjCL4{e~mSÑ@'K%WɆ镽uBtoi rV>B̝.Ͷ7&KKhjH^h heIYjDuݬ&ڂm}]~|j*P6=[7%B(ZjV&,FCUȘCw))4Î&ߒ,h:ZryD?4I(֨ٶ)$("^4>}H!ʌ2v^vgw e~5ص8a[YDpj0LS]Zlhv}ޘ*ɊNx -}RP@1tإ:g6sQ۵cwcg̘*w_YH9ˉ3jRNCzu/WG,f+-9V,XuJ_'.ch]]vu( mC{oB7fU.jO.7,US^??&p g -Bm5?8ħ$V4$G(%q>xpLFQ+Zl%Vu9;k+Cȸ?1!J\1Y0%s2p8i[hnЭstYQ>sً - -tvi"㬳=yuoZVm{ [!i/w&NpsWlG$Ӵ1NTiNEh/썗 P3EמBFv9|E Gv]=pѕVQc?݂%I n 8[,f+2j.-ў}/D.\n#)XVZ+=wJCC>L|tB|}U3?]H݅GT@ ԋwv6g5Lx*GԞli -Ao 7Q[5;Qyµ_}[~ AˠPfU; B{.X'S|-%K@@3@{*yffF^>F`aϾID!BEaQ=.FfYND6@brloA!!d-ެb)oZ@aQT2>E-ސ°G>|]R"Bn&:T69|Ƌ_/WZE.@MnU^[k( ҠńrX) %%d =z,iDqT,A()") 5+y̢*F\3}2) 􎥗PfqZaQՎ\3-jiw-X〹lT?  @sE+U&VzB:}ߖЬ%d@[Ia𼨠ՅN8=k=/i!,β(N@[LBI)cB#*1YQ_APZ*(;NfA!HʐrBȧz,_nRX"d hർQbV+i+6X*]&j2 -L@C.Դ>.@=&!XPL`҂ vCgm5J̎hmכ(J:e7 onAqy'4e3h-h,%2&ܞ9RJ;-d)pLԙXfP$~a5SL?#sp(+ 9 `Bظn,viL}eC6"dLp2oeDVcP23tk}HZl ꏒhhL%K@@%Ir&wS8 n@v ck:c!vCӤ'd1=EKX6"n5yLjg1Qi]NsYcUqJc\ -Ѧ cBTe ED\l"6*ٌEw$5.+-BKQ -!?6#P!> hcJbOP`pΆ@@_ V6 -_+(hwGGa 9;qe! U B/L -X-"@K\4,,bq2V:{-@z's[xWoI.$Ko$ %{%Ђ$ Z 0yF7T0!!Jv_Gǟd{BxͽaA+,/-{5_dNrmLTlZkPNIJwrv - h\7#n@K|]P4 u52݃i$7b_'yPВCL2Z:}U^OFKYI@Sym\qGqQ<1&%N8crJ{?OZaʏ$s Z:7+RLw/`UӒ_NW2Z:] 6-{  -5P'ԇ'V1ߏAB) -*y6vђI7foH@FKgES^;`z:v2 u>[y37,ӔNS'`c7?s -l/S\I=qǫ>7IRc}LB3--i6|'^?;R 81\yRY>$ VE̎Jq\Nw\D6y:{c-M/ќRVكOP2ZcNp/nû}&|$-=5^RFKU5硏Gnؤ 21{@IVکS7]fNԭϫ'Rson IR涫h;rd߿7$׾9*r2Zj! u -ђ^:&ōFn]٘j"uԠܞ&M2KDž OAK2Zj ׻UEY[MO^ȩAC -&:'kl&Š<u8f$GVZdZ$` dE9lKyRPC94`aX' }bQ,!-U2Zj^-)h4۲˂ZGv:n[:5s"{u&6-齟o E8}ɛrڜ#S.jP| g|7U2Zj-sZ@\0x~> L-aAg0 rivI`C*6|@ U@mPHxհ;&56HhnLFGDNBVx鴄%EI@FKEs|iXk`7XWb6Yi-ZMtQ'$=YoN'4޹!54^ GN_Z^޲s|(-F[&$6slЫ.46J:\FNQ uet|z{鋗Mnڨw_vCk^|ETK}@~:h:pDu?EW ƫox3o>_Nco..a` `U+$& NNO8=%ޏ7eVz@k^FKE-1[-I:Co1+4֡`8 5Â*-Ss!'k7Z\ڃ\U"mb7^^`f졗L/=_SFK-NzN^C統`#ͪ1^~Zp#> -=6]N\zݐ[|O|'>p%m)}e'>[+ޜWo+|m_}^BXTHϾQw8tǾi'QT&ZuF954'>Q~I@FKE8 Z0 %;8 e)4uWpۄWqt>.G_۲S"TV -b D7ܘd/*_I@FK-LF-IbZm0+y/1@! 2zȘ۞GS?_6n͇ۡ-PHb͡UUm(a[}T|:Hr-DTܰLXH{+w\=[>]*ƽA᝗# CBQ#z+8-s'hGhhٓsKuFi,i zⵞ\hm^W=w7)u:~ӗ>o/^g7)%w=mX.BDa87&H ȧ:`OR.nՃ< !M-R2Zj7M71Pj'm=2j]/B:~&6΍E 5ÚG,,6l+ؖRdM*$JN%[KM1E%ZlR\7Չ+ y %Wܸ%O=;q n /ίpDf ,qKjD#Zd_IƗ*qe#GEDF qs13㘕S7XW[eebm>HmJ6J.1u&WW_Yd5E|]!UuMJ[ -ҎNJҷ3'EEW#Ϡ|!i*#4R\oz=эZ5eԲ$wZa錀Ji ;o|3e?,F+\j֖Kŵ"W -ؖ9JEl %b1DL,2Wlmq5ܕT#.U1 KlUj1ԞT`X^`\_kssu}?g>݇ Mm&"gYxSU6P'y5wUN[$Dt0⪧x-THm¡jm)%eE -K|.Ҳ_fŖ[cKˊm0’}_QZ^efsjBxZY_[]rQ_e屿|0^5T频~?F`IÊpx:ι 6w hЩE#&5}Ü廏nl.47S -]8o%T\^"&θ|WlW,Ɨ1JĥeqU‰6!N߲mYR%ϗVKJbbT.Ȓ y -O~u+@LȧwX\NEHBTjdjR\Y\Sm>PyϾѷ! RY_۰://,3!;%eI@FK缽A+351i_u_~H܅gKwB/$B;86w< ~N[|OԞ\(KջWqo|ރ7-$ؗZ , m+K]ܡmUiSa݁  -UT~x* +-#u²ab {OKhz,u)P40 -lyv5ZUqRڼm3D+r6%ؠkVUĜm֍+]ߡǒ+ Z|2Z:^PFK-M&v{V`-+pY(%`X(& >ėaY}8~Z`jVZt@d2,r1 p͹V\Y:ʑPh3囀k1`jӠWM3h=%sEM4o-y;bj&ԜRH,' ZC4à~gfgCX -*\۲r'Kl!Pņ?6t^% vE,_H@FK--RѠD<5ip{:J.7;7:[?KJq"'NfWq.В\ĆhnLn7܉A9% K%gb3LUݴ̐\jYg]]Td_5H%xTVNzXKZB+="b*IPDEIBnxiR^Ö"qjR8##FD!iwuZ\Uxm[Jo`R* !6ߴ:F+}ywU)nT^t(a{Љd/OQJ-jh=h?hKtQ*F?;˵|jWAq̬%u ÔZN$jV7oO8X 7\=7\|!uJ -1,\t?,VUv)9΍d?\-2Zj1Mu -7O}Ͽ{}኎?{W˧Zn[us+5߁L4Y# L(oACzax;EVdM)4][pXN\_%.ݯZUXWOpo ) ӔS|P/3*/wu39)tuBP&8Ύ/dO7X bKr!)OoS -MeU֔bcRny R --0R - -])pؾA\ǿq//J5Ʀפf u,-L?Xc 0|vr)`Kݮy]SFKͫ=`72!&qs.MBqNtÂlt^!G?B]o}i=M{f$mV$QMM.# "-{?Y o~n?,tL6Ͱ;F>s?.K^R"nwm֯㶖 (-@7Jj(S)U8O֌% s8TGqeZiRz]B&1׾tyҦ\vS ߿6o ֕8/_2ϼR\]!*x-%% -`mcWS xGuV-+(Э,ҭ ؃E +ڧRA[ߘvB=}˾[]2/wH1/UDha9%\NL˯W2Zj}mO(W* -~Ѡg;[db-r# ,=Y۪H~zꚱ2v<)AXXpKeM/\;&.)wo̺;^u3z^|rSB6=!s;3^nҪ%;kW3ť5qi:fM3eY3)iu[zKe[}AʣVTN=bA %f,|T<ϰ2ϸĶ䃚yڸ}U0+7&Ր ݮ店ƾ2ys~U&eg {Y; 6iDM[ECKvw,FFX8$d hl'CLv^q~}aۼ,="SL>.SpeK!W>Sl]^ClaIf~{Y{hb|{^Mocߜ}sSo~n-~xw߯hI {>GMJqinCLyIqan. бlsҖbɰgMY)DD%&x"- O6⅖],]aӲdel wb3%;ń7>eWC[_ ~2FXzj1uNO7=k^aWKnvq/z-F &: vG߻_L^IJŧ2IYYei%;,swc9rM k?BKnd$-Y: '̈tN {NF8X執, heWS%$-أ{9,q~87KMiI _㘛혵S3g8fA~qaq)v%n=qRXgPޮW1Flǽ#T`.e|9viř凜wggfg:A䈋K4l7&KJII9qkXN[jJOhh7+%Լ]=qSw$c2禋ڋP!;Żs+RK3 Ա{̤ _'Kw?;m;Kv0ߘ}+ӯyu﷼3wȣ~gg/fs37dK2U g*%ykfhR;l_Ke^m٥[Ud6)۹∸ Mx"9>8y6Ւl ߿ t͢,N4Dzxy^k˱M(0gr.M\P nEmI1-6"gdNk>Xw@Aׁ[raE8H~ZMs%._J@FKͰQN(&UqK77 n1ZA;fhinq 2xG`q}^unm~mH 8gx9^1ion74ی 'piϸqc'*+ꔬz։+fi?ҹo<\M1=:ʉ,]4Ӵ`8e'ğDiYٮ@Qvڙa[+ƃALۏ 'i;1KK:gfQ%n;D2 켸g*R<"",=fkEBhC4KyvIo1j,Je#$ I}kVWRj3t3Ǥ5a ~pi-뢸%8 8-5ef4֥ą9"ޡgg8n}QsI ,qq xON[Q16W\6m+6fv|<~Kا_pmn/b@04OPiҹo: -!RcYFx2}6NhiqIǝ4 #ᚕNpgaUstde:<4+b-kE@ -7;`K`>!>W~]o~G.Gr!RB0! -HB -:&]z^ymo7۟{{'OI^KI4I!:ʓkxQg2Z:"m'-f˶8ǢL~n9-!w융AF)NKwaRwPtooři6l?g84ri*4 iU;˱CRfmJ>xmI-˪^^^~о&Z(8!ZW*h}݂Ι=b9qEĹI5_(HOٶD. I7BN ےY*e8au2[aBB,e9*^.iȸW#/G]-z5_8F=LhW,D1gY&`&xVk9\N'뱝(7䥚}>3Wҙc:Z khE('%▀~ރY]Bʦpټ9{wk sn0v[#{.z̄aCBB!" у/ G -Azﳩb)VnD{샧8SU׼ߍN]fh)+JS"vQu'GK?N#埐+4="̔逗-{F=y~E-Vwܧk&τet;Qqw냤] ;۫ \W=|u% ܫKIgUxd RyN :3Rf~'<[Wْ{Ғ,U wlU$6.ʜoOxiT[{E_ضشұʹ KPWےEe,Ne -]+ǿ)V,`\n_zԀX?GLԽLSO)O%~¹뷾KnWhMpד/pzrvfazGim=ɰs%衆sߐOG2Z:5-aY'@Kz!Zq߀J[3Ҭ]yie&Ӷ~垛^  !}^|)3)m)3ɯ_;XB\Y.( -lǼ'6ՉKrT)y-U#5Gu^?)~ӟNz]6Fk'DDx]&ߎB"eThyqKZJ@FK:ZB*ݶbq{94?BIᢻ/~/VX["xar۲|2[J5faUbiE+_bYRhZX`\ZbtbpV8bl1ŖK -WjÞ2= -`,m,`[_dXQ'n*,[pƟ7_Իda]4ڜpIf{pO *8 )_t$ ӑ^s)%Qxv:,ˌ߫c6pycB/~u6hͥM6l2AqQu02r׊2BG|)1Kpbi"KضJJPeeUUWZ_PD1'ͼ|CGvK_zRZcONV)P.X-d\Wn =-Ǫ6lX[jsB *Ĥ|[b/u&gT56O-_@J qybzeƸglH{ǹ]Eڇm!(z6բ7&PJ~T hܷYGKӷVFYKTz4U x -IXTkkĕCڤ5ubbki%đP-*-.-./96LZdTzcVI$n"UEmb` -0̆72=7@T%CW -S`7ĕ{BE(@1D\yX[,b`\hQKALQ!z͸f|Ili-eIhg)>NDw]wk"m&z\x۶2֒ey|nKZ(FhT늭KM7%":hxY`-" -*D4(:NۊU| -v.q ]$tbp(J ,xc ŸRYrȤ{ej LA, -t"wO+DRDCxjoq+"N -TRMPq1ϐbcp zqՐWbT)bShx W./m(bqKbLTJ1 z^"p]4E@h *㯕?f\su?H)&%nϲԃ-I!D9.ڔۼ1aKqJJM|mq}Ę%(b KA0~e -K<[ -7-s8rJ"yEdq$OHBK'9Pp.FKibJH4B_D[}o\ o* τ*렷9Av<Ԃ%2qu $ANՒ#V z_"OJ DWcUW&̂pkw]F5%9N8.}$t -'gu%;RR -I-r-B7ƝząUh)]T)cM0ADdNha) 綏m0t7AQGl@H<~}uCmC7BR]H656\z3BQxf&'RMS{$ -<޺-"nr{☃m,5ƖXbJ-e2"Dm Wc6 ~Ep6؀cT- ŠnǴ2#R r_ͿX:*NJ`'pՊ8DTn@n>-|o'D& je1q9RSJdf]GBK=4ZBj=GK!iC.Ł1p76pA|=xɸpìQ,h!#`K`g -ITEp*%/׸V /C,XrHrRgXnC7eE)V#.m*Aj:ݦ:o)ƧEiad@= &)R߸.GK(̴dYa8.x֧F܁C7<⊍#=Rp؈2$qTTib T0FV#jߴZKT[m\ -$V) 6vkwVZi6+ۜ|KKMv% Gj7ҿ *HO#JhԌchYpb -Kn 3B҉xS*~S^[HPl H˾b)F)U0kt6$tnàV'WXB3ML9W)UE7+oPokʴD^cw]/?< g@j,fRz# s]V%Qn5{r Q),?k"gIoǯIށJy"&rf6?CH7#Z W2 xStJilA: އ5y|=8i}1**[ؼjwŞ[]4胥BTPOFVZJ/u=UGҩɞ?AKTВ%LMQ "Uߵ; vWChqEp##,2 aw\9_Ƽ{HFZn -l\-Vnc=,¸~t]%<'1Dֲ%ApD4Zu31%1 -U۹x/8]vN%VRC%9eձưt{qYC!x_Gnzkg"T@QWJ-SRd9Un(oi7P*,H/7lח ?j m:2i[A- oXkݎ$U(*G*X]EL|ilѫ? "z-KS+du 'm˦^w,㣏h/úF ͢ osĈd!$͆MA֐LCP/v\w+r  -~|7~// gO Ar%Wmj#_g̖?gg;)޷~?_ͼ?}L.qi~~|#` 0eZ@=^ &|TmNGZWc c<6NBK?sO%tJtOO-%Ȅ捇sŕ ڰb1)W?묻{_t'>SO-Yf(,7nA\B9:l2Qm{XcP#e[RbŖ -Jfhqyr-(Xè/.G~E]ߒ-EFL o> E)U"W@tnKVIz# o]֦"\4k˅6Ŧ[kCS`#/T3 - 4Ё2UqɊĖx">wgǾ2|3KΔvoDLw~~[8_no}f ӄs^tMٷXꏏ/ 4bJR塩J -Kt)FJlBM 9$ yV_s[ *qKYrTt8(w-1VɗURP*3ŤQ72,AaMd[sP<:U-@ݧ,|C¸˩KQdwӕw? ݆>GJTgzgQ΢kҰFG/.aau.or/⿋;v@.K=][2%WCR[3](.#cb"y&Rߵ.GK>iƀLKpfZ"dZ !ݾ&t ވM3 4|xCo2uX:4UEhihgQ)؆e)d3-I0'[A %YJO&DBK$ f}l(]X& ۲qhڱLXm6,&=HE/*:gۗ4I5".i'8Zb8,[3_ /GxoL'4Qt£4( -Kn KnRF#_/.^n|jԂϻM|0dj}kMq%{'?y6/ۘ[uTz]).D-:E\_)fR-V;`PxqV''x(=\BK?݅7(x -Oi d#31fXH#&^v$%DĪ(V'^$ 318C ɦ=+$H{TlZ,"Rġz$M!֎ڥ$` -2tʢ7[Q'G&;ZP& -uR׍빓ha8"q-.B2kdIxR~**F"CkqTTm)uNIN;cd](D>0AlxS -M t٠VfP[ެ!܊s5*Dʞ^ZqA#Ζ"@$eAy\OWrO\;^BK]?GLGK"?l).w9 mr`D|m#6%}h]hOSp"P6 -ʙ -T+j$YFNwm5 zJ-o5u&7IQ{(a$uR׍%!vdK78В\=-" i*Mi:?ZbNAB- ?:"omXݕ uR_pW-+o!$YItWg8O:}%&qK% ĔѨ7K3hpd !@?#㠥g%@K2BKW8CַD}yXe&$SXsH1z;_[T_*>_*xMUXTz22;a`1fAʒg2-xJtAcO7 - -u w!zZYnmZ;x>$aM)@f` -rɝ%F剾f?pKB,G "lI3I7I&R,2<\ @^ވ(l:d .(.l=lvni$GKJR' -JC _@MIZD%Ih14Ոmx$j9)UpJP%"  3 O6PoM l،ը#d3Q3hZhrjr)&sx5I]B$E{ZhN8N6 jMЭ9M2Dd$ لObd H1ulk Jkb--ӈ$nk7N)&8Y5]T6890,uX|7gƊ+o{+C<粇 wa*}îK3uyC?qٗ>ٽ'\8^<_=y5DQvb+ÒQN1ñ!$ CBK]=§Kh@$FQ Cx>8E5[[8dU q)))E˚cdI -T>:'BF9D6F` mޖmy;P$^BK]=g)Z|'!qC ǶJXzб^p.) +PpͰLK7~cg~{/t[3_8ն8OݶFl*xב~Xu /aO|}o|v]3#/^ ,xt܉_GWըLRYl:dtC8Γ8s,[:# S>= U/kXINT $~aڭ9}~Ob9PwD*(JGmחcKEDo|XÑGn[W6kQۭ|HPyGa壘͑|ny1^/ ' 8~_saƒl)@Epp&;dGKvtl?;Ҫ6woI: -'*KShWU71ePUW .̇@pk=w>EcD}Ǣ4Ч1}Ð?$<.ۘ=W=?E/ {)sFͺ;Շrpl0Ihz:n AbhzIe^&ǔyB.zFim5l"54u&qnIBK]B$E{Zqh Q+'+ e<䢌GdV?Qڊ} 7 -Kygm|]s6[Q-Jַļl|Fm-Vm)Rm-T3=P5icNm|Z[ZvO0|0x9W_z+#6p8?A#v2<9hJhgz>d]iOsH?"1ƐfF.so/~eaQ׋kQSc. u%(l a <YNDgI16|;Eb}tob -J (ч6o/m+l/QomL,zFκ2z%㰹It],q]H$zh @,!@H94υ s~\ͯY|z0teļvt#!Fr5cl)_b eBe쑖-4l),S&w{ϼR;r Y -qrq1uV6X"N*<ų_BK]yd]8Z-l⋌MJ6YcuJCGm!8d ^4:Δ;-B(EVbĸJ,[L)TWf/7+ǕcU V46r;ezW6rrbrɊN,Ď]"N*ԥ_BK]:GKm}pW -MW Z̴ݰ\GS#$Jq嶸 -KLP??j$ e }h (ԺZ1F$ 'Ƞ*1B9xBW*E্EHY2y7(@[*8GJG-"%t6V@RmnO֮n6a̵<ʽ;H,DֈʭPEeM"ADAaƱQir#*i{4.}deJf)~U\rC\v=*'νlݩe9 ni$yyw᪒R >ђ7I"̼#8I -5ab n\+n ͠|..0B\ -":lIK\0qTf( -ERmbdQj#,@N@hO%0OAG_k,{ -C&U"%/6=gOg"hHhvҪ[@6@irSuHЗ¨kVD6#]J1HF VD6Պ[u"ޣArHN&0&8D }šGKha7!dT a]Mh1 -^d\WM -'rr̭?P'|Y!!OtZY}p -u=Wa]LaХہ~m+"(#b1OX9eb(,e6ALpҶIU==tVUjT#g|)Bl"sH)B=W!ebCLvC|A:u_Zk$uVh`Ok= -! Z8AlRL=_fŮzqW |ĔsZ75[ĸ懕hA#~5t3+S:n *q3L؁*nq!E-da $$ԉrV{Y#Ztf}bW@Io}2+:T%dֳT/O?.-Y3cc둔)K Pךգgk۷华1iI3dZ$uaxJSLtC IyGXEIҖ"J&I`K&8-"_ķ"A? Yh 7A7tZ ` 2"$i#7獸c-9"8ERt%qTAh R)X(4pKTe\5FKұYGx{Z -lƛ)KB -}.|iU6"Tf_v@6 ve kC!Ttȗ)$P$.Wʊ5xW̠{3(p '09 -f,YFS ui& Mj)\*5Єd5i#e#ث`#h1Qx̀Zډ/c3!%>>@?k֕jdЇDAʰT#B%^6¸%SHR#4IzLքYni!\1&C\{C "Lc;kW,ZiR&n+2ƕh[4bhlkX7j>LJ>uל HjrTO n@Au8/!'͍ -l\f%g?iٷ!;d +'GL(1.O" b$z$eCVaոHhBSLEJO6G\#}:&61qRESH):.^;-$쟌=MGeRN%?^r<}*cHG6rq?u"% )'KdP6Ԋ<ȀE5  x7hQr oD,j1 F64LD5۠E!Y)"8^'ق,"aao\'rD -k0I.[Z겡=aVZ33TUNn*W'j%WKK"e6jJ#([(rij"Mo9 a -LV }.!DlT#Z;fZϲ -'QnS7 xE4r -lU8D4*6UŔW-^jBjB]D o(̭ԑ= 63 )f+W?YU^W>&Yp˻~+v'lMz$M+BBK4zV֪=dSzST/Y!.O'0OCӪC'D B.n0$W K4A9bH922iEO:40LUI6%T5k@RGCfd6TZ9R -3Q-Rl+vC[ -AkOS9OTlgXq͈>Tr0iᥡK9Bʭ yjdcCJ|dHqdERnXn>nCZKx#2On"E -ZtPl@'9:DJLt/Eau.so^Z3H4E )؋YX\[ҵ!.9_>VR\+v- L#'$$@Xd~K>l7}͛[3۪d`)+S Rn)%ԃs:,=MI{?䯑׿,LV=2GqF(]hC*\Q6V_b&2UY@`߂r@SQN]p%DWh<=EW$5nG{~/loB}\軧%+%8II/.%ZDV2/}e"㎈+*ݣ'HaL2'8( SiDAJCĠDЗ -"tp -؈&u[˰I6F!FaD}2M@" S 0ņ~|Huʡᙛ^+6;sZA*qG^bqR:!O͆"m|*7 4>ȒK|ԍ/AaԗqL5J̄'nt6:qKr5wJBKݴ"$Mݭa~KȚ(ZKzO]xe0׼zOch."@Oؿlz?)6ղ)^/$OI)l4[{I&-A~Rm45#Ӂ KP!9<~}{kF0!?skދ˞V"72UR#4] } ߢJ2`(]DSbr3TarxFq=P&br`Ѳ|w;{o~oՠO pil -* E|X NzV|+y% -uTR %F]V/tѵ]9 SL)6e?'[Qhu-kkvHܴw$` }ebpRLJSw%0Z_YפCrH;  z6|hY2Ow#rΐ&7#oz}w1ڧz_t/-MeϾk-/YТW.zcmҺo/zw:/KRU?K`==  Aai Mx::0Y៨RwH.˶1]9NpUj5yh6oVh`OkTftz-zE7흹v?5߼1V&HlJn\0T;Nv8~ 7YD7x;jeU'|Hud;В%<٢ED*|"94[^н7l'  7yaˏ;Vj\dސo@[Zj†7GhLPb#"r -vQo,0Ѣn~~[s [pMąW?~k?g,CD[d IQi[aX'!om(]\Amk3e^ -h)$U I*S"C?]狞3,k2-qs(͊ayOI,xuӚTu@a}~2mTtNx*(%Px1C]L-yz?4ṟ.|uxg\7/Ÿ[=oȈPEȚCd-arLmti:bd=`\r gM2kJ[8 -uRj5)3:VN+,{/Fp-}8݅dSce-z;AҝKRlɷg7 -BH})@'%vteWtCXz44jb 2ڤɓ4ZHbOѯ"}z׌; -g /vuo/μ_X|?/h^U~{k}/TQ׽v݂7{\ L.x'ļ/EeiYT'A'&I _fWxy[Z꾹.vG!V<0X,[yK9$YjoCX6R"ٍe6QLcLLᓀdJ)xy_.k M-ehfdZB' -gG*<"2@KAɊpxA% :̈́z++5 KG#3@5 J|FWhȕ@|*[@tmH6HDELRC3Q`#°4pHpW҇u xbDg8E%ޭؚ+\-% ]6$ԥ{:7YbڪPu=nJ-P2&`ԁ׿X1En/0+z>{qqJ7nOjz&$a,=fk͙ltr}7;ZK7AWlCK}gl?T!|Fnho NRfZ#u>>.njWzO~wǻ׾,깥__y;>7{+涷>/Vﮅ/׆<1%"M(Ln͞:|"M~麵&@%X8ZP7iܺI6΀Z;0; )3jԡU 3h3CQU՝s@Q+a&uxΌ`%h n-\tZ+LV(I3Y?K;HME%ٮqiC}R+xRw/LX\'T* ;EGcǨrJ%}ӷUv=$xOh>BX"G )/odP-vDPT1h-ҙpi!n?=389y9a.!,-!7䥕.RS t8u/{{Nh 2 -)h޹{JRϙZ9TfFYgbFmG"qD|Pܛ3r2ڶ@KĝB5J"@Vejdx$ҵZ:UlGBKgWoiC-ȷ"Y r[|eon-4MLP)6Q^V"/opK;eɖ@d?Yz(_i]3& VgkՙCD1._U -^h O(zh:zi.s/NՙX-+mV3/B+k2t~sEnx3vgZlsGİ\ͭYşfE6"6:Ub?Kc9% -y#vʐ1:i4j*Vie$|cjlcH&0QaLL2ȚbIf-(dϬ2As`D|R֏\e|KyخZ:n8lj50hiQ這&1~eȦ=,xO7G/Cܖ!S PsH6,e4آ@eWOLc[e0 :dd#%d~KDDI7IhߏYCB)NDYj-wԪVGx-wW+ -W-kMQjNƤc`FJHsC$¥1bLT* %A%*'ĝk.ABK]3WJ3*e /gɐI"̋\z Rgx=Ͻ>b}̠ <ƭć|=nLk\~2t_yaUlJņMӚ ӂ6 NFAp -$/:z%ԣoOw`ZZ>WH2\J qG1nθo7}V$?TX>i]bslxr]n;\[|%t< "G$YQ'j }.س])Rw=NvΠ zmk36ڠ/Y Z$LpguFg$۟~+eܫ\:oE {.~7̼9tSΗB`!.ul KxIΠӝ*y,8Z"Dqdl2P"$ZXA&@ -?S2Gg\sw ]yw/}?3w۲[3S{Fݺ ߘD%󝮣M q9uѯ$3u%s)<+%Fc))ސf5["b:.XFf@)bQq=&n:Cw}o"䠵)} "8yfՉ9+>Zf $)nYH 9& 0!vEg :FgrIO~ϻ>f !Oy ~C']|C nT>!.hV'5 -e"s/N8/ٝ(Ř=P=Qq Q ac.ylrx>>7N - @٦:*0HhOJgZ꺱=SzpF/~IjDJ,Pbl*` USM Lao.`:;6]<&>Q͹%^8tq=P^ - A_(IF'o:ҫF@BK]5gkm^ -hAF,cԞ#V)JOdQ6E-=Z&qK]9%ԕ{q?!tʤf7j[/DYDF~^oT;gy/{ZR:beX]Vꂫ]%&a -p^BKg˝*F>ylG(&Dh)(Ŋ3RH *q ؕIh'z϶%tt=Z:M.VBKkRWֿζ;zGBKiϥJh\]}Z>vGOHh4 tX -KwUBK]=g[Z:i -?+snwJhGl_BKg=M#4a%t.V -umS\= rfք [RgJL10[Oѡ.^lb6QwL%)@\ -uK;Ĥ8i.ҩs-Y]ר>A}a'IfSz5ԨǏGuc|K];%Ե+`+Zܕz3ٌo)E#}ŀ(kHFJq#sryd%څeIdf|SĘT=bZiTj^_OzuHh햠_LBh)`ravGROa -uKђbxYEQZh[fͲ*g=.;%'‘o?Ɉ|K-kD- ӛ)7‰V}RW/-I |1d1k~2-פuϱMz -uRw9x<S i FBK&٤[IC!i6%TCqh*$Q -M*041JFS25ZLU2QtZꦁ>k-q&hkAZMr'Tn)Ai<AY)׍TBK8l(M<-TEsy[y+<eUiMYPen 8*]@'dh]9EXDK. -urd@a+ S :U$/Myf g)T[ ,.b$=TbQ-+SM˓V52 Q=o 6.[ZhWqKب:+8וs^BK]9gcD,YU}޷W:(?S@wAoI؂l,q=Y%#~?h%g䄕V3%hp@KE63@!WM|%gQv#{ՖSCEk/۾=^tף]}|cԪTlt՛kJ5YRM!)4OAwY5GI*q'٨7]o=D5+7Sp60u}b;Ū4zQF%{asYn+z혹/wKξbl2hm3ǿi.@\fK\V%Sm8C: otz%GK&TU;0x?؃=h,ovs<.(^ᙂ;>Yϓym9O~E$'|q1<3o{lOvi>XuC2.U巷)$dSH50nO~!ʤ^lqU"M\)NKA2 p02`>)W&#zI`\>kĀ414C H6= 2Cy/^xg҄Wl螶p C/,pLӉE঻mgɝIKBK=gZ`~âc]ϥA1_YG`RS@rcT:*蟬 ?5S -^' $pL:4‘ QJ;'2[FB E'x8 K x&%;R{fGpS - @Z2s Z xrd5n| -Gﱍ-!$?GKKOQpUk rŢwcתּ ˒ +Š,1"O $+m-3] ̒ɢ_mm~S~kI&&[Gѩ͇u>y%7zҬV۪i1C[}x7;"#eZbqLZB>%DILD=Bw$  -{;~N]1d%4=^Ym}g̿JbUE'DL e&/p9(]fHhm.khwjVHXc9~sWfMCmQֈ-Z6%6l8Xɪ 3>|s4:Vtpf[9hFT:oBƣw=8kv>BKNXn-u:p؂hIKpڜ[;|s>N ׅf9aY'g_8[oŒCuiqiF͡ MQڸkD!<eD 2!i'QQ9b`q>o6 Q M5!JТlq9>.W SsEu q)q;?\s|W-z⭝{9,iZL<5hhnhDsF$nS TRIRH: rO8Kvsa':-qRd?FIc dC{F/s}^yOo9胁DM_ֺ9Kv:p_iYCT":]6*cҔqtUt"Zv.@ Z[TOk]lβ^vC=[2wnJn䧎J0tF6 QطQ#ǬmR;ryrPv:_Z:+oɠt!ZŠHOƸ\zSJQ<\'?t˘?ĮpC:.Mr.`DtdeXX*"i-0I 3@&'thxsc+!t(T]L _ڊC腥q cA/Gg5CrCN ض{6[?8tĹ[S=yQh5wtekG5vr@fU?-qzAtx Mmq_TC(>Fj5+4j1EM(k\_zmO9I9k;~z/|7~Ǿ_KܜYW{?XM}&%~/~t3oO_p C& C'MkzX_ܤiм 2UӮ -`ǯ`"u{3c7x8v W|wgs+3zZb*e֢mSF&rX*~"n#oT1{wP>,Pe|rԦu- PVA -oHY+O|xσTJOiFWqQNww٪آcJ)NDUJrPャZ>whvq rޞE#h;ɡ%>oڸ%-u95ph-?U"H@2M^Ezݤ&5Rh S}Vn2:u~q.Y|yS^v/vuw_pýc,}>X2qج+pL)_˗FoĴ*ROn4()t )Kb3 9f@Z=,c֌@ro>p8RϿGr]-G=f*}NFѪ6EVbIiތW.Xp0`ˈCϟvͽ}<ޏKBwB{ge[D}ᇸAf' ć -;`7?=RӮr6C??9h&3AatJJՠ;6How-u"[&NAKܿEq=Zb {Bw9z*ϧ7fY:.It~K . .,!sR+Uߐ7&loLI(3Jj5@h\'MLqцڠ9̔]h3QRf gZ2r}hԀcQGK):NhM"Ϛ_w%ZKa -BP,֌!via4MT5EQkFʒVXU!>v>Xx,dуȜqo 㱋oշbgՏ|Uqv%T*LVh}j\ ub@CYmFVm=*: h6g tĵm5L[:ӏ9}W-l;ӧšR;e@ Af,*4㰓FCa&,F`XZ9g-1 4:%ZGn7 JBnY8N!L#{$? `('Nwa|3g9&6` A%izLBis'?-Β=Pdf9ιkh-:8U+ZHgx;-hp2rB`0c -?15u:{r_f ?Dyfߠ%,z۳eVc 2u 53jжyj&0{\xt`AJ#IS5 a8jzp?@`sD`5r+],Aۊ(L헺IYd=!5s^r% ZC čc(7V8n% ЃtMԨԜ2@ӑݪQNG#f;@vL>pa_-uhFbEX Eo`)!IfU@GxlJiIiDCNQnЉJ;2ZBKg BdP˱7u$aύi7#Z#3 69]G5 ^,2Ɣp=.R_輰"9)Unqx?zhxڵ߹PvcG"V, ekÑyM G0i"vھJ_`*srFa[[ -BWGڏ "ԖsWOwl18.}+D(t\1DʑM1qB%6UEzb |tmШn~^{{k^|-GfUs9rK%!nB/ϠMq$\ВT',{F$·F,=XfZjYŞ-1  99^}*'ʙ?$T%R>*@#V0906sS݆M3FMhIeyiY핲t8a lF&ڟJhԍ-x} 5`͘L5 -V7M&f ȇ X6Y"6I"a^Q -P/qL74\r LO'zg4ZC˟QH&uiYҞ&Q[W9zؘFpߙ;K^~gm;wu- -,##u^0w2 ѧ8cdejh?~"GfF۷og5;U-U%UzEc#V;?\صyN[ߕWh8/ <V$Fm!z'TB/7ŭ2pk0ڈ+xb8WQP0-8{788LMr ܳ`@x7Zb]遱Zچ{ŵ?%pE-T9q˭z -U1Vݯ'@ xx4I(^ѠRvRBi⭗^R1x2Zr`m:uQ鸂ˀ$]<=?=z,vUtjМXs%*n/ -%U‚I1;!pԱOsK d0sh,$‚aÆa@/H@=BhEcV5}[/> - ol/^5=lfuk[&y -u -:9NѐnLXX4 1S^_F|:I!v%?e ?kz2)Y#%#? 07&:f@xIDSy5,1 af<g;0b)qRhmu&]!SF.K;2l -)5|`7\:Z]dW)b\ ^K -,؆ݏ?$P!˜?_^ ;p ovW,~ -'gΚS^LмPcKY]q ٟo(Frן0#FaY!ldwxw`Ƹ7_{R)$f;e`b6Ic+:ܞ!8YHhߏa{U^YYR. z#Fyb Jz]|:#AȑFyyӢ K7)wl. Rta3xb&R)xgff*,,}NZ|B%y."'5 rҬSO60`1zY$hQv@A ;QЇz*G/}lOyNU7bh &91 6\m1}{ojo4pU41Ʀi[*nڴ=򗰜|dP!WM-bkQ#_*\7 G>/roECҷ\N pzýwh1LUm_J5ٹq^".PW-SШAW~Y\Ԃg\kh7)h5-5WHNѮ`gߖ~dT+/d'Z8 \TZ ܎dX8 -n}~Om;ii*=b`UM!ZksR0E -}zX 7cQBo,\mâeѨk=yn'8ӁnOd|CbI[yЙ.Z%kdGKj|'g -¨3iC ]t K6]u! D~]5u|怢k" -n0T.<&ia %i6#?|IS1RB_t*H^2jk 1 - -GnԱs&HԷBiWʫGo K}޳0980jjScb_rc#n6mu $tƉ~oVkU -:ƵkEz¬F0>QQlI!J,y9r\7M6g':Z -Շ$uZ FfTN:ֆF(HہAЋOx䳨._݄UR d3b,:k&㾁T BWOZ@* g;T""9؀BHq`2%kͭthGN:wI&DRu -7@b_F2rqUF#xo4) -M:š"w@r""|%R-c -yoJ.ZEc急Q2⃥Fh~g(~tf_cK~ב$~^w-%L+=8iBKB# "x¤f"X }3tq[Rih>>>]| Fm>o|Na7x,9d)/0/osO8RGʂ9#:ΩUByϢjn.{[z #{,-=8v+@f{QTYq7 +$b;{~ ։ʋ&OvѬ5b֖5UpNg('&21曮C߯#(sJ\}GU(d3Z$+ZB Y uŊ˖-ҫ9;%%ҒUM?$c<^{(6joiu[>M" 2ej@MrWk4XRD+`m]>zGbV^8 ϿX,my ѻ v;|eEyտ ~c0f]C\g ?d퍷zq7zN>JfsS*wUC nAuS15U?`{lnŽ'4Gad&QW{Vg_YI5Q')Cx=K&wC?Ͽ&bfY2-^z{uNO5N -*f-` QpY G 0/ДRUgK .Tv s>c["gp۹b]G? -n^ߋ' -SUOrS]sܼf~J$$S EUޜM-iqPUTrh޸Kz >;t?Ѫϫ =IȟzfZ*o5~}KӫJU+DJrʟKErp%9=kŖ -n#_"Da>Li$[zEa 4ԚoJ:pbaATXB|hD Qsm -,y9Xz<A0ճg%Gq# DanE)S,lxɖ㑋Ͽ ^ٜ|s7eQ<߽-u[5)s:j¦KKyd]vRZ")֫|g0d- -19bG%~A澄ĿA|ρQLj_\9U'xkX0uޑ(rXq[reU7@U"Wk7a`Շ1*SF]SS$ZT%s3KxŊ# @DYN^4Vlm֜K%'^J8 *g<,ݔD~W︕+/O~ރ\qEl]>3}V?2,&CKy7>qb/;yևSyƽ7N\ U%/o3j}"X_4oaF3dEVJt!拆2%FaΝxK HTm׋׃mj#7_ -)Lwqo}\B˪~5:M~^€DK& S<ј 4'noV4^TX6d0`x^iIj,;W?YڰqΰATꔭGޯ?8t0x>IdyJI6nD\)_C1uɣ!=&wI$BLԱđ,B}ۑbwy7.*>#V}ƃF۞x1,e2V~ TTwqxlqU @jと/aМ퇩 _Y~ʌeBA\ޔcG(!'tW祏uXoR䔻y[OÉ4dR@Rq)Ve#/zn͗O=W{\Mp2 HM>8UsMh Cʧ\p}HEcUrPVc#njmk tb_x$Qspa/,A8@٬* ^#ݞr.X.ȧVim"vphXvq'O -lXz%P,[v@~Z^&1j!h.)db' C.OjQ[ JtcA'G^N+.8n1TՀm)hX[znVɜxp_m!B `((6oӸoK8m\%Va<4[\;B! ۓqN3kBa}C` 0*>\U_{N IaO GěcFYXABDxmUM ;JCڢ޻}O1a׏ý/ .h4uwg^[6*>\ϤKktau{pEuM \JEhfQI\&VPl2--UM4oohQ c --vQkOCj$ꛗ|4qp212U=FƖ{nW.1gk`J>raPR%![J! <֨#d;9C퀩<9***;PV{~suYhLV3b:ʁMrHc}#$1QYZ0VFè=t ,~AuʍGh὿ J^z{)fFѤ+;pvϺ -sğdѰ?F>2jS# Zppav~&bƀtKz. ?(tK,QF5!;7'<̬@(aezf)U cp%G/y |ɧ_~]c[\+ O"9 KŒUSBK5JBB%PCzM@K ٳlWZTa-c{ .W2Dcړ{JϹhRqAEw sZEcN2Z[2iL/I ]F_| .\TUOMxW5i0QӎB[&m)~ق)1[ %A1j0AYw^eԗ -ĹՐqE,9p ADvu$ -`1lZ0} -xfqn(Kaaao6 J2 dPZbW}Ex'b!7fN,MK- J͕GN=~g<٪xx[C]_3rZJ ɬ3?ت* LznDo>:|# Z_s˚+ r0:`a<'}\|~O7ʠ>H7BDa|bQx9zF(3 ^23Ry=f-AЇzFE -'􇊢7~0+("p_8t98{>pzV3d.[r}`1K˵p<+#-bh ?h F0{ҵsooBa lBcCK2mwn".x}X%ˇjpVXUZyTJ ^ɩ IʖM>AQ2}S8V.Y@|p =Z7Spj\#E6B>j1F蒫3-0sxBs{Ҽ[!aI%//xN2 -CKWHgL6V&.{A F/Qx:sMJ$^LGK & +\;P|>&(d=-yWcH֮%*Za4ʩ2dpI36#maf]crʅ\g%#.&7ۡ7R1c5n9"ތ猿`͇@]|k7BWp¥ՙU!:*<T^=yPMTioXm7i6Z${/AQ#(ZSZQ*,,zRp0븑9+XTCܖPŋ;%ACd&aG&zoKȏ{ /~-d SP"qO޲hK^ۂU=pHY%ڃ_}t:f#CT g]9b*t*M}%쑕QZE\% UWN'Gp \ᢡ{Eyy?8'ʡ랽2<z-19q\.(LrCHBSΞ97n~5ACx9xI!{ʧo`p-4XGn(MeU`&#LZBK\ 4#"?-a -CMpbM([bZDzC^RPJE1O!d.ZgF04&yϷ<F^z%wC47]LadeA'|r%`)ΰ;Hp  ?us$_8,i`Dya9: kZ0hc"i-1uڐ$QB3k4)5sE%ve߁}+\Si1?{(LHQ\ - .IźSNw=$d5o:$iYf=Zbg{ L7g24^Qo [֫wtVf_v u!64n_"+%hFD >e{'؃Cz{SzaCV9H5FMYkKdHa ?=%ukkzS=ۣ%BTNr`ȫN Ɩ-MQ^vġȑq)9 :Ꮥmya]%;H(-,X폿|,sɮ7Z\Xva>Gv)9Sc]ìBGj>Ӳ+-qH=Ywc4=ٺ oA݄8[ʿ#.$=6{0Ln]Q VuuHl$:!GT]>ra`qq-σ pہ -f0C#~D]λr"4zi)Ɍ SV%㇌{[zRs(eƐz^UյpZNr&G8pM_\5 Ͽ=t: <X矾j_g2gs\=/ھPi[mW4!O=RC)mbӌq ʆZW¯zij+YKfZC~Xtֻm?bQTF ia܄AaZK}l|G@&cĖ5w6<=Ͼ!rն7+kn5ha5&JQ#j[v a\>0;"Yi/x;܄g*ʁ>XBKJf?23|/a*\ln~SU_j2{:DҰxF8f_k=l@aTiAv*끖x1ϼT}4o]8)|{{ 1_̊O|ޞyQOb?vDCa!'e#]ːHIzM=~}c~x(M( -O - 6TLp&\x bTWPJ%0hN<ohħKi$6a@6KW%tE'fkVTM3A+q2;HV&nhnΆ k\9h6Gj%\Ph5=ypP_}CJ){yͽV -iZ:$HZ`#n)t6ĢLq=[ba᱒u-ZQX[LU9sǏuQoF#G9L{pK. `c2&fdt1@IKOCvPjuY,=䉘(H+A%c嗏j3o֥UQU+{ -$vp/Z2Q@1׾_PcJR \v"I13rYE5KSU?^/|#9 a.L]y xMMEڢ݅O? $DDmyp<9cjcx1 9*UuO__nނ+ܤO~^{d;rr)4 8oa|V>uy.m_9fr[|$&`"ywߘE[/?0GPxŵXَrWV) /j2Ӕ妜?pp5!3=f55Ԫr2)2)?=Na¢|g\oa/gEԙU:4FL!L)%!`xPsR{Mz0)Q&?؁ -S*{+=FnQ2Ge * uHě>߯XUQSH:s-^z6 xYeG -[,_08õCqDwI}_ݸ:ok1P(- {u+eRZx⠌Gd^ȊqFs۝jTV=E{)`?8' 2zbcDwДy:՗885"0ǟySIwOîPa -z^ E )E-"I]5?-yH0D02-_`^/p{Vq/]w^ӦΪAZ3rޭB߾@cyʈ1{ EKGCQ,~nx$ ݅Q=#fK]hHڻOx#)P2P^0Nh 6GD<=}2{p2QbK_% Ct -ܮ"C_ g+V6Av蔵SF1"v[C_Ie"Y"L^G q0zLq";N\_pNY$TjX3/x XjQ^^]{3 -X>M'EX^yKpGk<Ɯ <صۜyı[#bA.yK3ĝHSjી*@RcߦM2mWfn9,dT\emG(pm_X]׎瑙GRyLW ||۠ry#\Q:s`Atl5I=0@) N<\ȠUjQk':Ϥj,1,$wG!n!zn$:>]mAe][eWA{` p}K\)aG*Q>s.˯׫%滖/_2-(Ϩ59A)V$]1Ie@4(u+"jT:;r`bS9|=tplde{/vٰ M8^s8^˜AP"T$.krU]ueC\|%sO$o67>~g_Ē"ж?d' -25ѬhGq&n8ĉ6n 1Hُ,q@N+H*uiN ψm|3uװQTFBJlވޅ S]-(]D0,&̍B<"OAmDŴ:*kB̔"1y`=)ٺaRSN9tڪn,JEBOzvX>)Efz 8΍ȋ S;\f,Ҍ3T0Lj#2kEɐս nL^Nl wr@򰪳 -=!FBL!MxBO\ Mfr+u٘43"$ E'"QV$6"$ 'լD7!H߄Q還K(\Q]THVycf'i:*zSW^RZT{L'#48ki,1C&Њ S -!϶`L2[0)J{QP aXoa1uY, .8OeBnBD룂a%%o.P=!IJ7D/~E CPxx(c)33aK8Z\}򳠟P']zCaH#ڼ׀ }M:GʼnPk° B8O' :-׸A,x u7QEJs+I G9p@̯} ~Ą;z$JKοxg:ƌJ#=⍑gK1n(*AֽIHt9_/J .LxBp|U~+f 囥IKۯv{٫|=\ BY5V\Si|%(~h z?=G$/`6 ʔOdO'TDZZI ċ]%\aD&;,&?赘1Qm - ImNcAh*jb|^/72(._ -LS#BGGWBK>6EaR~Zi@:P/= 3nm%3~ڂ6<57B!%vISyX)NCI)ud>ƿ%K1f/rh IHyeQB%F" -'<{hPF Rk|UZh@%u+p!bji<U0PlaeT4q&$a7>hOB/L*hnvDqQυhu3r')+j5CVcSx.y;EV%b8$JʷtK䮽tz=Ǥ$l FƤIRADLaЁb57LKMS,tZlfW (,_6, nHS2H*4)MI*0^rKN/±  V!L3r@)p,,JVEř=j9UA(:Ȥ"s3\JAR\\Ĺb!J pZՓ49t-%Tay3%~ɎODrINxK7lpn~`"͋ JD(<U dA)X6`LIF И#=:IB|BnOծԷ6Law%F^=>v/ծ=3-q/o-b3櫽^͠״6c6+,2WgS6),Vƪ:=:*6+f(f+zg ƚ $#V [0bT0} @\eҙ6LBl{3E -hn -Μ( -,E)1ppJ#cF="O؍-|TʔIc+TVt-:. -r Ҙ1hԔ<_PSaHZˆE@B ?9m"M$YmZ bّ7A1A{U#3+q6Bނ1q" cqGĖGbN a3BO-`%0LiUi8+\kEJĶA.{(lwLg4/pvK%G -30 m` -Ԃk - ØjE&NxD yfDJJMd#ojdꥅLk^G<Ң31 !6I>^ ?h LQ{R]_bR2cGXagONTj%&9BM"̊ -E/Dm}%@z^~Ž$TI%򘼰mxBP)L&B*jvB'֎D^_*$̑-Mv0GH5scU| iB0 -VBpdRV5p;S JI%6R,0 -O=`;G%IطĹ={.( `iΞATꙉ:\}'w/dw6'g>vX=vك#>hܾؒo2? ~.%p,-vᐫM)qz8;O&v8 , -z柰c'`?; 8ǡ>2؟sOgoCvaAʯ">b2%f73W0œ^ ' -4zmӀ} }R9m^d?v[$<:7>cqNߣwNJStWPfL<ǖ٠!AyhA@ VtPBe7SU `0@i(N ~ -ٗE[87rE!`,A` -hz\# LC2kpy!0(V+ (cXpRT[ߒMhg h,:Q+~`вx1|Y8;GRN9S9Q?e;+xLp%"GoӤدV0a-lNp ,rNI)pkW*TrY:)̥6L% -svҊAb,@Kꭓ[3y$tz^;݈?ΰ;{.\pt qjS9uA?+$1b >#p;wΕy:UPPfs^-u{\%oyf?i e̘l;2dv:0s@8,=p#"unǨv}ա9Je؇{KBKm.Z=Z:w@:4tb$ԉvF@S5Z:U#)#40ZA!4G9!4gHh YҩJ#pΞ{)]4Hh%J#F@BK=Hg$4' -ICiNHh4 tHi# :rF_I?F@ -uKǓF@i 4gHh YҩJ#pΞ{)]4Hh%J# 4H# V -endstream -endobj -1784 0 obj << -/D [1782 0 R /XYZ 98.895 747.976 null] ->> endobj -578 0 obj << -/D [1782 0 R /XYZ 99.895 717.021 null] ->> endobj -582 0 obj << -/D [1782 0 R /XYZ 99.895 524.198 null] ->> endobj -1785 0 obj << -/D [1782 0 R /XYZ 216.155 206.552 null] ->> endobj -1781 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R >> -/XObject << /Im5 1780 0 R >> -/ProcSet [ /PDF /Text /ImageC ] ->> endobj -1793 0 obj << -/Length 1815 -/Filter /FlateDecode ->> -stream -xX[o6~ϯ(IiI{@uIɒkJIw%Y}X_b<\1ۣߖGs[N"?Y&<$p<.`gNb^h|?;wm>˳v; {wrvuuM囷7'V%<FM׷># -drۚJ!eg a5xZ߁exܖƦ:Wx6d*K*#byQy[=ZdUCڒ.hCeqol iUIU~¾kvVVxk P*RfI u)yydh>B5ewDB<4DdVƬܸ֕B'}F;bI5YTekO񁗥A.\tX282p^!YfY9_avO%}e4 ?ψ:R2c=uDNv3.n~V1>`Y lv:߀jJC,*N;_kJK#Ԩ1Ψ~@ mXksɀj MˈK/<ʞ@ 5xBVwtvrRZi;[Q;v״逺n3 iJ O+*-0† z"Q6OVZ")b:֐簥i{05fi^\}DjU6Iho` T8,H"ژ^˰ I\)m>dLnV -{a- 1 `Ђ9䠄 mY- zM5Fx@D*!&%8GA5cc k%x Uij$0G&~mq;TaTx6C׼9`MvX\[d'/#r9@_1|6Vh!t$*#Qq%6;V+[gI_ᰡt0⦩cF*Ffj=>ื<к# !Ͷ~) -i4EF ](®fIz UϪmfZaҰ/2 >5,S5GJbOɇuN#Y6-1sӥa$8xtT@RS#^)g;FOHRp?WCSR|-3M}\4jw_Iͦ*y+QQo/"[<:gtylJvV۲Lߥ:clv>l qql7Ee:gnr9I]u 7 -]WE.H< 7ˣ, -endstream -endobj -1792 0 obj << -/Type /Page -/Contents 1793 0 R -/Resources 1791 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1775 0 R -/Annots [ 1786 0 R 1787 0 R 1788 0 R 1789 0 R 1790 0 R ] ->> endobj -1786 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [431.401 622.657 516.094 634.657] -/Subtype/Link/A<> ->> endobj -1787 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [253.041 602.198 337.733 614.272] -/Subtype/Link/A<> ->> endobj -1788 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [254.147 581.813 333.459 593.888] -/Subtype/Link/A<> ->> endobj -1789 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [221.659 561.728 277.39 573.503] -/Subtype/Link/A<> ->> endobj -1790 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [220.715 489.184 227.49 500.312] -/A << /S /GoTo /D (chapter.1) >> ->> endobj -1794 0 obj << -/D [1792 0 R /XYZ 149.705 747.976 null] ->> endobj -586 0 obj << -/D [1792 0 R /XYZ 150.705 717.021 null] ->> endobj -1795 0 obj << -/D [1792 0 R /XYZ 150.705 529.319 null] ->> endobj -1796 0 obj << -/D [1792 0 R /XYZ 150.705 472.964 null] ->> endobj -1797 0 obj << -/D [1792 0 R /XYZ 150.705 452.58 null] ->> endobj -1798 0 obj << -/D [1792 0 R /XYZ 150.705 430.088 null] ->> endobj -1799 0 obj << -/D [1792 0 R /XYZ 150.705 354.247 null] ->> endobj -1791 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R /F35 1275 0 R /F14 613 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1803 0 obj << -/Length 1695 -/Filter /FlateDecode ->> -stream -xXs6 ~_=h\w[tlk[=Ȓk%O@P$+Yo^b!~[8W߮.nP\2X6 xEܑbJ .en~}w˖Za+ 7o,߇kXsrA~|68|92 x Х5WqqȞ?TaƻjItnl!}cfMR6h >6naE>6/ilw_-mp/,uoP\ ѩw: 1 -^]{},>ؾIc G֖kI-0$.dyC,!qJFwy8d荬B}8"JmN4N, -!WD$-oZM`7s?>O -PݔsxЮ0ItS`ЙUb\&8:8b[5A]hBv@NtH" -Ngf%9  -G.+u3FNH+كiɤ3 /PSϣi7A4BAㅧ~T#f |K"CC-ϘV:z:>n6: Bײ8/I|Xvk;~jc]q3e{XJzTxH -%Ubxӌn?!m3]tkMW7ĉ=wҤ;H07iSd6]W*hzpu=v -Xvf]Q#- -Nqs3 zk JִuG蜣~y,w¢zISM#8-OZ9KnuށYpD2uHBm^CJ1pwuuG.+4$tsbm=)p[5n7I|wp{l#j`'.lcGi" 7P(5h - w7%!HsRr fح<{ -_p)zO.ךM2iW̑_{'Y=b'*7ֿ)=?5o8.]*]O?M}% 'DP }632$m $mDQDOVQTP=7|Exӣ'e6bA#V!xܿL^S'uF y6B+SJx.]_ 8ۆbP?A8i)܈}@<:v؆@ V'q`Lk4S/wzg;1ʤ4t]_F,9(,Pz*?|}\Y -endstream -endobj -1802 0 obj << -/Type /Page -/Contents 1803 0 R -/Resources 1801 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1775 0 R ->> endobj -1804 0 obj << -/D [1802 0 R /XYZ 98.895 747.976 null] ->> endobj -1805 0 obj << -/D [1802 0 R /XYZ 99.895 651.452 null] ->> endobj -1806 0 obj << -/D [1802 0 R /XYZ 99.895 612.897 null] ->> endobj -1807 0 obj << -/D [1802 0 R /XYZ 99.895 577.2 null] ->> endobj -1808 0 obj << -/D [1802 0 R /XYZ 99.895 342.942 null] ->> endobj -1809 0 obj << -/D [1802 0 R /XYZ 99.895 159.006 null] ->> endobj -1801 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R /F37 1316 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1812 0 obj << -/Length 432 -/Filter /FlateDecode ->> -stream -xmRM0 +ܛt pLwlzH2[!PHh93ٝ,=OiY8x3a-K41ˎL($\$T`os}yX8 -dYgy8vOWe1@?Zpx^>¶lyYbB&J;!T7r_& icTazk=?o(xhBeǺF_Bs.ӟʂ)7F0@_ptg'w%#סC!,C"H"Ϻhۋe c0dPI7 ŐU~PX *k9vcRGHm(mvqJ9;Ilj]𫙗Dm_s> endobj -1800 0 obj << -/Type /Annot -/Border[0 0 0]/H/I/C[0 1 1] -/Rect [344.03 679.461 423.342 691.536] -/Subtype/Link/A<> ->> endobj -1813 0 obj << -/D [1811 0 R /XYZ 149.705 747.976 null] ->> endobj -1810 0 obj << -/Font << /F21 612 0 R /F38 1315 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1816 0 obj << -/Length 1087 -/Filter /FlateDecode ->> -stream -xڥWn6}W# dY(1,1k`IӯCڵ-^3g&~OqRF)t#E";Qm&^[IrB]f&GwwMSn85f4z#KSRpdJ .ک?*bkXdykKFkr+ҜtWts_·~9 ~g/5R~ߣHz`k[n:$Z78F2GitCED -?13U4椫c.4Sa_ D`6υ24Lx4+r(Y VE̒@[Id`@pb90!)'7(r `f#]Rɥ?',e_ . =\iľtk>,GEɕ )ďM;lrr<=1E6N(=t_i忁4-ux*Pd 7/bpd+X!v4LHNNꖊ\= -2djS`ʹi͇2;7rWU?8ƶۆzfYwܿz oa=]k* UfK|.JBixVe_ pʩB_{atLeZ_p=pD -endstream -endobj -1815 0 obj << -/Type /Page -/Contents 1816 0 R -/Resources 1814 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1818 0 R ->> endobj -1817 0 obj << -/D [1815 0 R /XYZ 98.895 747.976 null] ->> endobj -590 0 obj << -/D [1815 0 R /XYZ 99.895 717.021 null] ->> endobj -1814 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1897 0 obj << -/Length 1077 -/Filter /FlateDecode ->> -stream -xX[s8}ϯ̾H3 Mm2LCŐ 8[ׯda_퓯s]' 9{}=xui1@m̾°b5`{8I9;kv}%%3=:A [|<Q 0sdP6%<\!ׁx9Poo/` L01=l <, ep!+a%4Sз7B.yG@.`.x, l"nE5vb\bI! DױmX&5{@,4d]gGD)0  -`CDJ.^!6'_>a…ch0Xm׍%V>zu -:$yV n'RӪ9L{M1W _2"+я';E"+*'czӺ\ixD/$]g >wM|/tw0# @n0Pٹ W>2AӘWς~{((^â -Vz3EBg BH':o:haú[R{x~JbXgcc5mUYzUʡ2vɭɌ/A}v)7<)YbDEh^vaAG7ejo y>شڋzq{\ GoۿUD 8 w?)VUUj CM3 ܿ;9NX7zF{oDg4 -Y̯<U YUYUk? ʉbm,XobqG{]UM7GܯG=%ڱ~8PCkFJ!=|ն Y.5.Rf:e]] -endstream -endobj -1896 0 obj << -/Type /Page -/Contents 1897 0 R -/Resources 1895 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1818 0 R -/Annots [ 1819 0 R 1820 0 R 1821 0 R 1822 0 R 1823 0 R 1824 0 R 1825 0 R 1826 0 R 1827 0 R 1828 0 R 1829 0 R 1830 0 R 1831 0 R 1832 0 R 1833 0 R 1834 0 R 1835 0 R 1836 0 R 1837 0 R 1838 0 R 1839 0 R 1840 0 R 1841 0 R 1842 0 R 1843 0 R 1844 0 R 1845 0 R 1846 0 R 1847 0 R 1848 0 R 1849 0 R 1850 0 R 1851 0 R 1852 0 R 1853 0 R 1854 0 R 1855 0 R 1856 0 R 1857 0 R 1858 0 R 1859 0 R 1860 0 R 1861 0 R 1862 0 R 1863 0 R 1864 0 R 1865 0 R 1866 0 R 1867 0 R 1868 0 R 1869 0 R 1870 0 R 1871 0 R 1872 0 R 1873 0 R 1874 0 R 1875 0 R 1876 0 R 1877 0 R 1878 0 R 1879 0 R 1880 0 R 1881 0 R 1882 0 R 1883 0 R 1884 0 R 1885 0 R 1886 0 R 1887 0 R 1888 0 R 1889 0 R 1890 0 R 1891 0 R 1892 0 R ] ->> endobj -1819 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [209.415 593.891 220.961 605.891] -/A << /S /GoTo /D (page.48) >> ->> endobj -1820 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [232.518 582.907 244.065 593.936] -/A << /S /GoTo /D (page.48) >> ->> endobj -1821 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [231.014 570.952 242.56 581.98] -/A << /S /GoTo /D (page.48) >> ->> endobj -1822 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [255.96 558.996 267.507 570.025] -/A << /S /GoTo /D (page.48) >> ->> endobj -1823 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [233.305 547.041 244.852 558.07] -/A << /S /GoTo /D (page.49) >> ->> endobj -1824 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [237.768 534.039 249.315 546.114] -/A << /S /GoTo /D (page.34) >> ->> endobj -1825 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [229.738 522.084 241.285 534.159] -/A << /S /GoTo /D (page.34) >> ->> endobj -1826 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [206.665 511.175 213.439 522.203] -/A << /S /GoTo /D (page.4) >> ->> endobj -1827 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [217.305 499.219 224.08 510.248] -/A << /S /GoTo /D (page.4) >> ->> endobj -1828 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [254.914 487.264 261.678 498.293] -/A << /S /GoTo /D (page.9) >> ->> endobj -1829 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [264.827 487.264 276.373 498.293] -/A << /S /GoTo /D (page.47) >> ->> endobj -1830 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [250.142 475.309 261.688 486.337] -/A << /S /GoTo /D (page.47) >> ->> endobj -1831 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [280.936 462.307 292.483 474.382] -/A << /S /GoTo /D (page.48) >> ->> endobj -1832 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [251.038 451.398 262.585 462.426] -/A << /S /GoTo /D (page.48) >> ->> endobj -1833 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [213.888 439.442 220.662 450.471] -/A << /S /GoTo /D (page.4) >> ->> endobj -1834 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [269.728 426.516 281.275 438.516] -/A << /S /GoTo /D (page.48) >> ->> endobj -1835 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [261.758 392.638 273.315 404.638] -/A << /S /GoTo /D (page.11) >> ->> endobj -1836 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [198.057 381.654 204.832 392.683] -/A << /S /GoTo /D (page.4) >> ->> endobj -1837 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [207.98 381.654 219.527 392.683] -/A << /S /GoTo /D (page.10) >> ->> endobj -1838 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [241.833 368.728 253.39 380.728] -/A << /S /GoTo /D (page.11) >> ->> endobj -1839 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [180.742 357.744 187.507 368.772] -/A << /S /GoTo /D (page.5) >> ->> endobj -1840 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [216.647 345.788 228.184 356.817] -/A << /S /GoTo /D (page.32) >> ->> endobj -1841 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [201.564 333.833 213.111 344.861] -/A << /S /GoTo /D (page.10) >> ->> endobj -1842 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [216.229 311.911 227.766 322.94] -/A << /S /GoTo /D (page.33) >> ->> endobj -1843 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [173.041 299.956 179.816 310.382] -/A << /S /GoTo /D (page.4) >> ->> endobj -1844 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [227.527 287.029 234.301 299.029] -/A << /S /GoTo /D (page.4) >> ->> endobj -1845 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [178.57 266.079 190.127 277.107] -/A << /S /GoTo /D (page.41) >> ->> endobj -1846 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [179.836 254.123 186.6 264.549] -/A << /S /GoTo /D (page.5) >> ->> endobj -1847 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [220.583 219.275 232.119 231.275] -/A << /S /GoTo /D (page.57) >> ->> endobj -1848 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [176.877 198.324 188.413 209.353] -/A << /S /GoTo /D (page.28) >> ->> endobj -1849 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [211.885 175.431 223.442 186.828] -/A << /S /GoTo /D (page.11) >> ->> endobj -1850 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [170.59 163.7 182.147 174.873] -/A << /S /GoTo /D (page.11) >> ->> endobj -1851 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [192.518 142.525 199.293 153.554] -/A << /S /GoTo /D (page.4) >> ->> endobj -1852 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [277.24 129.524 284.015 141.599] -/A << /S /GoTo /D (page.4) >> ->> endobj -1853 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [220.483 118.615 227.258 129.643] -/A << /S /GoTo /D (page.4) >> ->> endobj -1854 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [389.948 594.862 401.484 605.891] -/A << /S /GoTo /D (page.32) >> ->> endobj -1855 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [360.159 582.907 371.696 593.333] -/A << /S /GoTo /D (page.33) >> ->> endobj -1856 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [397.32 570.952 408.857 581.981] -/A << /S /GoTo /D (page.33) >> ->> endobj -1857 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [373.011 558.026 379.776 570.026] -/A << /S /GoTo /D (page.5) >> ->> endobj -1858 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [354.441 547.042 361.215 557.468] -/A << /S /GoTo /D (page.4) >> ->> endobj -1859 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [407.053 525.45 418.6 536.479] -/A << /S /GoTo /D (page.47) >> ->> endobj -1860 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [359.791 502.888 366.565 514.888] -/A << /S /GoTo /D (page.4) >> ->> endobj -1861 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [423.233 490.933 430.007 502.933] -/A << /S /GoTo /D (page.4) >> ->> endobj -1862 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [434.65 478.977 441.424 490.977] -/A << /S /GoTo /D (page.4) >> ->> endobj -1863 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [418.062 466.948 429.619 479.022] -/A << /S /GoTo /D (page.44) >> ->> endobj -1864 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [352.807 456.038 359.582 466.464] -/A << /S /GoTo /D (page.4) >> ->> endobj -1865 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [420.035 443.112 431.581 455.112] -/A << /S /GoTo /D (page.49) >> ->> endobj -1866 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [370.481 422.492 382.027 432.918] -/A << /S /GoTo /D (page.10) >> ->> endobj -1867 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [406.177 397.61 417.723 409.61] -/A << /S /GoTo /D (page.48) >> ->> endobj -1868 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [439.96 385.655 451.507 397.655] -/A << /S /GoTo /D (page.49) >> ->> endobj -1869 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [412.124 373.625 418.899 385.7] -/A << /S /GoTo /D (page.4) >> ->> endobj -1870 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [422.047 373.625 433.584 385.7] -/A << /S /GoTo /D (page.52) >> ->> endobj -1871 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [445.061 361.745 456.607 373.745] -/A << /S /GoTo /D (page.48) >> ->> endobj -1872 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [470.007 349.79 481.554 361.79] -/A << /S /GoTo /D (page.48) >> ->> endobj -1873 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [362.182 329.17 368.946 340.198] -/A << /S /GoTo /D (page.3) >> ->> endobj -1874 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [372.095 329.17 383.631 340.198] -/A << /S /GoTo /D (page.52) >> ->> endobj -1875 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [423.283 316.168 434.829 328.243] -/A << /S /GoTo /D (page.42) >> ->> endobj -1876 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [378.939 304.213 390.486 316.288] -/A << /S /GoTo /D (page.42) >> ->> endobj -1877 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.634 304.213 405.19 316.288] -/A << /S /GoTo /D (page.44) >> ->> endobj -1878 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [385.046 293.304 396.603 304.333] -/A << /S /GoTo /D (page.44) >> ->> endobj -1879 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [389.509 280.378 401.056 292.378] -/A << /S /GoTo /D (page.42) >> ->> endobj -1880 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [388.383 269.394 399.92 280.422] -/A << /S /GoTo /D (page.33) >> ->> endobj -1881 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [437.848 246.756 449.395 258.831] -/A << /S /GoTo /D (page.48) >> ->> endobj -1882 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [347.288 235.847 354.062 246.273] -/A << /S /GoTo /D (page.4) >> ->> endobj -1883 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [377.146 222.921 388.682 234.318] -/A << /S /GoTo /D (page.29) >> ->> endobj -1884 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [389.698 210.966 396.473 222.363] -/A << /S /GoTo /D (page.4) >> ->> endobj -1885 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [374.914 198.936 386.451 211.01] -/A << /S /GoTo /D (page.52) >> ->> endobj -1886 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [364.633 186.98 376.169 199.055] -/A << /S /GoTo /D (page.52) >> ->> endobj -1887 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [394.839 175.025 406.376 187.1] -/A << /S /GoTo /D (page.52) >> ->> endobj -1888 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [392.199 163.07 398.974 175.145] -/A << /S /GoTo /D (page.4) >> ->> endobj -1889 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.122 163.07 413.659 175.145] -/A << /S /GoTo /D (page.52) >> ->> endobj -1890 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [393.514 151.115 405.051 163.19] -/A << /S /GoTo /D (page.52) >> ->> endobj -1891 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [402.65 130.57 414.197 141.598] -/A << /S /GoTo /D (page.34) >> ->> endobj -1892 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [372.652 118.615 384.199 129.04] -/A << /S /GoTo /D (page.34) >> ->> endobj -1898 0 obj << -/D [1896 0 R /XYZ 149.705 747.976 null] ->> endobj -1895 0 obj << -/Font << /F35 1275 0 R /F21 612 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1922 0 obj << -/Length 493 -/Filter /FlateDecode ->> -stream -xڭ[o0~<ԗ؉;(ӶV#THtB,IP.w*2-O܏F> > q70RLpޓLGbGϲRz.W>j1-2v`#|#TUDrfT2̨3ʩ#Tَ(,P87.#wQIX#Qʪ&  O;VniAcS1#Ürj.RvC[(F腒Ui>ČR'Cj9$⻤>i'QqPQ:^J^^sW1s5xs\OP{ Tu`hȨ1.TӵUϟJ(ɯG*{c6q(}Qc ƒ^~p<zK4k#%JS g2E0ȇx{WKʱm;jTM'G$'!!ժӤTO.g1sx]v}?z4 -endstream -endobj -1921 0 obj << -/Type /Page -/Contents 1922 0 R -/Resources 1920 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 1818 0 R -/Annots [ 1893 0 R 1894 0 R 1899 0 R 1900 0 R 1901 0 R 1902 0 R 1903 0 R 1904 0 R 1905 0 R 1906 0 R 1907 0 R 1908 0 R 1909 0 R 1910 0 R 1911 0 R 1912 0 R 1913 0 R 1914 0 R 1915 0 R 1916 0 R 1917 0 R 1918 0 R 1919 0 R ] ->> endobj -1893 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [205.29 703.372 216.837 715.446] -/A << /S /GoTo /D (page.34) >> ->> endobj -1894 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [131.427 692.463 138.192 702.889] -/A << /S /GoTo /D (page.9) >> ->> endobj -1899 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [121.853 670.545 128.618 680.971] -/A << /S /GoTo /D (page.5) >> ->> endobj -1900 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [136.269 658.59 143.044 669.618] -/A << /S /GoTo /D (page.4) >> ->> endobj -1901 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [146.192 658.59 152.956 669.618] -/A << /S /GoTo /D (page.5) >> ->> endobj -1902 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.964 646.634 162.501 657.06] -/A << /S /GoTo /D (page.32) >> ->> endobj -1903 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.545 634.679 162.082 645.708] -/A << /S /GoTo /D (page.33) >> ->> endobj -1904 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [152.438 622.724 163.975 633.15] -/A << /S /GoTo /D (page.33) >> ->> endobj -1905 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [167.502 610.769 179.048 621.195] -/A << /S /GoTo /D (page.34) >> ->> endobj -1906 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [219.706 597.842 231.253 609.842] -/A << /S /GoTo /D (page.49) >> ->> endobj -1907 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [128.458 576.896 135.233 587.322] -/A << /S /GoTo /D (page.4) >> ->> endobj -1908 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.381 576.896 149.928 587.322] -/A << /S /GoTo /D (page.10) >> ->> endobj -1909 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [180.304 564.941 191.85 575.969] -/A << /S /GoTo /D (page.48) >> ->> endobj -1910 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [150.376 552.238 161.913 564.014] -/A << /S /GoTo /D (page.32) >> ->> endobj -1911 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [151.611 540.283 163.148 552.059] -/A << /S /GoTo /D (page.33) >> ->> endobj -1912 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [148.573 528.328 160.109 540.104] -/A << /S /GoTo /D (page.33) >> ->> endobj -1913 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [132.692 516.074 144.249 528.149] -/A << /S /GoTo /D (page.41) >> ->> endobj -1914 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [138.301 504.418 149.858 516.194] -/A << /S /GoTo /D (page.41) >> ->> endobj -1915 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [156.941 492.463 168.488 504.238] -/A << /S /GoTo /D (page.34) >> ->> endobj -1916 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [162.989 481.255 174.545 491.681] -/A << /S /GoTo /D (page.41) >> ->> endobj -1917 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [227.746 468.253 239.302 480.328] -/A << /S /GoTo /D (page.41) >> ->> endobj -1918 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [169.773 444.418 181.31 456.418] -/A << /S /GoTo /D (page.55) >> ->> endobj -1919 0 obj << -/Type /Annot -/Subtype /Link -/Border[0 0 0]/H/I/C[1 0 0] -/Rect [217.753 433.434 229.3 444.463] -/A << /S /GoTo /D (page.48) >> ->> endobj -1923 0 obj << -/D [1921 0 R /XYZ 98.895 747.976 null] ->> endobj -1920 0 obj << -/Font << /F38 1315 0 R /F21 612 0 R >> -/ProcSet [ /PDF /Text ] ->> endobj -1925 0 obj -[258 258 258 498 498 498 498 498 498 498 498 498 498 498 258 258 996 830 996 387 830 738 627 738 774 627 572 793 812 387 351 719 627 867 793 830 627 830 738 498 682 812 738 996 719 738 664 295 498 295 498 498 258 516 553 424 553 424 295 480 553 313 295 535 295 812 553 479 553 535 387 332 313 535 572 774 479] -endobj -1927 0 obj -[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -endobj -1929 0 obj -[777.8 777.8] -endobj -1930 0 obj -[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -endobj -1931 0 obj -[525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 0 525 525 525 0 0 0 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -endobj -1932 0 obj -[500 537 111 479 590 276 479 480 0 480 778 0 627 424 479 295 0 0 0 0 1000 1000 1000 1000 500 1000 667 611 479 276 240 240 424 480 479 774 682 240 240 240 480 774 240 240 240 498 480 479 480 480 480 479 480 480 480 479 240 240 996 774 996 351 779 701 572 701 756 590 498 774 774 332 313 682 590 774 738 793 553 793 682 461 608 756 719 959 701 664 627 240 498 240 498 498 240 461 479 369 498 369 276 424 479 295 240 498 276 811 553 461 461 480 387 295 313 516 516 719 461 442 424] -endobj -1933 0 obj -[593 593 111 498 608 295 498 498 0 498 833 0 664 479 498 295 0 0 0 0 1000 1000 1000 1000 500 1000 667 611 498 258 276 276 406 498 498 830 848 258 313 313 498 830 276 276 276 498 498 498 498 498 498 498 498 498 498 498 276 276 996 830 996 387 830 756 664 756 830 627 627 812 885 387 369 738 608 940 848 867 627 867 738 535 664 811 738 996 756 701 664 313 498 313 498 498 258 461 553 424 553 442 351 535 590 295 276 553 295 867 590 535 553 553 424 369 369 590 535 756 535 516 479 498 498 498 996 0 498 1000 258 498 461 830 498 498 498 1143 535 314 1069 0 722 1000 0 0 0 461 461 498 498] -endobj -1934 0 obj -[1000 500 500] -endobj -1935 0 obj -[556 556 111 480 608 276 480 479 0 479 815 0 664 461 479 276 0 0 0 0 1000 1000 1000 1000 500 1000 667 611 479 276 258 258 424 479 479 811 830 276 295 295 479 812 258 258 258 479 479 480 479 479 480 479 480 479 479 479 258 258 996 812 996 369 816 756 608 738 793 627 590 793 848 332 369 719 608 903 848 848 590 848 701 479 682 812 719 977 756 719 664 295 480 295 498 498 276 424 535 424 516 424 314 461 553 276 258 553 276 830 553 535 535 516 387 351 332 535 498 756 498 535 461 442 498 442 996 0 479 1000 276 479 424 812 479 480 479 1162 479 276 1033 0 722 1000 0 0 0 424 424 498 479 812 480 608 351 276 756 0 667 719 0 258 480 480 479 479 498 479 479 498 479 424 811 0 498 479 479 812 332 332 479 553 479 258 479 332 479 424 811 812 812 369 756 756 756 756 756 756 1069 738 627 627 627 627 332 332 332 332 793 848 848 848 848 848 848 811 848 812 812 812 812 719 590 553 424 424 424 424 424 424 645 424 424 424 424 424 276 276 276 276 535 553 535 535 535 535 535] -endobj -1936 0 obj -[277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 777.8 777.8 472.2 666.7 666.7 666.7 638.9 722.2 597.2 569.5 666.7 708.3 277.8 472.2 694.5 541.7 875 708.3 736.1 638.9 736.1 645.8 555.6 680.6 687.5 666.7 944.4 666.7 666.7 611.1 288.9 500 288.9 555.6 666.7 277.8 480.6 516.7 444.5 516.7 444.5 305.6 500 516.7 238.9 266.7 488.9 238.9 794.5 516.7 500 516.7 516.7 341.7 383.3] -endobj -1937 0 obj -[534.9 626.9 663.1 258.8 442.9 650.6 508.8 819.9 663.1 692.8 599.6 692.8 606.4 522.5 640.6 643.8 624.5 885.7 624.5 624.5 574.7 272.9 500 272.9 555.6 624.5 261.2 450.9 483.9 417.9 483.9 417.9 287.3 470.2 483.9 222.6 248.8 457.8 222.6 745.1 483.9 470.2 483.9 483.9 320.3 360.5 339.6 483.9] -endobj -1938 0 obj << -/Length1 775 -/Length2 687 -/Length3 0 -/Length 1218 -/Filter /FlateDecode ->> -stream -xڭRkPWVRC;È4A\$y (Zrf'&h+N\ZȺch #!hk8*b  -ya Ŏ.XGpBh2%lXQqsk/%ޯY<_+߳x{qS0K(cRK;XRU@\ -l%;>'b%7;[C#{Bw|HZV{>Sfowcۍ]Ӟ6hO0%M`N.B/׭v"Qv }:r¢M'iKyW~7U?_h2!L:}sC{tkS…t܊6H1U/qNsG!FxA/Е׮oI|)(˗,8^xor?7GS;K4ټE1mF;jj6՚ 2I4'lWztGn :Zyb 7^I? ?l:uٺiըe]1aݒ{ O9$2IvI+r!/8mQȄl?+FY)XCš⇅lc{S] mxUM=@$S|ܪEco]`?sd -_>`k;$auo|gomҫo|,yM O{=+vǔ``bOKv6|R5;K6ݟ 85-~;W/Ox,Za׃Ц E~/>[k( +o>_cO -endstream -endobj -1939 0 obj << -/Type /FontDescriptor -/FontName /AQTFCU+CMSY10 -/Flags 4 -/FontBBox [-29 -960 1116 775] -/Ascent 750 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 85 -/XHeight 431 -/CharSet (/bullet/circlecopyrt) -/FontFile 1938 0 R ->> endobj -1940 0 obj << -/Length1 1777 -/Length2 13003 -/Length3 0 -/Length 14144 -/Filter /FlateDecode ->> -stream -xڵzu86m`lk98G3LttwOwL'g?uP*@`[( +;?@^A΢ -2s6tprЈ9 `[qC(ik5u4tppCHlA/Q+@5Twq 2(!% 51\,̡zpZbe03Uv~qZ#)l -Pi4$TRJj /ELM]C ..i24U̘/?s^+H(KpYrX_h_l9jjX§nn8/O5/bmM@9v oa IڼPR ?=N@@cnV^YY`cha $B |/ bf(#1. -~Y'kwOCޱq@\1bBZX3 ۿ| -"2j,/ʳeQc -u5וZ`Z\rO& ʖ HU8ʻM~VHlɝ4U[BMӮ{|XBZe \ež<4!jZeOFԯ 8IqUz>qBSև3:ow+E6̭?MjyʲJgG Xp9LԲ3? -RR3|{'ds~dc\>;3eY9 I\M͵4g}D8f)hJ! )LI4]Kh73L#jb{,c9@`t:蔈p:X~i -. +N/|rp3[xAH:S~aߌ6`>G8n&_Yrzڽ;\ն}{?5mިxŤmNGeBJreH}xˡ^bA2g7 {\vj~ 吣ޙA\6h".RN]Â2esw|dӫEyZN6vhmC5ej p~ĜTcѰٳ(Y -8Bl ,+1>-ȼi(-P*ZAw gxPn~X!:gGFe'XykgFw.ιmftX]D@͂~nd3;&3?A *J:!V57\t )~viES83㘋S@Ljo"xxY -~[2]P2WޙM7)M_|gQQ*p_Jۊu5UWRôM+\u[?1gOpa"!3 } 7 3qfS2Z1Q0.k6eq;~p Vi0 -|W?׿n+jQdFPr/tj+Kсn .ݎI䕮"hnhɡɍf7#C||L+qdԿ3KֹyUe m{ġd֓!:k}WS&Jdc(2wl0 yZjyOY( re#iՅj5Np:h]/Ndkr%AH|y~YgG&Cϓb^bss П?}/fryC M?'-b 4y.e٫a:3S'lQk+#T(\-avKvlϾqf'!Gr:/ iL풋)5/?5H%:s68ؼPx'/ֺJH4bI*55Ql'bJJ'l#:Wcd)nh{%dyZvzI NQ-nmOj]R槰^8g^c}7v[0 @Z*e26c g#T#"dHn"c%zR3:NKmm}:J2CȨд0hϖe0BFRA.}82x[hɸ@J$^cGf5ch]dz3;3uuLoԘ^ɫ|G_h -W] &t(yÍ _< -Gð!a!^B>HW]¦=GŘWPc֊t08V\%l`IM[KOwnDz%b*,It|#-" 8}'U['8KUtg|49Oi$Jl]s(*z֚ҷ}> L%b( # zĉޥ2g'SSä6 't 4Īha*dy?SBi_}|p:t^6 VTeN(bѭ*T5lKNThSo+!t8z~Y+- ߵ͕_sv.ԯަ>UȘuE>$QRHiGWR!ϚCG۔EˇO++ظwZCmwݙxч?\!j -\S]6|I<0I}z&WͨqL/=dʔ. Pp pmf.@zg> sχ!&퓱[nޘ'hScMhA~h6a+i,KUc+ -#s9$).#j`^9*IpɒQSuU+^T)NkGUYx<[ u -0vi3Ӥ02kΧ&ܵB>)F*څC]?j0쫴o?^@O"Κd)ÉU *1MHiӵDGO=8Iro͉n(ls~O -D5 "0P;-^L먄8ld4K#hbD'_Nf (5jC>/oiW8L\+F'Qѓ`MM~r,xg7\a|2 LIUܵr;p1!JJp86HZȭ7. 15%LN]k@V:jq(+L}˸SpKƾ"PBI j z~:oNJLjfO.N8P*FSGK*i#+;Ş$%OG|PyM9z䟒҄eQB7FAh&N685~K!%GbA=Kmf yzIi/y bSb.?ВCƾg#0߅}aD^zD9[,H7{6BJu;d)p (q-o?S|n(|[@Oly<7s -oĦ[QѰW܎Rty)X˨\m_%R~,6:1m 2Ͱ$l^R\c&l9pQ)D,mnv}C'FϝfX~l/fWipGݡA/mHBԣ YBKrVзKg8E -L+cAx4d]ޕW,Zf>&V(!owX.<ͧO#&VӸm~K[{Xlq*rm]Uzv)['G;䵖Szؾ G MԺj"VoIkΛO7dž8\Zn *nV%2mcaB@N\ʽSdQ:nIꊿ:o :鮍ڒKI] ܱMPNՖ!;3l!h%NM Pģ@e$Mj<ֽZ_n׍5PZȴD֭v8 ?E{USޜtm_p>I7I3:f`'ZnAP|_&A8۽a鋰*s0/V1Wvrߦ>zdKWF>o>VMK_FDY$ܺfA`#YUE|Ү;B/F (`x3U ;B¹+ñF%gNLc^J( l~fhVGē85߬)eUkD ErcuͿkf_KGe}s}fݹhŗu}_Bm'W"`e@3;]p7\IX赭8dfb -FQ`|jJ9pǏ-~ɇgL-G=_Go$=L~5T(wWr6`橳|=.@Yjڵ>m1o5pKyxPmK>Ps4˝ch2?@3ITw.ʹ73:Krc^~JDb_;FL>& ;FM˨R|3$W~5$ cjmDxǼsgc|7+r6!=VY q" x lYh}7y@ep-MkVEU=KĠ_.]C I<CorȌM+ 8 ?qDD1${"}z[ʗ`Ġ&Ν-p|xD돤D׃oCc `ߟZ_8M}>~0\6퐚ޛɰc1P( 8gk/y𝣉<o^I؏"!,IZ?fC$|!YP&WV@8b%xd<R 4&GΦTJTHrr-}w -]^=^4Aōc2ą+0tϸ۰Ekli1 BH52{д9u)\ub6ʓ}"yX &+l&mGܪLk%-̮Qq0w4OD4t 1ONk/ ݄yRuP Teg;O@dX 9GY ^z!&]_qm"34|%D3r} AmE\ۭgk~^̼DluUċIR*=˾Eȁ{j" eye#|^y/]4$p7 Ի;ĽzOu\Xy. ޝzYXU<{FfU+ zDrgrPFc\L8 -)LPO4v#2Wmcii'3>{E\e餙<*^͞ےI_WH䕨T0׍_$yDZ~o{>j=O<#Dg㸛sMkL-նi3 ~EL}l^!tsJ4+|mLPͤ.U!w WYX=iz2+0= ,U-qlCޮn#|`c!QZc=S]/`;[vkK1!K}65WWl-ר稈GUcpW#|-=n"q4fDȑR,w c|Q V޼#V1Ŗ]mŨ_'/A8TژZ G|]m,|neHu ~ ˎLrcOL ɢW^BUw ӒɿV&e;gשʋ0yHjkΕm " i .s&8[[qi j|ze4H Gۜ,ϷqL* rn.Nis%)`V-,%)\q0[_Ⱥ=6W*[18 R|둲 $!pZF:A%#ۏ 3 -!4"a3\ 7U6q|tȉMs˄dPnAi*}m-QqieIc2&rʠq/sN^k wCR×/ゐʜs2g,TGD]|sEĴ}yʜ7\g_zXYbGrNUh1|X 梨dYoe YU$˯dҏ,D܊ %!Eh]M_S9[1qpn C urDI+) K]mEܟAy&|6yZ9oMTLG -y*'766Sf4Dq4W"b.dH|l?-9RЧ|}tN3{j5 W{lȮWI]Em\WB^/` G1'>s|"(Qpxbɹv 2WET&씃x[wkHfLC_HU<yQo8EĮhi5ʵ1˜ ->LTJ*J]651J~ɰB}Ő Sˋ`~5Lȯ*nC;~UF>stR?\roOP\ٮG%zAA#Mr* o8'7%ʶéw\)( 7q{p'T}73 7я 8sL }!(E9)4w-TwcTNv gz%/U+|`( -Órb$tZ t gΘ糉L$m,Yֲih~)ɍU]: YkP}d/"w :9ϊo aM(e|ZY.o?W(0HɅ2G;k=YzNiFky&qCRD9+xY Y-Ř j XyJ泯ujѱ]#UwoY?mN9HL.FHb xGE9oMi!L7Fº ucS,,L,V?mDr$lD:^s ->2T;0#G@bLBI5ӯ#c+0zٽHܼqYdl]MRR,X~|6֕#SYc&LXFhvS/r12:`]PQm}ת\l,Qq1󇭨O#;)Yxi*r_dFLs49اqxܮ -S! -jUy:jϥ5\=Ά.!S1R,gE$m"ԟq;Z|uDd̄i,7AѪC) ~w0Ljzq@:nui 't* \_Wy}Rj?NTaf~Ogh@> Pn]phZ<*؝J#( -x -`Xx2)Oh+OCatiG+s<-dUo$F۸]vٮ z/FYcG2A]giUC*dQf>NΰF&۞ -px#U7eބ;>={ 9aT+]9ʛ7@&X(A+Xd."ԋQO\xo`]H /ƪWTp1Nl6Υ})[ ^ vfsp^![׷TqV<2F^l=mɅ4p;"> X~FǓ]Ċy##>[;⌥NS|+#w9,>t)2mv&Iq Y6euGZky 6ƹ2y-ZK^!:Z$,_|g򬬴#ǎ.3s>0,U4RI6q"Y%ZP45 VRSCX? - ݺRR4rKC>IKXU]Յ*0(S_#Yvuuo<2h,nqm$Y$e犜KB.}&kOSAV - ɛdC|+ES Z~(G0VRzbﱩXmXctju1t+xdJiiJ&߾s*.RXֻkX#85XZR_Qn2' )owt.dK[6TGWHs)5."V -.i2.;S9ٲ -Y^p,.Ku 7>] -g*W؇7!b&%D7k_'|4{ J)UN aSh#F22/ōl -KE.(YGB~3F1fЉZԼXXR&wo2YlḺN*&Y49xu}u1&8O#$7{kfRFr]p<84ѷG00{J{4uf_cuܮULV(Ve5D F\W9'^#g _N5e#|<%, ZTdhf ,zhIEcÈGJQ?VZEa#-ι#uA;|HiCf]fr/wzsWWд%%jh#Ʌ tqOZ37o(I%>чddO7Na흝_"+c{^ao=jcbSc$p+~KJG(Q0d@_|j9:C*2 Ru0wssfW h|C@,ܽ$VC4n\+1 w:@!WS7_=pDA5?6?ۚڛ3iXgKla_.#(1n/Rݑ^0=D [Zgƻp/9o%f8Q2R+DtLc˯a^FnyOh7G:S38=Ej Q/f}--\O.?0[s1rԠ"30ɠk$)Vk :g?'wlEXil%*tqWAǗt,k(у|4PlGtV}3^E\M!B@OcJG[!^j _, P$ -άݵ)wRzmM5؂X`+_<[3p'n89r4ah~95q`S.LkhE9*`7tMă)(гG7Ty}=J 6\|*nsH7Ӡ'[2k35c_gھ'́[; A~[Z[M32~$\5E[-kNR.n+\wXfupNwJ -zݛjtfN[R>,(⮪DE|.,(̊z !=D0rb{%ƭ S^*" -\>x.G}.3*,IjVP~Sy1E]1DLkWs ː@ -endstream -endobj -1941 0 obj << -/Type /FontDescriptor -/FontName /NUJGQY+LMSans10-Regular -/Flags 4 -/FontBBox [-420 -309 1431 1154] -/Ascent 694 -/CapHeight 694 -/Descent -194 -/ItalicAngle 0 -/StemV 78 -/XHeight 444 -/CharSet (/V/e/i/n/o/one/period/r/s/two) -/FontFile 1940 0 R ->> endobj -1942 0 obj << -/Length1 1914 -/Length2 15634 -/Length3 0 -/Length 16833 -/Filter /FlateDecode ->> -stream -xڴst?v&Ic1'&ilicm7yӽ}]f|_Z QTa63J:302dT mXf.ֆFfN8 - -QG3jk6u1t23sQ>m\@ladP휜 >@[3 [ ͇l ,a0nlede0Q oAP֦;S* @ME\YYYAMQð" &,*>T?~>ˉ -j*09 -ttb >TMlr6wvebrssc4sqrfs4c+>Us '[#?UZm$f|C>Ǧ' ?ܘ:+( 1u::8 }&T8:!,E>Ncch'?mlgdE 'z?5&',/%! y rvٱetvwK=a1Y^73ѥ&v66Q;IG=Oc[ڹz_̛3Z8Go :L-,i񲷳Z;},L8/'CW O"8.G _֥lM<?"__J1&v)GCP3gKZH)o9C k/ Xm g$a4Qp66;ӥ ?z_QHjo?vş```/GK[?_O&Y- u 3ۙXؚX98pbi_`bsPػ8LT$7b0}7b0I q #vI߈_ d/#ì?]<&C˶?,;~Xv09~Ϛ(I?/hg԰0q663#y8C[D݋c0:l87ӏn_gi@w1҂1_eJc_RH -r,/qKSm8bۤ@€vI_(0֛+&oLv }|ąGs3~vIkdĵFEy:X'QIuJ[V ݊X0ju~Ĉ4^5DUGOU+٘Sx坖.(2 ?C-W>tKaF!#\+8h}Γ͈}mR><";_և1Mk/CdiK˖XPkH,m)St$qO~)0"ǯڍ_+rJ*E8.p870Kc ntE`pS- -r`A02@ݹnI=]U]a|zq)(9OJxQIh6MĔkXcmRA闉b9%e,yʀz7]p oFBeHKį -jՏAr4/k -*4`$k7H.1E7.}Ch¿^"N -5Vz}v%Ec۔_D55CR`/h?_HkS8e8H$im0ktd>$6$Ow3jl^0R` -vsb.8ojTӂ^$tnMi["G}̎I4Ha<"X 7mq?6秏Y1|uCxq;MKbʆ2!A -:UA[zKfQ}lSfN+B?/\(H&A.ݟA119m*Y;z?,z=[pt.Pw8 ]GⰔOw*|M{O)sN̳VQGܨ[HI !L|q5 .(H0b'ףN9i~^Uni7>Zuj7]"I)БWKʞONvs`^j;wFY]z+BM+ͥ%Xm-P2 pg'(mk7%p8oј=twU#d0#]+(˿Ǔr$OӾPtFNw (6}V792>]-ݐEt -sjM˕\~|~@>>`foDY>*\jzb?_ToƠGo3.v V1QA ꩩ -TmcjutҽU$~:#moVUg<踆=ݠ4-_2K6qh찗NN /k- XVK1&Z2 ->^jO2qh|*@/ˑ@ƪHXK6.}r-OWP5rATȁr6Ep~\nي~ >JC$xE90c&t/!j5ojs uzlaJ=^CƐ.,ʶ[lj^RY&h1tEi%ٌ axXF#!S<b|Jr*5zX)0Vuͷ6G:9TԒܨ %?pr |num+WOZlZO2-f/V3A /A r -D( zbR) ]j$ ˸c{3 >e =Nl?"/-C^҄7FӘL>E8]BC?s.{@t"3w" mS8I -462v7p9I@e X|rn5W< :őz/[o(1H.gc/bpފK9 8#4&w&u:U $&0j]g,t]uY;b,>v39h -=jm-_ѷӀЍOQi,Ƣ\VƞDϼQ}AUB_DzMn!Ɵ.mNaSgcIWgd vJXNnh3wiwQu 蹠Oa*\GxuG6." >|'_d%Qf.LRrпq| -3MVd -3>WqMN4GEr `zy{v,Kt_wg6bˢ`)| -zT8oly;q!08c.Bc*^%r|yvTp;Qsy+KN{")dBb+-y*R8|oϣ^|2;C -CLRfY`n֮]5dF&pԱ"`Uw.GTK;L{F.Vcr{N$f0̽U'ӽP"!E<yJZ!ۍ-=o ^aqGyB͗eT  хJ hvRygi' Sq{{˓<.h^ZD"5!B߆n*o%Mw#q7Sk#AIJż4oځBN<1K='%)LjUUG-2$=7aivrJ}̴6Ku56=&GѿP@hٌ&qx#r\T㾪Mڲ>a6۷C]>AY3@BH&6ۆbvTg0Ex{Th6yzA//[i }ᛷƄ3G -sR i7I[4_wwyu'G$MoE!XSѧ֟H SYX@Y; <m ]t~˝[R<'%{cm;F<5B6GHhQ+T5xz;~3E(r*[ -lJ_E)43Gv<ܮ{@ZċkFܺAUlh"H$PF=nUjкGCy>> -nVt -*B M9HWMJCmbE~[ugĵلJ^9ʺ SDiz͝94:ȩt-.Mޛ)ڳ=͐ 0G&PR=Ѧ^ِ٭l1ljj!~F/%CvuXP͟unabgi!{cXo/ޘ'R8en"%3Rrz6ypL7V{Et;1~!X459^q {CL{PmsmSE9}6/'^h@Eɡq}mds\-P/D90+ўE֡;ǭpZcICJn@۞;f}Rt|2Xr/6K{LRiNe9H9zc3O޿d2{rUZhOߟyI-w~[%7oY_G;pb02dBa i еY;VB3qc‰BNn |@_:5Ln8-4kƖoiF^\#K U F{y1Rk'f暪Q Vxyig(M9@#D ݍ0R4bcj+ /T7Iڨ).pVcsI, - ?^5a_de,mz4*3~Y93<񩰴Uw kt^7Zz#\6=EGTR%tǢ.!<1@g"$,̹5$R0m>K7c𬘮T[pV`uM%ԉ׎*v*ZEa9GB4?(1$͋^˛KB/re96Vhy08喸1 9My 5@ cE>XƵ8LhM*nҲȳqg|·;׳M|4G[G!>[NׂGp~egQ'i ~8IC ]m@~?ueE6դ';]Pfݝt= {wLފ+UsϑԌ;+AKP>mGD c5ZW͂(O=,sD?…t44wZal;]ߦ;Lfiı{0]8Dw.*B+ًTj5if{}Nn"wg(:t(dro8^C_7{bۙQV6ٴ*U4f4;7(@ǩ =f -vY++6CPeܯxŹh1չ1aݲPf Cr/7kÞ 1ق ?븟ɠ{Y6T ȚAJVR#z٧!W1;{*zBH%-zohtlUM 4~EP3ɉ91G=6߰(Z .^;C=)J˾> -؎S6,…byLHwq[IyN?b[ '*=dRFN3lϷ#6.)*tŞmk+YAz p~bNMr-KՆ9;0i٫rßUuskVT44kf}zGUbKamoIoq -A%.r#VgӬIH)1∘幟yɓ׮ -7 7^#~hJKd-s!DP+=_ߞ-@;BR8źd23_-[N63C8e#qf=҄7 fYH>:D2Լ'aGvN6*BeahpukqIZ əN/7¬!e޸1+l};~-0R/H-9ԌxK9T5,0LT3DKشuj%BfF-t; -UU -~0YXcܴ);xzPJ?g9IlubUzwF"-@X -qR&= ]~L2˒3Zڞ([7zLnQ|WU&rо xL]=Ȇ { kCAlN[t>U*u^fsyiO y`iQJ.s#Jx$c:^n=0юji30c*~1m ݧK+%p -1[TP1_Frd70e헣)|OwXݐ^.n%F۔ -+hԗ4/#b88O*^)-'MSnsE?4jzғ6\ _X86]Uuiw0'Ul;I}`-?ߣa8H^Bw/,l)wco)rWB428;:k})-C!6#bObV(IP :"Ae`_Dslě, -s Y_ċw2Sn-: -k5؛љG5χk 7_ǟA3ZlRMh:&t8(/YMB֧ q>|i8?4kiԄH˒d3Cd[q5ˉJ *_hб/64|~Ͽӳƾx :7w: -cM"%gJ&zeS>Swcxi7Gb2{yd3/{q7 *94ցo3j:=1Kw:-=w*03٠ Ɉ0) u! -[""# -Zz" :?0́پiH]vGVpͶOy[ kwn *3gO?.вN!z}CV'_Ύrt#?P 93֪rfo6mAjhY73z䞊]U F-_8\}RTTvvoUKʼڟ%zKJ &dYrb$cNHwD[s󰻅ifb^xk56 _f9&0<JoNc^T%)_qɦXH5Yc > -PWhNo \1 +1Gܵ(qk7-Xfi63lOaΈv#Ҟu <63ɑ|a SJ\("Ύa9iM I K$y:ݶ@38F=78P=n! ֨#$2#v s8\US=#լnolS1/z/~/HŰȗcP/(wl~O?w%t ~F)+ޭ=~f=SO BK@n!:2eq+ `4S+z,+8lb}5QG߈xUQ0կE)_*GLǦ*aWZ6z;bgEGWo[UMإJiYuiaa]S0* - lW -2Z%=yh2JÍYs-d+`1S]G&' =8#t/CiH -xi_y[\3gOK\ш T -~ Hn) "6ʝVH<ĜJm6j~Wrı -cFۚ -J ,#jqÝZʮ1Y8=(R>wY=>[Gva/_x19ޢ C(*KnlOרMp[HhƓ -ܪtAYџy9g^;V;t|S$GFS6\F n6)6h\=۷ ,`L5u! ~+|+g+p6+!0Vbhɺ9?1I 4eG]h"<)- 6v$am'^3 -=AJC{ {he~B<|AM Q;#lקe)@ &]x(R`9Mšr6-UWztĿ, -K<%t~"%"QDKʸ|^)Y)k D֟ /UT4AxLp"$ x=V\MbQ $d*+OC*aA_J:8f^e eC 2"%II||A; M`:{!1J3+ ᝷0Еp.> tt4hpF׹BFߦDH1k?㮏 ]a8|D0s=|\ -b.CϺJ@ZvS>IxţR7j2 !?[Na`* '*4X]{oo=IF4%mC/*٤xؗp (GtEo%>#^.( B]QFuf% ǭL@IRFyw鋾tHr,WDђ׎u,Ҽ*[|C-oxcD~g iBȗ1:˶a3֮Y~*~ %c89AH;V9+{㸳 Xyg.:T2}cO۠GU.Y rkau`q*q?1Ūcl[Hg3*)#Vafƿ }-x<0QEe-ú6!v ç( [_=%;$ DvSF=d>|H)kSNO f{6gUÑXS+#(JNd}^v<xV76c/]l9i"nP qÔTQOH f}z&MVV"Tݘ#r ~i')%]u=+/A|rtOy6q8'|] -2{Oyh-J6cv-RQ 锬@3w S=`#\:;faOT<7 _w5tחLNg=H\~eS*F#qu\)=C,TۥR}몹ZxŃcK$$X$,\SErJ.>.IJϏԐx/g?'eY?ݥ]ۢe;$U\O'^.:v &dbk|ezUz+.3RcWOj*).^XBD^fpM=K.:YX1YoZ"wUi^#[D۝ I)"Lr.# - JJmtEo0Io X G##9!as O ;Cэġt= -EA3ARQMS&!T5#-nh;zǒGt%껬#؅D?s‡ns5*U1Ț;3| hYoE~BN7Hφlk:S_(B\Txm`ełV;*ƛQ A[:U0ۺãPӕJA٥앹08fn?.[.}҄mzt)g}~4 !N~I;L ]-@].UHIHUh,d_cYX7WaO:PK -J:'uٙ JJ&~e!D;@v -M#%K.#SFg͠rA>/➆V"&i>@&q{>}s5T) -ǜ{9ǭO{X-.`+햠lmMkD]; ߳F*SiRB$mV$̛H܁nYb i l؟"CYB =>9@A?["{zr=rAQ6_ىŸѩ2[u'ܭE ;x_t!?^ nC3會x,BV=V¹Խ#e+8+fb;0DL&Y&_욠@m7 =HBGƭA] 1fc]&d?2e -*t >ݩ|!z{~ʢUZTǤj g_S -c`% 9 UC@&Yyg2w5oޔzn0s酎Uo₊i!0 -EcUOsa)=BDQ3'nRKSM?Ahyv+;ZnFrN瘡cՏi M- ig?05uh\%j.D! 7"9_8"726 -AIfx*M4 ulhtf"T57f05xSCsiYƛGC(^ÚY6=jdU+9(6 NwVq -]|egk)f'^t >S7EC7e)XO-u7QTp=h? -TZtGR.wDUk3kG2E)N5\(!Ut=}l  -W N!Aj WMfa4,NA42v?(JeaIq[ORao*wރxW4,8Jhb ~鲘lDa_w's %tnQ3aazkA Ek,2RNJlȰ%/<鮃^6o 4 r'Zk͹(pfߠ8U˔M-$%WxK#lW}=9P.Y$rմttǎjwLjjl[ ;O9@W, n'URAB.˾곯 |v(\DRzK{zj51kRi|ݐLq.{W$Ů7 ѓQ}nYO3C)gWO,G\9tB?9xD#~r/'e+IР>Ouk2r#ZUp~7uS?^ ɝb -hG)s[Vq{Hr,R0AjzPlh$a9)1vL.<н`!,klU'{1j40 -< _q͇p`Ny-g 4נX xz%fmh1!CΓꇢpKK?>[ Օ'YFuw6C)n׃@T_?Mze)]։dPh&S6~CycQU:Al32l>nL[ {K?p{CEXr~c^#{}̆`^Sv<#nʥOoK(o_=m]MBQaQ(G5^@HLqxe#vJw5^.kN!2y)UI.dΌ|$C3~TCEfZhB>Tndd9nUm Z 4/,ksƔw]JHg;""-y!]h U?q7ܓ[d撿轂;owHjS:s_<5Ux=τb U~rX)΃*9wpCwlKlpJM11![h,q6Kjb vʾ  qX%C7c]znJ -`Z4+2tg3.*!D-iJyU(ӌM)ڮ=o}ȫE2Q|{B{dT3Cnt;iOn3ZZsdXx3J7 \y30{ CsDK,Ռ%["xQ))?TvE g_ ݜ\D=9sQAr){zr{M+\C Zt8)S*[iu7)+uRN&P_- g4Rp& - * %Dp\B -iͺRh_,KfI3  ,J{Nd`Ȃr?օV!e:|"tTK$[ 7Vx+#0^9eT$XF:APX^Th]nћIvW9qcІrLVQ䲖}TaGp l//'3*kTFex)3cs*zx\ 6WVu19I1]9. ˸XI{]H\u c 3Wm}+u7=0K>*Z 2-TbzBĀ#E ~C +z)iiO uZc|g$'>}dy2QJE ?߂J.b<ϼhf`VUCRO),Yˑ j [3wh7w)'*Dt+p1Wݾxjb/i8@:ϷXhW\j'5@H]SGc~$(d킴l_ZI R~EXy(J@ "ui}mE6&! -endstream -endobj -1943 0 obj << -/Type /FontDescriptor -/FontName /LZOFVF+LMSans17-Regular -/Flags 4 -/FontBBox [-395 -305 1355 1159] -/Ascent 694 -/CapHeight 694 -/Descent -195 -/ItalicAngle 0 -/StemV 76 -/XHeight 430 -/CharSet (/F/G/I/S/T/U/X/a/d/e/h/i/l/m/n/o/r/s/t/u) -/FontFile 1942 0 R ->> endobj -1944 0 obj << -/Length1 1714 -/Length2 1537 -/Length3 0 -/Length 2595 -/Filter /FlateDecode ->> -stream -xڝT XZQ\@D^,YeG@%$fT RPQkY](VQA*RiE}3A/ds"_6QAnS4-0D1TH$P1ccgbv-``r X 5-x"d2XecdQ3"FŢpt[I ,8шxQ`1h4(3A`BlW6p_e\&CPpq( sa*2>'w"pN -BRB %C0An`8DqB1N)p8. -M$ph2)]H$]1:mvJ \DO.J<1C0<\Px ^ ,GQh ߧBg46IBX O#0&pl"#b)D*+q2/Bt0!(!|.^0A8#D욋hI[# -8P H@.saqpyD(m" EHse$)q2D<)ʼnb-Q9Wib>N H ST=`!+'D)B4Qͬ)1F$}5u'&J}xg΋KS$YF01&VB_1yYqERP4JK%']JhF▓0B| a0g fRDGݛsRy|D Eea x(ʋ0,,@,Rd4 q@H\dV."b<) G$:}YV p՚9f("֋x_]àb&`v+ ?_e,e6ALK`eeI$QəÚuAJODv"Tzh mdiYrbhMARebkmP$mҷUJG~x\h\ĢŦ=4oͭp9ԍenZѩvtK‚ jy8vh O!Xi-7d:xQz{}9c7,UUbʚ6Y짣K OFks25F>{j1i.a?Tˆr]ݦY3NOݳsŻ[*ϭ Y>jB9o\iA,8֍ѵ? ^[0IJ,|[<;8t~—SMPx&Bk!1cdT gԯn>玕_$.283뗙I;tzKTݤ9/`H2"’䎊xh"ǯ-l7=}nNϜ;rkuG#CǾ~Ɇ҃OBxUk6ib2:#O2 5PaU@޳vn/-< 7wݣOϱhdO[h |Κubx4o<=8m96>`n㷶l?h?Tuj|ncs*o_6'q.4wʩo`lmg'D^nO?\ٻ׫懴S(\n)?UjxˈYtnN˩>J3k6~TNۙ:8p1G#s}绰KmWOvj,|6%n뺃w3sB_щR5?l}0;h?LߝSTE5,H;~U_k֝&W͍1\ݥz=L~zmP̉Rt8uחѼ4⊍חլtPz%ļ]qfo}^魢F6`qzd8\ zDg*ml <xl_͸#g]d֦yr)(+jw>%Bu_3X? -endstream -endobj -1945 0 obj << -/Type /FontDescriptor -/FontName /MUQJDS+LMMathSymbols10-Regular -/Flags 4 -/FontBBox [-29 -960 1116 775] -/Ascent 750 -/CapHeight 683 -/Descent -194 -/ItalicAngle -14 -/StemV 40 -/XHeight 431 -/CharSet (/greaterequal/lessequal) -/FontFile 1944 0 R ->> endobj -1946 0 obj << -/Length1 2255 -/Length2 26772 -/Length3 0 -/Length 28052 -/Filter /FlateDecode ->> -stream -xڴuT\۲%8;Kpww ]; /޳9=WsVճj֜kt/JR%US{c '/oog/baf100s"PR9@vF / :My H6 A F@;sK; ͻO?ޢY#k{7gkK)@Q`nPF6f{3P * -RQTWRa|`?ZTԥ" -j=@J]UϻdNPP{}wy 55m% ?`-/mߕjdoWh bw2gtK3U;SdW?498IkNvп'ͿHca33y28 M%sqrCڿ_g/#^1#;g?/@ z?kfiM^DAFRBUA߫cr5O<q9^7;ޞvb瞧ON {'nhk;{7;OM],]23݄0ӟd3{|fF6@K3+rrxs? `jizoWt;3{ϿJw J;Ml<@3&{{;P+-*ӌl-m3{'?K`cq'xL&.f`8Lr{=⿉=`RXL*{տ77oznox3y_0 2+%5EY96{­lmFw..o)yN2wNwew?]E| ay|7 v  goŪ '{k)S@ŇKGʿxڻ{1sޗbɿnJMMRBJ}%NAS0TjC-gLwm -[2?I&iQaۼ&UNݘ* oHj0d/uhlo#tt?FN_}.km} pie]dvְ gLơM.@M;c)^WVfsXUÊ"Ccg=뮣(3;{{Q(CUڽ%^CbC%t*Hu܀ᠶpBYDiak-?F-7jhVcvuO`PYA;k KЧC}TA$W^#/X@"|wxɲF|r85q{ݶq5fwY!mD".ǽ;4{:xAd D -t7b?Lߍ=} eK#]3bi#(Mc =ϩbzKRNX#KT! IN:_gW=m&֙м'{8OJuOQ2CbX1QʀF;B?fT0M̂ۏl S!]C 4bG16&ל36?tbWKEi&n4F1Pepf?3O[c=fb8FYP᮳FV$yhhGl H{9GO->јh<,HMk֥,@ht9 -ΟwCC; nCߤk;c*BI :Å4b@T!&:rK#%-3Ow(د#UқR4O&Ѥѷt6 @c75& TܝˇC*}kM)g/u^Y&9p9XedRE,I)+S}|wt Ĭ~dw&䞁j7H"39 }L`ɶ֍h&)1~DUy{Exu֤B1<ܦѰזc+ɾܜ@Sd"Q`5?mv=>:{~x2v=-G^ dyNכuNךZ[hOuM Y\R9VxZ@ARVRVhe[$V2 BV]:)-}_4 y:]*g6noxy6ed=uPaO&pQ{bWB/8;)?KMa` GppXkZ[:7:uY>޼VSnnw.pP.)Й&D`_O$R=TLA>OU ЕxNӘ-a{oIGUozrf+++#onU#gR9No ,h4n%Q)Wz1T&A]>C[-?=ſ@dw 6-TS05R/6Ycf2+޺,E K"~D+4j -=|;uY@&ՎA>d@33^ȳ/8d_3zb_ ?=A(94Kר};_73](1u!lI#FӇ&<=lyߊHmI\Tq ɳlBȊEM\BF$ٖ?J|AyBtRKq݄pY -yQLvyoʓMljgW#(XJi!0e5x(tj&ټRV'4i+Tm_5&G=)4`N)RW[u*Ժ JrZ۪M&iQ xY&TZlzJä8sk.B֥L'MG/pФ dpTFFs?UDS^6J=N05ĮIfGʥlMBI+Pg}c#z A.}DaUBIE1C|wQ7X_0j#4~sUS0[JW=w”CvJ]Ǖ3!Vߏ內^95!ʙusaBE{>_+T-ϟ-B,l; LR2 @dtpMiAlJ闢\//Ɣ[W}]c6k_j#~/bt}|cm,BGm=m1ic$ZNcGQ?}> HuϏeH/h#|XXh_>V~'(v6@g" )@4+G;.*sL>'c4B4}.W&` "%!r<{eS0gyt**^h0\Z#}[dhpDS( Շ.)F< ;-HhB\,Wv~VPtFҕ!+m ;\Βx0ėƍǕ[3+esB_A?bi& $@ϗX+`@.Qvmmˆz1x.66d`%,s2]soa |Hԥ%1]Ú̀795qIhKxD|B -lx~K?$ˌ8YvqEC-<-Xd |,<ۆ%Nn")4 - z@l Gg]2/ zѤ#lN̬3z=ud` \1pbpsҕhqrɀzkdΨ?e(ZSk,9[ -OXu5^b|NnSbFRK2.3>1Tџ^J4g?)9n,. D$8WQwRi 5PBf5r3Wb=T!aXj֢)b}EaS׶2PY/Vtekm[/XT!CUӴ Ԩ†:0"n%Ggއ8&!/k[6A kʕ_ƋpS3QO 1yEn0!n -ThқpQR% S @OO:~OĿ|E6FWsq>SK"1iK;*C/ OxA;b*;S#lGD .,֔џf1~mT.;+MJDZ(M'EI+Ɂl7֑8sY,6Azp <ژ}J}w\bk l:D/ U0[(58>+bh4{Sx)ޘS& <'0}u6$47f -mNP0,h"KW;Հ! [9+Y$G h)e`0wƦ ^ܵ 0nalq(B}8咫@AtG e^,Ez8i;$L9}.?s/ d+3ڵy-(nLl!ԳkHdz]&0 {cq."h s1X` "JωsOSʼn .u1&>v ;M-&r)Vr(om=e{M"-0ϚU5Yڠ> oy(GtX-ɀMt(~amϦpg)Nz˒I> ݡ(3&{,7hW!HV\+2=jԈk3BUt$T -,fgq7'UZI~ ]{.̣%Кm9U"Myiuu GC4dL-X0<[t ZC S%>sԖWBJm~ZqDM M ^/!罻G2^t߃ޏwFe6#i!bwl]p3=IR>Qo, QlXR, -$|AkMtpFͼLC-Dԑ.SG1<]Z]+꩷M|;h1p!(Іh=#ϸo3p-\0Z4/uPh_} َYV."* -a0R r0"%h[+95b q'VV' ;5ۘ,*C\cL5-|ZNɗ(?Sk(poti%ج‘ "5뙴v icSi]*a-<45hVN6ьj̱X6Q+ 1c >[wFś{,,ql`lz^^ڦ|is-D x{=9|U6$sd:`HkaF3&Lj;+ª 3[*,ءxLY, >M䎲Q- TYՓP{ֲ*h0(qOHY@!살p@֤7lbQ৒lWX~kВ N>X-8{49hK^K }=OD\SYy]:]sO)d)jaWdij򆬨y7%-V!r,u ?mZ [CkRyeN+51/-2z a n $v6Y4%<3>J8, zIU9Z~J3J0%r[ٔsMQ.۲wY2EX8x-52XG T>?~4ɮd (~7/#7Rx&tl>'ƣvݟ ǧ|ƹ=OA9^b=jUc7sZ4K ŵ:<JDҰoכlaX*ݣ#hLd+ɖYHoQzwt>|*{tGjIڗ~ Mxdk/E{Frf+dvW|.J}$Tu  4PL&1Ag/YgYEH*ް_x?h583$q\:"OR 0  K_b0Ilx2ʉKbD 0{a<}`Jjix-UbAeo=ovDrnCJń'IxnQ0фoddc:2vD͌REwkC7nfo22/uS;5J<\o:Yyh$!n#lݘ_k?Lm>Q O] JdH֣:F4o~-1s{_p2 -VՇtu[Yq<2D~ sYg#70~ 隣g?(1) 7cMf v}45P'Ԉ`,ƭ}b|V$YE}E wO 2-Og}Vi]ZOK-S37ګ8\Iչ7_eni>51)YYtƞc}=[t:9/<BlkXX)7)1Fy`ک'FYqJ{o*'|j)Ho+h:#y?1[_{*7ſXQз$x!m)Dښse'1Dc6!TC O3CD~ Cʹn@UՋ~CʱQ⡘P@F'\de#|츥=ZmK:KϷT&$W`,4}%4}|NKK(vFo5XnG'eļ7=t e`2gFwn n=ʑ~%- ;S!,y"S!"ݩwT2ϥ;ղxLْ~9"uQ֘lsITKn71A +OC Uv"eEl˚RgnYYЫFg,nFJ(P,eX9[SPzUlrV#aJ'MPKK״Z&ӎżeM -| jgxv5O}̹N/F`:35v];E :wMY/Fn;o9_*Ky('Z^xݼ,{_czOYg''0Nʝ4b~hUΛugpqFiE`y4AP) yˆwָxUu=XM.ôm+g%*Pם&m +Qq֋LCmK+:L&@)H:`8)A-G=Ӧ1Pa~We<:F:곤xhYj -48+5n;:pDrUYsn\%"BU.ۑ=w=ŸM.n9'Źf8f]ҙoOp e@?o -将2L9W }tb+Th'I!>0CiB DJu)($g%+ ARrvQ˲AyB0O#xohSGHQrXSX@;RjKJLH;赐ʴ eh=otOqN™3.AԨ]tnfyzpJI*¼jh)mIdg9ZX?6 u14'IrsJÛo8I"ˣÔR/=-ױ"^KϬ{t~G#ajr\@NJ"x|!Rha+[+]V^G^՞8ߎdFH4>32#.A x* -]vF˽Ă@<5+"W~<qnu l^%JҳLR>iFqqL @)55X<."yk!c"a1sy -S.wn [1]K/dy[k~)؟]ѱf~ )zDR/9so_Qep(b:!ĺ6Z -["B_RpV|^mu(AZp5z)rw* eTRs×rCj Ar#zqb-9 %3)ʟ/kYcQҾV&ZmMEƒa{"YH@Dpo a',_V¡M;w.zyLwĬe Ӑ ۮJ87EU -_5 ѹ׎j2l睡x J9ץjMRq+']ZZ:pl=q0N>L%ÅJB$(׸&^o\4x&2FleAQ najFBI,LY Q\/vIy6T1LE, - [B[贚/( --E˵8ZĬMpR otT5 #f$Eǹ\K IJmpGz:@HI e)33D{j}p? VxvHWlWNW./ԩ.~BH9.9:FW02<ALx/ w|X*Sc/Y3KZ񐕞oQؚ/GG9aew$3nU e$<]{z$aRݍ4y,daLp-'FY6[$ -(#z:)zյ?ٞ.v)ر Zb -NhAtkb/bﰟѷr4!0+gA̐BqY`[t/MC:S$=nycxL~şi7Xxܖ<94w-+t1#rcXQL\&hn$@XTGdiWbas0K+\4f5 Fߒ+t{{}!w:5~ RC a5HB%)Ĥ5tgv.4=e]a՝d1Uuk|e}\~1p_@ε1J/2k =2 =oO(q Zc.? \:f 9JqEI4X -Y)\QzIIj[栥K2CeDj{#+T:gz~' -~9?pMY{-ݎKeo =X:'omL0]qs+\ϩy#%_=*8 ʤIsļ4NđNiޣoc3MŃٛ@Gae ke=:K/$&$1NݩB -.;JJjwGKJ*FM9EluB!ethBa?ލCԑ'4WOnU̸PVC9G>w}j8u9q"b!αYg'f;C]h]-q~D1pX"5)hlInuoγKvE?Nc$wxbTϱ >b̂1varsokPFt3}6| (~rN/%W'W՞e ` -Ѻx=Oy7é!j2WDۘ:!{tL-qYlZic5{j:YbvtH6((]u5;c ޯ&_!?nx8NJ3HuVhނ;1AV[dG 9h:TvD/Tq~NVChG8DO#,ڳTﰪDܩMtm?G9ȅ0`3B!bpE|br@>LM-ELgWcZF}+x ZĞW>wЃo3~4w'j•GJ(!fHk+ ,`OEBahh! cQ!d-aX[(7;>֛@VH*Eן7HcaḎEL4b"bsX*blgKQ 3J)Lk|c)r1S4;:Tg$E[; -;]6xbYAS-_Luɕ2hs.2x6_BFT#sX e,(5BX-5&ndO~ ~="~,jXۤc@ irceqнe9OW,ƃ.рgttvz]eף -[6E#k#yς}ED#5Cn`Y$wՏmR^ٴ/9ٝuS/3Kݔ𢲌7>Gdr؃N~^Subt8Rf6 WDKUɿӇy*+Z!;͠$E{ceRVZɫG)>s)\Ԓ!QM : !Iɞ=/5 m?+NZ(>~$ږn2;hu;Jpq6bhKUzlEa,Qy6-Q0N]M>ZGI,zfۏ ?gvSFv7b%41 omhw}_%T+t>DLfKpQ_Yf~gi[[͂] @wbJy7nڥY 1H"3^#VN`lӋi:Gݼd*V˔3N=پjă*k3zJ&~jƗO8OPNFGcx(\YhCh;Ai*yأ a2fv Re|Ua7?Kߑ8RUhLlVr,#ao ڝ}Q?`rJ^>|]n_S#ᯉY>~s-E={ȭM]/\6kZfҤݓۼaN$[-MpjBo WQڨUǭ _uv3?k(:o!]QMҭ '{$`jYn^w=5˔&?*gZB̆DP"=_+'I<><ܬl +Cw\}[=#6SǕDa%]Z'CX -85`6Ǎjz{6>wWh^%נY;w!|~7Ujh5.|pso62/Uu# kr[(iq ȳ(&ӫso)m-E%с^<017/UeWͨZ-Q~cojDQm۶mضm۶3'I2[5P~ҁ[JJ5odpzV3ŀn -=n@^4U})Ov1'|Q(*/P(qIG2Zp׍f@۵m:"7=#AEBëNQ5 f<H  t?n0PVȫλUcQC'_F<&U)ǚ$\QÏ~< JY6Pp&5m:j\*dMCѪ=s1IJ~C.xIN-% -gjV?Q#ᠵ%\š{yO\@ay:@)#[cvYՙpfI[iXkk1 X CPA -tiuIP3M%sj$[$nߏJdujnJW [@;0ea⺘x^싻hvGAC\hC&u\aW̵F|m I3`˾ں WPKThb/Dmq6ÄKQ - ѷ,`|uQ*wV\?$uDWE/s*2_.{Gb/kxGH5±t*DDW#4"ӂC8Ï՜W;DzFNYw\\$J7e nM8k^QM˱|Rye|x_N}2 g"&8;>q d@Iwo|u(馇Kk '3BEKL -2PoDYxtۆwZbt {cc5<_&K[ G/ t#g6eϻyg#Աߕ)='pPLTZE,9 ~ηP]y l^hW'YEHٔEZ7#ZO -ҋ]Ǐhx)ۙe,a|cPG̚Lc̨lsy(R홶UAJ~3[ tu[4T+(yhPf8)jR3*reQn \ԬMa*ɐ }b!ӄ&\'TrNW:V3aR d |`|.HB1@P{-ݥ@8t+YB?[y|CN,DJ„+Lܝ74¬@{0$B bvb[윣_xBˀ?g -ZDyx8\!,G~Dqp;3 Thd9_BɪBM\T6pHu@l Q{,,b}fxtܓtsyp -AκZ07H'6?2x9jW/ĕ'<5ƐcVqR%ysNYa!1Pvb~-fiF&",V\o[s!N+3AZ\4˱u*u1DԐ5xsĚHL[YIYI<6 0 mƓq͑Eh3h "xɼLOu-wVT'fa/jS Yz ݻHa_ M̻UNdG4*`Љ׾ђEۚ5Ctӗb1ekrΟL?s/SՆNAݳ8@x6SI\'ng -ٷJыIU?IvMbR+Vs;Ҳ.-$4/4_[g02u48jCĦj3mmm'rʂ2?zMl8ِbnaG}VNN+p*6*Z,B i((WTT1~57( i|, -x쇟uZHjJ#?j&SJr!mFp8+_Ӫ=dq w+$x 謎8p߷󵇫 |Kye>V1FOIT+1|OJ׈Uh,P0l-E7U0{,b/T^ZiqJ~!B -׌9ZT1bȩC$~iCwH[#4Z0w -Γ'xoQeߥqKz( ~,x-r|%v$:%Q#2NDSy1kv'G{kT$wNѷfӕ.& jB䡯f)?0'Ӄj[#9xo-\X\mhM_>nv8Z\ -8sdW f:&m [mt\/d/6R4dlG'|FҤ鷋.wj?#]pJ Dt⎶tiT1EkRIUbBnqx _o˔N!bA`'tHEw;B9'}R) -mP~`hkPs01 -F \IQ7ŊA^eiFQWX!9[tjyW~:՛_oAy}^q'7S-SnQ?7!Tآg?y tzrS; mQqTF| )6VloC^w 4d35O%TY*,R|7<`OP?{K $ D4)=^Pz͸T+*gDwA^veg", -LN9b8I8"1K’7hn(8d?Zl*eM뻸\^%K1tT?!c!ĵK.IjhȠ_eeDk,'8#  /iDP:ՃQdǵ\JkWFjmHzߊw{ŧ~ˠT6k<:!#\E2h *[h/EDɃo= ygQ\仡OҔ5u`vs8*= zh,OdhQLk_ewcةRU@3_zo3 -)un.?\m}ٟFkc9 ?BźhN3"8cLnFkU ^{r/*#ɔߴtZIh>wqʊ1 --`a08TvM}M7Y hO(췙kjPU7w - `?@;Qz6gLVr1:,;GA%L_اa;M'>^@GGi,1I}v8t -``oF"tF7YOZh*{ƚPfSA]E%JM;\D `{ h,;􍎹02>܊5N֖!4)D\ bruD - VrʲOvD #"4Ff`"Ze)ґy?6n4H!azޣF xI%J>O7?X$huRÆO&h9Ba'Le:D#! g fϤR5= ϤG}FQ"Wh](8cƫ_YO|EYI*ҐV;L$ uz.'mmmˮ/jJ 8|=YXh{ *w)ؚ-0!d)13 -X`=Q ( c[C+Ⱥ~1ׯG3/.tul_ԆvJXWhnQ.=,@̇/ ֝d]2Y%[v-EJxH7JjܝK3#`"42)fjiD,L%' {bwJH$wfV8ܨq66呚ѻ&w{+ڂz÷x5F| 'Od`--*"rrP] -k]VDg -ZV3KT7_ǔ㚷,_ҬI- u*}z8"g䚕}9q vTYν =9HKIj=3Tϓ\~Ь́X#éܘ5*ը5!(]dD ʍls3˃ 1JAjw]] xƏ~_TM~ZG¥ǏR?hmmb,?mNIGqZJS*.MvnJ>l`u0&,w{J)=D*qG܅o>qj&W"+p.݂"=޽K&cZY7fm#Tq]܀VsyK[w?2Fb8t/f:Ӿ_7tQSĊ_ʳicbh繾7fygW>r,yL C#L%`׭!/~[ܱeHnz<9W\+KhgKtr$4!YaI_r)b8z{t8ceR|twkf^>*~=0'ڙNs$5){"&l;dlfVw_mܔ͕94IRxz[iDc29Mh|J1M}6H#Zto~o%%1\/KMugO@@l.F'ba`mwbŭzfn y# W<`G\ kaWuVkS#[<8w%t ".I=XnǛ*, L#a@jsI(J;>]t#4IVV|x+<<7[3>2V;ZVqBz?FpNwEl|T -"MA*u"kOփHXkB^f%#]!GJq X.XhjOH & :$TQۦ;Oq0SM8561<%bOK^G -4q&&d)E@x"g\bM`O -aD $w|)tzr?f9Uĕ`SN{;5Sd:j,Ș/~&+Ww2vVTuYzIå&2#F4}2ͻ8<Pծ,>jd9&!ecV$X?`3 -MY}E <;мOi|"JygS9?/!tJc|]1nJژ/w;jY;Zqf8zlb  -oo+28b|3&ȋ(8(ԔHJr5k~sG] V*b!o\5Acmï͆Sk^-u*?<#*u 1Xr.O) &me?^K,Y̋\rwaf)󂫬Xj9k@ ja( cݺWs7QA[McE kpcG!λ}_ wJtC]{lϖ6APƽXbҔMۈ(\OKN"+ښW Yt!d9X9S/1ES6ſEnR6z qZ6lQs˜PiĝQnBֆm('(eNo2БA -δ3s[ל~ג;D{vV[ȏimi^x&xnv5lfб֞$Y\QX,m#,~ʢTe['я[ԩ-1Xb&K)Gn_?xf'2oҢz"ȿ# V\TZA$4'&PP -^bP3K3(}5 Kp:~Il7tiT|׵մ:&` D*R~*}b1捽MHw<6B:xg1Ò+QnI )qLn (c=@ګ Jc3`^/ҧQ#Epm6%)qϺpt -L}Qhk07[x vWIH>׳K\97`?-Vu$3+6' -N6jCp*2h&eżmj/@"zXy$WHN& wkVTXa5}T%YTEeXQn>rl$V}cciTX{9 b-ߏ -AbA -!s_ 5+WRʓz+G!3*CZU?hzm&p<ZtX@n{;r1d@,U+n}YE6ޖ*ԨYƈ= 7nv՝3oÖͬ w\Vv*\J|B*tPYqߎ>g/飅-}V?u.fCD"}a,QY#ؑ|E_nDbʟc9CZI XЙS_=])\n  6n>恑rn,Պ?ih8(Zq tc1Q63)o,ha~ej./Wbwxjh2Tq1q>x9@ğߖ<I5\2OJp%J#64bs8dH2rzM" kh&Œk -JgaEFR+簉:Ƶ)qED۠HCTcRv%㐕nQ^/ q8EN}^H ֣qxׅ> endobj -1948 0 obj << -/Length1 3068 -/Length2 30616 -/Length3 0 -/Length 32320 -/Filter /FlateDecode ->> -stream -xڴeX\ݲ5%Nݝ`ӸCp'wCpw><ЌQ5֚@NJ/ljg 9330@vL*@s#G33<9#$f L2F #G <9@:cf@+[`ji t]dfU3Tl*5xMM@6S<3x ٳ%bc`d X&7W*;G[#Y:IXM,M,FgH6ـ3sp<& ܅ noFeia q32LL-Av<xX^63(F3`0s}Fߢ! `b7Q߈ (1%  -`2"A`. -A`.hA`.o 47bf1r2)r6bgWpX?lb '#';%dhd~9%fQ%:=7߈Lr(q^yJ3̍6h q& _1⢍i BFdwuסM-P:Jk"Xab\#r8T7*ҩ :mPn#4W9jrŒr -*! w'zVĶte]V֬z|a#T5*)2s;C;+8D_pskq9uDI~LPzQ z*)T=h^QOx ෌zSH\.(#֤Y@BǹN##4X@Z(,{ 4G2Arq~\[.6Z҉ .B]RfsHfؔG-MS],X>|5 =L^,yPKyղVy:ҷ*\?ف(`~_{?hԙl#AfK(X}B!E@|,(v%qZ,X:wZV'g?ek*S'2 -B&a7B NQrO"zmaZhdХ̬sm] qp_ hb#9!ܩ."k5,MTJ#N\g2_ݕˁlteV!i=8U߼Vb/:uϸ -FE3I;41CZ%Е+D)ĭ5)6Ts1I~.hk# 6CW:{mrK'cLzh gv1ԅs^d - &$=uS9{k|H|<0ht*]A"8j8@db>=>'P5[=J-aYl_W?N1BXq/&?OuqRlVd 7XP<< ,@)ʆűw1tP%d41Ht?'+ |{uu6.q[! ѽy6zṡiu.错+!8kf((Z+B WuP9r/B@eDymT.5\(ƙXgtseA9^GC "tCi;S&[ I(pElWW&Y[᥃ðq+Q++a6R;'X,"&) -+<3.ib -.ӛy8QL^==/X9 ߹jNiUQ+h],:@cHH(7:e!Ly旕 urfXZƉlD1%l-íb>1ǯ.̶lnO}K}]/,zLvC,EbXh2Ferp6AYf.Lea޹ɮKBu:#:Ɲ:6=OTOhMgjE[ Q h(g-//Y@f p?u$Uy;G~%,.=]艩%5>c$݉&o md1x%@3ӣ׾ÖO" 6Mx=HքV9iIO-pb*s[N&Z Jwt }q,ݔE0-b, ,8cH((CYs!I̅0G~\f%z!\ma~ -YPG7=w,vmbj֌um+&C8!2.ܰ I~Ozĉe:B·IN ʝuRL|w!/x$?suWMUo,wIIQ~DBrBꞶ -["* {aK~_L-g2xG<_t G`%e-e%{9K0eU+cpe+DwItQ<]l=\LܖW$эujIq+ Mw [;1嶀/}_߭b6F/E]ka5@5SK y6as >um!],癩pDP ]E{~c;.$g4(?K, é0ĺ}AjTV{#; U=?f`HXи9o;ElYP2{%eH+$a !?pL H#Z'/sPD^ʱB9s. Dt*dVtgY -Fii_pɭ:E1;-M̺EگZM -X[E#7Jy)t~<kked!ܹ0Œ!3,uǪyC_Fɇy@βuR=7^$rfstM/x$M{v('8MFa7NPxc o GL*sq55EQy(KQN1bc1 FO}H"Ӛ<$&פPPoi\d'DdĮ;<"0F`"nILm⿶l-$cvB7 ƅ0H$hg0c}e.zV dQի6R6e=0܅tmfpڋ;k!7LièJE `tp6NtkvIt;O(*O0a}!6?L?MDNW '%LKz' R5&q^l?s/ ion`dWʚn7HRI}%@YF֗8vV9?@>Ξ,V3]t>kyQ.؏u?Rf3ڄW$*KoAVCEwNvk3'|*-魥&4ǀ9-{']>e`:u(L6 -d -}cڊgBom~XOR -miԮ{19 2GDuIఒ^]¤^cqhyG%Eup `S# hH1XX`,dm?N_[_.Q'r-hSt\Y[vo BTBg)~ n huUMG zRߥݛE{05ףS30} 燌z2`h;gVg-.-eοt@pOa #]_.]:Zƨ"GK'42iB&ghW6痜eUh{$DSqHg~?9j|v# /M1 =Ks?"ק4g%m/?{D.ޱ{N2*#2!ԫxtxjF+EI.tCGjLTF\^K[nOyNzchacGouKLTB'3?_?{T]4!z5MBBJC(ݧC4Q tS/`@A5ny.'.T+ -.yf=mRj?Oxa/U8?~]K9XchЄ"\#0nj&=lU㍬GL~k> )Pcw?d\j b˦?7Qp [kJܬFHR>\ /YJ$|:~^/!jZWAbGHէey&U^:e(k%9<.Bh@H-SscKxI0m'|ЌMt4U, .4 R4зiMwn ->v*RXe盭yk \F<a-Ei~~sj9f+C皗FMѕwU|YgojQ=c363국jUd НewHb%‘wU%?dg]d2U^'>ZEJGMT\rĚx|}BV<4z@HG3y$PBK;w:tT,bL.%T )XctF XMH^Æ{iĨE](} Pdp:J;7 5/|QzpT(0>x"ym)mgugl_M񅴒s,uC,Zv 2f_)hif|FM*qB:.\AEAgVJ4'+o`nDM7{4|5h6˚ @7;,h hz~JKkȜWOpOIV!wcƯ=7t!1\l X7{_j.0or\3ij:{BɳQ%ݟM#SӥV9 %g>d-0ZЀw z@Ю<6D@swc+| -/o;Y_jjMc C\+ !;dB} --kQ\6sCȜT :YMlZit u~G|°[ق;\/vG J;^@V0SOS>ñI_Ȝ& 0>tp|hן"Z׏U̞>Ƚ3m -?#rWCلEQU4hWž+l\7ˢNA-4rWۦ)u12"zFApC$([s10NԡvHtׯ]iU|t -+؊ܦ7p~揘#u4$پ4YOo?FS|b<:I649tMglN7C7Kh!{VXI7S8/YJ\FV.TVDdy2A0r;+p[cq{զ?BC:- H~D+oo?X]_wjp9DX!zJfȨ -.@wig{Y®m{Гqf/" .ع)+`\G `ւ@7b`xJNHꎍ -NgVzQ>EXjB ᢬ܲL F$ѐP-6+J}rc7Tl HjI)-MTߗGzU?&`$>T"Z/~y .#?m+6 e>T-1 aId4Ab`'uˎҠ; nDAfҏȆ´JPtnCxH7BڀJiC k(VHQREW,;"6]p5wCUpn,-]nJؘTL2:VA0šrcΰDT^lw/pa|~ jD|.h:V^"z5 -Wō\mk`fLH,x;dJK:ŝZ%)?c1-zKl\Coi4NTs6o^њ:jh`z/MT"YEܽXP b -)n dỐ᩾iR -qPy"䪾r Q&Mv]48D=i9q)RbM%p}4K!4-o2gs'VzU]jX:pZS8EK#7~[zT14ӤtKD^ۼR4]^gQz4fpGv};*.B0KP :}X㬜$b ##6c~DQe4~4(n!tΎ4B M`GۗH1/o>i:N~VǎV[ )!9NH0TWr8d8F[L&E5*uO-*-*]]\}O7[qih -NCR7ygM<cKk~%f=&B]fi|4EdyP^VM=U5Lj*ǽlpY5"ӷ+x1()*Hb}~PwɤO6 {xMƽ#`5G/h'= <#jyeNwu@I#w ۯ-Roh"") F2 -ZuM sд6 Z+J=t̝W۠OD2jM[w꾱*:>֌O)*GxAqv$]M]h#~[QgηYtEFxnf V-P{;Yr0)h,{Jec }_{Pta@?hFı*Q@Lf>{oqm&Y<洑PE -C; +XvSq}#8or#Gl 7س6hznZ$~#Ab& 0$ʊvl%Oنc0{&>ke7C0Mw -~ TtܨJ2ǥ4kElgB%u216QCx̉$Z j2CV~k"`Y9O5luAT`tP\ -$YBF1nߤ"rY~ q.& -F',Vt#zrb(Sc)Rû:. WZnIBy[>bO R ׶ySdd|E9}3ؿI@"3Q.ki*-d@,}Y3\50u1s#&ⵌ,Ex.n>6{,,P1+K߿IWImN؄> e _0{Bw#VSXh;_EHo4e'.&xdgK 뻉iGe92o.e hW?m/)]GI)f{"Y5: Ͻ9ܦ&Z 2٩ٱ|@8T -PYu5gJ\$tգU'Z^H)ޢq稕oo$բj伲mcu4݋_`;&̒)'TSi}K܏_3 4PyC9TI)S &#\ gv j DK5v*o6zy^j)t4h{WĴ|S5RoQپœU@ߑeK>s8֛;/c͋v#!{<,:<;P1;n5; ][K`hn(#]CjzFÇuy7\G -4 oX0 sӸT{ 1ޚ~Hi739%Y/*cSK.J?mMuLJ[[c'jٟj?׆H cɫ9wH_Ar-G>7&\v_9#fnKXd΍3(rl3uޞbZ}-Fu -쐗:a6X< ?U!5(:肗sqL+I.oA[P;}G -[>C}"H"f@YJí2p<&ٴZ]V357o#`s50x,g~Kv>XW L9BxECYVsڞ]<_$"2yĘFb$a¸?^VC3>6p¡q*7,/(_͊J|fꗋKEAۧVP:cYۚ#H6ݑL+{gk%AwOV70- -> —*Ca_:G;ݕ{&Nt(ҝ: Ƙ_] `ֱ}O{& -f^'޼%o,e 0dᅁαZm(Z`D,C"/'eV!cTAǒ緎ngAtfd:Rէ@[`Gj;,w,0xyۜʍi&Tq_a)􂣓c?0;G5Iz*D5MH>APvѬw߿B[< x=imLǾDnFlM -TVe"HoЉڡb>7z\`22˨sxFH45*-7ʎVZ@$i&U])V 箄 -ד fq!/y=3^LpC /jMF'jOF[jVM\<ln)l:G'ZA29 zguɐHJOv"Y&4l-?O$i>J#e{m orIBiу;(ZTz>^ջ)cwo}[ATRR8H\cG8L/ELgpĪu#aQU$!~!n咴GL]O/.a1аJAv(ݞxr7 Щ=K$8\+ZՁi]jǚ'5\fuZ̥D~賚dKdk$~ژ!$ʆ;y$+ޅR@/4nXbjGĦo ƌ4;g|4d!G<H鹼PR`C9H}&&EkFb,|JZQpFCju* jYh$ɵM[UkP[(O4S!\Rٗg8Y]4,߃<ݜDR(5*.ԓPԓ.77I~Jp(2gV\VTj";NbEN3D?ux4I=Xay$s }ky0 ]3|kUYqovVm*o-_їԒ]w]SP 5^]^?*T0A>Z?YYjn@W?E~sN* ?8=ڥLBg CpFX]SO$R냕zdZȪYApď}JL<Vꍀ`!^/R4_tVp/?rBҸ{6`e)1Ɩ|.guBGgjDw/@M0cqwF~uԬ-#i|`i cA9@0Eʳlж@lUz~0 +uC wDR\`0v%lZJPŚ la*4M]ȁKp_ -"H}9|]ܣIaN](WU~FiݾM2WPMYVM\y7,Ӱ^#kB.# -❞(.(>߅ЯT˃k6;TT !4k -2Sf_y̗m?7NePXY^5gMeCdjޅ.H=ëRȫ16 K12-w1h< k^Q<[fp<{jN ~[cXBtGgg$^z<9W:Zb[&{g^#c* #=AYE'O[jrp[E0Ckk] _o$bF˞UK12垱$~Åӷ]nm{[ȉ}NwŮҖ%q寧fdnO`RAo9\?, DE{(Mz~Nj9s -=_* cȨ}Fḳ@Yq>J4[$+o.lɚ]..M?i4|պ~F`h@s^_s# +Mm{?G`ʩȞptQ~ q2Ȼ^Obuږ;45S8E;ƻ 7cX@?i:gӜy$,ܪR/E{8FV6Ę.;\/T Tog'H fFTVXVw$}2uJGbDB< $\%_r-hg3%G9.5i,*B&N QÖ82o:'oifIp0\kM^t&8ʜj@. s,_W0x4Q?13|B"?ƉP81.^owXMRF^,MHl*<Ņx$Oq ۹0m۽mm۶mۼնm/fv"B{b7E;3bu9%JZV<8Yn!JƟ4Eot -{oU @'Gx ;~6W,2>9Y⵿TЮ;AAϰ,cQa'c&)Cdsm {exٺCn29 I=q)fkYsHA+l -th BEڵ)]iw/rtcAn|/S~Ӟ<'P8Vи:*7rF -Kĺ]faMBACRWH7&GEb%8`.Z2IbC5 '/g@ e`E Ξ[P6+YF{g[Nkm -_i#փQnzSGsWs L(˧%nlhcNDc -՜{,dkdE]#vUIO޳#{FO+</F6n+ڇ\r:$ɾ$/[1QrKdzXŵuv{M94%9%-jг5?DW6atYt-#Zoj/|J"h,+3h6!Sz٘!٤m3DIݍ -3 VXL;հzTnK't cT%6x0p7ΏaP*Qr'p%˂ey"oQb+`V;#XbeE9`1c1+Þ(;VV4Uw>*_G:P8R f~܀z82ѱl@N(v$X⅂9 H:kM -d!$e'~%+`O4NCSLyC W,VӤ\5P[{-1в\~b;X%%%p*i#~J.1Nm]KQ5$rװFqEO&h$3=)Է_y Çadž)=7(roKS$>M>&@ܘߪ+H%[-!ʄ,C^uoIFWvZt G1%a[aުGﱩPw+%7t1b4zǖ 3MMeFg>.VI/m#J%TVD@{!3=oZRZH~]OV\R _ i:ʪч{L.eVş,5 DA:#+2hDyexD iaК3''v)ZΎ@yuY}Ĵ/>ԝN*@C6tNI#R)4$b{!(VaO)UYȎ>\2(dt;B%!o{qNH..q S?ؕa%U&Eݻes-!S¹' 0@4c4:赏n<ڭ&coG/6YH4C{v1ކ]QP: 'Y¯!ՙo{b4aǝ ns9x7 g2 >3(ɡVrNc_:EZ7g]SfRRJfe~kV^1K@K&8 mj,k,Žk5vĨY jnp%uUz. ,un^BRteEFM1q} s9jߤ_82=A> -)1]Sx I(84̙ϝ(эO1f,Dl,=7(wl>xCc B|nW";tNKZ,gTQȈ2J8S| fR@M?}W$uT -lo¼d[q1 -n6MlYzVikCen [sv@idPЬ>v׼_%wu嶌VTqrЋM7QgCW~z ?H:>`feF -GNILvg'O׭4Lĝ qM#]dܫ N;4zhߚ%> -e-v|@ Q=4pg`sG9Pq%.'RAÇ2wm}LgHcFP@iEdk BBYJ ۹,vy$ Kj! -=ٞ?Wd;Ah[>e?2.anۡ^w+0'z4Ʉ>Ӌ{'y ۄ)CR|c[nr\z@ius,uCi.mF̼ic:(+׹o`ڪp g0t(!˓9ɫ›X ⊉,u\_}Ymj0\:DwsY2 z%u 2晜"|`7cѨh,cbv՝@J#^6wyW`t-蓮JYYKK<:JoB - --=;-jb}ǡ`_e4 /؝n@׹/aiʍeވVHqh_Yk\ł.=N$,K0|j]4}=u-ي W6skRw [ȟy*k )]m -M/BdW˯wp9w-*Y}G\+&FJ*K:15仕]põnbxM(''WYSc1m&`4jA5+ _3~L($f>{lWyAbI^*2`5޶$sme7IKk,먱&!9ѥPC&CHrH(u{(qjG]MIGaNxe1 -ߞ^#WSJ~emUhV54yLN%N7-jJ5Udl7j",g܍eJ'슑mk(T9O+Պf$S`)d+=DBZRk"io~+ʴuR62C[Y8a7)L: ZwVU^m%K|AKQlM h'݋V8E'',G@4Pbyr-٥b1;K[|8QW78k0x6/a&nاsO_7Vw^D+V`d=}E݁(ӫHӚ-jHeS{C%O|&Ժb)Fl !"/ 'C2lu6Ɋm8dCp2w.O8ھO+M+gj\10r lv]>6}Ԥo9X=k?U0rwտm3uΗs dڪpwE3 [`Ƅa`8fr_~~ڮ/_X4u>rX+roK jn1L>>\ւ11q{d?,r.ъ{|2WԄxLBpS !E4V*gӌc];CDD^:#"^nM++Ws?4#&ݡ7n/BQn!kiN@KݎtAu.ADDυߟq[ٸh/rTKNB"v0u%$cUdf%%|M0BWL8vݯb4m&y=ԇ}#;8U6b8}kG[8<N>F -3~Uou+6Ɍ M+g ^524 #W)E~BKZ\C*K'x[g t"pV{̖mz,m9t)E?9WV/7/F* SɶjڶgXj.;ŀpg؄teF9ܙ0u - -f꩕#!,D DOPRfaV}cڮRʒ焯elzW=s:+slcv1j)< hx'ۚ=Je@Ȍ XiV:h{Q0E'M`k,L{@)2& xE])ʿc㨷dc>`X́q-gQ!*ز/N',A9XOntz"]x ]Xn`m -;p`w+oIfR! _ -tPKޟ6;ʛڧH.Ftx,ziKT1|3WbTK,lHPd& -򿇕<$]֭qzgً.}-}2G|Xl;x :qrE@9;02z ~ƟkK~?{0` # tdTȂ>̗=J\P7u'Oz[!lCoi@;8`AQWEϥ=0H*p@Ivl{4F6yygǮ_N 'Æo9/ / -kxئ0#-m.F_0ca! @K`w>=ͱ%(Y&P혣UAg^!uYfS}⑫]1!!Z<S<0M߄g{Q@ - s m D"WgD'a/Rhi Dm-NK5}=ESltVH! a aW'`!<;0vfZJ8(z(EI=OՁ$$`׶^Ԅ džQwz| xpebK 8ax^H&VO(qEqFŎ5v<&=='< #s.æ.e ,9i"jTM 즉Ƶ#QS,SI뭫9h߀/VTe)9T̍"9le]DuF -:QV%oYzG J&#xQX*O+w]w?65FU)'9nJ^z10/L.Ԥ1UzSP/&f{ldz{ɧZzu ,yq0/Q ļ6GoZtĴU^&+Tl۰tU. {WN)Gi\}2yuX惈~uJg&X,UJn:lq|ϲIrZ:}1c{aKx X<ϑOw}U)0/<?HwhX?Ef6j8t݁r黝icz-DYIU>Tb__m "Gr\{M'eX-o:!CB)IGUUCk(Ȁ}>c6U2ϔ) $f8ph:S |*y6$!`@yd?GWЕy -K^XSq|QMti鐭Vh_x8J3s̃|D&gn5`csg|#}KZw3}'tdc Vo LGPܠ u}Q9NF##wП&2T9ZlMN7K<ۡGeKn^y JBVU[׽pkV}cB5;*upmC7m:0Jm&..R -ͦ-um,uj&MP":|^ZG -N%Os0 zZ lLm ^F;AJWH)9v=6J,ܬ-rH9ucͶ&췹ښ2"J%59 -ղx4\8x1hLXz^M?)fuigeXa?EvUܧ#55V;hȐ&D3~-,1 ĉY8|3d i; X]Vn5|<@P?pNXUQטr og$NkZbKpVS9LcI -M׬[o~qGvs{bYI RKI[~bҖ(?WΓ8AA}Èdl@}9Xى`!*3fRm?nW8cd@!g8l[7]w)d@ $wkȲKN7PhyLBP`[(bv 1|dԝT6*,$GZiO &gMyUIKk1Ⱥ,QtzN+[Nŭݪ#S3*:;"xrcc^Zֺ -eJ=tHfF" q g$+Vx`:Cܥ""rc!yPMߝ@8UֿjE !#: 2*W`+;9,DO/`JvH<;z&Ô f Ժk4)e56o&xs毋gkWv4C 7-;wgbYxX,fiaѭIYYaɬM#OU6{NJtxL f (6՞o(|(=)|%>3ew VK#}*OKN/EI٤eW > FsT$WZWmrvC}}CaΉ)>Ef'UЬ+jk\>Ep,tzǐtwzu‹5_iR+$3&uWVC'>m6Ҽ*{5ɦ*B"m?x3ڃ /Ec2"<-9rL=涖f܀"sc5&6+@0ӔA>Ru.dJ"(O~W Xh4^g!eΣvy.fdttPu]~?P.xyK=kUPv(r 0*#Hex0j>zVk 8Fl%6| S's(`/%9 s,Xa!X!ZH-+wCگ#:" F*xJ*e4CR;4ɦcRXRY, FDz$)>sC`mw"DQaˏ[K՟E#(~2:6LuXX'PAW@V x%0 -< Ln|86w6|-zx`d?1I*I^Il%K{(4i,C4 \N&qZ(hNY8mA6n~H#61 ڔ\s2^QNv 1֫P]d֫3zgC>*n u -PU{Gv!/ZݮUӓY}gy7|iU]Lr'O(.8`^5R*0p3Bh0jC[i@9'd^dgsL4:؂ Hzu^Bۏ9kٔln&<=I/Fڃ*qb~(cfjY]b=E'ɺ@_RE R%i )_2fe]AݞUeatNڛ/74#)1nnxvĹ (ugJ1:ٞh/@Z b؋Wss:Znt1YoM^?n=rkW_-{,U/DY&[@=˭Uq4N -kX@)D#Wz_H5ЯV2@fVϐGm^"qxyB e֕0Ct5<%ZC 3ozG6BI ]{Qrm*Z)z 1`Y/^ُ#_wk&!J VK|wK$R9w_$dLd6\~&5 غvue]Pp.0ڞa~Y`Cu4.bR:̙y'az -+FU k}l1mmؔh`t,zeBucS3 +!xnyjq+w`sDCEϰab3TۯZ~Z2yK$ഩr~rTfȕL+{P )VބnB,ujswb^~;*Ϲ@c[19..Wl~lߟhʫ-*?R=;mg)^-AXRIV,&Jx ~`F9rgxX_;= -{۴z0^=edn{cﳚ] E=NƆXDh櫖CYePiЈج[t5C$U1zEl+bJ!rb@Yk0=WXCo 6l>8 PEIɗ8(I<}ЇDmb1Gػ,)r}qckֶcn=Ht&1*IOy^Zܣ|fv'fvIh̹h'bSh|01i\6mN4Qdgѻp=ytA4m:0zɜ)4v)Aʸk;z_"S=,'̻esTl -Ytu0V-Sҍ  S8*UOcU'!o,{W59#2ѕZUx>,2u̇MnC3X+=a(ؾɝFu$UgB,Y3 NQїBDNܦ*X}}lpIMc*0|sŗgX.rd}k1BzNKLFp׉!s;>ale&<*=^0rGOQ;Ru?Sp2 7~G4:B`7":ƠD톆}lA$\]}PX+z i;AsYu41߱ - @d/,0JЮlB(P/JNgX\meF ~c#`!-?zrD ;0|b>r;%ȑ瓣![ViqRKm?6Y Ch-Y,&% %tƟs-JN Qf!ҿV A -A; u#u+6M)ʩk袇X "E;k8o:0 n;Eh71_+H9]5gQ`bˬ|E!X)k{2Ov8g=T5CO!e!!,|Ѳ#07ZD ##rĈ蛵nZkKg~UV:jo:3՟Gr+b2MCLr(SW":F=N`-v |} zP별9(,>O3 | -T}2|ш7aP@BpO@{n( zT`.2]C5V"5 l@3GOٗn&9.{'1̫K2WovT,B'{J'8ǍMrm]sPmX=p#^e*x&="Fyĸ*Km$ Qȍ-)i%a?)$]/)ܙ KXN+uGtV&rG,H UwJ~νg˧1wF,$ ֫:&)f$G^|kFpɷI)wO$ׂkne ZUKVQZ"l& \}|0tPkWt43vhv m9j O:G VQqơD;Ū )G?N2vKqscGi^YWwZRobbcԅzk}VSk Wꀥy0%E ~:%i(>=LuJm 2oi`LCY"JT=mHn<[oLHu-EfT)j.Pr4?I1CQt5fvչļǟKWWMkQ\W0#&F ]8)r=Ww^*BOBP!Nuؚʑ3V^c=KWH:ǪzM.nὣ׮ėrZ·B]lSڦc 6*A;eCh?ZqeQt?բ_6qsSMsoh,覲Vy)5]h2RX0|#331Z]?m"tMĂW=eNob"[儐wVJh͜/?MP*c\c;dPE}39 <۶سa`}0M@+n<ۮG'_v7ApR%7;4,RFlыu卦;!I -$<Sf5 h*|݁lTVV\s#}bHS,1%hπzus05ffG˂&qW 42ӽh=3uaĤ_ȞGB"IYVl&IKeE6 [H+p`,~km""{AΨ\#Q/fb1#VПQ'qCHzJ^ :OwK`2'p -RM)&*ΐj]:I~^)^0zsxJ~y|Dsvy& /;p[20dl>#ǿ!'y`hFyZf,1c8=,Ոpk0Swёe8 [ 3ㅫK}JaE#$- 'c1oxSG`ZgрI<svHKJQd=C >PGPtOŇI5M\<-ȗ2d;"rABcWNL&fYy Vb=Tm$X0nAghn6 KTk - S~c Ws/͖۞֮|,x(0v M'v]v|%Ubv~}a/%uo|3qK8xfPr0T/#%.@FRɈZwEGq -JqӸ5:u6!\BGlfKWEu7$.ڳ@'$^S]w~7gX߁/D!Uf[-vdSζ0 9!}mvZ5+du?*#PqC -endstream -endobj -1949 0 obj << -/Type /FontDescriptor -/FontName /QZIAFE+LMMono10-Regular -/Flags 4 -/FontBBox [-451 -316 731 1016] -/Ascent 599 -/CapHeight 599 -/Descent -222 -/ItalicAngle 0 -/StemV 69 -/XHeight 431 -/CharSet (/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/a/asciitilde/asterisk/b/backslash/bar/braceleft/braceright/bracketleft/bracketright/c/colon/comma/d/dollar/e/eight/endash/equal/f/five/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/one/p/parenleft/parenright/period/plus/q/quotedbl/quoteright/r/s/semicolon/seven/six/slash/t/three/tilde/two/u/underscore/v/w/x/y/z/zero) -/FontFile 1948 0 R ->> endobj -1950 0 obj << -/Length1 1711 -/Length2 10039 -/Length3 0 -/Length 11172 -/Filter /FlateDecode ->> -stream -xڵveT-ݝR4@ -$kqC[qKq+VΣ={yH,{vBE$j1JANLl̬EE$db21rPQ;M@6șM쬬(Ti b5N&v@6Adjb-A` K8di;LŘ_YC\AߥJ%@ LV&6@TTSH)k1$Vw84#@BTICbHkkM%:/%5D5tU$X~p:8~6dA{ p)rrgaquuetvtb8X2arB/O Oc@PAR/| z;_`/p/w#2V&bTT& l6{qt2qrvѽ4ĝ~P/t1 l} )̛(c>,ґ[Hh%ėAN o.С -µyZmJ,0W4Q!Db HW+i'ۓ-Jok&hvF=>K&7(i^ ?ր`6IF8?|e-@?m7,`Ձ)WC0Y;6yhr;&KC Ckl`d^D -,m~llt;9Ƽ7um%#ԝ`4!1+~{-⣏%nV $w (˻Gɋ&4^91+o1z?E'}Һ!Ѐ5ؙn"hlI| SC=.JcUUW\귣tyz+G|pgoi@ Z'4%)WT4kl4K-IiK -It"yYD”@|k䆚TNE! @se GE -EՠǺ SH@D.z?Q(9͠ud.o C-$2ރsֻ$EZg~P u.6񉒥_wSaK[ Zs@rkz-hNHxi9^eĦ?<{'o~ܿZ_{HTz-0';Ӗ1l&mo&$ߏcǤӘG\3qA=[_b' }uc4Ot-[av=Iُ?q+*lrrk(ԈZ]L(0ư)JE^%yNJm?奴ug qB; *. Zyau՝4(k_N"hߛtr%Pd긽=^#yXDg`Ѿqpח`nf5ePz}/8W۸|QWl4HqDe$:Hn~Uvf|Po~UJӸm&G*X=_zB>{['w3J>\0 ؃KO|4~\[H5RAIQ9:dЩw0wxE#*h&5Br"ᦓhh߽\-?X;.F;[58̐gr骷s7>khRvwoD]R~<,MVHw͑c;}Ch4aIuݰnkhˍV&[SDrL'h4G~=Jga82E=s9Q MLDCaGp s"qTc:|lq.Sj_3ڒ_Ak rLr d?Xu;ظpRt \i$77jw+8G9V7 7y!-iRҿ U{ (oVˊw-V(nˈd1&qkT{G!j'AQݠYKtR1 -I>s(l@QZAEDHXgJ"60u -Wxr_lcJ*^wgH\i<=*D'*؍A;% Tn)84On&!))T8')l9y>CeK*Z"8Ѣ?|C[]~M '9cI]0#v*Z;M{Z^e0eɩ]5ӃWjJRyvhԹ<νsڈ}4?DB*F{B$'KlbϠȂGNR v/ -!;hi^]7*Ĝƺ)$ mj!e onyjA(~ - ?3t5d,wۃ8^4I-E͒ƻNkK15q*jw -4J:ϺOw'J*`,IVNHW]S&= e~U28VPcicդv'? O!QM퓊?3W؞/|t8'b|6\8 Pm1DpEuX[Oxʨ[ *ڥݹ%iJ*DN}0wjwk%p]v2ہ0.oưɰ&tКHScyiɃ@Kh4W3ZkUhkZy~Ϊ_yp$~f9"ϫZܵ -*nWt_QGxV鐫 jR} 3Zp[[22X[HqcEԢX_;klj`dx4B -r -RR;"(c$ef^3N<1cל"4%nv Ivk]L?2-z!.AJ$F(|%gB P.."1}ŸCXŶsds;L;^'&j*z[}Tf Z6;‡PU ۨQ +m'a9v],9͢{cWGJ%$@P2L f{62M8Rx {#GܟTZoiR~!MAOnEb URrZ(6m!m!0Y V3h\"{ҸE毹Pv,]Mݼu)})*R(Jz^ Pˑϳc6՛wxDkA>?\{EQ M"E97[! 7n#sEcBB^WtR܌'T҇>ϛ'bs=m~4Rĕ~MהH.jfe e}Qegv#8+ Sy${\Cme)0U8ʭWGOB$I7#VȒ6N:p!'.;w./tRsB{#$Fvzڈ3W.w9tQQ9}H3G^8U~ -JGߎwWc)Pu^Ei^y+< jjQj{EAr#+iV4EZ2:Z.P +Q7c)' ¥ZuhzpqĠ^pQ%d{{8'a0r(`'qb OR5c"_*[Pڹ*lֳO,{ WD7jDH%R> A0y9Ϩfx|`tGLy-2TzDy3No=fM y+y [f*2SK96Uߩ8 -6? 1´c2ljfI;p6 !- 2Xߋ|-^KQ8s+A}-`{#fA7$ȓ {y -_do]9ya/)K9Pڐ4:)=y$$;ڛN z+Wc.«~{ -yꟕCu@JkRRf؏ -uхn/l4f8Oq,9;<{(Hus@jۗ3,D0@C;4 3<=H\ HF}h<7=>MjCl<7?mEQ>4kq,4`NPHԇv,BZ $ݻLcTisy E9*JyM O /7hL6Gw睲5L¹` -Hf]|%S[bBȾ):"bӵ:e$c_X _wx0n\6ʪT*K|bBY%K}*P8Swwv#hF`hdsCC{Yۏ3e R~UV D1ۆB#qQmtװ -u%a}R'ը%»-;N$3wmWp2w+թ5[_'0:٭YI[lV)x2m8vf(S+]Ccxb_8hx~|(NIILN?Yus\btDg!.a,{o0-w6OGA]t; nsJ-ΜYX]iF97!g:܆ rfhe6<L[ỻ4m '5r -I' B -w2#P(8놔z/3}[tVy5`09D,rȍљu|?\t@~:fː0%&P4ϰ9  9KUCXwZVfէQ\עo`/pyb0+,TEv{YpQg$rJQ@򵆚xHǎu>nPշ!}@8AʏIIPd#5c`/`>~~;9E^0)ay6I-`4,9Q`"fo@Iz4sQ;Źӧ}*>,,(f+,2:LavM6OGx_OY) z -c(dlf?#;2hK:mqmuԺYsh@i\߆'$fFrLiw{f5zZ`IPG5Et@BIr,A®l+ au?A[N!e(i- -;=<ɺ)={i ] %) 4O c'+xFY"uA7UXH 1Acٖ]mrÍDDGs('n]IX/G D44B!Fgik7UWanTfod;s _"dn:#˚`!7F -h^y* -V $-!~ǮȻex:ƒ@06`ERZDM='g.al4RtF1d\"pb:&pլgMT`N -6ĿǷE޷Vs$as9{>E7+;L5rȐ^X#!5OK kI]Dd\ܪ来#&z>=,EիTrҚFԨ+HPz -HT.AͰ._T aCWk;`eWb1ȁ\8vxy{Fz -"!Ҭƈ; -̂V?K]eW5u276y\Pe=yX V͎?Y#O7؏wɛ;kuY0u>C!DeQÚujL4~nHF`Qù'# EejI[+gL[0~~z1ev|aC^JXMfTD`= t 5flś&=F>J{mPRW^1m<2LlzyuDdJDra yt)WI7㌏Ciw1b -~* -Wy3z:'ꯍ63͆ -ۺ߾Nw9ļyM>g c?AK$G!^AP4-Jt^rwBF> 9 4͸J^(gS.xHuHю0@ -!8SZj:O<B kNd/K5]ƽIq~y2oװ]%)E3T -myܭb]%-M8;Ms]L~vb(s+oia WXՍZM)|]-)O 2AFk[CÚh,U\L^*vb3_oVO A]J[t6"vvoy_Œ,:.5y.%jb;] -3C}8|L8I9?:SA +V립*o.hiSeМX', z^)f9ַ+h -Ž1,|y{[_J Cj9ʡ 3gpM - -p`7a+nݵDO;a5C 107-.{D1%Y\#YJ@|)~ɦx ⤿J4VWMM4`w Qx|sh*3v>EIi\ĺzF(;ѝ 'N'4-KIhӄs Wl ?l?:V~J\[Xּ0'J%nB>};2jg?\AY] -[< :Ɠy;:!K;Bж+{Y(mi*k@M" .? j]!?yCc82&Ak7TPTkISF[5Ƚ5x˫zӫs*vۿ|Ȣ7;F3@CPk4xR+x2D7C.)w6]0.`^Vf>``w5`d_+<򸮅/ X> endobj -1952 0 obj << -/Length1 1207 -/Length2 26891 -/Length3 0 -/Length 27700 -/Filter /FlateDecode ->> -stream -xlcxͶ-۶;c;餓<۶m۶mI^\sQ5=G}#UReH8102|7t0(r3țHp߾;[8:YM*&&$koʄ0qpZ/ n7_ЉDН_p^Xh:;:}sw;{JBICGG?_&f#EHMf6$@vᾑ|71q{4?u$i`f; + 7 /?2bt4e1qb{d ?LpԊL:[غx_)_m&_03'vf6nV.{7csTs36oO;[;SC+Goń  hDbdb n$̌,$|6V`hmB¤$!&E;KT֍ē3[_!?'PJۘڒw;uWK.MICl&$c'=fN;?m6iCD? 5Z_iߗM"dh41>@GI @ dl>+#K15s# ob-%lm@3Uv4t'lW3k6=1ڲ1_ECPן:|WiVvđC \1{Uȗ] ֲVK-,fKH^.HSzY4 G9gc^l6361lzGKYg)joZ.#qEkDE{) %^҇'X9G+A{vYix?gIHQ^e+O - i*^miv[h抂2}>4S 6d Ӻkn} h6z]Κ`s6 -٘(xcĐ5+g v3pSa2eu=*MU?y6ٿ%Ԙdؤ,t7&wnoW@6b9A*e~%l읍iXųڣԕ^\-OhK|VU1Vt~`uj)=/aճ62X  wR;QsFI:1T"&,-ģD7\S$O&$1<طeI`)eR+Y#EGU71gftĹ7 UP~1V;&_wl\Ӈg)leT̴3K*q//9-fwλm)4 RZ@_X~!nl18pR)fTtr~ t2Hk C[`&ļO)=ﯻ,>}k3+^eBr15[֞@".6u[l."Źtk -n5и1.>||VmZQݾXBg0[2h!]I[SI~$"%Ix: u`ٜYdKV/K #3$`++":!* V8j&]KIqpBIԐ6 |d&mCRh<膔Z;$T5V~4ϮP7ܦf{zQ4)Q^{ˍ\r) D9+u5ޣ]0)$HT6lFKEI륓:Zc~ ?MM* ;.>0DKz!$S<Ғ]u{cpR/R C|W8u'Օ8pU^xޡ7c2ߐW`LMBUfʺU5( -&"fu hl6I|X,Rr*lƣudaOG*΋BNOT.Pv LpF`yu!UzF|ו|75/|aXp/wJUfn[.o>4oSQgei`*n*jؤ^Χ}h)> BD^:9HņئO&CE,U<@Jʏ5o2YQbs,z vi}{S&RYnPA,]'˳ϪO Żlеx)z(mI"eT;J mkE)z L:M? ŽWCp,m;U۴Gx}qh%u0:1>-x0^ap`^Ԩ'#SR?DyZ:X0䘉!>E#.!yQGg{i -*RXQQaoE#RV $_Rٚ|97釥hmP۩7(*6 -Qygt ]Gn5sj9hH-f$JKCW>ejAP. rgo:4ݮs[,+ojj\6~ -^.c[O-_+nYFULcȫՖ-AM:Z\=W*7 b^gu)i疜12`)E1Fs{LYj~Ә+)Hd@ wM+cz{汻lg%QRS}/;:kV#hˊ^:(boL)ny+a5}oU/ V \1= ] *8ȌC׺@N BHOo2ҿƷb5:ɶpXx*)@h>JBDv} :rи> eDWR5%S,fԎm/pyN8ڈi|"!V?xKՉTfDb4pWmoM]$̩HO?8n's[VDgjoyEV,f\pKL6S)2F,<]C 5MCR8.AV@c7LX^K4)ce3ȟ{<) Ƒ%@L(eY ˢxu"q<g5~zR{CC:,RvYۛ0 -e$@XԩG3m_t ߣ?()$NAB_.rx5'}EdnvJgϓ 1[%qcj15~ぼ^[?dFJ2)6:KyYt[L5b~J{(7h0mꐺ̜ҏ$:6R+emL̗CI'O$Uv:/8'(J+ҲXpܭݶUJ`O#d^ȉ+nc ~\͉-@( HM[Ԟӷcl^>cðͶyޏ}i6'=F+$d)K}nw0XI -,>UjDBG+M3¯g^NHMǤm "qtHB%<7D1Ai~4=CP#Óia]}K+܇tQd zl;E漃Gң-~%Y_ a. -%|zn× -"N|&nⅎao%CnyY )cO6!DyIPJ)ķv:7ol#!K򾞅V?F%N8RV,A;T;sԏ/35ӭ5;5!s mz_Υd3gH&oP$.04pIUZI}23 -Iؗy_pfkaS$^xKs:+PX6خ - rd}zY1x08=ZJfP&}itq-<VSG12~`g,My(- 2|2ejGS"{笒asaph+uvd9$E^߲oq݁XmroZi`jz& -ZC{B4 3p9]py,M,O^.6~FU#ʋQv5ÿ" -H9$nqj_x{dOvYRh>13^;7ld DaV(W+lT1;#TÆKyn={7Zs)!yC -sdQkۦ䭙a:FȘVYǃyu2`ť(߫0Tpv%F9Me-{(NGf;D%kz6 'JEC}~p.- ՛u-_mSL^1OxJ)9q$E,(kMSWAE(R!VC d+:W;0['OɁS>0+1uY.,Ӌ&ɈzLǯr|b蒀7L6YG .o}8K0neTx@հzᖭԧ *?+}ld%0R=щUf-!XEH]jna#złLu?W௼]zM%#C - Y7*g B룧X'm|*)EԘJdo5Q#\'`$WA, Ae@C(bnՔn P{" -D>Rӫ*nߋyi3=AI=o^.aԾvEq`$h4zf&g9&QF@#in|8^Np|Z -K JcŴH [:;[M˧/cnfu.fY> VFw;] ~uBJݷ;M06<,\ ;]¯{{(=dטH -2,%M -Gk2^V*,PC^ G"p:4uWFg$V]μzp~ v{a{1O@S -],`NMFGtPV6^uN*G V^0=\-*䱾S~.ײR_EZi~pYr -jŃHA9n`mщfC;) -.h0e[Z#r케 z ve4ܗ0ZBZ[`H1bt6xj\XO-v:|.2Q9R,(辊AkwO[ii.luVḺ(!d(z*WTD NF3uk&Doe2˶h{[x}xs?m>Rj 9ƿY}V ݊Uw?;,Tѧ&R8KSdH[ld ͑TAHyp_*S4xTE84X-~pc0l#>~ϣOs?G ;$3`t]q_g\9[#23e8b=}VݎpsOn6kXw`J r6Wƍ_XQm)fj/ϡEXjYuϧ8X򍎧N-(Eu$g3Ef73=KF[jGY.Z}Iu͘e@g{̴EN Q+\W-9_zghyqW'cͧ_Ūv)8ջn^ݶP{D7_޵rhw^*1yy^noh9#xxhP74djbx5n:Yl=''sz/ķKN i%A03$|rG967G.$*TRt|L6:Zo%U/Ƹgӏr+ʡG6at&Wa,nCg!Z@dɑ!JN'O],l i#KNq-;o#U?z3I1 9`X](xQH;5bDtlēLA7szZhեs7RH7"Dƫ[ԩdC\6cK*x4r@&j]ŸEdDl‰.TBdTQ\+qh^}܁w~?3­e"6]t*SEG@5N;ߓJ",^=6M9J=-(y(>ڱHN/c/7,t3C&1ۊ9HG蕪œ/! dbnZwYo>/7L'b@B+cJ$u)=wZ悹 8wql>ޑsBV1w# -a4?*$Q><ϵcͻzz}jN ay(7y; ?HuzwO'Ɔ=Yj6^.{kb+q.uBkWvGS?8wÉ[ 8,@Q&/:ݢ/x63iw-3vS;1 h4TVY'2!e( - 87^:oyX1U(X&)+m W+i?a y~H&!/Bf=;>f6c>j[}yVzQd B8I-}ABX6г!O#ڂP+{\.K_UgEݞPiH3t[WiX65e6f$m@_駎~ -R{&PȰ7/,$w_ٺR.FD<'%I 5#tZ[졲b?A+ Ϥ-: *Aj_KCsU&%<3Avt꤈RXuL!x0|LDB}չ,J)~6̳`{/aӓ%HZnY?#S3;bzSո(H>tK0-va])%9ʒI 뻘qya* =X>|^6~LJŬ#T(wҘSX85$EOKWުED{ D5~f <>Ixqm'߰Fp2E0W;Guĕx5he-7>b"[ -jhj#,6WLK>؅i5Jj{G5mbE'wܓwXFJ Į f 5s۹,&cxY\oF؜qCTڼdp|?!,kfl_en,KoTtu~I$FVZW~k6ƍ$VaW|$|sTGB@ԓλSЌ -WXG,Dvzn3Mj$ؼRDnc+Xޙ^ɺ!Ro}<4+t__ȟRtOp^޽??5ːe19+b[mիǵ阈CSa!rv6xtN<Ɔ1QN}S'ذ_rȾӸ*Zq=*9M>:qH*:zw: -Fc^~f^g$?yE Qq_R =On%űƝZ境 wڗ63F~pU# !/uAxb.M::(O֞пOjz ClA Ԅ|Es'`Er\jWaÎ7GL`-rمu()# ]HrA!8v޸Kek AgAw&nUeM|)WZ;sLBo=AeR1\Ԥ# ?'pn#>ҲfㄨutUj.G*љSqJtc|֕cd݁ՙ^vdݴx,8T5 2u?ʣ<Aa$!= JA݀p1I1rNiy2!G9G_fw0kki ~q*\ؔ 8w-%:ߋ 6󘟬ڎ_eFuf굄\J|)B,?'{5Y JF8<ǒXyil2Z9?w3vao@{~kYG|1WNx<0CXx9',Zx@CJiFޙacZ:_ -^NQxJ%ZDtop-:/") -i.$5cfII3'4p0zȇ}Z7K#wO<ƾ)\<C0ҠvTXau&+L밡ӳ# [Wb3tI$ .%=4˵hGvGpi93 N-VG+\/=5H$[ё^W0>6]':rZW*(+/[z,F UAmC;*P|#a!. ȹ s}{c^4ɎBc+?FHҪLK 1&nkO㉦Y'HA5=aml#(Y#cW737$*-ARodQVOZKgU4ϲl6XqKѤz7%#2J1K7'?l6wo!3 @wN Pf7υ]m1xJcfiwjJ@|h+I%>Y)n=~JY#CT_fd9<۴v-uZ%M5&fvT<‡;ƮY~vqA8UXaȨ|!#raɈlr#os@v#h5N|Y6738<@T냷J]"zqzyc^GJ>4:ݑ N였c\s:HJ*N!#>O.eG#3;]c/^QǣnN -穛Sq GGe謿H -KɎ5/-<->z+IZJȝjÅ*1KΫWQ7Q2h^uL X9S `05V_-,O3iehT4woa X\Ӹw/[uWabeE(#/BwFp -OW9?]^xj/C/07`iLazcLw cE@Fe*yg‚*č0_Jz5vF#x1NPǐZ8@ j0NCѦ\I),Pwsq h&ha#ʅw|i; m;VWWR!t To9\KR>Rk8*c'H-דȩ{G Y'ػ2EVryrP06gvx2kzIcGȾƝD^k - Z:qkJ-?Ӽm"+BԼI?&Y5;!O.'o05yx$5O|aL$oX[+=} =5>;낿e5ާɿOڈ"d)!ɲGWn]زxivq- y`sf~ ȉ!s)#7lVgF3Y2*I ><"^긐W lwt8^A4 `9y#Y1|R#P9qxȨ "(Se>Ũu6E7ĩA8H#B(Z~S/g6#sg(c%҄IZOG|,oVVu[y/ԅ5ܕ&~ 7ӕWQl^5(#tkKS>7uQ \7;=۲Vm;w! dO8h5mO:V}n+ҝQ#֣PZ뽊x 0ҥ$CGWs: U2"r}e*emhkڸvt R͠UFu -[$0c&͓ib ~ 2<^ďicȭL,:8QJO jxs`UG6)2 E -HLypmot_%jyLpf:Az -[`<\R(́oٓR49CxrI(of!jֺj/{HB`~_Hnjd< ? \kY[`fL6c\+g> -ExKqWJH& p4He&FymY*ic7fNOxI\-^2P? -Yd q)sZ|ISP5Ebv㰞0$^GLСZx4Sk&sb;хTJebBp?9䱧c` 'J\< 5pw[|˔r޳T98b'(T?6<ӢF6i7c%U[J!>tjl[~T"h Z&^dtƞĖ52$j-̀cezk`@n>T8ǫoyU|u~M-.fGu%Hui[FlM@O.x˜|nmc˖˹ˋ0TKݦnrS~[H3zmGϛԣ]ԓnLن #7JȂ 1awHDJ܎49SĽTg40#/TR[Nx[X#&%wM>_,XD-|`)VUa]ebNΊ$SN2U C:tz6 V E$nc11w[#΂ WNY8E`.Esr ʓՅقAM[6Rű<s/#Jjf0 TbKBA(J`$?X bjA5Vod CA 'H<EsB O7R7p8T?^ ឰc&9و/ǃ4bG\:h*J5p&> 7R>XV+3ܣcdP.  4w0|!k\ЭH|X~JQ?^LkX0+,5@~@G3_8DBEL8@4ATeH!\iS Ǯ>1{'FľjCȢ SK -{AbNzAQjĒ-Nɀ h7 r硹VaM0ڻM| аqQfw> -k46ms--cVG:_?GkEu -Dʅwrpl=f=RtY.y')u6M$@DGT=u,&C>̡Rk%p1U/6_sE{|i\+vh7,1e܃}icUf,ot*&NR@,5G Hz3RەYA*11b2oj܁;fI?nuXdS;giѺ.?$J4&y.Ҷ k ?XP~Fw^);C!Wa@<#0ε6@j%:=sLތ -8|ʨW*ZX{~pA- v&< UCz&G1 43eXϘUr&*Q:0áaIML{܈ZJf! ޅ T4%sϞ|'@&K}~K;Gn;zy[6I;M`AZ+V m;i2&&-Y -LΏK=n`]cQؖ7 -n뽜/G -U>~[$57rbpõd۷+R<;?b:{TJ \!z/4@s=}nMkXkaVFIX_N/L=OVhyCW̼(Zų==-^7:m\k,4 RòWe*z^K<RHU+ʂ\j}oN_z 6ٜٷ"x>t|qjX@ʰsXeFQ{4H` rKws8#tX..skP٘/Hd#aq.h_rIAR`+5yI6ey]&L9Ւy~"VBZj8CU3 H\|+&Ph pTl~IC iзc8d^h&PVPk[|١D,9Bkj#eҌq}cJT2i)DN%i¼I /Iwňn;K!8 -=i67snjtBC<3I8Jj=/tQoQ4dfSbP$jW.YzY -4 &/ixTIT- !~'TkVz'= \Ҋ `79_oĘ -,̠|-$idϨgu zPz%*H baM?X M12ؚ=up ]k5]5 Bu:ъ?UD 9j(f9qM1~=M Ίb -`(S^ҴB[)ipGDαVp&b偯t%}&,v i1gV0efnAp7{t~')T*#>cʱ}'SkN~Q$[N~[Wfvq@]:U>󍡒r>/t!U@?)ȭ+UUQxjT䔦V&st / ~oh*,̈́Nλ'EpuؗVOkm#ۿѠ YW/}D PѨ -#/*IyO c˵'va|_e|9]D皍E:O&x/f~"aCmqVX3>__ -gXPқ6FC!w'@ÝҒ10 p {Ai8DQr_N羖5DM姷q 2g~KyVڣ<e6K ڮ5l3v :XRH:ELSsa~NfnMeݷY%KDI5y׏1%6|EM]H|/*$jSefHU ˲9!a!&8&A܄C[HyfVz薗ZCFb %TJŗ6a!]h%49R&cK(F*ye8G tNn-"·{} ?<XKҜ E:4¸TDT3 >5=759'..icڈis#o&`U+c({n VU#ʹBf5soJp{(įD*^E[WM7X=y7J%]IsxFu&XZC%'T[Cx+95JH'z#.^WfЂ_inKpQ Arr!-0&B4:7پ]; -7MKmRU~Xf]g]s v:[URg z^ 2ynFQٛC)%ڌ}*I]h\U(ݚ>)tU66TzJbXB0&g^ SY2~%eq4pQrq1}6Y,G\kV)JQ[F&ł  w*u̺AP;/-D ^ʤyq4;"ZW"bdj hS9*GzrheW؎D 40o}V .I4ŚYj@?O%nIZ;FN>ι~,t;¹;-`-lT8baVa<#z|y5P֮CِB0՘xQS#qpj?75Nz_|sW#=8lȮE+_ޙJ0GNp @f$BmB$uFK(ZU0d_e<I_KÉV@T)kV9}Dx[ؿ(42;pcRk|!mjw~*dͩ0E7}@fD/,CF;ǓHXU+Ε O+3K]EcW!,[c;u@soR}&Ŵ=ĢRDݥ|翋q5 l2WRjW@r*ajX"! /,:"v"-#^՚qglHJj'dhucwbY܈~(1E b_խ ǣ6R`Y ֑*.?"4fE tKF8aHx[1M9He6w G-%_uZAg=`aK> -2x|ؕ/3gb2QNq_L;WnG>~]n|tJjpfдNl z~Bǯ'*p{Tˣs2CagA -[-5._pWW&-W2R~<{ ىM':?,p+WKGF=Q" R֚nrM|o#*ͮ5G7ӛE7PR8^LyJelZQR?Z:+yzQ -ѩdkI!AXY( ۥR[yHy(=RJGU]R$$$71ND76:նj\ @!IU2~/k*vo4S 5r o@!u>#q( `7M10c!l/Z6FXcF -6l18EuC#aTOڍ|Nh2H1M@5e,_Ptڜ#ը¸ZpMt Ы?Z5+BHD;rFjer*]G3Rj:dXxE)YbE|^Sj_$BFK/#0z9doIf ZDp9ieJ.( -k eG45.$}غiO:U=wWƝ+X񾻖Ep7Ɗ~a(: u:S50Q9juo9v(Q2'˟?zYyמٲ]VOW_vVըHk" Wg}5A-y8q>˸~Uf+$}}8]{?^bWdVؽDJK@/se=}n>]?9A8{/0%}H,axJ|~6UuI{ҀBۓ -S oj(/T˖J rlq.z,hJX [zQͰS0<}ly*O$[v*J b0on!GI[YQa0fbƃKZt{R(vPA ŌP8!XXR0Y|=]/80P<&ʚkR_vetEI֑6-?^Kur5~P@"K_wWٷ[FEQ9XEK )T74TJ]L3;ԷR ]ٳA8C-QL"%mt^\MKζ?y::*r|=)7"K,鵏i]q'ؙVy2LwXı|~R:jf88>% v(NfݍPXm/Z26_R"` t/5 -F{VkY̹7!ݾѓLffvȽ:D ,9}+Zaw%CgZ9)SIҋ/0#F4rvC_Ic n,sDlɛ-(/zy.HAAEhE``3FFJ2 ~4C*'YyXL0K28x}Ct~EOzQ_ѹo0{4hc9էBNǖ/ '<1LBApzdc|3{qQ|nok8fuu˃3`%H59/IfZWEiT BXŁrn,a(2[xL޼;lSH 1:8 :\-PۚAWŤfWƮXTWc(B9>Lm͕-+wm7bWP@@.5G7].nT5_1 ߬XBDǫ },cOq+^),'BBJ:^=L_)mvZ-|OQ;&?Tm08E;>$,ت -,5v[T2ހL -6=K)Cf'@5-X 5p=أpJDJw_"?nzqc'@3+xF\:.YP;TxŚϺano(ܳBGEFȷaow 'r"h[![0iDZs0yFV)P\`y$z!:s.yC[n&Kvhes棚F ttTsfZFC5G#;Wo4%ngUת|in3gu8s˘\YMsAkBCX9 ZGptq4 *G/.k ,8g)=; lGuRi1l/Dkd݃ZL4]_8pߎ{m7_9wdUR?OYlP33 *>#f^&bA5qa~RPO[[NA,.D.G,ÔsQti|8 ~n!G4ꘃ]˗?VU>W _ -/d3pW6/>/A  ڶ=2Rh@ tcN1܊׌ft_t,CSP[Q\rN\p@`] 8Jqbc9r-QHIE5e$Y_}G9ȔEϛ'^̃Ԛ[f|lNsR|*Qi`k2B&d3L.Ks`Bi+ վ"_^_TJ50'>͏x$-(\#m7(W$p#漠 D_ 8n|I=^ pAm6x+Il4+ -kź'7܌\]hb/$ zkLJ -aE^J3U-G\ -yA[z&Ѯg@:5k鲫qAHܾ.dL4eK@PW`@zӉSfr%q> ׋#56^DR3yJ@#KΫS1};%M\{\ bɿXK52UF\bHn rjL,ĭj  B#mg6v憜t$<ՇiPg@?h0fz;As4RBh4w:g^!h6z;S[AF(  '^&WP3mpQ1bq[dۿ0íܐz%S4)pQ`P -N)˶gp=|MWӯ1P mر(3XK_S1[Jw+p8|,I1sZTqΰ&]/l?0'B.I+?aaFЎtm5g`rCm.Fd]!, smo^ZU[(P1sI:y^4ƦZ3(J'>?u8+{P!5}um&G]X3kHlYo0jYJhʓcA<őg;hr;ѨឹDS!dP(| rTWusL + d(F z Iա/d^k_l)7 -7BA֨'P<ЙD~‹ϭpxźyMld͆5+ Hә;GM@oP*o$bhD9sQ;Їn^.a yzIU"UT-(k4MQ$nJuc)LM݃b.]-W{Fe9;?> endobj -1954 0 obj << -/Length1 1234 -/Length2 10538 -/Length3 0 -/Length 11352 -/Filter /FlateDecode ->> -stream -xmweX\M5wwww@# 4Cp Ip ' !~y3s~jW^yΡeu*\"E++VU]h \m<]`3hp=DvK"=(c@,d!@+@ -D - -PpEDx -``quaccCuu" L:̬lF0q}=@`ήn5FP?[/\!yLP'_b,uuZ9h_""v ?Ķt=rB7fxxy@wƁ|݀r[m\vV@ B<;34nn- -ڃhf[A! [...n_ϿFfNt + SESEZYDW?;7-'@@US*\wGvILP o_rsԟ?ta_tdX}frSK흁vnAh8l 8@-W_wbz '0E`<BX -b/௰'Gџ@mЖ\mD##:ɼw&y0]B1ܖ'[$;wɈ|# ;Np[4Ñ'ϮjO%/֞ΰ,3|ށOgȌo&␉xEtIu4Hu+y\JMQ(go}[fmfb^Jd ZNf®:#B=uO?ᜒZ˄ ;@ٯ2OMe'*;"z/6ZxdrsvF(az6>`CrfcM! |r*!:=+LBȚ3_Q__ؖ VAA@wn9e9gx9foX7 V`N]v:gzL/K/xBLd{jD5XXW/lNνEo>EQd:Ѯ8"Lő`tfa,`KO^R_FIyf5eF H/_w@^Všn]/Z׵|^}/Md.9 -Ff@>4軑@__Pu}qL-7YM5 y^gB` ĸD\OXɼt 5LH|ڄ*W5PhC}.)%#Y?|Kt&Nsb#G^ #R L*{Kx%w7,z,[^ )Y1:ǧR$wgvñy ArkJ}$>yAJ/* ֐[83d7?U ->ƈP?1oq׿uF7M_ڱxX#K QBbd&o|vV<7t,|sJǠ`38|X FwZ:Ųz1TX'zwQAS32C-leRF=kEnSLUAa}߯Rz -hɥKmRY cW޺)=Pc6S>-}$Xe RS{ 9 9@Vc:qPrbqej%^8=?NeFK( A@CETDB爚2zyeYT*ʳ)HH>Z&]MO*XoKWTE.I W-OJCfB5z+YA5&ti!sGM -?i/E Pӣ#l~sQñLWQҞ3pR6'Z"FtZF9 ?.ry. /)>).:zQUᅧy5!pmtR. )O; +GέP> Z~*%d\V-bi"N/CgcՍԫ (c3[ww d@<$|8k2Hoo`Qeu@/Vz(y+Z}"нcyX-2 1c*lp:Ƴ06z̘@~dO=d^k@e=+L9*D{[xtm2>ϥn\^Su3_V%{Gbfxwu;0v=\pzT!M<7BZc%F1 IgRcz7~O4Ѳ'Z Mf֧>Y]z<]I'v=+Pc# n?*dnu竉fܔHK^55%Q@ -V#߄O -<1(Z׎X n g iUWH&CIk\+m{R'ֽy:Bpp)Gft,npɅ fNJNI2vOMli6_u\_ Hɶ5DZj(]g2inUR]Z]vb\NWF/^ -tLA -r>ASU-Qյ2 _g\fWA m -~  QFpdsj!uPK'8c=Tt˔w -`#yt]ރH6E`-20)?6=`|4 -t`%Y3guOS!UPG/Ic[i)_kGi˝>x1~P.WsWA.GE/ZkxNh ah-LnP_X'zb Zfn'I |#=-?jtg"- %gzƮN5鋍r^MO|W,Le|bqIt[S3'A+)oP8HebŸcEzF]ҋ _*T?(k#.І+gE/m?e֗Ȟ`~o o=*Bh7k@ ,q5(pf帳w*PA/U9XlM+\ʷ"|6vb^Y>z{&FcwgpkPkÊLzڹKQOF\&}`x4r/"wQK'T j&L ̞A}V Y!nM٧,;0zRniHO$ FlQw5*9 ή-B4Sdn~Wd7[ mJ]9-(HcRe,64 IU1C $03 -ֈ5JN0g lD֥xzKR6NƁ]̷r+]-gZ8eY ҋٷUvU0u'":#wu9% hAL'ÓNWn\F19JO̳tg$PÙ7<ЛkH" /~_Z–7 D4M -)&QW aG٬7F:'Yfv)oW?ˁˈHpñw)68yph9Dt JJ9XWE ?;{j1Ԯ4i,R!i#-!`Tn(gVv1;"-=|_%Sf9&7IR̫zw:DO&/ݜHi| Ԡ!N"AmfߗLXVqBҒUTq (4A' (S(sY`0-F&F.'!y;ꚣ3QfGT >wx@ f<)eH4~\Ħf}1(nFEE7#z ފTX<@MgȌ(J{4&GЛD513](S]•$coPC~hk׮޳F.J1ؘ걥YuP'RK!ӆF$GBaCO$57) -d DVa .!p# C1cuZP9a <Мug ΏkQOUZm/;IErɹgU1\3!S`'*͏˸ƛ`iR.u .FnvBFJg.ϰ-5AQve=C*YbP4Fu`3gxx0UYKYF,g= >gC~@h:6{UəjӠ|3ҬhlOKMٕbRRReqa͢O{Md?FRYFm&d.C_]֮6hs2< >Iᴼ)NduĎQn_>9.,d0=`f=䓲&Z8en&WSg igSp%}ó:#dUAi'[qs>82%uV>B'C>e$h4xgh ߗWhZJm$]0o ]PֺA}I]kC)=7JPn"[>qjH71aFqFh]K޲- FV% z=Hzo+߶d_¬M,q\f_rLc"pnHkâa0|waE6 dEb/X7q% t( `c' wOǏ?6JwRh.*@˪5*5;iEmNwɈF hq:-Oz4 ICjU+LeA1N-s[b?e`U5=|Yα;?W(V{j+ y~dٕ[qؘmW[w] T'nD0j/x& Yd M I!½@ֳrI7ׇ1F %Ro_U@~[ݎ+eF|,Y-ڝlf/42wAL^'!} -@\#Ol8".wTغö-QW -loAT\@|b}b#j6>;|pemL3!a9c)^2>18c]œV-WtR98p_/G@;ܳS@ȵoϣQc__wns+t,yjOFmz!Fa{l l*(PnJ0 BQYZo&+8n^ۏ (Ei,b -V=@#RW@'dzn3GWjPKP;I -ӷ/ ^ -!Ɠzyߑcr'!jc$G;)\`wI=لG j^?HymOB죻F4 w~q^Y&#$Xtk5+q}Y ;Ҥxm{ ڡܦtd%7 1]1~MY,V遃l_v;jyNU wx~XaN^Ώ? Mݧf }ҾwmBLc@rÝv)[(7cww]1oiF,*s5YUUpҗm?߷kb$k&IA۝6,K%鱊a]f)}֯~}HzR_j jMHM 6;x={ؗ]ź5ރfK ;+Ix acٮYxWf1Vk%c|t1h"iY3eE7R5Nk/&շ+\B|㬼6=بc9@&Zc -G-5=yN.hЭرg27@A_^7U" naTk/i[6ҢjwU+\^.q.Fa}w\pwa3#鯏;'x-FQhƑQ 59Fca-KyZIr!wp{䦯Bg xyʿ$QV7#R{HyA$/U%%X9WEgD6$YXa7!hJa'P:}X?tSܱUyRO8 H9CsEl%F_d")坩Ef -BN]Kю߉{ /G -_,AjU:x?rn\lLb -8&'9eg$`cLtDx=7].m _11oΖNB - ()ΥpQ&ɡٮX}L^G(^XYP> S1{>ߍ(t<}#8u =s8V - uCS -NA\ہ L=Ìgzw8EUBpO=?#@>LMʻw b7%# _( da$s΢j>`9#Cx9%bZ.fV4؏+էa!l~;kӚ$>G3]^QGq[fDyMp(!P+\F 2SB)#:~_ũ 1xjTmpݩsK=El4m%Z< 6w^+<9/89LItxMst C*63i%:w!!}w!]r' -1rdM~G˴!(7uzf&5zrwEV $WQ T"yB]Fi(ֈ8m,NO{["[xU QH<"~\q!Ht+ݠӓ6U0攪T]r[ˆ VDȤ"[S1onY8=Vtۥ ]Cm˄Z8"wqiZ/H4s3Q Y6ԴB1iɃd6Yj`^`yRݳ$6SJQoi5$P4xz&E6CF Bz0ov!HWYg~+dsp;U|zgx[]2^ٔUr_g;8}+ݫ HdJ9Y,;Azƕ Gh~0\`l!eּPKPnZtEl俧W/V ^uG, ޽rZXn ' -t )jYTF^bPtx-/<7ͦYJkzSwm_S޿ohDIwS;t5ű!}NnaM]5CRh֮Շ#te=i4r;)RKqI.LÆ F~#Jo7^@@'mLvUED|j{ ԪY -I3GFݲ&$Ս+ږ^ӼvC2EޤMWtG:SMb! &`ls!Opc73)dJ*κ.濹@~RќGKLP-\'kNc3m7Pmݲ.7͗%ly⏔MWP@~5ѫsY1Ƒ4XU7(Vv'l]vkߢ2 i[gгc$/ 9L(*qF]==b q[x̐ʚ{É5䱒=B D%+XVti$d9abp#FNqq<ɇQD, vƿTm)ˬF'`dsz4qS]5\Zl v<;lDI28;ےeFK~Ǵ_Ρ{zъv4a]RbwR[eq(BkyȗR{]o%yWrdVQeh} O os>/eaLϥЕCdaG˚5 mDO3;3m+2G xy{ DgB'vb}zOcxzT)83{εpXjQPmHτ-R&ᇚD"2`ޏk0FێJt -~NK6z~ABNYtqb7?" -endstream -endobj -1955 0 obj << -/Type /FontDescriptor -/FontName /JOJAIJ+GaramondNo8-MedIta -/Flags 4 -/FontBBox [-214 -344 1630 956] -/Ascent 759 -/CapHeight 715 -/Descent -250 -/ItalicAngle -16 -/StemV 109 -/XHeight 0 -/CharSet (/a/comma/e/i/l/m/n/o/p/r/t/x) -/FontFile 1954 0 R ->> endobj -1956 0 obj << -/Length1 1209 -/Length2 33264 -/Length3 0 -/Length 34064 -/Filter /FlateDecode ->> -stream -xtyc&˶mˮ.muufm۶m۶ms=?2bfĚ9c̑r@k+ZF:.5 -KJ*dmh rPt0* \j -%S #7'P/@H|E=+ט퟉vs[Tm]hhh`Im\LM(T)iwg 75!vaI@+_[3oD팁3021r(LlЁ- [ -Z[dw\Sgs+kg+Z6V@qo`a``bgm@TrWoX`ga45uus=?gCS> -@̥L] t z~VNѳŤEe Xi,,F6N6'+32K_'ÿ)ŭh/ْ? ۛI/c`jPN 9f#/w"% -Szv+Yg*"gajoel/LEL]r&p?6YZM>Z&&)[0?2642(:eH=; 濞_A hdm`V\ÏL{8Ă0tvz t,'rǜ߳pzTl`΅aO1zn/t$ݭlehqբ0|kp1T -l*2 -,?J~Ke6IDCax\z C%ލe]JvBؑCm o;;I} -P  Jb+whU{җk"/5hmaB!͘\-u+J4 -V*j)׊guRBG jŤf`$E1ٳ;q6ziI\2hZ՛EJޚ EA)2{9U+]ZxzQ4U ">>f$Zm =#ߤo`m`J/JJg:286CZUv*t9h?rJ,<0aT -jiAtia{p[^%؟# C$ -]$]N^[˚`CyÀWulykq>#Hǜ&nup+v_l"ā!>q%?F+)/1 -6l1H}d5Z:4:/YJy t&g *8t}L~bM[Q.8:Rin)-:81w8q T+yHumz xjg*3lBY-}ӤL!0wW9 nX*׬<:=ou5z L$dk`bX(zY KNLƎ'm[N3PRR.ԕ^qhB"I! %@Jl+342Bk3O8XtU+(56$fS*! -Rx࿶G}s¤Ik8K6`&6"é<G7Ǩ+gnANJ۞|V09>ES.|u m+ ^u7~4iP6HjF+3ڳ qYqJ&L?@>b*y~ F܀K/O!(%揠DrU( 76Q8W?ޞ4;m_ CZ=s:ŗ[~Ln_Vѝ 6nEv}P! ѿ^z(aJo[_D?2%^ȓ-lE1XF.#tȩe* ,6AEu8s,@ۻ{mH?3e >3͝*Mm1n]bk8BB̖/r} , :vBYx;y05H69{P #f)e֚ r)>/nk.ٕP+ `8NEX?eWN.LSW4nyRDi] P;<Āp#ސ5Y,TALD>]R4]Ьfьah.h -$M{2FLNPS hm@ytQ/ ,?ȩW)W1g<.$7ݚtE$funDT -,VEw POk6F/>0mBs! 8W%Jd -u}\}11׭;YZU>]Om !us uJʒj`eg"j7 SnrYU C -L{7q「RG_FΒOc_b!I P#{+zݪ7ۯdE%#l?fPHa{WVYh'K#_impt߲,#&\ QjIAs -g _`bAzCTw;3ek }a -ijZ^ٿa$V9i_ybX,RR(;z\jc>[CNG,]z0UuU{D{k,GX7TsVPQɛ֎"xC Ϝb>5qa(IBlvd$MJL'9 -# FVmuрcÑ"v‡)-_YfH6q>3e`;P|pQǞ4~O܊UM+pv,~גÍKjWux}*4CCydE_6ϹNI^%B&.6 v;>NGiߓ -)0^m1 zMσ0#!c`BDgЏcmt*4xEOɬCl8*v<ˏ͇}_H?F+ݒTh>ŷ#ׯr@Q:,FrKnƒ RaHkXƳh>F3nq*(*/L5!4 ^+o -Q8ҲxztMIx!U%K#׀Mrs ǼOx3%4Lx=Zh1gpC>Ưс#?!6$+}]3XM[}9:Gޙ - -TēAEC`TdPt+FR~+cvW:?HG\%Rwg{51KWE#,Wٰn) }g Vm*-{I9q;iLbQV&( /)F`~i^3UF;rU#Dz}RɖAB0d<3¥BuK_Z9wAg%31 [/j^7a^kLi3 r(7Mc^so ${MYWۈ6Z"Uk#%'J;^1 m4ahyrt34)G7;yŚ-XT|!Z@푫ZX9yFm[$\ebvL*@l7+b0g3*nVQw١rWn ӳs끣O~H^ӈoM5d\xg}oEAx, Q^uUyo3oq@"u4n --qPF*l:`Jl?a HH%;D21#"_Sl*7|$b!q'ϓ`&#|Pw+UlbPTZGU'-ꇳ>|NvfIRsհ8DzȧQI\,J{^4Wǫ7ڞ[U 7)v\C!`tw[&jNsv–rjLI=A -r~ _4{\1QkQDFI1ĈnjQ:D6Ȱd^M]:N %͑e`nd 1ZB9 9T?-sfEC=ק T-^dFM%`}q`VJ,BY8Z\ueks×QQԋa ٵ"x:ca)1y=m,Qev(pA8BX|c$fP^2IZz5!F }NaE,fQ(vgB\N(w}MGRwG^am3nDO'T a[:߅y$qD6dQЖf&^jU窶Zpm燮ҐIS$S鵟JU ^d1󽘿 /fyg"^md1/1FNU^d\<(flZ'+}9B9m|hPt}ZBh'󟰝;pi5IYG}C7u!W 0ݕ̘ex{_E:|E1Ԃ%#nzsYA-#rt !jwp v0H7A:w!'p+L;05$Rg/zF>BsfSl"Zc/y'U,Mj3c42p&0(6_cT[w!wEOK2Ѡ:gg`doJ*;_3cwDa[33YK{]j/L#eᜢA&Q:뒛|)bq. &X&Ao͏e<*_K0&8&kl; Ur:}C` #;"[IHڇbu{iݣW끅[d4AanqŸt^^79֜ƾsω&kڋK/>\l(J7UVF =X-h7QQR0A"npU}\{ >A"@w)~xRG߱yÔ2`N~i7X~hyAbMv+,:$EJA epV#>-YJm\ Ja} *"`xpWW( -Sm>(kb9{M h7_6m֎6}k _%yܼ33RŧiWWHWB O׎ C׭U g`1f6T w.ΑN2 RF&r• fCSTD"*8nđI!XHu{<5P>zj4UK`ݺ- Cgp)>loXPI!{b-Ey:}@@"Ly`m6*u@3VV![CJ~F 1AFGG'@H6 72x5,;1ER[|Ӡ -">B >AG#l#R𔉟=L -Ͷ.nLJ\;KY`T۲r5@5ZP*K|Gg,See&/ xb~M.]EV 6Cw}txVÌ: +:z W e+#(HV/ȸvXp~1gh#RTBLz@ /o2I+_`熊e<,_T&;sw.)SV8k vk˒ۊL47>>V/~i)0Dzƃ(l֨9L&^k QH#PNO8|ɇft`6TS/D8[(4h⢙z{@NfQ+bަ?g1f}S`wv&tSn3(ڽ[9Sw>b)Aٶ"*PŎosm~Q[KOG@Oa ̵_b)!M*bR5M&]HeJҽ#yϐCŠ1Z!2FD%zaa|̨cw1(}sa_(bE rD&$e5Ko%6;eBҟ}S?Ot[Yb:6K_RЧ7D!Sy s/ZWXxfn5M8 -!%bt -ɰMB!$!@xN8(Cp!:*a]! kiлGpQj8.ɒ'' Lwn`eX25.,}kmHU҃yRҍ"d>TV˂#'ʻ+Zjp"`yh,pj/=Hbl'9 -v`SX\2 _;֯#?Zc\VLȏ VUD%9¸py -&H)=89gq/_% oxs_*0F,̸?&!^j?IqlFSL6 R#pJnTrH$U8:5?f􂹩ibFe1۵z1zT+`ay -ȼHfOZXmЎįT_sta{[1ϊAk%scZLr:o)0y\xCGC&xa(rHW;?a:[%֓%OYpڍr[K`Ѕ&ǧMI 2O LG"~_gEoZ -MZB擢 @Nvh~L&\X/ S1NL|sMDI 1R;oLAI]&L*Q5]6 -MnqĶ^(AeeRkGrlddTȽ.b@'O."W_]Th ^>Ll@!} u:7xNٴ%Ej%E̪L B'#9# -P{ ޏ!Z}EI?QjQl9hi!0ww=V V0:2Q?XN{Aqp^c>PG뒝34ܧ@T]SgwrƄK1^uw2݆4 DI'1bA"Ԍ2fLX$p3zɇOiXƅLHNnL`Xr2{l;Osȭ^>蚠6D׋a?5Md2x iR)T107_tx0YTh#`A{17#, Bi -kZu;5v>T>CE$I+*z Da*DY3cU1cgAxg>yc{FZ=͢2b>i.4 -+To%2u}\{1Oӊb#ׇn^8[ Bp&V:UBbsh wH]K]HP~B%ݴxb<`}lU]OZvYC5Oe} ο9&mar13ywu5BX>Nϴ D]s!9߸#|u_%䘚w[HQrBIJY^GYş5Km?>^*@ç0/.$&F*Q~boE'Ǎ*ҳ5WkƥX(+Frڗ -7UTɥh -3YIar+zz? J&1^Mu;c7lĹ_u[8H LgQGbv"w[xf#d}_5׼le -|Kt@rݚh,wyDx0k׭7t YFX\&:&d Pe*$bo}[f2"IrW]R -Q %8ˆRJڍw0߭־ˑ<TчE֙R z{&ʹEq, t9-@S=gE")flN` NoaZyY67[5$DQxgٸ>'Y]&35uL G:"jڭJRH$+sz1L0m3D'v[fa'tJ'7 pGP>o3gޞW}Y2p# ,*Բǖ 刾, Sgq$k$N*ʅ9 Y-WN@7OaS] YanbmQ[<!_OtM n `Mpd1c(2XWI -B1UB %\:KcҷI|œn!ݟPqKG 9qƯdۡ-hOWAѕ`sXK -+PBi :7u5}K+ bzpZ%A yVh3rt%5/ - cL%oF-IWOn"3p64ܥ?ɛn.!@WC锶rBw'3%D9`^NUCVc#L~10#I Lտ.N"po,)UaC k$YDn %'9em;ui2bc𯍁)䒠[wvj5FvyFOu<:Dz|%f#{Ygm%5TO#3U2sP{ :5'+U{X$6*G8ޑ>`w]Je^ ϪZKDnd۔-+F`>xQkΑ}[9eNJ(Vh`aJe -k||sVZPt٥OfS$wle_K9vJUX;qꖫ֙JW~;Bu 4Qi z*p%u{:ra`vwZ+Wgpܥt?ݦ2-7S^ Aa&ȝI6[l BZx8MsZA)9.`Y4ߛK?uw6$v맕'l>L'U>~Da+<;x4T({?g86#ˇ -ӚV\1'j+Z32:B:2(5(0qD:g'n6#4ts5,;@2̏*[Y<0U5a$7Y7ÖDCo6ͼ{^&TJ+|p9)ĝT-p.vҗ)lm=㹃6] MڔH?~i-7\+tl釉/k/Hw\Mn6a[n`:Y+J8͒U5uD`wz# K$b"lf>jCɃ&V17O)K_|n -\ %HtGjeߥ,Vg50 hj|$\%X9 C -IY#I>[ܾΧaEc>+M\ u.A]T$5DGu}kW!RG21EGg-̩nl/i9#N;<*:$W^ߘT #.ɷc4RoޝDBu uY6'5zI^ h`oT -4d58Ta5##.[8h6غ L=وUٹln0}p@r>2!ȽsSAs>"iR7QŪjfCL_bjg[ E$XvlaʻnJwOvsQOn;?Jz5S9԰ xϥ7DT[& m* 򣚝eJ:#5+(()4-P`T1M=p yu@xӑ6r2^rM29ȓGs~[ \?o_YkrEk.ѲL ^pBaBkqq.M8XV݀Ё߷N`G,ۈ8?4M3F.KaP3@}5JpANZ>]j~^bA|e~߶\ș},`6l[/'.gMլljyt(eHcI5w=ꁉg r;^7iLgϗ#f"`BVi0#S'F\r-_e>e?LKɴkFJy:ކI P gusd:Fkdn-U$yÝ'nZׇ -rA$[zNXk7>'gIM=^njǃGFXiYҝ':!^. mSVƒ(YeZSƱx~?[>_U?zι͏jt2*>;XL7VmP}#aŴfE81{GPtQ,.2ZxfW%u<9Qm:ߕevgtBʬU>&p ]K&6f"msS^[T F$CxrUͲ-̗PBTx/}Q J?^GV%W|+yg^"g Qj*IoUoũl9҉xֽ?D8|@|8΄Xӥ3u~B9oiA·rW̘&`OP+D$oM:+x1>JRMp5jmQN,`_2wb6>$s/}K5pcK3W Xխ?*Zm,;M筐oCtPp'C>}MH{#nzЯay%A-h3K_P*ד\O%=ފƦL 6"pQ5;aqCpKXnL~WU7ڪÛ҂8Wɮ(h]^BahA*8U `픅YI`"DΞNdOSnTa~;h7tu(6 eR&?R]6夗5|u7[ӱ@dI}L^9H!< -~q|ϖNjަį.>Gg/:oj{SsER.%R[v.ls'QI6E؏v-\Apaspl)ͅlFؔj7QKBg膿,Bo-O2N?mBhcqE58eo#=H]MGYb&0l42l+Ꜫwi 4}Kw\+ôU? YVgE.C&5Ɉw蝔l V.}Ll!㻖\&RdL![Ʉ0ѯImm}9oS q5 U4."Z, 7Ӣw19lJjM &>8I$5[#jnMW⭃&0؋Ⱥo↖AEjvk#5W±^ki*\-Qw,ډfwBܙ~8Al:GU5۶jv(=w4 =9N!?GjA)\܎W2L|.ScUV])H@([ ---V\ N#u4Kd7JU |qK YZ%_币 i(N"P~O@F:V`8idž솶}g0~u|-zΉ:f➏EAPSuvY<v h=j᱉S/ -(2*)e([HK~&}o4J}m؜ÄWJCͭJxm=mW'KmEkiT*ٜұ=J͜^OPs *L.c)В5itkY:ݠjvgE8EZt|f{D'w.y[8>8NO*kzvG7`gtK. >t-ꪭ-WV[p‡493BCe]k_",.` d N&25AY64u73Ǚ@cNEoZ0c%M+S 4@ M) *S~zr0o$lWZ17Ip65ChV-|B_B!:41}GLS"ui9Ѹ" -W^?,EI`xyM/@ -NgHPBLOSE:ڊ, !]rKAd▵4A`Qm lKH5T9>KsVuO>Ր82wեx}&4nҮ`K^"Okب$R7WP] +ݲ&!͓;7V!`pd$E#0 P-E9C0S?E.Z 5Љ>NMxȆ{OzG -ZۋSde/xepF̏@޹$sQvٔ"Eb9WY?{ :A#9S-(zSРo0<!AGH &߲y/Q!YL^f&$JkTIBpA5@-NC~t쨫(hĔmWJU ^b;>'1Hy"ArWȸ$1pԴO -+*DY12,YN\`~=3)hJT}VF!<~@我:yn|b=x\b,>| -.ʕ fsi{#85Vl9BX7v% ÀZ㱑>DH+yR$y(`ƈn|:xI -îVbda6*hy}?v [0ON$ȕS7S2ڂA2&zBu1HxrX^sǸW}'Ъ3 a;l~yC4vض_ oxo}_#1TL{3ƽzЂxsLJ䲐DW|ǧl}[k0<Փv֓a#X]:7y5@BFDz9cQiǾثQ }*(|,{+(/Ȅ>Q .R^_3wQp!'*c:H<|#?kA/GF;mvS,t&) -o - ]'ۣ2JtKٝBILیIV+*D?gŋTTGix_7W_7Ycg*E*w-Άju}KZ{ؠG B,!ϏlLFck1`Oi'o5jAYrU1x ܨf]mVj ͆s,袎t}`v`UM!$/ eԤD6PjQx|&^ Ȼ,BLܨ9:o]r@#1Ü)Oi3qV'1K;; 4DG*ajm'k{XǑ˜e ,Ħ6Lb*xF+6Z?P'Z ?kZ~&eD|}u8"{XkSqg79?>MۼȎ=?dJTK[Gnm/ERc -?/ fL^8Ǜ%!5(lTP72ZF"\`_|Nq:F#a Z|T6B3Ym ֙Ge#ʃhd:*539gR9-}:AGW0rj,E!D^;386jwl{yZ'\^LT5 +l.GG8YWbx3.OU17%.b5{H2;"US^?qJTa lk+]xE[!,Oy/96+IgfXb"v%˶CALps 29nY۷Ol6NAjuE5l=*\b-&hj|~܅jŪ3/ {Pvn2QE8Sނ%qSXjĬᢊ('t`z[ikB mi}~) -ߠN-\]oi"[_PL+^#C`pMfx:S`Xd;3cevOٕ;` 3-g'J_Ѣm 0 sb(ߢEZF]ͼ6}w(Im*? ]͈9Ř N(!ؔLn Sfa$M^p'e5YMR -Ş~lE]Oa&FQ˸lܕ ¡z^\M.2tňzGÊ +nLRmv}kHcS[Pu*j~r&`P__= -hPEɰ'ڌ|3CZ2 _0_C2깴gk_ di eBp@tQW -/B)Rw\\:^($GJ~UE;$޷ntq8,Ze~N&!J+uZ[y,Z;:P`lU%xl =|nu˕N|L=p1F;et_!="V6u!HC,ؿިw=w̕Crj:-.gj:ϥd#LLɢ@PQA\k&یP{[zYPKj9bKN XUode-C{QE`,/,VSSi?c7kӇԉm}Qs_Үɒ뛮ǟ -gps/Ct{@Hgj%#3s &GTf]C|Eu5qbCzA% -nb5yJ[1 -"\s^b,N&Oʑ ;ړ;JRlb+qL^m?+Kp)=Vwl ^eką /,Xe:|U5;JbZG[6& -e9 -@T:,Pҽ#Sz٭8+SxAhPhQC_4bB2 )g7d'!Ƕ7FCub~Rew,quS!YJoTm RKAТH@&[\ڸ~k3uՙM1z ̣BxK@dݤқBR?pdB^Jd:̣4GJ@CkldɩބtqM-?n# -ޙww 0deF 5ᐁ$aK0lD9[q_rx0pquH -dŬCfN}|mN+E_<DsjG1/Ǵ*/Wte=)X|?9]mi~j7n%4#>Vζ=9 -17C\ fr% M(Y̓<tUnݰFҊ PtO1xyl4ntJD!I *ؽ||m9-'3ft<0=D?Gó70-9xbM ᦲ"8ͬ$ٶaҖ<9LYj1i0=C>csK+B8|c6{de ( mCGM -̷AvFiFoׁ -,Ba W&t앻I4X14y/U -\ݣT'(wv|S^ҷj*3< 4<(!ĚN&~0ւlLʪk<[bD^N V~<.rDFdudz`ix* Td -`Fȁl~">lhKOj~wXzF PTP Qƪt LnEd^9Z8`YhݺP&' N g49Ptiw2+hYhxk̯{"ao l&%3!R(pd/yGɢ:YO֢"  QQʕ -}ԤU+CbZ2RA:pkqM7c`dA$m8c`V[3⻹~ތPhӘ6 ܭIm2/4VʴW鏌j8rCdoZPt*0V_CiǜG=Thf&gX#7K}FWuQ @S{pgxb`½ofX%S'ܡX"rԤ3~hqz!#ީƋ42_?H *HcOO"@xgD3_B,nz2(47{C8 M -C+qlr#N L4$ab$GoSO~TPFG^!u$ D ~\pz{ЃqUYB~m9!:WX %{p ]׺kwuk|$2JC(oN+t7TMivgUNiLE 27nh!SȫBv|0 -jˆ#it 3 %Hj$w]leDq_'gA&5kT_ F.x*޽"DY¹PAP#!Mw"w?p'+]qS_L]1XR# sDm(ݏ9bEWmpH;D!kGC% -mrs%9&0\d|-{fSSxn@mW$p}{k*MVr:R"_۰K\icLݹsb ;鰱o`e/$ * -ڃmMnKlwK8t UG|rT'z.P/::L >NㆳGNfE%5l6Hdt5XZxb뤻Pr$=Wt}˛@"|Z,D?Eџ~ HI.仺3x /I8n1qHk)yfԶa,0d -,@ưQ;d0>m߆WFH3d8CB &j] x%hwИu ~t 'Ns+S4hϬOY/$(/`k[ᙥerXRʋucv|+)-jTz- r]?MP BE%S&)17j +xͶgv7oP4397Y\Q a8|tD<:KVo_"+vRUW΍eR3T| ibX*J),Eda kYj ;Xڂr-/bޱ+^F$F\t_m+E A7t֬6͚1j,.RYab L"ʉ v 2V l­+V>ZaORP xaӛn -NT5:~EP+s= gJSYu?fi#j^Ldk2VM<\q}BV"=yaaSI!r5֞coY{ɍbq6Ye;[J^^aU<,x踍qvZSl"rWE1${"Sk! Az *J%ڄ '&&S <68iΟQ*9u@D!L~eT& -گtNɰY.Ol^Bb9E}/ypLE@x* j]Ԇ284a:G\*MfCx7 V!? 5&w`T[ !76%@?ʃINWXM TG\5/P-XH-ߧk/]U~q+19~>UVńHnh#v*Wp486w+;}): n#Ԙb[XOFP`gg|@}zi`dF`)w JaE_ޙ! ;,ʙCBP[[Oj2БwtEۻY%} g,1.-r^68QynIOvbx#blbSIEwk=Go -qiL4C -Lk5*)9st; h{!ٲ*xƬp7ODC'D5luݸ(ŃSu)8u{aӀC~Z{0Z,uX+1*fu^ Dms 0mxd$1L-Ɲ,xsw-feUؼy8wj֍ |!(ߢ?z2)r|.QƸbfh>opŒx]ev|*E 9l//V2:$HE#Ar ϶9J-Z^> uLT(fU̾ G+'=H+0<>ƛTT-wS_{6f^UA`)AKoA2`J(giWH#E:o=tB>Z게50Ò,f?٠.QݗkTy0}?PƆ^ުG//Qp`@ѥ+Mu_a"hѿ(i>=tu-q|j+̨Zo#afK.d_si` I>.agzFE:N=G]YMI.X'eXHz nzEߜ]~ms7i_,j^؇QTyzPAŦfr#V[q:y Uod(jaM1SCmY@>BQ7gqη2* =t?k@֋-ZdquLG Ut}>X?āKaH-s@PdzyiT Xh^h]\BWP%k#_-zdۣ r>VG/BjKC!^,dqv} o ACgA.cF݂| W~#EracB aHDž!qBHx@NAT&o˓Ҏrb2U#Hhƥ1e1W_=t[C*JW`՞N&}w@xn59K|RmT#Neu8 &Γ+5c#0FsWՖzd_Mc1Hn lk٬-l֢% 7}]48nTIsժ9>87Ch>62;u6(Vk!lrKz\,X]RjC-tB0.%i f$b0 !I&@/|R ]@˧yu^w\:qfi΁[*X'%pͰ0*T$C[$:H/v3ehipƛF5=] Wlv6YҾd)Lg/Lx)+7X0f^2t3{͗˸pLJO@UnwɯAOjKN,Y꛳ܟL9`KweyCX9`ժxsMZulOf] lb |ED_w+c K:Caiti%>g":PbZޱ ^As -$C ̮^߆ۧ(蝬(BA ._c"ZSSMq|6S)Xlcn`cG J' 3z3U9M~x5,M -龗(/qeQ[]j'jBbW[|蜌U#. _o`g(GБ@E(Uӆw]r܂Wi {by;Ұ?zT'gCnʴ=yE_`gEf'O.手yǛyj= SE1xVj|#ŻD3UI}+lSDhjE}3] -U  ZNcJPgx֢VJ+RIw* g1>TI?*Sܬ:WL+ņ$~Y ҀYV@%@pl3Z.naE9lTx{ tS ck ={L@<"Y@OY2V2gPmplvCHA%IF֥بb,+eQQ 5`ղb9v"?1чR֞@/&2;~&Ѱ._%1/͞É13JۿMj? 16O -d P|٤*h:h0;UAr &7k.ʋH݃~r>RZjp -uաsÆx&ips0;taH9l#X[,@!%jc/2-:}]C:*DsI&h0`R"E*v?} -q`c.X7&\՗d8q=R+~s죨\[,tϟMZEgn;΁r5̲o5ά4yi&~:O ,^5@oH khrjgLYV&aHlbr -v>%A1-e^>΢yS`eYw]22; -z?( R@[[$kyGXm3rQ^ ߍM‚O#X`7`&%zHըP:'qL%\FtPn*8o_y`Ĭѿ\#SzoBoFjU+O<][qz/w]t*C =scr2TnHE)K.ڣbb\BwWQTuxC[LRXd׶9jv5ݟ=n\nStԔr,{8ѹGR MfR1'c8ph?ndOYi:AZY?YPvh"?N -8g-ڧ3֟SK /x/lDov̻,,~d'?e(ogiIya=%YY5w+&1(8*Wl%sR*eOtDרa)g}/w0|18xN~q62ߤ,Earn>,27!|8ص{qLj- PfueӍkw"_f*ok\H-bnJ:ʷ̠P~hXZi$XF+n1RZqt-陖s_0+|dvƔfN|܆7Y&Q7^v7<6@ᄸxtzD @ؖp8.$JHI#u| 1\<a;kc -N4V|*‹'茿+BH Y S+u 1 f`UCpO mO޼| t֡RWq2XyK{Dm0?ng}eT:/}6DXַ[%!JX[iJInKwP'ûuھ6|7Dg7OiN-&__/<;8tUK:LZEN fr`u6S(4*\]k2J&c;2Q;,jpb%21ʁ(~& ;ˡԣRMiAdhyT7nC$f46::n,\EelrH22H{ ֬S^ TfQd&pG) -0 C#s)4I%Ec@xw+,A='c Nnjm G. Ҵ7m)*.tQkv۲xS̴,m*'31צp/͔I^ҭA: [zTWЉw]p_-x$1Vk %׶'d="P*On&5Ss$M,dm9@eQ=~PZl ¹ރܴ3p3fif -}RoS!$6;"PRZSf6NQ<"=fk/ݡ6+zƚ<"LGrBCjk)ELo8 kԕ rJhAgp&]ePka B`Q  H72B&~+Ӡ!YX2Sgi -f1C5ʃy7_Mr!+o3O=gnI'ݾP ]:}21- eD3*\ Oеi*cmq:lo3 -)ƦV,{]l RuEq[ JO[ *0J48+%J* uDzF: -ob -]su[5lDOy~M -(Ϛ CϥdLՃUGHRD[~}U5{^4[ڳX &p8 p\OkbB9Bfȧ'<,]#`X\8]-BmKs\%"ꦣ`"\Rf1ǻ'`%z*&HN*Acn'X -=j`f`?S]^Ӧz x'X9fiwzcR8%cwmGվ%9Zs.(L3R(F}LxokOmd{g.%qB ڣ}t\6٦ãYN5f -U2cC|`?X^ԂGn Fhyz|DJ`IZt7_U9^yڍ[]j%&g!DVTmPN  ?BC3D -܉M(k{Oǽ~?쭅0gh$khU ms -_mdnbF'=pz^XxVۨCh5ރ/M{ 7eG;͙T9#mcZL*dA%mH 'AECѕPԡfX/B|K# 8m_F|N /Buuqj - ~| -d4am.PWPF&X7}ڊ|R,,,զ+P3iCs P1U:JO& 6溊WE`s8+rSj$_pb{Yڒ3y7iA}PDtrӗV+Lm결-̬d HpnycÉj8 )ylNw -Ӌ K} &u -(ۈ dxYY#)-ސ Ma;O"8OjB%* E}}fv ^ġ um=DJj,^ñ梩HeyV] r~>S{3B -%n||[ -endstream -endobj -1957 0 obj << -/Type /FontDescriptor -/FontName /HMZFET+GaramondNo8-Reg -/Flags 4 -/FontBBox [-177 -344 1696 953] -/Ascent 758 -/CapHeight 712 -/Descent -253 -/ItalicAngle 0 -/StemV 75 -/XHeight 0 -/CharSet (/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/ampersand/asterisk/at/b/c/colon/comma/d/e/eight/exclam/f/fi/five/fl/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/numbersign/o/odieresis/one/p/parenleft/parenright/period/plus/q/question/quotedblleft/quotedblright/quoteleft/quoteright/r/s/semicolon/seven/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 1956 0 R ->> endobj -1958 0 obj << -/Length1 1213 -/Length2 24371 -/Length3 0 -/Length 25186 -/Filter /FlateDecode ->> -stream -xlsxf϶-[mvl~cضt̎m۶}>=돪sQ5Gg)( l↎6v&rvtΆ ! Yhtsq4:qLg - gk O@ dagonaG_Do3@`bfffa;gdD;Hϭjv..pdvf܀OJT44ebyw t0/+~@[ߣSRbvfX8 `Oɔ@Ȣ&v609S+b4ۃ*mekf&= PR$3:XY89@؜-U<d65񲷳Z;},L8/'CW  - `ba 0Y_h;@ 3t9C AFPNMX?{w;@ -`bgapq|7㿵o U0?dJI[S;׿/s(˜T/gla PtZob. -%Oi J@3kC [cbh$f4Qp66W[b-P⟷@1s c+[_ښǦv&fe翖4t47O6u;k{mj@;nuΘ'Ȳ>Vύpq.F@X0=Ka`Q9so+ LF+mHnHS}ZTs'#n-[3y*,ZŬSq^*kh zHhlNNNj:.IR;D|qf_xggYgi'}3y>Q?q?:(&įVL.;eG;I#yeBvvps% Q0좁<=<ޛ7]O;Nмn<)8%.Kwf cUSSِ\4ΨJR-} -K - P`Hd#k\*R#rWIcqDs:\uc:6&gS gŲIgqxV 61eo@V'44,;5${)YT\]EJlADBWAP _)Zlxa4y#y*wz٫%`6qcΨћ }mw0D48 1S~g[bXjc;:^H~dش@ &մ̚X]CJ9d[W#]SγVXOuLx80y8X}֩@!\L]Jx*)18gYp(: Hg.\Cs TƉ -fAˍzmm~Gj`1*J5&8벧2ض}[_?@ՅU -o՞D]֧9/̈́6Bw~:m;&9 0lUJ<SGnfsA̹5S%gjEm#Ĕi 84ij)~Ѕ;gR]"ir,^?=G&>r% -?)t%Q7m)SQPeR:.6.,:tOʊYu5fئ] viH[OȬroKN@p[DI88 |jU4,x4?M5x{6Ǭw+ %D^/E(;`MbS]rځ\6v% ga%4TƼz{'!2k 8kjp6ꞧ?d*T95灟VȠ߸[u ه~ EL0o891چ&7Oɺ< V&o2 ߐLzZqJ<+DU {kD{M!ӡ~o[VQF7pl,隥׿N#쌩k' sNשsM}B[FGȲs{sÄŦ[eKePv/ &0_3rL+\y-Or fZZͭz0 -B#$g넯F> :̩逛|#5S#s,L8񏍱\R NAnϱHQm#z] SeI)HAnDvy!Za{YK|&L>n^6,+y_ -˜BXht? `}&"NΌVzBNgSz -iezUӔ#2n9jOq0MAU W -fMETI j`ο HL-gEHfR$]e?U:VCD3pegiiW@!)x !ń=^iUhB^9Kp⫤ݰuߚ̣0!`BS,@GfaՏ6?wᨓ$.O_ƈt.,qTsHU6'fuxXRnrO]ap8+]1|NPTlc}5?GIk+sGbWt:?]J@uyS2ЖrrP_a%|U̒>(ICFp6\OԀ>O -{%+_R8LnJ-I7UE]|`> -R^ ҁRґF|hQIG?j݈#m12|<*tRq4asf| i7"Y֊n+ZdsGG.*3ʼni TiIҎZe4zsx)y![䇛;B3\<-X+9b>MѫڳO0DAsmh&J+E67Sv 92Y` - Cُu ;$>q[5ZW -v{Bh6VhW2):\^NŹKli 3L ]7}vp@3t.Dc1k -<:!O:t[ SK5T,A<ɩ\M0s8oR`=' -xE`o%|lSnE -e+_, 0](x*y((ݼTNeߣj%ۖh30B5Co%i?6q?yi` @=z.<⅕ Fy(vޱ{M P.vUO#jG M 56GVYmIf:2M 7to2J&0mKm1XqG8T4[q/F+~3HvTXns{vrtcqRuY'ߢ\^ *MߩI "Oݵ'U~3׷$dž񎫲Nd"{U>7u#ϫ|r\V# 큕V^Kx峪WG}|tqbȮnqZuT&fݐ<#+c:R#rЊ6!aMvVy{OgFYKzUhݎb_g H q2 T<>n,s(„ŬArU(M I빔)AU?D}Ns˜嘨/doL x.tĜ% &3 y[V7cnf zHAА<0|ycp†U -Cy;SF%o-#™Mm~ ScP҃}/]r$C `=Ե]DU,.Vj]CuyW7EulNˣ]E`~xWCA.z/^)dm#Ms4HiM3K#6N(*֯s0[zeYNN9 : K@'\߿Z>k71aȫnXG5L`iblTQ<ڇC>fdָ<4ir"-*6xHM gVG t@7/"&::_2kjL Ĩf@wxݮtމ*+gWc@%cun:pS -/GFlue,0g` ~X!cKz"zØ}Id!TKJޡBA}4ۢ4Cxub6~7䥌Ts)ԊwŲ'g3nPzq99:p\"vRFm}D%z748OtKAH!f&@UgUm^m*V%y⡙K%nS'ٰZd֓+G9#*Jඁ7M(툗4+e ģGи$BP5gSaZ| 4os)n03RmlokCE-G -_ihce╰67&$ޜg(5d+ ^.M LBUWƽb"z9i`7"ͥ2AL8Uzag؞@3Dy.tZOy6&|x#+$_lwZa +X$HaBP\6)x^-(ӧ0-&B@!K4 aHk_75bn:N3:Uq{th3(Æ2](jS[d;7d۹OSyNR .bʻJ\cLpC6< -b{]^:\mMiF ߖHi~ ?E"ꃰ_g@L*z!?GJ5|ǂ唍O1 c)1 􆫈qj1>/Ʒ$қeE*Ogj"p?w^-$$!#n؟Fz`-\r+'jhu6Ob\"R(:8aOܕ式68fjyԥa_"STp)9?}2OXdp@xsE+<#JhPK[ ܱ3͡S}1al)f~X]%%Op9jDGyaOW)U\Fz1Q 5?]!A""zS.&e+%7F0EUr\{G-%<}x[pdiEɚ♠t\o]%m6_MY?.͑f@XkC3 -m>Xr|z`\wֆ 8,Tm/k#H[82JK'=MC,t)Y; >p@0s|f:6m/w+HWBA: ޟMK#JzxJgs,{(KTucU/yILD=RcPĸy%(5 :CR9aA* -n -J4jPiq1꤯%%KYb9%oqq?:)òPB@/~ <Ƭ:t|Q}")#oeIHGsmmS‘lB3Gw?#V vGiDzW+!;~- 8hc%$2 5%5 ҕjp|T 3vL~uƴx$t23X5Szݬ2M^{(mH_Mq+_9$ߙxGj,&Zj]!S!XD˴r6^mܿ35_"i}} ۏt^CXCf P)2 :dT& oόpigU7hH#yvH%|a# -%j}`@uI -_5ܺPN"{(-Φhz4D.Pޚf -p5$Ǖ!9-RJ vðpы]c.;aW^Ӄ'ڟes+À+EoN t ,?jPr&( ڬ[Amf+H' qE.de /PcKt`B'M |:bEt4;|~Ąo, ub'+!J]xXESP^VKYɨyQ,Aӹp$~R!G._@_y)^߼p ܷ -!aC6<mL AW~L':۶roI܃\NfWz\?SL,_s9HJ?ncըJ 3 u̗Unj[ΐ7ũ4 -b xY&9.)Ms*:8of)\I_AXtwH"{ RM=⎃r̒pgPω2w+kQQ^iËǯ[II3vM:vi&7kF7=۰ߚsaHI $("9|Ҩ'tCCBU[w3ͱ8͍/F)"IRVV ȷ4& :N< v_,c| -CS},t"Tw @JoLhg*bxp8V8.7rpbXslDb*Y'|1'C<^^ W!kUjQ-;8(2'URvKbE59)P:>p(`"r~ BJЭ[2z2 -;e[FߧgV^/NU13/C()`;l-7F2T q>>2<7t'U>"'@/fv1M`S[kõmO+; ~zYH5 0* n; [t 2)"ujb",sO O$ 0&-즯饁+ r~# >"<3*eg `(c.KK?ԯha[/V; F Uϣu_PCpyҲ,[tT{glǨ60'f[`e2QF 暯o$ ^܀ow[t$6m-vjg'hB>=-bSϱ?0IB6z}glO&~8fI[=V S""2oH[ -شp_4.3N1lk+G bwvm+Í,K;'5\i1/C&(+(noPa$AKݝuᬥL݉&*-f= 5[WBH074i@L0# 2 :Ɔ& y -I*ť -Nae[9D36&L9eu2\.$vLPh[IBaXw'I5CU><^V4WNCh!UmpgxskSAa;&)%Z&x¨،M; rHU؝'[}L_ΉG^T*SQ,xa -ϧyOsws r}~C./țQN8+#j$y-ٔڊ]aa,8ߛ~qC&"j;XbІߌ,] [ -S&3|W]cuVtGJF6,E,}`FJ Fb*l2@#>Sd8vV&, !C3Wf,W -;\HZQ ?VOL8,vfhZڌr~ʮh#@Ƈ1CìkM/ K.v2{Ah%9\P~Sx=HC+9 93kny7cmB0s{>Q5` =)FPUesϦ :(! t*q!{U #;u gd2O6O`c9R*^Ϧ -n38'O=%mb> BaT\k#Z1 ]vu1M+gza+Z!JpEJ.glr57 BDj߶-3+ӊ]Mq.24 V3; g5'i@[_tk0fXO}Õ 9|x)4<]No\ySmTqď:7$pJv|eFtH$4r&"zm.!)B6֎5v('=<]e)dah2 - 1e -k*)sWoϛ{mM*fÔ^xI aV/7߄.p4/=ۍ5Q(]_\H,b?oH 缤R_elgzj ymN5)ݾA h8(!O57Vi#_P˸{wO5.B#ғDib{!ZUg"n5!"u۹դ[HqJ3jcfwPwbsp5*&=^~c5Ά3L%C?1(u4yW>B܄Q}k͌h_[smzuŰ نO@>r,Hb13 -*TgVHR?\,%_qmxz>k7A*x1g@r,ӗ%&넲ptrDWL92Uǝ"^^yԀI(c ]C ]g-9r-J>cF"nd'B ^e*^'䅱b/Fx{gbxwɣ+?j~wA~J/߬v_o/3$ Ÿ#Wpr{= 걳tM<0@wtlEy7>(J ~^zf-nBn)xX gn!n.6"'YѮ8 |Z5@jʭ]9$A B@F]i/fɟwg^WTKOSXce&.)U<]rYj.%18{Ь8'gWp2#d5iGf?#XIklT6H;keqOr;I-+.jW8̗LM|NXG?kbu&ZCo%]3eZ; -Y'ȇ=(Y:Cy7Vd!.R)ffi3S^3"Z%ލQ4|cg2-]Ż/tTǑΗ5n-G4}KZ7ܮWAD)Z VM>[lnm -톑@VGZOpuSQ~2_A\dKvj} #3m#8dh=n2Y~mຩYA>Ĝh]_m"؁ZڌNw%{$tZϞD5_zlkXS'kq~^V%)C<.*PY665f fij}-:xK+'y(bO#.L'iNn#pȅ+zhb|}=i8YvVygJ:g3>Y"F0.vdTY0ym=-r0J9NRWaۜ8:L;ۭ=i;*{H)3ڎ( +M݄zH[BtKNQ8"<҉r`0*pSP|*ԏ=A‚ٍ>[JR-q(De=sr` DP8Gϻ{e`µmhtvα?E&)]㞞;n(\\2=6k<uCHޖqX:kC#fddGaQNL4fObZ:1lEޗXE;Qyݛ.XB2ޘQs@aj;Ii/T!h5=(aup<7[pB,h뭬EbV#.&&:]SPOnCca)w7ӵԉz\eb,gօ3n2Zʓ'd8xcuH O|NC:X$^7>d_M-'VdH[[ -Ov勝34l79U82[R˪?4<7_ú/@'!qlx)jpmoAL4uѵJ#e r:vb{Ri?C:+Y.f!:LĒ(fĪܻJXo~^skND+w=1S$=3ExE.iʏ0fJ G7 c#LBXAjl':\C+HF\5+R -*% qZP a2\L3kkx3NZW,eoG!:yٛc.|{E<Khc,BX%uRqai-/R"y,z@S+ -%8S6Xeqo>Cn޾DZW8g뚣ⷎD{]3  !%C(OJu[Y60)}gK/l!ʡMIp2 -i@~;qptDkv(B#/}5%Sh?hf-Ӷq6yg*CZ .暨Ք\֢<:F2$XDp{c(PͶߕ~x!( l2mĵ7F Fq׶`[qhso!8đPf|22G%χ. tR<}Ӵ^47TbYNJkc_1ZH[:<3dĄ pgOJX&ε5W!t8QB}6Ztv/*Mz{!c6E: ¥0c$z.FѸAUqtX.&`ѰhMI#a6WxdlX#W9t[St1V[1 h-R؁aIJ[) Hv4F^3Ʈ]rskRuQC-wu;z|fRd,w3e2r=BRsrۙ Rţ%G[cAܦ!a[ vSr 6يnf #ϙbc/2l@|q@4nްо cam醻#R@x - cG:3NP(+RZoQZb)uof!סCNtn]zsUfѐ&[Ef ^lB6eI/ivw'):5o5~n -9ZC-, -D O-NR6v0e9+7Y|Dxzp^uG[V e[WJExfpUz/ : s@ }TW~;Wg{&n2ɣ6q/ dE{^^T#BOHk?? \Q2)87__ h) nwnhC+p9%I"G'Or+f&Hp0k*孻isQ:lVES+8iP%w-\c`G@6Ğvgɟ:A -\4msC!ҋLl;nbaeЎ %'NHV,&/l3B/E8AX`6j(`. -;{%J}]؎HKk Qa]P謕2^u*T,yll"Q5[8=8ҽVO<F4aLO5HE*^~)YYV++~SH9j}p;I1)T,FIr1/$B["dWsKy3c"4ZpcV{o=!W]0S/Nh*c a'7DWvX oճ(Z[=heTH=n@!aɈFڜ(lΫ4< ٝ8gG+/bi'6SRμ ǰe˒B5/ !FͼW V蝥]8 nI !#^XI_p$[䀣d[L5g@,<3[[,=^t"I8ɥQhL}-N)ɜlčJLy NC"1:8Zj1~SJ?Cv.o3ZnM?N,XQ)kGɜ?nt`hdŤ%">fŤ̸Qu XrIDќ{LOGq&(9>#8/U>`\P}3<0"A"*-{q^ )>sĆf V69O6Fq7 i:sa;L !:KK A)Êq0D%"9ϣ8"+J/x8~`vt]SH =MX5J?YE>4i‚pdLA<(a t ]P(odV f?>i$SM\nfp_uQnw^0ag56y25!~y0L3zIT73GUz7r -ֹ9om `MW%oHM8zhͻ<%/7FE\?:y[<߉'clpƱ/r73< zl3ˎ N3ޝx}!3TS 'i;֢2IlVaa<h1%.e$=| W -)"7 -UL:`ED7I[|sI -Qi9 !yPiEIGT10ipxbjF?V#=]  LB72| -p!剁7?"K:TԸeX]\?^X29!T*W:qw@gB"'"VzL5nAkP#,V 'hx"CÃ1(S;FU - -Bنx.?PPd(3_&SfŽ*nMeOय़ :kl3tq~ʁHՙNA:٭z;e]0!61R|yd ʵ}fB5fj]2**uYhwҙ^.d!jIJ7zzg&m|܍'qvZ6 Uq#)oz]8l.8th g\]^ݢ* l̹s˛,EscF}{Z|o)u?՞%M$߹1heSx F>g|f?dͩ5u!Y5.W%پHZݦwfh؞+L/C8.DVȋ1*kLVGr^\۴ u F2l~Yh*`͞XU#OdnqFB&濭ž%GZ( =v-Mt:da4d )䏋kJސ .?=Tk۝Dv>6Qb޳ohv` ]&"ߦ(Db˿0 nnn5FOEf*r~J8 hyݭ+w~M\;w|zMaV\]VMNmZ+$`߷x rҋU# y}ͿiB\C;/ѩzp\Lvo\t⼿ {'ܳasb..yCOnto^Pns#») ;Aӯߦl&Ґ.T4>zZ0=,۷o.j 6 tv.a{>SHcΑ8_l-,~f^fl]TSۄVmJo -lE\c<^äT5M*OMjd@Q:&x]&~F^^r7ㆳA̬oc 1ejcz:*ӭ=VZfm+߀4R. P$YESIcb|w. %NFO -^ĵ %\Hn}a&-MR^6k >Au -4-5yɥQI&;Ȟ6pߙz}"xJ5Lc;(+\Ao~A1f"W)$VKiWҗjX ,{ĸX-؍J=ru+/*~tG*226| $qccy1wzI+'&+!x" "M5Iѥ懏.e5Wj엾<> <@EݯC3OiejW|1*2OQlQclGs<d ~{M -7B[pl5Jq0Xo+dOBk|{nixsL~jN '%n(jt #B~:9/7>XO `gT,tm@,?FW$*soye=u,~kuG4/Ɖr/`w+5ڑNMqB~M);N2G.XSśH~I•a>;v䡏zܯ >aOZz¢Wkp+KT;Lۙν0C*Ə2ffx3Z3ꪫddEuE `p6ȵyML|N>KRyX&JXm]b~3@ak'l@I6% # ?Z^Y8eoy{l'=\<9&[VW5_=y>!JW׼9c]+xԽL>E'R6]M 2}6iNA0Tp6'oHndE'T3(tV7ŒGV$&U+Y΃Ny5<} -s#vz,vBH9M}wdme,;I i - D cj4 nPQ2|#3QfW -z9By߈H!HThKj8ZrfrO:1 G| pd'̐lvlhK{ -㳽.9'xX[Ù,=Z@C28je"8ل8u}iJP' vKj% Bʱ|4<.L2>0ꝘRx ٝ3.X;;{=LHblfi#HD ՏJ1+ȳ}J)d`՗!Ղԣ'? gpY$O+ 0 &HɎkXrp@cy -x JR݉Ϋ9;=چr|? C:оuu/VT -jBGٷ}n3.(ЌBq$}?h#`;ώRz~͹k: |?sI*69/ryk,-o.a*@>ZqEGu|[؃an,ӟH5ݒsC#N KJ_d)- zlv=$f -4ޔ$+Cvuw[fĂ_FW[:3-1j0O`Qot#hY99ZU'k - K|EZl7unԇj6 $3]QZl?R>y@r#XHϘD1̄i 5Mpe3;yvU*T{?)\Chq'S֠We}.plٙkU.B'"WD;U``§v?` W*m;m@}ט#jcgvgRVD-]2} V/#RZe,SD5Kն|hm ] pi Rec! T>jy_ߤť0RoC˧/]ᶱ_ą ouY$Im -[2|432Xe˺ԼDZ[:,g(FNYIN[69m4.Z>je[ULeyPbB[HY+4R ?5(Bo 9lg'@=))cUðpۉ{ mNT,zWfF>q1-YO1тȨeEntτDV÷̗Xf{q vh`r3w#ЁE Do%.Fʫ(iZQdgƞnDR^uňޟO stR# h B }4Oo>Sah[`ȼvwLEh6%qi>râisR!6R=^(luNo^v -%xϚ֫yѳ؟S,A7Df}1"e#~1@pDj,4śLNnUt|q7{5Swrsڎc鋿ixڍ-u๖~騯o-mbxd,'\-niEY"RwU茶QPCN=`ly3<^ f |exS-imx|l~SXܭG -u-'㐔, ExE%(u e `0x?F1—oF8dWbán1' _ $̄_PˎR Jw%bHF \h2[X~ -IXAֱ98#Z?[3G,L:,2r#::^;(Y ߘpJZ$\"m}83Wxc>T#vN#+?T 7ѿNƗOpH{ -BQ;:U1)xr!' -JaQS+&lsiYsTV_d@dq q}'^mZCwuW;t/]L^ʁ&=t2&Xb[ -&YW1VSmZ/:v!3D#?[pM0\#0/x$/'u7۫,F>Z>)CO/jHg3C(ǚBGJUIuHEd%6;+ >rL9ٕ2CC=8o1N67C^Z -tLS$14 ZBG˱`[BbSy䰔cTJ@AҁJc[Y)*\gc} bO.RyË+\ -S)#Az[F&&;C)zzR)vT?4 3緢hgwY>w 5 ;Ajq}%6X,:I_5&&ɥ}Rfūii\pqNDѬ^eK*/pe&8v8\T};s;bl@2I:/bhTlz{LEYw+4d J x> endobj -1924 0 obj << -/Type /Encoding -/Differences [2/fi/fl 33/exclam 35/numbersign 38/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less 62/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 95/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 147/quotedblleft/quotedblright 150/endash 246/odieresis] ->> endobj -1926 0 obj << -/Type /Encoding -/Differences [3/tilde 21/endash 34/quotedbl/numbersign/dollar 39/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon/less/equal/greater 65/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 91/bracketleft/backslash/bracketright 95/underscore 97/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] ->> endobj -1928 0 obj << -/Type /Encoding -/Differences [20/lessequal/greaterequal] ->> endobj -613 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /AQTFCU+CMSY10 -/FontDescriptor 1939 0 R -/FirstChar 13 -/LastChar 15 -/Widths 1934 0 R ->> endobj -602 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /NUJGQY+LMSans10-Regular -/FontDescriptor 1941 0 R -/FirstChar 46 -/LastChar 115 -/Widths 1936 0 R -/Encoding 1926 0 R ->> endobj -601 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /LZOFVF+LMSans17-Regular -/FontDescriptor 1943 0 R -/FirstChar 70 -/LastChar 117 -/Widths 1937 0 R -/Encoding 1926 0 R ->> endobj -1429 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /DNOZEB+LMMonoLt10-Bold -/FontDescriptor 1947 0 R -/FirstChar 45 -/LastChar 122 -/Widths 1930 0 R -/Encoding 1926 0 R ->> endobj -1316 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /QZIAFE+LMMono10-Regular -/FontDescriptor 1949 0 R -/FirstChar 3 -/LastChar 126 -/Widths 1931 0 R -/Encoding 1926 0 R ->> endobj -1554 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /QQYIVK+LMMono10-Italic -/FontDescriptor 1951 0 R -/FirstChar 99 -/LastChar 118 -/Widths 1927 0 R -/Encoding 1926 0 R ->> endobj -1526 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /MUQJDS+LMMathSymbols10-Regular -/FontDescriptor 1945 0 R -/FirstChar 20 -/LastChar 21 -/Widths 1929 0 R -/Encoding 1928 0 R ->> endobj -1275 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /UPBVCH+GaramondNo8-Med -/FontDescriptor 1953 0 R -/FirstChar 2 -/LastChar 150 -/Widths 1933 0 R -/Encoding 1924 0 R ->> endobj -1570 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /JOJAIJ+GaramondNo8-MedIta -/FontDescriptor 1955 0 R -/FirstChar 44 -/LastChar 120 -/Widths 1925 0 R -/Encoding 1924 0 R ->> endobj -612 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /HMZFET+GaramondNo8-Reg -/FontDescriptor 1957 0 R -/FirstChar 2 -/LastChar 246 -/Widths 1935 0 R -/Encoding 1924 0 R ->> endobj -1315 0 obj << -/Type /Font -/Subtype /Type1 -/BaseFont /LANVCY+GaramondNo8-Ita -/FontDescriptor 1959 0 R -/FirstChar 2 -/LastChar 122 -/Widths 1932 0 R -/Encoding 1924 0 R ->> endobj -603 0 obj << -/Type /Pages -/Count 6 -/Parent 1960 0 R -/Kids [594 0 R 609 0 R 1272 0 R 1312 0 R 1358 0 R 1396 0 R] ->> endobj -1416 0 obj << -/Type /Pages -/Count 6 -/Parent 1960 0 R -/Kids [1413 0 R 1418 0 R 1425 0 R 1431 0 R 1437 0 R 1454 0 R] ->> endobj -1464 0 obj << -/Type /Pages -/Count 6 -/Parent 1960 0 R -/Kids [1461 0 R 1466 0 R 1470 0 R 1478 0 R 1483 0 R 1514 0 R] ->> endobj -1521 0 obj << -/Type /Pages -/Count 6 -/Parent 1960 0 R -/Kids [1518 0 R 1523 0 R 1530 0 R 1534 0 R 1538 0 R 1550 0 R] ->> endobj -1571 0 obj << -/Type /Pages -/Count 6 -/Parent 1960 0 R -/Kids [1566 0 R 1573 0 R 1577 0 R 1581 0 R 1585 0 R 1589 0 R] ->> endobj -1596 0 obj << -/Type /Pages -/Count 6 -/Parent 1960 0 R -/Kids [1593 0 R 1598 0 R 1602 0 R 1608 0 R 1612 0 R 1616 0 R] ->> endobj -1624 0 obj << -/Type /Pages -/Count 6 -/Parent 1961 0 R -/Kids [1621 0 R 1627 0 R 1631 0 R 1635 0 R 1642 0 R 1650 0 R] ->> endobj -1657 0 obj << -/Type /Pages -/Count 6 -/Parent 1961 0 R -/Kids [1654 0 R 1661 0 R 1665 0 R 1669 0 R 1674 0 R 1678 0 R] ->> endobj -1687 0 obj << -/Type /Pages -/Count 6 -/Parent 1961 0 R -/Kids [1684 0 R 1689 0 R 1693 0 R 1700 0 R 1704 0 R 1708 0 R] ->> endobj -1717 0 obj << -/Type /Pages -/Count 6 -/Parent 1961 0 R -/Kids [1714 0 R 1720 0 R 1725 0 R 1730 0 R 1734 0 R 1738 0 R] ->> endobj -1746 0 obj << -/Type /Pages -/Count 6 -/Parent 1961 0 R -/Kids [1743 0 R 1748 0 R 1752 0 R 1759 0 R 1764 0 R 1768 0 R] ->> endobj -1775 0 obj << -/Type /Pages -/Count 6 -/Parent 1961 0 R -/Kids [1772 0 R 1777 0 R 1782 0 R 1792 0 R 1802 0 R 1811 0 R] ->> endobj -1818 0 obj << -/Type /Pages -/Count 3 -/Parent 1962 0 R -/Kids [1815 0 R 1896 0 R 1921 0 R] ->> endobj -1960 0 obj << -/Type /Pages -/Count 36 -/Parent 1963 0 R -/Kids [603 0 R 1416 0 R 1464 0 R 1521 0 R 1571 0 R 1596 0 R] ->> endobj -1961 0 obj << -/Type /Pages -/Count 36 -/Parent 1963 0 R -/Kids [1624 0 R 1657 0 R 1687 0 R 1717 0 R 1746 0 R 1775 0 R] ->> endobj -1962 0 obj << -/Type /Pages -/Count 3 -/Parent 1963 0 R -/Kids [1818 0 R] ->> endobj -1963 0 obj << -/Type /Pages -/Count 75 -/Kids [1960 0 R 1961 0 R 1962 0 R] ->> endobj -1964 0 obj << -/Type /Outlines -/First 7 0 R -/Last 591 0 R -/Count 10 ->> endobj -591 0 obj << -/Title 592 0 R -/A 589 0 R -/Parent 1964 0 R -/Prev 579 0 R ->> endobj -587 0 obj << -/Title 588 0 R -/A 585 0 R -/Parent 579 0 R -/Prev 583 0 R ->> endobj -583 0 obj << -/Title 584 0 R -/A 581 0 R -/Parent 579 0 R -/Next 587 0 R ->> endobj -579 0 obj << -/Title 580 0 R -/A 577 0 R -/Parent 1964 0 R -/Prev 571 0 R -/Next 591 0 R -/First 583 0 R -/Last 587 0 R -/Count -2 ->> endobj -575 0 obj << -/Title 576 0 R -/A 573 0 R -/Parent 571 0 R ->> endobj -571 0 obj << -/Title 572 0 R -/A 569 0 R -/Parent 1964 0 R -/Prev 567 0 R -/Next 579 0 R -/First 575 0 R -/Last 575 0 R -/Count -1 ->> endobj -567 0 obj << -/Title 568 0 R -/A 565 0 R -/Parent 1964 0 R -/Prev 511 0 R -/Next 571 0 R ->> endobj -563 0 obj << -/Title 564 0 R -/A 561 0 R -/Parent 511 0 R -/Prev 559 0 R ->> endobj -559 0 obj << -/Title 560 0 R -/A 557 0 R -/Parent 511 0 R -/Prev 535 0 R -/Next 563 0 R ->> endobj -555 0 obj << -/Title 556 0 R -/A 553 0 R -/Parent 543 0 R -/Prev 551 0 R ->> endobj -551 0 obj << -/Title 552 0 R -/A 549 0 R -/Parent 543 0 R -/Prev 547 0 R -/Next 555 0 R ->> endobj -547 0 obj << -/Title 548 0 R -/A 545 0 R -/Parent 543 0 R -/Next 551 0 R ->> endobj -543 0 obj << -/Title 544 0 R -/A 541 0 R -/Parent 535 0 R -/Prev 539 0 R -/First 547 0 R -/Last 555 0 R -/Count -3 ->> endobj -539 0 obj << -/Title 540 0 R -/A 537 0 R -/Parent 535 0 R -/Next 543 0 R ->> endobj -535 0 obj << -/Title 536 0 R -/A 533 0 R -/Parent 511 0 R -/Prev 531 0 R -/Next 559 0 R -/First 539 0 R -/Last 543 0 R -/Count -2 ->> endobj -531 0 obj << -/Title 532 0 R -/A 529 0 R -/Parent 511 0 R -/Prev 515 0 R -/Next 535 0 R ->> endobj -527 0 obj << -/Title 528 0 R -/A 525 0 R -/Parent 515 0 R -/Prev 523 0 R ->> endobj -523 0 obj << -/Title 524 0 R -/A 521 0 R -/Parent 515 0 R -/Prev 519 0 R -/Next 527 0 R ->> endobj -519 0 obj << -/Title 520 0 R -/A 517 0 R -/Parent 515 0 R -/Next 523 0 R ->> endobj -515 0 obj << -/Title 516 0 R -/A 513 0 R -/Parent 511 0 R -/Next 531 0 R -/First 519 0 R -/Last 527 0 R -/Count -3 ->> endobj -511 0 obj << -/Title 512 0 R -/A 509 0 R -/Parent 1964 0 R -/Prev 443 0 R -/Next 567 0 R -/First 515 0 R -/Last 563 0 R -/Count -5 ->> endobj -507 0 obj << -/Title 508 0 R -/A 505 0 R -/Parent 443 0 R -/Prev 479 0 R ->> endobj -503 0 obj << -/Title 504 0 R -/A 501 0 R -/Parent 479 0 R -/Prev 499 0 R ->> endobj -499 0 obj << -/Title 500 0 R -/A 497 0 R -/Parent 479 0 R -/Prev 495 0 R -/Next 503 0 R ->> endobj -495 0 obj << -/Title 496 0 R -/A 493 0 R -/Parent 479 0 R -/Prev 491 0 R -/Next 499 0 R ->> endobj -491 0 obj << -/Title 492 0 R -/A 489 0 R -/Parent 479 0 R -/Prev 487 0 R -/Next 495 0 R ->> endobj -487 0 obj << -/Title 488 0 R -/A 485 0 R -/Parent 479 0 R -/Prev 483 0 R -/Next 491 0 R ->> endobj -483 0 obj << -/Title 484 0 R -/A 481 0 R -/Parent 479 0 R -/Next 487 0 R ->> endobj -479 0 obj << -/Title 480 0 R -/A 477 0 R -/Parent 443 0 R -/Prev 463 0 R -/Next 507 0 R -/First 483 0 R -/Last 503 0 R -/Count -6 ->> endobj -475 0 obj << -/Title 476 0 R -/A 473 0 R -/Parent 463 0 R -/Prev 471 0 R ->> endobj -471 0 obj << -/Title 472 0 R -/A 469 0 R -/Parent 463 0 R -/Prev 467 0 R -/Next 475 0 R ->> endobj -467 0 obj << -/Title 468 0 R -/A 465 0 R -/Parent 463 0 R -/Next 471 0 R ->> endobj -463 0 obj << -/Title 464 0 R -/A 461 0 R -/Parent 443 0 R -/Prev 447 0 R -/Next 479 0 R -/First 467 0 R -/Last 475 0 R -/Count -3 ->> endobj -459 0 obj << -/Title 460 0 R -/A 457 0 R -/Parent 447 0 R -/Prev 455 0 R ->> endobj -455 0 obj << -/Title 456 0 R -/A 453 0 R -/Parent 447 0 R -/Prev 451 0 R -/Next 459 0 R ->> endobj -451 0 obj << -/Title 452 0 R -/A 449 0 R -/Parent 447 0 R -/Next 455 0 R ->> endobj -447 0 obj << -/Title 448 0 R -/A 445 0 R -/Parent 443 0 R -/Next 463 0 R -/First 451 0 R -/Last 459 0 R -/Count -3 ->> endobj -443 0 obj << -/Title 444 0 R -/A 441 0 R -/Parent 1964 0 R -/Prev 391 0 R -/Next 511 0 R -/First 447 0 R -/Last 507 0 R -/Count -4 ->> endobj -439 0 obj << -/Title 440 0 R -/A 437 0 R -/Parent 391 0 R -/Prev 427 0 R ->> endobj -435 0 obj << -/Title 436 0 R -/A 433 0 R -/Parent 427 0 R -/Prev 431 0 R ->> endobj -431 0 obj << -/Title 432 0 R -/A 429 0 R -/Parent 427 0 R -/Next 435 0 R ->> endobj -427 0 obj << -/Title 428 0 R -/A 425 0 R -/Parent 391 0 R -/Prev 411 0 R -/Next 439 0 R -/First 431 0 R -/Last 435 0 R -/Count -2 ->> endobj -423 0 obj << -/Title 424 0 R -/A 421 0 R -/Parent 411 0 R -/Prev 419 0 R ->> endobj -419 0 obj << -/Title 420 0 R -/A 417 0 R -/Parent 411 0 R -/Prev 415 0 R -/Next 423 0 R ->> endobj -415 0 obj << -/Title 416 0 R -/A 413 0 R -/Parent 411 0 R -/Next 419 0 R ->> endobj -411 0 obj << -/Title 412 0 R -/A 409 0 R -/Parent 391 0 R -/Prev 395 0 R -/Next 427 0 R -/First 415 0 R -/Last 423 0 R -/Count -3 ->> endobj -407 0 obj << -/Title 408 0 R -/A 405 0 R -/Parent 395 0 R -/Prev 403 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 391 0 R -/Next 411 0 R -/First 399 0 R -/Last 407 0 R -/Count -3 ->> endobj -391 0 obj << -/Title 392 0 R -/A 389 0 R -/Parent 1964 0 R -/Prev 67 0 R -/Next 443 0 R -/First 395 0 R -/Last 439 0 R -/Count -4 ->> endobj -387 0 obj << -/Title 388 0 R -/A 385 0 R -/Parent 67 0 R -/Prev 371 0 R ->> endobj -383 0 obj << -/Title 384 0 R -/A 381 0 R -/Parent 371 0 R -/Prev 379 0 R ->> endobj -379 0 obj << -/Title 380 0 R -/A 377 0 R -/Parent 371 0 R -/Prev 375 0 R -/Next 383 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 67 0 R -/Prev 87 0 R -/Next 387 0 R -/First 375 0 R -/Last 383 0 R -/Count -3 ->> endobj -367 0 obj << -/Title 368 0 R -/A 365 0 R -/Parent 119 0 R -/Prev 363 0 R ->> endobj -363 0 obj << -/Title 364 0 R -/A 361 0 R -/Parent 119 0 R -/Prev 359 0 R -/Next 367 0 R ->> endobj -359 0 obj << -/Title 360 0 R -/A 357 0 R -/Parent 119 0 R -/Prev 355 0 R -/Next 363 0 R ->> endobj -355 0 obj << -/Title 356 0 R -/A 353 0 R -/Parent 119 0 R -/Prev 351 0 R -/Next 359 0 R ->> endobj -351 0 obj << -/Title 352 0 R -/A 349 0 R -/Parent 119 0 R -/Prev 347 0 R -/Next 355 0 R ->> endobj -347 0 obj << -/Title 348 0 R -/A 345 0 R -/Parent 119 0 R -/Prev 343 0 R -/Next 351 0 R ->> endobj -343 0 obj << -/Title 344 0 R -/A 341 0 R -/Parent 119 0 R -/Prev 339 0 R -/Next 347 0 R ->> endobj -339 0 obj << -/Title 340 0 R -/A 337 0 R -/Parent 119 0 R -/Prev 335 0 R -/Next 343 0 R ->> endobj -335 0 obj << -/Title 336 0 R -/A 333 0 R -/Parent 119 0 R -/Prev 331 0 R -/Next 339 0 R ->> endobj -331 0 obj << -/Title 332 0 R -/A 329 0 R -/Parent 119 0 R -/Prev 327 0 R -/Next 335 0 R ->> endobj -327 0 obj << -/Title 328 0 R -/A 325 0 R -/Parent 119 0 R -/Prev 323 0 R -/Next 331 0 R ->> endobj -323 0 obj << -/Title 324 0 R -/A 321 0 R -/Parent 119 0 R -/Prev 319 0 R -/Next 327 0 R ->> endobj -319 0 obj << -/Title 320 0 R -/A 317 0 R -/Parent 119 0 R -/Prev 315 0 R -/Next 323 0 R ->> endobj -315 0 obj << -/Title 316 0 R -/A 313 0 R -/Parent 119 0 R -/Prev 311 0 R -/Next 319 0 R ->> endobj -311 0 obj << -/Title 312 0 R -/A 309 0 R -/Parent 119 0 R -/Prev 307 0 R -/Next 315 0 R ->> endobj -307 0 obj << -/Title 308 0 R -/A 305 0 R -/Parent 119 0 R -/Prev 303 0 R -/Next 311 0 R ->> endobj -303 0 obj << -/Title 304 0 R -/A 301 0 R -/Parent 119 0 R -/Prev 299 0 R -/Next 307 0 R ->> endobj -299 0 obj << -/Title 300 0 R -/A 297 0 R -/Parent 119 0 R -/Prev 295 0 R -/Next 303 0 R ->> endobj -295 0 obj << -/Title 296 0 R -/A 293 0 R -/Parent 119 0 R -/Prev 291 0 R -/Next 299 0 R ->> endobj -291 0 obj << -/Title 292 0 R -/A 289 0 R -/Parent 119 0 R -/Prev 287 0 R -/Next 295 0 R ->> endobj -287 0 obj << -/Title 288 0 R -/A 285 0 R -/Parent 119 0 R -/Prev 283 0 R -/Next 291 0 R ->> endobj -283 0 obj << -/Title 284 0 R -/A 281 0 R -/Parent 119 0 R -/Prev 279 0 R -/Next 287 0 R ->> endobj -279 0 obj << -/Title 280 0 R -/A 277 0 R -/Parent 119 0 R -/Prev 275 0 R -/Next 283 0 R ->> endobj -275 0 obj << -/Title 276 0 R -/A 273 0 R -/Parent 119 0 R -/Prev 271 0 R -/Next 279 0 R ->> endobj -271 0 obj << -/Title 272 0 R -/A 269 0 R -/Parent 119 0 R -/Prev 267 0 R -/Next 275 0 R ->> endobj -267 0 obj << -/Title 268 0 R -/A 265 0 R -/Parent 119 0 R -/Prev 263 0 R -/Next 271 0 R ->> endobj -263 0 obj << -/Title 264 0 R -/A 261 0 R -/Parent 119 0 R -/Prev 259 0 R -/Next 267 0 R ->> endobj -259 0 obj << -/Title 260 0 R -/A 257 0 R -/Parent 119 0 R -/Prev 255 0 R -/Next 263 0 R ->> endobj -255 0 obj << -/Title 256 0 R -/A 253 0 R -/Parent 119 0 R -/Prev 251 0 R -/Next 259 0 R ->> endobj -251 0 obj << -/Title 252 0 R -/A 249 0 R -/Parent 119 0 R -/Prev 247 0 R -/Next 255 0 R ->> endobj -247 0 obj << -/Title 248 0 R -/A 245 0 R -/Parent 119 0 R -/Prev 243 0 R -/Next 251 0 R ->> endobj -243 0 obj << -/Title 244 0 R -/A 241 0 R -/Parent 119 0 R -/Prev 239 0 R -/Next 247 0 R ->> endobj -239 0 obj << -/Title 240 0 R -/A 237 0 R -/Parent 119 0 R -/Prev 235 0 R -/Next 243 0 R ->> endobj -235 0 obj << -/Title 236 0 R -/A 233 0 R -/Parent 119 0 R -/Prev 231 0 R -/Next 239 0 R ->> endobj -231 0 obj << -/Title 232 0 R -/A 229 0 R -/Parent 119 0 R -/Prev 227 0 R -/Next 235 0 R ->> endobj -227 0 obj << -/Title 228 0 R -/A 225 0 R -/Parent 119 0 R -/Prev 223 0 R -/Next 231 0 R ->> endobj -223 0 obj << -/Title 224 0 R -/A 221 0 R -/Parent 119 0 R -/Prev 219 0 R -/Next 227 0 R ->> endobj -219 0 obj << -/Title 220 0 R -/A 217 0 R -/Parent 119 0 R -/Prev 215 0 R -/Next 223 0 R ->> endobj -215 0 obj << -/Title 216 0 R -/A 213 0 R -/Parent 119 0 R -/Prev 211 0 R -/Next 219 0 R ->> endobj -211 0 obj << -/Title 212 0 R -/A 209 0 R -/Parent 119 0 R -/Prev 207 0 R -/Next 215 0 R ->> endobj -207 0 obj << -/Title 208 0 R -/A 205 0 R -/Parent 119 0 R -/Prev 203 0 R -/Next 211 0 R ->> endobj -203 0 obj << -/Title 204 0 R -/A 201 0 R -/Parent 119 0 R -/Prev 199 0 R -/Next 207 0 R ->> endobj -199 0 obj << -/Title 200 0 R -/A 197 0 R -/Parent 119 0 R -/Prev 195 0 R -/Next 203 0 R ->> endobj -195 0 obj << -/Title 196 0 R -/A 193 0 R -/Parent 119 0 R -/Prev 191 0 R -/Next 199 0 R ->> endobj -191 0 obj << -/Title 192 0 R -/A 189 0 R -/Parent 119 0 R -/Prev 187 0 R -/Next 195 0 R ->> endobj -187 0 obj << -/Title 188 0 R -/A 185 0 R -/Parent 119 0 R -/Prev 183 0 R -/Next 191 0 R ->> endobj -183 0 obj << -/Title 184 0 R -/A 181 0 R -/Parent 119 0 R -/Prev 179 0 R -/Next 187 0 R ->> endobj -179 0 obj << -/Title 180 0 R -/A 177 0 R -/Parent 119 0 R -/Prev 175 0 R -/Next 183 0 R ->> endobj -175 0 obj << -/Title 176 0 R -/A 173 0 R -/Parent 119 0 R -/Prev 171 0 R -/Next 179 0 R ->> endobj -171 0 obj << -/Title 172 0 R -/A 169 0 R -/Parent 119 0 R -/Prev 167 0 R -/Next 175 0 R ->> endobj -167 0 obj << -/Title 168 0 R -/A 165 0 R -/Parent 119 0 R -/Prev 163 0 R -/Next 171 0 R ->> endobj -163 0 obj << -/Title 164 0 R -/A 161 0 R -/Parent 119 0 R -/Prev 159 0 R -/Next 167 0 R ->> endobj -159 0 obj << -/Title 160 0 R -/A 157 0 R -/Parent 119 0 R -/Prev 155 0 R -/Next 163 0 R ->> endobj -155 0 obj << -/Title 156 0 R -/A 153 0 R -/Parent 119 0 R -/Prev 151 0 R -/Next 159 0 R ->> endobj -151 0 obj << -/Title 152 0 R -/A 149 0 R -/Parent 119 0 R -/Prev 147 0 R -/Next 155 0 R ->> endobj -147 0 obj << -/Title 148 0 R -/A 145 0 R -/Parent 119 0 R -/Prev 143 0 R -/Next 151 0 R ->> endobj -143 0 obj << -/Title 144 0 R -/A 141 0 R -/Parent 119 0 R -/Prev 139 0 R -/Next 147 0 R ->> endobj -139 0 obj << -/Title 140 0 R -/A 137 0 R -/Parent 119 0 R -/Prev 135 0 R -/Next 143 0 R ->> endobj -135 0 obj << -/Title 136 0 R -/A 133 0 R -/Parent 119 0 R -/Prev 131 0 R -/Next 139 0 R ->> endobj -131 0 obj << -/Title 132 0 R -/A 129 0 R -/Parent 119 0 R -/Prev 127 0 R -/Next 135 0 R ->> endobj -127 0 obj << -/Title 128 0 R -/A 125 0 R -/Parent 119 0 R -/Prev 123 0 R -/Next 131 0 R ->> endobj -123 0 obj << -/Title 124 0 R -/A 121 0 R -/Parent 119 0 R -/Next 127 0 R ->> endobj -119 0 obj << -/Title 120 0 R -/A 117 0 R -/Parent 87 0 R -/Prev 103 0 R -/First 123 0 R -/Last 367 0 R -/Count -62 ->> endobj -115 0 obj << -/Title 116 0 R -/A 113 0 R -/Parent 103 0 R -/Prev 111 0 R ->> endobj -111 0 obj << -/Title 112 0 R -/A 109 0 R -/Parent 103 0 R -/Prev 107 0 R -/Next 115 0 R ->> endobj -107 0 obj << -/Title 108 0 R -/A 105 0 R -/Parent 103 0 R -/Next 111 0 R ->> endobj -103 0 obj << -/Title 104 0 R -/A 101 0 R -/Parent 87 0 R -/Prev 99 0 R -/Next 119 0 R -/First 107 0 R -/Last 115 0 R -/Count -3 ->> endobj -99 0 obj << -/Title 100 0 R -/A 97 0 R -/Parent 87 0 R -/Prev 95 0 R -/Next 103 0 R ->> endobj -95 0 obj << -/Title 96 0 R -/A 93 0 R -/Parent 87 0 R -/Prev 91 0 R -/Next 99 0 R ->> endobj -91 0 obj << -/Title 92 0 R -/A 89 0 R -/Parent 87 0 R -/Next 95 0 R ->> endobj -87 0 obj << -/Title 88 0 R -/A 85 0 R -/Parent 67 0 R -/Prev 71 0 R -/Next 371 0 R -/First 91 0 R -/Last 119 0 R -/Count -5 ->> endobj -83 0 obj << -/Title 84 0 R -/A 81 0 R -/Parent 71 0 R -/Prev 79 0 R ->> endobj -79 0 obj << -/Title 80 0 R -/A 77 0 R -/Parent 71 0 R -/Prev 75 0 R -/Next 83 0 R ->> endobj -75 0 obj << -/Title 76 0 R -/A 73 0 R -/Parent 71 0 R -/Next 79 0 R ->> endobj -71 0 obj << -/Title 72 0 R -/A 69 0 R -/Parent 67 0 R -/Next 87 0 R -/First 75 0 R -/Last 83 0 R -/Count -3 ->> endobj -67 0 obj << -/Title 68 0 R -/A 65 0 R -/Parent 1964 0 R -/Prev 11 0 R -/Next 391 0 R -/First 71 0 R -/Last 387 0 R -/Count -4 ->> endobj -63 0 obj << -/Title 64 0 R -/A 61 0 R -/Parent 59 0 R ->> endobj -59 0 obj << -/Title 60 0 R -/A 57 0 R -/Parent 11 0 R -/Prev 39 0 R -/First 63 0 R -/Last 63 0 R -/Count -1 ->> endobj -55 0 obj << -/Title 56 0 R -/A 53 0 R -/Parent 47 0 R -/Prev 51 0 R ->> endobj -51 0 obj << -/Title 52 0 R -/A 49 0 R -/Parent 47 0 R -/Next 55 0 R ->> endobj -47 0 obj << -/Title 48 0 R -/A 45 0 R -/Parent 43 0 R -/First 51 0 R -/Last 55 0 R -/Count -2 ->> endobj -43 0 obj << -/Title 44 0 R -/A 41 0 R -/Parent 39 0 R -/First 47 0 R -/Last 47 0 R -/Count -1 ->> endobj -39 0 obj << -/Title 40 0 R -/A 37 0 R -/Parent 11 0 R -/Prev 27 0 R -/Next 59 0 R -/First 43 0 R -/Last 43 0 R -/Count -1 ->> endobj -35 0 obj << -/Title 36 0 R -/A 33 0 R -/Parent 31 0 R ->> endobj -31 0 obj << -/Title 32 0 R -/A 29 0 R -/Parent 27 0 R -/First 35 0 R -/Last 35 0 R -/Count -1 ->> endobj -27 0 obj << -/Title 28 0 R -/A 25 0 R -/Parent 11 0 R -/Prev 15 0 R -/Next 39 0 R -/First 31 0 R -/Last 31 0 R -/Count -1 ->> endobj -23 0 obj << -/Title 24 0 R -/A 21 0 R -/Parent 19 0 R ->> endobj -19 0 obj << -/Title 20 0 R -/A 17 0 R -/Parent 15 0 R -/First 23 0 R -/Last 23 0 R -/Count -1 ->> endobj -15 0 obj << -/Title 16 0 R -/A 13 0 R -/Parent 11 0 R -/Next 27 0 R -/First 19 0 R -/Last 19 0 R -/Count -1 ->> endobj -11 0 obj << -/Title 12 0 R -/A 9 0 R -/Parent 1964 0 R -/Prev 7 0 R -/Next 67 0 R -/First 15 0 R -/Last 59 0 R -/Count -4 ->> endobj -7 0 obj << -/Title 8 0 R -/A 5 0 R -/Parent 1964 0 R -/Next 11 0 R ->> endobj -1965 0 obj << -/Names [(Doc-Start) 600 0 R (Item.1) 1440 0 R (Item.10) 1449 0 R (Item.11) 1450 0 R (Item.12) 1451 0 R (Item.13) 1452 0 R] -/Limits [(Doc-Start) (Item.13)] ->> endobj -1966 0 obj << -/Names [(Item.14) 1457 0 R (Item.15) 1458 0 R (Item.16) 1459 0 R (Item.17) 1541 0 R (Item.18) 1542 0 R (Item.19) 1543 0 R] -/Limits [(Item.14) (Item.19)] ->> endobj -1967 0 obj << -/Names [(Item.2) 1441 0 R (Item.20) 1544 0 R (Item.21) 1545 0 R (Item.22) 1553 0 R (Item.23) 1555 0 R (Item.24) 1556 0 R] -/Limits [(Item.2) (Item.24)] ->> endobj -1968 0 obj << -/Names [(Item.25) 1557 0 R (Item.26) 1558 0 R (Item.27) 1559 0 R (Item.28) 1560 0 R (Item.29) 1561 0 R (Item.3) 1442 0 R] -/Limits [(Item.25) (Item.3)] ->> endobj -1969 0 obj << -/Names [(Item.30) 1562 0 R (Item.31) 1569 0 R (Item.32) 1681 0 R (Item.33) 1682 0 R (Item.34) 1696 0 R (Item.35) 1697 0 R] -/Limits [(Item.30) (Item.35)] ->> endobj -1970 0 obj << -/Names [(Item.36) 1698 0 R (Item.37) 1795 0 R (Item.38) 1796 0 R (Item.39) 1797 0 R (Item.4) 1443 0 R (Item.40) 1798 0 R] -/Limits [(Item.36) (Item.40)] ->> endobj -1971 0 obj << -/Names [(Item.41) 1799 0 R (Item.42) 1805 0 R (Item.43) 1806 0 R (Item.44) 1807 0 R (Item.45) 1808 0 R (Item.46) 1809 0 R] -/Limits [(Item.41) (Item.46)] ->> endobj -1972 0 obj << -/Names [(Item.5) 1444 0 R (Item.6) 1445 0 R (Item.7) 1446 0 R (Item.8) 1447 0 R (Item.9) 1448 0 R (appendix.A) 566 0 R] -/Limits [(Item.5) (appendix.A)] ->> endobj -1973 0 obj << -/Names [(appendix.B) 570 0 R (appendix.C) 578 0 R (appendix.D) 590 0 R (chapter*.1) 1276 0 R (chapter*.2) 1428 0 R (chapter.1) 6 0 R] -/Limits [(appendix.B) (chapter.1)] ->> endobj -1974 0 obj << -/Names [(chapter.2) 10 0 R (chapter.3) 66 0 R (chapter.4) 390 0 R (chapter.5) 442 0 R (chapter.6) 510 0 R (figure.2.1) 1481 0 R] -/Limits [(chapter.2) (figure.2.1)] ->> endobj -1975 0 obj << -/Names [(figure.3.1) 1645 0 R (figure.C.1) 1785 0 R (page.1) 1463 0 R (page.10) 1536 0 R (page.11) 1540 0 R (page.12) 1552 0 R] -/Limits [(figure.3.1) (page.12)] ->> endobj -1976 0 obj << -/Names [(page.13) 1568 0 R (page.14) 1575 0 R (page.15) 1579 0 R (page.16) 1583 0 R (page.17) 1587 0 R (page.18) 1591 0 R] -/Limits [(page.13) (page.18)] ->> endobj -1977 0 obj << -/Names [(page.19) 1595 0 R (page.2) 1468 0 R (page.20) 1600 0 R (page.21) 1604 0 R (page.22) 1610 0 R (page.23) 1614 0 R] -/Limits [(page.19) (page.23)] ->> endobj -1978 0 obj << -/Names [(page.24) 1618 0 R (page.25) 1623 0 R (page.26) 1629 0 R (page.27) 1633 0 R (page.28) 1637 0 R (page.29) 1644 0 R] -/Limits [(page.24) (page.29)] ->> endobj -1979 0 obj << -/Names [(page.3) 1472 0 R (page.30) 1652 0 R (page.31) 1656 0 R (page.32) 1663 0 R (page.33) 1667 0 R (page.34) 1671 0 R] -/Limits [(page.3) (page.34)] ->> endobj -1980 0 obj << -/Names [(page.35) 1676 0 R (page.36) 1680 0 R (page.37) 1686 0 R (page.38) 1691 0 R (page.39) 1695 0 R (page.4) 1480 0 R] -/Limits [(page.35) (page.4)] ->> endobj -1981 0 obj << -/Names [(page.40) 1702 0 R (page.41) 1706 0 R (page.42) 1710 0 R (page.43) 1716 0 R (page.44) 1722 0 R (page.45) 1727 0 R] -/Limits [(page.40) (page.45)] ->> endobj -1982 0 obj << -/Names [(page.46) 1732 0 R (page.47) 1736 0 R (page.48) 1740 0 R (page.49) 1745 0 R (page.5) 1485 0 R (page.50) 1750 0 R] -/Limits [(page.46) (page.50)] ->> endobj -1983 0 obj << -/Names [(page.51) 1754 0 R (page.52) 1761 0 R (page.53) 1766 0 R (page.54) 1770 0 R (page.55) 1774 0 R (page.56) 1779 0 R] -/Limits [(page.51) (page.56)] ->> endobj -1984 0 obj << -/Names [(page.57) 1784 0 R (page.58) 1794 0 R (page.59) 1804 0 R (page.6) 1516 0 R (page.60) 1813 0 R (page.61) 1817 0 R] -/Limits [(page.57) (page.61)] ->> endobj -1985 0 obj << -/Names [(page.62) 1898 0 R (page.63) 1923 0 R (page.7) 1520 0 R (page.8) 1525 0 R (page.9) 1532 0 R (page.i) 599 0 R] -/Limits [(page.62) (page.i)] ->> endobj -1986 0 obj << -/Names [(page.ii) 611 0 R (page.iii) 1274 0 R (page.iv) 1314 0 R (page.ix) 1427 0 R (page.v) 1360 0 R (page.vi) 1398 0 R] -/Limits [(page.ii) (page.vi)] ->> endobj -1987 0 obj << -/Names [(page.vii) 1415 0 R (page.viii) 1420 0 R (page.x) 1433 0 R (page.xi) 1439 0 R (page.xii) 1456 0 R (section*.10) 54 0 R] -/Limits [(page.vii) (section*.10)] ->> endobj -1988 0 obj << -/Names [(section*.11) 62 0 R (section*.12) 106 0 R (section*.13) 110 0 R (section*.14) 114 0 R (section*.15) 122 0 R (section*.16) 126 0 R] -/Limits [(section*.11) (section*.16)] ->> endobj -1989 0 obj << -/Names [(section*.17) 130 0 R (section*.18) 134 0 R (section*.19) 138 0 R (section*.20) 142 0 R (section*.21) 146 0 R (section*.22) 150 0 R] -/Limits [(section*.17) (section*.22)] ->> endobj -1990 0 obj << -/Names [(section*.23) 154 0 R (section*.24) 158 0 R (section*.25) 162 0 R (section*.26) 166 0 R (section*.27) 170 0 R (section*.28) 174 0 R] -/Limits [(section*.23) (section*.28)] ->> endobj -1991 0 obj << -/Names [(section*.29) 178 0 R (section*.3) 18 0 R (section*.30) 182 0 R (section*.31) 186 0 R (section*.32) 190 0 R (section*.33) 194 0 R] -/Limits [(section*.29) (section*.33)] ->> endobj -1992 0 obj << -/Names [(section*.34) 198 0 R (section*.35) 202 0 R (section*.36) 206 0 R (section*.37) 210 0 R (section*.38) 214 0 R (section*.39) 218 0 R] -/Limits [(section*.34) (section*.39)] ->> endobj -1993 0 obj << -/Names [(section*.4) 22 0 R (section*.40) 222 0 R (section*.41) 226 0 R (section*.42) 230 0 R (section*.43) 234 0 R (section*.44) 238 0 R] -/Limits [(section*.4) (section*.44)] ->> endobj -1994 0 obj << -/Names [(section*.45) 242 0 R (section*.46) 246 0 R (section*.47) 250 0 R (section*.48) 254 0 R (section*.49) 258 0 R (section*.5) 30 0 R] -/Limits [(section*.45) (section*.5)] ->> endobj -1995 0 obj << -/Names [(section*.50) 262 0 R (section*.51) 266 0 R (section*.52) 270 0 R (section*.53) 274 0 R (section*.54) 278 0 R (section*.55) 282 0 R] -/Limits [(section*.50) (section*.55)] ->> endobj -1996 0 obj << -/Names [(section*.56) 286 0 R (section*.57) 290 0 R (section*.58) 294 0 R (section*.59) 298 0 R (section*.6) 34 0 R (section*.60) 302 0 R] -/Limits [(section*.56) (section*.60)] ->> endobj -1997 0 obj << -/Names [(section*.61) 306 0 R (section*.62) 310 0 R (section*.63) 314 0 R (section*.64) 318 0 R (section*.65) 322 0 R (section*.66) 326 0 R] -/Limits [(section*.61) (section*.66)] ->> endobj -1998 0 obj << -/Names [(section*.67) 330 0 R (section*.68) 334 0 R (section*.69) 338 0 R (section*.7) 42 0 R (section*.70) 342 0 R (section*.71) 346 0 R] -/Limits [(section*.67) (section*.71)] ->> endobj -1999 0 obj << -/Names [(section*.72) 350 0 R (section*.73) 354 0 R (section*.74) 358 0 R (section*.75) 362 0 R (section*.76) 366 0 R (section*.77) 546 0 R] -/Limits [(section*.72) (section*.77)] ->> endobj -2000 0 obj << -/Names [(section*.78) 550 0 R (section*.79) 554 0 R (section*.8) 46 0 R (section*.9) 50 0 R (section.2.1) 14 0 R (section.2.2) 26 0 R] -/Limits [(section*.78) (section.2.2)] ->> endobj -2001 0 obj << -/Names [(section.2.3) 38 0 R (section.2.4) 58 0 R (section.3.1) 70 0 R (section.3.2) 86 0 R (section.3.3) 370 0 R (section.3.4) 386 0 R] -/Limits [(section.2.3) (section.3.4)] ->> endobj -2002 0 obj << -/Names [(section.4.1) 394 0 R (section.4.2) 410 0 R (section.4.3) 426 0 R (section.4.4) 438 0 R (section.5.1) 446 0 R (section.5.2) 462 0 R] -/Limits [(section.4.1) (section.5.2)] ->> endobj -2003 0 obj << -/Names [(section.5.3) 478 0 R (section.5.4) 506 0 R (section.6.1) 514 0 R (section.6.2) 530 0 R (section.6.3) 534 0 R (section.6.4) 558 0 R] -/Limits [(section.5.3) (section.6.4)] ->> endobj -2004 0 obj << -/Names [(section.6.5) 562 0 R (section.B.1) 574 0 R (section.C.1) 582 0 R (section.C.2) 586 0 R (subsection.3.1.1) 74 0 R (subsection.3.1.2) 78 0 R] -/Limits [(section.6.5) (subsection.3.1.2)] ->> endobj -2005 0 obj << -/Names [(subsection.3.1.3) 82 0 R (subsection.3.2.1) 90 0 R (subsection.3.2.2) 94 0 R (subsection.3.2.3) 98 0 R (subsection.3.2.4) 102 0 R (subsection.3.2.5) 118 0 R] -/Limits [(subsection.3.1.3) (subsection.3.2.5)] ->> endobj -2006 0 obj << -/Names [(subsection.3.3.1) 374 0 R (subsection.3.3.2) 378 0 R (subsection.3.3.3) 382 0 R (subsection.4.1.1) 398 0 R (subsection.4.1.2) 402 0 R (subsection.4.1.3) 406 0 R] -/Limits [(subsection.3.3.1) (subsection.4.1.3)] ->> endobj -2007 0 obj << -/Names [(subsection.4.2.1) 414 0 R (subsection.4.2.2) 418 0 R (subsection.4.2.3) 422 0 R (subsection.4.3.1) 430 0 R (subsection.4.3.2) 434 0 R (subsection.5.1.1) 450 0 R] -/Limits [(subsection.4.2.1) (subsection.5.1.1)] ->> endobj -2008 0 obj << -/Names [(subsection.5.1.2) 454 0 R (subsection.5.1.3) 458 0 R (subsection.5.2.1) 466 0 R (subsection.5.2.2) 470 0 R (subsection.5.2.3) 474 0 R (subsection.5.3.1) 482 0 R] -/Limits [(subsection.5.1.2) (subsection.5.3.1)] ->> endobj -2009 0 obj << -/Names [(subsection.5.3.2) 486 0 R (subsection.5.3.3) 490 0 R (subsection.5.3.4) 494 0 R (subsection.5.3.5) 498 0 R (subsection.5.3.6) 502 0 R (subsection.6.1.1) 518 0 R] -/Limits [(subsection.5.3.2) (subsection.6.1.1)] ->> endobj -2010 0 obj << -/Names [(subsection.6.1.2) 522 0 R (subsection.6.1.3) 526 0 R (subsection.6.3.1) 538 0 R (subsection.6.3.2) 542 0 R] -/Limits [(subsection.6.1.2) (subsection.6.3.2)] ->> endobj -2011 0 obj << -/Kids [1965 0 R 1966 0 R 1967 0 R 1968 0 R 1969 0 R 1970 0 R] -/Limits [(Doc-Start) (Item.40)] ->> endobj -2012 0 obj << -/Kids [1971 0 R 1972 0 R 1973 0 R 1974 0 R 1975 0 R 1976 0 R] -/Limits [(Item.41) (page.18)] ->> endobj -2013 0 obj << -/Kids [1977 0 R 1978 0 R 1979 0 R 1980 0 R 1981 0 R 1982 0 R] -/Limits [(page.19) (page.50)] ->> endobj -2014 0 obj << -/Kids [1983 0 R 1984 0 R 1985 0 R 1986 0 R 1987 0 R 1988 0 R] -/Limits [(page.51) (section*.16)] ->> endobj -2015 0 obj << -/Kids [1989 0 R 1990 0 R 1991 0 R 1992 0 R 1993 0 R 1994 0 R] -/Limits [(section*.17) (section*.5)] ->> endobj -2016 0 obj << -/Kids [1995 0 R 1996 0 R 1997 0 R 1998 0 R 1999 0 R 2000 0 R] -/Limits [(section*.50) (section.2.2)] ->> endobj -2017 0 obj << -/Kids [2001 0 R 2002 0 R 2003 0 R 2004 0 R 2005 0 R 2006 0 R] -/Limits [(section.2.3) (subsection.4.1.3)] ->> endobj -2018 0 obj << -/Kids [2007 0 R 2008 0 R 2009 0 R 2010 0 R] -/Limits [(subsection.4.2.1) (subsection.6.3.2)] ->> endobj -2019 0 obj << -/Kids [2011 0 R 2012 0 R 2013 0 R 2014 0 R 2015 0 R 2016 0 R] -/Limits [(Doc-Start) (section.2.2)] ->> endobj -2020 0 obj << -/Kids [2017 0 R 2018 0 R] -/Limits [(section.2.3) (subsection.6.3.2)] ->> endobj -2021 0 obj << -/Kids [2019 0 R 2020 0 R] -/Limits [(Doc-Start) (subsection.6.3.2)] ->> endobj -2022 0 obj << -/Dests 2021 0 R ->> endobj -2023 0 obj << -/Type /Catalog -/Pages 1963 0 R -/Outlines 1964 0 R -/Names 2022 0 R -/PageMode/UseOutlines/PageLabels<>12<>]>> -/OpenAction 593 0 R ->> endobj -2024 0 obj << -/Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.9)/Keywords() -/CreationDate (D:20100511160748+02'00') -/ModDate (D:20100511160748+02'00') -/Trapped /False -/PTEX.Fullbanner (This is pdfTeX using libpoppler, Version 3.1415926-1.40.9-2.2 (Web2C 7.5.7) kpathsea version 3.5.7) ->> endobj -xref -0 2025 -0000000001 65535 f -0000000002 00000 f -0000000003 00000 f -0000000004 00000 f -0000000000 00000 f -0000000015 00000 n -0000353832 00000 n -0001075829 00000 n -0000000060 00000 n -0000000089 00000 n -0000358331 00000 n -0001075705 00000 n -0000000134 00000 n -0000000167 00000 n -0000358392 00000 n -0001075594 00000 n -0000000215 00000 n -0000000251 00000 n -0000358453 00000 n -0001075496 00000 n -0000000298 00000 n -0000000363 00000 n -0000358514 00000 n -0001075435 00000 n -0000000410 00000 n -0000000474 00000 n -0000361406 00000 n -0001075311 00000 n -0000000522 00000 n -0000000569 00000 n -0000361468 00000 n -0001075213 00000 n -0000000616 00000 n -0000000650 00000 n -0000361529 00000 n -0001075152 00000 n -0000000697 00000 n -0000000735 00000 n -0000364778 00000 n -0001075028 00000 n -0000000783 00000 n -0000000815 00000 n -0000364839 00000 n -0001074930 00000 n -0000000862 00000 n -0000000894 00000 n -0000364900 00000 n -0001074832 00000 n -0000000941 00000 n -0000000972 00000 n -0000364961 00000 n -0001074758 00000 n -0000001019 00000 n -0000001047 00000 n -0000368321 00000 n -0001074684 00000 n -0000001095 00000 n -0000001123 00000 n -0000368383 00000 n -0001074573 00000 n -0000001171 00000 n -0000001202 00000 n -0000368445 00000 n -0001074512 00000 n -0000001250 00000 n -0000001289 00000 n -0000472116 00000 n -0001074384 00000 n -0000001335 00000 n -0000001371 00000 n -0000472177 00000 n -0001074273 00000 n -0000001419 00000 n -0000001450 00000 n -0000472238 00000 n -0001074199 00000 n -0000001503 00000 n -0000001535 00000 n -0000472299 00000 n -0001074112 00000 n -0000001588 00000 n -0000001644 00000 n -0000474682 00000 n -0001074038 00000 n -0000001697 00000 n -0000001739 00000 n -0000474744 00000 n -0001073912 00000 n -0000001787 00000 n -0000001819 00000 n -0000478337 00000 n -0001073838 00000 n -0000001872 00000 n -0000001909 00000 n -0000478398 00000 n -0001073751 00000 n -0000001962 00000 n -0000002004 00000 n -0000478459 00000 n -0001073662 00000 n -0000002057 00000 n -0000002091 00000 n -0000480864 00000 n -0001073532 00000 n -0000002145 00000 n -0000002188 00000 n -0000480927 00000 n -0001073453 00000 n -0000002237 00000 n -0000002291 00000 n -0000483286 00000 n -0001073360 00000 n -0000002340 00000 n -0000002410 00000 n -0000483348 00000 n -0001073281 00000 n -0000002459 00000 n -0000002491 00000 n -0000489212 00000 n -0001073163 00000 n -0000002545 00000 n -0000002594 00000 n -0000489274 00000 n -0001073084 00000 n -0000002643 00000 n -0000002689 00000 n -0000489336 00000 n -0001072991 00000 n -0000002738 00000 n -0000002784 00000 n -0000490914 00000 n -0001072898 00000 n -0000002833 00000 n -0000002867 00000 n -0000490977 00000 n -0001072805 00000 n -0000002916 00000 n -0000002959 00000 n -0000491040 00000 n -0001072712 00000 n -0000003008 00000 n -0000003057 00000 n -0000491103 00000 n -0001072619 00000 n -0000003106 00000 n -0000003153 00000 n -0000492800 00000 n -0001072526 00000 n -0000003202 00000 n -0000003249 00000 n -0000492862 00000 n -0001072433 00000 n -0000003298 00000 n -0000003362 00000 n -0000492924 00000 n -0001072340 00000 n -0000003411 00000 n -0000003444 00000 n -0000495223 00000 n -0001072247 00000 n -0000003493 00000 n -0000003543 00000 n -0000495286 00000 n -0001072154 00000 n -0000003592 00000 n -0000003642 00000 n -0000495349 00000 n -0001072061 00000 n -0000003691 00000 n -0000003755 00000 n -0000495412 00000 n -0001071968 00000 n -0000003804 00000 n -0000003868 00000 n -0000497058 00000 n -0001071875 00000 n -0000003917 00000 n -0000003983 00000 n -0000497119 00000 n -0001071782 00000 n -0000004032 00000 n -0000004093 00000 n -0000497181 00000 n -0001071689 00000 n -0000004142 00000 n -0000004227 00000 n -0000497243 00000 n -0001071596 00000 n -0000004276 00000 n -0000004337 00000 n -0000498802 00000 n -0001071503 00000 n -0000004386 00000 n -0000004456 00000 n -0000498865 00000 n -0001071410 00000 n -0000004505 00000 n -0000004589 00000 n -0000498927 00000 n -0001071317 00000 n -0000004638 00000 n -0000004711 00000 n -0000498990 00000 n -0001071224 00000 n -0000004760 00000 n -0000004830 00000 n -0000499053 00000 n -0001071131 00000 n -0000004879 00000 n -0000004959 00000 n -0000501197 00000 n -0001071038 00000 n -0000005008 00000 n -0000005081 00000 n -0000501259 00000 n -0001070945 00000 n -0000005130 00000 n -0000005161 00000 n -0000503344 00000 n -0001070852 00000 n -0000005210 00000 n -0000005267 00000 n -0000503407 00000 n -0001070759 00000 n -0000005316 00000 n -0000005369 00000 n -0000503470 00000 n -0001070666 00000 n -0000005418 00000 n -0000005458 00000 n -0000503533 00000 n -0001070573 00000 n -0000005507 00000 n -0000005557 00000 n -0000504977 00000 n -0001070480 00000 n -0000005606 00000 n -0000005643 00000 n -0000505039 00000 n -0001070387 00000 n -0000005692 00000 n -0000005731 00000 n -0000505101 00000 n -0001070294 00000 n -0000005780 00000 n -0000005820 00000 n -0000507515 00000 n -0001070201 00000 n -0000005869 00000 n -0000005914 00000 n -0000507578 00000 n -0001070108 00000 n -0000005963 00000 n -0000006002 00000 n -0000507641 00000 n -0001070015 00000 n -0000006051 00000 n -0000006090 00000 n -0000509603 00000 n -0001069922 00000 n -0000006139 00000 n -0000006176 00000 n -0000509665 00000 n -0001069829 00000 n -0000006225 00000 n -0000006279 00000 n -0000509727 00000 n -0001069736 00000 n -0000006328 00000 n -0000006365 00000 n -0000509789 00000 n -0001069643 00000 n -0000006414 00000 n -0000006446 00000 n -0000509851 00000 n -0001069550 00000 n -0000006495 00000 n -0000006538 00000 n -0000511864 00000 n -0001069457 00000 n -0000006587 00000 n -0000006618 00000 n -0000511927 00000 n -0001069364 00000 n -0000006667 00000 n -0000006712 00000 n -0000511990 00000 n -0001069271 00000 n -0000006761 00000 n -0000006791 00000 n -0000512052 00000 n -0001069178 00000 n -0000006840 00000 n -0000006885 00000 n -0000512115 00000 n -0001069085 00000 n -0000006934 00000 n -0000006979 00000 n -0000514322 00000 n -0001068992 00000 n -0000007028 00000 n -0000007071 00000 n -0000514384 00000 n -0001068899 00000 n -0000007120 00000 n -0000007166 00000 n -0000514446 00000 n -0001068806 00000 n -0000007215 00000 n -0000007246 00000 n -0000514508 00000 n -0001068713 00000 n -0000007295 00000 n -0000007328 00000 n -0000514570 00000 n -0001068620 00000 n -0000007377 00000 n -0000007421 00000 n -0000516845 00000 n -0001068527 00000 n -0000007470 00000 n -0000007512 00000 n -0000516908 00000 n -0001068434 00000 n -0000007561 00000 n -0000007604 00000 n -0000516970 00000 n -0001068341 00000 n -0000007653 00000 n -0000007696 00000 n -0000517033 00000 n -0001068248 00000 n -0000007745 00000 n -0000007776 00000 n -0000517096 00000 n -0001068155 00000 n -0000007825 00000 n -0000007860 00000 n -0000518727 00000 n -0001068062 00000 n -0000007909 00000 n -0000007949 00000 n -0000518789 00000 n -0001067969 00000 n -0000007998 00000 n -0000008048 00000 n -0000518851 00000 n -0001067876 00000 n -0000008097 00000 n -0000008140 00000 n -0000518913 00000 n -0001067783 00000 n -0000008189 00000 n -0000008229 00000 n -0000518975 00000 n -0001067690 00000 n -0000008278 00000 n -0000008328 00000 n -0000520920 00000 n -0001067597 00000 n -0000008377 00000 n -0000008420 00000 n -0000520983 00000 n -0001067504 00000 n -0000008469 00000 n -0000008515 00000 n -0000521046 00000 n -0001067425 00000 n -0000008564 00000 n -0000008588 00000 n -0000521109 00000 n -0001067295 00000 n -0000008637 00000 n -0000008681 00000 n -0000521172 00000 n -0001067216 00000 n -0000008735 00000 n -0000008798 00000 n -0000601077 00000 n -0001067123 00000 n -0000008852 00000 n -0000008893 00000 n -0000603819 00000 n -0001067044 00000 n -0000008947 00000 n -0000008989 00000 n -0000603882 00000 n -0001066966 00000 n -0000009038 00000 n -0000009073 00000 n -0000605791 00000 n -0001066834 00000 n -0000009120 00000 n -0000009155 00000 n -0000605853 00000 n -0001066716 00000 n -0000009204 00000 n -0000009236 00000 n -0000605914 00000 n -0001066637 00000 n -0000009290 00000 n -0000009323 00000 n -0000605976 00000 n -0001066544 00000 n -0000009377 00000 n -0000009434 00000 n -0000608737 00000 n -0001066465 00000 n -0000009488 00000 n -0000009531 00000 n -0000608800 00000 n -0001066333 00000 n -0000009580 00000 n -0000009617 00000 n -0000608862 00000 n -0001066254 00000 n -0000009671 00000 n -0000009707 00000 n -0000611098 00000 n -0001066161 00000 n -0000009761 00000 n -0000009797 00000 n -0000611160 00000 n -0001066082 00000 n -0000009851 00000 n -0000009890 00000 n -0000611222 00000 n -0001065950 00000 n -0000009939 00000 n -0000009976 00000 n -0000611284 00000 n -0001065871 00000 n -0000010030 00000 n -0000010074 00000 n -0000614402 00000 n -0001065792 00000 n -0000010128 00000 n -0000010161 00000 n -0000614465 00000 n -0001065713 00000 n -0000010210 00000 n -0000010245 00000 n -0000621424 00000 n -0001065580 00000 n -0000010292 00000 n -0000010326 00000 n -0000621486 00000 n -0001065462 00000 n -0000010375 00000 n -0000010407 00000 n -0000621548 00000 n -0001065383 00000 n -0000010461 00000 n -0000010494 00000 n -0000621610 00000 n -0001065290 00000 n -0000010548 00000 n -0000010605 00000 n -0000623361 00000 n -0001065211 00000 n -0000010659 00000 n -0000010702 00000 n -0000623424 00000 n -0001065079 00000 n -0000010751 00000 n -0000010788 00000 n -0000626220 00000 n -0001065000 00000 n -0000010842 00000 n -0000010885 00000 n -0000626471 00000 n -0001064907 00000 n -0000010939 00000 n -0000010980 00000 n -0000629233 00000 n -0001064828 00000 n -0000011034 00000 n -0000011080 00000 n -0000629296 00000 n -0001064696 00000 n -0000011129 00000 n -0000011159 00000 n -0000631547 00000 n -0001064617 00000 n -0000011213 00000 n -0000011268 00000 n -0000631609 00000 n -0001064524 00000 n -0000011322 00000 n -0000011368 00000 n -0000634424 00000 n -0001064431 00000 n -0000011422 00000 n -0000011463 00000 n -0000639607 00000 n -0001064338 00000 n -0000011517 00000 n -0000011567 00000 n -0000639670 00000 n -0001064245 00000 n -0000011621 00000 n -0000011684 00000 n -0000642011 00000 n -0001064166 00000 n -0000011738 00000 n -0000011795 00000 n -0000643751 00000 n -0001064087 00000 n -0000011844 00000 n -0000011871 00000 n -0000645950 00000 n -0001063954 00000 n -0000011918 00000 n -0000011946 00000 n -0000646012 00000 n -0001063836 00000 n -0000011995 00000 n -0000012038 00000 n -0000646074 00000 n -0001063757 00000 n -0000012092 00000 n -0000012143 00000 n -0000649099 00000 n -0001063664 00000 n -0000012197 00000 n -0000012264 00000 n -0000649162 00000 n -0001063585 00000 n -0000012318 00000 n -0000012377 00000 n -0000649225 00000 n -0001063492 00000 n -0000012426 00000 n -0000012468 00000 n -0000652671 00000 n -0001063360 00000 n -0000012517 00000 n -0000012571 00000 n -0000652733 00000 n -0001063281 00000 n -0000012625 00000 n -0000012655 00000 n -0000652795 00000 n -0001063163 00000 n -0000012709 00000 n -0000012748 00000 n -0000655152 00000 n -0001063084 00000 n -0000012797 00000 n -0000012835 00000 n -0000655215 00000 n -0001062991 00000 n -0000012884 00000 n -0000012921 00000 n -0000657440 00000 n -0001062912 00000 n -0000012970 00000 n -0000013006 00000 n -0000657502 00000 n -0001062819 00000 n -0000013055 00000 n -0000013092 00000 n -0000661309 00000 n -0001062740 00000 n -0000013141 00000 n -0000013177 00000 n -0000662283 00000 n -0001062646 00000 n -0000013225 00000 n -0000013252 00000 n -0000665046 00000 n -0001062513 00000 n -0000013300 00000 n -0000013340 00000 n -0000665108 00000 n -0001062448 00000 n -0000013389 00000 n -0000013439 00000 n -0000816588 00000 n -0001062315 00000 n -0000013487 00000 n -0000013525 00000 n -0000816650 00000 n -0001062236 00000 n -0000013574 00000 n -0000013606 00000 n -0000819877 00000 n -0001062157 00000 n -0000013655 00000 n -0000013686 00000 n -0000825100 00000 n -0001062077 00000 n -0000013734 00000 n -0000013776 00000 n -0000014109 00000 n -0000014243 00000 n -0000046566 00000 n -0000046755 00000 n -0000013829 00000 n -0000046633 00000 n -0000046694 00000 n -0001058411 00000 n -0001058236 00000 n -0001059992 00000 n -0000046389 00000 n -0000047844 00000 n -0000315948 00000 n -0000316118 00000 n -0000316351 00000 n -0000047697 00000 n -0000046868 00000 n -0000316289 00000 n -0001059645 00000 n -0001058091 00000 n -0000169042 00000 n -0000169230 00000 n -0000171419 00000 n -0000171567 00000 n -0000171715 00000 n -0000171863 00000 n -0000172011 00000 n -0000172159 00000 n -0000172307 00000 n -0000172455 00000 n -0000172603 00000 n -0000172751 00000 n -0000172899 00000 n -0000173047 00000 n -0000173195 00000 n -0000173343 00000 n -0000173491 00000 n -0000173639 00000 n -0000173787 00000 n -0000173935 00000 n -0000174083 00000 n -0000174231 00000 n -0000174379 00000 n -0000174527 00000 n -0000174675 00000 n -0000174823 00000 n -0000174971 00000 n -0000175119 00000 n -0000175267 00000 n -0000175415 00000 n -0000175563 00000 n -0000175711 00000 n -0000175859 00000 n -0000176007 00000 n -0000176155 00000 n -0000176303 00000 n -0000176451 00000 n -0000176599 00000 n -0000176747 00000 n -0000176895 00000 n -0000177043 00000 n -0000177191 00000 n -0000177339 00000 n -0000177487 00000 n -0000177635 00000 n -0000177783 00000 n -0000177931 00000 n -0000178079 00000 n -0000178227 00000 n -0000178375 00000 n -0000178523 00000 n -0000178671 00000 n -0000178819 00000 n -0000178967 00000 n -0000179115 00000 n -0000179263 00000 n -0000179411 00000 n -0000179559 00000 n -0000179707 00000 n -0000179855 00000 n -0000180003 00000 n -0000180151 00000 n -0000180299 00000 n -0000180447 00000 n -0000180595 00000 n -0000180743 00000 n -0000180891 00000 n -0000181039 00000 n -0000181187 00000 n -0000181335 00000 n -0000181483 00000 n -0000181631 00000 n -0000181779 00000 n -0000181927 00000 n -0000182075 00000 n -0000182223 00000 n -0000182371 00000 n -0000182519 00000 n -0000182667 00000 n -0000182815 00000 n -0000182963 00000 n -0000183111 00000 n -0000183259 00000 n -0000183407 00000 n -0000183555 00000 n -0000183703 00000 n -0000183851 00000 n -0000183999 00000 n -0000184147 00000 n -0000184295 00000 n -0000184443 00000 n -0000184591 00000 n -0000184739 00000 n -0000184887 00000 n -0000185035 00000 n -0000185183 00000 n -0000185331 00000 n -0000185479 00000 n -0000185627 00000 n -0000185775 00000 n -0000185923 00000 n -0000186071 00000 n -0000186219 00000 n -0000186367 00000 n -0000186515 00000 n -0000186663 00000 n -0000186811 00000 n -0000186959 00000 n -0000187107 00000 n -0000187255 00000 n -0000187403 00000 n -0000187551 00000 n -0000187699 00000 n -0000187847 00000 n -0000187995 00000 n -0000188143 00000 n -0000188291 00000 n -0000188439 00000 n -0000188587 00000 n -0000188735 00000 n -0000188883 00000 n -0000189031 00000 n -0000189179 00000 n -0000189327 00000 n -0000189475 00000 n -0000189623 00000 n -0000189771 00000 n -0000189919 00000 n -0000190067 00000 n -0000190215 00000 n -0000190363 00000 n -0000190511 00000 n -0000190659 00000 n -0000190807 00000 n -0000190955 00000 n -0000191103 00000 n -0000191251 00000 n -0000191405 00000 n -0000191553 00000 n -0000191701 00000 n -0000191849 00000 n -0000191997 00000 n -0000192145 00000 n -0000192293 00000 n -0000192441 00000 n -0000192589 00000 n -0000192737 00000 n -0000192885 00000 n -0000193033 00000 n -0000193181 00000 n -0000193329 00000 n -0000193477 00000 n -0000193625 00000 n -0000193773 00000 n -0000193921 00000 n -0000194069 00000 n -0000194217 00000 n -0000194365 00000 n -0000194513 00000 n -0000194661 00000 n -0000194809 00000 n -0000194957 00000 n -0000195105 00000 n -0000195253 00000 n -0000195401 00000 n -0000195549 00000 n -0000195697 00000 n -0000195845 00000 n -0000195993 00000 n -0000196141 00000 n -0000196289 00000 n -0000196437 00000 n -0000196585 00000 n -0000196733 00000 n -0000196881 00000 n -0000197029 00000 n -0000197178 00000 n -0000197327 00000 n -0000197476 00000 n -0000197625 00000 n -0000197774 00000 n -0000197923 00000 n -0000198072 00000 n -0000198221 00000 n -0000198376 00000 n -0000198525 00000 n -0000198674 00000 n -0000198823 00000 n -0000198972 00000 n -0000199121 00000 n -0000199270 00000 n -0000199419 00000 n -0000199568 00000 n -0000199717 00000 n -0000199866 00000 n -0000200015 00000 n -0000200164 00000 n -0000200313 00000 n -0000200462 00000 n -0000200611 00000 n -0000200760 00000 n -0000200909 00000 n -0000201058 00000 n -0000201207 00000 n -0000201356 00000 n -0000201505 00000 n -0000201654 00000 n -0000201803 00000 n -0000201952 00000 n -0000202101 00000 n -0000202139 00000 n -0000219012 00000 n -0000219136 00000 n -0000219258 00000 n -0000219361 00000 n -0000219464 00000 n -0000219567 00000 n -0000219670 00000 n -0000219773 00000 n -0000219876 00000 n -0000219979 00000 n -0000220082 00000 n -0000220185 00000 n -0000220288 00000 n -0000220391 00000 n -0000220494 00000 n -0000220597 00000 n -0000220700 00000 n -0000220803 00000 n -0000220906 00000 n -0000221009 00000 n -0000221112 00000 n -0000221215 00000 n -0000221318 00000 n -0000221421 00000 n -0000221524 00000 n -0000221627 00000 n -0000221730 00000 n -0000221833 00000 n -0000221936 00000 n -0000222039 00000 n -0000222142 00000 n -0000222245 00000 n -0000222348 00000 n -0000222451 00000 n -0000222554 00000 n -0000222657 00000 n -0000222760 00000 n -0000222863 00000 n -0000222966 00000 n -0000223069 00000 n -0000223172 00000 n -0000223275 00000 n -0000223378 00000 n -0000223481 00000 n -0000223584 00000 n -0000223687 00000 n -0000223790 00000 n -0000223893 00000 n -0000223996 00000 n -0000224099 00000 n -0000224202 00000 n -0000224305 00000 n -0000224408 00000 n -0000224511 00000 n -0000224614 00000 n -0000224717 00000 n -0000224820 00000 n -0000224923 00000 n -0000225026 00000 n -0000225129 00000 n -0000225232 00000 n -0000225335 00000 n -0000225438 00000 n -0000225541 00000 n -0000225644 00000 n -0000225747 00000 n -0000225850 00000 n -0000225953 00000 n -0000226056 00000 n -0000226159 00000 n -0000226262 00000 n -0000226365 00000 n -0000226468 00000 n -0000226571 00000 n -0000226674 00000 n -0000226777 00000 n -0000226880 00000 n -0000226983 00000 n -0000227086 00000 n -0000227189 00000 n -0000227292 00000 n -0000227395 00000 n -0000227498 00000 n -0000227601 00000 n -0000227704 00000 n -0000227807 00000 n -0000227910 00000 n -0000228013 00000 n -0000228116 00000 n -0000228219 00000 n -0000228322 00000 n -0000228425 00000 n -0000228528 00000 n -0000228631 00000 n -0000228734 00000 n -0000228837 00000 n -0000228940 00000 n -0000229043 00000 n -0000229146 00000 n -0000229249 00000 n -0000229352 00000 n -0000229455 00000 n -0000229558 00000 n -0000229661 00000 n -0000229764 00000 n -0000229867 00000 n -0000229970 00000 n -0000230073 00000 n -0000230176 00000 n -0000230279 00000 n -0000230382 00000 n -0000230485 00000 n -0000230588 00000 n -0000230691 00000 n -0000230794 00000 n -0000230897 00000 n -0000231000 00000 n -0000231103 00000 n -0000231206 00000 n -0000231309 00000 n -0000231412 00000 n -0000231515 00000 n -0000231618 00000 n -0000231721 00000 n -0000231824 00000 n -0000231927 00000 n -0000232030 00000 n -0000232133 00000 n -0000232236 00000 n -0000232339 00000 n -0000232442 00000 n -0000232545 00000 n -0000232648 00000 n -0000232751 00000 n -0000232854 00000 n -0000232957 00000 n -0000233060 00000 n -0000233163 00000 n -0000233266 00000 n -0000233369 00000 n -0000233472 00000 n -0000233575 00000 n -0000233678 00000 n -0000233781 00000 n -0000233884 00000 n -0000233987 00000 n -0000234090 00000 n -0000234193 00000 n -0000234296 00000 n -0000234399 00000 n -0000234502 00000 n -0000234605 00000 n -0000234708 00000 n -0000234811 00000 n -0000234914 00000 n -0000235017 00000 n -0000235120 00000 n -0000235223 00000 n -0000235326 00000 n -0000235429 00000 n -0000235532 00000 n -0000235635 00000 n -0000235738 00000 n -0000235841 00000 n -0000235944 00000 n -0000236047 00000 n -0000236150 00000 n -0000236253 00000 n -0000236356 00000 n -0000236459 00000 n -0000236562 00000 n -0000236665 00000 n -0000236768 00000 n -0000236871 00000 n -0000236974 00000 n -0000237077 00000 n -0000237181 00000 n -0000237285 00000 n -0000237389 00000 n -0000237493 00000 n -0000237597 00000 n -0000237701 00000 n -0000237805 00000 n -0000237909 00000 n -0000238013 00000 n -0000238117 00000 n -0000238221 00000 n -0000238325 00000 n -0000238429 00000 n -0000238533 00000 n -0000238637 00000 n -0000238741 00000 n -0000238845 00000 n -0000238949 00000 n -0000239053 00000 n -0000239157 00000 n -0000239261 00000 n -0000239365 00000 n -0000239469 00000 n -0000239573 00000 n -0000239677 00000 n -0000239781 00000 n -0000239885 00000 n -0000239989 00000 n -0000240093 00000 n -0000240197 00000 n -0000240301 00000 n -0000240405 00000 n -0000240509 00000 n -0000240613 00000 n -0000243268 00000 n -0000243654 00000 n -0000244040 00000 n -0000244426 00000 n -0000244812 00000 n -0000245073 00000 n -0000245326 00000 n -0000245569 00000 n -0000245806 00000 n -0000246035 00000 n -0000246446 00000 n -0000246857 00000 n -0000247266 00000 n -0000247671 00000 n -0000248076 00000 n -0000248459 00000 n -0000248840 00000 n -0000249222 00000 n -0000249604 00000 n -0000249985 00000 n -0000250360 00000 n -0000250734 00000 n -0000251109 00000 n -0000251476 00000 n -0000251842 00000 n -0000252246 00000 n -0000252647 00000 n -0000253050 00000 n -0000253449 00000 n -0000253849 00000 n -0000254243 00000 n -0000254632 00000 n -0000255023 00000 n -0000255409 00000 n -0000255789 00000 n -0000256151 00000 n -0000256507 00000 n -0000256852 00000 n -0000257198 00000 n -0000257539 00000 n -0000257879 00000 n -0000258213 00000 n -0000258542 00000 n -0000258870 00000 n -0000259186 00000 n -0000259568 00000 n -0000259939 00000 n -0000260313 00000 n -0000260681 00000 n -0000261054 00000 n -0000261421 00000 n -0000261774 00000 n -0000262127 00000 n -0000262482 00000 n -0000262825 00000 n -0000263138 00000 n -0000263444 00000 n -0000263744 00000 n -0000264036 00000 n -0000264321 00000 n -0000264599 00000 n -0000264877 00000 n -0000265149 00000 n -0000265412 00000 n -0000265670 00000 n -0000265937 00000 n -0000266198 00000 n -0000266448 00000 n -0000266695 00000 n -0000266931 00000 n -0000267161 00000 n -0000267572 00000 n -0000267913 00000 n -0000268257 00000 n -0000268597 00000 n -0000268938 00000 n -0000269276 00000 n -0000269608 00000 n -0000269931 00000 n -0000270252 00000 n -0000270575 00000 n -0000270897 00000 n -0000271144 00000 n -0000271381 00000 n -0000271611 00000 n -0000272022 00000 n -0000272433 00000 n -0000272844 00000 n -0000273255 00000 n -0000273666 00000 n -0000274077 00000 n -0000274488 00000 n -0000274804 00000 n -0000275113 00000 n -0000275422 00000 n -0000275723 00000 n -0000276013 00000 n -0000276303 00000 n -0000276585 00000 n -0000276863 00000 n -0000277140 00000 n -0000277410 00000 n -0000277821 00000 n -0000278232 00000 n -0000278643 00000 n -0000279054 00000 n -0000279465 00000 n -0000279876 00000 n -0000280287 00000 n -0000280695 00000 n -0000281101 00000 n -0000281502 00000 n -0000281903 00000 n -0000282301 00000 n -0000282698 00000 n -0000283088 00000 n -0000283479 00000 n -0000283866 00000 n -0000284251 00000 n -0000284637 00000 n -0000285021 00000 n -0000285405 00000 n -0000285789 00000 n -0000286172 00000 n -0000286549 00000 n -0000286926 00000 n -0000287300 00000 n -0000287664 00000 n -0000288031 00000 n -0000288391 00000 n -0000288738 00000 n -0000289082 00000 n -0000289337 00000 n -0000289583 00000 n -0000289816 00000 n -0000290180 00000 n -0000290591 00000 n -0000291002 00000 n -0000291339 00000 n -0000291750 00000 n -0000292082 00000 n -0000292491 00000 n -0000292813 00000 n -0000293224 00000 n -0000293541 00000 n -0000293950 00000 n -0000294258 00000 n -0000294558 00000 n -0000294846 00000 n -0000295129 00000 n -0000295404 00000 n -0000295671 00000 n -0000296077 00000 n -0000296482 00000 n -0000296886 00000 n -0000297288 00000 n -0000297690 00000 n -0000298089 00000 n -0000298488 00000 n -0000298884 00000 n -0000299282 00000 n -0000299673 00000 n -0000300063 00000 n -0000300443 00000 n -0000300822 00000 n -0000301199 00000 n -0000301578 00000 n -0000301951 00000 n -0000302322 00000 n -0000302687 00000 n -0000303043 00000 n -0000303393 00000 n -0000303748 00000 n -0000304091 00000 n -0000304430 00000 n -0000304770 00000 n -0000305103 00000 n -0000305433 00000 n -0000305760 00000 n -0000306083 00000 n -0000306401 00000 n -0000306716 00000 n -0000307127 00000 n -0000307496 00000 n -0000307907 00000 n -0000308314 00000 n -0000308720 00000 n -0000309125 00000 n -0000309529 00000 n -0000309924 00000 n -0000310324 00000 n -0000310723 00000 n -0000311037 00000 n -0000311340 00000 n -0000311645 00000 n -0000311944 00000 n -0000312228 00000 n -0000312511 00000 n -0000312791 00000 n -0000313068 00000 n -0000313341 00000 n -0000313606 00000 n -0000313999 00000 n -0000314392 00000 n -0000314781 00000 n -0000315172 00000 n -0000315561 00000 n -0000317874 00000 n -0000318026 00000 n -0000318178 00000 n -0000318332 00000 n -0000318486 00000 n -0000318639 00000 n -0000318794 00000 n -0000318948 00000 n -0000319102 00000 n -0000319256 00000 n -0000319410 00000 n -0000319564 00000 n -0000319718 00000 n -0000319873 00000 n -0000320028 00000 n -0000320183 00000 n -0000320335 00000 n -0000320489 00000 n -0000320649 00000 n -0000320809 00000 n -0000320969 00000 n -0000321123 00000 n -0000321283 00000 n -0000321441 00000 n -0000321601 00000 n -0000321761 00000 n -0000323920 00000 n -0000324075 00000 n -0000324230 00000 n -0000322042 00000 n -0000317506 00000 n -0000316464 00000 n -0000321916 00000 n -0001059293 00000 n -0000321979 00000 n -0000324390 00000 n -0000324545 00000 n -0000324700 00000 n -0000324854 00000 n -0000325009 00000 n -0000325163 00000 n -0000325318 00000 n -0000325472 00000 n -0000325625 00000 n -0000325780 00000 n -0000325934 00000 n -0000326089 00000 n -0000326244 00000 n -0000326399 00000 n -0000326554 00000 n -0000326709 00000 n -0000327017 00000 n -0000327172 00000 n -0000327327 00000 n -0000327637 00000 n -0000327791 00000 n -0000327946 00000 n -0000328255 00000 n -0000328410 00000 n -0000328565 00000 n -0000328720 00000 n -0000328875 00000 n -0000329030 00000 n -0000329185 00000 n -0000329340 00000 n -0000329494 00000 n -0000329649 00000 n -0000331515 00000 n -0000331670 00000 n -0000329868 00000 n -0000323444 00000 n -0000322129 00000 n -0000329804 00000 n -0001059818 00000 n -0001058761 00000 n -0000326863 00000 n -0000327482 00000 n -0000328100 00000 n -0000331825 00000 n -0000331979 00000 n -0000332134 00000 n -0000332288 00000 n -0000332441 00000 n -0000332596 00000 n -0000332751 00000 n -0000332906 00000 n -0000333061 00000 n -0000333216 00000 n -0000333371 00000 n -0000333525 00000 n -0000333679 00000 n -0000333834 00000 n -0000333989 00000 n -0000334144 00000 n -0000334299 00000 n -0000334454 00000 n -0000334609 00000 n -0000334764 00000 n -0000334919 00000 n -0000335074 00000 n -0000335228 00000 n -0000335382 00000 n -0000335536 00000 n -0000335690 00000 n -0000335845 00000 n -0000336000 00000 n -0000336155 00000 n -0000336310 00000 n -0000336470 00000 n -0000336630 00000 n -0000336790 00000 n -0000338870 00000 n -0000339023 00000 n -0000339178 00000 n -0000339338 00000 n -0000337008 00000 n -0000331066 00000 n -0000329969 00000 n -0000336945 00000 n -0000339498 00000 n -0000339658 00000 n -0000339812 00000 n -0000339972 00000 n -0000340132 00000 n -0000340292 00000 n -0000340447 00000 n -0000340607 00000 n -0000340767 00000 n -0000340922 00000 n -0000341075 00000 n -0000341230 00000 n -0000341389 00000 n -0000341549 00000 n -0000341709 00000 n -0000341864 00000 n -0000342024 00000 n -0000342183 00000 n -0000342343 00000 n -0000342498 00000 n -0000342658 00000 n -0000342818 00000 n -0000342978 00000 n -0000343137 00000 n -0000343297 00000 n -0000343457 00000 n -0000343612 00000 n -0000343765 00000 n -0000343920 00000 n -0000344080 00000 n -0000344240 00000 n -0000344400 00000 n -0000345724 00000 n -0000345879 00000 n -0000344619 00000 n -0000338412 00000 n -0000337109 00000 n -0000344555 00000 n -0000346039 00000 n -0000346199 00000 n -0000346354 00000 n -0000346509 00000 n -0000346664 00000 n -0000346818 00000 n -0000346973 00000 n -0000347126 00000 n -0000347279 00000 n -0000347434 00000 n -0000347587 00000 n -0000347742 00000 n -0000347897 00000 n -0000348113 00000 n -0000345454 00000 n -0000344720 00000 n -0000348050 00000 n -0001060114 00000 n -0000348589 00000 n -0000348402 00000 n -0000348214 00000 n -0000348525 00000 n -0000350600 00000 n -0000350754 00000 n -0000350914 00000 n -0000351194 00000 n -0000350438 00000 n -0000348676 00000 n -0000351068 00000 n -0000351131 00000 n -0001058586 00000 n -0000351694 00000 n -0000351507 00000 n -0000351322 00000 n -0000351630 00000 n -0000353426 00000 n -0000353598 00000 n -0000354710 00000 n -0000353273 00000 n -0000351781 00000 n -0000353769 00000 n -0000353892 00000 n -0000353955 00000 n -0000354018 00000 n -0000354081 00000 n -0000354143 00000 n -0000354206 00000 n -0000354269 00000 n -0000354332 00000 n -0000354395 00000 n -0000354458 00000 n -0000354521 00000 n -0000354584 00000 n -0000354647 00000 n -0000355921 00000 n -0000355542 00000 n -0000354811 00000 n -0000355665 00000 n -0000355729 00000 n -0000355793 00000 n -0000355857 00000 n -0000358575 00000 n -0000358145 00000 n -0000356022 00000 n -0000358268 00000 n -0001060239 00000 n -0000361591 00000 n -0000361219 00000 n -0000358676 00000 n -0000361342 00000 n -0000365022 00000 n -0000364592 00000 n -0000361692 00000 n -0000364715 00000 n -0000367949 00000 n -0000369656 00000 n -0000469756 00000 n -0000368103 00000 n -0000368507 00000 n -0000367796 00000 n -0000365138 00000 n -0000368257 00000 n -0000469887 00000 n -0000469951 00000 n -0000369517 00000 n -0000368621 00000 n -0000469824 00000 n -0000464809 00000 n -0000464940 00000 n -0000465198 00000 n -0000465456 00000 n -0000465711 00000 n -0000465969 00000 n -0000466227 00000 n -0000466480 00000 n -0000466737 00000 n -0000466994 00000 n -0000467248 00000 n -0000467505 00000 n -0000467762 00000 n -0000468016 00000 n -0000468142 00000 n -0000468268 00000 n -0000468394 00000 n -0000468520 00000 n -0000468646 00000 n -0000468772 00000 n -0000468898 00000 n -0000469024 00000 n -0000469150 00000 n -0000469276 00000 n -0000469402 00000 n -0000469528 00000 n -0000469642 00000 n -0000470461 00000 n -0000470274 00000 n -0000470067 00000 n -0000470397 00000 n -0000472360 00000 n -0000471930 00000 n -0000470548 00000 n -0000472053 00000 n -0001060364 00000 n -0000474806 00000 n -0000474495 00000 n -0000472475 00000 n -0000474618 00000 n -0001059111 00000 n -0000477960 00000 n -0000478119 00000 n -0000478520 00000 n -0000477807 00000 n -0000474935 00000 n -0000478274 00000 n -0000480989 00000 n -0000480677 00000 n -0000478635 00000 n -0000480800 00000 n -0000483721 00000 n -0000483100 00000 n -0000481117 00000 n -0000483223 00000 n -0000483410 00000 n -0000483473 00000 n -0000483534 00000 n -0000483596 00000 n -0000483659 00000 n -0000485826 00000 n -0000485981 00000 n -0000486140 00000 n -0000486939 00000 n -0000485664 00000 n -0000483836 00000 n -0000486300 00000 n -0000486364 00000 n -0001058936 00000 n -0000486428 00000 n -0000486492 00000 n -0000486556 00000 n -0000486620 00000 n -0000486684 00000 n -0000486748 00000 n -0000486812 00000 n -0000486876 00000 n -0000488772 00000 n -0000488926 00000 n -0000489398 00000 n -0000488619 00000 n -0000487054 00000 n -0000489086 00000 n -0000489149 00000 n -0001059467 00000 n -0001060489 00000 n -0000491166 00000 n -0000490727 00000 n -0000489541 00000 n -0000490850 00000 n -0000492986 00000 n -0000492614 00000 n -0000491295 00000 n -0000492737 00000 n -0000495475 00000 n -0000495036 00000 n -0000493115 00000 n -0000495159 00000 n -0000497304 00000 n -0000496872 00000 n -0000495604 00000 n -0000496995 00000 n -0000499116 00000 n -0000498615 00000 n -0000497433 00000 n -0000498738 00000 n -0000501321 00000 n -0000501011 00000 n -0000499245 00000 n -0000501134 00000 n -0001060614 00000 n -0000503596 00000 n -0000503157 00000 n -0000501450 00000 n -0000503280 00000 n -0000505163 00000 n -0000504791 00000 n -0000503725 00000 n -0000504914 00000 n -0000507291 00000 n -0000509384 00000 n -0000507704 00000 n -0000507147 00000 n -0000505292 00000 n -0000507451 00000 n -0000509913 00000 n -0000509240 00000 n -0000507833 00000 n -0000509540 00000 n -0000512177 00000 n -0000511677 00000 n -0000510042 00000 n -0000511800 00000 n -0000514105 00000 n -0000514632 00000 n -0000513961 00000 n -0000512292 00000 n -0000514259 00000 n -0001060739 00000 n -0000516626 00000 n -0000517159 00000 n -0000516482 00000 n -0000514747 00000 n -0000516781 00000 n -0000519037 00000 n -0000518541 00000 n -0000517274 00000 n -0000518664 00000 n -0000521235 00000 n -0000520733 00000 n -0000519152 00000 n -0000520856 00000 n -0000523048 00000 n -0000600788 00000 n -0000600860 00000 n -0000601203 00000 n -0000522888 00000 n -0000521364 00000 n -0000601014 00000 n -0000601139 00000 n -0000598827 00000 n -0000603436 00000 n -0000603595 00000 n -0000603945 00000 n -0000603283 00000 n -0000601355 00000 n -0000603755 00000 n -0000606038 00000 n -0000605605 00000 n -0000604073 00000 n -0000605728 00000 n -0001060864 00000 n -0000608363 00000 n -0000608518 00000 n -0000608925 00000 n -0000608210 00000 n -0000606167 00000 n -0000608673 00000 n -0000611346 00000 n -0000610912 00000 n -0000609040 00000 n -0000611035 00000 n -0000614528 00000 n -0000614215 00000 n -0000611461 00000 n -0000614338 00000 n -0000617146 00000 n -0000617369 00000 n -0000617002 00000 n -0000614657 00000 n -0000617306 00000 n -0000619518 00000 n -0000619203 00000 n -0000617498 00000 n -0000619326 00000 n -0000619390 00000 n -0000619454 00000 n -0000621672 00000 n -0000621238 00000 n -0000619646 00000 n -0000621361 00000 n -0001060989 00000 n -0000623487 00000 n -0000623174 00000 n -0000621787 00000 n -0000623297 00000 n -0000626533 00000 n -0000626034 00000 n -0000623616 00000 n -0000626157 00000 n -0000626282 00000 n -0000626345 00000 n -0000626408 00000 n -0000629359 00000 n -0000629046 00000 n -0000626648 00000 n -0000629169 00000 n -0000631671 00000 n -0000631361 00000 n -0000629474 00000 n -0000631484 00000 n -0000634487 00000 n -0000634237 00000 n -0000631786 00000 n -0000634360 00000 n -0000636618 00000 n -0000636773 00000 n -0000636996 00000 n -0000636465 00000 n -0000634602 00000 n -0000636933 00000 n -0001061114 00000 n -0000639388 00000 n -0000639733 00000 n -0000639244 00000 n -0000637097 00000 n -0000639543 00000 n -0000641794 00000 n -0000642073 00000 n -0000641650 00000 n -0000639848 00000 n -0000641948 00000 n -0000643528 00000 n -0000643814 00000 n -0000643384 00000 n -0000642201 00000 n -0000643687 00000 n -0000646136 00000 n -0000645764 00000 n -0000643929 00000 n -0000645887 00000 n -0000649288 00000 n -0000648912 00000 n -0000646251 00000 n -0000649035 00000 n -0000652448 00000 n -0000652856 00000 n -0000652304 00000 n -0000649416 00000 n -0000652608 00000 n -0001061239 00000 n -0000655277 00000 n -0000654965 00000 n -0000652984 00000 n -0000655088 00000 n -0000657564 00000 n -0000657254 00000 n -0000655405 00000 n -0000657377 00000 n -0000660765 00000 n -0000660925 00000 n -0000661085 00000 n -0000661372 00000 n -0000660603 00000 n -0000657692 00000 n -0000661245 00000 n -0000662048 00000 n -0000662345 00000 n -0000661904 00000 n -0000661500 00000 n -0000662220 00000 n -0000662825 00000 n -0000662638 00000 n -0000662432 00000 n -0000662761 00000 n -0000665170 00000 n -0000664860 00000 n -0000662912 00000 n -0000664983 00000 n -0001061364 00000 n -0000666865 00000 n -0000666678 00000 n -0000665285 00000 n -0000666801 00000 n -0000668350 00000 n -0000816776 00000 n -0000668227 00000 n -0000666966 00000 n -0000816525 00000 n -0000816712 00000 n -0000818977 00000 n -0000819149 00000 n -0000819321 00000 n -0000819494 00000 n -0000819661 00000 n -0000820259 00000 n -0000818797 00000 n -0000816900 00000 n -0000819813 00000 n -0000819940 00000 n -0000820004 00000 n -0000820068 00000 n -0000820131 00000 n -0000820195 00000 n -0000823422 00000 n -0000822663 00000 n -0000822164 00000 n -0000820387 00000 n -0000822287 00000 n -0000822350 00000 n -0000822413 00000 n -0000822476 00000 n -0000822537 00000 n -0000822600 00000 n -0000823658 00000 n -0000823278 00000 n -0000822764 00000 n -0000823594 00000 n -0000825162 00000 n -0000824914 00000 n -0000823745 00000 n -0000825037 00000 n -0001061489 00000 n -0000827209 00000 n -0000827360 00000 n -0000827511 00000 n -0000827660 00000 n -0000827810 00000 n -0000827960 00000 n -0000828111 00000 n -0000828262 00000 n -0000828412 00000 n -0000828561 00000 n -0000828711 00000 n -0000828862 00000 n -0000829013 00000 n -0000829164 00000 n -0000829315 00000 n -0000829465 00000 n -0000829616 00000 n -0000829767 00000 n -0000829917 00000 n -0000830067 00000 n -0000830217 00000 n -0000830367 00000 n -0000830518 00000 n -0000830669 00000 n -0000830819 00000 n -0000830969 00000 n -0000831119 00000 n -0000831269 00000 n -0000831417 00000 n -0000831568 00000 n -0000831719 00000 n -0000831870 00000 n -0000832018 00000 n -0000832168 00000 n -0000832317 00000 n -0000832467 00000 n -0000832618 00000 n -0000832769 00000 n -0000832919 00000 n -0000833069 00000 n -0000833219 00000 n -0000833367 00000 n -0000833517 00000 n -0000833667 00000 n -0000833816 00000 n -0000833967 00000 n -0000834117 00000 n -0000834268 00000 n -0000834419 00000 n -0000834568 00000 n -0000834718 00000 n -0000834866 00000 n -0000835015 00000 n -0000835166 00000 n -0000835315 00000 n -0000835464 00000 n -0000835614 00000 n -0000835765 00000 n -0000835916 00000 n -0000836066 00000 n -0000836217 00000 n -0000836368 00000 n -0000836518 00000 n -0000836669 00000 n -0000836819 00000 n -0000836970 00000 n -0000837120 00000 n -0000837270 00000 n -0000837420 00000 n -0000837569 00000 n -0000837718 00000 n -0000837868 00000 n -0000838018 00000 n -0000838167 00000 n -0000839385 00000 n -0000839535 00000 n -0000838381 00000 n -0000826408 00000 n -0000825249 00000 n -0000838317 00000 n -0000839685 00000 n -0000839835 00000 n -0000839984 00000 n -0000840133 00000 n -0000840283 00000 n -0000840434 00000 n -0000840584 00000 n -0000840735 00000 n -0000840886 00000 n -0000841036 00000 n -0000841187 00000 n -0000841337 00000 n -0000841488 00000 n -0000841639 00000 n -0000841790 00000 n -0000841941 00000 n -0000842092 00000 n -0000842243 00000 n -0000842394 00000 n -0000842545 00000 n -0000842695 00000 n -0000842907 00000 n -0000839043 00000 n -0000838468 00000 n -0000842844 00000 n -0001057101 00000 n -0000842994 00000 n -0001057551 00000 n -0000843322 00000 n -0001058010 00000 n -0000843422 00000 n -0000843454 00000 n -0000843786 00000 n -0000844290 00000 n -0000844787 00000 n -0000845390 00000 n -0000845423 00000 n -0000846405 00000 n -0000846815 00000 n -0000847121 00000 n -0000848458 00000 n -0000848700 00000 n -0000862966 00000 n -0000863227 00000 n -0000880182 00000 n -0000880454 00000 n -0000883170 00000 n -0000883432 00000 n -0000911606 00000 n -0000911945 00000 n -0000944387 00000 n -0000944999 00000 n -0000956293 00000 n -0000956537 00000 n -0000984359 00000 n -0000984854 00000 n -0000996328 00000 n -0000996590 00000 n -0001030776 00000 n -0001031363 00000 n -0001056671 00000 n -0001061587 00000 n -0001061712 00000 n -0001061838 00000 n -0001061918 00000 n -0001062000 00000 n -0001075902 00000 n -0001076081 00000 n -0001076258 00000 n -0001076433 00000 n -0001076608 00000 n -0001076785 00000 n -0001076961 00000 n -0001077138 00000 n -0001077314 00000 n -0001077507 00000 n -0001077695 00000 n -0001077880 00000 n -0001078057 00000 n -0001078233 00000 n -0001078410 00000 n -0001078585 00000 n -0001078760 00000 n -0001078937 00000 n -0001079113 00000 n -0001079290 00000 n -0001079466 00000 n -0001079637 00000 n -0001079813 00000 n -0001080000 00000 n -0001080202 00000 n -0001080405 00000 n -0001080608 00000 n -0001080809 00000 n -0001081012 00000 n -0001081212 00000 n -0001081412 00000 n -0001081615 00000 n -0001081816 00000 n -0001082019 00000 n -0001082220 00000 n -0001082423 00000 n -0001082620 00000 n -0001082819 00000 n -0001083022 00000 n -0001083225 00000 n -0001083441 00000 n -0001083680 00000 n -0001083923 00000 n -0001084166 00000 n -0001084409 00000 n -0001084652 00000 n -0001084841 00000 n -0001084959 00000 n -0001085075 00000 n -0001085191 00000 n -0001085311 00000 n -0001085434 00000 n -0001085558 00000 n -0001085687 00000 n -0001085803 00000 n -0001085925 00000 n -0001086018 00000 n -0001086109 00000 n -0001086149 00000 n -0001086322 00000 n -trailer -<< /Size 2025 -/Root 2023 0 R -/Info 2024 0 R -/ID [<59CE2FF1F379D6B592430211850E1DAF> <59CE2FF1F379D6B592430211850E1DAF>] >> -startxref -1086655 -%%EOF diff --git a/doc/xtreemfs-userguide/xtfs-guide.tex b/doc/xtreemfs-userguide/xtfs-guide.tex deleted file mode 100644 index f6dcfcfce6cda5783e6c3c48c2eb854e464d54fa..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/xtfs-guide.tex +++ /dev/null @@ -1,2193 +0,0 @@ -\documentclass[a4paper,10pt]{book} -\usepackage{graphics} -\usepackage{boxedminipage} -\usepackage[colorlinks=true,urlcolor=blue]{hyperref} -\usepackage{fancyhdr} -\usepackage{fancyvrb} -\usepackage{makeidx} -\usepackage{graphicx} -\usepackage{garamond} -\usepackage{lmodern} -\usepackage[T1]{fontenc} - -\title{XtreemFS Installation and User Guide} - -\date{Version 1.2.1} - -\setlength{\parindent}{0pt} -\setlength{\parskip}{1ex plus 0.5ex minus 0.2ex} - -\makeindex - -\begin{document} -\pagenumbering{roman} -\begin{titlepage} -\begin{flushright} - \includegraphics{images/final_logo.pdf} - % final_logo.pdf: 192x56 pixel, 72dpi, 6.77x1.98 cm, bb=0 0 192 56 -\end{flushright} - -\vspace{3cm} - -\begin{flushleft} -\sffamily \begin{LARGE}The XtreemFS Installation and User Guide\end{LARGE} - -Version 1.2 -\end{flushleft} - - -\end{titlepage} -\garamond -\resizebox{5cm}{!}{\includegraphics{images/xtreemos_neu_logo.pdf}} - -XtreemFS is developed within the \href{http://www.xtreemos.eu}{XtreemOS project}. XtreemOS is a Linux-based Grid operating system that transparently integrates Grid user, VO and resource management traditionally found in Grid Middleware. The XtreemOS project is funded by the European Commission's IST program under contract \#FP6-033576. - -XtreemFS is available from the \href{http://www.XtreemFS.org}{XtreemFS website (www.XtreemFS.org)}. - - -This document is \copyright{} 2009, 2010 by Bj\"orn Kolbeck, Jan Stender, NEC HPC Europe, Felix Hupfeld, Juan Gonzales. All rights reserved. - -\setcounter{tocdepth}{10} -\tableofcontents - -\chapter*{Changes} - -Summary of important changes in release 1.2.1: - -\begin{itemize} - \item \textbf{server status}\\ - Each server (especially OSDs) have a persistent status which can be online or dead/removed. This status must be changed manually and is used by the scrubber tool to identify dead OSDs which have been removed from the system. - \item \textbf{enhanced scrubber}\\ - The scrubber is now able to remove replicas which are stored on OSDs that are marked as dead/removed. The srubber will create new replicas for that file if a complete replica still exists and a sufficient number of OSDs is available. In addition, the scrubber marks replicas as ``complete'' if they contain all objects of the original file. -\end{itemize} - - -This is a summary of the most important changes in release 1.2: - -\begin{itemize} - \item \textbf{renamed binaries}\\ - We renamed most binaries to conform with Linux naming conventions, e.g. \texttt{xtfs\_mount} is now \texttt{mount.xtreemfs}. However, we added links with the old names for compatibility. For a full list see Sec. \ref{sec:cli_utils}. - - \item \textbf{``Grid SSL'' mode}\\ - In this mode, SSL is only used for authentication (handshake) and regular TCP is used for communication afterwards. For more details see Sec. \ref{sec:cfg_ssl}. - - \item \textbf{the \texttt{xctl} utility}\\ - The new release includes a command line utility \texttt{xctl} for starting and stopping the services. This tool is useful if you don't want a package based installation or if you don't have root privileges. - - \item \textbf{vivaldi}\\ - XtreemFS now includes modules for calculating Vivaldi network coordinates to reflect the latency between OSDs and clients. An OSD and replica selection policy for vivaldi is also available. For details, see Sec. \ref{sec:vivaldi}. - -\end{itemize} - - -\chapter{Quick Start} -\label{sec:quick_start} - -This is the very short version to help you set up a local installation of XtreemFS. - -\begin{enumerate} - \item Download XtreemFS RPMs/DEBs and install - \begin{enumerate} - \item Download the RPMs or DEBs for your system from the XtreemFS website (\href{http://www.xtreemfs.org}{http://www.xtreemfs.org}) - \item open a root console (\texttt{su} or \texttt{sudo}) - \item install with \texttt{rpm -Uhv xtreemfs*-1.2.x.rpm} - \end{enumerate} -\item Start the Directory Service:\\ - \texttt{/etc/init.d/xtreemfs-dir start} -\item Start the Metadata Server:\\ - \texttt{/etc/init.d/xtreemfs-mrc start} -\item Start the OSD:\\ - \texttt{/etc/init.d/xtreemfs-osd start} - -\item If not already loaded, load the FUSE kernel module:\\ - \texttt{modprobe fuse} - -\item Depending on your distribution, you may have to add users to a special group to allow them to mount FUSE file systems. In openSUSE users must be in the group \texttt{trusted}, in Ubuntu in the group \texttt{fuse}. You may need to log out and log in again for the new group membership to become effective. - -\item You can now close the root console and work as a regular user. - -\item Wait a few seconds for the services to register at the directory service. You can check the registry by opening the DIR status page in your favorite web browser \href{http://localhost:30638}{http://localhost:30638}. - -\item Create a new volume with the default settings:\\ - \texttt{mkfs.xtreemfs localhost/myVolume} - -\item Create a mount point:\\ - \texttt{mkdir \~{}/xtreemfs} - -\item Mount XtreemFS on your computer: - \begin{verbatim} - mount.xtreemfs localhost/myVolume ~/xtreemfs - \end{verbatim} - - -\item Have fun ;-) - -\item To un-mount XtreemFS:\\ - \texttt{umount.xtreemfs \~{}/xtreemfs} -\end{enumerate} - -You can also mount this volume on remote computers. First make sure that the ports 32636, 32638 and 32640 are open for incoming TCP connections. You must also specify a hostname that can be resolved by the remote machine! This hostname has to be used instead of \texttt{localhost} when mounting. - -\chapter{About XtreemFS} -\pagenumbering{arabic} -\setcounter{page}{1} - -Since you decided to take a look at this user guide, you probably read or heard about XtreemFS and want to find out more. This chapter contains basic information about the characteristics and the architecture of XtreemFS. - -\section{What is XtreemFS?} -XtreemFS is a file system for a variety of different use cases and purposes. Since it is impossible to categorize or explain XtreemFS in a single sentence, we introduce XtreemFS by means of its two most significant properties: \emph{XtreemFS is a globally distributed and replicated file system.} - -\paragraph{What makes XtreemFS a distributed file system?} We consider a file system as \emph{distributed} if files are stored across a number of servers rather than a single server or local machine. Unlike local or network file systems, a distributed file system aggregates the capacity of multiple servers. As a \emph{globally distributed} file system, XtreemFS servers may be dispersed all over the world. The capacity can be increased and decreased by adding and removing servers, but from a user's perspective, the file system appears to reside on a single machine. - -\paragraph{What makes XtreemFS a replicated file system?} We call it a \emph{replicated} file system because replication is one of its most prominent features. XtreemFS is capable of maintaining replicas of files on different servers. Thus, files remain accessible even if single servers, hard disks or network connections fail. Besides, replication yields benefits in terms of data rates and access times. Different replicas of a file can be accessed simultaneously on different servers, which may lead to a better performance compared to simultaneous accesses on a single server. By placing file replicas close the consuming users and applications in a globally distributed installation, the effects of network latency and bandwidth reduction in wide area networks can be mitigated. However, replication is transparent to users and applications that work with XtreemFS; the file system is capable of controlling the life cycle and access of replicas without the need for human intervention or modifications of existing applications. - -\section{Is XtreemFS suitable for me?} -If you consider using XtreemFS, you may be a system administrator in search of a better and more flexible alternative to your current data management solution. Or you may be a private user in need of a file system that can be easily set up and accessed from any machine in the world. You might also be someone looking for an open-source solution to manage large amounts of data distributed across multiple sites. In any case, you will wonder if XtreemFS fulfills your requirements. As a basis for your decision, the following two paragraphs point out the characteristics of XtreemFS. - -\paragraph{XtreemFS is ...} -\begin{itemize} - \item [...] an open source file system. It is distributed freely and can be used by anyone without limitations. - \item [...] a POSIX file system. Users can mount and access XtreemFS like any other common file system. Application can access XtreemFS via the standard file system interface, i.e.\ without having to be rebuilt against a specialized API. XtreemFS supports a POSIX-compliant access control model. - \item [...] a multi-platform file system. Server and client modules can be installed and run on different platforms, including most Linux distributions, Solaris, Mac OS X and Windows. - \item [...] a globally distributed file system. Unlike cluster file systems, an XtreemFS installation is not restricted to a single administrative domain or cluster. It can span the globe and may comprise servers in different administrative domains. - \item [...] a failure-tolerant file system. As stated in the previous section, replication can keep the system alive and the data safe. In this respect, XtreemFS differs from most other open-source file systems. - \item [...] a secure file system. To ensure security in an untrusted, worldwide network, all network traffic can be encrypted with SSL connections, and users can be authenticated with X.509 certificates. - \item [...] a customizable file system. Since XtreemFS can be used in different environments, we consider it necessary to give administrators the possibility of adapting XtreemFS to the specific needs of their users. Customizable policies make it possible change the behavior of XtreemFS in terms of authentication, access control, striping, replica placement, replica selection and others. Such policies can be selected from a set of predefined policies, or implemented by administrators and plugged in the system. -\end{itemize} - -\paragraph{XtreemFS is not ...} -\begin{itemize} - \item [...] a high-performance cluster file system. Even though XtreemFS reaches acceptable throughput rates on a local cluster, it cannot compete with specialized cluster file systems in terms of raw performance numbers. Most such file systems have an optimized network stack and protocols, and a substantially larger development team. If you have huge amounts of data on a local cluster with little requirements but high throughput rates to them, a cluster file system is probably the better alternative. - \item [...] a replacement for a local file system. Even though XtreemFS can be set up and mounted on a single machine, the additional software stack degrades the performance, which makes XtreemFS a bad alternative. - %\item [...] a commercially supported product, so far. XtreemFS is being developed as part of the XtreemOS project, a research project funded by the European commission. Even though we do not want to rule out the possibility of providing commercial support for XtreemFS in the future, we currently see ourselves as researchers rather than professional file system developers. -\end{itemize} - -\section{Core Features} -The core functionality of XtreemFS is characterized by a small set of features, which are explained in the following. - -\paragraph{Distribution.} -An XtreemFS installation comprises multiple servers that may run on different nodes connected on a local cluster or via the Internet. Provided that the servers are reachable, a client module installed on any machine in the world can access the installation. A binary communication protocol based on Sun's ONC-RPC ensures an efficient communication with little overhead between clients and servers. XtreemFS ensures that the file system remains in a consistent state even if multiple clients access a common set of files and directories. Similar to NFS, it offers a close-to-open consistency model in the event of concurrent file accesses. - -\paragraph{Replication.} -Since version 1.0, XtreemFS supports \emph{read-only replication}. A file may have multiple replicas, provided that the it was explicitly made read-only before, which means that its content cannot be changed anymore. This kind of replication can be used to make write-once files available to many consumers, or to protect them from losses due to hardware failures. Besides complete replicas that are immediately synchronized after having been created, XtreemFS also supports partial replicas that are only filled with content on demand. They can e.g.\ be used to make large files accessible to many clients, of which only parts need to be accessed. - -Currently, XtreemFS does not support replication of mutable files. From a technical perspective, this is more challenging than read-only replication, since XtreemFS has to ensure that all replicas of a file remain consistent despite attempts to concurrently write different replicas, as well as network and component failures. However, we are planning on supporting full read-write replication with future XtreemFS releases. - -\paragraph{Striping.} -To ensure acceptable I/O throughput rates when accessing large files, XtreemFS supports \emph{striping}. A striped file is split into multiple chunks (``\emph{stripes}''), which are stored on different storage servers. Since different stripes can be accessed in parallel, the whole file can be read or written with the aggregated network and storage bandwidth of multiple servers. XtreemFS currently supports the \texttt{RAID0}\index{RAID0} striping pattern, which splits a file up in a set of stripes of a fixed size, and distributes them across a set of storage servers in a round-robin fashion. The size of an individual stripe as well as the number of storage servers used can be configured on a per-file or per-directory basis. - -\paragraph{Security.} -To enforce security, XtreemFS offers mechanisms for user authentication and authorization, as well as the possibility to encrypt network traffic. - -\emph{Authentication} \index{Authentication} describes the process of verifying a user's or client's identity. By default, authentication in XtreemFS is based on local user names and depends on the trustworthiness of clients and networks. In case a more secure solution is needed, X.509 certificates can be used. - -\emph{Authorization}\index{Authorization} describes the process of checking user permissions to execute an operation. XtreemFS supports the standard UNIX permission model, which allows for assigning individual access rights to file owners, owning groups and other users. - -Authentication and authorization are policy-based, which means that different models and mechanisms can be used to authenticate and authorize users. Besides, the policies are pluggable, i.e.\ they can be freely defined and easily extended. - -XtreemFS uses unauthenticated and unencrypted TCP connections by default. To encrypt all network traffic, services and clients can establish \emph{SSL}\index{SSL} connections. However, using SSL requires that all users and services have valid X.509\index{X.509}\index{Certificate} certificates. - -%When using XtreemFS as part of an \emph{XtreemOS} installation, users can benefit from a transparent integration with the XtreemOS \emph{Virtual Organization (VO)} infrastructure in the form of dynamic user mappings and automatic mounting of home volumes. - -\section{Architecture} -XtreemFS implements an \emph{object-based file system architecture}\index{Object-based File System}\index{Architecture} (Fig. \ref{fig:architecture}): file content is split into a series of fixed-size \emph{objects}\index{Object} and stored across storage servers, while \emph{metadata}\index{Metadata} is stored on a separate metadata server. The metadata server organizes file system metadata as a set of \emph{volumes}\index{Volume}, each of which implements a separate file system namespace in form of a directory tree. - -In contrast to block-based file systems, the management of available and used storage space is offloaded from the metadata server to the storage servers. Rather than inode lists with block addresses, file metadata contains lists of storage servers responsible for the objects, together with striping policies\index{Striping Policy}\index{Policy!Striping Policy} that define how to translate between byte offsets and object IDs. This implies that object sizes may vary from file to file. - -%The advantage of this architecture is that the read and write operations, which make up 80 to 90 \% of all requests, can be spread across a large number of storage servers. - -\begin{figure} - \centering - \includegraphics[width=\textwidth]{images/architecture.pdf} - % architecture.pdf: 417x257 pixel, 72dpi, 14.71x9.07 cm, bb=0 0 417 257 - \caption{The XtreemFS architecture and components.} - \label{fig:architecture} -\end{figure} - - -\paragraph{XtreemFS Components.} -An XtreemFS installation contains three types of servers that can run on one or several machines (Fig. \ref{fig:architecture}): - -\begin{itemize} - \item DIR - Directory Service\index{DIR}\index{Directory Service}\\ - The directory service is the central registry for all services in XtreemFS. The MRC uses it to discover storage servers. - \item MRC - Metadata and Replica Catalog\index{MRC}\index{Metadata Server}\index{Metadata and Replica Catalog}\\ - The MRC stores the directory tree and file metadata such as file name, size or modification time. Moreover, the MRC authenticates users and authorizes access to files. - \item OSD - Object Storage Device\index{OSD}\index{Storage Server}\index{Object Storage Device}\\ - An OSD stores arbitrary objects of files; clients read and write file data on OSDs. -\end{itemize} - -These servers are connected by the \emph{client}\index{Client} to a file system. A client \emph{mounts}\index{Mounting} one of the volumes\index{Volume} of the MRC in a local directory. It translates file system calls into RPCs sent to the respective servers. - -The client is implemented as a \emph{FUSE user-level driver} that runs as a normal process. FUSE\index{FUSE} itself is a kernel-userland hybrid that connects the user-land driver to Linux' \emph{Virtual File System (VFS)}\index{VFS} layer where file system drivers usually live. - - -\chapter{XtreemFS Services} - -This chapter describes how to install and set up the server side of an XtreemFS installation. - -\section{Installation} - -When installing XtreemFS server components, you can choose from two different installation sources: you can download one of the \emph{pre-packaged releases} that we create for most Linux distributions or you can install directly from the \emph{source tarball}. - -Note that the source tarball contains the complete distribution of XtreemFS, which also includes client and tools. Currently, binary distributions of the server are only available for Linux. - -\subsection{Prerequisites} - -For the pre-packaged release, you will need Sun Java JRE 1.6.0 or newer to be installed on the system. - -When building XtreemFS directly from the source, you need a Sun Java JDK 1.6.0 or newer, Ant 1.6.5 or newer and gmake. - -\subsection{Installing from Pre-Packaged Releases} - -On RPM-based distributions (RedHat, Fedora, SuSE, Mandriva, XtreemOS) you can install the package with - -\begin{verbatim} -$> rpm -i xtreemfs-server-1.2.x.rpm xtreemfs-backend-1.2.x.rpm -\end{verbatim} - - -For Debian-based distributions, please use the \texttt{.deb} package provided and install it with - -\begin{verbatim} -$> dpkg -i xtreemfs-server-1.2.x.deb xtreemfs-backend-1.2.x.deb -\end{verbatim} - - -To install the server components, the following package is required: \texttt{jre} $\geq$ 1.6.0 for RPM-based releases, \texttt{java6-runtime} for Debian-based releases. If you already have a different distribution of \texttt{Java6} on your system, you can alternatively install the XtreemFS server packages as follows: - -\begin{verbatim} -$> rpm -i --nodeps xtreemfs-server-1.2.x.rpm \ - xtreemfs-backend-1.2.x.rpm -\end{verbatim} - -on RPM-based distributions, - -\begin{verbatim} -$> dpkg -i --ignore-depends java6-runtime \ - xtreemfs-server-1.2.x.deb xtreemfs-backend-1.2.x.deb -\end{verbatim} - -on Debian-based distributions. - -To ensure that your local \texttt{Java6} installation is used, is necessary to set the \texttt{JAVA\_HOME} environment variable to your \texttt{Java6} installation directory, e.g.\ - -\begin{verbatim} -$> export JAVA_HOME=/usr/java6 -\end{verbatim} - - -Both RPM and Debian-based packages will install three \texttt{init.d} scripts to start up the services (\texttt{xtreemfs-dir}, \texttt{xtreemfs-mrc}, \texttt{xtreemfs-osd}). If you want the services to be started automatically when booting up the system, you can execute \texttt{insserv } (SuSE), \texttt{chkconfig --add } (Mandriva, RedHat) or \texttt{update-rc.d defaults} (Ubuntu, Debian). - -\subsection{Installing from Sources} - -Extract the tarball with the sources. Change to the top level directory and execute - -\begin{verbatim} -$> make server -\end{verbatim} - -This will build the XtreemFS server and Java-based tools. When done, execute - -\begin{verbatim} -$> sudo make install-server -\end{verbatim} - -to install the server components. Finally, you will be asked to execute a post-installation script - -\begin{verbatim} -$> sudo /etc/xos/xtreemfs/postinstall_setup.sh -\end{verbatim} - -to complete the installation. - -\section{Configuration} -\label{sec:service_config} - -After having installed the XtreemFS server components, it is recommendable to configure the different services. This section describes the different configuration options. - -XtreemFS services are configured via Java properties files that can be modified with a normal text editor. Default configuration files for a Directory Service, MRC and OSD are located in \texttt{/etc/xos/xtreemfs/}. - -\subsection{A Word about UUIDs} - -XtreemFS uses UUIDs\index{UUID} (Universally Unique Identifiers) to be able to identify services and their associated state independently from the machine they are installed on. This implies that you cannot change the UUID of an MRC or OSD after it has been used for the first time! - -The Directory Service resolves UUIDs to service endpoints, where each service endpoint consists of an IP address or hostname and port number. Each endpoint is associated with a netmask that indicates the subnet in which the mapping is valid. In theory, multiple endpoints can be assigned to a single UUID if endpoints are associated with different netmasks. However, it is currently only possible to assign a single endpoint to each UUID; the netmask must be ``*'', which means that the mapping is valid in all networks. Upon first start-up, OSDs and MRCs will auto-generate the mapping if it does not exist, by using the first available network device with a public address. - -Changing the IP address, hostname or port is possible at any time. Due to the caching of UUIDs in all components, it can take some time until the new UUID mapping is used by all OSDs, MRCs and clients. The TTL (time-to-live) of a mapping defines how long an XtreemFS component is allowed to keep entries cached. The default value is 3600 seconds (1 hour). It should be set to shorter durations if services change their IP address frequently. - -To create a globally unique UUID you can use tools like \texttt{uuidgen}. During installation, the post-install script will automatically create a UUID for each OSD and MRC if it does not have a UUID assigned. - -\subsection{Automatic DIR Discovery} -\label{sec:autodiscover} -OSDs and MRCs are capable of automatically discovering a Directory Service. If automatic DIR discovery is switched on, the service will broadcast requests to the local LAN and wait up to 10s for a response from a DIR. The services will select the first DIR which responded, which can lead to non-deterministic behavior if multiple DIR services are present. Note that the feature works only in a local LAN environment, as broadcast messages are not routed to other networks. Local firewalls on the computers on which the services are running can also prevent the automatic discovery from working. - -\textbf{Security:} The automatic discovery is a potential security risk when used in untrusted environments as any user can start-up DIR services. - -A statically configured DIR address and port can be used to disable DIR discovery in the OSD and MRC (see Sec. \ref{sec:config}, \texttt{dir\_service}). By default. the DIR responds to UDP broadcasts. To disable this feature, set \texttt{discover = false} in the DIR service config file. - - -\subsection{Authentication} -\label{sec:AuthProvider} -Administrators may choose the way of authenticating users in XtreemFS. \emph{Authentication Providers}\index{Authentication Provider} are pluggable modules that determine how users are authenticated. For further details, see Sec.\ \ref{sec:authentication_policies}. - -To set the authentication provider, it is necessary to set the following property in the MRC configuration file: - -\begin{verbatim} -authentication_provider = -\end{verbatim} - -By default, the following class names can be used: - -\begin{itemize} - \item \texttt{org.xtreemfs.common.auth.NullAuthProvider}\\ -uses local user and group IDs - \item \texttt{org.xtreemfs.common.auth.SimpleX509AuthProvider}\\ -uses X.509 certificates; user and group IDs are extracted from the distinguished names of the certificates - \item \texttt{org.xtreemos.XtreemOSAuthProvider}\\ -uses XOSCerts -\end{itemize} - - -\subsection{Configuring SSL Support} -\label{sec:cfg_ssl} - -In order to enable certificate-based authentication in an XtreemFS installation, services need to be equipped with X.509\index{X.509}\index{Certificate}\index{Credentials} certificates. Certificates are used to establish a mutual trust relationship among XtreemFS services and between the XtreemFS client and XtreemFS services. - -Note that it is not possible to mix SSL-enabled and non-SSL services in an XtreemFS installation! If you only need authentication based on certiciates without SSL, you can use the ``grid SSL'' mode. In this mode XtreemFS will only do an SSL handshake and fall back to plain TCP for communication. This mode is insecure (not encrypted and records are not signed) but just as fast as the non-SSL mode. If this mode is enabled, all client tools must be used with the \texttt{oncrpcg://} scheme prefix. - -Each XtreemFS service needs a certificate and a private key in order to be run. Once they have been created and signed, the credentials may need to be converted into the correct file format. XtreemFS services also need a \textit{trust store} that contains all trusted Certification Authority certificates. - -By default, certificates and credentials for XtreemFS services are stored in -\begin{verbatim} -/etc/xos/xtreemfs/truststore/certs -\end{verbatim} - - -\subsubsection{Converting PEM files to PKCS\#12} -The simplest way to provide the credentials to the services is by converting your signed certificate and private key into a PKCS\#12\index{PKCS\#12} file using \texttt{openssl}: - - -\begin{verbatim} -$> openssl pkcs12 -export -in ds.pem -inkey ds.key \ - -out ds.p12 -name "DS" -$> openssl pkcs12 -export -in mrc.pem -inkey mrc.key \ - -out mrc.p12 -name "MRC" -$> openssl pkcs12 -export -in osd.pem -inkey osd.key \ - -out osd.p12 -name "OSD" -\end{verbatim} - - -This will create three PKCS12 files (\texttt{ds.p12}, \texttt{mrc.p12} and \texttt{osd.p12}), each containing the private key and certificate for the respective service. The passwords chosen when asked must be set as a property in the corresponding service configuration file. - - -\subsubsection{Importing trusted certificates from PEM into a JKS} - -The certificate (or multiple certificates) from your CA (or CAs) can be imported into a Java Keystore (JKS) \index{JKS}\index{Java KeyStore} using the Java keytool which comes with the Java JDK or JRE. - -Execute the following steps for each CA certificate using the same keystore file. - - -\begin{verbatim} -$> keytool -import -alias rootca -keystore trusted.jks \ - -trustcacerts -file ca-cert.pem -\end{verbatim} - - -This will create a new Java Keystore \texttt{trusted.jks} with the CA certificate in the current working directory. The password chosen when asked must be set as a property in the service configuration files. - -Note: If you get the following error -\begin{verbatim} -keytool error: java.lang.Exception: Input not an X.509 certificate -\end{verbatim} -you should remove any text from the beginning of the certificate (until the \texttt{-----BEGIN CERTIFICATE-----} line). - - -\subsubsection{Sample Setup} - -Users can easily set up their own CA (certificate authority)\index{Certificate Authority}\index{CA!Certificate Authority} and create and sign certificates using \texttt{openssl} for a test setup. - -\begin{enumerate} - \item Set up your test CA. - \begin{enumerate} - \item Create a directory for your CA files - \begin{verbatim} - $> mkdir ca - \end{verbatim} - - \item Create a private key and certificate request for your CA. - \begin{verbatim} - $> openssl req -new -newkey rsa:1024 -nodes -out ca/ca.csr \ - -keyout ca/ca.key - \end{verbatim} - - Enter something like XtreemFS-DEMO-CA as the common name (or something else, but make sure the name is different from the server and client name!). - \item Create a self-signed certificate for your CA which is valid for one year. - \begin{verbatim} - $> openssl x509 -trustout -signkey ca/ca.key -days 365 -req \ - -in ca/ca.csr -out ca/ca.pem - \end{verbatim} - - \item Create a file with the CA's serial number - \begin{verbatim} - $> echo "02" > ca/ca.srl - \end{verbatim} - - \end{enumerate} - \item Set up the certificates for the services and the XtreemFS Client.\\ - Replace \texttt{\textit{service}} with \texttt{dir}, \texttt{mrc}, \texttt{osd} and \texttt{client}. - \begin{enumerate} - \item Create a private key for the service.\\ - Use \texttt{XtreemFS-DEMO-\textit{service}} as the common name for the certificate. - \begin{Verbatim}[commandchars=\\\{\}] -$> openssl req -new -newkey rsa:1024 -nodes \ \\ - -out \textit{service}.req \ \\ - -keyout \textit{service}.key - \end{Verbatim} - - \item Sign the certificate with your demo CA.\\ - The certificate is valid for one year. - \begin{Verbatim}[commandchars=\\\{\}] -$> openssl x509 -CA ca/ca.pem -CAkey ca/ca.key \ \\ - -CAserial ca/ca.srl -req \ \\ - -in \textit{service}.req \ \\ - -out \textit{service}.pem -days 365 - \end{Verbatim} - - \item Export the service credentials (certificate and private key) as a PKCS\#12 file.\\ - Use ``passphrase'' as export password. You can leave the export password empty for the XtreemFS Client to avoid being asked for the password on mount. - \begin{Verbatim}[commandchars=\\\{\}] -$> openssl pkcs12 -export -in \textit{service}.pem -inkey \textit{service}.key \ \\ - -out \textit{service}.p12 -name "\textit{service}" - \end{Verbatim} - - \item Copy the PKCS\#12 file to the certificates directory. - \begin{Verbatim}[commandchars=\\\{\}] -$> mkdir -p /etc/xos/xtreemfs/truststore/certs \\ -$> cp \textit{service}.p12 /etc/xos/xtreemfs/truststore/certs - \end{Verbatim} - - \end{enumerate} - \item Export your CA's certificate to the trust store and copy it to the certificate dir.\\ - You should answer ``yes'' when asked ``Trust this certificate''.\\ - Use ``passphrase'' as passphrase for the keystore. - \begin{verbatim} - $> keytool -import -alias ca -keystore trusted.jks \ - -trustcacerts -file ca/ca.pem - $> cp trusted.jks /etc/xos/xtreemfs/truststore/certs - \end{verbatim} - - \item Configure the services. - Edit the configuration file for all your services. Set the following configuration options (see Sec. \ref{sec:service_config} for details).\\ - \texttt{ssl.enabled = true}\\ - \texttt{ssl.service\_creds.pw = passphrase}\\ - \texttt{ssl.service\_creds.container = pkcs12}\\ - \texttt{ssl.service\_creds = /etc/xos/xtreemfs/truststore/certs/\textit{service}.p12}\\ - \texttt{ssl.trusted\_certs = /etc/xos/xtreemfs/truststore/certs/trusted.jks}\\ - \texttt{ssl.trusted\_certs.pw = passphrase}\\ - \texttt{ssl.trusted\_certs.container = jks} - \item Start up the XtreemFS services (see Sec. \ref{sec:startstopservice}). - \item Create a new volume (see Sec. \ref{sec:create_volume} for details). - - Use - \begin{verbatim} - $> mkfs.xtreemfs --pkcs12-file-path=\ - /etc/xos/xtreemfs/truststore/certs/client.p12 oncrpcs://localhost/test - \end{verbatim} - for SSL-enabled servers, or - \begin{verbatim} - $> mkfs.xtreemfs --pkcs12-file-path=\ - /etc/xos/xtreemfs/truststore/certs/client.p12 oncrpcg://localhost/test - \end{verbatim} - for Grid-SSL-enabled servers. - - \item Mount the volume (see Sec. \ref{sec:mount_vol} for details). - - Use - \begin{verbatim} - $> mount.xtreemfs --pkcs12-file-path=\ - /etc/xos/xtreemfs/truststore/certs/client.p12 oncrpcs://localhost/test /mnt - \end{verbatim} - for SSL-enabled servers, or - \begin{verbatim} - $> mount.xtreemfs --pkcs12-file-path=\ - /etc/xos/xtreemfs/truststore/certs/client.p12 oncrpcg://localhost/test /mnt - \end{verbatim} - for Grid-SSL-enabled servers. - -\end{enumerate} - - -\subsection{List of Configuration Options} -\label{sec:config} - -All configuration parameters that may be used to define the behavior of the different services are listed in this section. Unless marked as optional, a parameter has to occur (exactly once) in a configuration file. Parameters marked as experimental belong to the DIR and MRC replication feature, which is currently under development. It is not recommended to mess about with these options if you want to use XtreemFS in production. - -%\makeatletter -%\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% -% {-2.25ex\@plus -1ex \@minus -.2ex}% -% {1.0ex \@plus .2ex}% -% {\normalfont\normalsize\bfseries}} -%\makeatother - -\subsubsection{\texttt{admin\_password} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & String \\ - Default & \\ - Description & Defines the admin password that must be sent to authorize requests like volume creation, deletion or shutdown. The same password is also used to access the HTTP status page of the service (user name is \texttt{admin}). -\end{tabular} - -\subsubsection{\texttt{authentication\_provider}} -\begin{tabular}{lp{10cm}} - Services & MRC\\ - Values & Java class name \\ - Default & \texttt{org.xtreemfs.common.auth.NullAuthProvider}\\ - Description & Defines the Authentication Provider to use to retrieve the user identity (user ID and group IDs). See Sec. \ref{sec:AuthProvider} for details. -\end{tabular} - -\subsubsection{\texttt{babudb.baseDir}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & absolute file system path to a directory\\ - Default & DIR: \texttt{/var/lib/xtreemfs/dir/database}\\ - & MRC: \texttt{/var/lib/xtreemfs/mrc/database}\\ - Description & The directory in which the Directory Service or MRC will store their databases. This directory should never be on the same partition as any OSD data, if both services reside on the same machine. Otherwise, deadlocks may occur if the partition runs out of free disk space. -\end{tabular} - -\subsubsection{\texttt{babudb.cfgFile} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a file name\\ - Default & DIR: \texttt{config.db}\\ - & MRC: \texttt{config.db}\\ - Description & Name for the database configuration file. -\end{tabular} - -\subsubsection{\texttt{babudb.checkInterval} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positive integer value\\ - Default & DIR: \texttt{300}\\ - & MRC: \texttt{300}\\ - Description & The number of seconds between two checks of the disk log size for automatic checkpointing. Set this value to 0 to disable automatic checkpointing. -\end{tabular} - -\subsubsection{\texttt{babudb.compression} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & \texttt{true} or \texttt{false}\\ - Default & DIR: \texttt{false}\\ - & MRC: \texttt{false}\\ - Description & Flag that determines whether the indices shall be compressed or not. -\end{tabular} - -\subsubsection{\texttt{babudb.debug.level} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & 0, 1, 2, 3, 4, 5, 6, 7 \\ - Default & DIR: \texttt{4}\\ - & MRC: \texttt{4}\\ - Description & This is the debug level for BabuDB only. The debug level determines the amount and detail of information written to logfiles. Any debug level includes log messages from lower debug levels. The following log levels exist: -\begin{enumerate} - \item[0 -] fatal errors - \item[1 -] alert messages - \item[2 -] critical errors - \item[3 -] normal errors - \item[4 -] warnings - \item[5 -] notices - \item[6 -] info messages - \item[7 -] debug messages -\end{enumerate} -\end{tabular} - -\subsubsection{\texttt{babudb.localTimeRenew} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positive integer value\\ - Default & \\ - Description & Intervall in milliseconds for synchronizing the ONCRPCServer and ONCRPCClient of the BabuDB replication with the local clock. -\end{tabular} - -\subsubsection{\texttt{babudb.logDir}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & absolute file system path\\ - Default & DIR: \texttt{/var/lib/xtreemfs/dir/db-log}\\ - & MRC: \texttt{/var/lib/xtreemfs/mrc/db-log}\\ - Description & The directory the MRC uses to store database logs. This directory should never be on the same partition as any OSD data, if both services reside on the same machine. Otherwise, deadlocks may occur if the partition runs out of free disk space. -\end{tabular} - -\subsubsection{\texttt{babudb.maxLogfileSize} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positive integer value\\ - Default & DIR: \texttt{16777216}\\ - & MRC: \texttt{16777216}\\ - Description & If automatic checkpointing is enabled, a checkpoint is created when the disk logfile exceedes maxLogfileSize bytes. The value should be reasonable large to keep the checkpointing-rate low. However, it should not be too large as a large disk log increases the recovery time after a crash. -\end{tabular} - -\subsubsection{\texttt{babudb.pseudoSyncWait} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positive integer value\\ - Default & DIR: \texttt{200}\\ - & MRC: \texttt{0}\\ - Description & The BabuDB disk logger can batch multiple operations into a single write+fsync to increase the throughput. This does only work if there are operations executed in parallel by the worker threads. In turn, if you work on a single database it becomes less efficient. To circumvent this problem, BabuDB offers a pseudo-sync mode which is similar to the PostgreSQL write-ahead log (WAL). If pseduoSyncWait is set to a value larger then 0, this pseudo-sync mode is enabled. In this mode, insert operations are acknowledged as soon as they have been executed on the in-memory database index. The disk logger will execute a batch write of up to 500 operations followed by a single sync (see syncMode) every pseudoSyncWait ms. This mode is considerably faster than synchronous writes but you can lose data in case of a crash. In contrast to ASYNC mode the data loss is limited to the operations executed in the last pseudoSyncWait ms. -\end{tabular} - -\subsubsection{\texttt{babudb.repl.backupDir} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a absolute file system path\\ - Default & \\ - Description & DB backup directory needed for the initial loading of a slave BabuDB from the master BabuDB. -\end{tabular} - -\subsubsection{\texttt{babudb.repl.chunkSize} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positive integer greater 0\\ - Default & \\ - Description & At the initial load mechanism the database files will be split into chunks. The size of this chunks in bytes can be defined here. -\end{tabular} - -\subsubsection{\texttt{babudb.repl.participant} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & see description\\ - Default & \\ - Description & The addresses of the hosts running an instance of BabuDB and participating at the replication. The local address is also required in this list. BabuDB will find out on its own, which of the given addresses is the local one.\\ -& Field babudb.repl.participant.i defines the domain name or IP address.\\ -& Field babudb.repl.participant.i.port defines the port.\\ -& \\ -& babudb.repl.participant.0 \\ -& babudb.repl.participant.0.port \\ -& babudb.repl.participant.1 \\ -& babudb.repl.participant.1.port \\ -& ... \\ -& babudb.repl.participant.n \\ -& babudb.repl.participant.n.port \\ -& for n participants. \\ -\end{tabular} - -\subsubsection{\texttt{babudb.repl.sync.n} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positive integer value\\ - Default & \\ - Description & The number of slaves that at least have to be synchronous to the master BabuDB application. To use asynchronous replication, this value has to be set to 0. Otherwise it has to be less or equal to the number of participants. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.authenticationWithoutEncryption} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & \texttt{true} or \texttt{false}\\ - Default & \\ - Description & Flag that determines if authentication should be used without encrypting the connection. For BabuDB replication only. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.enabled} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & \texttt{true} or \texttt{false}\\ - Default & \\ - Description & Options to use a secure connection with SSL authenticaion and optionally encryption for the BabuDB replication. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.service\_creds} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & path to file\\ - Default & \\ - Description & Must be specified if \texttt{babudb.ssl.enabled} is \texttt{true}. Specifies the file containing the service credentials (X.509 certificate and private key). PKCS\#12 and JKS format can be used, set \texttt{babudb.ssl.service\_creds.container} accordingly. This file is used during the SSL handshake to authenticate the service. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.service\_creds.container } \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & \texttt{pkcs12} or \texttt{JKS}\\ - Default & \\ - Description & Must be specified if \texttt{babudb.ssl.enabled} is \texttt{true}. Specifies the file format of the \texttt{babudb.ssl.service\_creds} file. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.service\_creds.pw} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & String\\ - Default & \\ - Description & Must be specified if \texttt{babudb.ssl.enabled} is \texttt{true}. Specifies the password which protects the credentials file \texttt{babudb.ssl.service\_creds}. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.trusted\_certs} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & path to file\\ - Default & \\ - Description & Must be specified if \texttt{babudb.ssl.enabled} is \texttt{true}. Specifies the file containing the trusted root certificates (e.g. CA certificates) used to authenticate clients. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.trusted\_certs.container} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & \texttt{pkcs12} or \texttt{JKS}\\ - Default & \\ - Description & Must be specified if \texttt{babudb.ssl.enabled} is \texttt{true}. Specifies the file format of the \texttt{babudb.ssl.trusted\_certs} file. -\end{tabular} - -\subsubsection{\texttt{babudb.ssl.trusted\_certs.pw} \textit{experimental, optional}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & String\\ - Default & \\ - Description & Must be specified if \texttt{babudb.ssl.enabled} is \texttt{true}. Specifies the password which protects the trusted certificates file \texttt{babudb.ssl.trusted\_certs}. -\end{tabular} - -\subsubsection{\texttt{babudb.sync}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & ASYNC, SYNC\_WRITE\_METADATA, SYNC\_WRITE,\\ - & FDATASYNC or FSYNC\\ - Default & DIR: \texttt{FSYNC}\\ - & MRC: \texttt{ASYNC}\\ - Description & The sync mode influences how operations are commited to the disk log before the operation is acknowledged to the caller. -\begin{itemize} - \item[-]ASYNC mode the writes to the disk log are buffered in memory by the operating system. This is the fastest mode but will lead to data loss in case of a crash, kernel panic or power failure. - \item[-]SYNC\_WRITE\_METADATA opens the file with O\_SYNC, the system will not buffer any writes. The operation will be acknowledged when data has been safely written to disk. This mode is slow but offers maximum data safety. However, BabuDB cannot influence the disk drive caches, this depends on the OS and hard disk model. - \item[-]SYNC\_WRITE similar to SYNC\_WRITE\_METADATA but opens file with O\_DSYNC which means that only the data is commit to disk. This can lead to some data loss depending on the implementation of the underlying file system. Linux does not implement this mode. - \item[-]FDATASYNC is similar to SYNC\_WRITE but opens the file in asynchronous mode and calls fdatasync() after writing the data to disk. - \item[-]FSYNC is similar to SYNC\_WRITE\_METADATA but opens the file in asynchronous mode and calls fsync() after writing the data to disk. -\end{itemize} -For best throughput use ASYNC, for maximum data safety use FSYNC. -\end{tabular} - -\subsubsection{\texttt{babudb.worker.maxQueueLength} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positiv integer value\\ - Default & DIR: \texttt{250}\\ - & MRC: \texttt{250}\\ - Description & If set to a value larger than 0, this is the maximum number of requests which can be in a worker's queue. This value should be used if you have pseudo-synchronous mode enabled to ensure that your queues don't grow until you get an out of memory exception. Can be set to 0 if pseudo-sync mode is disabled. -\end{tabular} - -\subsubsection{\texttt{babudb.worker.numThreads} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC\\ - Values & a positiv integer value\\ - Default & DIR: \texttt{0}\\ - & MRC: \texttt{0}\\ - Description & The number of worker threads to be used for database operations. As BabuDB does not use locking, each database is handled by only one worker thread. If there are more databases than worker threads, the databases are distributed onto the available threads. The number of threads should be set to a value smaller than the number of available cores to reduce overhead through context switches. You can also set the number of worker threads to 0. This will considerably reduce latency, but may also decrease throughput on a multicore system with more than one database. -\end{tabular} - -\subsubsection{\texttt{capability\_secret}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & String \\ - Default & \\ - Description & Defines a shared secret between the MRC and all OSDs. The secret is used by the MRC to sign capabilities, i.e. security tokens for data access at OSDs. In turn, an OSD uses the secret to verify that the capability has been issued by the MRC. -\end{tabular} - -\subsubsection{\texttt{capability\_timeout} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & MRC\\ - Values & seconds\\ - Default & 600\\ - Description & Defines the relative time span for which a capability is valid after having been issued. -\end{tabular} - -\subsubsection{\texttt{checksums.enabled}} -\begin{tabular}{lp{10cm}} - Services & OSD\\ - Values & true, false \\ - Default & false \\ - Description & If set to true, the OSD will calculate and store checksums for newly created objects. Each time a checksummed object is read, the checksum will be verified. -\end{tabular} - -\subsubsection{\texttt{checksums.algorithm}} -\begin{tabular}{lp{10cm}} - Services & OSD\\ - Values & Adler32, CRC32 \\ - Default & Adler32 \\ - Description & Must be specified if \texttt{checksums.enabled} is enabled. This property defines the algorithm used to create OSD checksums. -\end{tabular} - -\subsubsection{\texttt{debug.level} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & 0, 1, 2, 3, 4, 5, 6, 7 \\ - Default & 6 \\ - Description & The debug level determines the amount and detail of information written to logfiles. Any debug level includes log messages from lower debug levels. The following log levels exist: -\begin{enumerate} - \item[0 -] fatal errors - \item[1 -] alert messages - \item[2 -] critical errors - \item[3 -] normal errors - \item[4 -] warnings - \item[5 -] notices - \item[6 -] info messages - \item[7 -] debug messages -\end{enumerate} -\end{tabular} - -\subsubsection{\texttt{debug.categories} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & all, lifecycle, net, auth, stage, proc, db, misc \\ - Default & all \\ - Description & Debug categories determine the domains for which log messages will be printed. By default, there are no domain restrictions, i.e. log messages form all domains will be included in the log. The following categories can be selected: -\begin{itemize} - \item[all -] no restrictions on the category - \item[lifecycle -] service lifecycle-related messages, including startup and shutdown events - \item[net -] messages pertaining to network traffic and communication between services - \item[auth -] authentication and authorization-related messages - \item[stage -] messages pertaining to the flow of requests through the different stages of a service - \item[proc -] messages about the processing of requests - \item[db -] messages that are logged in connection with database accesses - \item[misc -] any other log messages that do not fit in one of the previous categories -\end{itemize} -Note that it is possible to specify multiple categories by means of a comma or space-separated list. -\end{tabular} - -\subsubsection{\texttt{dir\_service.host}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & hostname or IP address \\ - Default & localhost \\ - Description & Specifies the hostname or IP address of the directory service (DIR) at which the MRC or OSD should register. The MRC also uses this Directory Service to find OSDs. If set to \texttt{.autodiscover} the service will use the automatic DIR discovery mechanism (see Sec. \ref{sec:autodiscover}). (Note that the initial `.' is used to avoid ambiguities with hosts called ``autodiscover''.) -\end{tabular} - -\subsubsection{\texttt{dir\_service.port}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & 1 .. 65535 \\ - Default & 32638 \\ - Description & Specifies the port on which the remote directory service is listening. Must be identical to the \texttt{listen\_port} in your directory service configuration. -\end{tabular} - -\subsubsection{\texttt{discover} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR\\ - Values & true, false \\ - Default & true \\ - Description & If set to true the DIR will received UDP broadcasts and advertise itself in response to XtreemFS components using the DIR automatic discovery mechanism. If set to false, the DIR will ignore all UDP traffic. For details see Sec. \ref{sec:autodiscover}. -\end{tabular} - -\subsubsection{\texttt{geographic\_coordinates} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & String \\ - Default & \\ - Description & Specifies the geographic coordinates which are registered with the directory service. Used e.g. by the web console. -\end{tabular} - -\subsubsection{\texttt{hostname} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & String \\ - Default & \\ - Description & If specified, it defines the host name that is used to register the service at the directory service. If not specified, the host address defined in \texttt{listen.address} will be used if specified. If neither \texttt{hostname} nor \texttt{listen.address} are specified, the service itself will search for externally reachable network interfaces and advertise their addresses. -\end{tabular} - -\subsubsection{\texttt{http\_port}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & 1 .. 65535 \\ - Default & 30636 (MRC), 30638 (DIR), 30640 (OSD)\\ - Description & Specifies the listen port for the HTTP service that returns the status page. -\end{tabular} - -\subsubsection{\texttt{listen.address} \textit{optional}} -\begin{tabular}{lp{10cm}} - Services & OSD\\ - Values & IP address \\ - Default & \\ - Description & If specified, it defines the interface to listen on. If not specified, the service will listen on all interfaces (any). -\end{tabular} - -\subsubsection{\texttt{listen.port}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & 1 .. 65535 \\ - Default & DIR: 32638,\\ - & MRC: 32636,\\ - & OSD: 32640 \\ - Description & The port to listen on for incoming ONC-RPC connections (TCP). The OSD uses the specified port for both TCP and UDP. Please make sure to configure your firewall to allow incoming TCP traffic (plus UDP traffic, in case of an OSD) on the specified port. -\end{tabular} - -\subsubsection{\texttt{local\_clock\_renewal}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & milliseconds \\ - Default & 50\\ - Description & Reading the system clock is a slow operation on some systems (e.g. Linux) as it is a system call. To increase performance, XtreemFS services use a local variable which is only updated every \texttt{local\_clock\_renewal} milliseconds. -\end{tabular} - -\subsubsection{\texttt{monitoring}} -\begin{tabular}{lp{10cm}} - Services & DIR\\ - Values & true, false \\ - Default & false\\ - Description & Enables the built-in monitoring tool in the directory service. If enabled, the DIR will send alerts via emails if services are crashed (i.e. do not send heartbeat messages). No alerts will be sent for services which signed-off at the DIR. To enable monitoring you also need to configure \texttt{email.receiver}, \texttt{email.program}. In addition, you may want to change the values for \texttt{email.sender}, \texttt{email.programm}, \texttt{service\_timeout\_s} and \texttt{max\_warnings}. -\end{tabular} - -\subsubsection{\texttt{monitoring.email.programm}} -\begin{tabular}{lp{10cm}} - Services & DIR\\ - Values & path \\ - Default & \texttt{/usr/sbin/sendmail} \\ - Description & Location of the \texttt{sendmail} binary to be used for sending alert mails. See \texttt{monitoring}. -\end{tabular} - -\subsubsection{\texttt{monitoring.email.receiver}} -\begin{tabular}{lp{10cm}} - Services & DIR\\ - Values & email address \\ - Default & - \\ - Description & Email address of recipient of alert emails. See \texttt{monitoring}. -\end{tabular} - -\subsubsection{\texttt{monitoring.email.sender}} -\begin{tabular}{lp{10cm}} - Services & DIR\\ - Values & email address \\ - Default & ``XtreemFS DIR service ''\\ - Description & Email address and sender name to use for sending alert mails. See \texttt{monitoring}. -\end{tabular} - -\subsubsection{\texttt{monitoring.max\_warnings}} -\begin{tabular}{lp{10cm}} - Services & DIR\\ - Values & 0..N \\ - Default & 1\\ - Description & Number of alert mails to send for a single service which has crashed/disconnected. Each alert mail contains a summary of all crashed/disconnected services. See \texttt{monitoring}. -\end{tabular} - -\subsubsection{\texttt{no\_atime}} -\begin{tabular}{lp{10cm}} - Services & MRC\\ - Values & true, false \\ - Default & true\\ - Description & The POSIX standard defines that the atime (timestamp of last file access) is updated each time a file is opened, even for read. This means that there is a write to the database and hard disk on the MRC each time a file is read. To reduce the load, many file systems (e.g. ext3) including XtreemFS can be configured to skip those updates for performance. It is strongly suggested to disable atime updates by setting this parameter to true. -\end{tabular} - -\subsubsection{\texttt{object\_dir}} -\begin{tabular}{lp{10cm}} - Services & OSD\\ - Values & absolute file system path to a directory\\ - Default & \texttt{/var/lib/xtreemfs/osd/}\\ - Description & The directory in which the OSD stores the objects. This directory should never be on the same partition as any DIR or MRC database, if both services reside on the same machine. Otherwise, deadlocks may occur if the partition runs out of free disk space! -\end{tabular} - -\subsubsection{\texttt{osd\_check\_interval}} -\begin{tabular}{lp{10cm}} - Services & MRC\\ - Values & seconds \\ - Default & 300\\ - Description & The MRC regularly asks the directory service for suitable OSDs to store files on (see OSD Selection Policy, Sec. \ref{sec:osd_policies}). This parameter defines the interval between two updates of the list of suitable OSDs. -\end{tabular} - -\subsubsection{\texttt{remote\_time\_sync}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & milliseconds \\ - Default & 30,000\\ - Description & MRCs and OSDs all synchronize their clocks with the directory service to ensure a loose clock synchronization of all services. This is required for leases to work correctly. This parameter defines the interval in milliseconds between time updates from the directory service. -\end{tabular} - -\subsubsection{\texttt{report\_free\_space}} -\begin{tabular}{lp{10cm}} - Services & OSD\\ - Values & true, false\\ - Default & true\\ - Description & If set to true, the OSD will report its free space to the directory service. Otherwise, it will report zero, which will cause the OSD not to be used by the OSD Selection Policies (see Sec. \ref{sec:osd_policies}). -\end{tabular} - -\subsubsection{\texttt{service\_timeout\_s}} -\begin{tabular}{lp{10cm}} - Services & DIR\\ - Values & 0..N seconds \\ - Default & 300 \\ - Description & Time to wait for a heartbeat message before sending an alert email. See \texttt{monitoring}. -\end{tabular} - -\subsubsection{\texttt{ssl.enabled}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & true, false \\ - Default & false \\ - Description & If set to true, the service will use SSL to authenticate and encrypt connections. The service will not accept non-SSL connections if \texttt{ssl.enabled} is set to true. -\end{tabular} - -\subsubsection{\texttt{ssl.grid\_ssl}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & true, false \\ - Default & false \\ - Description & In this mode the services and client will only use SSL for mutual authentication with X.509 certificates (SSL handshake). After successful authentication the communication is via plain TCP. This means that there is no encryption and signing of records! This mode is comparable to HTTP connections with Digest authentication. It should be used when certificate based authentication is required but performance is more important than security, which is usually true in GRID installations. If this mode is enabled, all client tools must be used with the \texttt{oncrpcg://} scheme prefix. -\end{tabular} - -\subsubsection{\texttt{ssl.service\_creds}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & path to file\\ - Default & DIR: \texttt{/etc/xos/xtreemfs/truststore/certs/ds.p12}, \\ - & MRC: \texttt{/etc/xos/xtreemfs/truststore/certs/mrc.p12}, \\ - & OSD: \texttt{/etc/xos/xtreemfs/truststore/certs/osd.p12}\\ - Description & Must be specified if \texttt{ssl.enabled} is enabled. Specifies the file containing the service credentials (X.509 certificate and private key). PKCS\#12 and JKS format can be used, set \texttt{ssl.service\_creds.container} accordingly. This file is used during the SSL handshake to authenticate the service. -\end{tabular} - -\subsubsection{\texttt{ssl.service\_creds.container}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & \texttt{pkcs12} or \texttt{JKS}\\ - Default & \texttt{pkcs12}\\ - Description & Must be specified if \texttt{ssl.enabled} is enabled. Specifies the file format of the \texttt{ssl.service\_creds} file. -\end{tabular} - -\subsubsection{\texttt{ssl.service\_creds.pw}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & String\\ - Default & \\ - Description & Must be specified if \texttt{ssl.enabled} is enabled. Specifies the password which protects the credentials file \texttt{ssl.service\_creds}. -\end{tabular} - -\subsubsection{\texttt{ssl.trusted\_certs}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & path to file\\ - Default & \texttt{/etc/xos/xtreemfs/truststore/certs/xosrootca.jks}\\ - Description & Must be specified if \texttt{ssl.enabled} is enabled. Specifies the file containing the trusted root certificates (e.g. CA certificates) used to authenticate clients. -\end{tabular} - -\subsubsection{\texttt{ssl.trusted\_certs.container}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & \texttt{pkcs12} or \texttt{JKS}\\ - Default & \texttt{JKS}\\ - Description & Must be specified if \texttt{ssl.enabled} is enabled. Specifies the file format of the \texttt{ssl.trusted\_certs} file. -\end{tabular} - -\subsubsection{\texttt{ssl.trusted\_certs.pw}} -\begin{tabular}{lp{10cm}} - Services & DIR, MRC, OSD\\ - Values & String\\ - Default & \\ - Description & Must be specified if \texttt{ssl.enabled} is enabled. Specifies the password which protects the trusted certificates file \texttt{ssl.trusted\_certs}. -\end{tabular} - -\subsubsection{\texttt{startup.wait\_for\_dir}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & 0..N seconds\\ - Default & 30 \\ - Description & Time to wait for the DIR to become available during start up of the MRC and OSD. If the DIR does not respond within this time the MRC or OSD will abort startup. -\end{tabular} - -\subsubsection{\texttt{uuid}} -\begin{tabular}{lp{10cm}} - Services & MRC, OSD\\ - Values & String, but limited to alphanumeric characters, - and . \\ - Default & \\ - Description & Must be set to a unique identifier, preferably a UUID according to RFC 4122. UUIDs can be generated with \texttt{uuidgen}. Example: \texttt{eacb6bab-f444-4ebf-a06a-3f72d7465e40}. -\end{tabular} - -\section{Execution and Monitoring} -This section describes how to execute and monitor XtreemFS services. - -\subsection{Starting and Stopping the XtreemFS services} -\label{sec:startstopservice} - -If you installed a \emph{pre-packaged release} you can start, stop and restart the services with the \texttt{init.d}\index{init.d} scripts: - \begin{verbatim} - $> /etc/init.d/xtreemfs-ds start - $> /etc/init.d/xtreemfs-mrc start - $> /etc/init.d/xtreemfs-osd start - \end{verbatim} -or - \begin{verbatim} - $> /etc/init.d/xtreemfs-ds stop - $> /etc/init.d/xtreemfs-mrc stop - $> /etc/init.d/xtreemfs-osd stop - \end{verbatim} - - -To run init.d scripts, root permissions are required. \textbf{Note} that the Directory Service must be started first, since a running Directory Service is required when starting an MRC or OSD. Once a Directory Service as well as at least one OSD and MRC are running, XtreemFS is operational. - -Alternatively, you can use the \texttt{xctl} tool to start and stop the services. Config files are read from \texttt{./etc/xos/xtreemfs} unless another path is specified with \texttt{-c }. - - \begin{verbatim} - $> bin/xctl --start-dir - $> bin/xctl --start-mrc - $> bin/xctl --start-osd - \end{verbatim} -or - \begin{verbatim} - $> bin/xctl --stop-osd - $> bin/xctl --stop-mrc - $> bin/xctl --stop-dir - \end{verbatim} - -The servers will be executed under the user ID of the user who called the xctl script. - -\subsection{Web-based Status Page} - -\begin{figure}[h] - \centering - \resizebox{0.65\linewidth}{!}{\includegraphics{images/screenshot_status.png}} - % screenshot_status.png: 817x847 pixel, 72dpi, 28.82x29.88 cm, bb=0 0 817 847 - \caption{OSD status web page} - \label{fig:screenshot_status} -\end{figure} - -Each XtreemFS service can generate an HTML status page\index{Status Page}, which displays runtime information about the service (Fig. \ref{fig:screenshot_status}). The HTTP server that generates the status page runs on the port defined by the configuration property \texttt{http\_port}; default values are 30636 for MRCs, 30638 for Directory Services, and 30640 for OSDs. - -The status page of an MRC can e.g.\ be shown by opening - -\texttt{http://my-mrc-host.com:30636/} - -with a common web browser. If you set an admin password in the service's configuration, you will be asked for authentication when accessing the status page. Use \texttt{admin} as username. - -\subsection{DIR Service Monitoring} - -The directory service has a built-in notification system that can send alert emails if a service fails to send heartbeat messages for some time. The monitoring can be enabled in the DIR configuration by setting \texttt{monitoring = true}. - - -\section{Troubleshooting} - -Various issues may occur when attempting to set up an XtreemFS server component. If a service fails to start, the log file often reveals useful information. Server log files are located in \texttt{/var/log/xtreemfs}. Note that you can restrict granularity and categories of log messages via the configuration properties \texttt{debug.level} and \texttt{debug.categories} (see Sec.\ \ref{sec:config}). - -If an error occurs, please check if one of the following requirements is not met: -\begin{itemize} - \item You have root permissions when starting the service. Running the \texttt{init.d} scripts requires root permissions. However, the services themselves are started on behalf of a user \textit{xtreemfs}. - \item DIR has been started before MRC and OSD. Problems may occur if a script starts multiple services as background processes. - \item There are no firewall restrictions that keep XtreemFS services from communicating with each other. The default ports that need to be open are: 32636 (MRC, TCP), 32638 (DIR, TCP), and 32640 (OSD, TCP \& UDP). - \item The MRC database version is correct. In case of an outdated database version, the \texttt{xtfs\_mrcdbtool} commands of the old and new XtreemFS version can dump and restore the database, respectively (see Sec.\ \ref{sec:mrcdbtools}). - \item A network interface is available on the host. It may be either bound to an IPv4 or IPv6 address. -\end{itemize} - - -\chapter{XtreemFS Client} - -The XtreemFS client is needed to access an XtreemFS installation from a remote machine. This chapter describes how to use the XtreemFS client in order to work with XtreemFS like a local file system. - -\section{Installation} - -There are two different installation sources for the XtreemFS Client: \emph{pre-packaged releases} and \emph{source tarballs}. - -Note that the source tarball contains the complete distribution of XtreemFS, which also includes server and tools. Currently, binary distributions of the client are only available for Linux and Windows. - -\subsection{Prerequisites} - -To install XtreemFS on Linux, please make sure that FUSE 2.6 or newer, openSSL 0.9.8 or newer and a Linux 2.6 kernel are available on your system. For an optimal performance, we suggest to use FUSE 2.8 with a kernel version 2.6.26 or newer. - -To build the Linux XtreemFS Client from the source distribution, you also need the openSSL headers (e.g.\ openssl-devel package), python $\geq$ 2.4, and gcc-c++ $\geq$ 4.2. - -\subsection{Installing from Pre-Packaged Releases} - -On RPM-based distributions (RedHat, Fedora, SuSE, Mandriva, XtreemOS) you can install the package with - -\begin{verbatim} -$> rpm -i xtreemfs-client-1.2.x.rpm -\end{verbatim} - - -For Debian-based distributions, please use the \texttt{.deb} package provided and install it with - -\begin{verbatim} -$> dpkg -i xtreemfs-client-1.2.x.deb -\end{verbatim} - - -For Windows, please use the \emph{.msi} installer that will guide you through the installation process. - -\subsection{Installing from Sources} - -Extract the tarball with the sources. Change to the top level directory and execute - -\begin{verbatim} -$> make client -\end{verbatim} - -This will build the XtreemFS client and non-Java-based tools. Note that the following third-party packages are required on Linux: - -\begin{verbatim} -python >= 2.4 -gcc-c++ >= 4 -fuse >= 2.6 -fuse-devel >= 2.6 (RPM-based distros) -libfuse-dev >= 2.6 (DEB-based distros) -libopenssl-devel >= 0.8 (RPM-based distros) -libssl-dev >= 0.9 (DEB-based distros) -\end{verbatim} - -When done, execute - -\begin{verbatim} -$> sudo make install-client -\end{verbatim} - -to complete the installation of XtreemFS. - - -\section{Volume Management} - -Like many other file systems, XtreemFS supports the concept of volumes. A volume can be seen as a container for files and directories with its own policy settings, e.g.\ for access control and replication. Before being able to access an XtreemFS installation, at least one volume needs to be set up. This section describes how to deal with volumes in XtreemFS. - -\subsection{Creating Volumes} -\label{sec:create_volume} - -Volumes can be created with the \texttt{mkfs.xtreemfs} command line utility. Please see \texttt{man mkfs.xtreemfs} for a full list of options and usage\index{Create Volume}\index{Volume!Create}\index{xtfs\_mkvol}\index{mkfs.xtreemfs}. - -When creating a volume, it is recommended to specify the access control policy (see Sec. \ref{sec:access_policies}). If not specified, POSIX permissions/ACLs will be chosen by default. Unlike most other policies, access control policies cannot be changed afterwards. - -In addition, it is recommended to set a default striping policy (see Sec. \ref{sec:striping_policies}). If no per-file or per-directory default striping policy overrides the volume's default striping policy, the volume's policy is assigned to all newly created files. If no volume policy is explicitly defined when creating a volume, a RAID0 policy with a stripe size of 128kB and a width of 1 will be used as the default policy. - -A volume with a POSIX permission model, a stripe size of 256kB and a stripe width of 1 (i.e.\ all stripes will reside on the same OSD) can be created as follows: - - -\begin{verbatim} -$> mkfs.xtreemfs -a POSIX -p RAID0 -s 256 -w 1 \ - my-mrc-host.com:32636/myVolume -\end{verbatim} - -Creating a volume may require privileged access, which depends on whether an administrator password is required by the MRC. To pass an administrator password, add \texttt{----password } to the \texttt{mkfs.xtreemfs} command. - -For a complete list of parameters, please refer to the \texttt{mkfs.xtreemfs} man page. - -\subsection{Deleting Volumes} - -Volumes can be deleted with the \texttt{rmfs.xtreemfs} tool. Note that deleting a volume implies that \emph{any data, i.e.\ all files and directories on the volume are deleted}! Please see \texttt{man rmfs.xtreemfs} for a full list of options and usage\index{Delete Volume}\index{Volume!Delete}\index{xtfs\_rmvol}\index{rmfs.xtreemfs}. - -The volume \texttt{myVolume} residing on the MRC \texttt{my-mrc-host.com:32636} can e.g.\ be deleted as follows: - -\begin{verbatim} -$> rmfs.xtreemfs my-mrc-host.com:32636/myVolume -\end{verbatim} - -Volume deletion is restricted to volume owners and privileged users. Similar to \texttt{xtfs\_mkvol}, an administrator password can be specified if required. - -\subsection{Listing all Volumes} - -A list of all volumes can be displayed with the \texttt{lsfs.xtreemfs} tool. All volumes hosted by the MRC \texttt{my-mrc-host.com:32636} can be listed as follows: - -\begin{verbatim} -$> lsfs.xtreemfs my-mrc-host.com:32636 -\end{verbatim} - -Adding the \texttt{--l} flag will result in more details being shown. - - -\section{Accessing Volumes} -\label{sec:mount_vol} - -Once a volume has been created, it needs to be mounted in order to be accessed. - -\subsection{Mounting and Un-mounting} - -Before mounting XtreemFS volumes on a Linux machine, please ensure that the FUSE kernel module is loaded.\index{Volume!Mount}\index{Mount}\index{xtfs\_mount}\index{mount.xtreemfs} Please check your distribution's manual to see if users must be in a special group (e.g. \texttt{trusted} in openSuSE) to be allowed to mount FUSE file systems. - - -\begin{verbatim} -$> su -Password: -#> modprobe fuse -#> exit -\end{verbatim} - - -Volumes are mounted with the \texttt{xtfs\_mount} command: - - -\begin{verbatim} -$> mount.xtreemfs remote.dir.machine/myVolume /xtreemfs -\end{verbatim} - - -\texttt{remote.dir.machine} describes the host with the Directory Service at which the volume is registered; \texttt{myVolume} is the name of the volume to be mounted. \texttt{/xtreemfs} is the directory on the local file system to which the XtreemFS volume will be mounted. For more options, please refer to \texttt{man mount.xtreemfs}. - -Please be aware that the Directory Service URL needs to be provided when mounting a volume, while MRC URLs are used to create volumes. - -When mounting a volume, the client will immediately go into background and won't display any error messages. Use the \texttt{-f} option to prevent the mount process from going into background and get all error messages printed to the console. - -To check that a volume is mounted, use the \texttt{mount} command. It outputs a list of all mounts in the system. XtreemFS volumes are listed as \texttt{type fuse}: - -\begin{verbatim} -xtreemfs on /xtreemfs type fuse (rw,nosuid,nodev,user=userA) -\end{verbatim} - -Volumes are unmounted with the \texttt{umount.xtreemfs} tool\index{Volume!Un-mount}\index{Unmount}\index{xtfs\_umount}\index{umount.xtreemfs}: - -\begin{verbatim} -$> umount.xtreemfs /xtreemfs -\end{verbatim} - -\subsection{Mount Options} - -Access to a FUSE mount is usually restricted to the user who mounted the volume. To allow the root user or any other user on the system to access the mounted volume, the FUSE options \texttt{-o allow\_root} and \texttt{-o allow\_other} can be used with \texttt{xtfs\_mount}. They are, however, mutually exclusive. In order to use these options, the system administrator must create a FUSE configuration file \texttt{/etc/fuse.conf} and add a line\index{allow\_others option}\index{allow\_root option}\index{user\_allow\_other option} \texttt{user\_allow\_other}. - -By default, the local system cache on the client machine will be used to speed up read access to XtreemFS. In particular, using the cache as a local buffer is necessary to support the \texttt{mmap} system call, which - amongst others - is required to execute applications on Linux. On the other hand, using buffered I/O may adversely affect throughput when writing large files, as FUSE $\leq$ 2.7 splits up large writes into multiple individual 4k (page size) writes. In addition, it limits the consistency model of client caches to ``close-to-open'', which is similar to the model provided by NFS. Buffered I/O can be switched off by adding the \texttt{-o direct\_io} parameter. The parameter effects that all read and write operations are directed to their OSDs instead of being served from local caches. - - -\section{Troubleshooting} - -Different kinds of problems may occur when trying to create, mount or access files in a volume. If no log file was specified, the client will create a logfile called \texttt{mount.xtreemfs.log} in the current working direcory. This logile is only created in case of an error message. In case no useful error message is printed on the console or in the logfile, it may help to enable client-side log output. This can be done as follows: - -\begin{verbatim} -$> mount.xtreemfs -f -d INFO remote.dir.machine/myVolume /xtreemfs -\end{verbatim} - -The following list contains the most common problems and their solutions. - -\begin{tabular}{lp{10cm}} - \textbf{Problem} & \textbf{A volume cannot be created or mounted.} \\ - \textbf{Solution} & Please check your firewall settings on the server side. Are all ports accessible? The default ports are 32636 (MRC), 32638 (DIR), and 32640 (OSD). - - In case the XtreemFS installation has been set up behind a NAT, it is possible that services registered their NAT-internal network interfaces at the DIR. In this case, clients cannot properly resolve server addresses, even if port forwarding is enabled. Please check the \emph{Address Mappings} section on the DIR status page to ensure that externally reachable network interfaces have been registered for the your servers' UUIDs. If this is not the case, it is possible to explicitly specify the network interfaces to register via the \texttt{hostname} property (see Sec.\ \ref{sec:config}). -\end{tabular} - -\begin{tabular}{lp{10cm}} - \textbf{Problem} & \textbf{When trying to mount a volume, \texttt{ONC-RPC exception: system error} appears on the console.}\\ - \textbf{Solution} & The most common reason are incompatible protocol versions in client and server. Please make sure that client and server have the same release version numbers. They can be determined as follows: - \begin{itemize} - \item[Server:] check the status pages. Alternatively, execute \texttt{rpm -q xtreemfs-server} on RPM-based distributions, or \texttt{dpkg -l | grep xtreemfs-server} on DEB-based distributions. - \item[Client:] execute \texttt{rpm -q xtreemfs-client} on RPM-based distributions, or \texttt{dpkg -l | grep xtreemfs-client} on DEB-based distributions. - \end{itemize} -\end{tabular} - -\begin{tabular}{lp{10cm}} - \textbf{Problem} & \textbf{An error occurs when trying to access a mounted volume.} \\ - \textbf{Solution} & Please make sure that you have sufficient access rights to the volume root. Superusers and volume owners can change these rights via \texttt{chmod }. If you try to access a mount point to which XtreemFS was mounted by a different user, please make sure that the volume is mounted with \texttt{xtfs\_mount -o allow\_other \dots}. -\end{tabular} - -\begin{tabular}{lp{10cm}} - \textbf{Problem} & \textbf{An I/O error occurs when trying to create new files.} \\ - \textbf{Solution} & In general, you can check the contents of the client log file to see the error which caused the I/O error. A common reason for this problem is that no OSD could be assigned to the new file. Please check if suitable OSDs are available for the volume. There are two alternative ways to do this: - \begin{itemize} - \item Open the MRC status page. It can be accessed via \texttt{http://:30636} in the default case. For each volume, a list of suitable OSDs is shown there. - \item Execute \texttt{getfattr -n xtreemfs.usable\_osds ----only-values }. - \end{itemize} - There may be different reasons for missing suitable OSDs: - \begin{itemize} - \item One or more OSDs failed to start up. Please check the log files and status pages of all OSDs to ensure that they are running. - \item One or more OSDs failed to register or regularly report activity at the DIR. Please check the DIR status page to ensure that all OSDs are registered and active. - \item There are no OSDs with a sufficient amount of free disk space. Please check the OSD status page to obtain information about free disk space. - \end{itemize} -\end{tabular} - -\begin{tabular}{lp{10cm}} - \textbf{Problem} & \textbf{An I/O error occurs when trying to access an existing file.}\\ - \textbf{Solution} & Please check whether all OSDs assigned to the file are running and reachable. This can be done as follows: - \begin{enumerate} - \item Get the list of all OSDs for the file: \texttt{getfattr -n xtreemfs.locations ----only-values }. - \item Check whether the OSDs in (one of) all replicas in the list are running and reachable, e.g.\ by opening the status pages or via \texttt{telnet }. - \end{enumerate} -\end{tabular} - - -\chapter{XtreemFS Tools} - -To make use of most of the advanced XtreemFS features, XtreemFS offers a variety of different tools. There are tools that support administrators with the maintenance of an XtreemFS installation, as well as tools for controlling features like replication and striping. An overview of the different tools with descriptions of how to use them are provided in the following. - -\section{Installation} - -When installing the XtreemFS tool suite, you can choose from two different installation sources: you can download one of the \emph{pre-packaged releases} that we create for most Linux distributions or you can install directly from the \emph{source tarball}. - -Note that the source tarball contains the complete distribution of XtreemFS, which also includes client and server. Currently, binary distributions of the tools are only available for Linux. - -\subsection{Prerequisites} - -For the pre-packaged release, you will need Sun Java JRE 1.6.0 or newer to be installed on the system. - -When building XtreemFS directly from the source, you need a Sun Java JDK 1.6.0 or newer, Ant 1.6.5 or newer and gmake. - -\subsection{Installing from Pre-Packaged Releases} - -On RPM-based distributions (RedHat, Fedora, SuSE, Mandriva, XtreemOS) you can install the package with - -\begin{verbatim} -$> rpm -i xtreemfs-tools-1.2.x.rpm xtreemfs-backend-1.2.x.rpm -\end{verbatim} - - -For Debian-based distributions, please use the \texttt{.deb} package provided and install it with - -\begin{verbatim} -$> dpkg -i xtreemfs-tools-1.2.x.deb xtreemfs-backend-1.2.x.deb -\end{verbatim} - -To install the tools, the following package is required: \texttt{jre} $\geq$ 1.6.0 for RPM-based releases, \texttt{java6-runtime} for Debian-based releases. If you already have a different distribution of \texttt{Java6} on your system, you can alternatively install the XtreemFS tools packages as follows: - -\begin{verbatim} -$> rpm -i --nodeps xtreemfs-tools-1.2.x.rpm \ - xtreemfs-backend-1.2.x.rpm -\end{verbatim} - -on RPM-based distributions, - -\begin{verbatim} -$> dpkg -i --ignore-depends java6-runtime \ - xtreemfs-tools-1.2.x.deb xtreemfs-backend-1.2.x.deb -\end{verbatim} - -on Debian-based distributions. - -To ensure that your local \texttt{Java6} installation is used, is necessary to set the \texttt{JAVA\_HOME} environment variable to your \texttt{Java6} installation directory, e.g.\ - -\begin{verbatim} -$> export JAVA_HOME=/usr/java6 -\end{verbatim} - - -All XtreemFS tools will be installed to \texttt{/usr/bin}. - -\subsection{Installing from Sources} - -Extract the tarball with the sources. Change to the top level directory and execute - -\begin{verbatim} -$> make server -\end{verbatim} - -When done, execute - -\begin{verbatim} -$> sudo make install-tools -\end{verbatim} - -to complete the installation. Note that this will also install the XtreemFS client and servers. - -\section{Maintenance Tools} - -This section describes the tools that support administrators in maintaining an XtreemFS installation. - -\subsection{MRC Database Conversion} -\label{sec:mrcdbtools} - -The database format in which the MRC stores its file system metadata on disk may change with future XtreemFS versions, even though we attempt to keep it as stable as possible. To ensure that XtreemFS server components may be updated without having to create and restore a backup of the entire installation, it is possible to convert an MRC database to a newer version by means of a version-independent XML representation. - -This is done as follows: -\begin{enumerate} - \item Create an XML representation of the old database with the old MRC version. - \item Update the MRC to the new version. - \item Restore the database from the XML representation. -\end{enumerate} - -\texttt{xtfs\_mrcdbtool} is a tool that is capable of doing this. It can create an XML dump of an MRC database as follows: - -\begin{verbatim} -$> xtfs_mrcdbtool -mrc oncrpc://my-mrc-host.com:32636 \ - dump /tmp/dump.xml -\end{verbatim} - -A file \texttt{dump.xml} containing the entire database content of the MRC running on \texttt{my-mrc-host.com:32636} is written to \texttt{/tmp/dump.xml}. For security reasons, the dump file will be created locally on the MRC host. To make sure that sufficient write permissions are granted to create the dump file, we therefore recommend to specify an absolute dump file path like \texttt{/tmp/dump.xml}. - -A database dump can be restored from a dump file as follows: - -\begin{verbatim} -$> xtfs_mrcdbtool -mrc oncrpc://my-mrc-host.com:32636 \ - restore /tmp/dump.xml -\end{verbatim} - -This will restore the database stored in \texttt{/tmp/dump.xml} at \texttt{my-mrc-host.com}. Note that for safety reasons, it is only possible to restore a database from a dump if the database of the running MRC does not have any content. To restore an MRC database, it is thus necessary to delete all MRC database files before starting the MRC. - -Please be aware that dumping and restoring databases may both require privileged access rights if the MRC requires an administrator password. The password can be specified via \texttt{--p}; for further details, check the \texttt{xtfs\_mrcdbtool} man page. - -\subsection{Scrubbing and Cleanup} - -In real-world environments, errors occur in the course of creating, modifying or deleting files. This can cause corruptions of file data or metadata. Such things happen e.g.\ if the client is suddenly terminated, or loses connection with a server component. There are several such scenarios: if a client writes to a file but does not report file sizes received from the OSD back to the MRC, inconsistencies between the file size stored in the MRC and the actual size of all objects in the OSD will occur. If a client deletes a file from the directory tree, but cannot reach the OSD, orphaned objects will remain on the OSD. If an OSD is terminated during an ongoing write operation, file content will become corrupted. - -In order to detect and, if possible, resolve such inconsistencies, tools for scrubbing and OSD cleanup exist. To check the consistency of file sizes and checksums, the following command can be executed: - -\begin{verbatim} -$> xtfs_scrub -dir oncrpc://my-dir-host.com:32638 myVolume -\end{verbatim} - -This will scrub each file in the volume \texttt{myVolume}, i.e.\ check file size consistency and set the correct file size on the MRC, if necessary, and check whether an invalid checksum in the OSD indicates a corrupted file content. The \texttt{-dir} argument specifies the directory service that will be used to resolve service UUIDs. Please see \texttt{man xtfs\_scrub} for further details. - -A second tool scans an OSD for orphaned objects, which can be used as follows: - -\begin{verbatim} -$> xtfs_cleanup -dir oncrpc://localhost:32638 \ - uuid:u2i3-28isu2-iwuv29-isjd83 -\end{verbatim} -The given UUID identifies the OSD to clean and will be resolved by the -directory service defined by the \texttt{-dir} option (localhost:32638 in this example). -The process will be started and can be stopped by setting the option -\texttt{-stop}. To watch the cleanup progress use option \texttt{-i} for the -interactive mode. For further information see \texttt{man xtfs\_cleanup}. - -\subsection{Setting the Service Status} - -The service's status field is shown in the service status page as \texttt{static.status}. The status can be 0 (online), 1 (marked for removal) and 2 (dead/removed). Status 0 (online) is the regular status for all services, even if they are temporarily offline. Status 2 (dead/removed) marks an OSD as permanently failed and the scrubber will removed replicas and files from these OSDs. Status 1 (marked for removal) is for future use. - -The status can be set with the \texttt{xtfs\_chstatus} tool: - -\begin{verbatim} -$> xtfs_chstatus -dir oncrpc://localhost:32638 \ - u2i3-28isu2-iwuv29-isjd83 online -\end{verbatim} - -This command sets the status of the service with the UUID \texttt{u2i3-28isu2-iwuv29-isjd83} to online. - -\section{User Tools} - -Besides administrator tools, a variety of tools exist that make advanced XtreemFS features accessible to users. These tools will be described in this section. - -\subsection{Showing XtreemFS-specific File Info} - -In addition to the regular file system information provided by the \texttt{stat} Linux utility, XtreemFS provides the \texttt{xtfs\_stat}\index{xtfs\_stat}\index{XtreemFS stat} tool which displays XtreemFS specific information for a file or directory. - - -\begin{verbatim} -$> cd /xtreemfs -$> echo 'Hello World' > test.txt -$> xtfs_stat test.txt -\end{verbatim} - - -will produce output similar to the following: - - -\begin{verbatim} -filename test.txt -XtreemFS URI oncrpc://localhost/test/test.txt -XtreemFS fileID 41e9a04d-0b8b-467b-94ef-74ade02a2dc9:6 -object type regular file -owner stender -group users -read-only false - -XtreemFS replica list - list version 0 - replica update policy - ----------------------------- - replica 1 SP STRIPING_POLICY_RAID0, 128kb, 1 - replica 1 OSDs [{address=127.0.0.1:32640, uuid=OSD1}] - replica 1 repl. flags 0x1 - ----------------------------- -\end{verbatim} - - -The fileID \index{fileID} is the unique identifier of the file used on the OSDs to identify the file's objects. The owner/group fields are shown as reported by the MRC, you may see other names on your local system if there is no mapping (i.e.\ the file owner does not exist as a user on your local machine). -Finally, the XtreemFS replica list shows the striping policy of the file, the number of replicas and for each replica, the OSDs used to store the objects. - - -\subsection{Changing Striping Policies} - -Currently, it is not possible to change the striping policy of an existing file, as this would require rearrangements and transfers of data between OSDs. However, it is possible to define individual striping policies for files that will be created in the future. This can be done by changing the default striping policy of the parent directory or volume. - -XtreemFS provides the \texttt{xtfs\_sp}\index{xtfs\_sp}\index{XtreemFS striping policy tool} tool. The tool can be used to change the striping policy that will be assigned to newly created files as follows: - -\begin{verbatim} -$> xtfs_sp --set -p RAID0 -w 4 -s 256 /xtreemfs/dir -\end{verbatim} - -This will cause a RAID0 striping policy with 256kB stripe size and four OSDs to be assigned to all newly created files in \texttt{/xtreemfs/dir}. - -The tool can display the default striping policy of a volume or directory as follows: - -\begin{verbatim} -$> xtfs_sp --get /xtreemfs/dir -\end{verbatim} - -This will result in output similar to the following: - -\begin{verbatim} -file: /xtreemfs/dir -policy: STRIPING_POLICY_RAID0 -stripe-size: 4 -width (kB): 256 -\end{verbatim} - -When creating a new file, XtreemFS will first check whether a default striping policy has been assigned to the file's parent directory. If this is not the case, the default striping policy for the volume will be used as the striping policy for the new file. Changing a volume's or directory's default striping policy requires superuser access rights, or ownership of the volume or directory. - - -\subsection{Read-Only Replication}\index{Replication}\index{Replication!read-only}\index{Read-only Replication} -\label{sec:roreplication} - -Replication is one of core features of XtreemFS. A replica can be seen as a (not essentially complete) copy of a file's content on a remote (set of) OSD(s). Replication is handled among the XtreemFS OSDs, which makes it completely transparent to client applications. - -So far, XtreemFS only supports \emph{read-only replication}. Read-only replication requires files to be immutable (i.e.\ 'read-only'), which implies that once a file has been replicated, it can no longer be modified. The benefit of read-only replicas is that XtreemFS can guarantee sequential replica consistency at a low cost; since files are no longer modified when replicated, no overhead is caused to ensure replica consistency. - -When replicating a file, the first step is to make the file read-only, which can be done as follows: - -\begin{verbatim} -$> xtfs_repl --set_readonly local-path-of-file -\end{verbatim} - -Once a file has been marked as read-only, replicas can be added. The tool supports different replica creation modes. The automatic mode retrieves a list of OSDs from the MRC and chooses the best OSD according to the current replica selection policy. You can also select a specific OSD by specifying its UUID on the command line. - -Newly created replicas are initially empty, which means that no file content has been copied from other non-empty replicas. Yet, they can be immediately used by applications. If a replica does not have the requested data, it fetches the data from a remote replica and saves it locally for future requests (on-demand replication). Such partial replicas help to save network bandwidth and disk usage. Alternatively, replicas can be triggered to fetch the whole data from remote replicas in the background, regardless of client requests (background replication). - -Moreover, XtreemFS supports different transfer strategies which has a big impact on the speed of the replication and the order in which objects are fetched. A transfer strategy must be chosen for each replica. - -A replica can e.g.\ created as follows: - -\begin{verbatim} -$> xtfs_repl --add_auto --full --strategy random \ - /xtreemfs/file.txt -\end{verbatim} - -This command creates a new replica with an automatically-selected set of OSDs (for details, see Sec.\ \ref{sec:osd_policies}, \ref{sec:osd_select_policy}). The switch \texttt{----full} indicates that background replication is desired; otherwise, replicas are filled on demand, which means that they remain partial replicas until the application accesses all the objects of the replica. - -To list all replicas and OSDs of the file use: - -\begin{verbatim} -$> xtfs_repl -l /xtreemfs/file.txt -\end{verbatim} - -This generates output similar to this: - -\begin{verbatim} -File is read-only. -REPLICA 1: - Striping Policy: STRIPING_POLICY_RAID0 - Stripe-Size: 128,00 kB - Stripe-Width: 1 (OSDs) - Replication Flags: - Complete: false - Replica Type: partial - Transfer-Strategy: random - OSDs: - [Head-OSD] UUID: osd1, URL: /127.0.0.1:32641 -REPLICA 2: - Striping Policy: STRIPING_POLICY_RAID0 - Stripe-Size: 128,00 kB - Stripe-Width: 1 (OSDs) - Replication Flags: - Complete: true - Replica Type: partial - Transfer-Strategy: unknown - OSDs: - [Head-OSD] UUID: osd2, URL: /127.0.0.1:32640 -\end{verbatim} - -Besides adding replicas, replicas can also be removed. Since replicas of a file do not have a fixed order, we use a replica's first OSD to identify the replica to delete. The first OSD in a replica's list of OSDs, also referred to as \emph{head OSD} is a unique identifier for a replica, as different replicas of a file may not share any OSDs. - -To remove a replica, the UUID of the head OSD must be given as an argument. It can be determined via \texttt{xtfs\_repl -l}. To ensure that at least one complete replica remains, i.e.\ a replica that stores the entire file content, complete replicas can only be removed if there is at least one more complete complete replica of the file. - -A replica can be removed as follows: - -\begin{verbatim} -$> xtfs_repl -r osd1 /xtreemfs/file.txt -\end{verbatim} - -\texttt{osd1} refers to the UUID of the head OSD in the replica to remove. - - -\subsection{Automatic On-Close Replication}\index{Replication}\index{Replication!on-close}\index{On-close Replication} - -In addition to manually adding and removing replicas, XtreemFS supports an automatic creation of new replicas when files are closed after having been initially written. This feature can e.g.\ be used to automatically replicate volumes that only contain write-once files, such as archival data. - -To configure the behavior of the on-close replication, the \texttt{xtfs\_repl} tool is used. - -The number of replicas to be created when a file is closed can be specified as a volume-wide parameter, which can be set as follows: - -\begin{verbatim} -$> xtfs_repl --ocr_factor_set 2 /xtreemfs -\end{verbatim} - -This will automatically create a second replica when the file is closed, which implies that the file will be made read-only. Note that by setting the replication factor to 1 (default value), on-close replication will be switched off, which means that the file won't be replicated and will remain writable after having been closed. - -The current replication factor of a volume can be retrieved as follows: - -\begin{verbatim} -$> xtfs_repl --ocr_factor_get /xtreemfs -\end{verbatim} - -Moreover, it is possible to specify whether an automatically created replica will be synchronized in the background or on demand. By default, replicas will be synced on demand. This can be changed as follows: - -\begin{verbatim} -$> xtfs_repl --ocr_full_set true /xtreemfs -\end{verbatim} - -Depending on whether \texttt{----ocr\_full\_set} is \texttt{true} or \texttt{false}, background replication of newly created files is switched on or off. - -To show whether replicas are automatically filled or not, execute the following command: - -\begin{verbatim} -$> xtfs_repl --ocr_full_get /xtreemfs -\end{verbatim} - -\subsection{Changing OSD and Replica Selection Policies}\label{sec:osd_select_policy} - -When creating a new file, OSDs have to be selected on which to store the file content. Likewise, OSDs have to be selected for a newly added replica, as well as the order in which replicas are contacted when accessing a file. How these selections are done can be controlled by the user. - -OSD and replica selection policies can only be set for the entire volume. Further details about the policies are described in Sec.\ \ref{sec:osd_policies}. - -The policies are set and modified with the \texttt{xtfs\_repl} tool. A policy that controls the selection of a replica is set as follows: - -\begin{verbatim} - $> xtfs_repl --rsp_set dcmap /xtreemfs -\end{verbatim} - -This will change the current replica selection policy to a policy based on a data center map. The current replica selection policy is shown as follows: - -\begin{verbatim} - $> xtfs_repl --rsp_get /xtreemfs -\end{verbatim} - -Note that by default, there is no replica selection policy, which means that the client will attempt to access replicas in their natural order, i.e.\ the order in which the replicas have been created. - -Similar to replica selection policies, OSD selection policies are set and retrieved: - -\begin{verbatim} - $> xtfs_repl --osp_set dcmap /xtreemfs -\end{verbatim} - -sets a data center map-based OSD selection policy, which is invoked each time a new file or replica is created. The following predefined policies exist (see Sec.\ \ref{sec:osd_policies} and \texttt{man xtfs\_repl} for details): - -\begin{itemize} - \item \texttt{default} - \item \texttt{fqdn} - \item \texttt{dcmap} - \item \texttt{vivaldi} -\end{itemize} - -The default OSD selection policy selects a random subset of OSDs that are responsive and have more than 2GB of free disk space, whereas the \texttt{fqdn} and \texttt{dcmap} policies select those subsets of responsive OSDs with enough space that are closest according to fully qualified domain names and a data center map, accordingly. The \texttt{vivaldi} policy uses the vivaldi coordinates of OSDs and clients for selecting the closest replica. Besides, custom policies can be set by passing a list of basic policy IDs to be successively applied instead of a predefined policy name. - -The OSD selection policy can be retrieved as follows: - -\begin{verbatim} - $> xtfs_repl --osp_get /xtreemfs -\end{verbatim} - -\subsection{Setting and Listing Policy Attributes} - -OSD and replica selection policy behavior can be further specified by means of policy attributes. For a list of predefined attributes, see \texttt{man xtfs\_repl}. Policy attributes can be set as follows: - -\begin{verbatim} - $> xtfs_repl --pol_attr_set domains "*.xtreemfs.org bla.com" \ - /xtreemfs -\end{verbatim} - -A list of all policy attributes that have been set can be shown as follows: - -\begin{verbatim} - $> xtfs_repl --pol_attrs_get /xtreemfs -\end{verbatim} - -\section{Vivaldi} -\label{sec:vivaldi} -Client machines that want to use vivaldi network coordinates for replica and OSD selection must calculate their own coordinates relative to the OSDs. This is done by the \texttt{xtfs\_vivaldi} utility which must be started on each client machine. Ideally, this process is started during boot with the \texttt{xtreemfs-vivaldi} init.d scripts provided. The utility must be started with the directory service address and the path to a file in which the coordinates are stored. - -\begin{verbatim} - $> xtfs_vivaldi remote.dir.machine \ - /var/lib/xtreemfs/vivaldi_coordinates -\end{verbatim} - -If started with the init.d script, the utility will get the DIR address from\\ \texttt{/etc/xos/xtreemfs/default\_dir} and will store the coordinates in\\ \texttt{/var/lib/xtreemfs/vivaldi\_coordinates}. - -The coordinate file must be passed as an argument when mounting a volume: - -\begin{verbatim} -$> mount.xtreemfs --vivaldi-coordinates-file-path /var/lib/xtreemfs/vivaldi_coordinates \ - remote.dir.machine/myVolume /xtreemfs -\end{verbatim} - -Finally, the vivaldi replica and OSD selection policies must be set at the MRC for the volume(s). See Sec. \ref{sec:osd_select_policy} for details. - -\chapter{Policies} -Many facets of the behavior of XtreemFS can be configured by means of policies. A policy defines how a certain task is performed, e.g.\ how the MRC selects a set of OSDs for a new file, or how it distinguishes between an authorized and an unauthorized user when files are accessed. Policies are a means to customize an XtreemFS installation. - -XtreemFS supports a range of predefined policies for different tasks. Alternatively, administrators may define their own policies in order to adapt XtreemFS to customer demands. This chapter contains information about predefined policies, as well as mechanisms to implement and plug in custom policies. - -\section{Authentication Policies} \label{sec:authentication_policies} -Any operation on a file system is executed on behalf of a user. The process of determining the user bound to a request is generally referred to as \emph{user authentication}. To render user authentication customizable, the MRC allows administrators to specify an authentication policy by means of an \emph{Authentication Provider}\index{Authentication Provider}. Authentication Providers are modules that implement different methods for retrieving user and group IDs from requests. - -The following predefined authentication providers exist: - -\subsection{UNIX uid/gid - NullAuthProvider} - -The NullAuthProvider\index{Authentication Provider!NullAuthProvider}\index{NullAuthProvider} is the default Authentication Provider. It simply uses the user ID and group IDs sent by the XtreemFS client. This means that the client is trusted to send the correct user/group IDs. - -The XtreemFS Client will send the user ID and group IDs of the process which executed the file system operation, not of the user who mounted the volume! - -The superuser is identified by the user ID \texttt{root} and is allowed to do everything on the MRC. This behavior is similar to NFS with \texttt{no\_root\_squash}. - -\subsection{Plain SSL Certificates - SimpleX509AuthProvider} - -XtreemFS supports two kinds of X.509 certificates which can be used by the client.\index{Authentication Provider!SimpleX509AuthProvider}\index{SimpleX509AuthProvider} When mounted with a service/host certificate the XtreemFS client is regarded as a trusted system component. The MRC will accept any user ID and groups sent by the client and use them for authorization as with the NullAuthProvider. This setup is useful for volumes which are used by multiple users. - -The second certificate type are regular user certificates. The MRC will only accept the user name and group from the certificate and ignore the user ID and groups sent by the client. Such a setup is useful if users are allowed to mount XtreemFS from untrusted machines. - -Both certificates are regular X.509 certificates. Service and host certificates are identified by a Common Name (\texttt{CN}) starting with \texttt{host/} or \texttt{xtreemfs-service/}, which can easily be used in existing security infrastructures. All other certificates are assumed to be user certificates. - -If a user certificate is used, XtreemFS will take the Distinguished Name (\texttt{DN}) as the user ID and the Organizational Unit (\texttt{OU}) as the group ID. - -Superusers must have \texttt{xtreemfs-admin} as part of their Organizational Unit (\texttt{OU}). - -\subsection{XtreemOS Certificates - XOSAuthProvider} - -In contrast to plain X.509 certificates, XtreemOS embeds additional user information as extensions in XtreemOS-User-Certificates.\index{Authentication Provider!XOSAuthProvider}\index{XOSAuthProvider}\index{XtreemOS!XtreemOS Certificates} This authentication provider uses this information (global UID and global GIDs), but the behavior is similar to the SimpleX509AuthProvider. - -The superuser is identified by being member of the \texttt{VOAdmin} group. - - -\section{Authorization Policies} \label{sec:access_policies} -Before executing an operation, a file system needs to check whether the user bound to the operation is sufficiently authorized, i.e.\ is allowed to execute the operation. User authorization is managed by means of \emph{access policies}, which reside on the MRC. Unlike authentication policies which are bound to an MRC, access policies can be defined for each volume. This has to be done when the volume is created (see \texttt{man xtfs\_mkvol}). Various access policies can be used: \index{Access Policy}\index{Policy!Access Policy} - -\begin{itemize} - \item Authorize All Policy (policy Id 1)\index{Access Policy!Authorize All}\index{Authorize All Access Policy}\\ -No authorization - everyone can do everything. This policy is useful if performance of metadata operations matters more than security, since no evaluation of access rights is needed. - - \item POSIX ACLs \& Permissions (policy Id 2)\index{Access Policy!POSIX Permissions}\index{POSIX Permissions Access Policy}\index{Access Policy!POSIX ACLs}\index{POSIX ACLs Access Policy}\\ -This access policy implements the traditional POSIX permissions commonly used on Linux, as well as POSIX ACLs, an extension that provides for access control at the granularity of single users and groups. POSIX permissions should be used as the default, as it guarantees maximum compatibility with other file systems. - - \item Volume ACLs (policy Id 3)\index{Access Policy!Volume ACLs}\index{Volume ACLs Access Policy}\\ -Volume ACLs provide an access control model similar to POSIX ACLs \& Permissions, but only allow one ACL for the whole volume. This means that there is no recursive evaluation of access rights which yields a higher performance at the price of a very coarse-grained access control. -\end{itemize} - - -\section{OSD and Replica Selection Policies} \label{sec:osd_policies} -When a new file is created or a replica is automatically added to a file, the MRC must decide on a set of OSDs for storing the file content. To select the most suitable subset among all known OSDs, OSD Selection Policies\index{OSD Selection Policy}\index{Policy!OSD Selection Policy} are used. - -Replica selection is a related problem. When a client opens a file with more than one replica, the MRC uses a replica selection policy to sort the list of replicas for the client. Initially, a client will always attempt to access the first replica in the list received from the MRC. If a replica is not available, it will automatically attempt to access the next replica from the list, and restart with the first replica if all attempts have failed. Replica selection policies can be used to sort the replica lists, e.g. to ensure that clients first try to access replicas that are close to them. - -Both OSD and replica selection policies share a common mechanism, in that they consist of \emph{basic policies} that can be arbitrarily combined. Input parameters of a basic policy are a set of OSDs, the list of the current replica locations of the file, and the IP address of the client on behalf of whom the policy was called. The output parameter is a filtered and potentially sorted subset of OSDs. Since OSD lists returned by one basic policy can be used as input parameters by another one, basic policies can be chained to define more complex composite policies. - -OSD and replica selection policies are assigned at volume granularity. For further details on how to set such policies, please refer to Sec.\ \ref{sec:osd_select_policy}. - -\subsection{Attributes} - -The behavior of basic policies can be further refined by means of policy attributes. Policy attributes are extended attributes with a name starting with \texttt{xtreemfs.policies.}, such as \texttt{xtreemfs.policies.minFreeCapacity}. Each time a policy attribute is set, all policies will be notified about the change. How an attribute change affects the policy behavior depends on the policy implementation. - -\subsection{Predefined Policies} - -Each basic policy can be assigned to one of the three different categories called \emph{filtering}, \emph{grouping} and \emph{sorting}. \emph{Filtering policies} generate a sublist from a list of OSDs. The sublist only contains those OSDs from the original list that have a certain property. \emph{Grouping policies} are used to select a subgroup from a given list of OSDs. They basically work in a similar manner as filtering policies, but unlike filtering policies, they always return a list of a fixed size. \emph{Sorting policies} generate and return a reordered list from the input OSD list, without removing any OSDs. - -The following predefined policies exist: - -\subsubsection{Filtering Policies} -\begin{itemize} - - \item \textbf{Default OSD filter (policy ID 1000)}\\ - Removes OSDs from the list that are either dead or do not have sufficient space. By default, the lower space limit for an OSD is 2GB, and the upper response time limit is 5 minutes.\\ - - Attributes: - \begin{itemize} - \item \emph{free\_capacity\_bytes}: the lower space limit in bytes - \item \emph{offline\_time\_secs}: the upper response time limit in seconds - \end{itemize} - - \item \textbf{FQDN-based filter (policy ID 1001)}\\ - Removes OSDs from the list that do not match any of the domains in a given set. By default, the set of domains contains '*', which indicates that no domains are removed.\\ - - Attributes: - \begin{itemize} - \item \emph{domains}: a comma or space-separated list of domain names. The list may include leading and trailing '*'s, which will be regarded as wildcard characters. -\end{itemize} - -\end{itemize} - -\subsubsection{Grouping Policies} - -\begin{itemize} - - \item \textbf{Data center map-based grouping (policy ID 2000)}\\ - Removes all OSDs from the OSD set that have been used in the file's replica locations list already and selects the subset of OSDs that is closest to the client and provides enough OSDs for the new replica in a single data center. - - This policy uses a statically configured datacenter map that describes the distance between datacenters. It works only with IPv4 addresses at the moment. Each datacenter has a list of matching IP addresses and networks which is used to assign clients and OSDs to datacenters. Machines in the same datacenter have a distance of 0. - - This policy requires a datacenter map configuration file in\\ - \texttt{/etc/xos/xtreemfs/datacentermap} on the MRC machine which is loaded at MRC startup. This config file must contain the following parameters: - \begin{itemize} - \item \texttt{datacenters=A,B,C}\\ - A comma separated list of datacenters. Datacenter names may only contain a-z, A-Z, 0-9 and \_. - - \item \texttt{distance.A-B=100}\\ - For each pair of datacenters, the distance must be specified. As distances are symmetric, it is sufficient to specify A to B. - - \item \texttt{addresses.A=192.168.1.1,192.168.2.0/24}\\ - For each datacenter a list of matching IP addresses or networks must be specified. - - \item \texttt{max\_cache\_size=1000}\\ - Sets the size of the address cache that is used to lookup IP-to-datacenter matches. - \end{itemize} - - A sample datacenter map could look like this: - - \begin{verbatim} - datacenters=BERLIN,LONDON,NEW_YORK - distance.BERLIN-LONDON=10 - distance.BERLIN-NEW_YORK=140 - distance.LONDON-NEW_YORK=110 - addresses.BERLIN=192.168.1.0/24 - addresses.LONDON=192.168.2.0/24 - addresses.NEW_YORK=192.168.3.0/24,192.168.100.0/25 - max_cache_size=100 - \end{verbatim} - - \item \textbf{FQDN-based grouping (policy ID 2001)}\\ - Removes all OSDs from the OSD set that have been used in the file's replica locations list already and selects the subset of OSDs that is closest to the client and provides enough OSDs for the new replica in a single domain. - -This policy uses domain names of clients and OSDs to determine the distance between a client and an OSD, as well as if OSDs are in the same domain. - -\end{itemize} - -\subsubsection{Sorting Policies} - -\begin{itemize} - - \item \textbf{Shuffling (policy ID 3000)}\\ - Shuffles the given list of OSDs. - - \item \textbf{Data center map-based sorting (policy ID 3001)}\\ - Sorts the list of OSDs in ascending order of their distance to the client, according to the data center map. - - \item \textbf{Vivaldi network coordinates based sorting (policy ID 3003)}\\ - Sorts the list of OSDs in ascending order of their distance to the client, according to the vivaldi coordinates of the client and OSDs. This policy requires the clients to run the \texttt{xtfs\_vivaldi} service. - - \item \textbf{DNS based OSD Selection (policy ID 3002)}\\ - The FQDN of the client and all OSDs is compared and the maximum match (from the end of the FQDN) is used to sort the OSDs. The policy sorts the list of OSDs in descending order by the number of characters that match. This policy can be used to automatically select OSDs which are close to the client, if the length of the match between two DNS entries also indicate a low latency between two machines. - -\end{itemize} - -\section{Striping Policies} \label{sec:striping_policies} - -XtreemFS allows the content, i.e.\ the objects of a file to be distributed among several storage devices (OSDs). This has the benefit that the file can be read or written in parallel on multiple OSDs in order to increase throughput\index{Striping}. To configure how files are striped, XtreemFS supports \emph{striping policies}. - -A striping policy\index{Striping Policy}\index{Policy!Striping Policy}\index{RAID0} is a rule that defines how the objects are distributed on the available OSDs. Currently, XtreemFS implements only the \texttt{RAID0} policy which simply stores the objects in a round robin fashion on the OSDs. The \texttt{RAID0} policy has two parameters. The \emph{striping width}\index{Striping Width} defines to how many OSDs the file is distributed. If not enough OSDs are available when the file is created, the number of available OSDs will be used instead; if it is 0, an I/O error is reported to the client. The \emph{stripe size}\index{Striping!Stripe Size}\index{Stripe Size} defines the size of each object. - -Striping over several OSDs enhances the read and write throughput to a file. The maximum throughput depends on the striping width. However, using \texttt{RAID0} also increases the probability of data loss. If a single OSD fails, parts of the file are no longer accessible, which generally renders the entire file useless. Replication can mitigate the problem but has all the restrictions described in Sec.\ \ref{sec:roreplication}. - - -\section{Plug-in Policies} - -To further customize XtreemFS, the set of existing policies can be extended by defining \textit{plug-in policies}. Such policies are Java classes that implement a predefined policy interface. Currently, the following policy interfaces exist: - -\begin{itemize} - \item \texttt{org.xtreemfs.common.auth.AuthenticationProvider}\\ - interface for authentication policies - \item \texttt{org.xtreemfs.mrc.ac.FileAccessPolicy}\\ - interface for file access policies - \item \texttt{org.xtreemfs.mrc.osdselection.OSDSelectionPolicy}\\ - interface for OSD and replica selection policies -\end{itemize} - -Note that there may only be one authentication provider per MRC, while file access policies and OSD selection policies may differ for each volume. The former one is identified by means of its class name (property \texttt{authentication\_provider}, see Sec.\ \ref{sec:AuthProvider}, \ref{sec:config}), while volume-related policies are identified by ID numbers. It is therefore necessary to add a member field - -\begin{verbatim} - public static final long POLICY_ID = 4711; -\end{verbatim} - -to all such policy implementations, where \texttt{4711} represents the individual ID number. Administrators have to ensure that such ID numbers neither clash with ID numbers of built-in policies (1-9), nor with ID numbers of other plug-in policies. When creating a new volume, IDs of plug-in policies may be used just like built-in policy IDs. - -Plug-in policies have to be deployed in the directory specified by the MRC configuration property \texttt{policy\_dir}. The property is optional; it may be omitted if no plug-in policies are supposed to be used. An implementation of a plug-in policy can be deployed as a Java source or class file located in a directory that corresponds to the package of the class. Library dependencies may be added in the form of source, class or JAR files. JAR files have to be deployed in the top-level directory. All source files in all subdirectories are compiled at MRC start-up time and loaded on demand. - -\appendix - -\chapter{Support} -Please visit the \href{http://www.xtreemfs.org}{XtreemFS website at www.xtreemfs.org} for links to the user mailing list, bug tracker and further information. - -\chapter{XtreemOS Integration} - -\section{XtreemFS Security Preparations} -\label{installconf-xfs-security} - -XtreemFS\index{XtreemOS!Integration} can be integrated in an existing XtreemOS VO security infrastructure. XtreemOS uses X.509 certificates to authenticate users in a Grid system, so the general setup is similar to a normal SSL-based configuration. - -Thus, in an XtreemOS environment, certificates have to be created for the services as a first step. This is done by issuing a \textit{Certificate Signing Request (CSR)} to the RCA server by means of the \texttt{create-server-csr} command. For further details, see the Section Using the RCA in the XtreemOS User Guide. - -Signed certificates and keys generated by are RCA infrastructure are stored locally in PEM format. Since XtreemFS services are currently not capable of processing PEM certificates, keys and certificates have to be converted to PKCS12 and Java Keystore format, respectively. - -Each XtreemFS service needs a certificate and a private key in order to be run. Once they have created and signed, the conversion has to take place. Assuming that certificate/private key pairs reside in the current working directory for the Directory Service, an MRC and an OSD (\texttt{ds.pem}, \texttt{ds.key}, \texttt{mrc.pem}, \texttt{mrc.key}, \texttt{osd.pem} and \texttt{osd.key}), the conversion can be initiated with the following commands: - - -\begin{verbatim} -$> openssl pkcs12 -export -in ds.pem -inkey ds.key \ - -out ds.p12 -name "DS" -$> openssl pkcs12 -export -in mrc.pem -inkey mrc.key \ - -out mrc.p12 -name "MRC" -$> openssl pkcs12 -export -in osd.pem -inkey osd.key \ - -out osd.p12 -name "OSD" -\end{verbatim} - -This will create three PKCS12 files (\texttt{ds.p12}, \texttt{mrc.p12} and \texttt{osd.p12}), each containing the private key and certificate for the respective service. - -XtreemFS services need a \textit{trust store} that contains all trusted Certification Authority certificates. Since all certificates created via the RCA have been signed by the XtreemOS CA, the XtreemOS CA certificate has to be included in the trust store. To create a new trust store containing the XtreemOS CA certificate, execute the following command: - - -\begin{verbatim} -$> keytool -import -alias xosrootca -keystore xosrootca.jks \ - -trustcacerts -file \ - /etc/xos/truststore/xtreemosrootcacert.pem -\end{verbatim} - -This will create a new Java Keystore \texttt{xosrootca.jks} with the XtreemOS CA certificate in the current working directory. The password chosen when asked will later have to be added as a property in the service configuration files. - -Once all keys and certificates have been converted, the resulting files should be moved to \texttt{/etc/xos/xtreemfs/truststore/certs} as root: - - -\begin{verbatim} -# mv ds.p12 /etc/xos/xtreemfs/truststore/certs -# mv mrc.p12 /etc/xos/xtreemfs/truststore/certs -# mv osd.p12 /etc/xos/xtreemfs/truststore/certs -# mv xosrootca.jks /etc/xos/xtreemfs/truststore/certs -\end{verbatim} - - -For setting up a \textit{secured} XtreemFS infrastructure, each service provides the following properties: - - -\begin{verbatim} -# specify whether SSL is required -ssl.enabled = true - -# server credentials for SSL handshakes -ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/\ -service.p12 -ssl.service_creds.pw = xtreemfs -ssl.service_creds.container = pkcs12 - -# trusted certificates for SSL handshakes -ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/\ -xosrootca.jks -ssl.trusted_certs.pw = xtreemfs -ssl.trusted_certs.container = jks -\end{verbatim} - -\texttt{service.p12} refers to the converted file containing the credentials of the respective service. Make sure that all paths and passphrases (\texttt{xtreemfs} in this example) are correct. - - -\chapter{Hadoop Integration} - -\section{Introduction} -\label{sec:hadoop_integration} - -XtreemFS\index{Hadoop!Integration} is a distributed filesystem that can be used instead of HDFS the distributed filesystem made by the developers of Hadoop. - -Therefore it replaces the NameNode and the Datanodes provided by HDFS in a common Hadoop setup. A DIR is used instead of a NameNode, because it stores the information about where the files and there metadata are located at the OSDs and the MRC, like the NameNode does for DataNodes. These DataNodes hold the files that have been stored at HDFS. On XtreemFS these files are split into metadata and raw filedata to be stored seperated at a MRC and OSDs. - -\begin{figure}[h] - \centering - \resizebox{0.80\linewidth}{!}{\includegraphics{images/cluster_setup.png}} - % screenshot_status.png: 783x444 pixel, 72dpi, 28.82x29.88 cm, bb=0 0 783 444 - \caption{Hadoop cluster setup recommendation} - \label{fig:cluster_setup} -\end{figure} - -The three master services JobTracker, DIR and MRC are required in a Hadoop configuration. They can run alone or in arbitrary combinations on the same machine. Hadoop can be used with an arbitrary number of Slaves. It is recommended to run a TaskTracker together with an OSD on each Slave machine to improve performance, but it is not mandatory. - -\section{Quick Start} -\label{sec:hadoop_quickstart} - -This section will help you to set up a simple Hadoop configuration with all necessary services running on the same host. - -\textbf{Required software:} -\begin{itemize} -\item XtreemFS servers (v 1.2.1) inlcuding XtreemFS.jar and yidl.jar (\href{http://www.XtreemFS.org}{www.XtreemFS.org}) -\item HadoopClient.jar (\href{http://www.XtreemFS.org}{www.XtreemFS.org}) -\item Hadoop (v 0.20.1) (\href{http://hadoop.apache.org}{hadoop.apache.org}) -\item JDK 1.6+ (\href{http://java.sun.com}{Oracle/SUN}) -\end{itemize} - -\textbf{Setup:} -\begin{enumerate} - \item Install and start XtreemFS:\\ - Follow the instructions given by the quick start guide for XtreemFS, available at Sec.\ref{sec:quick_start}. Notice - that the DIR is reachable at \textit{localhost:32638}, beause this information will be important later. - -\item Download and extract Hadoop - -\item Configure Hadoop to use XtreemFS instead of HDFS: - \begin{enumerate} - \item After downloading and extracting Hadoop you first have to add XtreemFS, the HadoopClient and yidl to its - classpath. To do so edit the \textit{hadoop-env.sh} that can be found in the \textit{conf} directory of Hadoop and - add the paths to XtreemFS.jar, yidl.jar and HadoopClient.jar separated by '\textit{:}' to the HADOOP\_CLASSPATH. - If you run a Linux-based OS these jar-libraries are located at '\textit{/usr/share/java/}'. - \item Now you have to specify some properties at the \textit{core-site.xml} which also has to be in the \textit{conf} - directory of Hadoop. If this file does not exist you can safely create it. - \begin{verbatim} - - - - fs.xtreemfs.impl - org.xtreemfs.common.clients.hadoop.XtreemFSFileSystem - The FileSystem for xtreemfs: uris. - - - - fs.default.name - xtreemfs://localhost:32638 - Address for the DIR. - - - - xtreemfs.volumeName - volumeName - Name of the volume to use within XtreemFS. - - - - \end{verbatim} - \begin{enumerate} - \item The first property is required to register the HadoopClient of XtreemFS at Hadoop. Now you are able to access - XtreemFS by the Hadoop binary using the \textit{fs} argument. - \item The next property makes Hadoop use the DIR instead of a - NameNode, therefore address and port of the DIR has to be populated. In this case the DIR is located at - \textit{localhost:32638}. - \item The last property specifies the name of the volume to use within XtreemFS. Make sure, that the volume (here - named \textit{volumeName}) does exist. If the volume is not available Hadoop will not be able to use XtreemFS! - \end{enumerate} - Hint: If you want to provide userrights to your Hadoop installation according to the POSIX file-access-policy, you - have to set the following additional properties: - \begin{verbatim} - - xtreemfs.client.userid - hadoopUserID - UserID to be used by Hadoop while accessing XtreemFS. - - - - xtreemfs.client.groupid - hadoopGroupID - GroupID to be used by Hadoop while accessing XtreemFS. - - \end{verbatim} - \end{enumerate} - -\item To provide the minimum JobTracker configuration for Hadoop you have also to add the following property to the - \textit{conf/mapred-site.xml}: - - \begin{verbatim} - - - - mapred.job.tracker - localhost:9001 - Listening address for the JobTracker. - - - - \end{verbatim} - Which specifies the address where the JobTracker will be running at. - -\item Finally you are now able to start the JobTracker by running '\textit{bin/hadoop jobtracker}' from within the Hadoop root-directory and a TaskTracker by executing '\textit{bin/hadoop tasktracker}'. - -\end{enumerate} -Congratulations! You successfully finished the quick start guide of the XtreemFS-Hadoop integration and are now able to use your Hadoop applications like as is well known or go on with the tutorials available on \href{http://hadoop.apache.org}{hadoop.apache.org}. - -\chapter{Command Line Utilities} -\label{sec:cli_utils} - -\begin{description} - \item[xtfs\_cleanup] Deletes orphaned objects on an OSD and restores orphaned files. - \item[lsfs.xtreemfs (was xtfs\_lsvol)] Lists the volumes on an MRC. - \item[mkfs.xtreemfs (was xtfs\_mkvol)] Creates a new volume on an MRC. - \item[mount.xtreemfs (was xtfs\_mount)] The XtreemFS client which mounts an XtreemFS volume locally on a machine. - \item[xtfs\_mrcdbtool] Dumps and restores an XML representation of the MRC database. - \item[xtfs\_repl] Controls file replication in XtreemFS. - \item[rmfs.xtreemfs (was xtfs\_rmvol)] Deletes a volume. - \item[xtfs\_sp] Displays and modifies default striping policies for directories and volumes. - \item[xtfs\_scrub] Examines all files in a volume for wrong file sizes and checksums and corrects wrong file sizes in the MRC. - \item[xtfs\_stat] Displays XtreemFS-specific file information, such as OSD lists and striping policies. - \item[xtfs\_test] Automatically sets up an XtreemFS testing environment and runs the automatic XtreemFS test suite. - \item[umount.xtreemfs (was xtfs\_umount)] Un-mounts a mounted XtreemFS volume. - \item[xtfs\_vivaldi] client service to calculate vivaldi coordinates. -\end{description} - -\printindex - -\end{document} diff --git a/etc/init.d/xtreemfs-dir b/etc/init.d/xtreemfs-dir deleted file mode 100755 index c3ab9ca58547739eda45334ac62ee5ecfb0b508f..0000000000000000000000000000000000000000 --- a/etc/init.d/xtreemfs-dir +++ /dev/null @@ -1,164 +0,0 @@ -#!/bin/sh - -# chkconfig: - 20 80 -# description: XtreemFS DIR. http://www.xtreemfs.org/ - -### BEGIN INIT INFO -# Provides: xtreemfs-dir -# Required-Start: $network $remote_fs -# Required-Stop: $network $remote_fs -# Default-Start: 3 4 5 -# Default-Stop: -# Short-Description: XtreemFS DIR -# Description: XtreemFS DIR. http://www.xtreemfs.org/ -### END INIT INFO - -test -f /usr/share/java/XtreemFS.jar || exit 0 - -# Source function library. -if [ -e /lib/lsb/init-functions ] -then - . /lib/lsb/init-functions -else - . /etc/init.d/functions -fi - -LOCKDIR=/var/lock/subsys -LOCKFILE=$LOCKDIR/xtreemfs-dir - -XTREEMFS_USER=xtreemfs - -PID_DS=/var/run/xtreemfs_dir.pid - -CONFIG_DS=/etc/xos/xtreemfs/dirconfig.properties - -LOG_DS=/var/log/xtreemfs/dir.log - -if [ -z $JAVA_HOME ]; then - export JAVA_HOME=/usr -fi -JAVA_CALL="$JAVA_HOME/bin/java -cp /usr/share/java/XtreemFS.jar:/usr/share/java/BabuDB.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar" - -pre_check() { - - exists=`grep -c $XTREEMFS_USER /etc/passwd` - if [ $exists -eq 0 ] - then - echo "user $XTREEMFS_USER does not exist." - exit 1 - fi - dir=`dirname $LOG_DS` - if [ ! -e $dir ] - then - echo "directory for logfiles $dir does not exist" - fi -} - -start() { - if [ -f $LOCKFILE ] - then - echo -n "XtreemFS Directory Service (DIR) already started" - echo - return 0 - fi - - pre_check - - chown xtreemfs $LOG_DS - echo >> $LOG_DS - date >> $LOG_DS - echo -e "Starting XtreemFS Directory Service (DIR)...\n\n" >> $LOG_DS - - rm $PID_DS - echo -n "starting XtreemFS Directory Service (DIR)..." - sudo -u $XTREEMFS_USER $JAVA_CALL org.xtreemfs.dir.DIR $CONFIG_DS >> $LOG_DS 2>&1 & - PROCPID=$! - echo $PROCPID > $PID_DS - sleep 1s - - if [ -e /proc/$PROCPID ] - then - echo - else - echo - return 1 - fi - - if [ ! -d $LOCKDIR ]; then mkdir -p $LOCKDIR; fi - touch $LOCKFILE - return 0 -} - -stop() { - if [ -f $PID_DS ] - then - echo -n "stopping XtreemFS Directory Service (DIR)..." - killproc -p $PID_DS java - echo - fi - - rm -f $LOCKFILE - return 0 -} - -status() { - if [ -f $PID_DS ] - then - PROCPID=`cat $PID_DS` - if [ ! -e /proc/$PROCPID ] - then - echo "XtreemFS Directory Service (DIR) has crashed" - return 1 - else - echo "XtreemFS Directory Service (DIR) is running" - return 0 - fi - else - echo "XtreemFS Directory Service (DIR) is not running" - return 3 - fi -} - -# See how we were called. -case "$1" in - start) - start - result=$? - ;; - stop) - stop - result=$? - ;; - status) - status - result=$? - ;; - reload) - result=3 # unimplemented/unsupported - ;; - restart) - stop && sleep 1 && start - result=$? - ;; - condrestart|try-restart) - ## Stop the service and if this succeeds (i.e. the - ## service was running before), start it again. - $0 status >/dev/null - if [ $? = 0 ]; then - $0 restart - else - true # not running is not a failure! - fi - result=$? - ;; - force-reload) - stop && sleep 1 && start - result=$? - ;; - *) - echo -e "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart|force-reload}\n" - result=1 - ;; -esac - -exit $result diff --git a/etc/init.d/xtreemfs-mrc b/etc/init.d/xtreemfs-mrc deleted file mode 100644 index 90cfefef112490b329d65fed50410f318e3975e5..0000000000000000000000000000000000000000 --- a/etc/init.d/xtreemfs-mrc +++ /dev/null @@ -1,164 +0,0 @@ -#!/bin/sh - -# chkconfig: - 20 80 -# description: XtreemFS MRC. http://www.xtreemfs.org/ - -### BEGIN INIT INFO -# Provides: xtreemfs-mrc -# Required-Start: $network $remote_fs -# Required-Stop: $network $remote_fs -# Should-Start: xtreemfs-dir -# Should-Stop: $null -# Default-Start: 2 3 4 5 -# Default-Stop: -# Short-Description: XtreemFS MRC -# Description: XtreemFS MRC. http://www.xtreemfs.org/ -### END INIT INFO - -test -f /usr/share/java/XtreemFS.jar || exit 0 - -# Source function library. -if [ -e /lib/lsb/init-functions ] -then - . /lib/lsb/init-functions -else - . /etc/init.d/functions -fi - -LOCKDIR=/var/lock/subsys -LOCKFILE=$LOCKDIR/xtreemfs-mrc - -XTREEMFS_USER=xtreemfs - -PID_MRC=/var/run/xtreemfs_mrc.pid - -CONFIG_MRC=/etc/xos/xtreemfs/mrcconfig.properties - -LOG_MRC=/var/log/xtreemfs/mrc.log - -if [ -z $JAVA_HOME ]; then - export JAVA_HOME=/usr -fi -JAVA_CALL="$JAVA_HOME/bin/java -cp /usr/share/java/XtreemFS.jar:/usr/share/java/BabuDB.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar" - -pre_check() { - - exists=`grep -c $XTREEMFS_USER /etc/passwd` - if [ $exists -eq 0 ] - then - echo "user $XTREEMFS_USER does not exist." - exit 1 - fi - dir=`dirname $LOG_MRC` - if [ ! -e $dir ] - then - echo "directory for logfiles $dir does not exist" - fi -} - -start() { - if [ -f $LOCKFILE ] - then - echo -n "XtreemFS Metadata and Replica Catalog (MRC) already started" - echo - return 0 - fi - - pre_check - - echo >> $LOG_MRC - date >> $LOG_MRC - echo -e "Starting XtreemFS Metadata and Replica Catalog (MRC)...\n\n" >> $LOG_MRC - - echo -n "starting XtreemFS Metadata and Replica Catalog (MRC)..." - sudo -u $XTREEMFS_USER $JAVA_CALL org.xtreemfs.mrc.MRC $CONFIG_MRC >> $LOG_MRC 2>&1 & - PROCPID=$! - echo $PROCPID > $PID_MRC - sleep 1s - - if [ -e /proc/$PROCPID ] - then - echo - else - echo - return 1 - fi - - if [ ! -d $LOCKDIR ]; then mkdir -p $LOCKDIR; fi - touch $LOCKFILE - return 0 -} - -stop() { - if [ -f $PID_MRC ] - then - echo -n "stopping XtreemFS Metadata and Replica Catalog (MRC)..." - killproc -p $PID_MRC java - echo - fi - - rm -f $LOCKFILE - return 0 -} - -status() { - if [ -f $PID_MRC ] - then - PROCPID=`cat $PID_MRC` - if [ ! -e /proc/$PROCPID ] - then - echo "XtreemFS Metadata and Replica Catalog (MRC) has crashed" - return 1 - else - echo "XtreemFS Metadata and Replica Catalog (MRC) is running" - return 0 - fi - else - echo "XtreemFS Metadata and Replica Catalog (MRC)) is not running" - return 3 - fi -} - -# See how we were called. -case "$1" in - start) - start - result=$? - ;; - stop) - stop - result=$? - ;; - status) - status - result=$? - ;; - reload) - result=3 # unimplemented/unsupported - ;; - restart) - stop && sleep 1 && start - result=$? - ;; - condrestart|try-restart) - ## Stop the service and if this succeeds (i.e. the - ## service was running before), start it again. - $0 status >/dev/null - if [ $? = 0 ]; then - $0 restart - else - true # not running is not a failure! - fi - result=$? - ;; - force-reload) - stop && sleep 1 && start - result=$? - ;; - *) - echo -e "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart|force-reload}\n" - result=1 - ;; -esac - -exit $result diff --git a/etc/init.d/xtreemfs-osd b/etc/init.d/xtreemfs-osd deleted file mode 100644 index 484afbfcde6e9ac8e9cd7e2082693afd80d4f9fc..0000000000000000000000000000000000000000 --- a/etc/init.d/xtreemfs-osd +++ /dev/null @@ -1,165 +0,0 @@ -#!/bin/sh - -# chkconfig: - 20 80 -# description: XtreemFS OSD. http://www.xtreemfs.org/ - -### BEGIN INIT INFO -# Provides: xtreemfs-osd -# Required-Start: $network $remote_fs -# Required-Stop: $network $remote_fs -# Should-Start: xtreemfs-dir -# Should-Stop: $null -# Default-Start: 2 3 4 5 -# Default-Stop: -# Short-Description: XtreemFS OSD -# Description: XtreemFS OSD. http://www.xtreemfs.org/ -### END INIT INFO - -test -f /usr/share/java/XtreemFS.jar || exit 0 - - -# Source function library. -if [ -e /lib/lsb/init-functions ] -then - . /lib/lsb/init-functions -else - . /etc/init.d/functions -fi - -LOCKDIR=/var/lock/subsys -LOCKFILE=$LOCKDIR/xtreemfs-osd - -XTREEMFS_USER=xtreemfs - -PID_OSD=/var/run/xtreemfs_osd.pid - -CONFIG_OSD=/etc/xos/xtreemfs/osdconfig.properties - -LOG_OSD=/var/log/xtreemfs/osd.log - -if [ -z $JAVA_HOME ]; then - export JAVA_HOME=/usr -fi -JAVA_CALL="$JAVA_HOME/bin/java -cp /usr/share/java/XtreemFS.jar:/usr/share/java/yidl.jar:/usr/share/java/Foundation.jar:/usr/share/java/Flease.jar" - -pre_check() { - - exists=`grep -c $XTREEMFS_USER /etc/passwd` - if [ $exists -eq 0 ] - then - echo "user $XTREEMFS_USER does not exist." - exit 1 - fi - dir=`dirname $LOG_OSD` - if [ ! -e $dir ] - then - echo "directory for logfiles $dir does not exist" - fi -} - -start() { - if [ -f $LOCKFILE ] - then - echo -n "XtreemFS Object Storage Device (OSD) already started" - echo - return 0 - fi - - pre_check - - echo >> $LOG_OSD - date >> $LOG_OSD - echo -e "Starting XtreemFS Object Storage Device (OSD)...\n\n" >> $LOG_OSD - - echo -n "starting Object Storage Device (OSD)..." - sudo -u $XTREEMFS_USER $JAVA_CALL org.xtreemfs.osd.OSD $CONFIG_OSD >> $LOG_OSD 2>&1 & - PROCPID=$! - echo $PROCPID > $PID_OSD - sleep 1s - - if [ -e /proc/$PROCPID ] - then - echo - else - echo - return 1 - fi - - if [ ! -d $LOCKDIR ]; then mkdir -p $LOCKDIR; fi - touch $LOCKFILE - return 0 -} - -stop() { - if [ -f $PID_OSD ] - then - echo -n "stopping XtreemFS Object Storage Device (OSD)..." - killproc -p $PID_OSD java - echo - fi - - rm -f $LOCKFILE - return 0 -} - -status() { - if [ -f $PID_OSD ] - then - PROCPID=`cat $PID_OSD` - if [ ! -e /proc/$PROCPID ] - then - echo "XtreemFS Object Storage Device (OSD) has crashed" - return 1 - else - echo "XtreemFS Object Storage Device (OSD) is running" - return 0 - fi - else - echo "XtreemFS Object Storage Device (OSD) is not running" - return 3 - fi -} - -# See how we were called. -case "$1" in - start) - start - result=$? - ;; - stop) - stop - result=$? - ;; - status) - status - result=$? - ;; - reload) - result=3 # unimplemented/unsupported - ;; - restart) - stop && sleep 1 && start - result=$? - ;; - condrestart|try-restart) - ## Stop the service and if this succeeds (i.e. the - ## service was running before), start it again. - $0 status >/dev/null - if [ $? = 0 ]; then - $0 restart - else - true # not running is not a failure! - fi - result=$? - ;; - force-reload) - stop && sleep 1 && start - result=$? - ;; - *) - echo -e "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart|force-reload}\n" - result=1 - ;; -esac - -exit $result diff --git a/etc/init.d/xtreemfs-vivaldi b/etc/init.d/xtreemfs-vivaldi deleted file mode 100755 index e805ab75ef0cacb0240a061896a9a5a5cdeb3af4..0000000000000000000000000000000000000000 --- a/etc/init.d/xtreemfs-vivaldi +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/sh - -# chkconfig: - 20 80 -# description: XtreemFS client vivaldi process http://www.xtreemfs.org/ - -### BEGIN INIT INFO -# Provides: xtreemfs-vivaldi -# Required-Start: $network $remote_fs -# Required-Stop: $network $remote_fs -# Default-Start: 3 4 5 -# Default-Stop: -# Short-Description: XtreemFS client vivaldi module -# Description: XtreemFS client vivaldi process http://www.xtreemfs.org/ -### END INIT INFO - -test -f /usr/bin/xtfs_vivaldi || exit 0 - -# Source function library. -if [ -e /lib/lsb/init-functions ] -then - . /lib/lsb/init-functions -else - . /etc/init.d/functions -fi - -LOCKDIR=/var/lock/subsys -LOCKFILE=$LOCKDIR/xtreemfs-vivaldi - -XTREEMFS_USER=xtreemfs - -PID_DS=/var/run/xtreemfs_vivaldi.pid - -DEFAULT_DIR=/etc/xos/xtreemfs/default_dir - -LOG_DS=/var/log/xtreemfs/vivaldi.log - -COORD_FILE=/var/lib/xtreemfs/vivaldi_coordinates - - -pre_check() { - - exists=`grep -c $XTREEMFS_USER /etc/passwd` - if [ $exists -eq 0 ] - then - echo "user $XTREEMFS_USER does not exist." - exit 1 - fi - dir=`dirname $LOG_DS` - if [ ! -e $dir ] - then - echo "directory for logfiles $dir does not exist" - fi - if [ ! -e $DEFAULT_DIR ] - then - echo "deafult dir must be specified in $DEFAULT_DIR" - exit 1 - fi -} - -start() { - if [ -f $LOCKFILE ] - then - echo -n "XtreemFS client vivaldi module already started" - echo - return 0 - fi - - pre_check - - dirport=`grep -e 'dir_service.port' $DEFAULT_DIR | cut -d '=' -f 2 | sed 's/^[ \t]*//;s/[ \t]*$//'` - dirhost=`grep -e 'dir_service.host' $DEFAULT_DIR | cut -d '=' -f 2 | sed 's/^[ \t]*//;s/[ \t]*$//'` - - chown xtreemfs $LOG_DS - echo >> $LOG_DS - date >> $LOG_DS - echo -e "Starting XtreemFS vivaldi module...\n\n" >> $LOG_DS - - rm $PID_DS - echo -n "starting XtreemFS vivaldi module..." - sudo -u "$XTREEMFS_USER" /usr/bin/xtfs_vivaldi -d DEBUG "oncrpc://${dirhost}:${dirport}" "$COORD_FILE" >> "$LOG_DS" 2>&1 & - PROCPID=$! - echo $PROCPID > $PID_DS - sleep 1s - echo - - if [ ! -e /proc/$PROCPID ] - then - return 1 - fi - - if [ ! -d $LOCKDIR ]; then mkdir -p $LOCKDIR; fi - touch $LOCKFILE - return 0 -} - -stop() { - if [ -f $PID_DS ] - then - echo -n "stopping XtreemFS vivaldi module..." - killproc -p $PID_DS xtfs_vivaldi - echo - fi - - rm -f $LOCKFILE - return 0 -} - -status() { - if [ -f $PID_DS ] - then - PROCPID=`cat $PID_DS` - if [ ! -e /proc/$PROCPID ] - then - echo "XtreemFS vivaldi module has crashed" - return 1 - else - echo "XtreemFS vivaldi module is running" - return 0 - fi - else - echo "XtreemFS vivaldi module is not running" - return 3 - fi -} - -# See how we were called. -case "$1" in - start) - start - result=$? - ;; - stop) - stop - result=$? - ;; - status) - status - result=$? - ;; - reload) - result=3 # unimplemented/unsupported - ;; - restart) - stop && sleep 1 && start - result=$? - ;; - condrestart|try-restart) - ## Stop the service and if this succeeds (i.e. the - ## service was running before), start it again. - $0 status >/dev/null - if [ $? = 0 ]; then - $0 restart - else - true # not running is not a failure! - fi - result=$? - ;; - force-reload) - stop && sleep 1 && start - result=$? - ;; - *) - echo -e "Usage: $0 {start|stop|restart|reload|status|condrestart|try-restart|force-reload}\n" - result=1 - ;; -esac - -exit $result diff --git a/etc/xos/xtreemfs/datacentermap.example b/etc/xos/xtreemfs/datacentermap.example deleted file mode 100644 index f4528d60f6f358285c2ce65f613fceabf6f577f8..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/datacentermap.example +++ /dev/null @@ -1,7 +0,0 @@ -datacenters=A,B,C -distance.A-B=10 -distance.A-C=100 -distance.B-C=50 -A.addresses=192.168.1.1,192.168.2.0/24 -B.addresses=192.168.1.2,192.168.3.0/24 -C.addresses=192.168.1.3,192.168.4.0/24,192.168.10.10 diff --git a/etc/xos/xtreemfs/default_dir b/etc/xos/xtreemfs/default_dir deleted file mode 100644 index c2a043c9716595074fff6f46b19d55c2d930e789..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/default_dir +++ /dev/null @@ -1,2 +0,0 @@ -dir_service.host = localhost -dir_service.port = 32638 diff --git a/etc/xos/xtreemfs/dirconfig.properties b/etc/xos/xtreemfs/dirconfig.properties deleted file mode 100644 index 55452f91da1d7486e574948207618d86598f56db..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/dirconfig.properties +++ /dev/null @@ -1,180 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32638 - -# port for the status page (HTTP server) -http_port = 30638 - -# optional address for network device ("any" if not specified) -# listen.address = 127.0.0.1 - -# specify whether SSL is required -ssl.enabled = false - -# server credentials for SSL handshakes -ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/ds.p12 -ssl.service_creds.pw = xtreemfs -ssl.service_creds.container = pkcs12 - -# trusted certificates for SSL handshakes -ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/xosrootca.jks -ssl.trusted_certs.pw = xtreemfs -ssl.trusted_certs.container = jks - -# Enables the Grid SSL mode. This mode uses SSL only for user authentication -# and sends all data via an unencrypted TCP connection. -#ssl.gridSSL = false - -# time to wait for the directory service to become available on start-up -# before aborting -#startup.wait_for_dir = 30 - -# administrator password for privileged operations -#admin_password = passphrase - -uuid = default-DIR - -#monitoring = true - -#monitoring.email.program = /usr/sbin/sendmail - -#monitoring.email.sender = XtreemFS DIR - -#monitoring.email.receiver = - -#monitoring.max_warnings = 1 - -##################################################################### -# BabuDB configuration # -##################################################################### - -# optional debug level ( -# 0 = emergency, -# 1 = alert, -# 2 = critical, -# 3 = error, -# 4 = warning, -# 5 = notice, -# 6 = info, -# 7 = debug) -babudb.debug.level = 4 - -# optional debug category -#babudb.debug.category = all - -# name for the database configuration file -#babudb.cfgFile = config.db - -# base directory to store database index snapshots in -babudb.baseDir = /var/lib/xtreemfs/dir/database - -# directory in which the database logs are stored -babudb.logDir = /var/lib/xtreemfs/dir/db-log - -# SyncMode the synchronization mode to use for the logFile -# ASYNC - asynchronously write log entries (data is lost when system crashes). -# FSYNC - executes an fsync on the logfile before acknowledging the operation. -# FDATASYNC -# SYNC_WRITE - synchronously writes the log entry to disk before ack. Does not -# update the metadata. -# SYNC_WRITE_METADATA - synchronously writes the log entry to disk and updates -# the metadata before ack. -babudb.sync = FSYNC - -# max queue length: if > 0, the queue for each worker is limited to maxQ -babudb.worker.maxQueueLength = 250 - -# number of worker threads to use -babudb.worker.numThreads = 0 - -# a checkpoint is generated ,if maxLogfileSize is exceeded -babudb.maxLogfileSize = 16777216 - -# interval between two checks in seconds, 0 disables auto checkPointing -babudb.checkInterval = 300 - -# if set to a value > 0, operations are acknowledged immediately before -# they are written to the disk log. The disk logger will do batch writes -# and call fSync... every pseudoSyncWait seconds. This can be used to -# increase performance and emulate PostgreSQL behavior. -babudb.pseudoSyncWait = 200 - -# flag that determines whether the indices shall be compressed or not. -#babudb.compression = false - -# maximum number of key-value pairs per block -#babudb.maxNumRecordsPerBlock = 16 - -# maximum size for a babudb on-disk index file -#babudb.maxBlockFileSize = 52428800 - -#TOGGLE COMMENT OF THE FOLLOWING LINES TO ENABLE THE REPLICATION -#CHECK THE REFERENCE FOR FURTHER INFORMATIONS - -###################################################################### -## BabuDB replication configuration # -###################################################################### -# -## local time renew in milliseconds -##babudb.localTimeRenew = 3000 -# -## specifies if the DBs should be modified optimistic. -## if you want to use the replication with a pseudoSyncWait > 0 set -## this flag true to increase performance and lose data integrity. -## if pseudoSyncWait is set to 0 it is highly recommended to leave this -## flag false. -##babudb.repl.optimistic = false -# -## specify whether SSL is required -#babudb.ssl.enabled = false -# -## server credentials for SSL handshakes -##babudb.ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/dir.p12 -##babudb.ssl.service_creds.pw = xtreemfs -##babudb.ssl.service_creds.container = pkcs12 -# -## trusted certificates for SSL handshakes -##babudb.ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/xosrootca.jks -##babudb.ssl.trusted_certs.pw = xtreemfs -##babudb.ssl.trusted_certs.container = jks -# -##babudb.ssl.authenticationWithoutEncryption = false -# -## number of slaves that at least have to be up to date -#babudb.repl.sync.n = 0 -# -## participants of the replication including the local address -#babudb.repl.participant.0 = local.host.com -#babudb.repl.participant.0.port = 35667 -#babudb.repl.participant.1 = other.host.com -#babudb.repl.participant.1.port = 35666 -# -## chunk size, for initial load of file chunks -##babudb.repl.chunkSize = 5242880 -# -## DB backup directory - needed for the initial loading of the BabuDB from the -## master in replication context. -#babudb.repl.backupDir = /tmp/babuDB/backup/ diff --git a/etc/xos/xtreemfs/dirconfig.ssl_test b/etc/xos/xtreemfs/dirconfig.ssl_test deleted file mode 100644 index 0cb99ea2ffb6361a8847d7036479cbc91ebad0b0..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/dirconfig.ssl_test +++ /dev/null @@ -1,99 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32638 - -# port for the status page (HTTP server) -http_port = 30638 - -# optional address for network device ("any" if not specified) -# listen.address = 127.0.0.1 - -# specify whether SSL is required -ssl.enabled = true - -# server credentials for SSL handshakes -ssl.service_creds = test/certs/DIR.p12 -ssl.service_creds.pw = passphrase -ssl.service_creds.container = pkcs12 - -# trusted certificates for SSL handshakes -ssl.trusted_certs = test/certs/trusted.jks -ssl.trusted_certs.pw = passphrase -ssl.trusted_certs.container = jks - -# administrator password for privileged operations -#admin_password = blub - -uuid = test-localhost-DIR - -##################################################################### -# BabuDB configuration # -##################################################################### - -# optional debug level ( -# 0 = emergency, -# 1 = alert, -# 2 = critical, -# 3 = error, -# 4 = warning, -# 5 = notice, -# 6 = info, -# 7 = debug) -babudb.debug.level = 4 - -# base directory to store database index snapshots in -babudb.baseDir = /tmp/xtreemfs-test/dir/database - -# directory in which the database logs are stored -babudb.logDir = /tmp/xtreemfs-test/dir/database - -# SyncMode the synchronization mode to use for the logFile -# ASYNC - asynchronously write log entries (data is lost when system crashes). -# FSYNC - executes an fsync on the logfile before acknowledging the operation. -# FDATASYNC -# SYNC_WRITE - synchronously writes the log entry to disk before ack. Does not -# update the metadata. -# SYNC_WRITE_METADATA - synchronously writes the log entry to disk and updates -# the metadata before ack. -babudb.sync = FSYNC - -# max queue length: if > 0, the queue for each worker is limited to maxQ -babudb.worker.maxQueueLength = 250 - -# number of worker threads to use -babudb.worker.numThreads = 0 - -# a checkpoint is generated ,if maxLogfileSize is exceeded -babudb.maxLogfileSize = 16777216 - -# interval between two checks in seconds, 0 disables auto checkPointing -babudb.checkInterval = 300 - -# if set to a value > 0, operations are acknowledged immediately before -# they are written to the disk log. The disk logger will do batch writes -# and call fSync... every pseudoSyncWait seconds. This can be used to -# increase performance and emulate PostgreSQL behavior. -babudb.pseudoSyncWait = 200 diff --git a/etc/xos/xtreemfs/dirconfig.test b/etc/xos/xtreemfs/dirconfig.test deleted file mode 100644 index 0e16aec1ef5d329a5a18ea02c67103c8c18c5ea5..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/dirconfig.test +++ /dev/null @@ -1,89 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32638 - -# port for the status page (HTTP server) -http_port = 30638 - -# optional address for network device ("any" if not specified) -# listen.address = 127.0.0.1 - -# specify whether SSL is required -ssl.enabled = false - -# administrator password for privileged operations -#admin_password = blub - -uuid = test-localhost-DIR - -##################################################################### -# BabuDB configuration # -##################################################################### - -# optional debug level ( -# 0 = emergency, -# 1 = alert, -# 2 = critical, -# 3 = error, -# 4 = warning, -# 5 = notice, -# 6 = info, -# 7 = debug) -babudb.debug.level = 6 - -# base directory to store database index snapshots in -babudb.baseDir = /tmp/xtreemfs-test/dir/database - -# directory in which the database logs are stored -babudb.logDir = /tmp/xtreemfs-test/dir/database - -# SyncMode the synchronization mode to use for the logFile -# ASYNC - asynchronously write log entries (data is lost when system crashes). -# FSYNC - executes an fsync on the logfile before acknowledging the operation. -# FDATASYNC -# SYNC_WRITE - synchronously writes the log entry to disk before ack. Does not -# update the metadata. -# SYNC_WRITE_METADATA - synchronously writes the log entry to disk and updates -# the metadata before ack. -babudb.sync = FSYNC - -# max queue length: if > 0, the queue for each worker is limited to maxQ -babudb.worker.maxQueueLength = 250 - -# number of worker threads to use -babudb.worker.numThreads = 0 - -# a checkpoint is generated ,if maxLogfileSize is exceeded -babudb.maxLogfileSize = 16777216 - -# interval between two checks in seconds, 0 disables auto checkPointing -babudb.checkInterval = 300 - -# if set to a value > 0, operations are acknowledged immediately before -# they are written to the disk log. The disk logger will do batch writes -# and call fSync... every pseudoSyncWait seconds. This can be used to -# increase performance and emulate PostgreSQL behavior. -babudb.pseudoSyncWait = 200 \ No newline at end of file diff --git a/etc/xos/xtreemfs/mrcconfig.properties b/etc/xos/xtreemfs/mrcconfig.properties deleted file mode 100644 index 670251d2143fd7018afbd8ecc43e0f23d8223d69..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/mrcconfig.properties +++ /dev/null @@ -1,216 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32636 - -# port for the status page (HTTP server) -http_port = 30636 - -# optional address for network device, "any" if not specified -# listen.address = 127.0.0.1 - -# optinal host name that is used to register the service at the DIR -# hostname = foo.bar.com - -# interval for querying the Directory Service for new OSDs (in s) -osd_check_interval = 10 - -# Directory Service endpoint -dir_service.host = localhost -dir_service.port = 32638 - -# specify whether access time stamps are updated -no_atime = true - -# granularity of the local clock (in ms) -local_clock_renewal = 50 - -# interval between two remote clock syncs (in ms) -remote_time_sync = 60000 - -# specify whether SSL is required -ssl.enabled = false - -# server credentials for SSL handshakes -ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/mrc.p12 -ssl.service_creds.pw = xtreemfs -ssl.service_creds.container = pkcs12 - -# trusted certificates for SSL handshakes -ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/xosrootca.jks -ssl.trusted_certs.pw = xtreemfs -ssl.trusted_certs.container = jks - -# Enables the Grid SSL mode. This mode uses SSL only for user authentication -# and sends all data via an unencrypted TCP connection. -#ssl.gridSSL = false - -# Authentication providers are used to retrieve the user identities -# from the client or from certificate. -# The default provider is org.xtreemfs.mrc.auth.NullAuthProvider, which just -# takes the information provided by the client. The name of a pluggable -# provider can be used here. -authentication_provider = org.xtreemfs.common.auth.NullAuthProvider - -# Optional directory containing deployable MRC policy implementations. -# Policies can be directly deployed as .java or .class files in this directory -# or one of its subdirectories. They will be compiled at startup time and -# loaded at runtime. Policies may have external dependencies that can be -# deployed either as .java, .class or .jar files. While Java and Class files -# may be located in subdirectories, JAR files mustn't. So far, pluggable -# policies have to inherit from either org.xtreemfs.mrc.ac.FileAccessPolicy, -# org.xtreemfs.mrc.osdstatus.OSDSelectionPolicy, or -# org.xtreemfs.common.auth.AuthenticationProvider. Policies identified by -# policy IDs (OSDSelectionPolicy and FileAccessPolicy) require a public static -# long field called POLICY_ID that assigns the policy a unique number. -policy_dir = /etc/xos/xtreemfs/policies - -# Shared secret between the MRC and all OSDs. -# The secret is used by the MRC to sign capabilities, i.e. security tokens for -# data access at OSDs. In turn, an OSD uses the secret to verify that the -# capability has been issued by the MRC. The shared secret will be replaced by -# a public key infrastructure in future releases. -capability_secret = secretPassphrase - -# validity time span for capabilities in seconds -#capability_timeout = 600 - -# administrator password for privileged operations -#admin_password = passphrase - -# UUID for the MRC -uuid = default-MRC - -##################################################################### -# BabuDB configuration # -##################################################################### - -# optional debug level ( -# 0 = emergency, -# 1 = alert, -# 2 = critical, -# 3 = error, -# 4 = warning, -# 5 = notice, -# 6 = info, -# 7 = debug) -babudb.debug.level = 4 - -# optional debug category -#babudb.debug.category = all - -# name for the database configuration file -#babudb.cfgFile = config.db - -# base directory to store database index snapshots in -babudb.baseDir = /var/lib/xtreemfs/mrc/database - -# directory in which the database logs are stored -babudb.logDir = /var/lib/xtreemfs/mrc/db-log - -# SyncMode the synchronization mode to use for the logFile -# ASYNC - asynchronously write log entries (data is lost when system crashes). -# FSYNC - executes an fsync on the logfile before acknowledging the operation. -# FDATASYNC -# SYNC_WRITE - synchronously writes the log entry to disk before ack. Does not -# update the metadata. -# SYNC_WRITE_METADATA - synchronously writes the log entry to disk and updates -# the metadata before ack. -babudb.sync = ASYNC - -# max queue length: if > 0, the queue for each worker is limited to maxQ -babudb.worker.maxQueueLength = 250 - -# number of worker threads to use -babudb.worker.numThreads = 0 - -# a checkpoint is generated ,if maxLogfileSize is exceeded -babudb.maxLogfileSize = 16777216 - -# interval between two checks in seconds, 0 disables auto checkPointing -babudb.checkInterval = 300 - -# if set to a value > 0, operations are acknowledged immediately before -# they are written to the disk log. The disk logger will do batch writes -# and call fSync... every pseudoSyncWait seconds. This can be used to -# increase performance and emulate PostgreSQL behavior. -babudb.pseudoSyncWait = 0 - -# flag that determines whether the indices shall be compressed or not. -#babudb.compression = false - -# maximum number of key-value pairs per block -#babudb.maxNumRecordsPerBlock = 16 - -# maximum size for a babudb on-disk index file -#babudb.maxBlockFileSize = 52428800 - -#TOGGLE COMMENT OF THE FOLLOWING LINES TO ENABLE THE REPLICATION -#CHECK THE REFERENCE FOR FURTHER INFORMATIONS - -###################################################################### -## BabuDB replication configuration # -###################################################################### -# -## local time renew in milliseconds -##babudb.localTimeRenew = 3000 -# -## specifies if the DBs should be modified optimistic. -## if you want to use the replication with a pseudoSyncWait > 0 set -## this flag true to increase performance and lose data integrity. -## if pseudoSyncWait is set to 0 it is highly recommended to leave this -## flag false. -##babudb.repl.optimistic = false -# -## specify whether SSL is required -#babudb.ssl.enabled = false -# -## server credentials for SSL handshakes -##babudb.ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/dir.p12 -##babudb.ssl.service_creds.pw = xtreemfs -##babudb.ssl.service_creds.container = pkcs12 -# -## trusted certificates for SSL handshakes -##babudb.ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/xosrootca.jks -##babudb.ssl.trusted_certs.pw = xtreemfs -##babudb.ssl.trusted_certs.container = jks -# -##babudb.ssl.authenticationWithoutEncryption = false -# -## number of slaves that at least have to be up to date -#babudb.repl.sync.n = 0 -# -## participants of the replication including the local address -#babudb.repl.participant.0 = local.host.com -#babudb.repl.participant.0.port = 35667 -#babudb.repl.participant.1 = other.host.com -#babudb.repl.participant.1.port = 35666 -# -## chunk size, for initial load of file chunks -##babudb.repl.chunkSize = 5242880 -# -## DB backup directory - needed for the initial loading of the BabuDB from the -## master in replication context. -#babudb.repl.backupDir = /tmp/babuDB/backup/ \ No newline at end of file diff --git a/etc/xos/xtreemfs/mrcconfig.ssl_test b/etc/xos/xtreemfs/mrcconfig.ssl_test deleted file mode 100644 index 2a3394442d5ecaa48ed55a3d59c4f3f5544e8ae6..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/mrcconfig.ssl_test +++ /dev/null @@ -1,208 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32636 - -http_port = 30636 - -# optional address for network device, "any" if not specified -#listen.address = 127.0.0.1 - -# interval for querying the Directory Service for new OSDs -osd_check_interval = 10 - -# Directory Service endpoint -dir_service.host = localhost -dir_service.port = 32638 - -# specify whether access time stamps are updated -no_atime = true -no_fsync = true - -# granularity of the local clock (in ms) -local_clock_renewal = 50 - -# interval between two remote clock syncs (in ms) -remote_time_sync = 60000 - -# specify whether SSL is required -ssl.enabled = true - -# server credentials for SSL handshakes -ssl.service_creds = test/certs/MRC.p12 -ssl.service_creds.pw = passphrase -ssl.service_creds.container = pkcs12 - -# trusted certificates for SSL handshakes -ssl.trusted_certs = test/certs/trusted.jks -ssl.trusted_certs.pw = passphrase -ssl.trusted_certs.container = jks - -# time span between two database checkpoint attempts (in ms) -database.checkpoint.interval = 1800000 - -# time span for which no requests must have been received to create a checkpoint (in ms) -database.checkpoint.idle_interval = 1000 - -# minimum size in bytes the log file must have to create a checkpoint -database.checkpoint.logfile_size = 16384 - -# UUID for the OSD -# IMPORTANT: replace 'localhost' with a reachable host name/IP address -#uuid = http://farnsworth.zib.de:32636 -uuid = test-localhost-MRC - -# Authentication providers are used to retrieve the user identities -# from the client or from certificate. -# The default provider is org.xtreemfs.mrc.auth.NullAuthProvider, which just -# takes the information provided by the client. The name of a pluggable -# provider can be used here. -authentication_provider = org.xtreemfs.common.auth.NullAuthProvider - -# Optional directory containing deployable MRC policy implementations. -# Policies can be directly deployed as .java or .class files in this directory -# or one of its subdirectories. They will be compiled at startup time and -# loaded at runtime. Policies may have external dependencies that can be -# deployed either as .java, .class or .jar files. While Java and Class files -# may be located in subdirectories, JAR files mustn't. So far, pluggable -# policies have to inherit from either org.xtreemfs.mrc.ac.FileAccessPolicy, -# org.xtreemfs.mrc.osdstatus.OSDSelectionPolicy, or -# org.xtreemfs.common.auth.AuthenticationProvider. Policies identified by -# policy IDs (OSDSelectionPolicy and FileAccessPolicy) require a public static -# long field called POLICY_ID that assigns the policy a unique number. -# policy_dir = /etc/xos/xtreemfs/policies - -geographic_coordinates = 52.455483,13.297405 - -capability_secret = Yagga - -# administrator password for privileged operations -#admin_password = blub - -##################################################################### -# BabuDB configuration # -##################################################################### - -# optional debug level ( -# 0 = emergency, -# 1 = alert, -# 2 = critical, -# 3 = error, -# 4 = warning, -# 5 = notice, -# 6 = info, -# 7 = debug) -babudb.debug.level = 4 - -# optional debug category -#babudb.debug.category = all - -# name for the database configuration file -#babudb.cfgFile = config.db - -# base directory to store database index snapshots in -babudb.baseDir = /var/lib/xtreemfs/mrc/database - -# directory in which the database logs are stored -babudb.logDir = /var/lib/xtreemfs/mrc/db-log - -# SyncMode the synchronization mode to use for the logFile -# ASYNC - asynchronously write log entries (data is lost when system crashes). -# FSYNC - executes an fsync on the logfile before acknowledging the operation. -# FDATASYNC -# SYNC_WRITE - synchronously writes the log entry to disk before ack. Does not -# update the metadata. -# SYNC_WRITE_METADATA - synchronously writes the log entry to disk and updates -# the metadata before ack. -babudb.sync = ASYNC - -# max queue length: if > 0, the queue for each worker is limited to maxQ -babudb.worker.maxQueueLength = 250 - -# number of worker threads to use -babudb.worker.numThreads = 0 - -# a checkpoint is generated ,if maxLogfileSize is exceeded -babudb.maxLogfileSize = 16777216 - -# interval between two checks in seconds, 0 disables auto checkPointing -babudb.checkInterval = 300 - -# if set to a value > 0, operations are acknowledged immediately before -# they are written to the disk log. The disk logger will do batch writes -# and call fSync... every pseudoSyncWait seconds. This can be used to -# increase performance and emulate PostgreSQL behavior. -babudb.pseudoSyncWait = 0 - -# flag that determines whether the indices shall be compressed or not. -#babudb.compression = false - -#TOGGLE COMMENT OF THE FOLLOWING LINES TO ENABLE THE REPLICATION -#CHECK THE REFERENCE FOR FURTHER INFORMATIONS - -###################################################################### -## BabuDB replication configuration # -###################################################################### -# -## local time renew in milliseconds -##babudb.localTimeRenew = 3000 -# -## specifies if the DBs should be modified optimistic. -## if you want to use the replication with a pseudoSyncWait > 0 set -## this flag true to increase performance and lose data integrity. -## if pseudoSyncWait is set to 0 it is highly recommended to leave this -## flag false. -##babudb.repl.optimistic = false -# -## specify whether SSL is required -#babudb.ssl.enabled = false -# -## server credentials for SSL handshakes -##babudb.ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/dir.p12 -##babudb.ssl.service_creds.pw = xtreemfs -##babudb.ssl.service_creds.container = pkcs12 -# -## trusted certificates for SSL handshakes -##babudb.ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/xosrootca.jks -##babudb.ssl.trusted_certs.pw = xtreemfs -##babudb.ssl.trusted_certs.container = jks -# -##babudb.ssl.authenticationWithoutEncryption = false -# -## number of slaves that at least have to be up to date -#babudb.repl.sync.n = 0 -# -## participants of the replication including the local address -#babudb.repl.participant.0 = local.host.com -#babudb.repl.participant.0.port = 35667 -#babudb.repl.participant.1 = other.host.com -#babudb.repl.participant.1.port = 35666 -# -## chunk size, for initial load of file chunks -##babudb.repl.chunkSize = 5242880 -# -## DB backup directory - needed for the initial loading of the BabuDB from the -## master in replication context. -#babudb.repl.backupDir = /tmp/babuDB/backup/ \ No newline at end of file diff --git a/etc/xos/xtreemfs/mrcconfig.test b/etc/xos/xtreemfs/mrcconfig.test deleted file mode 100644 index 26d224dd8c464a73bdc7bdd9af931585692e4bf0..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/mrcconfig.test +++ /dev/null @@ -1,201 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 7 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32636 - -http_port = 30636 - -# optional address for network device, "any" if not specified -# listen.address = 127.0.0.1 - -# optinal host name that is used to register the service at the DIR -# hostname = foo.bar.com - -# interval for querying the Directory Service for new OSDs -osd_check_interval = 10 - -# Directory Service endpoint -dir_service.host = localhost -dir_service.port = 32638 - -# specify whether access time stamps are updated -no_atime = true -no_fsync = true - -# granularity of the local clock (in ms) -local_clock_renewal = 50 - -# interval between two remote clock syncs (in ms) -remote_time_sync = 60000 - -# specify whether SSL is required -ssl.enabled = false - -# time span between two database checkpoint attempts (in ms) -database.checkpoint.interval = 1800000 - -# time span for which no requests must have been received to create a checkpoint (in ms) -database.checkpoint.idle_interval = 1000 - -# minimum size in bytes the log file must have to create a checkpoint -database.checkpoint.logfile_size = 16384 - -# UUID for the OSD -# IMPORTANT: replace 'localhost' with a reachable host name/IP address -#uuid = http://farnsworth.zib.de:32636 -uuid = test-localhost-MRC - -# Authentication providers are used to retrieve the user identities -# from the client or from certificate. -# The default provider is org.xtreemfs.mrc.auth.NullAuthProvider, which just -# takes the information provided by the client. The name of a pluggable -# provider can be used here. -authentication_provider = org.xtreemfs.common.auth.NullAuthProvider - -# Optional directory containing deployable MRC policy implementations. -# Policies can be directly deployed as .java or .class files in this directory -# or one of its subdirectories. They will be compiled at startup time and -# loaded at runtime. Policies may have external dependencies that can be -# deployed either as .java, .class or .jar files. While Java and Class files -# may be located in subdirectories, JAR files mustn't. So far, pluggable -# policies have to inherit from either org.xtreemfs.mrc.ac.FileAccessPolicy, -# org.xtreemfs.mrc.osdstatus.OSDSelectionPolicy, or -# org.xtreemfs.common.auth.AuthenticationProvider. Policies identified by -# policy IDs (OSDSelectionPolicy and FileAccessPolicy) require a public static -# long field called POLICY_ID that assigns the policy a unique number. -# policy_dir = /etc/xos/xtreemfs/policies - -geographic_coordinates = 52.455483,13.297405 - -capability_secret = Yagga - -# administrator password for privileged operations -#admin_password = blub - -##################################################################### -# BabuDB configuration # -##################################################################### - -# optional debug level ( -# 0 = emergency, -# 1 = alert, -# 2 = critical, -# 3 = error, -# 4 = warning, -# 5 = notice, -# 6 = info, -# 7 = debug) -babudb.debug.level = 4 - -# optional debug category -#babudb.debug.category = all - -# name for the database configuration file -#babudb.cfgFile = config.db - -# base directory to store database index snapshots in -babudb.baseDir = /tmp/xtreemfs-test/mrc/database - -# directory in which the database logs are stored -babudb.logDir = /tmp/xtreemfs-test/mrc/db-log - -# SyncMode the synchronization mode to use for the logFile -# ASYNC - asynchronously write log entries (data is lost when system crashes). -# FSYNC - executes an fsync on the logfile before acknowledging the operation. -# FDATASYNC -# SYNC_WRITE - synchronously writes the log entry to disk before ack. Does not -# update the metadata. -# SYNC_WRITE_METADATA - synchronously writes the log entry to disk and updates -# the metadata before ack. -babudb.sync = ASYNC - -# max queue length: if > 0, the queue for each worker is limited to maxQ -babudb.worker.maxQueueLength = 250 - -# number of worker threads to use -babudb.worker.numThreads = 0 - -# a checkpoint is generated ,if maxLogfileSize is exceeded -babudb.maxLogfileSize = 16777216 - -# interval between two checks in seconds, 0 disables auto checkPointing -babudb.checkInterval = 300 - -# if set to a value > 0, operations are acknowledged immediately before -# they are written to the disk log. The disk logger will do batch writes -# and call fSync... every pseudoSyncWait seconds. This can be used to -# increase performance and emulate PostgreSQL behavior. -babudb.pseudoSyncWait = 0 - -# flag that determines whether the indices shall be compressed or not. -#babudb.compression = false - -#TOGGLE COMMENT OF THE FOLLOWING LINES TO ENABLE THE REPLICATION -#CHECK THE REFERENCE FOR FURTHER INFORMATIONS - -###################################################################### -## BabuDB replication configuration # -###################################################################### -# -## local time renew in milliseconds -##babudb.localTimeRenew = 3000 -# -## specifies if the DBs should be modified optimistic. -## if you want to use the replication with a pseudoSyncWait > 0 set -## this flag true to increase performance and lose data integrity. -## if pseudoSyncWait is set to 0 it is highly recommended to leave this -## flag false. -##babudb.repl.optimistic = false -# -## specify whether SSL is required -#babudb.ssl.enabled = false -# -## server credentials for SSL handshakes -##babudb.ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/dir.p12 -##babudb.ssl.service_creds.pw = xtreemfs -##babudb.ssl.service_creds.container = pkcs12 -# -## trusted certificates for SSL handshakes -##babudb.ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/xosrootca.jks -##babudb.ssl.trusted_certs.pw = xtreemfs -##babudb.ssl.trusted_certs.container = jks -# -##babudb.ssl.authenticationWithoutEncryption = false -# -## number of slaves that at least have to be up to date -#babudb.repl.sync.n = 0 -# -## participants of the replication including the local address -#babudb.repl.participant.0 = local.host.com -#babudb.repl.participant.0.port = 35667 -#babudb.repl.participant.1 = other.host.com -#babudb.repl.participant.1.port = 35666 -# -## chunk size, for initial load of file chunks -##babudb.repl.chunkSize = 5242880 -# -## DB backup directory - needed for the initial loading of the BabuDB from the -## master in replication context. -#babudb.repl.backupDir = /tmp/babuDB/backup/ \ No newline at end of file diff --git a/etc/xos/xtreemfs/osdconfig.properties b/etc/xos/xtreemfs/osdconfig.properties deleted file mode 100644 index 3440b7e7c48e1b341fb569e502b60371aac55f1c..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/osdconfig.properties +++ /dev/null @@ -1,93 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32640 - -# port for the status page (HTTP server) -http_port = 30640 - -# optional address for network device, "any" if not specified -# listen.address = 127.0.0.1 - -# optinal host name that is used to register the service at the DIR -# hostname = foo.bar.com - -# Directory Service endpoint -dir_service.host = localhost -dir_service.port = 32638 - -# directory containing XtreemFS file content -object_dir = /var/lib/xtreemfs/objs/ - -# granularity of the local clock (in ms) -local_clock_renewal = 50 - -# interval between two remote clock syncs (in ms) -remote_time_sync = 60000 - -# specify whether SSL is required -ssl.enabled = false - -# server credentials for SSL handshakes -ssl.service_creds = /etc/xos/xtreemfs/truststore/certs/osd.p12 -ssl.service_creds.pw = xtreemfs -ssl.service_creds.container = pkcs12 - -# trusted certificates for SSL handshakes -ssl.trusted_certs = /etc/xos/xtreemfs/truststore/certs/xosrootca.jks -ssl.trusted_certs.pw = xtreemfs -ssl.trusted_certs.container = jks - -# Enables the Grid SSL mode. This mode uses SSL only for user authentication -# and sends all data via an unencrypted TCP connection. -#ssl.gridSSL = false - -report_free_space = true - -# specify whether internal OSD checksums are required -# if the flag is set to true, the OSD will calculate checksums for -# newly created objects, which will be checked when the object is read -checksums.enabled = false - -# algorithm used for checksum calculation -# by default, Adler32, CRC32, MD5 and SHA-1 are supported -checksums.algorithm = Adler32 - -# Shared secret between the MRC and all OSDs. -# The secret is used by the MRC to sign capabilities, i.e. security tokens for -# data access at OSDs. In turn, an OSD uses the secret to verify that the -# capability has been issued by the MRC. The shared secret will be replaced by -# a public key infrastructure in future releases. -capability_secret = secretPassphrase - -# administrator password for privileged operations -#admin_password = passphrase - -# time to wait for the directory service to become available on start-up -# before aborting -#startup.wait_for_dir = 30 - -# UUID for the OSD -uuid = default-OSD diff --git a/etc/xos/xtreemfs/osdconfig.ssl_test b/etc/xos/xtreemfs/osdconfig.ssl_test deleted file mode 100644 index a3bd913f2b49cb08b5987e6c40a2aed3287b2c6a..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/osdconfig.ssl_test +++ /dev/null @@ -1,82 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32640 - -http_port = 30640 - -# optional address for network device, "any" if not specified -#listen.address = 127.0.0.1 - -# Directory Service endpoint -dir_service.host = localhost -dir_service.port = 32638 - -# directory containing XtreemFS file content -object_dir = /tmp/xtreemfs-test/osd/ - -# granularity of the local clock (in ms) -local_clock_renewal = 50 - -# interval between two remote clock syncs (in ms) -remote_time_sync = 60000 - -# specify whether SSL is required -ssl.enabled = true - -# server credentials for SSL handshakes -ssl.service_creds = test/certs/OSD.p12 -ssl.service_creds.pw = passphrase -ssl.service_creds.container = pkcs12 - -# trusted certificates for SSL handshakes -ssl.trusted_certs = test/certs/trusted.jks -ssl.trusted_certs.pw = passphrase -ssl.trusted_certs.container = jks - -report_free_space = true - -# specify whether internal OSD checksums are required -# if the flag is set to true, the OSD will calculate checksums for -# newly created objects, which will be checked when the object is read -checksums.enabled = false - -# algorithm used for checksum calculation -# by default, Adler32, CRC32, MD5 and SHA-1 are supported -checksums.algorithm = Adler32 - -# UUID for the OSD -# IMPORTANT: replace 'localhost' with a reachable host name/IP address -#uuid = http://farnsworth.zib.de:32640 -uuid = test-localhost-OSD - -checksums.enabled = false - -geographic_coordinates = 41.388417,2.114632 - -capability_secret = Yagga - -# administrator password for privileged operations -#admin_password = blub diff --git a/etc/xos/xtreemfs/osdconfig.test b/etc/xos/xtreemfs/osdconfig.test deleted file mode 100644 index be9733b243972545226783c6997f503bc74ff75f..0000000000000000000000000000000000000000 --- a/etc/xos/xtreemfs/osdconfig.test +++ /dev/null @@ -1,75 +0,0 @@ -# optional debug level -# 0: emergency -# 1: alert -# 2: critical -# 3: error -# 4: warning -# 5: notice -# 6: info (default) -# 7: debug -#debug.level = 6 - -# optional debug categories - a space or comma-separated list of log message categories -# all (default) - enable logging for all categories -# lifecycle - log messaages pertaining to service lifecycles (threads) -# buffer - logs messages pertaining to buffers -# net - network-related log messages -# auth - authorization-related log messages -# stage - log messages pertaining to the request flow through the stages -# proc - log messages pertaining to any kind of request processing -# db - log messages pertaining storage on OSD or database access on MRC/DIR -# replication - logs messages pertaining to replication -# misc - any other log messages -#debug.categories = all - -# port for the service to listen on -listen.port = 32640 - -http_port = 30640 - -# optional address for network device, "any" if not specified -#listen.address = 127.0.0.1 - -# optinal host name that is used to register the service at the DIR -# hostname = foo.bar.com - -# Directory Service endpoint -dir_service.host = localhost -dir_service.port = 32638 - -# directory containing XtreemFS file content -object_dir = /tmp/xtreemfs-test/osd/ - -# granularity of the local clock (in ms) -local_clock_renewal = 50 - -# interval between two remote clock syncs (in ms) -remote_time_sync = 60000 - -# specify whether SSL is required -ssl.enabled = false - -report_free_space = true - -# specify whether internal OSD checksums are required -# if the flag is set to true, the OSD will calculate checksums for -# newly created objects, which will be checked when the object is read -checksums.enabled = false - -# algorithm used for checksum calculation -# by default, Adler32, CRC32, MD5 and SHA-1 are supported -checksums.algorithm = Adler32 - -# UUID for the OSD -# IMPORTANT: replace 'localhost' with a reachable host name/IP address -#uuid = http://farnsworth.zib.de:32640 -uuid = test-localhost-OSD - -checksums.enabled = false - -geographic_coordinates = 41.388417,2.114632 - -capability_secret = Yagga - -# administrator password for privileged operations -#admin_password = blub diff --git a/include/xtreemfs.h b/include/xtreemfs.h deleted file mode 100644 index ef758eded0432f383e00a99d56a5400697271b1a..0000000000000000000000000000000000000000 --- a/include/xtreemfs.h +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_H_ -#define _XTREEMFS_H_ - -#include "xtreemfs/crash_reporter.h" -#include "xtreemfs/dir_proxy.h" -#include "xtreemfs/mrc_proxy.h" -#include "xtreemfs/options.h" -#include "xtreemfs/osd_proxy.h" -#include "xtreemfs/osd_proxies.h" -#include "xtreemfs/volume.h" - -#endif diff --git a/include/xtreemfs/crash_reporter.h b/include/xtreemfs/crash_reporter.h deleted file mode 100644 index ce472d0cf92300364ffc1d4f3be60a4954e4ba12..0000000000000000000000000000000000000000 --- a/include/xtreemfs/crash_reporter.h +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_CRASH_REPORTER_H_ -#define _XTREEMFS_CRASH_REPORTER_H_ - -#if defined(_WIN32) -#define XTREEMFS_HAVE_GOOGLE_BREAKPAD 1 -#elif defined(__linux) -#define XTREEMFS_HAVE_GOOGLE_BREAKPAD 1 -#endif - -#ifdef XTREEMFS_HAVE_GOOGLE_BREAKPAD -namespace google_breakpad { class ExceptionHandler; } -#endif - -#include "yield.h" - - -namespace xtreemfs -{ - using yield::ipc::URI; - using yield::platform::Log; - using yield::platform::Path; - - - class CrashReporter - { - public: - CrashReporter* create( const URI& put_crash_dump_uri, Log* log = NULL ); - ~CrashReporter(); - -#ifdef XTREEMFS_HAVE_GOOGLE_BREAKPAD - bool MinidumpCallback( const Path&, const Path&, bool ); -#endif - - private: - CrashReporter( Log* log, const URI& put_crash_dump_uri ); - - private: -#ifdef XTREEMFS_HAVE_GOOGLE_BREAKPAD - google_breakpad::ExceptionHandler* exception_handler; -#endif - Log* log; - URI put_crash_dump_uri; - }; -}; - -#endif diff --git a/include/xtreemfs/dir_proxy.h b/include/xtreemfs/dir_proxy.h deleted file mode 100644 index ac9095a59b51f86b5e942890779c37ef3bc882a3..0000000000000000000000000000000000000000 --- a/include/xtreemfs/dir_proxy.h +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_DIR_PROXY_H_ -#define _XTREEMFS_DIR_PROXY_H_ - -#include "xtreemfs/proxy.h" -#include "xtreemfs/interfaces/dir_interface.h" - - -namespace xtreemfs -{ - class Options; - using org::xtreemfs::interfaces::AddressMappingSet; - - - class DIRProxy - : public org::xtreemfs::interfaces::DIRInterfaceProxy, - public Proxy - { - public: - DIRProxy( EventHandler& request_handler ); // Steals this reference - virtual ~DIRProxy(); - - static DIRProxy& create( const Options& options ); - - static DIRProxy& - create - ( - const URI& absolute_uri, - Log* error_log = NULL, -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* ssl_context = NULL, -#endif - Log* trace_log = NULL - ); - - AddressMappingSet& getAddressMappingsFromUUID( const string& uuid ); - URI getVolumeURIFromVolumeName( const string& volume_name_utf8 ); - - // yidl::runtime::Object - DIRProxy& inc_ref() { return Object::inc_ref( *this ); } - - private: - class CachedAddressMappings; - map uuid_to_address_mappings_cache; - yield::platform::Mutex uuid_to_address_mappings_cache_lock; - }; -}; - -#endif diff --git a/include/xtreemfs/interfaces/constants.h b/include/xtreemfs/interfaces/constants.h deleted file mode 100644 index 36da0f382cb2675f70059253654b447f865cbf42..0000000000000000000000000000000000000000 --- a/include/xtreemfs/interfaces/constants.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _1379328260_H_ -#define _1379328260_H_ - - -#include "yidl.h" - - -namespace org -{ - namespace xtreemfs - { - namespace interfaces - { - const static char* REPL_UPDATE_PC_NONE = ""; - const static char* REPL_UPDATE_PC_RONLY = "ronly"; - const static char* REPL_UPDATE_PC_WARONE = "WaR1"; - const static char* REPL_UPDATE_PC_WARA = "WaRa"; - const static char* REPL_UPDATE_PC_WQRQ = "WqRq"; - const static uint32_t REPL_FLAG_FULL_REPLICA = 1; - const static uint32_t REPL_FLAG_IS_COMPLETE = 2; - const static uint32_t REPL_FLAG_STRATEGY_RANDOM = 4; - const static uint32_t REPL_FLAG_STRATEGY_RAREST_FIRST = 8; - const static uint32_t REPL_FLAG_STRATEGY_SEQUENTIAL = 16; - const static uint32_t REPL_FLAG_STRATEGY_SEQUENTIAL_PREFETCHING = 32; - const static uint32_t SYSTEM_V_FCNTL_H_O_RDONLY = 0x0000; - const static uint32_t SYSTEM_V_FCNTL_H_O_WRONLY = 0x0001; - const static uint32_t SYSTEM_V_FCNTL_H_O_RDWR = 0x0002; - const static uint32_t SYSTEM_V_FCNTL_H_O_APPEND = 0x0008; - const static uint32_t SYSTEM_V_FCNTL_H_O_CREAT = 0x0100; - const static uint32_t SYSTEM_V_FCNTL_H_O_TRUNC = 0x0200; - const static uint32_t SYSTEM_V_FCNTL_H_O_EXCL = 0x0400; - const static uint32_t SYSTEM_V_FCNTL_H_O_SYNC = 0x0010; - const static uint32_t SYSTEM_V_FCNTL_H_S_IFREG = 0x8000; - const static uint32_t SYSTEM_V_FCNTL_H_S_IFDIR = 0x4000; - const static uint32_t SYSTEM_V_FCNTL_H_S_IFLNK = 0xA000; - const static uint32_t XCAP_EXPIRE_TIMEOUT_S_MIN = 30; - const static uint32_t SERVICE_STATUS_AVAIL = 0; - const static uint32_t SERVICE_STATUS_TO_BE_REMOVED = 1; - const static uint32_t SERVICE_STATUS_REMOVED = 2; - }; - }; -}; -#endif diff --git a/include/xtreemfs/interfaces/dir_interface.h b/include/xtreemfs/interfaces/dir_interface.h deleted file mode 100644 index cab528359fe67453e7d9896d7bd1821af7859876..0000000000000000000000000000000000000000 --- a/include/xtreemfs/interfaces/dir_interface.h +++ /dev/null @@ -1,2873 +0,0 @@ -#ifndef _1594446185_H_ -#define _1594446185_H_ - - -#include "constants.h" -#include "types.h" -#include "yield/concurrency.h" -#include "yidl.h" - - -namespace org -{ - namespace xtreemfs - { - namespace interfaces - { - enum ServiceType { SERVICE_TYPE_MIXED = 0, SERVICE_TYPE_MRC = 1, SERVICE_TYPE_OSD = 2, SERVICE_TYPE_VOLUME = 3 }; - - - class AddressMapping : public ::yidl::runtime::Struct - { - public: - AddressMapping() - : version( 0 ), port( 0 ), ttl_s( 0 ) - { } - - AddressMapping - ( - const string& uuid, - uint64_t version, - const string& protocol, - const string& address, - uint16_t port, - const string& match_network, - uint32_t ttl_s, - const string& uri - ) - : uuid( uuid ), - version( version ), - protocol( protocol ), - address( address ), - port( port ), - match_network( match_network ), - ttl_s( ttl_s ), - uri( uri ) - { } - - AddressMapping( const AddressMapping& other ) - : uuid( other.get_uuid() ), - version( other.get_version() ), - protocol( other.get_protocol() ), - address( other.get_address() ), - port( other.get_port() ), - match_network( other.get_match_network() ), - ttl_s( other.get_ttl_s() ), - uri( other.get_uri() ) - { } - - virtual ~AddressMapping() { } - - const string& get_uuid() const { return uuid; } - uint64_t get_version() const { return version; } - const string& get_protocol() const { return protocol; } - const string& get_address() const { return address; } - uint16_t get_port() const { return port; } - const string& get_match_network() const { return match_network; } - uint32_t get_ttl_s() const { return ttl_s; } - const string& get_uri() const { return uri; } - void set_uuid( const string& uuid ) { this->uuid = uuid; } - void set_version( uint64_t version ) { this->version = version; } - void set_protocol( const string& protocol ) { this->protocol = protocol; } - void set_address( const string& address ) { this->address = address; } - void set_port( uint16_t port ) { this->port = port; } - void set_match_network( const string& match_network ) { this->match_network = match_network; } - void set_ttl_s( uint32_t ttl_s ) { this->ttl_s = ttl_s; } - void set_uri( const string& uri ) { this->uri = uri; } - - bool operator==( const AddressMapping& other ) const - { - return get_uuid() == other.get_uuid() - && - get_version() == other.get_version() - && - get_protocol() == other.get_protocol() - && - get_address() == other.get_address() - && - get_port() == other.get_port() - && - get_match_network() == other.get_match_network() - && - get_ttl_s() == other.get_ttl_s() - && - get_uri() == other.get_uri(); - } - - // yidl::runtime::Object - AddressMapping& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030946 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "AddressMapping"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uuid", 0 ), get_uuid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "version", 0 ), get_version() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "protocol", 0 ), get_protocol() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "address", 0 ), get_address() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "port", 0 ), get_port() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "match_network", 0 ), get_match_network() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "ttl_s", 0 ), get_ttl_s() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uri", 0 ), get_uri() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uuid", 0 ), uuid ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "version", 0 ), version ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "protocol", 0 ), protocol ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "address", 0 ), address ); - port = unmarshaller.read_uint16( ::yidl::runtime::Unmarshaller::StringLiteralKey( "port", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "match_network", 0 ), match_network ); - ttl_s = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "ttl_s", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uri", 0 ), uri ); - } - - protected: - string uuid; - uint64_t version; - string protocol; - string address; - uint16_t port; - string match_network; - uint32_t ttl_s; - string uri; - }; - - class AddressMappingSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - AddressMappingSet() { } - AddressMappingSet( const org::xtreemfs::interfaces::AddressMapping& first_value ) { vector::push_back( first_value ); } - AddressMappingSet( size_type size ) : vector( size ) { } - virtual ~AddressMappingSet() { } - - // yidl::runtime::Object - AddressMappingSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030947 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "AddressMappingSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::AddressMapping value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class DirService : public ::yidl::runtime::Struct - { - public: - DirService() - : port( 0 ), interface_version( 0 ) - { } - - DirService - ( - const string& address, - uint16_t port, - const string& protocol, - uint32_t interface_version - ) - : address( address ), - port( port ), - protocol( protocol ), - interface_version( interface_version ) - { } - - DirService( const DirService& other ) - : address( other.get_address() ), - port( other.get_port() ), - protocol( other.get_protocol() ), - interface_version( other.get_interface_version() ) - { } - - virtual ~DirService() { } - - const string& get_address() const { return address; } - uint16_t get_port() const { return port; } - const string& get_protocol() const { return protocol; } - uint32_t get_interface_version() const { return interface_version; } - void set_address( const string& address ) { this->address = address; } - void set_port( uint16_t port ) { this->port = port; } - void set_protocol( const string& protocol ) { this->protocol = protocol; } - void set_interface_version( uint32_t interface_version ) { this->interface_version = interface_version; } - - bool operator==( const DirService& other ) const - { - return get_address() == other.get_address() - && - get_port() == other.get_port() - && - get_protocol() == other.get_protocol() - && - get_interface_version() == other.get_interface_version(); - } - - // yidl::runtime::Object - DirService& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030952 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "DirService"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "address", 0 ), get_address() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "port", 0 ), get_port() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "protocol", 0 ), get_protocol() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "interface_version", 0 ), get_interface_version() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "address", 0 ), address ); - port = unmarshaller.read_uint16( ::yidl::runtime::Unmarshaller::StringLiteralKey( "port", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "protocol", 0 ), protocol ); - interface_version = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "interface_version", 0 ) ); - } - - protected: - string address; - uint16_t port; - string protocol; - uint32_t interface_version; - }; - - class ServiceDataMap - : public ::yidl::runtime::Map, - public map< ::yidl::runtime::Marshaller::StringKey,string > - { - public: - virtual ~ServiceDataMap() { } - - // yidl::runtime::Object - ServiceDataMap& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030948 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ServiceDataMap"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - for ( const_iterator i = begin(); i != end(); i++ ) - { - marshaller.write( i->first, i->second ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - ::yidl::runtime::Marshaller::StringKey* key - = static_cast< ::yidl::runtime::Marshaller::StringKey* > - ( - unmarshaller.read( ::yidl::runtime::Marshaller::Key::TYPE_STRING ) - ); - - if ( key != NULL ) - { - string value; - unmarshaller.read( *key, value ); - ( *this )[*key] = value; - ::yidl::runtime::Unmarshaller::Key::dec_ref( *key ); - } - } - - // yidl::runtime::Map - size_t get_size() const { return size(); } - }; - - class Service : public ::yidl::runtime::Struct - { - public: - Service() - : type( SERVICE_TYPE_MIXED ), version( 0 ), last_updated_s( 0 ) - { } - - Service - ( - org::xtreemfs::interfaces::ServiceType type, - const string& uuid, - uint64_t version, - const string& name, - uint64_t last_updated_s, - const org::xtreemfs::interfaces::ServiceDataMap& data - ) - : type( type ), - uuid( uuid ), - version( version ), - name( name ), - last_updated_s( last_updated_s ), - data( data ) - { } - - Service( const Service& other ) - : type( other.get_type() ), - uuid( other.get_uuid() ), - version( other.get_version() ), - name( other.get_name() ), - last_updated_s( other.get_last_updated_s() ), - data( other.get_data() ) - { } - - virtual ~Service() { } - - org::xtreemfs::interfaces::ServiceType get_type() const { return type; } - const string& get_uuid() const { return uuid; } - uint64_t get_version() const { return version; } - const string& get_name() const { return name; } - uint64_t get_last_updated_s() const { return last_updated_s; } - const org::xtreemfs::interfaces::ServiceDataMap& get_data() const { return data; } - void set_type( org::xtreemfs::interfaces::ServiceType type ) { this->type = type; } - void set_uuid( const string& uuid ) { this->uuid = uuid; } - void set_version( uint64_t version ) { this->version = version; } - void set_name( const string& name ) { this->name = name; } - void set_last_updated_s( uint64_t last_updated_s ) { this->last_updated_s = last_updated_s; } - void set_data( const org::xtreemfs::interfaces::ServiceDataMap& data ) { this->data = data; } - - bool operator==( const Service& other ) const - { - return get_type() == other.get_type() - && - get_uuid() == other.get_uuid() - && - get_version() == other.get_version() - && - get_name() == other.get_name() - && - get_last_updated_s() == other.get_last_updated_s() - && - get_data() == other.get_data(); - } - - // yidl::runtime::Object - Service& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030950 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "Service"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "type", 0 ), static_cast( get_type() ) ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uuid", 0 ), get_uuid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "version", 0 ), get_version() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "name", 0 ), get_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "last_updated_s", 0 ), get_last_updated_s() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "data", 0 ), get_data() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - type = static_cast( unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "type", 0 ) ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uuid", 0 ), uuid ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "version", 0 ), version ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "name", 0 ), name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "last_updated_s", 0 ), last_updated_s ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "data", 0 ), data ); - } - - protected: - org::xtreemfs::interfaces::ServiceType type; - string uuid; - uint64_t version; - string name; - uint64_t last_updated_s; - org::xtreemfs::interfaces::ServiceDataMap data; - }; - - class ServiceSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - ServiceSet() { } - ServiceSet( const org::xtreemfs::interfaces::Service& first_value ) { vector::push_back( first_value ); } - ServiceSet( size_type size ) : vector( size ) { } - virtual ~ServiceSet() { } - - // yidl::runtime::Object - ServiceSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030951 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ServiceSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::Service value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - - class DIRInterface - { - public: - const static uint32_t HTTP_PORT_DEFAULT = 30638; - const static uint32_t ONC_RPC_PORT_DEFAULT = 32638;const static uint32_t TAG = 2010031016; - - virtual ~DIRInterface() { } - - uint32_t get_tag() const { return 2010031016; } - - - - virtual void - xtreemfs_address_mappings_get - ( - const string& uuid, - org::xtreemfs::interfaces::AddressMappingSet& address_mappings - ) - { } - - virtual void xtreemfs_address_mappings_remove( const string& uuid ) { } - - virtual uint64_t - xtreemfs_address_mappings_set - ( - const org::xtreemfs::interfaces::AddressMappingSet& address_mappings - ){ - return 0; - } - - virtual void xtreemfs_checkpoint() { } - - virtual void - xtreemfs_discover_dir - ( - org::xtreemfs::interfaces::DirService& dir_service - ) - { } - - virtual uint64_t xtreemfs_global_time_s_get(){ - return 0; - } - - virtual void xtreemfs_service_deregister( const string& uuid ) { } - - virtual void - xtreemfs_service_get_by_name - ( - const string& name, - org::xtreemfs::interfaces::ServiceSet& services - ) - { } - - virtual void - xtreemfs_service_get_by_type - ( - org::xtreemfs::interfaces::ServiceType type, - org::xtreemfs::interfaces::ServiceSet& services - ) - { } - - virtual void - xtreemfs_service_get_by_uuid - ( - const string& uuid, - org::xtreemfs::interfaces::ServiceSet& services - ) - { } - - virtual void xtreemfs_service_offline( const string& uuid ) { } - - virtual uint64_t - xtreemfs_service_register - ( - const org::xtreemfs::interfaces::Service& service - ){ - return 0; - } - - virtual void xtreemfs_shutdown() { } - }; - - - // Use this macro in an implementation class to get all of the prototypes for the operations in DIRInterface - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_PROTOTYPES\ - virtual void\ - xtreemfs_address_mappings_get\ - (\ - const string& uuid,\ - org::xtreemfs::interfaces::AddressMappingSet& address_mappings\ - );\ - virtual void xtreemfs_address_mappings_remove( const string& uuid );\ - virtual uint64_t\ - xtreemfs_address_mappings_set\ - (\ - const org::xtreemfs::interfaces::AddressMappingSet& address_mappings\ - );\ - virtual void xtreemfs_checkpoint();\ - virtual void\ - xtreemfs_discover_dir\ - (\ - org::xtreemfs::interfaces::DirService& dir_service\ - );\ - virtual uint64_t xtreemfs_global_time_s_get();\ - virtual void xtreemfs_service_deregister( const string& uuid );\ - virtual void\ - xtreemfs_service_get_by_name\ - (\ - const string& name,\ - org::xtreemfs::interfaces::ServiceSet& services\ - );\ - virtual void\ - xtreemfs_service_get_by_type\ - (\ - org::xtreemfs::interfaces::ServiceType type,\ - org::xtreemfs::interfaces::ServiceSet& services\ - );\ - virtual void\ - xtreemfs_service_get_by_uuid\ - (\ - const string& uuid,\ - org::xtreemfs::interfaces::ServiceSet& services\ - );\ - virtual void xtreemfs_service_offline( const string& uuid );\ - virtual uint64_t\ - xtreemfs_service_register\ - (\ - const org::xtreemfs::interfaces::Service& service\ - );\ - virtual void xtreemfs_shutdown();\ - - - #ifndef ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS ORG_XTREEMFS_INTERFACES_EXCEPTION_PARENT_CLASS - #elif defined( ORG_XTREEMFS_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS ORG_XTREEMFS_EXCEPTION_PARENT_CLASS - #elif defined( ORG_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS ORG_EXCEPTION_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS ::yield::concurrency::Exception - #endif - #endif - #ifndef ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS ORG_XTREEMFS_INTERFACES_REQUEST_PARENT_CLASS - #elif defined( ORG_XTREEMFS_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS ORG_XTREEMFS_REQUEST_PARENT_CLASS - #elif defined( ORG_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS ORG_REQUEST_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS ::yield::concurrency::Request - #endif - #endif - #ifndef ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS ORG_XTREEMFS_INTERFACES_RESPONSE_PARENT_CLASS - #elif defined( ORG_XTREEMFS_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS ORG_XTREEMFS_RESPONSE_PARENT_CLASS - #elif defined( ORG_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS ORG_RESPONSE_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS ::yield::concurrency::Response - #endif - #endif - - - class DIRInterfaceMessages - { - public: - // Request/response pair definitions for the operations in DIRInterface - class xtreemfs_address_mappings_getRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_address_mappings_getRequest() { } - - xtreemfs_address_mappings_getRequest( const string& uuid ) - : uuid( uuid ) - { } - - xtreemfs_address_mappings_getRequest( const xtreemfs_address_mappings_getRequest& other ) - : uuid( other.get_uuid() ) - { } - - virtual ~xtreemfs_address_mappings_getRequest() { } - - const string& get_uuid() const { return uuid; } - void set_uuid( const string& uuid ) { this->uuid = uuid; } - - bool operator==( const xtreemfs_address_mappings_getRequest& other ) const - { - return get_uuid() == other.get_uuid(); - } - - // yidl::runtime::Object - xtreemfs_address_mappings_getRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031017 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_address_mappings_getRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uuid", 0 ), get_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uuid", 0 ), uuid ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_address_mappings_getResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::AddressMappingSet& address_mappings - ) - { - respond - ( - *new xtreemfs_address_mappings_getResponse - ( - address_mappings - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string uuid; - }; - - - class xtreemfs_address_mappings_getResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_address_mappings_getResponse() { } - - xtreemfs_address_mappings_getResponse - ( - const org::xtreemfs::interfaces::AddressMappingSet& address_mappings - ) - : address_mappings( address_mappings ) - { } - - xtreemfs_address_mappings_getResponse( const xtreemfs_address_mappings_getResponse& other ) - : address_mappings( other.get_address_mappings() ) - { } - - virtual ~xtreemfs_address_mappings_getResponse() { } - - const org::xtreemfs::interfaces::AddressMappingSet& get_address_mappings() const { return address_mappings; } - void set_address_mappings( const org::xtreemfs::interfaces::AddressMappingSet& address_mappings ) { this->address_mappings = address_mappings; } - - bool operator==( const xtreemfs_address_mappings_getResponse& other ) const - { - return get_address_mappings() == other.get_address_mappings(); - } - - // yidl::runtime::Object - xtreemfs_address_mappings_getResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031017 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_address_mappings_getResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "address_mappings", 0 ), get_address_mappings() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "address_mappings", 0 ), address_mappings ); - } - - protected: - org::xtreemfs::interfaces::AddressMappingSet address_mappings; - }; - - - class xtreemfs_address_mappings_removeRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_address_mappings_removeRequest() { } - - xtreemfs_address_mappings_removeRequest( const string& uuid ) - : uuid( uuid ) - { } - - xtreemfs_address_mappings_removeRequest( const xtreemfs_address_mappings_removeRequest& other ) - : uuid( other.get_uuid() ) - { } - - virtual ~xtreemfs_address_mappings_removeRequest() { } - - const string& get_uuid() const { return uuid; } - void set_uuid( const string& uuid ) { this->uuid = uuid; } - - bool operator==( const xtreemfs_address_mappings_removeRequest& other ) const - { - return get_uuid() == other.get_uuid(); - } - - // yidl::runtime::Object - xtreemfs_address_mappings_removeRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031018 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_address_mappings_removeRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uuid", 0 ), get_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uuid", 0 ), uuid ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_address_mappings_removeResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_address_mappings_removeResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string uuid; - }; - - - class xtreemfs_address_mappings_removeResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_address_mappings_removeResponse() { } - - bool operator==( const xtreemfs_address_mappings_removeResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_address_mappings_removeResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031018 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_address_mappings_removeResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_address_mappings_setRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_address_mappings_setRequest() { } - - xtreemfs_address_mappings_setRequest - ( - const org::xtreemfs::interfaces::AddressMappingSet& address_mappings - ) - : address_mappings( address_mappings ) - { } - - xtreemfs_address_mappings_setRequest( const xtreemfs_address_mappings_setRequest& other ) - : address_mappings( other.get_address_mappings() ) - { } - - virtual ~xtreemfs_address_mappings_setRequest() { } - - const org::xtreemfs::interfaces::AddressMappingSet& get_address_mappings() const { return address_mappings; } - void set_address_mappings( const org::xtreemfs::interfaces::AddressMappingSet& address_mappings ) { this->address_mappings = address_mappings; } - - bool operator==( const xtreemfs_address_mappings_setRequest& other ) const - { - return get_address_mappings() == other.get_address_mappings(); - } - - // yidl::runtime::Object - xtreemfs_address_mappings_setRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031019 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_address_mappings_setRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "address_mappings", 0 ), get_address_mappings() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "address_mappings", 0 ), address_mappings ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_address_mappings_setResponse; - } - - virtual void respond( uint64_t _return_value ) - { - respond( *new xtreemfs_address_mappings_setResponse( _return_value ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::AddressMappingSet address_mappings; - }; - - - class xtreemfs_address_mappings_setResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_address_mappings_setResponse() - : _return_value( 0 ) - { } - - xtreemfs_address_mappings_setResponse( uint64_t _return_value ) - : _return_value( _return_value ) - { } - - xtreemfs_address_mappings_setResponse( const xtreemfs_address_mappings_setResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_address_mappings_setResponse() { } - - uint64_t get__return_value() const { return _return_value; } - void set__return_value( uint64_t _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_address_mappings_setResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_address_mappings_setResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031019 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_address_mappings_setResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - uint64_t _return_value; - }; - - - class xtreemfs_checkpointRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_checkpointRequest() { } - - bool operator==( const xtreemfs_checkpointRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_checkpointRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031020 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_checkpointRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_checkpointResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_checkpointResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_checkpointResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_checkpointResponse() { } - - bool operator==( const xtreemfs_checkpointResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_checkpointResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031020 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_checkpointResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_discover_dirRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_discover_dirRequest() { } - - bool operator==( const xtreemfs_discover_dirRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_discover_dirRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031021 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_discover_dirRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_discover_dirResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::DirService& dir_service - ) - { - respond - ( - *new xtreemfs_discover_dirResponse - ( - dir_service - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_discover_dirResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_discover_dirResponse() { } - - xtreemfs_discover_dirResponse - ( - const org::xtreemfs::interfaces::DirService& dir_service - ) - : dir_service( dir_service ) - { } - - xtreemfs_discover_dirResponse( const xtreemfs_discover_dirResponse& other ) - : dir_service( other.get_dir_service() ) - { } - - virtual ~xtreemfs_discover_dirResponse() { } - - const org::xtreemfs::interfaces::DirService& get_dir_service() const { return dir_service; } - void set_dir_service( const org::xtreemfs::interfaces::DirService& dir_service ) { this->dir_service = dir_service; } - - bool operator==( const xtreemfs_discover_dirResponse& other ) const - { - return get_dir_service() == other.get_dir_service(); - } - - // yidl::runtime::Object - xtreemfs_discover_dirResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031021 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_discover_dirResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "dir_service", 0 ), get_dir_service() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "dir_service", 0 ), dir_service ); - } - - protected: - org::xtreemfs::interfaces::DirService dir_service; - }; - - - class xtreemfs_global_time_s_getRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_global_time_s_getRequest() { } - - bool operator==( const xtreemfs_global_time_s_getRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_global_time_s_getRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031022 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_global_time_s_getRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_global_time_s_getResponse; - } - - virtual void respond( uint64_t _return_value ) - { - respond( *new xtreemfs_global_time_s_getResponse( _return_value ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_global_time_s_getResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_global_time_s_getResponse() - : _return_value( 0 ) - { } - - xtreemfs_global_time_s_getResponse( uint64_t _return_value ) - : _return_value( _return_value ) - { } - - xtreemfs_global_time_s_getResponse( const xtreemfs_global_time_s_getResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_global_time_s_getResponse() { } - - uint64_t get__return_value() const { return _return_value; } - void set__return_value( uint64_t _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_global_time_s_getResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_global_time_s_getResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031022 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_global_time_s_getResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - uint64_t _return_value; - }; - - - class xtreemfs_service_deregisterRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_service_deregisterRequest() { } - - xtreemfs_service_deregisterRequest( const string& uuid ) - : uuid( uuid ) - { } - - xtreemfs_service_deregisterRequest( const xtreemfs_service_deregisterRequest& other ) - : uuid( other.get_uuid() ) - { } - - virtual ~xtreemfs_service_deregisterRequest() { } - - const string& get_uuid() const { return uuid; } - void set_uuid( const string& uuid ) { this->uuid = uuid; } - - bool operator==( const xtreemfs_service_deregisterRequest& other ) const - { - return get_uuid() == other.get_uuid(); - } - - // yidl::runtime::Object - xtreemfs_service_deregisterRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031028 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_deregisterRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uuid", 0 ), get_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uuid", 0 ), uuid ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_service_deregisterResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_service_deregisterResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string uuid; - }; - - - class xtreemfs_service_deregisterResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_service_deregisterResponse() { } - - bool operator==( const xtreemfs_service_deregisterResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_service_deregisterResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031028 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_deregisterResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_service_get_by_nameRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_service_get_by_nameRequest() { } - - xtreemfs_service_get_by_nameRequest( const string& name ) - : name( name ) - { } - - xtreemfs_service_get_by_nameRequest( const xtreemfs_service_get_by_nameRequest& other ) - : name( other.get_name() ) - { } - - virtual ~xtreemfs_service_get_by_nameRequest() { } - - const string& get_name() const { return name; } - void set_name( const string& name ) { this->name = name; } - - bool operator==( const xtreemfs_service_get_by_nameRequest& other ) const - { - return get_name() == other.get_name(); - } - - // yidl::runtime::Object - xtreemfs_service_get_by_nameRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031026 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_get_by_nameRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "name", 0 ), get_name() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "name", 0 ), name ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_service_get_by_nameResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::ServiceSet& services ) - { - respond( *new xtreemfs_service_get_by_nameResponse( services ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string name; - }; - - - class xtreemfs_service_get_by_nameResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_service_get_by_nameResponse() { } - - xtreemfs_service_get_by_nameResponse - ( - const org::xtreemfs::interfaces::ServiceSet& services - ) - : services( services ) - { } - - xtreemfs_service_get_by_nameResponse( const xtreemfs_service_get_by_nameResponse& other ) - : services( other.get_services() ) - { } - - virtual ~xtreemfs_service_get_by_nameResponse() { } - - const org::xtreemfs::interfaces::ServiceSet& get_services() const { return services; } - void set_services( const org::xtreemfs::interfaces::ServiceSet& services ) { this->services = services; } - - bool operator==( const xtreemfs_service_get_by_nameResponse& other ) const - { - return get_services() == other.get_services(); - } - - // yidl::runtime::Object - xtreemfs_service_get_by_nameResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031026 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_get_by_nameResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "services", 0 ), get_services() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "services", 0 ), services ); - } - - protected: - org::xtreemfs::interfaces::ServiceSet services; - }; - - - class xtreemfs_service_get_by_typeRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_service_get_by_typeRequest() - : type( SERVICE_TYPE_MIXED ) - { } - - xtreemfs_service_get_by_typeRequest - ( - org::xtreemfs::interfaces::ServiceType type - ) - : type( type ) - { } - - xtreemfs_service_get_by_typeRequest( const xtreemfs_service_get_by_typeRequest& other ) - : type( other.get_type() ) - { } - - virtual ~xtreemfs_service_get_by_typeRequest() { } - - org::xtreemfs::interfaces::ServiceType get_type() const { return type; } - void set_type( org::xtreemfs::interfaces::ServiceType type ) { this->type = type; } - - bool operator==( const xtreemfs_service_get_by_typeRequest& other ) const - { - return get_type() == other.get_type(); - } - - // yidl::runtime::Object - xtreemfs_service_get_by_typeRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031024 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_get_by_typeRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "type", 0 ), static_cast( get_type() ) ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - type = static_cast( unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "type", 0 ) ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_service_get_by_typeResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::ServiceSet& services ) - { - respond( *new xtreemfs_service_get_by_typeResponse( services ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::ServiceType type; - }; - - - class xtreemfs_service_get_by_typeResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_service_get_by_typeResponse() { } - - xtreemfs_service_get_by_typeResponse - ( - const org::xtreemfs::interfaces::ServiceSet& services - ) - : services( services ) - { } - - xtreemfs_service_get_by_typeResponse( const xtreemfs_service_get_by_typeResponse& other ) - : services( other.get_services() ) - { } - - virtual ~xtreemfs_service_get_by_typeResponse() { } - - const org::xtreemfs::interfaces::ServiceSet& get_services() const { return services; } - void set_services( const org::xtreemfs::interfaces::ServiceSet& services ) { this->services = services; } - - bool operator==( const xtreemfs_service_get_by_typeResponse& other ) const - { - return get_services() == other.get_services(); - } - - // yidl::runtime::Object - xtreemfs_service_get_by_typeResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031024 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_get_by_typeResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "services", 0 ), get_services() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "services", 0 ), services ); - } - - protected: - org::xtreemfs::interfaces::ServiceSet services; - }; - - - class xtreemfs_service_get_by_uuidRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_service_get_by_uuidRequest() { } - - xtreemfs_service_get_by_uuidRequest( const string& uuid ) - : uuid( uuid ) - { } - - xtreemfs_service_get_by_uuidRequest( const xtreemfs_service_get_by_uuidRequest& other ) - : uuid( other.get_uuid() ) - { } - - virtual ~xtreemfs_service_get_by_uuidRequest() { } - - const string& get_uuid() const { return uuid; } - void set_uuid( const string& uuid ) { this->uuid = uuid; } - - bool operator==( const xtreemfs_service_get_by_uuidRequest& other ) const - { - return get_uuid() == other.get_uuid(); - } - - // yidl::runtime::Object - xtreemfs_service_get_by_uuidRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031025 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_get_by_uuidRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uuid", 0 ), get_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uuid", 0 ), uuid ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_service_get_by_uuidResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::ServiceSet& services ) - { - respond( *new xtreemfs_service_get_by_uuidResponse( services ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string uuid; - }; - - - class xtreemfs_service_get_by_uuidResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_service_get_by_uuidResponse() { } - - xtreemfs_service_get_by_uuidResponse - ( - const org::xtreemfs::interfaces::ServiceSet& services - ) - : services( services ) - { } - - xtreemfs_service_get_by_uuidResponse( const xtreemfs_service_get_by_uuidResponse& other ) - : services( other.get_services() ) - { } - - virtual ~xtreemfs_service_get_by_uuidResponse() { } - - const org::xtreemfs::interfaces::ServiceSet& get_services() const { return services; } - void set_services( const org::xtreemfs::interfaces::ServiceSet& services ) { this->services = services; } - - bool operator==( const xtreemfs_service_get_by_uuidResponse& other ) const - { - return get_services() == other.get_services(); - } - - // yidl::runtime::Object - xtreemfs_service_get_by_uuidResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031025 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_get_by_uuidResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "services", 0 ), get_services() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "services", 0 ), services ); - } - - protected: - org::xtreemfs::interfaces::ServiceSet services; - }; - - - class xtreemfs_service_offlineRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_service_offlineRequest() { } - - xtreemfs_service_offlineRequest( const string& uuid ) - : uuid( uuid ) - { } - - xtreemfs_service_offlineRequest( const xtreemfs_service_offlineRequest& other ) - : uuid( other.get_uuid() ) - { } - - virtual ~xtreemfs_service_offlineRequest() { } - - const string& get_uuid() const { return uuid; } - void set_uuid( const string& uuid ) { this->uuid = uuid; } - - bool operator==( const xtreemfs_service_offlineRequest& other ) const - { - return get_uuid() == other.get_uuid(); - } - - // yidl::runtime::Object - xtreemfs_service_offlineRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031029 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_offlineRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "uuid", 0 ), get_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "uuid", 0 ), uuid ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_service_offlineResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_service_offlineResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string uuid; - }; - - - class xtreemfs_service_offlineResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_service_offlineResponse() { } - - bool operator==( const xtreemfs_service_offlineResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_service_offlineResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031029 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_offlineResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_service_registerRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_service_registerRequest() { } - - xtreemfs_service_registerRequest - ( - const org::xtreemfs::interfaces::Service& service - ) - : service( service ) - { } - - xtreemfs_service_registerRequest( const xtreemfs_service_registerRequest& other ) - : service( other.get_service() ) - { } - - virtual ~xtreemfs_service_registerRequest() { } - - const org::xtreemfs::interfaces::Service& get_service() const { return service; } - void set_service( const org::xtreemfs::interfaces::Service& service ) { this->service = service; } - - bool operator==( const xtreemfs_service_registerRequest& other ) const - { - return get_service() == other.get_service(); - } - - // yidl::runtime::Object - xtreemfs_service_registerRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031027 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_registerRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "service", 0 ), get_service() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "service", 0 ), service ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_service_registerResponse; - } - - virtual void respond( uint64_t _return_value ) - { - respond( *new xtreemfs_service_registerResponse( _return_value ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::Service service; - }; - - - class xtreemfs_service_registerResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_service_registerResponse() - : _return_value( 0 ) - { } - - xtreemfs_service_registerResponse( uint64_t _return_value ) - : _return_value( _return_value ) - { } - - xtreemfs_service_registerResponse( const xtreemfs_service_registerResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_service_registerResponse() { } - - uint64_t get__return_value() const { return _return_value; } - void set__return_value( uint64_t _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_service_registerResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_service_registerResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031027 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_service_registerResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - uint64_t _return_value; - }; - - - class xtreemfs_shutdownRequest : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_shutdownRequest() { } - - bool operator==( const xtreemfs_shutdownRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_shutdownRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031030 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_shutdownRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_shutdownResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_shutdownResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_shutdownResponse : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_shutdownResponse() { } - - bool operator==( const xtreemfs_shutdownResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_shutdownResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031030 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_shutdownResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class ConcurrentModificationException : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - ConcurrentModificationException() { } - ConcurrentModificationException( const string& stack_trace ) : stack_trace( stack_trace ) { } - virtual ~ConcurrentModificationException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031036 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ConcurrentModificationException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new ConcurrentModificationException( get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw ConcurrentModificationException( get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class DIRException : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - DIRException() { } - DIRException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_code ) { } - DIRException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - DIRException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - DIRException( uint32_t error_code, const char* error_message ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - DIRException( uint32_t error_code, const string& error_message ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - DIRException( uint32_t error_code, const string& error_message, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ), stack_trace( stack_trace ) { } - virtual ~DIRException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031039 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "DIRException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new DIRException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw DIRException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class InvalidArgumentException : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - InvalidArgumentException() { } - InvalidArgumentException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - InvalidArgumentException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - virtual ~InvalidArgumentException() throw() { ; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031037 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "InvalidArgumentException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new InvalidArgumentException( get_error_message() ); - } - - virtual void throwStackClone() const - { - throw InvalidArgumentException( get_error_message() ); - } - }; - - - class ProtocolException : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - ProtocolException() : accept_stat( 0 ) { } - ProtocolException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_code ), accept_stat( 0 ) { } - ProtocolException( uint32_t accept_stat, uint32_t error_code, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS( error_code ), accept_stat( accept_stat ), stack_trace( stack_trace ) { } - virtual ~ProtocolException() throw() { ; } - - uint32_t get_accept_stat() const { return accept_stat; } - void set_accept_stat( uint32_t accept_stat ) { this->accept_stat = accept_stat; } - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031038 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ProtocolException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "accept_stat", 0 ), get_accept_stat() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - accept_stat = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "accept_stat", 0 ) ); - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new ProtocolException( get_accept_stat(), get_error_code(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw ProtocolException( get_accept_stat(), get_error_code(), get_stack_trace() ); - } - - protected: - uint32_t accept_stat; - string stack_trace; - }; - - - class RedirectException : public ORG_XTREEMFS_INTERFACES_DIRINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - RedirectException() : port( 0 ) { } - RedirectException( const string& address, uint16_t port ) : address( address ), port( port ) { } - virtual ~RedirectException() throw() { ; } - - const string& get_address() const { return address; } - void set_address( const string& address ) { this->address = address; } - uint16_t get_port() const { return port; } - void set_port( uint16_t port ) { this->port = port; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031040 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "RedirectException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "address", 0 ), get_address() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "port", 0 ), get_port() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "address", 0 ), address ); - port = unmarshaller.read_uint16( ::yidl::runtime::Unmarshaller::StringLiteralKey( "port", 0 ) ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new RedirectException( get_address(), get_port() ); - } - - virtual void throwStackClone() const - { - throw RedirectException( get_address(), get_port() ); - } - - protected: - string address; - uint16_t port; - }; - }; - - - class DIRInterfaceMessageFactory - : public ::yield::concurrency::MessageFactory, - private DIRInterfaceMessages - { - public: - // yield::concurrency::MessageFactory - virtual ::yield::concurrency::Exception* createException( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031036: return new ConcurrentModificationException; - case 2010031039: return new DIRException; - case 2010031037: return new InvalidArgumentException; - case 2010031038: return new ProtocolException; - case 2010031040: return new RedirectException; - default: return NULL; - } - } - - virtual ::yield::concurrency::Exception* - createException - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 31 && strncmp( type_name, "ConcurrentModificationException", 31 ) == 0 ) return new ConcurrentModificationException; - else if ( type_name_len == 12 && strncmp( type_name, "DIRException", 12 ) == 0 ) return new DIRException; - else if ( type_name_len == 24 && strncmp( type_name, "InvalidArgumentException", 24 ) == 0 ) return new InvalidArgumentException; - else if ( type_name_len == 17 && strncmp( type_name, "ProtocolException", 17 ) == 0 ) return new ProtocolException; - else if ( type_name_len == 17 && strncmp( type_name, "RedirectException", 17 ) == 0 ) return new RedirectException; - else return NULL; - } - - virtual ::yield::concurrency::Request* createRequest( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031017: return new xtreemfs_address_mappings_getRequest; - case 2010031018: return new xtreemfs_address_mappings_removeRequest; - case 2010031019: return new xtreemfs_address_mappings_setRequest; - case 2010031020: return new xtreemfs_checkpointRequest; - case 2010031021: return new xtreemfs_discover_dirRequest; - case 2010031022: return new xtreemfs_global_time_s_getRequest; - case 2010031028: return new xtreemfs_service_deregisterRequest; - case 2010031026: return new xtreemfs_service_get_by_nameRequest; - case 2010031024: return new xtreemfs_service_get_by_typeRequest; - case 2010031025: return new xtreemfs_service_get_by_uuidRequest; - case 2010031029: return new xtreemfs_service_offlineRequest; - case 2010031027: return new xtreemfs_service_registerRequest; - case 2010031030: return new xtreemfs_shutdownRequest; - default: return NULL; - } - } - - virtual ::yield::concurrency::Request* - createRequest - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 36 && strncmp( type_name, "xtreemfs_address_mappings_getRequest", 36 ) == 0 ) return new xtreemfs_address_mappings_getRequest; - else if ( type_name_len == 39 && strncmp( type_name, "xtreemfs_address_mappings_removeRequest", 39 ) == 0 ) return new xtreemfs_address_mappings_removeRequest; - else if ( type_name_len == 36 && strncmp( type_name, "xtreemfs_address_mappings_setRequest", 36 ) == 0 ) return new xtreemfs_address_mappings_setRequest; - else if ( type_name_len == 26 && strncmp( type_name, "xtreemfs_checkpointRequest", 26 ) == 0 ) return new xtreemfs_checkpointRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_discover_dirRequest", 28 ) == 0 ) return new xtreemfs_discover_dirRequest; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_global_time_s_getRequest", 33 ) == 0 ) return new xtreemfs_global_time_s_getRequest; - else if ( type_name_len == 34 && strncmp( type_name, "xtreemfs_service_deregisterRequest", 34 ) == 0 ) return new xtreemfs_service_deregisterRequest; - else if ( type_name_len == 35 && strncmp( type_name, "xtreemfs_service_get_by_nameRequest", 35 ) == 0 ) return new xtreemfs_service_get_by_nameRequest; - else if ( type_name_len == 35 && strncmp( type_name, "xtreemfs_service_get_by_typeRequest", 35 ) == 0 ) return new xtreemfs_service_get_by_typeRequest; - else if ( type_name_len == 35 && strncmp( type_name, "xtreemfs_service_get_by_uuidRequest", 35 ) == 0 ) return new xtreemfs_service_get_by_uuidRequest; - else if ( type_name_len == 31 && strncmp( type_name, "xtreemfs_service_offlineRequest", 31 ) == 0 ) return new xtreemfs_service_offlineRequest; - else if ( type_name_len == 32 && strncmp( type_name, "xtreemfs_service_registerRequest", 32 ) == 0 ) return new xtreemfs_service_registerRequest; - else if ( type_name_len == 24 && strncmp( type_name, "xtreemfs_shutdownRequest", 24 ) == 0 ) return new xtreemfs_shutdownRequest; - else return NULL; - } - - virtual ::yield::concurrency::Response* createResponse( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031017: return new xtreemfs_address_mappings_getResponse; - case 2010031018: return new xtreemfs_address_mappings_removeResponse; - case 2010031019: return new xtreemfs_address_mappings_setResponse; - case 2010031020: return new xtreemfs_checkpointResponse; - case 2010031021: return new xtreemfs_discover_dirResponse; - case 2010031022: return new xtreemfs_global_time_s_getResponse; - case 2010031028: return new xtreemfs_service_deregisterResponse; - case 2010031026: return new xtreemfs_service_get_by_nameResponse; - case 2010031024: return new xtreemfs_service_get_by_typeResponse; - case 2010031025: return new xtreemfs_service_get_by_uuidResponse; - case 2010031029: return new xtreemfs_service_offlineResponse; - case 2010031027: return new xtreemfs_service_registerResponse; - case 2010031030: return new xtreemfs_shutdownResponse; - default: return NULL; - } - } - - virtual ::yield::concurrency::Response* - createResponse - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 37 && strncmp( type_name, "xtreemfs_address_mappings_getResponse", 37 ) == 0 ) return new xtreemfs_address_mappings_getResponse; - else if ( type_name_len == 40 && strncmp( type_name, "xtreemfs_address_mappings_removeResponse", 40 ) == 0 ) return new xtreemfs_address_mappings_removeResponse; - else if ( type_name_len == 37 && strncmp( type_name, "xtreemfs_address_mappings_setResponse", 37 ) == 0 ) return new xtreemfs_address_mappings_setResponse; - else if ( type_name_len == 27 && strncmp( type_name, "xtreemfs_checkpointResponse", 27 ) == 0 ) return new xtreemfs_checkpointResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_discover_dirResponse", 29 ) == 0 ) return new xtreemfs_discover_dirResponse; - else if ( type_name_len == 34 && strncmp( type_name, "xtreemfs_global_time_s_getResponse", 34 ) == 0 ) return new xtreemfs_global_time_s_getResponse; - else if ( type_name_len == 35 && strncmp( type_name, "xtreemfs_service_deregisterResponse", 35 ) == 0 ) return new xtreemfs_service_deregisterResponse; - else if ( type_name_len == 36 && strncmp( type_name, "xtreemfs_service_get_by_nameResponse", 36 ) == 0 ) return new xtreemfs_service_get_by_nameResponse; - else if ( type_name_len == 36 && strncmp( type_name, "xtreemfs_service_get_by_typeResponse", 36 ) == 0 ) return new xtreemfs_service_get_by_typeResponse; - else if ( type_name_len == 36 && strncmp( type_name, "xtreemfs_service_get_by_uuidResponse", 36 ) == 0 ) return new xtreemfs_service_get_by_uuidResponse; - else if ( type_name_len == 32 && strncmp( type_name, "xtreemfs_service_offlineResponse", 32 ) == 0 ) return new xtreemfs_service_offlineResponse; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_service_registerResponse", 33 ) == 0 ) return new xtreemfs_service_registerResponse; - else if ( type_name_len == 25 && strncmp( type_name, "xtreemfs_shutdownResponse", 25 ) == 0 ) return new xtreemfs_shutdownResponse; - else return NULL; - } - - - // yidl::runtime::MarshallableObjectFactory - virtual ::yidl::runtime::MarshallableObject* - createMarshallableObject - ( - uint32_t type_id - ) - { - switch ( type_id ) - { - case 2010030951: return new ServiceSet; - case 2010030950: return new Service; - case 2010030918: return new UserCredentials; - case 2010030948: return new ServiceDataMap; - case 2010030947: return new AddressMappingSet; - case 2010030946: return new AddressMapping; - case 2010030952: return new DirService; - case 2010030917: return new StringSet; - default: return NULL; - } - } - - virtual ::yidl::runtime::MarshallableObject* - createMarshallableObject - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 10 && strncmp( type_name, "ServiceSet", 10 ) == 0 ) return new ServiceSet; - else if ( type_name_len == 7 && strncmp( type_name, "Service", 7 ) == 0 ) return new Service; - else if ( type_name_len == 15 && strncmp( type_name, "UserCredentials", 15 ) == 0 ) return new UserCredentials; - else if ( type_name_len == 14 && strncmp( type_name, "ServiceDataMap", 14 ) == 0 ) return new ServiceDataMap; - else if ( type_name_len == 17 && strncmp( type_name, "AddressMappingSet", 17 ) == 0 ) return new AddressMappingSet; - else if ( type_name_len == 14 && strncmp( type_name, "AddressMapping", 14 ) == 0 ) return new AddressMapping; - else if ( type_name_len == 10 && strncmp( type_name, "DirService", 10 ) == 0 ) return new DirService; - else if ( type_name_len == 9 && strncmp( type_name, "StringSet", 9 ) == 0 ) return new StringSet; - else return NULL; - } - }; - - - class DIRInterfaceRequestHandler - : public ::yield::concurrency::RequestHandler, - protected DIRInterfaceMessages - { - public: - DIRInterfaceRequestHandler() // Subclasses must implement - : _interface( NULL ) // all relevant handle*Request methods - { } - - // Steals interface_ to allow for *new - DIRInterfaceRequestHandler( DIRInterface& _interface ) - : _interface( &_interface ) - { } - - virtual ~DIRInterfaceRequestHandler() - { - delete _interface; - } - - // yield::concurrency::RequestHandler - virtual void handle( ::yield::concurrency::Request& request ) - { - // Switch on the request types that this interface handles, unwrap the corresponding requests and delegate to _interface - switch ( request.get_type_id() ) - { - case 2010031017UL: handle( static_cast( request ) ); return; - case 2010031018UL: handle( static_cast( request ) ); return; - case 2010031019UL: handle( static_cast( request ) ); return; - case 2010031020UL: handle( static_cast( request ) ); return; - case 2010031021UL: handle( static_cast( request ) ); return; - case 2010031022UL: handle( static_cast( request ) ); return; - case 2010031028UL: handle( static_cast( request ) ); return; - case 2010031026UL: handle( static_cast( request ) ); return; - case 2010031024UL: handle( static_cast( request ) ); return; - case 2010031025UL: handle( static_cast( request ) ); return; - case 2010031029UL: handle( static_cast( request ) ); return; - case 2010031027UL: handle( static_cast( request ) ); return; - case 2010031030UL: handle( static_cast( request ) ); return; - } - } - - protected: - - virtual void handle( xtreemfs_address_mappings_getRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::AddressMappingSet address_mappings; - - _interface->xtreemfs_address_mappings_get - ( - __request.get_uuid(), - address_mappings - ); - - __request.respond( address_mappings ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_address_mappings_removeRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_address_mappings_remove( __request.get_uuid() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_address_mappings_setRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - uint64_t _return_value = - - _interface->xtreemfs_address_mappings_set - ( - __request.get_address_mappings() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_checkpointRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_checkpoint(); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_discover_dirRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::DirService dir_service; - - _interface->xtreemfs_discover_dir( dir_service ); - - __request.respond( dir_service ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_global_time_s_getRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - uint64_t _return_value = - - _interface->xtreemfs_global_time_s_get(); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_service_deregisterRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_service_deregister( __request.get_uuid() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_service_get_by_nameRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ServiceSet services; - - _interface->xtreemfs_service_get_by_name - ( - __request.get_name(), - services - ); - - __request.respond( services ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_service_get_by_typeRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ServiceSet services; - - _interface->xtreemfs_service_get_by_type - ( - __request.get_type(), - services - ); - - __request.respond( services ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_service_get_by_uuidRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ServiceSet services; - - _interface->xtreemfs_service_get_by_uuid - ( - __request.get_uuid(), - services - ); - - __request.respond( services ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_service_offlineRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_service_offline( __request.get_uuid() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_service_registerRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - uint64_t _return_value = - - _interface->xtreemfs_service_register( __request.get_service() ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_shutdownRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_shutdown(); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - private: - DIRInterface* _interface; - }; - - #define ORG_XTREEMFS_INTERFACES_DIRINTERFACE_REQUEST_HANDLER_PROTOTYPES \ - virtual void handle( xtreemfs_address_mappings_getRequest& __request );\ - virtual void handle( xtreemfs_address_mappings_removeRequest& __request );\ - virtual void handle( xtreemfs_address_mappings_setRequest& __request );\ - virtual void handle( xtreemfs_checkpointRequest& __request );\ - virtual void handle( xtreemfs_discover_dirRequest& __request );\ - virtual void handle( xtreemfs_global_time_s_getRequest& __request );\ - virtual void handle( xtreemfs_service_deregisterRequest& __request );\ - virtual void handle( xtreemfs_service_get_by_nameRequest& __request );\ - virtual void handle( xtreemfs_service_get_by_typeRequest& __request );\ - virtual void handle( xtreemfs_service_get_by_uuidRequest& __request );\ - virtual void handle( xtreemfs_service_offlineRequest& __request );\ - virtual void handle( xtreemfs_service_registerRequest& __request );\ - virtual void handle( xtreemfs_shutdownRequest& __request ); - - - class DIRInterfaceProxy - : public DIRInterface, - public ::yield::concurrency::RequestHandler, - private DIRInterfaceMessages - { - public: - DIRInterfaceProxy( ::yield::concurrency::EventHandler& request_handler ) - : __request_handler( request_handler ) - { } - - ~DIRInterfaceProxy() - { - ::yield::concurrency::EventHandler::dec_ref( __request_handler ); - } - - // yidl::runtime::RTTIObject - virtual const char* get_type_name() const - { - return "DIRInterfaceProxy"; - } - - // yield::concurrency::RequestHandler - virtual void handle( ::yield::concurrency::Request& request ) - { - __request_handler.handle( request ); - } - - // DIRInterface - virtual void - xtreemfs_address_mappings_get - ( - const string& uuid, - org::xtreemfs::interfaces::AddressMappingSet& address_mappings - ) - { - xtreemfs_address_mappings_getRequest* __request = new xtreemfs_address_mappings_getRequest( uuid ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - address_mappings = __response->get_address_mappings(); - } - - virtual void xtreemfs_address_mappings_remove( const string& uuid ) - { - xtreemfs_address_mappings_removeRequest* __request = new xtreemfs_address_mappings_removeRequest( uuid ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual uint64_t - xtreemfs_address_mappings_set - ( - const org::xtreemfs::interfaces::AddressMappingSet& address_mappings - ) - { - xtreemfs_address_mappings_setRequest* __request = new xtreemfs_address_mappings_setRequest( address_mappings ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - uint64_t _return_value = __response->get__return_value();return _return_value; - } - - virtual void xtreemfs_checkpoint() - { - xtreemfs_checkpointRequest* __request = new xtreemfs_checkpointRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_discover_dir - ( - org::xtreemfs::interfaces::DirService& dir_service - ) - { - xtreemfs_discover_dirRequest* __request = new xtreemfs_discover_dirRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - dir_service = __response->get_dir_service(); - } - - virtual uint64_t xtreemfs_global_time_s_get() - { - xtreemfs_global_time_s_getRequest* __request = new xtreemfs_global_time_s_getRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - uint64_t _return_value = __response->get__return_value();return _return_value; - } - - virtual void xtreemfs_service_deregister( const string& uuid ) - { - xtreemfs_service_deregisterRequest* __request = new xtreemfs_service_deregisterRequest( uuid ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_service_get_by_name - ( - const string& name, - org::xtreemfs::interfaces::ServiceSet& services - ) - { - xtreemfs_service_get_by_nameRequest* __request = new xtreemfs_service_get_by_nameRequest( name ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - services = __response->get_services(); - } - - virtual void - xtreemfs_service_get_by_type - ( - org::xtreemfs::interfaces::ServiceType type, - org::xtreemfs::interfaces::ServiceSet& services - ) - { - xtreemfs_service_get_by_typeRequest* __request = new xtreemfs_service_get_by_typeRequest( type ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - services = __response->get_services(); - } - - virtual void - xtreemfs_service_get_by_uuid - ( - const string& uuid, - org::xtreemfs::interfaces::ServiceSet& services - ) - { - xtreemfs_service_get_by_uuidRequest* __request = new xtreemfs_service_get_by_uuidRequest( uuid ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - services = __response->get_services(); - } - - virtual void xtreemfs_service_offline( const string& uuid ) - { - xtreemfs_service_offlineRequest* __request = new xtreemfs_service_offlineRequest( uuid ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual uint64_t - xtreemfs_service_register - ( - const org::xtreemfs::interfaces::Service& service - ) - { - xtreemfs_service_registerRequest* __request = new xtreemfs_service_registerRequest( service ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - uint64_t _return_value = __response->get__return_value();return _return_value; - } - - virtual void xtreemfs_shutdown() - { - xtreemfs_shutdownRequest* __request = new xtreemfs_shutdownRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - private: - // __request_handler is not a counted reference, since that would create - // a reference cycle when __request_handler is a subclass of DIRInterfaceProxy - ::yield::concurrency::EventHandler& __request_handler; - };}; - }; -}; -#endif diff --git a/include/xtreemfs/interfaces/mrc_interface.h b/include/xtreemfs/interfaces/mrc_interface.h deleted file mode 100644 index 6ba7b1c8d6d23b27a72894cd1cfab145ca2fabdf..0000000000000000000000000000000000000000 --- a/include/xtreemfs/interfaces/mrc_interface.h +++ /dev/null @@ -1,7101 +0,0 @@ -#ifndef _792628703_H_ -#define _792628703_H_ - - -#include "constants.h" -#include "mrc_osd_types.h" -#include "yield/concurrency.h" -#include "yidl.h" - - -namespace org -{ - namespace xtreemfs - { - namespace interfaces - { - - class Stat : public ::yidl::runtime::Struct - { - public: - Stat() - : dev( 0 ), - ino( 0 ), - mode( 0 ), - nlink( 0 ), - size( 0 ), - atime_ns( 0 ), - mtime_ns( 0 ), - ctime_ns( 0 ), - blksize( 0 ), - etag( 0 ), - truncate_epoch( 0 ), - attributes( 0 ) - { } - - Stat - ( - uint64_t dev, - uint64_t ino, - uint32_t mode, - uint32_t nlink, - const string& user_id, - const string& group_id, - uint64_t size, - uint64_t atime_ns, - uint64_t mtime_ns, - uint64_t ctime_ns, - uint32_t blksize, - uint64_t etag, - uint32_t truncate_epoch, - uint32_t attributes - ) - : dev( dev ), - ino( ino ), - mode( mode ), - nlink( nlink ), - user_id( user_id ), - group_id( group_id ), - size( size ), - atime_ns( atime_ns ), - mtime_ns( mtime_ns ), - ctime_ns( ctime_ns ), - blksize( blksize ), - etag( etag ), - truncate_epoch( truncate_epoch ), - attributes( attributes ) - { } - - Stat( const Stat& other ) - : dev( other.get_dev() ), - ino( other.get_ino() ), - mode( other.get_mode() ), - nlink( other.get_nlink() ), - user_id( other.get_user_id() ), - group_id( other.get_group_id() ), - size( other.get_size() ), - atime_ns( other.get_atime_ns() ), - mtime_ns( other.get_mtime_ns() ), - ctime_ns( other.get_ctime_ns() ), - blksize( other.get_blksize() ), - etag( other.get_etag() ), - truncate_epoch( other.get_truncate_epoch() ), - attributes( other.get_attributes() ) - { } - - virtual ~Stat() { } - - uint64_t get_dev() const { return dev; } - uint64_t get_ino() const { return ino; } - uint32_t get_mode() const { return mode; } - uint32_t get_nlink() const { return nlink; } - const string& get_user_id() const { return user_id; } - const string& get_group_id() const { return group_id; } - uint64_t get_size() const { return size; } - uint64_t get_atime_ns() const { return atime_ns; } - uint64_t get_mtime_ns() const { return mtime_ns; } - uint64_t get_ctime_ns() const { return ctime_ns; } - uint32_t get_blksize() const { return blksize; } - uint64_t get_etag() const { return etag; } - uint32_t get_truncate_epoch() const { return truncate_epoch; } - uint32_t get_attributes() const { return attributes; } - void set_dev( uint64_t dev ) { this->dev = dev; } - void set_ino( uint64_t ino ) { this->ino = ino; } - void set_mode( uint32_t mode ) { this->mode = mode; } - void set_nlink( uint32_t nlink ) { this->nlink = nlink; } - void set_user_id( const string& user_id ) { this->user_id = user_id; } - void set_group_id( const string& group_id ) { this->group_id = group_id; } - void set_size( uint64_t size ) { this->size = size; } - void set_atime_ns( uint64_t atime_ns ) { this->atime_ns = atime_ns; } - void set_mtime_ns( uint64_t mtime_ns ) { this->mtime_ns = mtime_ns; } - void set_ctime_ns( uint64_t ctime_ns ) { this->ctime_ns = ctime_ns; } - void set_blksize( uint32_t blksize ) { this->blksize = blksize; } - void set_etag( uint64_t etag ) { this->etag = etag; } - void set_truncate_epoch( uint32_t truncate_epoch ) { this->truncate_epoch = truncate_epoch; } - void set_attributes( uint32_t attributes ) { this->attributes = attributes; } - - bool operator==( const Stat& other ) const - { - return get_dev() == other.get_dev() - && - get_ino() == other.get_ino() - && - get_mode() == other.get_mode() - && - get_nlink() == other.get_nlink() - && - get_user_id() == other.get_user_id() - && - get_group_id() == other.get_group_id() - && - get_size() == other.get_size() - && - get_atime_ns() == other.get_atime_ns() - && - get_mtime_ns() == other.get_mtime_ns() - && - get_ctime_ns() == other.get_ctime_ns() - && - get_blksize() == other.get_blksize() - && - get_etag() == other.get_etag() - && - get_truncate_epoch() == other.get_truncate_epoch() - && - get_attributes() == other.get_attributes(); - } - - // yidl::runtime::Object - Stat& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030956 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "Stat"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "dev", 0 ), get_dev() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "ino", 0 ), get_ino() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "mode", 0 ), get_mode() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "nlink", 0 ), get_nlink() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "user_id", 0 ), get_user_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "group_id", 0 ), get_group_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "size", 0 ), get_size() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "atime_ns", 0 ), get_atime_ns() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "mtime_ns", 0 ), get_mtime_ns() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "ctime_ns", 0 ), get_ctime_ns() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "blksize", 0 ), get_blksize() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "etag", 0 ), get_etag() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "truncate_epoch", 0 ), get_truncate_epoch() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "attributes", 0 ), get_attributes() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "dev", 0 ), dev ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "ino", 0 ), ino ); - mode = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "mode", 0 ) ); - nlink = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "nlink", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "user_id", 0 ), user_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "group_id", 0 ), group_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "size", 0 ), size ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "atime_ns", 0 ), atime_ns ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "mtime_ns", 0 ), mtime_ns ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "ctime_ns", 0 ), ctime_ns ); - blksize = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "blksize", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "etag", 0 ), etag ); - truncate_epoch = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "truncate_epoch", 0 ) ); - attributes = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "attributes", 0 ) ); - } - - protected: - uint64_t dev; - uint64_t ino; - uint32_t mode; - uint32_t nlink; - string user_id; - string group_id; - uint64_t size; - uint64_t atime_ns; - uint64_t mtime_ns; - uint64_t ctime_ns; - uint32_t blksize; - uint64_t etag; - uint32_t truncate_epoch; - uint32_t attributes; - }; - - class StatSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - StatSet() { } - StatSet( const org::xtreemfs::interfaces::Stat& first_value ) { vector::push_back( first_value ); } - StatSet( size_type size ) : vector( size ) { } - virtual ~StatSet() { } - - // yidl::runtime::Object - StatSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030957 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "StatSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::Stat value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class DirectoryEntry : public ::yidl::runtime::Struct - { - public: - DirectoryEntry() { } - - DirectoryEntry - ( - const string& name, - const org::xtreemfs::interfaces::StatSet& stbuf - ) - : name( name ), stbuf( stbuf ) - { } - - DirectoryEntry( const DirectoryEntry& other ) - : name( other.get_name() ), - stbuf( other.get_stbuf() ) - { } - - virtual ~DirectoryEntry() { } - - const string& get_name() const { return name; } - const org::xtreemfs::interfaces::StatSet& get_stbuf() const { return stbuf; } - void set_name( const string& name ) { this->name = name; } - void set_stbuf( const org::xtreemfs::interfaces::StatSet& stbuf ) { this->stbuf = stbuf; } - - bool operator==( const DirectoryEntry& other ) const - { - return get_name() == other.get_name() - && - get_stbuf() == other.get_stbuf(); - } - - // yidl::runtime::Object - DirectoryEntry& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030958 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "DirectoryEntry"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "name", 0 ), get_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stbuf", 0 ), get_stbuf() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "name", 0 ), name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stbuf", 0 ), stbuf ); - } - - protected: - string name; - org::xtreemfs::interfaces::StatSet stbuf; - }; - - class DirectoryEntrySet - : public ::yidl::runtime::Sequence, - public vector - { - public: - DirectoryEntrySet() { } - DirectoryEntrySet( const org::xtreemfs::interfaces::DirectoryEntry& first_value ) { vector::push_back( first_value ); } - DirectoryEntrySet( size_type size ) : vector( size ) { } - virtual ~DirectoryEntrySet() { } - - // yidl::runtime::Object - DirectoryEntrySet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030959 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "DirectoryEntrySet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::DirectoryEntry value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class StatVFS : public ::yidl::runtime::Struct - { - public: - StatVFS() - : bsize( 0 ), - bavail( 0 ), - blocks( 0 ), - namemax( 0 ), - access_control_policy( ACCESS_CONTROL_POLICY_NULL ), - etag( 0 ), - mode( 0 ) - { } - - StatVFS - ( - uint32_t bsize, - uint64_t bavail, - uint64_t blocks, - const string& fsid, - uint32_t namemax, - org::xtreemfs::interfaces::AccessControlPolicyType access_control_policy, - const org::xtreemfs::interfaces::StripingPolicy& default_striping_policy, - uint64_t etag, - uint32_t mode, - const string& name, - const string& owner_group_id, - const string& owner_user_id - ) - : bsize( bsize ), - bavail( bavail ), - blocks( blocks ), - fsid( fsid ), - namemax( namemax ), - access_control_policy( access_control_policy ), - default_striping_policy( default_striping_policy ), - etag( etag ), - mode( mode ), - name( name ), - owner_group_id( owner_group_id ), - owner_user_id( owner_user_id ) - { } - - StatVFS( const StatVFS& other ) - : bsize( other.get_bsize() ), - bavail( other.get_bavail() ), - blocks( other.get_blocks() ), - fsid( other.get_fsid() ), - namemax( other.get_namemax() ), - access_control_policy( other.get_access_control_policy() ), - default_striping_policy( other.get_default_striping_policy() ), - etag( other.get_etag() ), - mode( other.get_mode() ), - name( other.get_name() ), - owner_group_id( other.get_owner_group_id() ), - owner_user_id( other.get_owner_user_id() ) - { } - - virtual ~StatVFS() { } - - uint32_t get_bsize() const { return bsize; } - uint64_t get_bavail() const { return bavail; } - uint64_t get_blocks() const { return blocks; } - const string& get_fsid() const { return fsid; } - uint32_t get_namemax() const { return namemax; } - org::xtreemfs::interfaces::AccessControlPolicyType get_access_control_policy() const { return access_control_policy; } - const org::xtreemfs::interfaces::StripingPolicy& get_default_striping_policy() const { return default_striping_policy; } - uint64_t get_etag() const { return etag; } - uint32_t get_mode() const { return mode; } - const string& get_name() const { return name; } - const string& get_owner_group_id() const { return owner_group_id; } - const string& get_owner_user_id() const { return owner_user_id; } - void set_bsize( uint32_t bsize ) { this->bsize = bsize; } - void set_bavail( uint64_t bavail ) { this->bavail = bavail; } - void set_blocks( uint64_t blocks ) { this->blocks = blocks; } - void set_fsid( const string& fsid ) { this->fsid = fsid; } - void set_namemax( uint32_t namemax ) { this->namemax = namemax; } - void set_access_control_policy( org::xtreemfs::interfaces::AccessControlPolicyType access_control_policy ) { this->access_control_policy = access_control_policy; } - void set_default_striping_policy( const org::xtreemfs::interfaces::StripingPolicy& default_striping_policy ) { this->default_striping_policy = default_striping_policy; } - void set_etag( uint64_t etag ) { this->etag = etag; } - void set_mode( uint32_t mode ) { this->mode = mode; } - void set_name( const string& name ) { this->name = name; } - void set_owner_group_id( const string& owner_group_id ) { this->owner_group_id = owner_group_id; } - void set_owner_user_id( const string& owner_user_id ) { this->owner_user_id = owner_user_id; } - - bool operator==( const StatVFS& other ) const - { - return get_bsize() == other.get_bsize() - && - get_bavail() == other.get_bavail() - && - get_blocks() == other.get_blocks() - && - get_fsid() == other.get_fsid() - && - get_namemax() == other.get_namemax() - && - get_access_control_policy() == other.get_access_control_policy() - && - get_default_striping_policy() == other.get_default_striping_policy() - && - get_etag() == other.get_etag() - && - get_mode() == other.get_mode() - && - get_name() == other.get_name() - && - get_owner_group_id() == other.get_owner_group_id() - && - get_owner_user_id() == other.get_owner_user_id(); - } - - // yidl::runtime::Object - StatVFS& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030960 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "StatVFS"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "bsize", 0 ), get_bsize() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "bavail", 0 ), get_bavail() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "blocks", 0 ), get_blocks() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "fsid", 0 ), get_fsid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "namemax", 0 ), get_namemax() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "access_control_policy", 0 ), static_cast( get_access_control_policy() ) ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "default_striping_policy", 0 ), get_default_striping_policy() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "etag", 0 ), get_etag() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "mode", 0 ), get_mode() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "name", 0 ), get_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "owner_group_id", 0 ), get_owner_group_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "owner_user_id", 0 ), get_owner_user_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - bsize = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "bsize", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "bavail", 0 ), bavail ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "blocks", 0 ), blocks ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "fsid", 0 ), fsid ); - namemax = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "namemax", 0 ) ); - access_control_policy = static_cast( unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "access_control_policy", 0 ) ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "default_striping_policy", 0 ), default_striping_policy ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "etag", 0 ), etag ); - mode = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "mode", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "name", 0 ), name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "owner_group_id", 0 ), owner_group_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "owner_user_id", 0 ), owner_user_id ); - } - - protected: - uint32_t bsize; - uint64_t bavail; - uint64_t blocks; - string fsid; - uint32_t namemax; - org::xtreemfs::interfaces::AccessControlPolicyType access_control_policy; - org::xtreemfs::interfaces::StripingPolicy default_striping_policy; - uint64_t etag; - uint32_t mode; - string name; - string owner_group_id; - string owner_user_id; - }; - - class StatVFSSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - StatVFSSet() { } - StatVFSSet( const org::xtreemfs::interfaces::StatVFS& first_value ) { vector::push_back( first_value ); } - StatVFSSet( size_type size ) : vector( size ) { } - virtual ~StatVFSSet() { } - - // yidl::runtime::Object - StatVFSSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030961 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "StatVFSSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::StatVFS value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - - class MRCInterface - { - public: - const static uint32_t HTTP_PORT_DEFAULT = 30636; - const static uint32_t ONC_RPC_PORT_DEFAULT = 32636; - const static uint32_t SETATTR_MODE = 1; - const static uint32_t SETATTR_UID = 2; - const static uint32_t SETATTR_GID = 4; - const static uint32_t SETATTR_SIZE = 8; - const static uint32_t SETATTR_ATIME = 16; - const static uint32_t SETATTR_MTIME = 32; - const static uint32_t SETATTR_CTIME = 64; - const static uint32_t SETATTR_ATTRIBUTES = 128;const static uint32_t TAG = 2010031116; - - virtual ~MRCInterface() { } - - uint32_t get_tag() const { return 2010031116; } - - - - virtual void - close - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates, - const org::xtreemfs::interfaces::XCap& write_xcap - ) - { } - - virtual void - fsetattr - ( - const org::xtreemfs::interfaces::Stat& stbuf, - uint32_t to_set, - const org::xtreemfs::interfaces::XCap& xcap - ) - { } - - virtual void - ftruncate - ( - const org::xtreemfs::interfaces::XCap& write_xcap, - org::xtreemfs::interfaces::XCap& truncate_xcap - ) - { } - - virtual void - getattr - ( - const string& volume_name, - const string& path, - uint64_t known_etag, - org::xtreemfs::interfaces::StatSet& stbuf - ) - { } - - virtual void - getxattr - ( - const string& volume_name, - const string& path, - const string& name, - string& value - ) - { } - - virtual void - link - ( - const string& volume_name, - const string& target_path, - const string& link_path - ) - { } - - virtual void - listxattr - ( - const string& volume_name, - const string& path, - org::xtreemfs::interfaces::StringSet& names - ) - { } - - virtual void - mkdir - ( - const string& volume_name, - const string& path, - uint32_t mode - ) - { } - - virtual void - open - ( - const string& volume_name, - const string& path, - uint32_t flags, - uint32_t mode, - uint32_t attributes, - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates, - org::xtreemfs::interfaces::FileCredentials& file_credentials - ) - { } - - virtual void - readdir - ( - const string& volume_name, - const string& path, - uint64_t known_etag, - uint16_t limit_directory_entries_count, - bool names_only, - uint64_t seen_directory_entries_count, - org::xtreemfs::interfaces::DirectoryEntrySet& directory_entries - ) - { } - - virtual void - readlink - ( - const string& volume_name, - const string& path, - string& link_target_path - ) - { } - - virtual void - removexattr - ( - const string& volume_name, - const string& path, - const string& name - ) - { } - - virtual void - rename - ( - const string& volume_name, - const string& source_path, - const string& target_path, - org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - { } - - virtual void rmdir( const string& volume_name, const string& path ) { } - - virtual void - setattr - ( - const string& volume_name, - const string& path, - const org::xtreemfs::interfaces::Stat& stbuf, - uint32_t to_set - ) - { } - - virtual void - setxattr - ( - const string& volume_name, - const string& path, - const string& name, - const string& value, - int32_t flags - ) - { } - - virtual void - statvfs - ( - const string& volume_name, - uint64_t known_etag, - org::xtreemfs::interfaces::StatVFSSet& stbuf - ) - { } - - virtual void - symlink - ( - const string& volume_name, - const string& target_path, - const string& link_path - ) - { } - - virtual void - unlink - ( - const string& volume_name, - const string& path, - org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - { } - - virtual void xtreemfs_checkpoint() { } - - virtual void - xtreemfs_check_file_exists - ( - const string& volume_id, - const org::xtreemfs::interfaces::StringSet& file_ids, - const string& osd_uuid, - string& bitmap - ) - { } - - virtual void xtreemfs_dump_database( const string& dump_file ) { } - - virtual void - xtreemfs_get_suitable_osds - ( - const string& file_id, - uint32_t num_osds, - org::xtreemfs::interfaces::StringSet& osd_uuids - ) - { } - - virtual void xtreemfs_internal_debug( const string& operation, string& result ) { } - - virtual void xtreemfs_lsvol( org::xtreemfs::interfaces::StatVFSSet& volumes ) { } - - virtual void xtreemfs_mkvol( const org::xtreemfs::interfaces::StatVFS& volume ) { } - - virtual void - xtreemfs_renew_capability - ( - const org::xtreemfs::interfaces::XCap& old_xcap, - org::xtreemfs::interfaces::XCap& renewed_xcap - ) - { } - - virtual void - xtreemfs_replica_add - ( - const string& file_id, - const org::xtreemfs::interfaces::Replica& new_replica - ) - { } - - virtual void - xtreemfs_replica_list - ( - const string& file_id, - org::xtreemfs::interfaces::ReplicaSet& replicas - ) - { } - - virtual void - xtreemfs_replica_remove - ( - const string& file_id, - const string& osd_uuid, - org::xtreemfs::interfaces::XCap& delete_xcap - ) - { } - - virtual void xtreemfs_restore_database( const string& dump_file ) { } - - virtual void - xtreemfs_restore_file - ( - const string& file_path, - const string& file_id, - uint64_t file_size, - const string& osd_uuid, - int32_t stripe_size - ) - { } - - virtual void xtreemfs_rmvol( const string& volume_name ) { } - - virtual void xtreemfs_shutdown() { } - }; - - - // Use this macro in an implementation class to get all of the prototypes for the operations in MRCInterface - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_PROTOTYPES\ - virtual void\ - close\ - (\ - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates,\ - const org::xtreemfs::interfaces::XCap& write_xcap\ - );\ - virtual void\ - fsetattr\ - (\ - const org::xtreemfs::interfaces::Stat& stbuf,\ - uint32_t to_set,\ - const org::xtreemfs::interfaces::XCap& xcap\ - );\ - virtual void\ - ftruncate\ - (\ - const org::xtreemfs::interfaces::XCap& write_xcap,\ - org::xtreemfs::interfaces::XCap& truncate_xcap\ - );\ - virtual void\ - getattr\ - (\ - const string& volume_name,\ - const string& path,\ - uint64_t known_etag,\ - org::xtreemfs::interfaces::StatSet& stbuf\ - );\ - virtual void\ - getxattr\ - (\ - const string& volume_name,\ - const string& path,\ - const string& name,\ - string& value\ - );\ - virtual void\ - link\ - (\ - const string& volume_name,\ - const string& target_path,\ - const string& link_path\ - );\ - virtual void\ - listxattr\ - (\ - const string& volume_name,\ - const string& path,\ - org::xtreemfs::interfaces::StringSet& names\ - );\ - virtual void\ - mkdir\ - (\ - const string& volume_name,\ - const string& path,\ - uint32_t mode\ - );\ - virtual void\ - open\ - (\ - const string& volume_name,\ - const string& path,\ - uint32_t flags,\ - uint32_t mode,\ - uint32_t attributes,\ - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates,\ - org::xtreemfs::interfaces::FileCredentials& file_credentials\ - );\ - virtual void\ - readdir\ - (\ - const string& volume_name,\ - const string& path,\ - uint64_t known_etag,\ - uint16_t limit_directory_entries_count,\ - bool names_only,\ - uint64_t seen_directory_entries_count,\ - org::xtreemfs::interfaces::DirectoryEntrySet& directory_entries\ - );\ - virtual void\ - readlink\ - (\ - const string& volume_name,\ - const string& path,\ - string& link_target_path\ - );\ - virtual void\ - removexattr\ - (\ - const string& volume_name,\ - const string& path,\ - const string& name\ - );\ - virtual void\ - rename\ - (\ - const string& volume_name,\ - const string& source_path,\ - const string& target_path,\ - org::xtreemfs::interfaces::FileCredentialsSet& file_credentials\ - );\ - virtual void rmdir( const string& volume_name, const string& path );\ - virtual void\ - setattr\ - (\ - const string& volume_name,\ - const string& path,\ - const org::xtreemfs::interfaces::Stat& stbuf,\ - uint32_t to_set\ - );\ - virtual void\ - setxattr\ - (\ - const string& volume_name,\ - const string& path,\ - const string& name,\ - const string& value,\ - int32_t flags\ - );\ - virtual void\ - statvfs\ - (\ - const string& volume_name,\ - uint64_t known_etag,\ - org::xtreemfs::interfaces::StatVFSSet& stbuf\ - );\ - virtual void\ - symlink\ - (\ - const string& volume_name,\ - const string& target_path,\ - const string& link_path\ - );\ - virtual void\ - unlink\ - (\ - const string& volume_name,\ - const string& path,\ - org::xtreemfs::interfaces::FileCredentialsSet& file_credentials\ - );\ - virtual void xtreemfs_checkpoint();\ - virtual void\ - xtreemfs_check_file_exists\ - (\ - const string& volume_id,\ - const org::xtreemfs::interfaces::StringSet& file_ids,\ - const string& osd_uuid,\ - string& bitmap\ - );\ - virtual void xtreemfs_dump_database( const string& dump_file );\ - virtual void\ - xtreemfs_get_suitable_osds\ - (\ - const string& file_id,\ - uint32_t num_osds,\ - org::xtreemfs::interfaces::StringSet& osd_uuids\ - );\ - virtual void xtreemfs_internal_debug( const string& operation, string& result );\ - virtual void xtreemfs_lsvol( org::xtreemfs::interfaces::StatVFSSet& volumes );\ - virtual void xtreemfs_mkvol( const org::xtreemfs::interfaces::StatVFS& volume );\ - virtual void\ - xtreemfs_renew_capability\ - (\ - const org::xtreemfs::interfaces::XCap& old_xcap,\ - org::xtreemfs::interfaces::XCap& renewed_xcap\ - );\ - virtual void\ - xtreemfs_replica_add\ - (\ - const string& file_id,\ - const org::xtreemfs::interfaces::Replica& new_replica\ - );\ - virtual void\ - xtreemfs_replica_list\ - (\ - const string& file_id,\ - org::xtreemfs::interfaces::ReplicaSet& replicas\ - );\ - virtual void\ - xtreemfs_replica_remove\ - (\ - const string& file_id,\ - const string& osd_uuid,\ - org::xtreemfs::interfaces::XCap& delete_xcap\ - );\ - virtual void xtreemfs_restore_database( const string& dump_file );\ - virtual void\ - xtreemfs_restore_file\ - (\ - const string& file_path,\ - const string& file_id,\ - uint64_t file_size,\ - const string& osd_uuid,\ - int32_t stripe_size\ - );\ - virtual void xtreemfs_rmvol( const string& volume_name );\ - virtual void xtreemfs_shutdown();\ - - - #ifndef ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS ORG_XTREEMFS_INTERFACES_EXCEPTION_PARENT_CLASS - #elif defined( ORG_XTREEMFS_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS ORG_XTREEMFS_EXCEPTION_PARENT_CLASS - #elif defined( ORG_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS ORG_EXCEPTION_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS ::yield::concurrency::Exception - #endif - #endif - #ifndef ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS ORG_XTREEMFS_INTERFACES_REQUEST_PARENT_CLASS - #elif defined( ORG_XTREEMFS_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS ORG_XTREEMFS_REQUEST_PARENT_CLASS - #elif defined( ORG_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS ORG_REQUEST_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS ::yield::concurrency::Request - #endif - #endif - #ifndef ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS ORG_XTREEMFS_INTERFACES_RESPONSE_PARENT_CLASS - #elif defined( ORG_XTREEMFS_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS ORG_XTREEMFS_RESPONSE_PARENT_CLASS - #elif defined( ORG_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS ORG_RESPONSE_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS ::yield::concurrency::Response - #endif - #endif - - - class MRCInterfaceMessages - { - public: - // Request/response pair definitions for the operations in MRCInterface - class closeRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - closeRequest() { } - - closeRequest - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates, - const org::xtreemfs::interfaces::XCap& write_xcap - ) - : client_vivaldi_coordinates( client_vivaldi_coordinates ), - write_xcap( write_xcap ) - { } - - closeRequest( const closeRequest& other ) - : client_vivaldi_coordinates( other.get_client_vivaldi_coordinates() ), - write_xcap( other.get_write_xcap() ) - { } - - virtual ~closeRequest() { } - - const org::xtreemfs::interfaces::VivaldiCoordinates& get_client_vivaldi_coordinates() const { return client_vivaldi_coordinates; } - const org::xtreemfs::interfaces::XCap& get_write_xcap() const { return write_xcap; } - void set_client_vivaldi_coordinates( const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates ) { this->client_vivaldi_coordinates = client_vivaldi_coordinates; } - void set_write_xcap( const org::xtreemfs::interfaces::XCap& write_xcap ) { this->write_xcap = write_xcap; } - - bool operator==( const closeRequest& other ) const - { - return get_client_vivaldi_coordinates() == other.get_client_vivaldi_coordinates() - && - get_write_xcap() == other.get_write_xcap(); - } - - // yidl::runtime::Object - closeRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031117 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "closeRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_vivaldi_coordinates", 0 ), get_client_vivaldi_coordinates() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "write_xcap", 0 ), get_write_xcap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_vivaldi_coordinates", 0 ), client_vivaldi_coordinates ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "write_xcap", 0 ), write_xcap ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new closeResponse; - } - - virtual void respond() - { - respond( *new closeResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::VivaldiCoordinates client_vivaldi_coordinates; - org::xtreemfs::interfaces::XCap write_xcap; - }; - - - class closeResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~closeResponse() { } - - bool operator==( const closeResponse& ) const { return true; } - - // yidl::runtime::Object - closeResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031117 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "closeResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class fsetattrRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - fsetattrRequest() - : to_set( 0 ) - { } - - fsetattrRequest - ( - const org::xtreemfs::interfaces::Stat& stbuf, - uint32_t to_set, - const org::xtreemfs::interfaces::XCap& xcap - ) - : stbuf( stbuf ), to_set( to_set ), xcap( xcap ) - { } - - fsetattrRequest( const fsetattrRequest& other ) - : stbuf( other.get_stbuf() ), - to_set( other.get_to_set() ), - xcap( other.get_xcap() ) - { } - - virtual ~fsetattrRequest() { } - - const org::xtreemfs::interfaces::Stat& get_stbuf() const { return stbuf; } - uint32_t get_to_set() const { return to_set; } - const org::xtreemfs::interfaces::XCap& get_xcap() const { return xcap; } - void set_stbuf( const org::xtreemfs::interfaces::Stat& stbuf ) { this->stbuf = stbuf; } - void set_to_set( uint32_t to_set ) { this->to_set = to_set; } - void set_xcap( const org::xtreemfs::interfaces::XCap& xcap ) { this->xcap = xcap; } - - bool operator==( const fsetattrRequest& other ) const - { - return get_stbuf() == other.get_stbuf() - && - get_to_set() == other.get_to_set() - && - get_xcap() == other.get_xcap(); - } - - // yidl::runtime::Object - fsetattrRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031118 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "fsetattrRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stbuf", 0 ), get_stbuf() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "to_set", 0 ), get_to_set() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "xcap", 0 ), get_xcap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stbuf", 0 ), stbuf ); - to_set = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "to_set", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "xcap", 0 ), xcap ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new fsetattrResponse; - } - - virtual void respond() - { - respond( *new fsetattrResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::Stat stbuf; - uint32_t to_set; - org::xtreemfs::interfaces::XCap xcap; - }; - - - class fsetattrResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~fsetattrResponse() { } - - bool operator==( const fsetattrResponse& ) const { return true; } - - // yidl::runtime::Object - fsetattrResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031118 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "fsetattrResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class ftruncateRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - ftruncateRequest() { } - - ftruncateRequest( const org::xtreemfs::interfaces::XCap& write_xcap ) - : write_xcap( write_xcap ) - { } - - ftruncateRequest( const ftruncateRequest& other ) - : write_xcap( other.get_write_xcap() ) - { } - - virtual ~ftruncateRequest() { } - - const org::xtreemfs::interfaces::XCap& get_write_xcap() const { return write_xcap; } - void set_write_xcap( const org::xtreemfs::interfaces::XCap& write_xcap ) { this->write_xcap = write_xcap; } - - bool operator==( const ftruncateRequest& other ) const - { - return get_write_xcap() == other.get_write_xcap(); - } - - // yidl::runtime::Object - ftruncateRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031119 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ftruncateRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "write_xcap", 0 ), get_write_xcap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "write_xcap", 0 ), write_xcap ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new ftruncateResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::XCap& truncate_xcap ) - { - respond( *new ftruncateResponse( truncate_xcap ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::XCap write_xcap; - }; - - - class ftruncateResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - ftruncateResponse() { } - - ftruncateResponse( const org::xtreemfs::interfaces::XCap& truncate_xcap ) - : truncate_xcap( truncate_xcap ) - { } - - ftruncateResponse( const ftruncateResponse& other ) - : truncate_xcap( other.get_truncate_xcap() ) - { } - - virtual ~ftruncateResponse() { } - - const org::xtreemfs::interfaces::XCap& get_truncate_xcap() const { return truncate_xcap; } - void set_truncate_xcap( const org::xtreemfs::interfaces::XCap& truncate_xcap ) { this->truncate_xcap = truncate_xcap; } - - bool operator==( const ftruncateResponse& other ) const - { - return get_truncate_xcap() == other.get_truncate_xcap(); - } - - // yidl::runtime::Object - ftruncateResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031119 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ftruncateResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "truncate_xcap", 0 ), get_truncate_xcap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "truncate_xcap", 0 ), truncate_xcap ); - } - - protected: - org::xtreemfs::interfaces::XCap truncate_xcap; - }; - - - class getattrRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - getattrRequest() - : known_etag( 0 ) - { } - - getattrRequest - ( - const string& volume_name, - const string& path, - uint64_t known_etag - ) - : volume_name( volume_name ), path( path ), known_etag( known_etag ) - { } - - getattrRequest( const getattrRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - known_etag( other.get_known_etag() ) - { } - - virtual ~getattrRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - uint64_t get_known_etag() const { return known_etag; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_known_etag( uint64_t known_etag ) { this->known_etag = known_etag; } - - bool operator==( const getattrRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_known_etag() == other.get_known_etag(); - } - - // yidl::runtime::Object - getattrRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031120 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "getattrRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "known_etag", 0 ), get_known_etag() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "known_etag", 0 ), known_etag ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new getattrResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::StatSet& stbuf ) - { - respond( *new getattrResponse( stbuf ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - uint64_t known_etag; - }; - - - class getattrResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - getattrResponse() { } - - getattrResponse( const org::xtreemfs::interfaces::StatSet& stbuf ) - : stbuf( stbuf ) - { } - - getattrResponse( const getattrResponse& other ) - : stbuf( other.get_stbuf() ) - { } - - virtual ~getattrResponse() { } - - const org::xtreemfs::interfaces::StatSet& get_stbuf() const { return stbuf; } - void set_stbuf( const org::xtreemfs::interfaces::StatSet& stbuf ) { this->stbuf = stbuf; } - - bool operator==( const getattrResponse& other ) const - { - return get_stbuf() == other.get_stbuf(); - } - - // yidl::runtime::Object - getattrResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031120 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "getattrResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stbuf", 0 ), get_stbuf() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stbuf", 0 ), stbuf ); - } - - protected: - org::xtreemfs::interfaces::StatSet stbuf; - }; - - - class getxattrRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - getxattrRequest() { } - - getxattrRequest - ( - const string& volume_name, - const string& path, - const string& name - ) - : volume_name( volume_name ), path( path ), name( name ) - { } - - getxattrRequest( const getxattrRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - name( other.get_name() ) - { } - - virtual ~getxattrRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - const string& get_name() const { return name; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_name( const string& name ) { this->name = name; } - - bool operator==( const getxattrRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_name() == other.get_name(); - } - - // yidl::runtime::Object - getxattrRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031121 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "getxattrRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "name", 0 ), get_name() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "name", 0 ), name ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new getxattrResponse; - } - - virtual void respond( const string& value ) - { - respond( *new getxattrResponse( value ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - string name; - }; - - - class getxattrResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - getxattrResponse() { } - - getxattrResponse( const string& value ) - : value( value ) - { } - - getxattrResponse( const getxattrResponse& other ) - : value( other.get_value() ) - { } - - virtual ~getxattrResponse() { } - - const string& get_value() const { return value; } - void set_value( const string& value ) { this->value = value; } - - bool operator==( const getxattrResponse& other ) const - { - return get_value() == other.get_value(); - } - - // yidl::runtime::Object - getxattrResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031121 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "getxattrResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "value", 0 ), get_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "value", 0 ), value ); - } - - protected: - string value; - }; - - - class linkRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - linkRequest() { } - - linkRequest - ( - const string& volume_name, - const string& target_path, - const string& link_path - ) - : volume_name( volume_name ), target_path( target_path ), link_path( link_path ) - { } - - linkRequest( const linkRequest& other ) - : volume_name( other.get_volume_name() ), - target_path( other.get_target_path() ), - link_path( other.get_link_path() ) - { } - - virtual ~linkRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_target_path() const { return target_path; } - const string& get_link_path() const { return link_path; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_target_path( const string& target_path ) { this->target_path = target_path; } - void set_link_path( const string& link_path ) { this->link_path = link_path; } - - bool operator==( const linkRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_target_path() == other.get_target_path() - && - get_link_path() == other.get_link_path(); - } - - // yidl::runtime::Object - linkRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031122 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "linkRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "target_path", 0 ), get_target_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "link_path", 0 ), get_link_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "target_path", 0 ), target_path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "link_path", 0 ), link_path ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new linkResponse; - } - - virtual void respond() - { - respond( *new linkResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string target_path; - string link_path; - }; - - - class linkResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~linkResponse() { } - - bool operator==( const linkResponse& ) const { return true; } - - // yidl::runtime::Object - linkResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031122 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "linkResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class listxattrRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - listxattrRequest() { } - - listxattrRequest( const string& volume_name, const string& path ) - : volume_name( volume_name ), path( path ) - { } - - listxattrRequest( const listxattrRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ) - { } - - virtual ~listxattrRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - - bool operator==( const listxattrRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path(); - } - - // yidl::runtime::Object - listxattrRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031123 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "listxattrRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new listxattrResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::StringSet& names ) - { - respond( *new listxattrResponse( names ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - }; - - - class listxattrResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - listxattrResponse() { } - - listxattrResponse( const org::xtreemfs::interfaces::StringSet& names ) - : names( names ) - { } - - listxattrResponse( const listxattrResponse& other ) - : names( other.get_names() ) - { } - - virtual ~listxattrResponse() { } - - const org::xtreemfs::interfaces::StringSet& get_names() const { return names; } - void set_names( const org::xtreemfs::interfaces::StringSet& names ) { this->names = names; } - - bool operator==( const listxattrResponse& other ) const - { - return get_names() == other.get_names(); - } - - // yidl::runtime::Object - listxattrResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031123 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "listxattrResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "names", 0 ), get_names() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "names", 0 ), names ); - } - - protected: - org::xtreemfs::interfaces::StringSet names; - }; - - - class mkdirRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - mkdirRequest() - : mode( 0 ) - { } - - mkdirRequest( const string& volume_name, const string& path, uint32_t mode ) - : volume_name( volume_name ), path( path ), mode( mode ) - { } - - mkdirRequest( const mkdirRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - mode( other.get_mode() ) - { } - - virtual ~mkdirRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - uint32_t get_mode() const { return mode; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_mode( uint32_t mode ) { this->mode = mode; } - - bool operator==( const mkdirRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_mode() == other.get_mode(); - } - - // yidl::runtime::Object - mkdirRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031124 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "mkdirRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "mode", 0 ), get_mode() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - mode = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "mode", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new mkdirResponse; - } - - virtual void respond() - { - respond( *new mkdirResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - uint32_t mode; - }; - - - class mkdirResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~mkdirResponse() { } - - bool operator==( const mkdirResponse& ) const { return true; } - - // yidl::runtime::Object - mkdirResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031124 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "mkdirResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class openRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - openRequest() - : flags( 0 ), mode( 0 ), attributes( 0 ) - { } - - openRequest - ( - const string& volume_name, - const string& path, - uint32_t flags, - uint32_t mode, - uint32_t attributes, - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates - ) - : volume_name( volume_name ), - path( path ), - flags( flags ), - mode( mode ), - attributes( attributes ), - client_vivaldi_coordinates( client_vivaldi_coordinates ) - { } - - openRequest( const openRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - flags( other.get_flags() ), - mode( other.get_mode() ), - attributes( other.get_attributes() ), - client_vivaldi_coordinates( other.get_client_vivaldi_coordinates() ) - { } - - virtual ~openRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - uint32_t get_flags() const { return flags; } - uint32_t get_mode() const { return mode; } - uint32_t get_attributes() const { return attributes; } - const org::xtreemfs::interfaces::VivaldiCoordinates& get_client_vivaldi_coordinates() const { return client_vivaldi_coordinates; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_flags( uint32_t flags ) { this->flags = flags; } - void set_mode( uint32_t mode ) { this->mode = mode; } - void set_attributes( uint32_t attributes ) { this->attributes = attributes; } - void set_client_vivaldi_coordinates( const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates ) { this->client_vivaldi_coordinates = client_vivaldi_coordinates; } - - bool operator==( const openRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_flags() == other.get_flags() - && - get_mode() == other.get_mode() - && - get_attributes() == other.get_attributes() - && - get_client_vivaldi_coordinates() == other.get_client_vivaldi_coordinates(); - } - - // yidl::runtime::Object - openRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031125 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "openRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "flags", 0 ), get_flags() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "mode", 0 ), get_mode() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "attributes", 0 ), get_attributes() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_vivaldi_coordinates", 0 ), get_client_vivaldi_coordinates() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - flags = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "flags", 0 ) ); - mode = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "mode", 0 ) ); - attributes = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "attributes", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_vivaldi_coordinates", 0 ), client_vivaldi_coordinates ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new openResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials - ) - { - respond - ( - *new openResponse - ( - file_credentials - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - uint32_t flags; - uint32_t mode; - uint32_t attributes; - org::xtreemfs::interfaces::VivaldiCoordinates client_vivaldi_coordinates; - }; - - - class openResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - openResponse() { } - - openResponse - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials - ) - : file_credentials( file_credentials ) - { } - - openResponse( const openResponse& other ) - : file_credentials( other.get_file_credentials() ) - { } - - virtual ~openResponse() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - - bool operator==( const openResponse& other ) const - { - return get_file_credentials() == other.get_file_credentials(); - } - - // yidl::runtime::Object - openResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031125 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "openResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - }; - - - class readdirRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - readdirRequest() - : known_etag( 0 ), - limit_directory_entries_count( 0 ), - names_only( false ), - seen_directory_entries_count( 0 ) - { } - - readdirRequest - ( - const string& volume_name, - const string& path, - uint64_t known_etag, - uint16_t limit_directory_entries_count, - bool names_only, - uint64_t seen_directory_entries_count - ) - : volume_name( volume_name ), - path( path ), - known_etag( known_etag ), - limit_directory_entries_count( limit_directory_entries_count ), - names_only( names_only ), - seen_directory_entries_count( seen_directory_entries_count ) - { } - - readdirRequest( const readdirRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - known_etag( other.get_known_etag() ), - limit_directory_entries_count( other.get_limit_directory_entries_count() ), - names_only( other.get_names_only() ), - seen_directory_entries_count( other.get_seen_directory_entries_count() ) - { } - - virtual ~readdirRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - uint64_t get_known_etag() const { return known_etag; } - uint16_t get_limit_directory_entries_count() const { return limit_directory_entries_count; } - bool get_names_only() const { return names_only; } - uint64_t get_seen_directory_entries_count() const { return seen_directory_entries_count; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_known_etag( uint64_t known_etag ) { this->known_etag = known_etag; } - void set_limit_directory_entries_count( uint16_t limit_directory_entries_count ) { this->limit_directory_entries_count = limit_directory_entries_count; } - void set_names_only( bool names_only ) { this->names_only = names_only; } - void set_seen_directory_entries_count( uint64_t seen_directory_entries_count ) { this->seen_directory_entries_count = seen_directory_entries_count; } - - bool operator==( const readdirRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_known_etag() == other.get_known_etag() - && - get_limit_directory_entries_count() == other.get_limit_directory_entries_count() - && - get_names_only() == other.get_names_only() - && - get_seen_directory_entries_count() == other.get_seen_directory_entries_count(); - } - - // yidl::runtime::Object - readdirRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031126 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "readdirRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "known_etag", 0 ), get_known_etag() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "limit_directory_entries_count", 0 ), get_limit_directory_entries_count() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "names_only", 0 ), get_names_only() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "seen_directory_entries_count", 0 ), get_seen_directory_entries_count() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "known_etag", 0 ), known_etag ); - limit_directory_entries_count = unmarshaller.read_uint16( ::yidl::runtime::Unmarshaller::StringLiteralKey( "limit_directory_entries_count", 0 ) ); - names_only = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "names_only", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "seen_directory_entries_count", 0 ), seen_directory_entries_count ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new readdirResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::DirectoryEntrySet& directory_entries - ) - { - respond - ( - *new readdirResponse - ( - directory_entries - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - uint64_t known_etag; - uint16_t limit_directory_entries_count; - bool names_only; - uint64_t seen_directory_entries_count; - }; - - - class readdirResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - readdirResponse() { } - - readdirResponse - ( - const org::xtreemfs::interfaces::DirectoryEntrySet& directory_entries - ) - : directory_entries( directory_entries ) - { } - - readdirResponse( const readdirResponse& other ) - : directory_entries( other.get_directory_entries() ) - { } - - virtual ~readdirResponse() { } - - const org::xtreemfs::interfaces::DirectoryEntrySet& get_directory_entries() const { return directory_entries; } - void set_directory_entries( const org::xtreemfs::interfaces::DirectoryEntrySet& directory_entries ) { this->directory_entries = directory_entries; } - - bool operator==( const readdirResponse& other ) const - { - return get_directory_entries() == other.get_directory_entries(); - } - - // yidl::runtime::Object - readdirResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031126 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "readdirResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "directory_entries", 0 ), get_directory_entries() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "directory_entries", 0 ), directory_entries ); - } - - protected: - org::xtreemfs::interfaces::DirectoryEntrySet directory_entries; - }; - - - class readlinkRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - readlinkRequest() { } - - readlinkRequest( const string& volume_name, const string& path ) - : volume_name( volume_name ), path( path ) - { } - - readlinkRequest( const readlinkRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ) - { } - - virtual ~readlinkRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - - bool operator==( const readlinkRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path(); - } - - // yidl::runtime::Object - readlinkRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031127 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "readlinkRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new readlinkResponse; - } - - virtual void respond( const string& link_target_path ) - { - respond( *new readlinkResponse( link_target_path ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - }; - - - class readlinkResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - readlinkResponse() { } - - readlinkResponse( const string& link_target_path ) - : link_target_path( link_target_path ) - { } - - readlinkResponse( const readlinkResponse& other ) - : link_target_path( other.get_link_target_path() ) - { } - - virtual ~readlinkResponse() { } - - const string& get_link_target_path() const { return link_target_path; } - void set_link_target_path( const string& link_target_path ) { this->link_target_path = link_target_path; } - - bool operator==( const readlinkResponse& other ) const - { - return get_link_target_path() == other.get_link_target_path(); - } - - // yidl::runtime::Object - readlinkResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031127 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "readlinkResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "link_target_path", 0 ), get_link_target_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "link_target_path", 0 ), link_target_path ); - } - - protected: - string link_target_path; - }; - - - class removexattrRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - removexattrRequest() { } - - removexattrRequest - ( - const string& volume_name, - const string& path, - const string& name - ) - : volume_name( volume_name ), path( path ), name( name ) - { } - - removexattrRequest( const removexattrRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - name( other.get_name() ) - { } - - virtual ~removexattrRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - const string& get_name() const { return name; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_name( const string& name ) { this->name = name; } - - bool operator==( const removexattrRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_name() == other.get_name(); - } - - // yidl::runtime::Object - removexattrRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031128 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "removexattrRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "name", 0 ), get_name() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "name", 0 ), name ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new removexattrResponse; - } - - virtual void respond() - { - respond( *new removexattrResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - string name; - }; - - - class removexattrResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~removexattrResponse() { } - - bool operator==( const removexattrResponse& ) const { return true; } - - // yidl::runtime::Object - removexattrResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031128 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "removexattrResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class renameRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - renameRequest() { } - - renameRequest - ( - const string& volume_name, - const string& source_path, - const string& target_path - ) - : volume_name( volume_name ), - source_path( source_path ), - target_path( target_path ) - { } - - renameRequest( const renameRequest& other ) - : volume_name( other.get_volume_name() ), - source_path( other.get_source_path() ), - target_path( other.get_target_path() ) - { } - - virtual ~renameRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_source_path() const { return source_path; } - const string& get_target_path() const { return target_path; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_source_path( const string& source_path ) { this->source_path = source_path; } - void set_target_path( const string& target_path ) { this->target_path = target_path; } - - bool operator==( const renameRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_source_path() == other.get_source_path() - && - get_target_path() == other.get_target_path(); - } - - // yidl::runtime::Object - renameRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031129 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "renameRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "source_path", 0 ), get_source_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "target_path", 0 ), get_target_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "source_path", 0 ), source_path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "target_path", 0 ), target_path ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new renameResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - { - respond - ( - *new renameResponse - ( - file_credentials - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string source_path; - string target_path; - }; - - - class renameResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - renameResponse() { } - - renameResponse - ( - const org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - : file_credentials( file_credentials ) - { } - - renameResponse( const renameResponse& other ) - : file_credentials( other.get_file_credentials() ) - { } - - virtual ~renameResponse() { } - - const org::xtreemfs::interfaces::FileCredentialsSet& get_file_credentials() const { return file_credentials; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentialsSet& file_credentials ) { this->file_credentials = file_credentials; } - - bool operator==( const renameResponse& other ) const - { - return get_file_credentials() == other.get_file_credentials(); - } - - // yidl::runtime::Object - renameResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031129 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "renameResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - } - - protected: - org::xtreemfs::interfaces::FileCredentialsSet file_credentials; - }; - - - class rmdirRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - rmdirRequest() { } - - rmdirRequest( const string& volume_name, const string& path ) - : volume_name( volume_name ), path( path ) - { } - - rmdirRequest( const rmdirRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ) - { } - - virtual ~rmdirRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - - bool operator==( const rmdirRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path(); - } - - // yidl::runtime::Object - rmdirRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031130 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "rmdirRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new rmdirResponse; - } - - virtual void respond() - { - respond( *new rmdirResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - }; - - - class rmdirResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~rmdirResponse() { } - - bool operator==( const rmdirResponse& ) const { return true; } - - // yidl::runtime::Object - rmdirResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031130 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "rmdirResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class setattrRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - setattrRequest() - : to_set( 0 ) - { } - - setattrRequest - ( - const string& volume_name, - const string& path, - const org::xtreemfs::interfaces::Stat& stbuf, - uint32_t to_set - ) - : volume_name( volume_name ), path( path ), stbuf( stbuf ), to_set( to_set ) - { } - - setattrRequest( const setattrRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - stbuf( other.get_stbuf() ), - to_set( other.get_to_set() ) - { } - - virtual ~setattrRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - const org::xtreemfs::interfaces::Stat& get_stbuf() const { return stbuf; } - uint32_t get_to_set() const { return to_set; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_stbuf( const org::xtreemfs::interfaces::Stat& stbuf ) { this->stbuf = stbuf; } - void set_to_set( uint32_t to_set ) { this->to_set = to_set; } - - bool operator==( const setattrRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_stbuf() == other.get_stbuf() - && - get_to_set() == other.get_to_set(); - } - - // yidl::runtime::Object - setattrRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031131 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "setattrRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stbuf", 0 ), get_stbuf() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "to_set", 0 ), get_to_set() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stbuf", 0 ), stbuf ); - to_set = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "to_set", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new setattrResponse; - } - - virtual void respond() - { - respond( *new setattrResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - org::xtreemfs::interfaces::Stat stbuf; - uint32_t to_set; - }; - - - class setattrResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~setattrResponse() { } - - bool operator==( const setattrResponse& ) const { return true; } - - // yidl::runtime::Object - setattrResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031131 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "setattrResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class setxattrRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - setxattrRequest() - : flags( 0 ) - { } - - setxattrRequest - ( - const string& volume_name, - const string& path, - const string& name, - const string& value, - int32_t flags - ) - : volume_name( volume_name ), - path( path ), - name( name ), - value( value ), - flags( flags ) - { } - - setxattrRequest( const setxattrRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ), - name( other.get_name() ), - value( other.get_value() ), - flags( other.get_flags() ) - { } - - virtual ~setxattrRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - const string& get_name() const { return name; } - const string& get_value() const { return value; } - int32_t get_flags() const { return flags; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - void set_name( const string& name ) { this->name = name; } - void set_value( const string& value ) { this->value = value; } - void set_flags( int32_t flags ) { this->flags = flags; } - - bool operator==( const setxattrRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path() - && - get_name() == other.get_name() - && - get_value() == other.get_value() - && - get_flags() == other.get_flags(); - } - - // yidl::runtime::Object - setxattrRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031132 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "setxattrRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "name", 0 ), get_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "value", 0 ), get_value() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "flags", 0 ), get_flags() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "name", 0 ), name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "value", 0 ), value ); - flags = unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "flags", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new setxattrResponse; - } - - virtual void respond() - { - respond( *new setxattrResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - string name; - string value; - int32_t flags; - }; - - - class setxattrResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~setxattrResponse() { } - - bool operator==( const setxattrResponse& ) const { return true; } - - // yidl::runtime::Object - setxattrResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031132 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "setxattrResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class statvfsRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - statvfsRequest() - : known_etag( 0 ) - { } - - statvfsRequest( const string& volume_name, uint64_t known_etag ) - : volume_name( volume_name ), known_etag( known_etag ) - { } - - statvfsRequest( const statvfsRequest& other ) - : volume_name( other.get_volume_name() ), - known_etag( other.get_known_etag() ) - { } - - virtual ~statvfsRequest() { } - - const string& get_volume_name() const { return volume_name; } - uint64_t get_known_etag() const { return known_etag; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_known_etag( uint64_t known_etag ) { this->known_etag = known_etag; } - - bool operator==( const statvfsRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_known_etag() == other.get_known_etag(); - } - - // yidl::runtime::Object - statvfsRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031133 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "statvfsRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "known_etag", 0 ), get_known_etag() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "known_etag", 0 ), known_etag ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new statvfsResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::StatVFSSet& stbuf ) - { - respond( *new statvfsResponse( stbuf ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - uint64_t known_etag; - }; - - - class statvfsResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - statvfsResponse() { } - - statvfsResponse( const org::xtreemfs::interfaces::StatVFSSet& stbuf ) - : stbuf( stbuf ) - { } - - statvfsResponse( const statvfsResponse& other ) - : stbuf( other.get_stbuf() ) - { } - - virtual ~statvfsResponse() { } - - const org::xtreemfs::interfaces::StatVFSSet& get_stbuf() const { return stbuf; } - void set_stbuf( const org::xtreemfs::interfaces::StatVFSSet& stbuf ) { this->stbuf = stbuf; } - - bool operator==( const statvfsResponse& other ) const - { - return get_stbuf() == other.get_stbuf(); - } - - // yidl::runtime::Object - statvfsResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031133 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "statvfsResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stbuf", 0 ), get_stbuf() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stbuf", 0 ), stbuf ); - } - - protected: - org::xtreemfs::interfaces::StatVFSSet stbuf; - }; - - - class symlinkRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - symlinkRequest() { } - - symlinkRequest - ( - const string& volume_name, - const string& target_path, - const string& link_path - ) - : volume_name( volume_name ), target_path( target_path ), link_path( link_path ) - { } - - symlinkRequest( const symlinkRequest& other ) - : volume_name( other.get_volume_name() ), - target_path( other.get_target_path() ), - link_path( other.get_link_path() ) - { } - - virtual ~symlinkRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_target_path() const { return target_path; } - const string& get_link_path() const { return link_path; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_target_path( const string& target_path ) { this->target_path = target_path; } - void set_link_path( const string& link_path ) { this->link_path = link_path; } - - bool operator==( const symlinkRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_target_path() == other.get_target_path() - && - get_link_path() == other.get_link_path(); - } - - // yidl::runtime::Object - symlinkRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031134 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "symlinkRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "target_path", 0 ), get_target_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "link_path", 0 ), get_link_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "target_path", 0 ), target_path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "link_path", 0 ), link_path ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new symlinkResponse; - } - - virtual void respond() - { - respond( *new symlinkResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string target_path; - string link_path; - }; - - - class symlinkResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~symlinkResponse() { } - - bool operator==( const symlinkResponse& ) const { return true; } - - // yidl::runtime::Object - symlinkResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031134 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "symlinkResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class unlinkRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - unlinkRequest() { } - - unlinkRequest( const string& volume_name, const string& path ) - : volume_name( volume_name ), path( path ) - { } - - unlinkRequest( const unlinkRequest& other ) - : volume_name( other.get_volume_name() ), - path( other.get_path() ) - { } - - virtual ~unlinkRequest() { } - - const string& get_volume_name() const { return volume_name; } - const string& get_path() const { return path; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - void set_path( const string& path ) { this->path = path; } - - bool operator==( const unlinkRequest& other ) const - { - return get_volume_name() == other.get_volume_name() - && - get_path() == other.get_path(); - } - - // yidl::runtime::Object - unlinkRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031135 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "unlinkRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "path", 0 ), get_path() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "path", 0 ), path ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new unlinkResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - { - respond - ( - *new unlinkResponse - ( - file_credentials - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - string path; - }; - - - class unlinkResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - unlinkResponse() { } - - unlinkResponse - ( - const org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - : file_credentials( file_credentials ) - { } - - unlinkResponse( const unlinkResponse& other ) - : file_credentials( other.get_file_credentials() ) - { } - - virtual ~unlinkResponse() { } - - const org::xtreemfs::interfaces::FileCredentialsSet& get_file_credentials() const { return file_credentials; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentialsSet& file_credentials ) { this->file_credentials = file_credentials; } - - bool operator==( const unlinkResponse& other ) const - { - return get_file_credentials() == other.get_file_credentials(); - } - - // yidl::runtime::Object - unlinkResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031135 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "unlinkResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - } - - protected: - org::xtreemfs::interfaces::FileCredentialsSet file_credentials; - }; - - - class xtreemfs_checkpointRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_checkpointRequest() { } - - bool operator==( const xtreemfs_checkpointRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_checkpointRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031146 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_checkpointRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_checkpointResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_checkpointResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_checkpointResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_checkpointResponse() { } - - bool operator==( const xtreemfs_checkpointResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_checkpointResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031146 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_checkpointResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_check_file_existsRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_check_file_existsRequest() { } - - xtreemfs_check_file_existsRequest - ( - const string& volume_id, - const org::xtreemfs::interfaces::StringSet& file_ids, - const string& osd_uuid - ) - : volume_id( volume_id ), file_ids( file_ids ), osd_uuid( osd_uuid ) - { } - - xtreemfs_check_file_existsRequest( const xtreemfs_check_file_existsRequest& other ) - : volume_id( other.get_volume_id() ), - file_ids( other.get_file_ids() ), - osd_uuid( other.get_osd_uuid() ) - { } - - virtual ~xtreemfs_check_file_existsRequest() { } - - const string& get_volume_id() const { return volume_id; } - const org::xtreemfs::interfaces::StringSet& get_file_ids() const { return file_ids; } - const string& get_osd_uuid() const { return osd_uuid; } - void set_volume_id( const string& volume_id ) { this->volume_id = volume_id; } - void set_file_ids( const org::xtreemfs::interfaces::StringSet& file_ids ) { this->file_ids = file_ids; } - void set_osd_uuid( const string& osd_uuid ) { this->osd_uuid = osd_uuid; } - - bool operator==( const xtreemfs_check_file_existsRequest& other ) const - { - return get_volume_id() == other.get_volume_id() - && - get_file_ids() == other.get_file_ids() - && - get_osd_uuid() == other.get_osd_uuid(); - } - - // yidl::runtime::Object - xtreemfs_check_file_existsRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031147 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_check_file_existsRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_id", 0 ), get_volume_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_ids", 0 ), get_file_ids() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_uuid", 0 ), get_osd_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_id", 0 ), volume_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_ids", 0 ), file_ids ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_uuid", 0 ), osd_uuid ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_check_file_existsResponse; - } - - virtual void respond( const string& bitmap ) - { - respond( *new xtreemfs_check_file_existsResponse( bitmap ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_id; - org::xtreemfs::interfaces::StringSet file_ids; - string osd_uuid; - }; - - - class xtreemfs_check_file_existsResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_check_file_existsResponse() { } - - xtreemfs_check_file_existsResponse( const string& bitmap ) - : bitmap( bitmap ) - { } - - xtreemfs_check_file_existsResponse( const xtreemfs_check_file_existsResponse& other ) - : bitmap( other.get_bitmap() ) - { } - - virtual ~xtreemfs_check_file_existsResponse() { } - - const string& get_bitmap() const { return bitmap; } - void set_bitmap( const string& bitmap ) { this->bitmap = bitmap; } - - bool operator==( const xtreemfs_check_file_existsResponse& other ) const - { - return get_bitmap() == other.get_bitmap(); - } - - // yidl::runtime::Object - xtreemfs_check_file_existsResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031147 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_check_file_existsResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "bitmap", 0 ), get_bitmap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "bitmap", 0 ), bitmap ); - } - - protected: - string bitmap; - }; - - - class xtreemfs_dump_databaseRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_dump_databaseRequest() { } - - xtreemfs_dump_databaseRequest( const string& dump_file ) - : dump_file( dump_file ) - { } - - xtreemfs_dump_databaseRequest( const xtreemfs_dump_databaseRequest& other ) - : dump_file( other.get_dump_file() ) - { } - - virtual ~xtreemfs_dump_databaseRequest() { } - - const string& get_dump_file() const { return dump_file; } - void set_dump_file( const string& dump_file ) { this->dump_file = dump_file; } - - bool operator==( const xtreemfs_dump_databaseRequest& other ) const - { - return get_dump_file() == other.get_dump_file(); - } - - // yidl::runtime::Object - xtreemfs_dump_databaseRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031148 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_dump_databaseRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "dump_file", 0 ), get_dump_file() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "dump_file", 0 ), dump_file ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_dump_databaseResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_dump_databaseResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string dump_file; - }; - - - class xtreemfs_dump_databaseResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_dump_databaseResponse() { } - - bool operator==( const xtreemfs_dump_databaseResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_dump_databaseResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031148 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_dump_databaseResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_get_suitable_osdsRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_get_suitable_osdsRequest() - : num_osds( 0 ) - { } - - xtreemfs_get_suitable_osdsRequest( const string& file_id, uint32_t num_osds ) - : file_id( file_id ), num_osds( num_osds ) - { } - - xtreemfs_get_suitable_osdsRequest( const xtreemfs_get_suitable_osdsRequest& other ) - : file_id( other.get_file_id() ), - num_osds( other.get_num_osds() ) - { } - - virtual ~xtreemfs_get_suitable_osdsRequest() { } - - const string& get_file_id() const { return file_id; } - uint32_t get_num_osds() const { return num_osds; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_num_osds( uint32_t num_osds ) { this->num_osds = num_osds; } - - bool operator==( const xtreemfs_get_suitable_osdsRequest& other ) const - { - return get_file_id() == other.get_file_id() - && - get_num_osds() == other.get_num_osds(); - } - - // yidl::runtime::Object - xtreemfs_get_suitable_osdsRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031149 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_get_suitable_osdsRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "num_osds", 0 ), get_num_osds() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - num_osds = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "num_osds", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_get_suitable_osdsResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::StringSet& osd_uuids ) - { - respond( *new xtreemfs_get_suitable_osdsResponse( osd_uuids ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string file_id; - uint32_t num_osds; - }; - - - class xtreemfs_get_suitable_osdsResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_get_suitable_osdsResponse() { } - - xtreemfs_get_suitable_osdsResponse - ( - const org::xtreemfs::interfaces::StringSet& osd_uuids - ) - : osd_uuids( osd_uuids ) - { } - - xtreemfs_get_suitable_osdsResponse( const xtreemfs_get_suitable_osdsResponse& other ) - : osd_uuids( other.get_osd_uuids() ) - { } - - virtual ~xtreemfs_get_suitable_osdsResponse() { } - - const org::xtreemfs::interfaces::StringSet& get_osd_uuids() const { return osd_uuids; } - void set_osd_uuids( const org::xtreemfs::interfaces::StringSet& osd_uuids ) { this->osd_uuids = osd_uuids; } - - bool operator==( const xtreemfs_get_suitable_osdsResponse& other ) const - { - return get_osd_uuids() == other.get_osd_uuids(); - } - - // yidl::runtime::Object - xtreemfs_get_suitable_osdsResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031149 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_get_suitable_osdsResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_uuids", 0 ), get_osd_uuids() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_uuids", 0 ), osd_uuids ); - } - - protected: - org::xtreemfs::interfaces::StringSet osd_uuids; - }; - - - class xtreemfs_internal_debugRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_internal_debugRequest() { } - - xtreemfs_internal_debugRequest( const string& operation ) - : operation( operation ) - { } - - xtreemfs_internal_debugRequest( const xtreemfs_internal_debugRequest& other ) - : operation( other.get_operation() ) - { } - - virtual ~xtreemfs_internal_debugRequest() { } - - const string& get_operation() const { return operation; } - void set_operation( const string& operation ) { this->operation = operation; } - - bool operator==( const xtreemfs_internal_debugRequest& other ) const - { - return get_operation() == other.get_operation(); - } - - // yidl::runtime::Object - xtreemfs_internal_debugRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031150 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_debugRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "operation", 0 ), get_operation() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "operation", 0 ), operation ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_internal_debugResponse; - } - - virtual void respond( const string& result ) - { - respond( *new xtreemfs_internal_debugResponse( result ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string operation; - }; - - - class xtreemfs_internal_debugResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_internal_debugResponse() { } - - xtreemfs_internal_debugResponse( const string& result ) - : result( result ) - { } - - xtreemfs_internal_debugResponse( const xtreemfs_internal_debugResponse& other ) - : result( other.get_result() ) - { } - - virtual ~xtreemfs_internal_debugResponse() { } - - const string& get_result() const { return result; } - void set_result( const string& result ) { this->result = result; } - - bool operator==( const xtreemfs_internal_debugResponse& other ) const - { - return get_result() == other.get_result(); - } - - // yidl::runtime::Object - xtreemfs_internal_debugResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031150 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_debugResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "result", 0 ), get_result() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "result", 0 ), result ); - } - - protected: - string result; - }; - - - class xtreemfs_lsvolRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_lsvolRequest() { } - - bool operator==( const xtreemfs_lsvolRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_lsvolRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031151 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lsvolRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_lsvolResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::StatVFSSet& volumes ) - { - respond( *new xtreemfs_lsvolResponse( volumes ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_lsvolResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_lsvolResponse() { } - - xtreemfs_lsvolResponse( const org::xtreemfs::interfaces::StatVFSSet& volumes ) - : volumes( volumes ) - { } - - xtreemfs_lsvolResponse( const xtreemfs_lsvolResponse& other ) - : volumes( other.get_volumes() ) - { } - - virtual ~xtreemfs_lsvolResponse() { } - - const org::xtreemfs::interfaces::StatVFSSet& get_volumes() const { return volumes; } - void set_volumes( const org::xtreemfs::interfaces::StatVFSSet& volumes ) { this->volumes = volumes; } - - bool operator==( const xtreemfs_lsvolResponse& other ) const - { - return get_volumes() == other.get_volumes(); - } - - // yidl::runtime::Object - xtreemfs_lsvolResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031151 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lsvolResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volumes", 0 ), get_volumes() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volumes", 0 ), volumes ); - } - - protected: - org::xtreemfs::interfaces::StatVFSSet volumes; - }; - - - class xtreemfs_mkvolRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_mkvolRequest() { } - - xtreemfs_mkvolRequest( const org::xtreemfs::interfaces::StatVFS& volume ) - : volume( volume ) - { } - - xtreemfs_mkvolRequest( const xtreemfs_mkvolRequest& other ) - : volume( other.get_volume() ) - { } - - virtual ~xtreemfs_mkvolRequest() { } - - const org::xtreemfs::interfaces::StatVFS& get_volume() const { return volume; } - void set_volume( const org::xtreemfs::interfaces::StatVFS& volume ) { this->volume = volume; } - - bool operator==( const xtreemfs_mkvolRequest& other ) const - { - return get_volume() == other.get_volume(); - } - - // yidl::runtime::Object - xtreemfs_mkvolRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031152 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_mkvolRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume", 0 ), get_volume() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume", 0 ), volume ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_mkvolResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_mkvolResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::StatVFS volume; - }; - - - class xtreemfs_mkvolResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_mkvolResponse() { } - - bool operator==( const xtreemfs_mkvolResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_mkvolResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031152 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_mkvolResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_renew_capabilityRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_renew_capabilityRequest() { } - - xtreemfs_renew_capabilityRequest - ( - const org::xtreemfs::interfaces::XCap& old_xcap - ) - : old_xcap( old_xcap ) - { } - - xtreemfs_renew_capabilityRequest( const xtreemfs_renew_capabilityRequest& other ) - : old_xcap( other.get_old_xcap() ) - { } - - virtual ~xtreemfs_renew_capabilityRequest() { } - - const org::xtreemfs::interfaces::XCap& get_old_xcap() const { return old_xcap; } - void set_old_xcap( const org::xtreemfs::interfaces::XCap& old_xcap ) { this->old_xcap = old_xcap; } - - bool operator==( const xtreemfs_renew_capabilityRequest& other ) const - { - return get_old_xcap() == other.get_old_xcap(); - } - - // yidl::runtime::Object - xtreemfs_renew_capabilityRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031153 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_renew_capabilityRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "old_xcap", 0 ), get_old_xcap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "old_xcap", 0 ), old_xcap ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_renew_capabilityResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::XCap& renewed_xcap ) - { - respond( *new xtreemfs_renew_capabilityResponse( renewed_xcap ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::XCap old_xcap; - }; - - - class xtreemfs_renew_capabilityResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_renew_capabilityResponse() { } - - xtreemfs_renew_capabilityResponse - ( - const org::xtreemfs::interfaces::XCap& renewed_xcap - ) - : renewed_xcap( renewed_xcap ) - { } - - xtreemfs_renew_capabilityResponse( const xtreemfs_renew_capabilityResponse& other ) - : renewed_xcap( other.get_renewed_xcap() ) - { } - - virtual ~xtreemfs_renew_capabilityResponse() { } - - const org::xtreemfs::interfaces::XCap& get_renewed_xcap() const { return renewed_xcap; } - void set_renewed_xcap( const org::xtreemfs::interfaces::XCap& renewed_xcap ) { this->renewed_xcap = renewed_xcap; } - - bool operator==( const xtreemfs_renew_capabilityResponse& other ) const - { - return get_renewed_xcap() == other.get_renewed_xcap(); - } - - // yidl::runtime::Object - xtreemfs_renew_capabilityResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031153 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_renew_capabilityResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "renewed_xcap", 0 ), get_renewed_xcap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "renewed_xcap", 0 ), renewed_xcap ); - } - - protected: - org::xtreemfs::interfaces::XCap renewed_xcap; - }; - - - class xtreemfs_replica_addRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_replica_addRequest() { } - - xtreemfs_replica_addRequest - ( - const string& file_id, - const org::xtreemfs::interfaces::Replica& new_replica - ) - : file_id( file_id ), new_replica( new_replica ) - { } - - xtreemfs_replica_addRequest( const xtreemfs_replica_addRequest& other ) - : file_id( other.get_file_id() ), - new_replica( other.get_new_replica() ) - { } - - virtual ~xtreemfs_replica_addRequest() { } - - const string& get_file_id() const { return file_id; } - const org::xtreemfs::interfaces::Replica& get_new_replica() const { return new_replica; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_new_replica( const org::xtreemfs::interfaces::Replica& new_replica ) { this->new_replica = new_replica; } - - bool operator==( const xtreemfs_replica_addRequest& other ) const - { - return get_file_id() == other.get_file_id() - && - get_new_replica() == other.get_new_replica(); - } - - // yidl::runtime::Object - xtreemfs_replica_addRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031154 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_replica_addRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "new_replica", 0 ), get_new_replica() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "new_replica", 0 ), new_replica ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_replica_addResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_replica_addResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string file_id; - org::xtreemfs::interfaces::Replica new_replica; - }; - - - class xtreemfs_replica_addResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_replica_addResponse() { } - - bool operator==( const xtreemfs_replica_addResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_replica_addResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031154 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_replica_addResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_replica_listRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_replica_listRequest() { } - - xtreemfs_replica_listRequest( const string& file_id ) - : file_id( file_id ) - { } - - xtreemfs_replica_listRequest( const xtreemfs_replica_listRequest& other ) - : file_id( other.get_file_id() ) - { } - - virtual ~xtreemfs_replica_listRequest() { } - - const string& get_file_id() const { return file_id; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - - bool operator==( const xtreemfs_replica_listRequest& other ) const - { - return get_file_id() == other.get_file_id(); - } - - // yidl::runtime::Object - xtreemfs_replica_listRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031155 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_replica_listRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_replica_listResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::ReplicaSet& replicas ) - { - respond( *new xtreemfs_replica_listResponse( replicas ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string file_id; - }; - - - class xtreemfs_replica_listResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_replica_listResponse() { } - - xtreemfs_replica_listResponse - ( - const org::xtreemfs::interfaces::ReplicaSet& replicas - ) - : replicas( replicas ) - { } - - xtreemfs_replica_listResponse( const xtreemfs_replica_listResponse& other ) - : replicas( other.get_replicas() ) - { } - - virtual ~xtreemfs_replica_listResponse() { } - - const org::xtreemfs::interfaces::ReplicaSet& get_replicas() const { return replicas; } - void set_replicas( const org::xtreemfs::interfaces::ReplicaSet& replicas ) { this->replicas = replicas; } - - bool operator==( const xtreemfs_replica_listResponse& other ) const - { - return get_replicas() == other.get_replicas(); - } - - // yidl::runtime::Object - xtreemfs_replica_listResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031155 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_replica_listResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "replicas", 0 ), get_replicas() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "replicas", 0 ), replicas ); - } - - protected: - org::xtreemfs::interfaces::ReplicaSet replicas; - }; - - - class xtreemfs_replica_removeRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_replica_removeRequest() { } - - xtreemfs_replica_removeRequest( const string& file_id, const string& osd_uuid ) - : file_id( file_id ), osd_uuid( osd_uuid ) - { } - - xtreemfs_replica_removeRequest( const xtreemfs_replica_removeRequest& other ) - : file_id( other.get_file_id() ), - osd_uuid( other.get_osd_uuid() ) - { } - - virtual ~xtreemfs_replica_removeRequest() { } - - const string& get_file_id() const { return file_id; } - const string& get_osd_uuid() const { return osd_uuid; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_osd_uuid( const string& osd_uuid ) { this->osd_uuid = osd_uuid; } - - bool operator==( const xtreemfs_replica_removeRequest& other ) const - { - return get_file_id() == other.get_file_id() - && - get_osd_uuid() == other.get_osd_uuid(); - } - - // yidl::runtime::Object - xtreemfs_replica_removeRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031156 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_replica_removeRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_uuid", 0 ), get_osd_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_uuid", 0 ), osd_uuid ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_replica_removeResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::XCap& delete_xcap ) - { - respond( *new xtreemfs_replica_removeResponse( delete_xcap ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string file_id; - string osd_uuid; - }; - - - class xtreemfs_replica_removeResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_replica_removeResponse() { } - - xtreemfs_replica_removeResponse - ( - const org::xtreemfs::interfaces::XCap& delete_xcap - ) - : delete_xcap( delete_xcap ) - { } - - xtreemfs_replica_removeResponse( const xtreemfs_replica_removeResponse& other ) - : delete_xcap( other.get_delete_xcap() ) - { } - - virtual ~xtreemfs_replica_removeResponse() { } - - const org::xtreemfs::interfaces::XCap& get_delete_xcap() const { return delete_xcap; } - void set_delete_xcap( const org::xtreemfs::interfaces::XCap& delete_xcap ) { this->delete_xcap = delete_xcap; } - - bool operator==( const xtreemfs_replica_removeResponse& other ) const - { - return get_delete_xcap() == other.get_delete_xcap(); - } - - // yidl::runtime::Object - xtreemfs_replica_removeResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031156 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_replica_removeResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "delete_xcap", 0 ), get_delete_xcap() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "delete_xcap", 0 ), delete_xcap ); - } - - protected: - org::xtreemfs::interfaces::XCap delete_xcap; - }; - - - class xtreemfs_restore_databaseRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_restore_databaseRequest() { } - - xtreemfs_restore_databaseRequest( const string& dump_file ) - : dump_file( dump_file ) - { } - - xtreemfs_restore_databaseRequest( const xtreemfs_restore_databaseRequest& other ) - : dump_file( other.get_dump_file() ) - { } - - virtual ~xtreemfs_restore_databaseRequest() { } - - const string& get_dump_file() const { return dump_file; } - void set_dump_file( const string& dump_file ) { this->dump_file = dump_file; } - - bool operator==( const xtreemfs_restore_databaseRequest& other ) const - { - return get_dump_file() == other.get_dump_file(); - } - - // yidl::runtime::Object - xtreemfs_restore_databaseRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031157 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_restore_databaseRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "dump_file", 0 ), get_dump_file() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "dump_file", 0 ), dump_file ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_restore_databaseResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_restore_databaseResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string dump_file; - }; - - - class xtreemfs_restore_databaseResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_restore_databaseResponse() { } - - bool operator==( const xtreemfs_restore_databaseResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_restore_databaseResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031157 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_restore_databaseResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_restore_fileRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_restore_fileRequest() - : file_size( 0 ), stripe_size( 0 ) - { } - - xtreemfs_restore_fileRequest - ( - const string& file_path, - const string& file_id, - uint64_t file_size, - const string& osd_uuid, - int32_t stripe_size - ) - : file_path( file_path ), - file_id( file_id ), - file_size( file_size ), - osd_uuid( osd_uuid ), - stripe_size( stripe_size ) - { } - - xtreemfs_restore_fileRequest( const xtreemfs_restore_fileRequest& other ) - : file_path( other.get_file_path() ), - file_id( other.get_file_id() ), - file_size( other.get_file_size() ), - osd_uuid( other.get_osd_uuid() ), - stripe_size( other.get_stripe_size() ) - { } - - virtual ~xtreemfs_restore_fileRequest() { } - - const string& get_file_path() const { return file_path; } - const string& get_file_id() const { return file_id; } - uint64_t get_file_size() const { return file_size; } - const string& get_osd_uuid() const { return osd_uuid; } - int32_t get_stripe_size() const { return stripe_size; } - void set_file_path( const string& file_path ) { this->file_path = file_path; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_file_size( uint64_t file_size ) { this->file_size = file_size; } - void set_osd_uuid( const string& osd_uuid ) { this->osd_uuid = osd_uuid; } - void set_stripe_size( int32_t stripe_size ) { this->stripe_size = stripe_size; } - - bool operator==( const xtreemfs_restore_fileRequest& other ) const - { - return get_file_path() == other.get_file_path() - && - get_file_id() == other.get_file_id() - && - get_file_size() == other.get_file_size() - && - get_osd_uuid() == other.get_osd_uuid() - && - get_stripe_size() == other.get_stripe_size(); - } - - // yidl::runtime::Object - xtreemfs_restore_fileRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031158 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_restore_fileRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_path", 0 ), get_file_path() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_size", 0 ), get_file_size() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_uuid", 0 ), get_osd_uuid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stripe_size", 0 ), get_stripe_size() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_path", 0 ), file_path ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_size", 0 ), file_size ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_uuid", 0 ), osd_uuid ); - stripe_size = unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stripe_size", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_restore_fileResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_restore_fileResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string file_path; - string file_id; - uint64_t file_size; - string osd_uuid; - int32_t stripe_size; - }; - - - class xtreemfs_restore_fileResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_restore_fileResponse() { } - - bool operator==( const xtreemfs_restore_fileResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_restore_fileResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031158 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_restore_fileResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_rmvolRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_rmvolRequest() { } - - xtreemfs_rmvolRequest( const string& volume_name ) - : volume_name( volume_name ) - { } - - xtreemfs_rmvolRequest( const xtreemfs_rmvolRequest& other ) - : volume_name( other.get_volume_name() ) - { } - - virtual ~xtreemfs_rmvolRequest() { } - - const string& get_volume_name() const { return volume_name; } - void set_volume_name( const string& volume_name ) { this->volume_name = volume_name; } - - bool operator==( const xtreemfs_rmvolRequest& other ) const - { - return get_volume_name() == other.get_volume_name(); - } - - // yidl::runtime::Object - xtreemfs_rmvolRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031159 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rmvolRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "volume_name", 0 ), get_volume_name() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "volume_name", 0 ), volume_name ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_rmvolResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_rmvolResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string volume_name; - }; - - - class xtreemfs_rmvolResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_rmvolResponse() { } - - bool operator==( const xtreemfs_rmvolResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_rmvolResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031159 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rmvolResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_shutdownRequest : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_shutdownRequest() { } - - bool operator==( const xtreemfs_shutdownRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_shutdownRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031160 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_shutdownRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_shutdownResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_shutdownResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_shutdownResponse : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_shutdownResponse() { } - - bool operator==( const xtreemfs_shutdownResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_shutdownResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031160 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_shutdownResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class ConcurrentModificationException : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - ConcurrentModificationException() { } - ConcurrentModificationException( const string& stack_trace ) : stack_trace( stack_trace ) { } - virtual ~ConcurrentModificationException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031166 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ConcurrentModificationException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new ConcurrentModificationException( get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw ConcurrentModificationException( get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class errnoException : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - errnoException() { } - errnoException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code ) { } - errnoException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - errnoException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - errnoException( uint32_t error_code, const char* error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - errnoException( uint32_t error_code, const string& error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - errnoException( uint32_t error_code, const string& error_message, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ), stack_trace( stack_trace ) { } - virtual ~errnoException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031167 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "errnoException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new errnoException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw errnoException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class InvalidArgumentException : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - InvalidArgumentException() { } - InvalidArgumentException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - InvalidArgumentException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - virtual ~InvalidArgumentException() throw() { ; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031168 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "InvalidArgumentException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new InvalidArgumentException( get_error_message() ); - } - - virtual void throwStackClone() const - { - throw InvalidArgumentException( get_error_message() ); - } - }; - - - class MRCException : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - MRCException() { } - MRCException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code ) { } - MRCException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - MRCException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - MRCException( uint32_t error_code, const char* error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - MRCException( uint32_t error_code, const string& error_message ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - MRCException( uint32_t error_code, const string& error_message, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ), stack_trace( stack_trace ) { } - virtual ~MRCException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031169 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "MRCException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new MRCException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw MRCException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class ProtocolException : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - ProtocolException() : accept_stat( 0 ) { } - ProtocolException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code ), accept_stat( 0 ) { } - ProtocolException( uint32_t accept_stat, uint32_t error_code, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS( error_code ), accept_stat( accept_stat ), stack_trace( stack_trace ) { } - virtual ~ProtocolException() throw() { ; } - - uint32_t get_accept_stat() const { return accept_stat; } - void set_accept_stat( uint32_t accept_stat ) { this->accept_stat = accept_stat; } - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031170 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ProtocolException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "accept_stat", 0 ), get_accept_stat() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - accept_stat = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "accept_stat", 0 ) ); - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new ProtocolException( get_accept_stat(), get_error_code(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw ProtocolException( get_accept_stat(), get_error_code(), get_stack_trace() ); - } - - protected: - uint32_t accept_stat; - string stack_trace; - }; - - - class RedirectException : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - RedirectException() : port( 0 ) { } - RedirectException( const string& address, uint16_t port ) : address( address ), port( port ) { } - virtual ~RedirectException() throw() { ; } - - const string& get_address() const { return address; } - void set_address( const string& address ) { this->address = address; } - uint16_t get_port() const { return port; } - void set_port( uint16_t port ) { this->port = port; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031171 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "RedirectException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "address", 0 ), get_address() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "port", 0 ), get_port() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "address", 0 ), address ); - port = unmarshaller.read_uint16( ::yidl::runtime::Unmarshaller::StringLiteralKey( "port", 0 ) ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new RedirectException( get_address(), get_port() ); - } - - virtual void throwStackClone() const - { - throw RedirectException( get_address(), get_port() ); - } - - protected: - string address; - uint16_t port; - }; - - - class StaleETagException : public ORG_XTREEMFS_INTERFACES_MRCINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - - virtual ~StaleETagException() throw() { ; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031172 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "StaleETagException"; } - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new StaleETagException(); - } - - virtual void throwStackClone() const - { - throw StaleETagException(); - } - }; - }; - - - class MRCInterfaceMessageFactory - : public ::yield::concurrency::MessageFactory, - private MRCInterfaceMessages - { - public: - // yield::concurrency::MessageFactory - virtual ::yield::concurrency::Exception* createException( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031166: return new ConcurrentModificationException; - case 2010031167: return new errnoException; - case 2010031168: return new InvalidArgumentException; - case 2010031169: return new MRCException; - case 2010031170: return new ProtocolException; - case 2010031171: return new RedirectException; - case 2010031172: return new StaleETagException; - default: return NULL; - } - } - - virtual ::yield::concurrency::Exception* - createException - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 31 && strncmp( type_name, "ConcurrentModificationException", 31 ) == 0 ) return new ConcurrentModificationException; - else if ( type_name_len == 14 && strncmp( type_name, "errnoException", 14 ) == 0 ) return new errnoException; - else if ( type_name_len == 24 && strncmp( type_name, "InvalidArgumentException", 24 ) == 0 ) return new InvalidArgumentException; - else if ( type_name_len == 12 && strncmp( type_name, "MRCException", 12 ) == 0 ) return new MRCException; - else if ( type_name_len == 17 && strncmp( type_name, "ProtocolException", 17 ) == 0 ) return new ProtocolException; - else if ( type_name_len == 17 && strncmp( type_name, "RedirectException", 17 ) == 0 ) return new RedirectException; - else if ( type_name_len == 18 && strncmp( type_name, "StaleETagException", 18 ) == 0 ) return new StaleETagException; - else return NULL; - } - - virtual ::yield::concurrency::Request* createRequest( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031117: return new closeRequest; - case 2010031118: return new fsetattrRequest; - case 2010031119: return new ftruncateRequest; - case 2010031120: return new getattrRequest; - case 2010031121: return new getxattrRequest; - case 2010031122: return new linkRequest; - case 2010031123: return new listxattrRequest; - case 2010031124: return new mkdirRequest; - case 2010031125: return new openRequest; - case 2010031126: return new readdirRequest; - case 2010031127: return new readlinkRequest; - case 2010031128: return new removexattrRequest; - case 2010031129: return new renameRequest; - case 2010031130: return new rmdirRequest; - case 2010031131: return new setattrRequest; - case 2010031132: return new setxattrRequest; - case 2010031133: return new statvfsRequest; - case 2010031134: return new symlinkRequest; - case 2010031135: return new unlinkRequest; - case 2010031146: return new xtreemfs_checkpointRequest; - case 2010031147: return new xtreemfs_check_file_existsRequest; - case 2010031148: return new xtreemfs_dump_databaseRequest; - case 2010031149: return new xtreemfs_get_suitable_osdsRequest; - case 2010031150: return new xtreemfs_internal_debugRequest; - case 2010031151: return new xtreemfs_lsvolRequest; - case 2010031152: return new xtreemfs_mkvolRequest; - case 2010031153: return new xtreemfs_renew_capabilityRequest; - case 2010031154: return new xtreemfs_replica_addRequest; - case 2010031155: return new xtreemfs_replica_listRequest; - case 2010031156: return new xtreemfs_replica_removeRequest; - case 2010031157: return new xtreemfs_restore_databaseRequest; - case 2010031158: return new xtreemfs_restore_fileRequest; - case 2010031159: return new xtreemfs_rmvolRequest; - case 2010031160: return new xtreemfs_shutdownRequest; - default: return NULL; - } - } - - virtual ::yield::concurrency::Request* - createRequest - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 12 && strncmp( type_name, "closeRequest", 12 ) == 0 ) return new closeRequest; - else if ( type_name_len == 15 && strncmp( type_name, "fsetattrRequest", 15 ) == 0 ) return new fsetattrRequest; - else if ( type_name_len == 16 && strncmp( type_name, "ftruncateRequest", 16 ) == 0 ) return new ftruncateRequest; - else if ( type_name_len == 14 && strncmp( type_name, "getattrRequest", 14 ) == 0 ) return new getattrRequest; - else if ( type_name_len == 15 && strncmp( type_name, "getxattrRequest", 15 ) == 0 ) return new getxattrRequest; - else if ( type_name_len == 11 && strncmp( type_name, "linkRequest", 11 ) == 0 ) return new linkRequest; - else if ( type_name_len == 16 && strncmp( type_name, "listxattrRequest", 16 ) == 0 ) return new listxattrRequest; - else if ( type_name_len == 12 && strncmp( type_name, "mkdirRequest", 12 ) == 0 ) return new mkdirRequest; - else if ( type_name_len == 11 && strncmp( type_name, "openRequest", 11 ) == 0 ) return new openRequest; - else if ( type_name_len == 14 && strncmp( type_name, "readdirRequest", 14 ) == 0 ) return new readdirRequest; - else if ( type_name_len == 15 && strncmp( type_name, "readlinkRequest", 15 ) == 0 ) return new readlinkRequest; - else if ( type_name_len == 18 && strncmp( type_name, "removexattrRequest", 18 ) == 0 ) return new removexattrRequest; - else if ( type_name_len == 13 && strncmp( type_name, "renameRequest", 13 ) == 0 ) return new renameRequest; - else if ( type_name_len == 12 && strncmp( type_name, "rmdirRequest", 12 ) == 0 ) return new rmdirRequest; - else if ( type_name_len == 14 && strncmp( type_name, "setattrRequest", 14 ) == 0 ) return new setattrRequest; - else if ( type_name_len == 15 && strncmp( type_name, "setxattrRequest", 15 ) == 0 ) return new setxattrRequest; - else if ( type_name_len == 14 && strncmp( type_name, "statvfsRequest", 14 ) == 0 ) return new statvfsRequest; - else if ( type_name_len == 14 && strncmp( type_name, "symlinkRequest", 14 ) == 0 ) return new symlinkRequest; - else if ( type_name_len == 13 && strncmp( type_name, "unlinkRequest", 13 ) == 0 ) return new unlinkRequest; - else if ( type_name_len == 26 && strncmp( type_name, "xtreemfs_checkpointRequest", 26 ) == 0 ) return new xtreemfs_checkpointRequest; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_check_file_existsRequest", 33 ) == 0 ) return new xtreemfs_check_file_existsRequest; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_dump_databaseRequest", 29 ) == 0 ) return new xtreemfs_dump_databaseRequest; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_get_suitable_osdsRequest", 33 ) == 0 ) return new xtreemfs_get_suitable_osdsRequest; - else if ( type_name_len == 30 && strncmp( type_name, "xtreemfs_internal_debugRequest", 30 ) == 0 ) return new xtreemfs_internal_debugRequest; - else if ( type_name_len == 21 && strncmp( type_name, "xtreemfs_lsvolRequest", 21 ) == 0 ) return new xtreemfs_lsvolRequest; - else if ( type_name_len == 21 && strncmp( type_name, "xtreemfs_mkvolRequest", 21 ) == 0 ) return new xtreemfs_mkvolRequest; - else if ( type_name_len == 32 && strncmp( type_name, "xtreemfs_renew_capabilityRequest", 32 ) == 0 ) return new xtreemfs_renew_capabilityRequest; - else if ( type_name_len == 27 && strncmp( type_name, "xtreemfs_replica_addRequest", 27 ) == 0 ) return new xtreemfs_replica_addRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_replica_listRequest", 28 ) == 0 ) return new xtreemfs_replica_listRequest; - else if ( type_name_len == 30 && strncmp( type_name, "xtreemfs_replica_removeRequest", 30 ) == 0 ) return new xtreemfs_replica_removeRequest; - else if ( type_name_len == 32 && strncmp( type_name, "xtreemfs_restore_databaseRequest", 32 ) == 0 ) return new xtreemfs_restore_databaseRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_restore_fileRequest", 28 ) == 0 ) return new xtreemfs_restore_fileRequest; - else if ( type_name_len == 21 && strncmp( type_name, "xtreemfs_rmvolRequest", 21 ) == 0 ) return new xtreemfs_rmvolRequest; - else if ( type_name_len == 24 && strncmp( type_name, "xtreemfs_shutdownRequest", 24 ) == 0 ) return new xtreemfs_shutdownRequest; - else return NULL; - } - - virtual ::yield::concurrency::Response* createResponse( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031117: return new closeResponse; - case 2010031118: return new fsetattrResponse; - case 2010031119: return new ftruncateResponse; - case 2010031120: return new getattrResponse; - case 2010031121: return new getxattrResponse; - case 2010031122: return new linkResponse; - case 2010031123: return new listxattrResponse; - case 2010031124: return new mkdirResponse; - case 2010031125: return new openResponse; - case 2010031126: return new readdirResponse; - case 2010031127: return new readlinkResponse; - case 2010031128: return new removexattrResponse; - case 2010031129: return new renameResponse; - case 2010031130: return new rmdirResponse; - case 2010031131: return new setattrResponse; - case 2010031132: return new setxattrResponse; - case 2010031133: return new statvfsResponse; - case 2010031134: return new symlinkResponse; - case 2010031135: return new unlinkResponse; - case 2010031146: return new xtreemfs_checkpointResponse; - case 2010031147: return new xtreemfs_check_file_existsResponse; - case 2010031148: return new xtreemfs_dump_databaseResponse; - case 2010031149: return new xtreemfs_get_suitable_osdsResponse; - case 2010031150: return new xtreemfs_internal_debugResponse; - case 2010031151: return new xtreemfs_lsvolResponse; - case 2010031152: return new xtreemfs_mkvolResponse; - case 2010031153: return new xtreemfs_renew_capabilityResponse; - case 2010031154: return new xtreemfs_replica_addResponse; - case 2010031155: return new xtreemfs_replica_listResponse; - case 2010031156: return new xtreemfs_replica_removeResponse; - case 2010031157: return new xtreemfs_restore_databaseResponse; - case 2010031158: return new xtreemfs_restore_fileResponse; - case 2010031159: return new xtreemfs_rmvolResponse; - case 2010031160: return new xtreemfs_shutdownResponse; - default: return NULL; - } - } - - virtual ::yield::concurrency::Response* - createResponse - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 13 && strncmp( type_name, "closeResponse", 13 ) == 0 ) return new closeResponse; - else if ( type_name_len == 16 && strncmp( type_name, "fsetattrResponse", 16 ) == 0 ) return new fsetattrResponse; - else if ( type_name_len == 17 && strncmp( type_name, "ftruncateResponse", 17 ) == 0 ) return new ftruncateResponse; - else if ( type_name_len == 15 && strncmp( type_name, "getattrResponse", 15 ) == 0 ) return new getattrResponse; - else if ( type_name_len == 16 && strncmp( type_name, "getxattrResponse", 16 ) == 0 ) return new getxattrResponse; - else if ( type_name_len == 12 && strncmp( type_name, "linkResponse", 12 ) == 0 ) return new linkResponse; - else if ( type_name_len == 17 && strncmp( type_name, "listxattrResponse", 17 ) == 0 ) return new listxattrResponse; - else if ( type_name_len == 13 && strncmp( type_name, "mkdirResponse", 13 ) == 0 ) return new mkdirResponse; - else if ( type_name_len == 12 && strncmp( type_name, "openResponse", 12 ) == 0 ) return new openResponse; - else if ( type_name_len == 15 && strncmp( type_name, "readdirResponse", 15 ) == 0 ) return new readdirResponse; - else if ( type_name_len == 16 && strncmp( type_name, "readlinkResponse", 16 ) == 0 ) return new readlinkResponse; - else if ( type_name_len == 19 && strncmp( type_name, "removexattrResponse", 19 ) == 0 ) return new removexattrResponse; - else if ( type_name_len == 14 && strncmp( type_name, "renameResponse", 14 ) == 0 ) return new renameResponse; - else if ( type_name_len == 13 && strncmp( type_name, "rmdirResponse", 13 ) == 0 ) return new rmdirResponse; - else if ( type_name_len == 15 && strncmp( type_name, "setattrResponse", 15 ) == 0 ) return new setattrResponse; - else if ( type_name_len == 16 && strncmp( type_name, "setxattrResponse", 16 ) == 0 ) return new setxattrResponse; - else if ( type_name_len == 15 && strncmp( type_name, "statvfsResponse", 15 ) == 0 ) return new statvfsResponse; - else if ( type_name_len == 15 && strncmp( type_name, "symlinkResponse", 15 ) == 0 ) return new symlinkResponse; - else if ( type_name_len == 14 && strncmp( type_name, "unlinkResponse", 14 ) == 0 ) return new unlinkResponse; - else if ( type_name_len == 27 && strncmp( type_name, "xtreemfs_checkpointResponse", 27 ) == 0 ) return new xtreemfs_checkpointResponse; - else if ( type_name_len == 34 && strncmp( type_name, "xtreemfs_check_file_existsResponse", 34 ) == 0 ) return new xtreemfs_check_file_existsResponse; - else if ( type_name_len == 30 && strncmp( type_name, "xtreemfs_dump_databaseResponse", 30 ) == 0 ) return new xtreemfs_dump_databaseResponse; - else if ( type_name_len == 34 && strncmp( type_name, "xtreemfs_get_suitable_osdsResponse", 34 ) == 0 ) return new xtreemfs_get_suitable_osdsResponse; - else if ( type_name_len == 31 && strncmp( type_name, "xtreemfs_internal_debugResponse", 31 ) == 0 ) return new xtreemfs_internal_debugResponse; - else if ( type_name_len == 22 && strncmp( type_name, "xtreemfs_lsvolResponse", 22 ) == 0 ) return new xtreemfs_lsvolResponse; - else if ( type_name_len == 22 && strncmp( type_name, "xtreemfs_mkvolResponse", 22 ) == 0 ) return new xtreemfs_mkvolResponse; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_renew_capabilityResponse", 33 ) == 0 ) return new xtreemfs_renew_capabilityResponse; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_replica_addResponse", 28 ) == 0 ) return new xtreemfs_replica_addResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_replica_listResponse", 29 ) == 0 ) return new xtreemfs_replica_listResponse; - else if ( type_name_len == 31 && strncmp( type_name, "xtreemfs_replica_removeResponse", 31 ) == 0 ) return new xtreemfs_replica_removeResponse; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_restore_databaseResponse", 33 ) == 0 ) return new xtreemfs_restore_databaseResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_restore_fileResponse", 29 ) == 0 ) return new xtreemfs_restore_fileResponse; - else if ( type_name_len == 22 && strncmp( type_name, "xtreemfs_rmvolResponse", 22 ) == 0 ) return new xtreemfs_rmvolResponse; - else if ( type_name_len == 25 && strncmp( type_name, "xtreemfs_shutdownResponse", 25 ) == 0 ) return new xtreemfs_shutdownResponse; - else return NULL; - } - - - // yidl::runtime::MarshallableObjectFactory - virtual ::yidl::runtime::MarshallableObject* - createMarshallableObject - ( - uint32_t type_id - ) - { - switch ( type_id ) - { - case 2010030933: return new OSDWriteResponse; - case 2010030942: return new FileCredentialsSet; - case 2010030927: return new NewFileSize; - case 2010030917: return new StringSet; - case 2010030957: return new StatSet; - case 2010030956: return new Stat; - case 2010030959: return new DirectoryEntrySet; - case 2010030960: return new StatVFS; - case 2010030939: return new XCap; - case 2010030961: return new StatVFSSet; - case 2010030918: return new UserCredentials; - case 2010030938: return new VivaldiCoordinates; - case 2010030937: return new ReplicaSet; - case 2010030935: return new StripingPolicy; - case 2010030928: return new NewFileSizeSet; - case 2010030941: return new FileCredentials; - case 2010030958: return new DirectoryEntry; - case 2010030936: return new Replica; - case 2010030940: return new XLocSet; - default: return NULL; - } - } - - virtual ::yidl::runtime::MarshallableObject* - createMarshallableObject - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 16 && strncmp( type_name, "OSDWriteResponse", 16 ) == 0 ) return new OSDWriteResponse; - else if ( type_name_len == 18 && strncmp( type_name, "FileCredentialsSet", 18 ) == 0 ) return new FileCredentialsSet; - else if ( type_name_len == 11 && strncmp( type_name, "NewFileSize", 11 ) == 0 ) return new NewFileSize; - else if ( type_name_len == 9 && strncmp( type_name, "StringSet", 9 ) == 0 ) return new StringSet; - else if ( type_name_len == 7 && strncmp( type_name, "StatSet", 7 ) == 0 ) return new StatSet; - else if ( type_name_len == 4 && strncmp( type_name, "Stat", 4 ) == 0 ) return new Stat; - else if ( type_name_len == 17 && strncmp( type_name, "DirectoryEntrySet", 17 ) == 0 ) return new DirectoryEntrySet; - else if ( type_name_len == 7 && strncmp( type_name, "StatVFS", 7 ) == 0 ) return new StatVFS; - else if ( type_name_len == 4 && strncmp( type_name, "XCap", 4 ) == 0 ) return new XCap; - else if ( type_name_len == 10 && strncmp( type_name, "StatVFSSet", 10 ) == 0 ) return new StatVFSSet; - else if ( type_name_len == 15 && strncmp( type_name, "UserCredentials", 15 ) == 0 ) return new UserCredentials; - else if ( type_name_len == 18 && strncmp( type_name, "VivaldiCoordinates", 18 ) == 0 ) return new VivaldiCoordinates; - else if ( type_name_len == 10 && strncmp( type_name, "ReplicaSet", 10 ) == 0 ) return new ReplicaSet; - else if ( type_name_len == 14 && strncmp( type_name, "StripingPolicy", 14 ) == 0 ) return new StripingPolicy; - else if ( type_name_len == 14 && strncmp( type_name, "NewFileSizeSet", 14 ) == 0 ) return new NewFileSizeSet; - else if ( type_name_len == 15 && strncmp( type_name, "FileCredentials", 15 ) == 0 ) return new FileCredentials; - else if ( type_name_len == 14 && strncmp( type_name, "DirectoryEntry", 14 ) == 0 ) return new DirectoryEntry; - else if ( type_name_len == 7 && strncmp( type_name, "Replica", 7 ) == 0 ) return new Replica; - else if ( type_name_len == 7 && strncmp( type_name, "XLocSet", 7 ) == 0 ) return new XLocSet; - else return NULL; - } - }; - - - class MRCInterfaceRequestHandler - : public ::yield::concurrency::RequestHandler, - protected MRCInterfaceMessages - { - public: - MRCInterfaceRequestHandler() // Subclasses must implement - : _interface( NULL ) // all relevant handle*Request methods - { } - - // Steals interface_ to allow for *new - MRCInterfaceRequestHandler( MRCInterface& _interface ) - : _interface( &_interface ) - { } - - virtual ~MRCInterfaceRequestHandler() - { - delete _interface; - } - - // yield::concurrency::RequestHandler - virtual void handle( ::yield::concurrency::Request& request ) - { - // Switch on the request types that this interface handles, unwrap the corresponding requests and delegate to _interface - switch ( request.get_type_id() ) - { - case 2010031117UL: handle( static_cast( request ) ); return; - case 2010031118UL: handle( static_cast( request ) ); return; - case 2010031119UL: handle( static_cast( request ) ); return; - case 2010031120UL: handle( static_cast( request ) ); return; - case 2010031121UL: handle( static_cast( request ) ); return; - case 2010031122UL: handle( static_cast( request ) ); return; - case 2010031123UL: handle( static_cast( request ) ); return; - case 2010031124UL: handle( static_cast( request ) ); return; - case 2010031125UL: handle( static_cast( request ) ); return; - case 2010031126UL: handle( static_cast( request ) ); return; - case 2010031127UL: handle( static_cast( request ) ); return; - case 2010031128UL: handle( static_cast( request ) ); return; - case 2010031129UL: handle( static_cast( request ) ); return; - case 2010031130UL: handle( static_cast( request ) ); return; - case 2010031131UL: handle( static_cast( request ) ); return; - case 2010031132UL: handle( static_cast( request ) ); return; - case 2010031133UL: handle( static_cast( request ) ); return; - case 2010031134UL: handle( static_cast( request ) ); return; - case 2010031135UL: handle( static_cast( request ) ); return; - case 2010031146UL: handle( static_cast( request ) ); return; - case 2010031147UL: handle( static_cast( request ) ); return; - case 2010031148UL: handle( static_cast( request ) ); return; - case 2010031149UL: handle( static_cast( request ) ); return; - case 2010031150UL: handle( static_cast( request ) ); return; - case 2010031151UL: handle( static_cast( request ) ); return; - case 2010031152UL: handle( static_cast( request ) ); return; - case 2010031153UL: handle( static_cast( request ) ); return; - case 2010031154UL: handle( static_cast( request ) ); return; - case 2010031155UL: handle( static_cast( request ) ); return; - case 2010031156UL: handle( static_cast( request ) ); return; - case 2010031157UL: handle( static_cast( request ) ); return; - case 2010031158UL: handle( static_cast( request ) ); return; - case 2010031159UL: handle( static_cast( request ) ); return; - case 2010031160UL: handle( static_cast( request ) ); return; - } - } - - protected: - - virtual void handle( closeRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->close - ( - __request.get_client_vivaldi_coordinates(), - __request.get_write_xcap() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( fsetattrRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->fsetattr - ( - __request.get_stbuf(), - __request.get_to_set(), - __request.get_xcap() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( ftruncateRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::XCap truncate_xcap; - - _interface->ftruncate( __request.get_write_xcap(), truncate_xcap ); - - __request.respond( truncate_xcap ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( getattrRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::StatSet stbuf; - - _interface->getattr - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_known_etag(), - stbuf - ); - - __request.respond( stbuf ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( getxattrRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - string value; - - _interface->getxattr - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_name(), - value - ); - - __request.respond( value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( linkRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->link - ( - __request.get_volume_name(), - __request.get_target_path(), - __request.get_link_path() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( listxattrRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::StringSet names; - - _interface->listxattr - ( - __request.get_volume_name(), - __request.get_path(), - names - ); - - __request.respond( names ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( mkdirRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->mkdir - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_mode() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( openRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::FileCredentials file_credentials; - - _interface->open - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_flags(), - __request.get_mode(), - __request.get_attributes(), - __request.get_client_vivaldi_coordinates(), - file_credentials - ); - - __request.respond( file_credentials ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( readdirRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::DirectoryEntrySet directory_entries; - - _interface->readdir - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_known_etag(), - __request.get_limit_directory_entries_count(), - __request.get_names_only(), - __request.get_seen_directory_entries_count(), - directory_entries - ); - - __request.respond( directory_entries ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( readlinkRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - string link_target_path; - - _interface->readlink - ( - __request.get_volume_name(), - __request.get_path(), - link_target_path - ); - - __request.respond( link_target_path ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( removexattrRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->removexattr - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_name() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( renameRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::FileCredentialsSet file_credentials; - - _interface->rename - ( - __request.get_volume_name(), - __request.get_source_path(), - __request.get_target_path(), - file_credentials - ); - - __request.respond( file_credentials ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( rmdirRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->rmdir( __request.get_volume_name(), __request.get_path() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( setattrRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->setattr - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_stbuf(), - __request.get_to_set() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( setxattrRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->setxattr - ( - __request.get_volume_name(), - __request.get_path(), - __request.get_name(), - __request.get_value(), - __request.get_flags() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( statvfsRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::StatVFSSet stbuf; - - _interface->statvfs - ( - __request.get_volume_name(), - __request.get_known_etag(), - stbuf - ); - - __request.respond( stbuf ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( symlinkRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->symlink - ( - __request.get_volume_name(), - __request.get_target_path(), - __request.get_link_path() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( unlinkRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::FileCredentialsSet file_credentials; - - _interface->unlink - ( - __request.get_volume_name(), - __request.get_path(), - file_credentials - ); - - __request.respond( file_credentials ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_checkpointRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_checkpoint(); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_check_file_existsRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - string bitmap; - - _interface->xtreemfs_check_file_exists - ( - __request.get_volume_id(), - __request.get_file_ids(), - __request.get_osd_uuid(), - bitmap - ); - - __request.respond( bitmap ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_dump_databaseRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_dump_database( __request.get_dump_file() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_get_suitable_osdsRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::StringSet osd_uuids; - - _interface->xtreemfs_get_suitable_osds - ( - __request.get_file_id(), - __request.get_num_osds(), - osd_uuids - ); - - __request.respond( osd_uuids ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_internal_debugRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - string result; - - _interface->xtreemfs_internal_debug( __request.get_operation(), result ); - - __request.respond( result ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_lsvolRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::StatVFSSet volumes; - - _interface->xtreemfs_lsvol( volumes ); - - __request.respond( volumes ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_mkvolRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_mkvol( __request.get_volume() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_renew_capabilityRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::XCap renewed_xcap; - - _interface->xtreemfs_renew_capability - ( - __request.get_old_xcap(), - renewed_xcap - ); - - __request.respond( renewed_xcap ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_replica_addRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_replica_add - ( - __request.get_file_id(), - __request.get_new_replica() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_replica_listRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ReplicaSet replicas; - - _interface->xtreemfs_replica_list( __request.get_file_id(), replicas ); - - __request.respond( replicas ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_replica_removeRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::XCap delete_xcap; - - _interface->xtreemfs_replica_remove - ( - __request.get_file_id(), - __request.get_osd_uuid(), - delete_xcap - ); - - __request.respond( delete_xcap ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_restore_databaseRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_restore_database( __request.get_dump_file() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_restore_fileRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_restore_file - ( - __request.get_file_path(), - __request.get_file_id(), - __request.get_file_size(), - __request.get_osd_uuid(), - __request.get_stripe_size() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_rmvolRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_rmvol( __request.get_volume_name() ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_shutdownRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_shutdown(); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - private: - MRCInterface* _interface; - }; - - #define ORG_XTREEMFS_INTERFACES_MRCINTERFACE_REQUEST_HANDLER_PROTOTYPES \ - virtual void handle( closeRequest& __request );\ - virtual void handle( fsetattrRequest& __request );\ - virtual void handle( ftruncateRequest& __request );\ - virtual void handle( getattrRequest& __request );\ - virtual void handle( getxattrRequest& __request );\ - virtual void handle( linkRequest& __request );\ - virtual void handle( listxattrRequest& __request );\ - virtual void handle( mkdirRequest& __request );\ - virtual void handle( openRequest& __request );\ - virtual void handle( readdirRequest& __request );\ - virtual void handle( readlinkRequest& __request );\ - virtual void handle( removexattrRequest& __request );\ - virtual void handle( renameRequest& __request );\ - virtual void handle( rmdirRequest& __request );\ - virtual void handle( setattrRequest& __request );\ - virtual void handle( setxattrRequest& __request );\ - virtual void handle( statvfsRequest& __request );\ - virtual void handle( symlinkRequest& __request );\ - virtual void handle( unlinkRequest& __request );\ - virtual void handle( xtreemfs_checkpointRequest& __request );\ - virtual void handle( xtreemfs_check_file_existsRequest& __request );\ - virtual void handle( xtreemfs_dump_databaseRequest& __request );\ - virtual void handle( xtreemfs_get_suitable_osdsRequest& __request );\ - virtual void handle( xtreemfs_internal_debugRequest& __request );\ - virtual void handle( xtreemfs_lsvolRequest& __request );\ - virtual void handle( xtreemfs_mkvolRequest& __request );\ - virtual void handle( xtreemfs_renew_capabilityRequest& __request );\ - virtual void handle( xtreemfs_replica_addRequest& __request );\ - virtual void handle( xtreemfs_replica_listRequest& __request );\ - virtual void handle( xtreemfs_replica_removeRequest& __request );\ - virtual void handle( xtreemfs_restore_databaseRequest& __request );\ - virtual void handle( xtreemfs_restore_fileRequest& __request );\ - virtual void handle( xtreemfs_rmvolRequest& __request );\ - virtual void handle( xtreemfs_shutdownRequest& __request ); - - - class MRCInterfaceProxy - : public MRCInterface, - public ::yield::concurrency::RequestHandler, - private MRCInterfaceMessages - { - public: - MRCInterfaceProxy( ::yield::concurrency::EventHandler& request_handler ) - : __request_handler( request_handler ) - { } - - ~MRCInterfaceProxy() - { - ::yield::concurrency::EventHandler::dec_ref( __request_handler ); - } - - // yidl::runtime::RTTIObject - virtual const char* get_type_name() const - { - return "MRCInterfaceProxy"; - } - - // yield::concurrency::RequestHandler - virtual void handle( ::yield::concurrency::Request& request ) - { - __request_handler.handle( request ); - } - - // MRCInterface - virtual void - close - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates, - const org::xtreemfs::interfaces::XCap& write_xcap - ) - { - closeRequest* __request = new closeRequest( client_vivaldi_coordinates, write_xcap ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - fsetattr - ( - const org::xtreemfs::interfaces::Stat& stbuf, - uint32_t to_set, - const org::xtreemfs::interfaces::XCap& xcap - ) - { - fsetattrRequest* __request = new fsetattrRequest( stbuf, to_set, xcap ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - ftruncate - ( - const org::xtreemfs::interfaces::XCap& write_xcap, - org::xtreemfs::interfaces::XCap& truncate_xcap - ) - { - ftruncateRequest* __request = new ftruncateRequest( write_xcap ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - truncate_xcap = __response->get_truncate_xcap(); - } - - virtual void - getattr - ( - const string& volume_name, - const string& path, - uint64_t known_etag, - org::xtreemfs::interfaces::StatSet& stbuf - ) - { - getattrRequest* __request = new getattrRequest( volume_name, path, known_etag ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - stbuf = __response->get_stbuf(); - } - - virtual void - getxattr - ( - const string& volume_name, - const string& path, - const string& name, - string& value - ) - { - getxattrRequest* __request = new getxattrRequest( volume_name, path, name ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - value = __response->get_value(); - } - - virtual void - link - ( - const string& volume_name, - const string& target_path, - const string& link_path - ) - { - linkRequest* __request = new linkRequest( volume_name, target_path, link_path ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - listxattr - ( - const string& volume_name, - const string& path, - org::xtreemfs::interfaces::StringSet& names - ) - { - listxattrRequest* __request = new listxattrRequest( volume_name, path ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - names = __response->get_names(); - } - - virtual void - mkdir - ( - const string& volume_name, - const string& path, - uint32_t mode - ) - { - mkdirRequest* __request = new mkdirRequest( volume_name, path, mode ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - open - ( - const string& volume_name, - const string& path, - uint32_t flags, - uint32_t mode, - uint32_t attributes, - const org::xtreemfs::interfaces::VivaldiCoordinates& client_vivaldi_coordinates, - org::xtreemfs::interfaces::FileCredentials& file_credentials - ) - { - openRequest* __request = new openRequest( volume_name, path, flags, mode, attributes, client_vivaldi_coordinates ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - file_credentials = __response->get_file_credentials(); - } - - virtual void - readdir - ( - const string& volume_name, - const string& path, - uint64_t known_etag, - uint16_t limit_directory_entries_count, - bool names_only, - uint64_t seen_directory_entries_count, - org::xtreemfs::interfaces::DirectoryEntrySet& directory_entries - ) - { - readdirRequest* __request = new readdirRequest( volume_name, path, known_etag, limit_directory_entries_count, names_only, seen_directory_entries_count ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - directory_entries = __response->get_directory_entries(); - } - - virtual void - readlink - ( - const string& volume_name, - const string& path, - string& link_target_path - ) - { - readlinkRequest* __request = new readlinkRequest( volume_name, path ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - link_target_path = __response->get_link_target_path(); - } - - virtual void - removexattr - ( - const string& volume_name, - const string& path, - const string& name - ) - { - removexattrRequest* __request = new removexattrRequest( volume_name, path, name ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - rename - ( - const string& volume_name, - const string& source_path, - const string& target_path, - org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - { - renameRequest* __request = new renameRequest( volume_name, source_path, target_path ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - file_credentials = __response->get_file_credentials(); - } - - virtual void rmdir( const string& volume_name, const string& path ) - { - rmdirRequest* __request = new rmdirRequest( volume_name, path ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - setattr - ( - const string& volume_name, - const string& path, - const org::xtreemfs::interfaces::Stat& stbuf, - uint32_t to_set - ) - { - setattrRequest* __request = new setattrRequest( volume_name, path, stbuf, to_set ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - setxattr - ( - const string& volume_name, - const string& path, - const string& name, - const string& value, - int32_t flags - ) - { - setxattrRequest* __request = new setxattrRequest( volume_name, path, name, value, flags ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - statvfs - ( - const string& volume_name, - uint64_t known_etag, - org::xtreemfs::interfaces::StatVFSSet& stbuf - ) - { - statvfsRequest* __request = new statvfsRequest( volume_name, known_etag ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - stbuf = __response->get_stbuf(); - } - - virtual void - symlink - ( - const string& volume_name, - const string& target_path, - const string& link_path - ) - { - symlinkRequest* __request = new symlinkRequest( volume_name, target_path, link_path ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - unlink - ( - const string& volume_name, - const string& path, - org::xtreemfs::interfaces::FileCredentialsSet& file_credentials - ) - { - unlinkRequest* __request = new unlinkRequest( volume_name, path ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - file_credentials = __response->get_file_credentials(); - } - - virtual void xtreemfs_checkpoint() - { - xtreemfs_checkpointRequest* __request = new xtreemfs_checkpointRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_check_file_exists - ( - const string& volume_id, - const org::xtreemfs::interfaces::StringSet& file_ids, - const string& osd_uuid, - string& bitmap - ) - { - xtreemfs_check_file_existsRequest* __request = new xtreemfs_check_file_existsRequest( volume_id, file_ids, osd_uuid ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - bitmap = __response->get_bitmap(); - } - - virtual void xtreemfs_dump_database( const string& dump_file ) - { - xtreemfs_dump_databaseRequest* __request = new xtreemfs_dump_databaseRequest( dump_file ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_get_suitable_osds - ( - const string& file_id, - uint32_t num_osds, - org::xtreemfs::interfaces::StringSet& osd_uuids - ) - { - xtreemfs_get_suitable_osdsRequest* __request = new xtreemfs_get_suitable_osdsRequest( file_id, num_osds ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - osd_uuids = __response->get_osd_uuids(); - } - - virtual void xtreemfs_internal_debug( const string& operation, string& result ) - { - xtreemfs_internal_debugRequest* __request = new xtreemfs_internal_debugRequest( operation ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - result = __response->get_result(); - } - - virtual void xtreemfs_lsvol( org::xtreemfs::interfaces::StatVFSSet& volumes ) - { - xtreemfs_lsvolRequest* __request = new xtreemfs_lsvolRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - volumes = __response->get_volumes(); - } - - virtual void xtreemfs_mkvol( const org::xtreemfs::interfaces::StatVFS& volume ) - { - xtreemfs_mkvolRequest* __request = new xtreemfs_mkvolRequest( volume ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_renew_capability - ( - const org::xtreemfs::interfaces::XCap& old_xcap, - org::xtreemfs::interfaces::XCap& renewed_xcap - ) - { - xtreemfs_renew_capabilityRequest* __request = new xtreemfs_renew_capabilityRequest( old_xcap ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - renewed_xcap = __response->get_renewed_xcap(); - } - - virtual void - xtreemfs_replica_add - ( - const string& file_id, - const org::xtreemfs::interfaces::Replica& new_replica - ) - { - xtreemfs_replica_addRequest* __request = new xtreemfs_replica_addRequest( file_id, new_replica ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_replica_list - ( - const string& file_id, - org::xtreemfs::interfaces::ReplicaSet& replicas - ) - { - xtreemfs_replica_listRequest* __request = new xtreemfs_replica_listRequest( file_id ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - replicas = __response->get_replicas(); - } - - virtual void - xtreemfs_replica_remove - ( - const string& file_id, - const string& osd_uuid, - org::xtreemfs::interfaces::XCap& delete_xcap - ) - { - xtreemfs_replica_removeRequest* __request = new xtreemfs_replica_removeRequest( file_id, osd_uuid ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - delete_xcap = __response->get_delete_xcap(); - } - - virtual void xtreemfs_restore_database( const string& dump_file ) - { - xtreemfs_restore_databaseRequest* __request = new xtreemfs_restore_databaseRequest( dump_file ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_restore_file - ( - const string& file_path, - const string& file_id, - uint64_t file_size, - const string& osd_uuid, - int32_t stripe_size - ) - { - xtreemfs_restore_fileRequest* __request = new xtreemfs_restore_fileRequest( file_path, file_id, file_size, osd_uuid, stripe_size ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void xtreemfs_rmvol( const string& volume_name ) - { - xtreemfs_rmvolRequest* __request = new xtreemfs_rmvolRequest( volume_name ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void xtreemfs_shutdown() - { - xtreemfs_shutdownRequest* __request = new xtreemfs_shutdownRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - private: - // __request_handler is not a counted reference, since that would create - // a reference cycle when __request_handler is a subclass of MRCInterfaceProxy - ::yield::concurrency::EventHandler& __request_handler; - };}; - }; -}; -#endif diff --git a/include/xtreemfs/interfaces/mrc_osd_types.h b/include/xtreemfs/interfaces/mrc_osd_types.h deleted file mode 100644 index 3a1ac440262d4c8d3da305f5b3b1d6df7042baca..0000000000000000000000000000000000000000 --- a/include/xtreemfs/interfaces/mrc_osd_types.h +++ /dev/null @@ -1,733 +0,0 @@ -#ifndef _1052962945_H_ -#define _1052962945_H_ - - -#include "types.h" -#include "yidl.h" - - -namespace org -{ - namespace xtreemfs - { - namespace interfaces - { - enum AccessControlPolicyType { ACCESS_CONTROL_POLICY_NULL = 1, ACCESS_CONTROL_POLICY_POSIX = 2, ACCESS_CONTROL_POLICY_VOLUME = 3 }; - enum OSDSelectionPolicyType { OSD_SELECTION_POLICY_FILTER_DEFAULT = 1000, OSD_SELECTION_POLICY_FILTER_FQDN = 1001, OSD_SELECTION_POLICY_FILTER_UUID = 1002, OSD_SELECTION_POLICY_GROUP_DCMAP = 2000, OSD_SELECTION_POLICY_GROUP_FQDN = 2001, OSD_SELECTION_POLICY_SORT_DCMAP = 3000, OSD_SELECTION_POLICY_SORT_FQDN = 3001, OSD_SELECTION_POLICY_SORT_RANDOM = 3002, OSD_SELECTION_POLICY_SORT_VIVALDI = 3003 }; - enum ReplicaSelectionPolicyType { REPLICA_SELECTION_POLICY_SIMPLE = 1 }; - enum SnapConfig { SNAP_CONFIG_SNAPS_DISABLED = 0, SNAP_CONFIG_ACCESS_CURRENT = 1, SNAP_CONFIG_ACCESS_SNAP = 2 }; - enum StripingPolicyType { STRIPING_POLICY_RAID0 = 0 }; - - - class NewFileSize : public ::yidl::runtime::Struct - { - public: - NewFileSize() - : size_in_bytes( 0 ), truncate_epoch( 0 ) - { } - - NewFileSize( uint64_t size_in_bytes, uint32_t truncate_epoch ) - : size_in_bytes( size_in_bytes ), truncate_epoch( truncate_epoch ) - { } - - NewFileSize( const NewFileSize& other ) - : size_in_bytes( other.get_size_in_bytes() ), - truncate_epoch( other.get_truncate_epoch() ) - { } - - virtual ~NewFileSize() { } - - uint64_t get_size_in_bytes() const { return size_in_bytes; } - uint32_t get_truncate_epoch() const { return truncate_epoch; } - void set_size_in_bytes( uint64_t size_in_bytes ) { this->size_in_bytes = size_in_bytes; } - void set_truncate_epoch( uint32_t truncate_epoch ) { this->truncate_epoch = truncate_epoch; } - - bool operator==( const NewFileSize& other ) const - { - return get_size_in_bytes() == other.get_size_in_bytes() - && - get_truncate_epoch() == other.get_truncate_epoch(); - } - - // yidl::runtime::Object - NewFileSize& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030927 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "NewFileSize"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "size_in_bytes", 0 ), get_size_in_bytes() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "truncate_epoch", 0 ), get_truncate_epoch() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "size_in_bytes", 0 ), size_in_bytes ); - truncate_epoch = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "truncate_epoch", 0 ) ); - } - - protected: - uint64_t size_in_bytes; - uint32_t truncate_epoch; - }; - - class NewFileSizeSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - NewFileSizeSet() { } - NewFileSizeSet( const org::xtreemfs::interfaces::NewFileSize& first_value ) { vector::push_back( first_value ); } - NewFileSizeSet( size_type size ) : vector( size ) { } - virtual ~NewFileSizeSet() { } - - // yidl::runtime::Object - NewFileSizeSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030928 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "NewFileSizeSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::NewFileSize value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class OSDWriteResponse : public ::yidl::runtime::Struct - { - public: - OSDWriteResponse() { } - - OSDWriteResponse - ( - const org::xtreemfs::interfaces::NewFileSizeSet& new_file_size - ) - : new_file_size( new_file_size ) - { } - - OSDWriteResponse( const OSDWriteResponse& other ) - : new_file_size( other.get_new_file_size() ) - { } - - virtual ~OSDWriteResponse() { } - - const org::xtreemfs::interfaces::NewFileSizeSet& get_new_file_size() const { return new_file_size; } - void set_new_file_size( const org::xtreemfs::interfaces::NewFileSizeSet& new_file_size ) { this->new_file_size = new_file_size; } - - bool operator==( const OSDWriteResponse& other ) const - { - return get_new_file_size() == other.get_new_file_size(); - } - - // yidl::runtime::Object - OSDWriteResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030933 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "OSDWriteResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "new_file_size", 0 ), get_new_file_size() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "new_file_size", 0 ), new_file_size ); - } - - protected: - org::xtreemfs::interfaces::NewFileSizeSet new_file_size; - }; - - class StripingPolicy : public ::yidl::runtime::Struct - { - public: - StripingPolicy() - : type( STRIPING_POLICY_RAID0 ), stripe_size( 0 ), width( 0 ) - { } - - StripingPolicy - ( - org::xtreemfs::interfaces::StripingPolicyType type, - uint32_t stripe_size, - uint32_t width - ) - : type( type ), stripe_size( stripe_size ), width( width ) - { } - - StripingPolicy( const StripingPolicy& other ) - : type( other.get_type() ), - stripe_size( other.get_stripe_size() ), - width( other.get_width() ) - { } - - virtual ~StripingPolicy() { } - - org::xtreemfs::interfaces::StripingPolicyType get_type() const { return type; } - uint32_t get_stripe_size() const { return stripe_size; } - uint32_t get_width() const { return width; } - void set_type( org::xtreemfs::interfaces::StripingPolicyType type ) { this->type = type; } - void set_stripe_size( uint32_t stripe_size ) { this->stripe_size = stripe_size; } - void set_width( uint32_t width ) { this->width = width; } - - bool operator==( const StripingPolicy& other ) const - { - return get_type() == other.get_type() - && - get_stripe_size() == other.get_stripe_size() - && - get_width() == other.get_width(); - } - - // yidl::runtime::Object - StripingPolicy& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030935 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "StripingPolicy"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "type", 0 ), static_cast( get_type() ) ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stripe_size", 0 ), get_stripe_size() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "width", 0 ), get_width() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - type = static_cast( unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "type", 0 ) ) ); - stripe_size = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stripe_size", 0 ) ); - width = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "width", 0 ) ); - } - - protected: - org::xtreemfs::interfaces::StripingPolicyType type; - uint32_t stripe_size; - uint32_t width; - }; - - class Replica : public ::yidl::runtime::Struct - { - public: - Replica() - : replication_flags( 0 ) - { } - - Replica - ( - const org::xtreemfs::interfaces::StringSet& osd_uuids, - uint32_t replication_flags, - const org::xtreemfs::interfaces::StripingPolicy& striping_policy - ) - : osd_uuids( osd_uuids ), - replication_flags( replication_flags ), - striping_policy( striping_policy ) - { } - - Replica( const Replica& other ) - : osd_uuids( other.get_osd_uuids() ), - replication_flags( other.get_replication_flags() ), - striping_policy( other.get_striping_policy() ) - { } - - virtual ~Replica() { } - - const org::xtreemfs::interfaces::StringSet& get_osd_uuids() const { return osd_uuids; } - uint32_t get_replication_flags() const { return replication_flags; } - const org::xtreemfs::interfaces::StripingPolicy& get_striping_policy() const { return striping_policy; } - void set_osd_uuids( const org::xtreemfs::interfaces::StringSet& osd_uuids ) { this->osd_uuids = osd_uuids; } - void set_replication_flags( uint32_t replication_flags ) { this->replication_flags = replication_flags; } - void set_striping_policy( const org::xtreemfs::interfaces::StripingPolicy& striping_policy ) { this->striping_policy = striping_policy; } - - bool operator==( const Replica& other ) const - { - return get_osd_uuids() == other.get_osd_uuids() - && - get_replication_flags() == other.get_replication_flags() - && - get_striping_policy() == other.get_striping_policy(); - } - - // yidl::runtime::Object - Replica& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030936 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "Replica"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_uuids", 0 ), get_osd_uuids() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "replication_flags", 0 ), get_replication_flags() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "striping_policy", 0 ), get_striping_policy() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_uuids", 0 ), osd_uuids ); - replication_flags = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "replication_flags", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "striping_policy", 0 ), striping_policy ); - } - - protected: - org::xtreemfs::interfaces::StringSet osd_uuids; - uint32_t replication_flags; - org::xtreemfs::interfaces::StripingPolicy striping_policy; - }; - - class ReplicaSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - ReplicaSet() { } - ReplicaSet( const org::xtreemfs::interfaces::Replica& first_value ) { vector::push_back( first_value ); } - ReplicaSet( size_type size ) : vector( size ) { } - virtual ~ReplicaSet() { } - - // yidl::runtime::Object - ReplicaSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030937 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ReplicaSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::Replica value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class VivaldiCoordinates : public ::yidl::runtime::Struct - { - public: - VivaldiCoordinates() - : x_coordinate( 0 ), y_coordinate( 0 ), local_error( 0 ) - { } - - VivaldiCoordinates - ( - double x_coordinate, - double y_coordinate, - double local_error - ) - : x_coordinate( x_coordinate ), - y_coordinate( y_coordinate ), - local_error( local_error ) - { } - - VivaldiCoordinates( const VivaldiCoordinates& other ) - : x_coordinate( other.get_x_coordinate() ), - y_coordinate( other.get_y_coordinate() ), - local_error( other.get_local_error() ) - { } - - virtual ~VivaldiCoordinates() { } - - double get_x_coordinate() const { return x_coordinate; } - double get_y_coordinate() const { return y_coordinate; } - double get_local_error() const { return local_error; } - void set_x_coordinate( double x_coordinate ) { this->x_coordinate = x_coordinate; } - void set_y_coordinate( double y_coordinate ) { this->y_coordinate = y_coordinate; } - void set_local_error( double local_error ) { this->local_error = local_error; } - - bool operator==( const VivaldiCoordinates& other ) const - { - return get_x_coordinate() == other.get_x_coordinate() - && - get_y_coordinate() == other.get_y_coordinate() - && - get_local_error() == other.get_local_error(); - } - - // yidl::runtime::Object - VivaldiCoordinates& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030938 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "VivaldiCoordinates"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "x_coordinate", 0 ), get_x_coordinate() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "y_coordinate", 0 ), get_y_coordinate() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "local_error", 0 ), get_local_error() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "x_coordinate", 0 ), x_coordinate ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "y_coordinate", 0 ), y_coordinate ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "local_error", 0 ), local_error ); - } - - protected: - double x_coordinate; - double y_coordinate; - double local_error; - }; - - class XCap : public ::yidl::runtime::Struct - { - public: - XCap() - : access_mode( 0 ), - expire_time_s( 0 ), - expire_timeout_s( 0 ), - replicate_on_close( false ), - truncate_epoch( 0 ), - snap_config( SNAP_CONFIG_SNAPS_DISABLED ), - snap_timestamp( 0 ) - { } - - XCap - ( - uint32_t access_mode, - const string& client_identity, - uint64_t expire_time_s, - uint32_t expire_timeout_s, - const string& file_id, - bool replicate_on_close, - const string& server_signature, - uint32_t truncate_epoch, - org::xtreemfs::interfaces::SnapConfig snap_config, - uint64_t snap_timestamp - ) - : access_mode( access_mode ), - client_identity( client_identity ), - expire_time_s( expire_time_s ), - expire_timeout_s( expire_timeout_s ), - file_id( file_id ), - replicate_on_close( replicate_on_close ), - server_signature( server_signature ), - truncate_epoch( truncate_epoch ), - snap_config( snap_config ), - snap_timestamp( snap_timestamp ) - { } - - XCap( const XCap& other ) - : access_mode( other.get_access_mode() ), - client_identity( other.get_client_identity() ), - expire_time_s( other.get_expire_time_s() ), - expire_timeout_s( other.get_expire_timeout_s() ), - file_id( other.get_file_id() ), - replicate_on_close( other.get_replicate_on_close() ), - server_signature( other.get_server_signature() ), - truncate_epoch( other.get_truncate_epoch() ), - snap_config( other.get_snap_config() ), - snap_timestamp( other.get_snap_timestamp() ) - { } - - virtual ~XCap() { } - - uint32_t get_access_mode() const { return access_mode; } - const string& get_client_identity() const { return client_identity; } - uint64_t get_expire_time_s() const { return expire_time_s; } - uint32_t get_expire_timeout_s() const { return expire_timeout_s; } - const string& get_file_id() const { return file_id; } - bool get_replicate_on_close() const { return replicate_on_close; } - const string& get_server_signature() const { return server_signature; } - uint32_t get_truncate_epoch() const { return truncate_epoch; } - org::xtreemfs::interfaces::SnapConfig get_snap_config() const { return snap_config; } - uint64_t get_snap_timestamp() const { return snap_timestamp; } - void set_access_mode( uint32_t access_mode ) { this->access_mode = access_mode; } - void set_client_identity( const string& client_identity ) { this->client_identity = client_identity; } - void set_expire_time_s( uint64_t expire_time_s ) { this->expire_time_s = expire_time_s; } - void set_expire_timeout_s( uint32_t expire_timeout_s ) { this->expire_timeout_s = expire_timeout_s; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_replicate_on_close( bool replicate_on_close ) { this->replicate_on_close = replicate_on_close; } - void set_server_signature( const string& server_signature ) { this->server_signature = server_signature; } - void set_truncate_epoch( uint32_t truncate_epoch ) { this->truncate_epoch = truncate_epoch; } - void set_snap_config( org::xtreemfs::interfaces::SnapConfig snap_config ) { this->snap_config = snap_config; } - void set_snap_timestamp( uint64_t snap_timestamp ) { this->snap_timestamp = snap_timestamp; } - - bool operator==( const XCap& other ) const - { - return get_access_mode() == other.get_access_mode() - && - get_client_identity() == other.get_client_identity() - && - get_expire_time_s() == other.get_expire_time_s() - && - get_expire_timeout_s() == other.get_expire_timeout_s() - && - get_file_id() == other.get_file_id() - && - get_replicate_on_close() == other.get_replicate_on_close() - && - get_server_signature() == other.get_server_signature() - && - get_truncate_epoch() == other.get_truncate_epoch() - && - get_snap_config() == other.get_snap_config() - && - get_snap_timestamp() == other.get_snap_timestamp(); - } - - // yidl::runtime::Object - XCap& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030939 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "XCap"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "access_mode", 0 ), get_access_mode() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_identity", 0 ), get_client_identity() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "expire_time_s", 0 ), get_expire_time_s() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "expire_timeout_s", 0 ), get_expire_timeout_s() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "replicate_on_close", 0 ), get_replicate_on_close() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "server_signature", 0 ), get_server_signature() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "truncate_epoch", 0 ), get_truncate_epoch() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "snap_config", 0 ), static_cast( get_snap_config() ) ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "snap_timestamp", 0 ), get_snap_timestamp() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - access_mode = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "access_mode", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_identity", 0 ), client_identity ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "expire_time_s", 0 ), expire_time_s ); - expire_timeout_s = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "expire_timeout_s", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - replicate_on_close = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "replicate_on_close", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "server_signature", 0 ), server_signature ); - truncate_epoch = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "truncate_epoch", 0 ) ); - snap_config = static_cast( unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "snap_config", 0 ) ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "snap_timestamp", 0 ), snap_timestamp ); - } - - protected: - uint32_t access_mode; - string client_identity; - uint64_t expire_time_s; - uint32_t expire_timeout_s; - string file_id; - bool replicate_on_close; - string server_signature; - uint32_t truncate_epoch; - org::xtreemfs::interfaces::SnapConfig snap_config; - uint64_t snap_timestamp; - }; - - class XLocSet : public ::yidl::runtime::Struct - { - public: - XLocSet() - : read_only_file_size( 0 ), version( 0 ) - { } - - XLocSet - ( - uint64_t read_only_file_size, - const org::xtreemfs::interfaces::ReplicaSet& replicas, - const string& replica_update_policy, - uint32_t version - ) - : read_only_file_size( read_only_file_size ), - replicas( replicas ), - replica_update_policy( replica_update_policy ), - version( version ) - { } - - XLocSet( const XLocSet& other ) - : read_only_file_size( other.get_read_only_file_size() ), - replicas( other.get_replicas() ), - replica_update_policy( other.get_replica_update_policy() ), - version( other.get_version() ) - { } - - virtual ~XLocSet() { } - - uint64_t get_read_only_file_size() const { return read_only_file_size; } - const org::xtreemfs::interfaces::ReplicaSet& get_replicas() const { return replicas; } - const string& get_replica_update_policy() const { return replica_update_policy; } - uint32_t get_version() const { return version; } - void set_read_only_file_size( uint64_t read_only_file_size ) { this->read_only_file_size = read_only_file_size; } - void set_replicas( const org::xtreemfs::interfaces::ReplicaSet& replicas ) { this->replicas = replicas; } - void set_replica_update_policy( const string& replica_update_policy ) { this->replica_update_policy = replica_update_policy; } - void set_version( uint32_t version ) { this->version = version; } - - bool operator==( const XLocSet& other ) const - { - return get_read_only_file_size() == other.get_read_only_file_size() - && - get_replicas() == other.get_replicas() - && - get_replica_update_policy() == other.get_replica_update_policy() - && - get_version() == other.get_version(); - } - - // yidl::runtime::Object - XLocSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030940 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "XLocSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "read_only_file_size", 0 ), get_read_only_file_size() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "replicas", 0 ), get_replicas() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "replica_update_policy", 0 ), get_replica_update_policy() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "version", 0 ), get_version() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "read_only_file_size", 0 ), read_only_file_size ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "replicas", 0 ), replicas ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "replica_update_policy", 0 ), replica_update_policy ); - version = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "version", 0 ) ); - } - - protected: - uint64_t read_only_file_size; - org::xtreemfs::interfaces::ReplicaSet replicas; - string replica_update_policy; - uint32_t version; - }; - - class FileCredentials : public ::yidl::runtime::Struct - { - public: - FileCredentials() { } - - FileCredentials - ( - const org::xtreemfs::interfaces::XCap& xcap, - const org::xtreemfs::interfaces::XLocSet& xlocs - ) - : xcap( xcap ), xlocs( xlocs ) - { } - - FileCredentials( const FileCredentials& other ) - : xcap( other.get_xcap() ), - xlocs( other.get_xlocs() ) - { } - - virtual ~FileCredentials() { } - - const org::xtreemfs::interfaces::XCap& get_xcap() const { return xcap; } - const org::xtreemfs::interfaces::XLocSet& get_xlocs() const { return xlocs; } - void set_xcap( const org::xtreemfs::interfaces::XCap& xcap ) { this->xcap = xcap; } - void set_xlocs( const org::xtreemfs::interfaces::XLocSet& xlocs ) { this->xlocs = xlocs; } - - bool operator==( const FileCredentials& other ) const - { - return get_xcap() == other.get_xcap() - && - get_xlocs() == other.get_xlocs(); - } - - // yidl::runtime::Object - FileCredentials& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030941 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "FileCredentials"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "xcap", 0 ), get_xcap() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "xlocs", 0 ), get_xlocs() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "xcap", 0 ), xcap ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "xlocs", 0 ), xlocs ); - } - - protected: - org::xtreemfs::interfaces::XCap xcap; - org::xtreemfs::interfaces::XLocSet xlocs; - }; - - class FileCredentialsSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - FileCredentialsSet() { } - FileCredentialsSet( const org::xtreemfs::interfaces::FileCredentials& first_value ) { vector::push_back( first_value ); } - FileCredentialsSet( size_type size ) : vector( size ) { } - virtual ~FileCredentialsSet() { } - - // yidl::runtime::Object - FileCredentialsSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030942 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "FileCredentialsSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::FileCredentials value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - }; - }; -}; -#endif diff --git a/include/xtreemfs/interfaces/osd_interface.h b/include/xtreemfs/interfaces/osd_interface.h deleted file mode 100644 index 0c7eb786aa53922e8ac38951f42915c636fbc4c7..0000000000000000000000000000000000000000 --- a/include/xtreemfs/interfaces/osd_interface.h +++ /dev/null @@ -1,6515 +0,0 @@ -#ifndef _1185009465_H_ -#define _1185009465_H_ - - -#include "constants.h" -#include "mrc_osd_types.h" -#include "yield/concurrency.h" -#include "yidl.h" - - -namespace org -{ - namespace xtreemfs - { - namespace interfaces - { - - class InternalGmax : public ::yidl::runtime::Struct - { - public: - InternalGmax() - : epoch( 0 ), file_size( 0 ), last_object_id( 0 ) - { } - - InternalGmax( uint64_t epoch, uint64_t file_size, uint64_t last_object_id ) - : epoch( epoch ), file_size( file_size ), last_object_id( last_object_id ) - { } - - InternalGmax( const InternalGmax& other ) - : epoch( other.get_epoch() ), - file_size( other.get_file_size() ), - last_object_id( other.get_last_object_id() ) - { } - - virtual ~InternalGmax() { } - - uint64_t get_epoch() const { return epoch; } - uint64_t get_file_size() const { return file_size; } - uint64_t get_last_object_id() const { return last_object_id; } - void set_epoch( uint64_t epoch ) { this->epoch = epoch; } - void set_file_size( uint64_t file_size ) { this->file_size = file_size; } - void set_last_object_id( uint64_t last_object_id ) { this->last_object_id = last_object_id; } - - bool operator==( const InternalGmax& other ) const - { - return get_epoch() == other.get_epoch() - && - get_file_size() == other.get_file_size() - && - get_last_object_id() == other.get_last_object_id(); - } - - // yidl::runtime::Object - InternalGmax& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030966 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "InternalGmax"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "epoch", 0 ), get_epoch() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_size", 0 ), get_file_size() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "last_object_id", 0 ), get_last_object_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "epoch", 0 ), epoch ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_size", 0 ), file_size ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "last_object_id", 0 ), last_object_id ); - } - - protected: - uint64_t epoch; - uint64_t file_size; - uint64_t last_object_id; - }; - - class Lock : public ::yidl::runtime::Struct - { - public: - Lock() - : client_pid( 0 ), length( 0 ), offset( 0 ) - { } - - Lock - ( - uint32_t client_pid, - const string& client_uuid, - uint64_t length, - uint64_t offset - ) - : client_pid( client_pid ), - client_uuid( client_uuid ), - length( length ), - offset( offset ) - { } - - Lock( const Lock& other ) - : client_pid( other.get_client_pid() ), - client_uuid( other.get_client_uuid() ), - length( other.get_length() ), - offset( other.get_offset() ) - { } - - virtual ~Lock() { } - - uint32_t get_client_pid() const { return client_pid; } - const string& get_client_uuid() const { return client_uuid; } - uint64_t get_length() const { return length; } - uint64_t get_offset() const { return offset; } - void set_client_pid( uint32_t client_pid ) { this->client_pid = client_pid; } - void set_client_uuid( const string& client_uuid ) { this->client_uuid = client_uuid; } - void set_length( uint64_t length ) { this->length = length; } - void set_offset( uint64_t offset ) { this->offset = offset; } - - bool operator==( const Lock& other ) const - { - return get_client_pid() == other.get_client_pid() - && - get_client_uuid() == other.get_client_uuid() - && - get_length() == other.get_length() - && - get_offset() == other.get_offset(); - } - - // yidl::runtime::Object - Lock& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030970 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "Lock"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_pid", 0 ), get_client_pid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_uuid", 0 ), get_client_uuid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "length", 0 ), get_length() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "offset", 0 ), get_offset() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - client_pid = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_pid", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_uuid", 0 ), client_uuid ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "length", 0 ), length ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "offset", 0 ), offset ); - } - - protected: - uint32_t client_pid; - string client_uuid; - uint64_t length; - uint64_t offset; - }; - - class ObjectData : public ::yidl::runtime::Struct - { - public: - ObjectData() - : checksum( 0 ), - invalid_checksum_on_osd( false ), - zero_padding( 0 ), - data( NULL ) - { } - - ObjectData - ( - uint32_t checksum, - bool invalid_checksum_on_osd, - uint32_t zero_padding, - ::yidl::runtime::Buffer* data - ) - : checksum( checksum ), - invalid_checksum_on_osd( invalid_checksum_on_osd ), - zero_padding( zero_padding ), - data( ::yidl::runtime::Object::inc_ref( data ) ) - { } - - ObjectData( const ObjectData& other ) - : checksum( other.get_checksum() ), - invalid_checksum_on_osd( other.get_invalid_checksum_on_osd() ), - zero_padding( other.get_zero_padding() ), - data( ::yidl::runtime::Object::inc_ref( other.get_data() ) ) - { } - - virtual ~ObjectData() { ::yidl::runtime::Buffer::dec_ref( data ); } - - uint32_t get_checksum() const { return checksum; } - bool get_invalid_checksum_on_osd() const { return invalid_checksum_on_osd; } - uint32_t get_zero_padding() const { return zero_padding; } - ::yidl::runtime::Buffer* get_data() const { return data; } - void set_checksum( uint32_t checksum ) { this->checksum = checksum; } - void set_invalid_checksum_on_osd( bool invalid_checksum_on_osd ) { this->invalid_checksum_on_osd = invalid_checksum_on_osd; } - void set_zero_padding( uint32_t zero_padding ) { this->zero_padding = zero_padding; } - void set_data( ::yidl::runtime::Buffer* data ) { ::yidl::runtime::Buffer::dec_ref( this->data ); this->data = ::yidl::runtime::Object::inc_ref( data ); } - - bool operator==( const ObjectData& other ) const - { - return get_checksum() == other.get_checksum() - && - get_invalid_checksum_on_osd() == other.get_invalid_checksum_on_osd() - && - get_zero_padding() == other.get_zero_padding() - && - get_data() == other.get_data(); - } - - // yidl::runtime::Object - ObjectData& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030967 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ObjectData"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "checksum", 0 ), get_checksum() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "invalid_checksum_on_osd", 0 ), get_invalid_checksum_on_osd() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "zero_padding", 0 ), get_zero_padding() ); - if ( get_data() != NULL ) marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "data", 0 ), *get_data() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - checksum = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "checksum", 0 ) ); - invalid_checksum_on_osd = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "invalid_checksum_on_osd", 0 ) ); - zero_padding = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "zero_padding", 0 ) ); - if ( data != NULL ) unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "data", 0 ), *data ); else data = unmarshaller.read_buffer( ::yidl::runtime::Unmarshaller::StringLiteralKey( "data", 0 ) ); - } - - protected: - uint32_t checksum; - bool invalid_checksum_on_osd; - uint32_t zero_padding; - ::yidl::runtime::Buffer* data; - }; - - class ObjectList : public ::yidl::runtime::Struct - { - public: - ObjectList() - : set( NULL ), stripe_width( 0 ), first_( 0 ) - { } - - ObjectList - ( - ::yidl::runtime::Buffer* set, - uint32_t stripe_width, - uint32_t first_ - ) - : set( ::yidl::runtime::Object::inc_ref( set ) ), - stripe_width( stripe_width ), - first_( first_ ) - { } - - ObjectList( const ObjectList& other ) - : set( ::yidl::runtime::Object::inc_ref( other.get_set() ) ), - stripe_width( other.get_stripe_width() ), - first_( other.get_first_() ) - { } - - virtual ~ObjectList() { ::yidl::runtime::Buffer::dec_ref( set ); } - - ::yidl::runtime::Buffer* get_set() const { return set; } - uint32_t get_stripe_width() const { return stripe_width; } - uint32_t get_first_() const { return first_; } - void set_set( ::yidl::runtime::Buffer* set ) { ::yidl::runtime::Buffer::dec_ref( this->set ); this->set = ::yidl::runtime::Object::inc_ref( set ); } - void set_stripe_width( uint32_t stripe_width ) { this->stripe_width = stripe_width; } - void set_first_( uint32_t first_ ) { this->first_ = first_; } - - bool operator==( const ObjectList& other ) const - { - return get_set() == other.get_set() - && - get_stripe_width() == other.get_stripe_width() - && - get_first_() == other.get_first_(); - } - - // yidl::runtime::Object - ObjectList& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030971 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ObjectList"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - if ( get_set() != NULL ) marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "set", 0 ), *get_set() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stripe_width", 0 ), get_stripe_width() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "first_", 0 ), get_first_() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - if ( set != NULL ) unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "set", 0 ), *set ); else set = unmarshaller.read_buffer( ::yidl::runtime::Unmarshaller::StringLiteralKey( "set", 0 ) ); - stripe_width = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stripe_width", 0 ) ); - first_ = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "first_", 0 ) ); - } - - protected: - ::yidl::runtime::Buffer* set; - uint32_t stripe_width; - uint32_t first_; - }; - - class ObjectListSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - ObjectListSet() { } - ObjectListSet( const org::xtreemfs::interfaces::ObjectList& first_value ) { vector::push_back( first_value ); } - ObjectListSet( size_type size ) : vector( size ) { } - virtual ~ObjectListSet() { } - - // yidl::runtime::Object - ObjectListSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030972 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ObjectListSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::ObjectList value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class ObjectVersion : public ::yidl::runtime::Struct - { - public: - ObjectVersion() - : object_number( 0 ), object_version( 0 ) - { } - - ObjectVersion( uint64_t object_number, uint64_t object_version ) - : object_number( object_number ), object_version( object_version ) - { } - - ObjectVersion( const ObjectVersion& other ) - : object_number( other.get_object_number() ), - object_version( other.get_object_version() ) - { } - - virtual ~ObjectVersion() { } - - uint64_t get_object_number() const { return object_number; } - uint64_t get_object_version() const { return object_version; } - void set_object_number( uint64_t object_number ) { this->object_number = object_number; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - - bool operator==( const ObjectVersion& other ) const - { - return get_object_number() == other.get_object_number() - && - get_object_version() == other.get_object_version(); - } - - // yidl::runtime::Object - ObjectVersion& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030973 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ObjectVersion"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_number", 0 ), get_object_number() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_number", 0 ), object_number ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - } - - protected: - uint64_t object_number; - uint64_t object_version; - }; - - class ObjectVersionList - : public ::yidl::runtime::Sequence, - public vector - { - public: - ObjectVersionList() { } - ObjectVersionList( const org::xtreemfs::interfaces::ObjectVersion& first_value ) { vector::push_back( first_value ); } - ObjectVersionList( size_type size ) : vector( size ) { } - virtual ~ObjectVersionList() { } - - // yidl::runtime::Object - ObjectVersionList& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030974 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ObjectVersionList"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - org::xtreemfs::interfaces::ObjectVersion value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class ReplicaStatus : public ::yidl::runtime::Struct - { - public: - ReplicaStatus() - : truncate_epoch( 0 ), file_size( 0 ), max_obj_version( 0 ) - { } - - ReplicaStatus - ( - uint64_t truncate_epoch, - uint64_t file_size, - uint64_t max_obj_version, - const org::xtreemfs::interfaces::ObjectVersionList& objectVersions - ) - : truncate_epoch( truncate_epoch ), - file_size( file_size ), - max_obj_version( max_obj_version ), - objectVersions( objectVersions ) - { } - - ReplicaStatus( const ReplicaStatus& other ) - : truncate_epoch( other.get_truncate_epoch() ), - file_size( other.get_file_size() ), - max_obj_version( other.get_max_obj_version() ), - objectVersions( other.get_objectVersions() ) - { } - - virtual ~ReplicaStatus() { } - - uint64_t get_truncate_epoch() const { return truncate_epoch; } - uint64_t get_file_size() const { return file_size; } - uint64_t get_max_obj_version() const { return max_obj_version; } - const org::xtreemfs::interfaces::ObjectVersionList& get_objectVersions() const { return objectVersions; } - void set_truncate_epoch( uint64_t truncate_epoch ) { this->truncate_epoch = truncate_epoch; } - void set_file_size( uint64_t file_size ) { this->file_size = file_size; } - void set_max_obj_version( uint64_t max_obj_version ) { this->max_obj_version = max_obj_version; } - void set_objectVersions( const org::xtreemfs::interfaces::ObjectVersionList& objectVersions ) { this->objectVersions = objectVersions; } - - bool operator==( const ReplicaStatus& other ) const - { - return get_truncate_epoch() == other.get_truncate_epoch() - && - get_file_size() == other.get_file_size() - && - get_max_obj_version() == other.get_max_obj_version() - && - get_objectVersions() == other.get_objectVersions(); - } - - // yidl::runtime::Object - ReplicaStatus& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030975 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ReplicaStatus"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "truncate_epoch", 0 ), get_truncate_epoch() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_size", 0 ), get_file_size() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "max_obj_version", 0 ), get_max_obj_version() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "objectVersions", 0 ), get_objectVersions() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "truncate_epoch", 0 ), truncate_epoch ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_size", 0 ), file_size ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "max_obj_version", 0 ), max_obj_version ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "objectVersions", 0 ), objectVersions ); - } - - protected: - uint64_t truncate_epoch; - uint64_t file_size; - uint64_t max_obj_version; - org::xtreemfs::interfaces::ObjectVersionList objectVersions; - }; - - class InternalReadLocalResponse : public ::yidl::runtime::Struct - { - public: - InternalReadLocalResponse() { } - - InternalReadLocalResponse - ( - const org::xtreemfs::interfaces::ObjectData& data, - const org::xtreemfs::interfaces::ObjectListSet& object_set - ) - : data( data ), object_set( object_set ) - { } - - InternalReadLocalResponse( const InternalReadLocalResponse& other ) - : data( other.get_data() ), - object_set( other.get_object_set() ) - { } - - virtual ~InternalReadLocalResponse() { } - - const org::xtreemfs::interfaces::ObjectData& get_data() const { return data; } - const org::xtreemfs::interfaces::ObjectListSet& get_object_set() const { return object_set; } - void set_data( const org::xtreemfs::interfaces::ObjectData& data ) { this->data = data; } - void set_object_set( const org::xtreemfs::interfaces::ObjectListSet& object_set ) { this->object_set = object_set; } - - bool operator==( const InternalReadLocalResponse& other ) const - { - return get_data() == other.get_data() - && - get_object_set() == other.get_object_set(); - } - - // yidl::runtime::Object - InternalReadLocalResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030968 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "InternalReadLocalResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "data", 0 ), get_data() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_set", 0 ), get_object_set() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "data", 0 ), data ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_set", 0 ), object_set ); - } - - protected: - org::xtreemfs::interfaces::ObjectData data; - org::xtreemfs::interfaces::ObjectListSet object_set; - }; - - - class OSDInterface - { - public: - const static uint32_t HTTP_PORT_DEFAULT = 30640; - const static uint32_t ONC_RPC_PORT_DEFAULT = 32640;const static uint32_t TAG = 2010031216; - - virtual ~OSDInterface() { } - - uint32_t get_tag() const { return 2010031216; } - - - - virtual void - read - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - uint32_t length, - org::xtreemfs::interfaces::ObjectData& object_data - ) - { } - - virtual void - truncate - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size, - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { } - - virtual void - unlink - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - { } - - virtual void - write - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - uint64_t lease_timeout, - const org::xtreemfs::interfaces::ObjectData& object_data, - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { } - - virtual void - xtreemfs_broadcast_gmax - ( - const string& file_id, - uint64_t truncate_epoch, - uint64_t last_object, - uint64_t file_size - ) - { } - - virtual org::xtreemfs::interfaces::ObjectData - xtreemfs_check_object - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version - ){ - return org::xtreemfs::interfaces::ObjectData(); - } - - virtual void - xtreemfs_cleanup_get_results - ( - org::xtreemfs::interfaces::StringSet& results - ) - { } - - virtual void xtreemfs_cleanup_is_running( bool& is_running ) { } - - virtual void - xtreemfs_cleanup_start - ( - bool remove_zombies, - bool remove_unavail_volume, - bool lost_and_found - ) - { } - - virtual void xtreemfs_cleanup_status( string& status ) { } - - virtual void xtreemfs_cleanup_stop() { } - - virtual void - xtreemfs_rwr_fetch - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - org::xtreemfs::interfaces::ObjectData& object_data - ) - { } - - virtual void - xtreemfs_rwr_flease_msg - ( - ::yidl::runtime::Buffer* fleaseMessage, - const string& senderHostname, - uint32_t senderPort - ) - { } - - virtual void - xtreemfs_rwr_notify - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - { } - - virtual void - xtreemfs_rwr_status - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - int64_t max_local_obj_version, - org::xtreemfs::interfaces::ReplicaStatus& local_state - ) - { } - - virtual void - xtreemfs_rwr_truncate - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size, - uint64_t object_version - ) - { } - - virtual void - xtreemfs_rwr_update - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - const org::xtreemfs::interfaces::ObjectData& object_data - ) - { } - - virtual org::xtreemfs::interfaces::InternalGmax - xtreemfs_internal_get_gmax - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ){ - return org::xtreemfs::interfaces::InternalGmax(); - } - - virtual void - xtreemfs_internal_truncate - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size, - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { } - - virtual uint64_t - xtreemfs_internal_get_file_size - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ){ - return 0; - } - - virtual org::xtreemfs::interfaces::InternalReadLocalResponse - xtreemfs_internal_read_local - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint64_t offset, - uint64_t length, - bool attach_object_list, - const org::xtreemfs::interfaces::ObjectListSet& required_objects - ){ - return org::xtreemfs::interfaces::InternalReadLocalResponse(); - } - - virtual org::xtreemfs::interfaces::ObjectList - xtreemfs_internal_get_object_set - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ){ - return org::xtreemfs::interfaces::ObjectList(); - } - - virtual org::xtreemfs::interfaces::Lock - xtreemfs_lock_acquire - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& client_uuid, - int32_t client_pid, - const string& file_id, - uint64_t offset, - uint64_t length, - bool exclusive - ){ - return org::xtreemfs::interfaces::Lock(); - } - - virtual org::xtreemfs::interfaces::Lock - xtreemfs_lock_check - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& client_uuid, - int32_t client_pid, - const string& file_id, - uint64_t offset, - uint64_t length, - bool exclusive - ){ - return org::xtreemfs::interfaces::Lock(); - } - - virtual void - xtreemfs_lock_release - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - const org::xtreemfs::interfaces::Lock& lock - ) - { } - - virtual void - xtreemfs_ping - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& coordinates, - org::xtreemfs::interfaces::VivaldiCoordinates& remote_coordinates - ) - { } - - virtual void xtreemfs_shutdown() { } - }; - - - // Use this macro in an implementation class to get all of the prototypes for the operations in OSDInterface - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_PROTOTYPES\ - virtual void\ - read\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t object_number,\ - uint64_t object_version,\ - uint32_t offset,\ - uint32_t length,\ - org::xtreemfs::interfaces::ObjectData& object_data\ - );\ - virtual void\ - truncate\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t new_file_size,\ - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response\ - );\ - virtual void\ - unlink\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id\ - );\ - virtual void\ - write\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t object_number,\ - uint64_t object_version,\ - uint32_t offset,\ - uint64_t lease_timeout,\ - const org::xtreemfs::interfaces::ObjectData& object_data,\ - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response\ - );\ - virtual void\ - xtreemfs_broadcast_gmax\ - (\ - const string& file_id,\ - uint64_t truncate_epoch,\ - uint64_t last_object,\ - uint64_t file_size\ - );\ - virtual org::xtreemfs::interfaces::ObjectData\ - xtreemfs_check_object\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t object_number,\ - uint64_t object_version\ - );\ - virtual void\ - xtreemfs_cleanup_get_results\ - (\ - org::xtreemfs::interfaces::StringSet& results\ - );\ - virtual void xtreemfs_cleanup_is_running( bool& is_running );\ - virtual void\ - xtreemfs_cleanup_start\ - (\ - bool remove_zombies,\ - bool remove_unavail_volume,\ - bool lost_and_found\ - );\ - virtual void xtreemfs_cleanup_status( string& status );\ - virtual void xtreemfs_cleanup_stop();\ - virtual void\ - xtreemfs_rwr_fetch\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t object_number,\ - uint64_t object_version,\ - org::xtreemfs::interfaces::ObjectData& object_data\ - );\ - virtual void\ - xtreemfs_rwr_flease_msg\ - (\ - ::yidl::runtime::Buffer* fleaseMessage,\ - const string& senderHostname,\ - uint32_t senderPort\ - );\ - virtual void\ - xtreemfs_rwr_notify\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id\ - );\ - virtual void\ - xtreemfs_rwr_status\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - int64_t max_local_obj_version,\ - org::xtreemfs::interfaces::ReplicaStatus& local_state\ - );\ - virtual void\ - xtreemfs_rwr_truncate\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t new_file_size,\ - uint64_t object_version\ - );\ - virtual void\ - xtreemfs_rwr_update\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t object_number,\ - uint64_t object_version,\ - uint32_t offset,\ - const org::xtreemfs::interfaces::ObjectData& object_data\ - );\ - virtual org::xtreemfs::interfaces::InternalGmax\ - xtreemfs_internal_get_gmax\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id\ - );\ - virtual void\ - xtreemfs_internal_truncate\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t new_file_size,\ - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response\ - );\ - virtual uint64_t\ - xtreemfs_internal_get_file_size\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id\ - );\ - virtual org::xtreemfs::interfaces::InternalReadLocalResponse\ - xtreemfs_internal_read_local\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - uint64_t object_number,\ - uint64_t object_version,\ - uint64_t offset,\ - uint64_t length,\ - bool attach_object_list,\ - const org::xtreemfs::interfaces::ObjectListSet& required_objects\ - );\ - virtual org::xtreemfs::interfaces::ObjectList\ - xtreemfs_internal_get_object_set\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id\ - );\ - virtual org::xtreemfs::interfaces::Lock\ - xtreemfs_lock_acquire\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& client_uuid,\ - int32_t client_pid,\ - const string& file_id,\ - uint64_t offset,\ - uint64_t length,\ - bool exclusive\ - );\ - virtual org::xtreemfs::interfaces::Lock\ - xtreemfs_lock_check\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& client_uuid,\ - int32_t client_pid,\ - const string& file_id,\ - uint64_t offset,\ - uint64_t length,\ - bool exclusive\ - );\ - virtual void\ - xtreemfs_lock_release\ - (\ - const org::xtreemfs::interfaces::FileCredentials& file_credentials,\ - const string& file_id,\ - const org::xtreemfs::interfaces::Lock& lock\ - );\ - virtual void\ - xtreemfs_ping\ - (\ - const org::xtreemfs::interfaces::VivaldiCoordinates& coordinates,\ - org::xtreemfs::interfaces::VivaldiCoordinates& remote_coordinates\ - );\ - virtual void xtreemfs_shutdown();\ - - - #ifndef ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS ORG_XTREEMFS_INTERFACES_EXCEPTION_PARENT_CLASS - #elif defined( ORG_XTREEMFS_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS ORG_XTREEMFS_EXCEPTION_PARENT_CLASS - #elif defined( ORG_EXCEPTION_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS ORG_EXCEPTION_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS ::yield::concurrency::Exception - #endif - #endif - #ifndef ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS ORG_XTREEMFS_INTERFACES_REQUEST_PARENT_CLASS - #elif defined( ORG_XTREEMFS_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS ORG_XTREEMFS_REQUEST_PARENT_CLASS - #elif defined( ORG_REQUEST_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS ORG_REQUEST_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS ::yield::concurrency::Request - #endif - #endif - #ifndef ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - #if defined( ORG_XTREEMFS_INTERFACES_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS ORG_XTREEMFS_INTERFACES_RESPONSE_PARENT_CLASS - #elif defined( ORG_XTREEMFS_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS ORG_XTREEMFS_RESPONSE_PARENT_CLASS - #elif defined( ORG_RESPONSE_PARENT_CLASS ) - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS ORG_RESPONSE_PARENT_CLASS - #else - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS ::yield::concurrency::Response - #endif - #endif - - - class OSDInterfaceMessages - { - public: - // Request/response pair definitions for the operations in OSDInterface - class readRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - readRequest() - : object_number( 0 ), - object_version( 0 ), - offset( 0 ), - length( 0 ) - { } - - readRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - uint32_t length, - const org::xtreemfs::interfaces::ObjectData& object_data - ) - : file_credentials( file_credentials ), - file_id( file_id ), - object_number( object_number ), - object_version( object_version ), - offset( offset ), - length( length ), - object_data( object_data ) - { } - - readRequest( const readRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - object_number( other.get_object_number() ), - object_version( other.get_object_version() ), - offset( other.get_offset() ), - length( other.get_length() ), - object_data( other.get_object_data() ) - { } - - virtual ~readRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_object_number() const { return object_number; } - uint64_t get_object_version() const { return object_version; } - uint32_t get_offset() const { return offset; } - uint32_t get_length() const { return length; } - const org::xtreemfs::interfaces::ObjectData& get_object_data() const { return object_data; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_object_number( uint64_t object_number ) { this->object_number = object_number; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - void set_offset( uint32_t offset ) { this->offset = offset; } - void set_length( uint32_t length ) { this->length = length; } - void set_object_data( const org::xtreemfs::interfaces::ObjectData& object_data ) { this->object_data = object_data; } - - bool operator==( const readRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_object_number() == other.get_object_number() - && - get_object_version() == other.get_object_version() - && - get_offset() == other.get_offset() - && - get_length() == other.get_length() - && - get_object_data() == other.get_object_data(); - } - - // yidl::runtime::Object - readRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031226 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "readRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_number", 0 ), get_object_number() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "offset", 0 ), get_offset() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "length", 0 ), get_length() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_data", 0 ), get_object_data() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_number", 0 ), object_number ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - offset = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "offset", 0 ) ); - length = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "length", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_data", 0 ), object_data ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new readResponse - ( - get_object_data() - ); - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::ObjectData& object_data - ) - { - respond - ( - *new readResponse - ( - object_data - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t object_number; - uint64_t object_version; - uint32_t offset; - uint32_t length; - org::xtreemfs::interfaces::ObjectData object_data; - }; - - - class readResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - readResponse() { } - - readResponse( const org::xtreemfs::interfaces::ObjectData& object_data ) - : object_data( object_data ) - { } - - readResponse( const readResponse& other ) - : object_data( other.get_object_data() ) - { } - - virtual ~readResponse() { } - - const org::xtreemfs::interfaces::ObjectData& get_object_data() const { return object_data; } - void set_object_data( const org::xtreemfs::interfaces::ObjectData& object_data ) { this->object_data = object_data; } - - bool operator==( const readResponse& other ) const - { - return get_object_data() == other.get_object_data(); - } - - // yidl::runtime::Object - readResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031226 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "readResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_data", 0 ), get_object_data() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_data", 0 ), object_data ); - } - - protected: - org::xtreemfs::interfaces::ObjectData object_data; - }; - - - class truncateRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - truncateRequest() - : new_file_size( 0 ) - { } - - truncateRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size - ) - : file_credentials( file_credentials ), - file_id( file_id ), - new_file_size( new_file_size ) - { } - - truncateRequest( const truncateRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - new_file_size( other.get_new_file_size() ) - { } - - virtual ~truncateRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_new_file_size() const { return new_file_size; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_new_file_size( uint64_t new_file_size ) { this->new_file_size = new_file_size; } - - bool operator==( const truncateRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_new_file_size() == other.get_new_file_size(); - } - - // yidl::runtime::Object - truncateRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031227 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "truncateRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "new_file_size", 0 ), get_new_file_size() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "new_file_size", 0 ), new_file_size ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new truncateResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { - respond - ( - *new truncateResponse - ( - osd_write_response - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t new_file_size; - }; - - - class truncateResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - truncateResponse() { } - - truncateResponse - ( - const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - : osd_write_response( osd_write_response ) - { } - - truncateResponse( const truncateResponse& other ) - : osd_write_response( other.get_osd_write_response() ) - { } - - virtual ~truncateResponse() { } - - const org::xtreemfs::interfaces::OSDWriteResponse& get_osd_write_response() const { return osd_write_response; } - void set_osd_write_response( const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response ) { this->osd_write_response = osd_write_response; } - - bool operator==( const truncateResponse& other ) const - { - return get_osd_write_response() == other.get_osd_write_response(); - } - - // yidl::runtime::Object - truncateResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031227 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "truncateResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_write_response", 0 ), get_osd_write_response() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_write_response", 0 ), osd_write_response ); - } - - protected: - org::xtreemfs::interfaces::OSDWriteResponse osd_write_response; - }; - - - class unlinkRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - unlinkRequest() { } - - unlinkRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - : file_credentials( file_credentials ), file_id( file_id ) - { } - - unlinkRequest( const unlinkRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ) - { } - - virtual ~unlinkRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - - bool operator==( const unlinkRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id(); - } - - // yidl::runtime::Object - unlinkRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031228 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "unlinkRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new unlinkResponse; - } - - virtual void respond() - { - respond( *new unlinkResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - }; - - - class unlinkResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~unlinkResponse() { } - - bool operator==( const unlinkResponse& ) const { return true; } - - // yidl::runtime::Object - unlinkResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031228 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "unlinkResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class writeRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - writeRequest() - : object_number( 0 ), - object_version( 0 ), - offset( 0 ), - lease_timeout( 0 ) - { } - - writeRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - uint64_t lease_timeout, - const org::xtreemfs::interfaces::ObjectData& object_data - ) - : file_credentials( file_credentials ), - file_id( file_id ), - object_number( object_number ), - object_version( object_version ), - offset( offset ), - lease_timeout( lease_timeout ), - object_data( object_data ) - { } - - writeRequest( const writeRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - object_number( other.get_object_number() ), - object_version( other.get_object_version() ), - offset( other.get_offset() ), - lease_timeout( other.get_lease_timeout() ), - object_data( other.get_object_data() ) - { } - - virtual ~writeRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_object_number() const { return object_number; } - uint64_t get_object_version() const { return object_version; } - uint32_t get_offset() const { return offset; } - uint64_t get_lease_timeout() const { return lease_timeout; } - const org::xtreemfs::interfaces::ObjectData& get_object_data() const { return object_data; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_object_number( uint64_t object_number ) { this->object_number = object_number; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - void set_offset( uint32_t offset ) { this->offset = offset; } - void set_lease_timeout( uint64_t lease_timeout ) { this->lease_timeout = lease_timeout; } - void set_object_data( const org::xtreemfs::interfaces::ObjectData& object_data ) { this->object_data = object_data; } - - bool operator==( const writeRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_object_number() == other.get_object_number() - && - get_object_version() == other.get_object_version() - && - get_offset() == other.get_offset() - && - get_lease_timeout() == other.get_lease_timeout() - && - get_object_data() == other.get_object_data(); - } - - // yidl::runtime::Object - writeRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031229 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "writeRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_number", 0 ), get_object_number() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "offset", 0 ), get_offset() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "lease_timeout", 0 ), get_lease_timeout() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_data", 0 ), get_object_data() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_number", 0 ), object_number ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - offset = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "offset", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "lease_timeout", 0 ), lease_timeout ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_data", 0 ), object_data ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new writeResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { - respond - ( - *new writeResponse - ( - osd_write_response - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t object_number; - uint64_t object_version; - uint32_t offset; - uint64_t lease_timeout; - org::xtreemfs::interfaces::ObjectData object_data; - }; - - - class writeResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - writeResponse() { } - - writeResponse - ( - const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - : osd_write_response( osd_write_response ) - { } - - writeResponse( const writeResponse& other ) - : osd_write_response( other.get_osd_write_response() ) - { } - - virtual ~writeResponse() { } - - const org::xtreemfs::interfaces::OSDWriteResponse& get_osd_write_response() const { return osd_write_response; } - void set_osd_write_response( const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response ) { this->osd_write_response = osd_write_response; } - - bool operator==( const writeResponse& other ) const - { - return get_osd_write_response() == other.get_osd_write_response(); - } - - // yidl::runtime::Object - writeResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031229 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "writeResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_write_response", 0 ), get_osd_write_response() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_write_response", 0 ), osd_write_response ); - } - - protected: - org::xtreemfs::interfaces::OSDWriteResponse osd_write_response; - }; - - - class xtreemfs_broadcast_gmaxRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_broadcast_gmaxRequest() - : truncate_epoch( 0 ), - last_object( 0 ), - file_size( 0 ) - { } - - xtreemfs_broadcast_gmaxRequest - ( - const string& file_id, - uint64_t truncate_epoch, - uint64_t last_object, - uint64_t file_size - ) - : file_id( file_id ), - truncate_epoch( truncate_epoch ), - last_object( last_object ), - file_size( file_size ) - { } - - xtreemfs_broadcast_gmaxRequest( const xtreemfs_broadcast_gmaxRequest& other ) - : file_id( other.get_file_id() ), - truncate_epoch( other.get_truncate_epoch() ), - last_object( other.get_last_object() ), - file_size( other.get_file_size() ) - { } - - virtual ~xtreemfs_broadcast_gmaxRequest() { } - - const string& get_file_id() const { return file_id; } - uint64_t get_truncate_epoch() const { return truncate_epoch; } - uint64_t get_last_object() const { return last_object; } - uint64_t get_file_size() const { return file_size; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_truncate_epoch( uint64_t truncate_epoch ) { this->truncate_epoch = truncate_epoch; } - void set_last_object( uint64_t last_object ) { this->last_object = last_object; } - void set_file_size( uint64_t file_size ) { this->file_size = file_size; } - - bool operator==( const xtreemfs_broadcast_gmaxRequest& other ) const - { - return get_file_id() == other.get_file_id() - && - get_truncate_epoch() == other.get_truncate_epoch() - && - get_last_object() == other.get_last_object() - && - get_file_size() == other.get_file_size(); - } - - // yidl::runtime::Object - xtreemfs_broadcast_gmaxRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031236 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_broadcast_gmaxRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "truncate_epoch", 0 ), get_truncate_epoch() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "last_object", 0 ), get_last_object() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_size", 0 ), get_file_size() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "truncate_epoch", 0 ), truncate_epoch ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "last_object", 0 ), last_object ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_size", 0 ), file_size ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_broadcast_gmaxResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_broadcast_gmaxResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - string file_id; - uint64_t truncate_epoch; - uint64_t last_object; - uint64_t file_size; - }; - - - class xtreemfs_broadcast_gmaxResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_broadcast_gmaxResponse() { } - - bool operator==( const xtreemfs_broadcast_gmaxResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_broadcast_gmaxResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031236 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_broadcast_gmaxResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_check_objectRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_check_objectRequest() - : object_number( 0 ), object_version( 0 ) - { } - - xtreemfs_check_objectRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version - ) - : file_credentials( file_credentials ), - file_id( file_id ), - object_number( object_number ), - object_version( object_version ) - { } - - xtreemfs_check_objectRequest( const xtreemfs_check_objectRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - object_number( other.get_object_number() ), - object_version( other.get_object_version() ) - { } - - virtual ~xtreemfs_check_objectRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_object_number() const { return object_number; } - uint64_t get_object_version() const { return object_version; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_object_number( uint64_t object_number ) { this->object_number = object_number; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - - bool operator==( const xtreemfs_check_objectRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_object_number() == other.get_object_number() - && - get_object_version() == other.get_object_version(); - } - - // yidl::runtime::Object - xtreemfs_check_objectRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031237 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_check_objectRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_number", 0 ), get_object_number() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_number", 0 ), object_number ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_check_objectResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::ObjectData& _return_value - ) - { - respond - ( - *new xtreemfs_check_objectResponse - ( - _return_value - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t object_number; - uint64_t object_version; - }; - - - class xtreemfs_check_objectResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_check_objectResponse() { } - - xtreemfs_check_objectResponse - ( - const org::xtreemfs::interfaces::ObjectData& _return_value - ) - : _return_value( _return_value ) - { } - - xtreemfs_check_objectResponse( const xtreemfs_check_objectResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_check_objectResponse() { } - - const org::xtreemfs::interfaces::ObjectData& get__return_value() const { return _return_value; } - void set__return_value( const org::xtreemfs::interfaces::ObjectData& _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_check_objectResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_check_objectResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031237 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_check_objectResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - org::xtreemfs::interfaces::ObjectData _return_value; - }; - - - class xtreemfs_cleanup_get_resultsRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_cleanup_get_resultsRequest() { } - - bool operator==( const xtreemfs_cleanup_get_resultsRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_cleanup_get_resultsRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031246 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_get_resultsRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_cleanup_get_resultsResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::StringSet& results ) - { - respond( *new xtreemfs_cleanup_get_resultsResponse( results ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_cleanup_get_resultsResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_cleanup_get_resultsResponse() { } - - xtreemfs_cleanup_get_resultsResponse - ( - const org::xtreemfs::interfaces::StringSet& results - ) - : results( results ) - { } - - xtreemfs_cleanup_get_resultsResponse( const xtreemfs_cleanup_get_resultsResponse& other ) - : results( other.get_results() ) - { } - - virtual ~xtreemfs_cleanup_get_resultsResponse() { } - - const org::xtreemfs::interfaces::StringSet& get_results() const { return results; } - void set_results( const org::xtreemfs::interfaces::StringSet& results ) { this->results = results; } - - bool operator==( const xtreemfs_cleanup_get_resultsResponse& other ) const - { - return get_results() == other.get_results(); - } - - // yidl::runtime::Object - xtreemfs_cleanup_get_resultsResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031246 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_get_resultsResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "results", 0 ), get_results() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "results", 0 ), results ); - } - - protected: - org::xtreemfs::interfaces::StringSet results; - }; - - - class xtreemfs_cleanup_is_runningRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_cleanup_is_runningRequest() { } - - bool operator==( const xtreemfs_cleanup_is_runningRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_cleanup_is_runningRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031247 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_is_runningRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_cleanup_is_runningResponse; - } - - virtual void respond( bool is_running ) - { - respond( *new xtreemfs_cleanup_is_runningResponse( is_running ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_cleanup_is_runningResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_cleanup_is_runningResponse() - : is_running( false ) - { } - - xtreemfs_cleanup_is_runningResponse( bool is_running ) - : is_running( is_running ) - { } - - xtreemfs_cleanup_is_runningResponse( const xtreemfs_cleanup_is_runningResponse& other ) - : is_running( other.get_is_running() ) - { } - - virtual ~xtreemfs_cleanup_is_runningResponse() { } - - bool get_is_running() const { return is_running; } - void set_is_running( bool is_running ) { this->is_running = is_running; } - - bool operator==( const xtreemfs_cleanup_is_runningResponse& other ) const - { - return get_is_running() == other.get_is_running(); - } - - // yidl::runtime::Object - xtreemfs_cleanup_is_runningResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031247 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_is_runningResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "is_running", 0 ), get_is_running() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - is_running = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "is_running", 0 ) ); - } - - protected: - bool is_running; - }; - - - class xtreemfs_cleanup_startRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_cleanup_startRequest() - : remove_zombies( false ), - remove_unavail_volume( false ), - lost_and_found( false ) - { } - - xtreemfs_cleanup_startRequest - ( - bool remove_zombies, - bool remove_unavail_volume, - bool lost_and_found - ) - : remove_zombies( remove_zombies ), - remove_unavail_volume( remove_unavail_volume ), - lost_and_found( lost_and_found ) - { } - - xtreemfs_cleanup_startRequest( const xtreemfs_cleanup_startRequest& other ) - : remove_zombies( other.get_remove_zombies() ), - remove_unavail_volume( other.get_remove_unavail_volume() ), - lost_and_found( other.get_lost_and_found() ) - { } - - virtual ~xtreemfs_cleanup_startRequest() { } - - bool get_remove_zombies() const { return remove_zombies; } - bool get_remove_unavail_volume() const { return remove_unavail_volume; } - bool get_lost_and_found() const { return lost_and_found; } - void set_remove_zombies( bool remove_zombies ) { this->remove_zombies = remove_zombies; } - void set_remove_unavail_volume( bool remove_unavail_volume ) { this->remove_unavail_volume = remove_unavail_volume; } - void set_lost_and_found( bool lost_and_found ) { this->lost_and_found = lost_and_found; } - - bool operator==( const xtreemfs_cleanup_startRequest& other ) const - { - return get_remove_zombies() == other.get_remove_zombies() - && - get_remove_unavail_volume() == other.get_remove_unavail_volume() - && - get_lost_and_found() == other.get_lost_and_found(); - } - - // yidl::runtime::Object - xtreemfs_cleanup_startRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031248 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_startRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "remove_zombies", 0 ), get_remove_zombies() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "remove_unavail_volume", 0 ), get_remove_unavail_volume() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "lost_and_found", 0 ), get_lost_and_found() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - remove_zombies = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "remove_zombies", 0 ) ); - remove_unavail_volume = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "remove_unavail_volume", 0 ) ); - lost_and_found = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "lost_and_found", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_cleanup_startResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_cleanup_startResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - bool remove_zombies; - bool remove_unavail_volume; - bool lost_and_found; - }; - - - class xtreemfs_cleanup_startResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_cleanup_startResponse() { } - - bool operator==( const xtreemfs_cleanup_startResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_cleanup_startResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031248 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_startResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_cleanup_statusRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_cleanup_statusRequest() { } - - bool operator==( const xtreemfs_cleanup_statusRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_cleanup_statusRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031249 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_statusRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_cleanup_statusResponse; - } - - virtual void respond( const string& status ) - { - respond( *new xtreemfs_cleanup_statusResponse( status ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_cleanup_statusResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_cleanup_statusResponse() { } - - xtreemfs_cleanup_statusResponse( const string& status ) - : status( status ) - { } - - xtreemfs_cleanup_statusResponse( const xtreemfs_cleanup_statusResponse& other ) - : status( other.get_status() ) - { } - - virtual ~xtreemfs_cleanup_statusResponse() { } - - const string& get_status() const { return status; } - void set_status( const string& status ) { this->status = status; } - - bool operator==( const xtreemfs_cleanup_statusResponse& other ) const - { - return get_status() == other.get_status(); - } - - // yidl::runtime::Object - xtreemfs_cleanup_statusResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031249 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_statusResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "status", 0 ), get_status() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "status", 0 ), status ); - } - - protected: - string status; - }; - - - class xtreemfs_cleanup_stopRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_cleanup_stopRequest() { } - - bool operator==( const xtreemfs_cleanup_stopRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_cleanup_stopRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031250 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_stopRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_cleanup_stopResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_cleanup_stopResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_cleanup_stopResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_cleanup_stopResponse() { } - - bool operator==( const xtreemfs_cleanup_stopResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_cleanup_stopResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031250 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_cleanup_stopResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_rwr_fetchRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_rwr_fetchRequest() - : object_number( 0 ), object_version( 0 ) - { } - - xtreemfs_rwr_fetchRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version - ) - : file_credentials( file_credentials ), - file_id( file_id ), - object_number( object_number ), - object_version( object_version ) - { } - - xtreemfs_rwr_fetchRequest( const xtreemfs_rwr_fetchRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - object_number( other.get_object_number() ), - object_version( other.get_object_version() ) - { } - - virtual ~xtreemfs_rwr_fetchRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_object_number() const { return object_number; } - uint64_t get_object_version() const { return object_version; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_object_number( uint64_t object_number ) { this->object_number = object_number; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - - bool operator==( const xtreemfs_rwr_fetchRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_object_number() == other.get_object_number() - && - get_object_version() == other.get_object_version(); - } - - // yidl::runtime::Object - xtreemfs_rwr_fetchRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031289 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_fetchRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_number", 0 ), get_object_number() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_number", 0 ), object_number ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_rwr_fetchResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::ObjectData& object_data - ) - { - respond - ( - *new xtreemfs_rwr_fetchResponse - ( - object_data - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t object_number; - uint64_t object_version; - }; - - - class xtreemfs_rwr_fetchResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_rwr_fetchResponse() { } - - xtreemfs_rwr_fetchResponse - ( - const org::xtreemfs::interfaces::ObjectData& object_data - ) - : object_data( object_data ) - { } - - xtreemfs_rwr_fetchResponse( const xtreemfs_rwr_fetchResponse& other ) - : object_data( other.get_object_data() ) - { } - - virtual ~xtreemfs_rwr_fetchResponse() { } - - const org::xtreemfs::interfaces::ObjectData& get_object_data() const { return object_data; } - void set_object_data( const org::xtreemfs::interfaces::ObjectData& object_data ) { this->object_data = object_data; } - - bool operator==( const xtreemfs_rwr_fetchResponse& other ) const - { - return get_object_data() == other.get_object_data(); - } - - // yidl::runtime::Object - xtreemfs_rwr_fetchResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031289 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_fetchResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_data", 0 ), get_object_data() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_data", 0 ), object_data ); - } - - protected: - org::xtreemfs::interfaces::ObjectData object_data; - }; - - - class xtreemfs_rwr_flease_msgRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_rwr_flease_msgRequest() - : fleaseMessage( NULL ), senderPort( 0 ) - { } - - xtreemfs_rwr_flease_msgRequest - ( - ::yidl::runtime::Buffer* fleaseMessage, - const string& senderHostname, - uint32_t senderPort - ) - : fleaseMessage( ::yidl::runtime::Object::inc_ref( fleaseMessage ) ), - senderHostname( senderHostname ), - senderPort( senderPort ) - { } - - xtreemfs_rwr_flease_msgRequest( const xtreemfs_rwr_flease_msgRequest& other ) - : fleaseMessage( ::yidl::runtime::Object::inc_ref( other.get_fleaseMessage() ) ), - senderHostname( other.get_senderHostname() ), - senderPort( other.get_senderPort() ) - { } - - virtual ~xtreemfs_rwr_flease_msgRequest() { ::yidl::runtime::Buffer::dec_ref( fleaseMessage ); } - - ::yidl::runtime::Buffer* get_fleaseMessage() const { return fleaseMessage; } - const string& get_senderHostname() const { return senderHostname; } - uint32_t get_senderPort() const { return senderPort; } - void set_fleaseMessage( ::yidl::runtime::Buffer* fleaseMessage ) { ::yidl::runtime::Buffer::dec_ref( this->fleaseMessage ); this->fleaseMessage = ::yidl::runtime::Object::inc_ref( fleaseMessage ); } - void set_senderHostname( const string& senderHostname ) { this->senderHostname = senderHostname; } - void set_senderPort( uint32_t senderPort ) { this->senderPort = senderPort; } - - bool operator==( const xtreemfs_rwr_flease_msgRequest& other ) const - { - return get_fleaseMessage() == other.get_fleaseMessage() - && - get_senderHostname() == other.get_senderHostname() - && - get_senderPort() == other.get_senderPort(); - } - - // yidl::runtime::Object - xtreemfs_rwr_flease_msgRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031287 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_flease_msgRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - if ( get_fleaseMessage() != NULL ) marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "fleaseMessage", 0 ), *get_fleaseMessage() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "senderHostname", 0 ), get_senderHostname() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "senderPort", 0 ), get_senderPort() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - if ( fleaseMessage != NULL ) unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "fleaseMessage", 0 ), *fleaseMessage ); else fleaseMessage = unmarshaller.read_buffer( ::yidl::runtime::Unmarshaller::StringLiteralKey( "fleaseMessage", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "senderHostname", 0 ), senderHostname ); - senderPort = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "senderPort", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_rwr_flease_msgResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_rwr_flease_msgResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - ::yidl::runtime::Buffer* fleaseMessage; - string senderHostname; - uint32_t senderPort; - }; - - - class xtreemfs_rwr_flease_msgResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_rwr_flease_msgResponse() { } - - bool operator==( const xtreemfs_rwr_flease_msgResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_rwr_flease_msgResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031287 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_flease_msgResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_rwr_notifyRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_rwr_notifyRequest() { } - - xtreemfs_rwr_notifyRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - : file_credentials( file_credentials ), file_id( file_id ) - { } - - xtreemfs_rwr_notifyRequest( const xtreemfs_rwr_notifyRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ) - { } - - virtual ~xtreemfs_rwr_notifyRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - - bool operator==( const xtreemfs_rwr_notifyRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id(); - } - - // yidl::runtime::Object - xtreemfs_rwr_notifyRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031291 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_notifyRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_rwr_notifyResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_rwr_notifyResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - }; - - - class xtreemfs_rwr_notifyResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_rwr_notifyResponse() { } - - bool operator==( const xtreemfs_rwr_notifyResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_rwr_notifyResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031291 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_notifyResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_rwr_statusRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_rwr_statusRequest() - : max_local_obj_version( 0 ) - { } - - xtreemfs_rwr_statusRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - int64_t max_local_obj_version - ) - : file_credentials( file_credentials ), - file_id( file_id ), - max_local_obj_version( max_local_obj_version ) - { } - - xtreemfs_rwr_statusRequest( const xtreemfs_rwr_statusRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - max_local_obj_version( other.get_max_local_obj_version() ) - { } - - virtual ~xtreemfs_rwr_statusRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - int64_t get_max_local_obj_version() const { return max_local_obj_version; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_max_local_obj_version( int64_t max_local_obj_version ) { this->max_local_obj_version = max_local_obj_version; } - - bool operator==( const xtreemfs_rwr_statusRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_max_local_obj_version() == other.get_max_local_obj_version(); - } - - // yidl::runtime::Object - xtreemfs_rwr_statusRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031292 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_statusRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "max_local_obj_version", 0 ), get_max_local_obj_version() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "max_local_obj_version", 0 ), max_local_obj_version ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_rwr_statusResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::ReplicaStatus& local_state - ) - { - respond - ( - *new xtreemfs_rwr_statusResponse - ( - local_state - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - int64_t max_local_obj_version; - }; - - - class xtreemfs_rwr_statusResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_rwr_statusResponse() { } - - xtreemfs_rwr_statusResponse - ( - const org::xtreemfs::interfaces::ReplicaStatus& local_state - ) - : local_state( local_state ) - { } - - xtreemfs_rwr_statusResponse( const xtreemfs_rwr_statusResponse& other ) - : local_state( other.get_local_state() ) - { } - - virtual ~xtreemfs_rwr_statusResponse() { } - - const org::xtreemfs::interfaces::ReplicaStatus& get_local_state() const { return local_state; } - void set_local_state( const org::xtreemfs::interfaces::ReplicaStatus& local_state ) { this->local_state = local_state; } - - bool operator==( const xtreemfs_rwr_statusResponse& other ) const - { - return get_local_state() == other.get_local_state(); - } - - // yidl::runtime::Object - xtreemfs_rwr_statusResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031292 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_statusResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "local_state", 0 ), get_local_state() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "local_state", 0 ), local_state ); - } - - protected: - org::xtreemfs::interfaces::ReplicaStatus local_state; - }; - - - class xtreemfs_rwr_truncateRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_rwr_truncateRequest() - : new_file_size( 0 ), object_version( 0 ) - { } - - xtreemfs_rwr_truncateRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size, - uint64_t object_version - ) - : file_credentials( file_credentials ), - file_id( file_id ), - new_file_size( new_file_size ), - object_version( object_version ) - { } - - xtreemfs_rwr_truncateRequest( const xtreemfs_rwr_truncateRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - new_file_size( other.get_new_file_size() ), - object_version( other.get_object_version() ) - { } - - virtual ~xtreemfs_rwr_truncateRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_new_file_size() const { return new_file_size; } - uint64_t get_object_version() const { return object_version; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_new_file_size( uint64_t new_file_size ) { this->new_file_size = new_file_size; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - - bool operator==( const xtreemfs_rwr_truncateRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_new_file_size() == other.get_new_file_size() - && - get_object_version() == other.get_object_version(); - } - - // yidl::runtime::Object - xtreemfs_rwr_truncateRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031290 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_truncateRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "new_file_size", 0 ), get_new_file_size() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "new_file_size", 0 ), new_file_size ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_rwr_truncateResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_rwr_truncateResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t new_file_size; - uint64_t object_version; - }; - - - class xtreemfs_rwr_truncateResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_rwr_truncateResponse() { } - - bool operator==( const xtreemfs_rwr_truncateResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_rwr_truncateResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031290 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_truncateResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_rwr_updateRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_rwr_updateRequest() - : object_number( 0 ), - object_version( 0 ), - offset( 0 ) - { } - - xtreemfs_rwr_updateRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - const org::xtreemfs::interfaces::ObjectData& object_data - ) - : file_credentials( file_credentials ), - file_id( file_id ), - object_number( object_number ), - object_version( object_version ), - offset( offset ), - object_data( object_data ) - { } - - xtreemfs_rwr_updateRequest( const xtreemfs_rwr_updateRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - object_number( other.get_object_number() ), - object_version( other.get_object_version() ), - offset( other.get_offset() ), - object_data( other.get_object_data() ) - { } - - virtual ~xtreemfs_rwr_updateRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_object_number() const { return object_number; } - uint64_t get_object_version() const { return object_version; } - uint32_t get_offset() const { return offset; } - const org::xtreemfs::interfaces::ObjectData& get_object_data() const { return object_data; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_object_number( uint64_t object_number ) { this->object_number = object_number; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - void set_offset( uint32_t offset ) { this->offset = offset; } - void set_object_data( const org::xtreemfs::interfaces::ObjectData& object_data ) { this->object_data = object_data; } - - bool operator==( const xtreemfs_rwr_updateRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_object_number() == other.get_object_number() - && - get_object_version() == other.get_object_version() - && - get_offset() == other.get_offset() - && - get_object_data() == other.get_object_data(); - } - - // yidl::runtime::Object - xtreemfs_rwr_updateRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031288 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_updateRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_number", 0 ), get_object_number() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "offset", 0 ), get_offset() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_data", 0 ), get_object_data() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_number", 0 ), object_number ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - offset = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "offset", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_data", 0 ), object_data ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_rwr_updateResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_rwr_updateResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t object_number; - uint64_t object_version; - uint32_t offset; - org::xtreemfs::interfaces::ObjectData object_data; - }; - - - class xtreemfs_rwr_updateResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_rwr_updateResponse() { } - - bool operator==( const xtreemfs_rwr_updateResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_rwr_updateResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031288 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_rwr_updateResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_internal_get_gmaxRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_internal_get_gmaxRequest() { } - - xtreemfs_internal_get_gmaxRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - : file_credentials( file_credentials ), file_id( file_id ) - { } - - xtreemfs_internal_get_gmaxRequest( const xtreemfs_internal_get_gmaxRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ) - { } - - virtual ~xtreemfs_internal_get_gmaxRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - - bool operator==( const xtreemfs_internal_get_gmaxRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id(); - } - - // yidl::runtime::Object - xtreemfs_internal_get_gmaxRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031256 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_get_gmaxRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_internal_get_gmaxResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::InternalGmax& _return_value - ) - { - respond - ( - *new xtreemfs_internal_get_gmaxResponse - ( - _return_value - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - }; - - - class xtreemfs_internal_get_gmaxResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_internal_get_gmaxResponse() { } - - xtreemfs_internal_get_gmaxResponse - ( - const org::xtreemfs::interfaces::InternalGmax& _return_value - ) - : _return_value( _return_value ) - { } - - xtreemfs_internal_get_gmaxResponse( const xtreemfs_internal_get_gmaxResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_internal_get_gmaxResponse() { } - - const org::xtreemfs::interfaces::InternalGmax& get__return_value() const { return _return_value; } - void set__return_value( const org::xtreemfs::interfaces::InternalGmax& _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_internal_get_gmaxResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_internal_get_gmaxResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031256 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_get_gmaxResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - org::xtreemfs::interfaces::InternalGmax _return_value; - }; - - - class xtreemfs_internal_truncateRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_internal_truncateRequest() - : new_file_size( 0 ) - { } - - xtreemfs_internal_truncateRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size - ) - : file_credentials( file_credentials ), - file_id( file_id ), - new_file_size( new_file_size ) - { } - - xtreemfs_internal_truncateRequest( const xtreemfs_internal_truncateRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - new_file_size( other.get_new_file_size() ) - { } - - virtual ~xtreemfs_internal_truncateRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_new_file_size() const { return new_file_size; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_new_file_size( uint64_t new_file_size ) { this->new_file_size = new_file_size; } - - bool operator==( const xtreemfs_internal_truncateRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_new_file_size() == other.get_new_file_size(); - } - - // yidl::runtime::Object - xtreemfs_internal_truncateRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031257 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_truncateRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "new_file_size", 0 ), get_new_file_size() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "new_file_size", 0 ), new_file_size ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_internal_truncateResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { - respond - ( - *new xtreemfs_internal_truncateResponse - ( - osd_write_response - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t new_file_size; - }; - - - class xtreemfs_internal_truncateResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_internal_truncateResponse() { } - - xtreemfs_internal_truncateResponse - ( - const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - : osd_write_response( osd_write_response ) - { } - - xtreemfs_internal_truncateResponse( const xtreemfs_internal_truncateResponse& other ) - : osd_write_response( other.get_osd_write_response() ) - { } - - virtual ~xtreemfs_internal_truncateResponse() { } - - const org::xtreemfs::interfaces::OSDWriteResponse& get_osd_write_response() const { return osd_write_response; } - void set_osd_write_response( const org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response ) { this->osd_write_response = osd_write_response; } - - bool operator==( const xtreemfs_internal_truncateResponse& other ) const - { - return get_osd_write_response() == other.get_osd_write_response(); - } - - // yidl::runtime::Object - xtreemfs_internal_truncateResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031257 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_truncateResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "osd_write_response", 0 ), get_osd_write_response() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "osd_write_response", 0 ), osd_write_response ); - } - - protected: - org::xtreemfs::interfaces::OSDWriteResponse osd_write_response; - }; - - - class xtreemfs_internal_get_file_sizeRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_internal_get_file_sizeRequest() { } - - xtreemfs_internal_get_file_sizeRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - : file_credentials( file_credentials ), file_id( file_id ) - { } - - xtreemfs_internal_get_file_sizeRequest( const xtreemfs_internal_get_file_sizeRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ) - { } - - virtual ~xtreemfs_internal_get_file_sizeRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - - bool operator==( const xtreemfs_internal_get_file_sizeRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id(); - } - - // yidl::runtime::Object - xtreemfs_internal_get_file_sizeRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031258 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_get_file_sizeRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_internal_get_file_sizeResponse; - } - - virtual void respond( uint64_t _return_value ) - { - respond( *new xtreemfs_internal_get_file_sizeResponse( _return_value ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - }; - - - class xtreemfs_internal_get_file_sizeResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_internal_get_file_sizeResponse() - : _return_value( 0 ) - { } - - xtreemfs_internal_get_file_sizeResponse( uint64_t _return_value ) - : _return_value( _return_value ) - { } - - xtreemfs_internal_get_file_sizeResponse( const xtreemfs_internal_get_file_sizeResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_internal_get_file_sizeResponse() { } - - uint64_t get__return_value() const { return _return_value; } - void set__return_value( uint64_t _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_internal_get_file_sizeResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_internal_get_file_sizeResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031258 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_get_file_sizeResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - uint64_t _return_value; - }; - - - class xtreemfs_internal_read_localRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_internal_read_localRequest() - : object_number( 0 ), - object_version( 0 ), - offset( 0 ), - length( 0 ), - attach_object_list( false ) - { } - - xtreemfs_internal_read_localRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint64_t offset, - uint64_t length, - bool attach_object_list, - const org::xtreemfs::interfaces::ObjectListSet& required_objects - ) - : file_credentials( file_credentials ), - file_id( file_id ), - object_number( object_number ), - object_version( object_version ), - offset( offset ), - length( length ), - attach_object_list( attach_object_list ), - required_objects( required_objects ) - { } - - xtreemfs_internal_read_localRequest( const xtreemfs_internal_read_localRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - object_number( other.get_object_number() ), - object_version( other.get_object_version() ), - offset( other.get_offset() ), - length( other.get_length() ), - attach_object_list( other.get_attach_object_list() ), - required_objects( other.get_required_objects() ) - { } - - virtual ~xtreemfs_internal_read_localRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - uint64_t get_object_number() const { return object_number; } - uint64_t get_object_version() const { return object_version; } - uint64_t get_offset() const { return offset; } - uint64_t get_length() const { return length; } - bool get_attach_object_list() const { return attach_object_list; } - const org::xtreemfs::interfaces::ObjectListSet& get_required_objects() const { return required_objects; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_object_number( uint64_t object_number ) { this->object_number = object_number; } - void set_object_version( uint64_t object_version ) { this->object_version = object_version; } - void set_offset( uint64_t offset ) { this->offset = offset; } - void set_length( uint64_t length ) { this->length = length; } - void set_attach_object_list( bool attach_object_list ) { this->attach_object_list = attach_object_list; } - void set_required_objects( const org::xtreemfs::interfaces::ObjectListSet& required_objects ) { this->required_objects = required_objects; } - - bool operator==( const xtreemfs_internal_read_localRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_object_number() == other.get_object_number() - && - get_object_version() == other.get_object_version() - && - get_offset() == other.get_offset() - && - get_length() == other.get_length() - && - get_attach_object_list() == other.get_attach_object_list() - && - get_required_objects() == other.get_required_objects(); - } - - // yidl::runtime::Object - xtreemfs_internal_read_localRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031259 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_read_localRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_number", 0 ), get_object_number() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "object_version", 0 ), get_object_version() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "offset", 0 ), get_offset() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "length", 0 ), get_length() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "attach_object_list", 0 ), get_attach_object_list() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "required_objects", 0 ), get_required_objects() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_number", 0 ), object_number ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "object_version", 0 ), object_version ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "offset", 0 ), offset ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "length", 0 ), length ); - attach_object_list = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "attach_object_list", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "required_objects", 0 ), required_objects ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_internal_read_localResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::InternalReadLocalResponse& _return_value - ) - { - respond - ( - *new xtreemfs_internal_read_localResponse - ( - _return_value - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - uint64_t object_number; - uint64_t object_version; - uint64_t offset; - uint64_t length; - bool attach_object_list; - org::xtreemfs::interfaces::ObjectListSet required_objects; - }; - - - class xtreemfs_internal_read_localResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_internal_read_localResponse() { } - - xtreemfs_internal_read_localResponse - ( - const org::xtreemfs::interfaces::InternalReadLocalResponse& _return_value - ) - : _return_value( _return_value ) - { } - - xtreemfs_internal_read_localResponse( const xtreemfs_internal_read_localResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_internal_read_localResponse() { } - - const org::xtreemfs::interfaces::InternalReadLocalResponse& get__return_value() const { return _return_value; } - void set__return_value( const org::xtreemfs::interfaces::InternalReadLocalResponse& _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_internal_read_localResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_internal_read_localResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031259 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_read_localResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - org::xtreemfs::interfaces::InternalReadLocalResponse _return_value; - }; - - - class xtreemfs_internal_get_object_setRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_internal_get_object_setRequest() { } - - xtreemfs_internal_get_object_setRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - : file_credentials( file_credentials ), file_id( file_id ) - { } - - xtreemfs_internal_get_object_setRequest( const xtreemfs_internal_get_object_setRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ) - { } - - virtual ~xtreemfs_internal_get_object_setRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - - bool operator==( const xtreemfs_internal_get_object_setRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id(); - } - - // yidl::runtime::Object - xtreemfs_internal_get_object_setRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031260 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_get_object_setRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_internal_get_object_setResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::ObjectList& _return_value - ) - { - respond - ( - *new xtreemfs_internal_get_object_setResponse - ( - _return_value - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - }; - - - class xtreemfs_internal_get_object_setResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_internal_get_object_setResponse() { } - - xtreemfs_internal_get_object_setResponse - ( - const org::xtreemfs::interfaces::ObjectList& _return_value - ) - : _return_value( _return_value ) - { } - - xtreemfs_internal_get_object_setResponse( const xtreemfs_internal_get_object_setResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_internal_get_object_setResponse() { } - - const org::xtreemfs::interfaces::ObjectList& get__return_value() const { return _return_value; } - void set__return_value( const org::xtreemfs::interfaces::ObjectList& _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_internal_get_object_setResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_internal_get_object_setResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031260 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_internal_get_object_setResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - org::xtreemfs::interfaces::ObjectList _return_value; - }; - - - class xtreemfs_lock_acquireRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_lock_acquireRequest() - : client_pid( 0 ), - offset( 0 ), - length( 0 ), - exclusive( false ) - { } - - xtreemfs_lock_acquireRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& client_uuid, - int32_t client_pid, - const string& file_id, - uint64_t offset, - uint64_t length, - bool exclusive - ) - : file_credentials( file_credentials ), - client_uuid( client_uuid ), - client_pid( client_pid ), - file_id( file_id ), - offset( offset ), - length( length ), - exclusive( exclusive ) - { } - - xtreemfs_lock_acquireRequest( const xtreemfs_lock_acquireRequest& other ) - : file_credentials( other.get_file_credentials() ), - client_uuid( other.get_client_uuid() ), - client_pid( other.get_client_pid() ), - file_id( other.get_file_id() ), - offset( other.get_offset() ), - length( other.get_length() ), - exclusive( other.get_exclusive() ) - { } - - virtual ~xtreemfs_lock_acquireRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_client_uuid() const { return client_uuid; } - int32_t get_client_pid() const { return client_pid; } - const string& get_file_id() const { return file_id; } - uint64_t get_offset() const { return offset; } - uint64_t get_length() const { return length; } - bool get_exclusive() const { return exclusive; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_client_uuid( const string& client_uuid ) { this->client_uuid = client_uuid; } - void set_client_pid( int32_t client_pid ) { this->client_pid = client_pid; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_offset( uint64_t offset ) { this->offset = offset; } - void set_length( uint64_t length ) { this->length = length; } - void set_exclusive( bool exclusive ) { this->exclusive = exclusive; } - - bool operator==( const xtreemfs_lock_acquireRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_client_uuid() == other.get_client_uuid() - && - get_client_pid() == other.get_client_pid() - && - get_file_id() == other.get_file_id() - && - get_offset() == other.get_offset() - && - get_length() == other.get_length() - && - get_exclusive() == other.get_exclusive(); - } - - // yidl::runtime::Object - xtreemfs_lock_acquireRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031266 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lock_acquireRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_uuid", 0 ), get_client_uuid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_pid", 0 ), get_client_pid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "offset", 0 ), get_offset() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "length", 0 ), get_length() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "exclusive", 0 ), get_exclusive() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_uuid", 0 ), client_uuid ); - client_pid = unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_pid", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "offset", 0 ), offset ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "length", 0 ), length ); - exclusive = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "exclusive", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_lock_acquireResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::Lock& _return_value ) - { - respond( *new xtreemfs_lock_acquireResponse( _return_value ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string client_uuid; - int32_t client_pid; - string file_id; - uint64_t offset; - uint64_t length; - bool exclusive; - }; - - - class xtreemfs_lock_acquireResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_lock_acquireResponse() { } - - xtreemfs_lock_acquireResponse - ( - const org::xtreemfs::interfaces::Lock& _return_value - ) - : _return_value( _return_value ) - { } - - xtreemfs_lock_acquireResponse( const xtreemfs_lock_acquireResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_lock_acquireResponse() { } - - const org::xtreemfs::interfaces::Lock& get__return_value() const { return _return_value; } - void set__return_value( const org::xtreemfs::interfaces::Lock& _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_lock_acquireResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_lock_acquireResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031266 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lock_acquireResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - org::xtreemfs::interfaces::Lock _return_value; - }; - - - class xtreemfs_lock_checkRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_lock_checkRequest() - : client_pid( 0 ), - offset( 0 ), - length( 0 ), - exclusive( false ) - { } - - xtreemfs_lock_checkRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& client_uuid, - int32_t client_pid, - const string& file_id, - uint64_t offset, - uint64_t length, - bool exclusive - ) - : file_credentials( file_credentials ), - client_uuid( client_uuid ), - client_pid( client_pid ), - file_id( file_id ), - offset( offset ), - length( length ), - exclusive( exclusive ) - { } - - xtreemfs_lock_checkRequest( const xtreemfs_lock_checkRequest& other ) - : file_credentials( other.get_file_credentials() ), - client_uuid( other.get_client_uuid() ), - client_pid( other.get_client_pid() ), - file_id( other.get_file_id() ), - offset( other.get_offset() ), - length( other.get_length() ), - exclusive( other.get_exclusive() ) - { } - - virtual ~xtreemfs_lock_checkRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_client_uuid() const { return client_uuid; } - int32_t get_client_pid() const { return client_pid; } - const string& get_file_id() const { return file_id; } - uint64_t get_offset() const { return offset; } - uint64_t get_length() const { return length; } - bool get_exclusive() const { return exclusive; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_client_uuid( const string& client_uuid ) { this->client_uuid = client_uuid; } - void set_client_pid( int32_t client_pid ) { this->client_pid = client_pid; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_offset( uint64_t offset ) { this->offset = offset; } - void set_length( uint64_t length ) { this->length = length; } - void set_exclusive( bool exclusive ) { this->exclusive = exclusive; } - - bool operator==( const xtreemfs_lock_checkRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_client_uuid() == other.get_client_uuid() - && - get_client_pid() == other.get_client_pid() - && - get_file_id() == other.get_file_id() - && - get_offset() == other.get_offset() - && - get_length() == other.get_length() - && - get_exclusive() == other.get_exclusive(); - } - - // yidl::runtime::Object - xtreemfs_lock_checkRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031267 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lock_checkRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_uuid", 0 ), get_client_uuid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "client_pid", 0 ), get_client_pid() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "offset", 0 ), get_offset() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "length", 0 ), get_length() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "exclusive", 0 ), get_exclusive() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_uuid", 0 ), client_uuid ); - client_pid = unmarshaller.read_int32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "client_pid", 0 ) ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "offset", 0 ), offset ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "length", 0 ), length ); - exclusive = unmarshaller.read_bool( ::yidl::runtime::Unmarshaller::StringLiteralKey( "exclusive", 0 ) ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_lock_checkResponse; - } - - virtual void respond( const org::xtreemfs::interfaces::Lock& _return_value ) - { - respond( *new xtreemfs_lock_checkResponse( _return_value ) ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string client_uuid; - int32_t client_pid; - string file_id; - uint64_t offset; - uint64_t length; - bool exclusive; - }; - - - class xtreemfs_lock_checkResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_lock_checkResponse() { } - - xtreemfs_lock_checkResponse - ( - const org::xtreemfs::interfaces::Lock& _return_value - ) - : _return_value( _return_value ) - { } - - xtreemfs_lock_checkResponse( const xtreemfs_lock_checkResponse& other ) - : _return_value( other.get__return_value() ) - { } - - virtual ~xtreemfs_lock_checkResponse() { } - - const org::xtreemfs::interfaces::Lock& get__return_value() const { return _return_value; } - void set__return_value( const org::xtreemfs::interfaces::Lock& _return_value ) { this->_return_value = _return_value; } - - bool operator==( const xtreemfs_lock_checkResponse& other ) const - { - return get__return_value() == other.get__return_value(); - } - - // yidl::runtime::Object - xtreemfs_lock_checkResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031267 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lock_checkResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "_return_value", 0 ), get__return_value() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "_return_value", 0 ), _return_value ); - } - - protected: - org::xtreemfs::interfaces::Lock _return_value; - }; - - - class xtreemfs_lock_releaseRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_lock_releaseRequest() { } - - xtreemfs_lock_releaseRequest - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - const org::xtreemfs::interfaces::Lock& lock - ) - : file_credentials( file_credentials ), file_id( file_id ), lock( lock ) - { } - - xtreemfs_lock_releaseRequest( const xtreemfs_lock_releaseRequest& other ) - : file_credentials( other.get_file_credentials() ), - file_id( other.get_file_id() ), - lock( other.get_lock() ) - { } - - virtual ~xtreemfs_lock_releaseRequest() { } - - const org::xtreemfs::interfaces::FileCredentials& get_file_credentials() const { return file_credentials; } - const string& get_file_id() const { return file_id; } - const org::xtreemfs::interfaces::Lock& get_lock() const { return lock; } - void set_file_credentials( const org::xtreemfs::interfaces::FileCredentials& file_credentials ) { this->file_credentials = file_credentials; } - void set_file_id( const string& file_id ) { this->file_id = file_id; } - void set_lock( const org::xtreemfs::interfaces::Lock& lock ) { this->lock = lock; } - - bool operator==( const xtreemfs_lock_releaseRequest& other ) const - { - return get_file_credentials() == other.get_file_credentials() - && - get_file_id() == other.get_file_id() - && - get_lock() == other.get_lock(); - } - - // yidl::runtime::Object - xtreemfs_lock_releaseRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031268 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lock_releaseRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_credentials", 0 ), get_file_credentials() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "file_id", 0 ), get_file_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "lock", 0 ), get_lock() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_credentials", 0 ), file_credentials ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "file_id", 0 ), file_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "lock", 0 ), lock ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_lock_releaseResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_lock_releaseResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::FileCredentials file_credentials; - string file_id; - org::xtreemfs::interfaces::Lock lock; - }; - - - class xtreemfs_lock_releaseResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_lock_releaseResponse() { } - - bool operator==( const xtreemfs_lock_releaseResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_lock_releaseResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031268 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_lock_releaseResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class xtreemfs_pingRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - xtreemfs_pingRequest() { } - - xtreemfs_pingRequest - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& coordinates - ) - : coordinates( coordinates ) - { } - - xtreemfs_pingRequest( const xtreemfs_pingRequest& other ) - : coordinates( other.get_coordinates() ) - { } - - virtual ~xtreemfs_pingRequest() { } - - const org::xtreemfs::interfaces::VivaldiCoordinates& get_coordinates() const { return coordinates; } - void set_coordinates( const org::xtreemfs::interfaces::VivaldiCoordinates& coordinates ) { this->coordinates = coordinates; } - - bool operator==( const xtreemfs_pingRequest& other ) const - { - return get_coordinates() == other.get_coordinates(); - } - - // yidl::runtime::Object - xtreemfs_pingRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031276 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_pingRequest"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "coordinates", 0 ), get_coordinates() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "coordinates", 0 ), coordinates ); - } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_pingResponse; - } - - virtual void - respond - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& remote_coordinates - ) - { - respond - ( - *new xtreemfs_pingResponse - ( - remote_coordinates - ) - ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - - protected: - org::xtreemfs::interfaces::VivaldiCoordinates coordinates; - }; - - - class xtreemfs_pingResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - xtreemfs_pingResponse() { } - - xtreemfs_pingResponse - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& remote_coordinates - ) - : remote_coordinates( remote_coordinates ) - { } - - xtreemfs_pingResponse( const xtreemfs_pingResponse& other ) - : remote_coordinates( other.get_remote_coordinates() ) - { } - - virtual ~xtreemfs_pingResponse() { } - - const org::xtreemfs::interfaces::VivaldiCoordinates& get_remote_coordinates() const { return remote_coordinates; } - void set_remote_coordinates( const org::xtreemfs::interfaces::VivaldiCoordinates& remote_coordinates ) { this->remote_coordinates = remote_coordinates; } - - bool operator==( const xtreemfs_pingResponse& other ) const - { - return get_remote_coordinates() == other.get_remote_coordinates(); - } - - // yidl::runtime::Object - xtreemfs_pingResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031276 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_pingResponse"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "remote_coordinates", 0 ), get_remote_coordinates() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "remote_coordinates", 0 ), remote_coordinates ); - } - - protected: - org::xtreemfs::interfaces::VivaldiCoordinates remote_coordinates; - }; - - - class xtreemfs_shutdownRequest : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_PARENT_CLASS - { - public: - virtual ~xtreemfs_shutdownRequest() { } - - bool operator==( const xtreemfs_shutdownRequest& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_shutdownRequest& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031286 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_shutdownRequest"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - - // yield::concurrency::Request - virtual ::yield::concurrency::Response* createDefaultResponse() - { - return new xtreemfs_shutdownResponse; - } - - virtual void respond() - { - respond( *new xtreemfs_shutdownResponse() ); - } - - virtual void respond( ::yield::concurrency::Response& response ) - { - Request::respond( response ); - } - }; - - - class xtreemfs_shutdownResponse : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_RESPONSE_PARENT_CLASS - { - public: - virtual ~xtreemfs_shutdownResponse() { } - - bool operator==( const xtreemfs_shutdownResponse& ) const { return true; } - - // yidl::runtime::Object - xtreemfs_shutdownResponse& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031286 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "xtreemfs_shutdownResponse"; } - - void marshal( ::yidl::runtime::Marshaller& ) const { } - void unmarshal( ::yidl::runtime::Unmarshaller& ) { } - }; - - - class ConcurrentModificationException : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - ConcurrentModificationException() { } - ConcurrentModificationException( const string& stack_trace ) : stack_trace( stack_trace ) { } - virtual ~ConcurrentModificationException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031217 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ConcurrentModificationException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new ConcurrentModificationException( get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw ConcurrentModificationException( get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class errnoException : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - errnoException() { } - errnoException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code ) { } - errnoException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - errnoException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - errnoException( uint32_t error_code, const char* error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - errnoException( uint32_t error_code, const string& error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - errnoException( uint32_t error_code, const string& error_message, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ), stack_trace( stack_trace ) { } - virtual ~errnoException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031218 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "errnoException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new errnoException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw errnoException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class InvalidArgumentException : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - InvalidArgumentException() { } - InvalidArgumentException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - InvalidArgumentException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - virtual ~InvalidArgumentException() throw() { ; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031219 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "InvalidArgumentException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new InvalidArgumentException( get_error_message() ); - } - - virtual void throwStackClone() const - { - throw InvalidArgumentException( get_error_message() ); - } - }; - - - class OSDException : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - OSDException() { } - OSDException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code ) { } - OSDException( const char* error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - OSDException( const string& error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_message ) { } - OSDException( uint32_t error_code, const char* error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - OSDException( uint32_t error_code, const string& error_message ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ) { } - OSDException( uint32_t error_code, const string& error_message, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code, error_message ), stack_trace( stack_trace ) { } - virtual ~OSDException() throw() { ; } - - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031220 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "OSDException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_message", 0 ), get_error_message() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - string error_message; unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_message", 0 ), error_message ); set_error_message( error_message ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new OSDException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw OSDException( get_error_code(), get_error_message(), get_stack_trace() ); - } - - protected: - string stack_trace; - }; - - - class ProtocolException : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - ProtocolException() : accept_stat( 0 ) { } - ProtocolException( uint32_t error_code ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code ), accept_stat( 0 ) { } - ProtocolException( uint32_t accept_stat, uint32_t error_code, const string& stack_trace ) : ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS( error_code ), accept_stat( accept_stat ), stack_trace( stack_trace ) { } - virtual ~ProtocolException() throw() { ; } - - uint32_t get_accept_stat() const { return accept_stat; } - void set_accept_stat( uint32_t accept_stat ) { this->accept_stat = accept_stat; } - const string& get_stack_trace() const { return stack_trace; } - void set_stack_trace( const string& stack_trace ) { this->stack_trace = stack_trace; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031221 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ProtocolException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "accept_stat", 0 ), get_accept_stat() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "error_code", 0 ), get_error_code() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "stack_trace", 0 ), get_stack_trace() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - accept_stat = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "accept_stat", 0 ) ); - uint32_t error_code; error_code = unmarshaller.read_uint32( ::yidl::runtime::Unmarshaller::StringLiteralKey( "error_code", 0 ) ); set_error_code( error_code ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "stack_trace", 0 ), stack_trace ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new ProtocolException( get_accept_stat(), get_error_code(), get_stack_trace() ); - } - - virtual void throwStackClone() const - { - throw ProtocolException( get_accept_stat(), get_error_code(), get_stack_trace() ); - } - - protected: - uint32_t accept_stat; - string stack_trace; - }; - - - class RedirectException : public ORG_XTREEMFS_INTERFACES_OSDINTERFACE_EXCEPTION_PARENT_CLASS - { - public: - RedirectException() { } - RedirectException( const string& to_uuid ) : to_uuid( to_uuid ) { } - virtual ~RedirectException() throw() { ; } - - const string& get_to_uuid() const { return to_uuid; } - void set_to_uuid( const string& to_uuid ) { this->to_uuid = to_uuid; } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010031222 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "RedirectException"; } - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "to_uuid", 0 ), get_to_uuid() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "to_uuid", 0 ), to_uuid ); - } - - // yield::concurrency::Exception - virtual ::yield::concurrency::Exception& clone() const - { - return *new RedirectException( get_to_uuid() ); - } - - virtual void throwStackClone() const - { - throw RedirectException( get_to_uuid() ); - } - - protected: - string to_uuid; - }; - }; - - - class OSDInterfaceMessageFactory - : public ::yield::concurrency::MessageFactory, - private OSDInterfaceMessages - { - public: - // yield::concurrency::MessageFactory - virtual ::yield::concurrency::Exception* createException( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031217: return new ConcurrentModificationException; - case 2010031218: return new errnoException; - case 2010031219: return new InvalidArgumentException; - case 2010031220: return new OSDException; - case 2010031221: return new ProtocolException; - case 2010031222: return new RedirectException; - default: return NULL; - } - } - - virtual ::yield::concurrency::Exception* - createException - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 31 && strncmp( type_name, "ConcurrentModificationException", 31 ) == 0 ) return new ConcurrentModificationException; - else if ( type_name_len == 14 && strncmp( type_name, "errnoException", 14 ) == 0 ) return new errnoException; - else if ( type_name_len == 24 && strncmp( type_name, "InvalidArgumentException", 24 ) == 0 ) return new InvalidArgumentException; - else if ( type_name_len == 12 && strncmp( type_name, "OSDException", 12 ) == 0 ) return new OSDException; - else if ( type_name_len == 17 && strncmp( type_name, "ProtocolException", 17 ) == 0 ) return new ProtocolException; - else if ( type_name_len == 17 && strncmp( type_name, "RedirectException", 17 ) == 0 ) return new RedirectException; - else return NULL; - } - - virtual ::yield::concurrency::Request* createRequest( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031226: return new readRequest; - case 2010031227: return new truncateRequest; - case 2010031228: return new unlinkRequest; - case 2010031229: return new writeRequest; - case 2010031236: return new xtreemfs_broadcast_gmaxRequest; - case 2010031237: return new xtreemfs_check_objectRequest; - case 2010031246: return new xtreemfs_cleanup_get_resultsRequest; - case 2010031247: return new xtreemfs_cleanup_is_runningRequest; - case 2010031248: return new xtreemfs_cleanup_startRequest; - case 2010031249: return new xtreemfs_cleanup_statusRequest; - case 2010031250: return new xtreemfs_cleanup_stopRequest; - case 2010031289: return new xtreemfs_rwr_fetchRequest; - case 2010031287: return new xtreemfs_rwr_flease_msgRequest; - case 2010031291: return new xtreemfs_rwr_notifyRequest; - case 2010031292: return new xtreemfs_rwr_statusRequest; - case 2010031290: return new xtreemfs_rwr_truncateRequest; - case 2010031288: return new xtreemfs_rwr_updateRequest; - case 2010031256: return new xtreemfs_internal_get_gmaxRequest; - case 2010031257: return new xtreemfs_internal_truncateRequest; - case 2010031258: return new xtreemfs_internal_get_file_sizeRequest; - case 2010031259: return new xtreemfs_internal_read_localRequest; - case 2010031260: return new xtreemfs_internal_get_object_setRequest; - case 2010031266: return new xtreemfs_lock_acquireRequest; - case 2010031267: return new xtreemfs_lock_checkRequest; - case 2010031268: return new xtreemfs_lock_releaseRequest; - case 2010031276: return new xtreemfs_pingRequest; - case 2010031286: return new xtreemfs_shutdownRequest; - default: return NULL; - } - } - - virtual ::yield::concurrency::Request* - createRequest - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 11 && strncmp( type_name, "readRequest", 11 ) == 0 ) return new readRequest; - else if ( type_name_len == 15 && strncmp( type_name, "truncateRequest", 15 ) == 0 ) return new truncateRequest; - else if ( type_name_len == 13 && strncmp( type_name, "unlinkRequest", 13 ) == 0 ) return new unlinkRequest; - else if ( type_name_len == 12 && strncmp( type_name, "writeRequest", 12 ) == 0 ) return new writeRequest; - else if ( type_name_len == 30 && strncmp( type_name, "xtreemfs_broadcast_gmaxRequest", 30 ) == 0 ) return new xtreemfs_broadcast_gmaxRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_check_objectRequest", 28 ) == 0 ) return new xtreemfs_check_objectRequest; - else if ( type_name_len == 35 && strncmp( type_name, "xtreemfs_cleanup_get_resultsRequest", 35 ) == 0 ) return new xtreemfs_cleanup_get_resultsRequest; - else if ( type_name_len == 34 && strncmp( type_name, "xtreemfs_cleanup_is_runningRequest", 34 ) == 0 ) return new xtreemfs_cleanup_is_runningRequest; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_cleanup_startRequest", 29 ) == 0 ) return new xtreemfs_cleanup_startRequest; - else if ( type_name_len == 30 && strncmp( type_name, "xtreemfs_cleanup_statusRequest", 30 ) == 0 ) return new xtreemfs_cleanup_statusRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_cleanup_stopRequest", 28 ) == 0 ) return new xtreemfs_cleanup_stopRequest; - else if ( type_name_len == 25 && strncmp( type_name, "xtreemfs_rwr_fetchRequest", 25 ) == 0 ) return new xtreemfs_rwr_fetchRequest; - else if ( type_name_len == 30 && strncmp( type_name, "xtreemfs_rwr_flease_msgRequest", 30 ) == 0 ) return new xtreemfs_rwr_flease_msgRequest; - else if ( type_name_len == 26 && strncmp( type_name, "xtreemfs_rwr_notifyRequest", 26 ) == 0 ) return new xtreemfs_rwr_notifyRequest; - else if ( type_name_len == 26 && strncmp( type_name, "xtreemfs_rwr_statusRequest", 26 ) == 0 ) return new xtreemfs_rwr_statusRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_rwr_truncateRequest", 28 ) == 0 ) return new xtreemfs_rwr_truncateRequest; - else if ( type_name_len == 26 && strncmp( type_name, "xtreemfs_rwr_updateRequest", 26 ) == 0 ) return new xtreemfs_rwr_updateRequest; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_internal_get_gmaxRequest", 33 ) == 0 ) return new xtreemfs_internal_get_gmaxRequest; - else if ( type_name_len == 33 && strncmp( type_name, "xtreemfs_internal_truncateRequest", 33 ) == 0 ) return new xtreemfs_internal_truncateRequest; - else if ( type_name_len == 38 && strncmp( type_name, "xtreemfs_internal_get_file_sizeRequest", 38 ) == 0 ) return new xtreemfs_internal_get_file_sizeRequest; - else if ( type_name_len == 35 && strncmp( type_name, "xtreemfs_internal_read_localRequest", 35 ) == 0 ) return new xtreemfs_internal_read_localRequest; - else if ( type_name_len == 39 && strncmp( type_name, "xtreemfs_internal_get_object_setRequest", 39 ) == 0 ) return new xtreemfs_internal_get_object_setRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_lock_acquireRequest", 28 ) == 0 ) return new xtreemfs_lock_acquireRequest; - else if ( type_name_len == 26 && strncmp( type_name, "xtreemfs_lock_checkRequest", 26 ) == 0 ) return new xtreemfs_lock_checkRequest; - else if ( type_name_len == 28 && strncmp( type_name, "xtreemfs_lock_releaseRequest", 28 ) == 0 ) return new xtreemfs_lock_releaseRequest; - else if ( type_name_len == 20 && strncmp( type_name, "xtreemfs_pingRequest", 20 ) == 0 ) return new xtreemfs_pingRequest; - else if ( type_name_len == 24 && strncmp( type_name, "xtreemfs_shutdownRequest", 24 ) == 0 ) return new xtreemfs_shutdownRequest; - else return NULL; - } - - virtual ::yield::concurrency::Response* createResponse( uint32_t type_id ) - { - switch ( type_id ) - { - case 2010031226: return new readResponse; - case 2010031227: return new truncateResponse; - case 2010031228: return new unlinkResponse; - case 2010031229: return new writeResponse; - case 2010031236: return new xtreemfs_broadcast_gmaxResponse; - case 2010031237: return new xtreemfs_check_objectResponse; - case 2010031246: return new xtreemfs_cleanup_get_resultsResponse; - case 2010031247: return new xtreemfs_cleanup_is_runningResponse; - case 2010031248: return new xtreemfs_cleanup_startResponse; - case 2010031249: return new xtreemfs_cleanup_statusResponse; - case 2010031250: return new xtreemfs_cleanup_stopResponse; - case 2010031289: return new xtreemfs_rwr_fetchResponse; - case 2010031287: return new xtreemfs_rwr_flease_msgResponse; - case 2010031291: return new xtreemfs_rwr_notifyResponse; - case 2010031292: return new xtreemfs_rwr_statusResponse; - case 2010031290: return new xtreemfs_rwr_truncateResponse; - case 2010031288: return new xtreemfs_rwr_updateResponse; - case 2010031256: return new xtreemfs_internal_get_gmaxResponse; - case 2010031257: return new xtreemfs_internal_truncateResponse; - case 2010031258: return new xtreemfs_internal_get_file_sizeResponse; - case 2010031259: return new xtreemfs_internal_read_localResponse; - case 2010031260: return new xtreemfs_internal_get_object_setResponse; - case 2010031266: return new xtreemfs_lock_acquireResponse; - case 2010031267: return new xtreemfs_lock_checkResponse; - case 2010031268: return new xtreemfs_lock_releaseResponse; - case 2010031276: return new xtreemfs_pingResponse; - case 2010031286: return new xtreemfs_shutdownResponse; - default: return NULL; - } - } - - virtual ::yield::concurrency::Response* - createResponse - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 12 && strncmp( type_name, "readResponse", 12 ) == 0 ) return new readResponse; - else if ( type_name_len == 16 && strncmp( type_name, "truncateResponse", 16 ) == 0 ) return new truncateResponse; - else if ( type_name_len == 14 && strncmp( type_name, "unlinkResponse", 14 ) == 0 ) return new unlinkResponse; - else if ( type_name_len == 13 && strncmp( type_name, "writeResponse", 13 ) == 0 ) return new writeResponse; - else if ( type_name_len == 31 && strncmp( type_name, "xtreemfs_broadcast_gmaxResponse", 31 ) == 0 ) return new xtreemfs_broadcast_gmaxResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_check_objectResponse", 29 ) == 0 ) return new xtreemfs_check_objectResponse; - else if ( type_name_len == 36 && strncmp( type_name, "xtreemfs_cleanup_get_resultsResponse", 36 ) == 0 ) return new xtreemfs_cleanup_get_resultsResponse; - else if ( type_name_len == 35 && strncmp( type_name, "xtreemfs_cleanup_is_runningResponse", 35 ) == 0 ) return new xtreemfs_cleanup_is_runningResponse; - else if ( type_name_len == 30 && strncmp( type_name, "xtreemfs_cleanup_startResponse", 30 ) == 0 ) return new xtreemfs_cleanup_startResponse; - else if ( type_name_len == 31 && strncmp( type_name, "xtreemfs_cleanup_statusResponse", 31 ) == 0 ) return new xtreemfs_cleanup_statusResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_cleanup_stopResponse", 29 ) == 0 ) return new xtreemfs_cleanup_stopResponse; - else if ( type_name_len == 26 && strncmp( type_name, "xtreemfs_rwr_fetchResponse", 26 ) == 0 ) return new xtreemfs_rwr_fetchResponse; - else if ( type_name_len == 31 && strncmp( type_name, "xtreemfs_rwr_flease_msgResponse", 31 ) == 0 ) return new xtreemfs_rwr_flease_msgResponse; - else if ( type_name_len == 27 && strncmp( type_name, "xtreemfs_rwr_notifyResponse", 27 ) == 0 ) return new xtreemfs_rwr_notifyResponse; - else if ( type_name_len == 27 && strncmp( type_name, "xtreemfs_rwr_statusResponse", 27 ) == 0 ) return new xtreemfs_rwr_statusResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_rwr_truncateResponse", 29 ) == 0 ) return new xtreemfs_rwr_truncateResponse; - else if ( type_name_len == 27 && strncmp( type_name, "xtreemfs_rwr_updateResponse", 27 ) == 0 ) return new xtreemfs_rwr_updateResponse; - else if ( type_name_len == 34 && strncmp( type_name, "xtreemfs_internal_get_gmaxResponse", 34 ) == 0 ) return new xtreemfs_internal_get_gmaxResponse; - else if ( type_name_len == 34 && strncmp( type_name, "xtreemfs_internal_truncateResponse", 34 ) == 0 ) return new xtreemfs_internal_truncateResponse; - else if ( type_name_len == 39 && strncmp( type_name, "xtreemfs_internal_get_file_sizeResponse", 39 ) == 0 ) return new xtreemfs_internal_get_file_sizeResponse; - else if ( type_name_len == 36 && strncmp( type_name, "xtreemfs_internal_read_localResponse", 36 ) == 0 ) return new xtreemfs_internal_read_localResponse; - else if ( type_name_len == 40 && strncmp( type_name, "xtreemfs_internal_get_object_setResponse", 40 ) == 0 ) return new xtreemfs_internal_get_object_setResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_lock_acquireResponse", 29 ) == 0 ) return new xtreemfs_lock_acquireResponse; - else if ( type_name_len == 27 && strncmp( type_name, "xtreemfs_lock_checkResponse", 27 ) == 0 ) return new xtreemfs_lock_checkResponse; - else if ( type_name_len == 29 && strncmp( type_name, "xtreemfs_lock_releaseResponse", 29 ) == 0 ) return new xtreemfs_lock_releaseResponse; - else if ( type_name_len == 21 && strncmp( type_name, "xtreemfs_pingResponse", 21 ) == 0 ) return new xtreemfs_pingResponse; - else if ( type_name_len == 25 && strncmp( type_name, "xtreemfs_shutdownResponse", 25 ) == 0 ) return new xtreemfs_shutdownResponse; - else return NULL; - } - - - // yidl::runtime::MarshallableObjectFactory - virtual ::yidl::runtime::MarshallableObject* - createMarshallableObject - ( - uint32_t type_id - ) - { - switch ( type_id ) - { - case 2010030933: return new OSDWriteResponse; - case 2010030942: return new FileCredentialsSet; - case 2010030973: return new ObjectVersion; - case 2010030927: return new NewFileSize; - case 2010030917: return new StringSet; - case 2010030974: return new ObjectVersionList; - case 2010030966: return new InternalGmax; - case 2010030939: return new XCap; - case 2010030972: return new ObjectListSet; - case 2010030975: return new ReplicaStatus; - case 2010030918: return new UserCredentials; - case 2010030967: return new ObjectData; - case 2010030938: return new VivaldiCoordinates; - case 2010030937: return new ReplicaSet; - case 2010030968: return new InternalReadLocalResponse; - case 2010030970: return new Lock; - case 2010030935: return new StripingPolicy; - case 2010030928: return new NewFileSizeSet; - case 2010030941: return new FileCredentials; - case 2010030936: return new Replica; - case 2010030940: return new XLocSet; - case 2010030971: return new ObjectList; - default: return NULL; - } - } - - virtual ::yidl::runtime::MarshallableObject* - createMarshallableObject - ( - const char* type_name, - size_t type_name_len - ) - { - if ( type_name_len == 16 && strncmp( type_name, "OSDWriteResponse", 16 ) == 0 ) return new OSDWriteResponse; - else if ( type_name_len == 18 && strncmp( type_name, "FileCredentialsSet", 18 ) == 0 ) return new FileCredentialsSet; - else if ( type_name_len == 13 && strncmp( type_name, "ObjectVersion", 13 ) == 0 ) return new ObjectVersion; - else if ( type_name_len == 11 && strncmp( type_name, "NewFileSize", 11 ) == 0 ) return new NewFileSize; - else if ( type_name_len == 9 && strncmp( type_name, "StringSet", 9 ) == 0 ) return new StringSet; - else if ( type_name_len == 17 && strncmp( type_name, "ObjectVersionList", 17 ) == 0 ) return new ObjectVersionList; - else if ( type_name_len == 12 && strncmp( type_name, "InternalGmax", 12 ) == 0 ) return new InternalGmax; - else if ( type_name_len == 4 && strncmp( type_name, "XCap", 4 ) == 0 ) return new XCap; - else if ( type_name_len == 13 && strncmp( type_name, "ObjectListSet", 13 ) == 0 ) return new ObjectListSet; - else if ( type_name_len == 13 && strncmp( type_name, "ReplicaStatus", 13 ) == 0 ) return new ReplicaStatus; - else if ( type_name_len == 15 && strncmp( type_name, "UserCredentials", 15 ) == 0 ) return new UserCredentials; - else if ( type_name_len == 10 && strncmp( type_name, "ObjectData", 10 ) == 0 ) return new ObjectData; - else if ( type_name_len == 18 && strncmp( type_name, "VivaldiCoordinates", 18 ) == 0 ) return new VivaldiCoordinates; - else if ( type_name_len == 10 && strncmp( type_name, "ReplicaSet", 10 ) == 0 ) return new ReplicaSet; - else if ( type_name_len == 25 && strncmp( type_name, "InternalReadLocalResponse", 25 ) == 0 ) return new InternalReadLocalResponse; - else if ( type_name_len == 4 && strncmp( type_name, "Lock", 4 ) == 0 ) return new Lock; - else if ( type_name_len == 14 && strncmp( type_name, "StripingPolicy", 14 ) == 0 ) return new StripingPolicy; - else if ( type_name_len == 14 && strncmp( type_name, "NewFileSizeSet", 14 ) == 0 ) return new NewFileSizeSet; - else if ( type_name_len == 15 && strncmp( type_name, "FileCredentials", 15 ) == 0 ) return new FileCredentials; - else if ( type_name_len == 7 && strncmp( type_name, "Replica", 7 ) == 0 ) return new Replica; - else if ( type_name_len == 7 && strncmp( type_name, "XLocSet", 7 ) == 0 ) return new XLocSet; - else if ( type_name_len == 10 && strncmp( type_name, "ObjectList", 10 ) == 0 ) return new ObjectList; - else return NULL; - } - }; - - - class OSDInterfaceRequestHandler - : public ::yield::concurrency::RequestHandler, - protected OSDInterfaceMessages - { - public: - OSDInterfaceRequestHandler() // Subclasses must implement - : _interface( NULL ) // all relevant handle*Request methods - { } - - // Steals interface_ to allow for *new - OSDInterfaceRequestHandler( OSDInterface& _interface ) - : _interface( &_interface ) - { } - - virtual ~OSDInterfaceRequestHandler() - { - delete _interface; - } - - // yield::concurrency::RequestHandler - virtual void handle( ::yield::concurrency::Request& request ) - { - // Switch on the request types that this interface handles, unwrap the corresponding requests and delegate to _interface - switch ( request.get_type_id() ) - { - case 2010031226UL: handle( static_cast( request ) ); return; - case 2010031227UL: handle( static_cast( request ) ); return; - case 2010031228UL: handle( static_cast( request ) ); return; - case 2010031229UL: handle( static_cast( request ) ); return; - case 2010031236UL: handle( static_cast( request ) ); return; - case 2010031237UL: handle( static_cast( request ) ); return; - case 2010031246UL: handle( static_cast( request ) ); return; - case 2010031247UL: handle( static_cast( request ) ); return; - case 2010031248UL: handle( static_cast( request ) ); return; - case 2010031249UL: handle( static_cast( request ) ); return; - case 2010031250UL: handle( static_cast( request ) ); return; - case 2010031289UL: handle( static_cast( request ) ); return; - case 2010031287UL: handle( static_cast( request ) ); return; - case 2010031291UL: handle( static_cast( request ) ); return; - case 2010031292UL: handle( static_cast( request ) ); return; - case 2010031290UL: handle( static_cast( request ) ); return; - case 2010031288UL: handle( static_cast( request ) ); return; - case 2010031256UL: handle( static_cast( request ) ); return; - case 2010031257UL: handle( static_cast( request ) ); return; - case 2010031258UL: handle( static_cast( request ) ); return; - case 2010031259UL: handle( static_cast( request ) ); return; - case 2010031260UL: handle( static_cast( request ) ); return; - case 2010031266UL: handle( static_cast( request ) ); return; - case 2010031267UL: handle( static_cast( request ) ); return; - case 2010031268UL: handle( static_cast( request ) ); return; - case 2010031276UL: handle( static_cast( request ) ); return; - case 2010031286UL: handle( static_cast( request ) ); return; - } - } - - protected: - - virtual void handle( readRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ObjectData object_data( __request.get_object_data() ); - - _interface->read - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_object_number(), - __request.get_object_version(), - __request.get_offset(), - __request.get_length(), - object_data - ); - - __request.respond( object_data ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( truncateRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::OSDWriteResponse osd_write_response; - - _interface->truncate - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_new_file_size(), - osd_write_response - ); - - __request.respond( osd_write_response ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( unlinkRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->unlink - ( - __request.get_file_credentials(), - __request.get_file_id() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( writeRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::OSDWriteResponse osd_write_response; - - _interface->write - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_object_number(), - __request.get_object_version(), - __request.get_offset(), - __request.get_lease_timeout(), - __request.get_object_data(), - osd_write_response - ); - - __request.respond( osd_write_response ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_broadcast_gmaxRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_broadcast_gmax - ( - __request.get_file_id(), - __request.get_truncate_epoch(), - __request.get_last_object(), - __request.get_file_size() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_check_objectRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ObjectData _return_value = - - _interface->xtreemfs_check_object - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_object_number(), - __request.get_object_version() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_cleanup_get_resultsRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::StringSet results; - - _interface->xtreemfs_cleanup_get_results( results ); - - __request.respond( results ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_cleanup_is_runningRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - bool is_running; - - _interface->xtreemfs_cleanup_is_running( is_running ); - - __request.respond( is_running ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_cleanup_startRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_cleanup_start - ( - __request.get_remove_zombies(), - __request.get_remove_unavail_volume(), - __request.get_lost_and_found() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_cleanup_statusRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - string status; - - _interface->xtreemfs_cleanup_status( status ); - - __request.respond( status ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_cleanup_stopRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_cleanup_stop(); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_rwr_fetchRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ObjectData object_data; - - _interface->xtreemfs_rwr_fetch - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_object_number(), - __request.get_object_version(), - object_data - ); - - __request.respond( object_data ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_rwr_flease_msgRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_rwr_flease_msg - ( - __request.get_fleaseMessage(), - __request.get_senderHostname(), - __request.get_senderPort() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_rwr_notifyRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_rwr_notify - ( - __request.get_file_credentials(), - __request.get_file_id() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_rwr_statusRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ReplicaStatus local_state; - - _interface->xtreemfs_rwr_status - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_max_local_obj_version(), - local_state - ); - - __request.respond( local_state ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_rwr_truncateRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_rwr_truncate - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_new_file_size(), - __request.get_object_version() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_rwr_updateRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_rwr_update - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_object_number(), - __request.get_object_version(), - __request.get_offset(), - __request.get_object_data() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_internal_get_gmaxRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::InternalGmax _return_value = - - _interface->xtreemfs_internal_get_gmax - ( - __request.get_file_credentials(), - __request.get_file_id() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_internal_truncateRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::OSDWriteResponse osd_write_response; - - _interface->xtreemfs_internal_truncate - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_new_file_size(), - osd_write_response - ); - - __request.respond( osd_write_response ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_internal_get_file_sizeRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - uint64_t _return_value = - - _interface->xtreemfs_internal_get_file_size - ( - __request.get_file_credentials(), - __request.get_file_id() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_internal_read_localRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::InternalReadLocalResponse _return_value = - - _interface->xtreemfs_internal_read_local - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_object_number(), - __request.get_object_version(), - __request.get_offset(), - __request.get_length(), - __request.get_attach_object_list(), - __request.get_required_objects() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_internal_get_object_setRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::ObjectList _return_value = - - _interface->xtreemfs_internal_get_object_set - ( - __request.get_file_credentials(), - __request.get_file_id() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_lock_acquireRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::Lock _return_value = - - _interface->xtreemfs_lock_acquire - ( - __request.get_file_credentials(), - __request.get_client_uuid(), - __request.get_client_pid(), - __request.get_file_id(), - __request.get_offset(), - __request.get_length(), - __request.get_exclusive() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_lock_checkRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::Lock _return_value = - - _interface->xtreemfs_lock_check - ( - __request.get_file_credentials(), - __request.get_client_uuid(), - __request.get_client_pid(), - __request.get_file_id(), - __request.get_offset(), - __request.get_length(), - __request.get_exclusive() - ); - - __request.respond( _return_value ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_lock_releaseRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_lock_release - ( - __request.get_file_credentials(), - __request.get_file_id(), - __request.get_lock() - ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_pingRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - org::xtreemfs::interfaces::VivaldiCoordinates remote_coordinates; - - _interface->xtreemfs_ping - ( - __request.get_coordinates(), - remote_coordinates - ); - - __request.respond( remote_coordinates ); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - virtual void handle( xtreemfs_shutdownRequest& __request ) - { - if ( _interface != NULL ) - { - try - { - _interface->xtreemfs_shutdown(); - } - catch( ::yield::concurrency::Exception* exception ) - { - __request.respond( *exception ); - } - catch ( ::yield::concurrency::Exception& exception ) - { - __request.respond( exception.clone() ); - } - catch ( ::yield::platform::Exception& exception ) - { - __request.respond( *( new ::yield::concurrency::Exception( exception ) ) ); - } - } - } - - private: - OSDInterface* _interface; - }; - - #define ORG_XTREEMFS_INTERFACES_OSDINTERFACE_REQUEST_HANDLER_PROTOTYPES \ - virtual void handle( readRequest& __request );\ - virtual void handle( truncateRequest& __request );\ - virtual void handle( unlinkRequest& __request );\ - virtual void handle( writeRequest& __request );\ - virtual void handle( xtreemfs_broadcast_gmaxRequest& __request );\ - virtual void handle( xtreemfs_check_objectRequest& __request );\ - virtual void handle( xtreemfs_cleanup_get_resultsRequest& __request );\ - virtual void handle( xtreemfs_cleanup_is_runningRequest& __request );\ - virtual void handle( xtreemfs_cleanup_startRequest& __request );\ - virtual void handle( xtreemfs_cleanup_statusRequest& __request );\ - virtual void handle( xtreemfs_cleanup_stopRequest& __request );\ - virtual void handle( xtreemfs_rwr_fetchRequest& __request );\ - virtual void handle( xtreemfs_rwr_flease_msgRequest& __request );\ - virtual void handle( xtreemfs_rwr_notifyRequest& __request );\ - virtual void handle( xtreemfs_rwr_statusRequest& __request );\ - virtual void handle( xtreemfs_rwr_truncateRequest& __request );\ - virtual void handle( xtreemfs_rwr_updateRequest& __request );\ - virtual void handle( xtreemfs_internal_get_gmaxRequest& __request );\ - virtual void handle( xtreemfs_internal_truncateRequest& __request );\ - virtual void handle( xtreemfs_internal_get_file_sizeRequest& __request );\ - virtual void handle( xtreemfs_internal_read_localRequest& __request );\ - virtual void handle( xtreemfs_internal_get_object_setRequest& __request );\ - virtual void handle( xtreemfs_lock_acquireRequest& __request );\ - virtual void handle( xtreemfs_lock_checkRequest& __request );\ - virtual void handle( xtreemfs_lock_releaseRequest& __request );\ - virtual void handle( xtreemfs_pingRequest& __request );\ - virtual void handle( xtreemfs_shutdownRequest& __request ); - - - class OSDInterfaceProxy - : public OSDInterface, - public ::yield::concurrency::RequestHandler, - private OSDInterfaceMessages - { - public: - OSDInterfaceProxy( ::yield::concurrency::EventHandler& request_handler ) - : __request_handler( request_handler ) - { } - - ~OSDInterfaceProxy() - { - ::yield::concurrency::EventHandler::dec_ref( __request_handler ); - } - - // yidl::runtime::RTTIObject - virtual const char* get_type_name() const - { - return "OSDInterfaceProxy"; - } - - // yield::concurrency::RequestHandler - virtual void handle( ::yield::concurrency::Request& request ) - { - __request_handler.handle( request ); - } - - // OSDInterface - virtual void - read - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - uint32_t length, - org::xtreemfs::interfaces::ObjectData& object_data - ) - { - readRequest* __request = new readRequest( file_credentials, file_id, object_number, object_version, offset, length, object_data ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - object_data = __response->get_object_data(); - } - - virtual void - truncate - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size, - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { - truncateRequest* __request = new truncateRequest( file_credentials, file_id, new_file_size ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - osd_write_response = __response->get_osd_write_response(); - } - - virtual void - unlink - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - { - unlinkRequest* __request = new unlinkRequest( file_credentials, file_id ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - write - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - uint64_t lease_timeout, - const org::xtreemfs::interfaces::ObjectData& object_data, - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { - writeRequest* __request = new writeRequest( file_credentials, file_id, object_number, object_version, offset, lease_timeout, object_data ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - osd_write_response = __response->get_osd_write_response(); - } - - virtual void - xtreemfs_broadcast_gmax - ( - const string& file_id, - uint64_t truncate_epoch, - uint64_t last_object, - uint64_t file_size - ) - { - xtreemfs_broadcast_gmaxRequest* __request = new xtreemfs_broadcast_gmaxRequest( file_id, truncate_epoch, last_object, file_size ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual org::xtreemfs::interfaces::ObjectData - xtreemfs_check_object - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version - ) - { - xtreemfs_check_objectRequest* __request = new xtreemfs_check_objectRequest( file_credentials, file_id, object_number, object_version ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - org::xtreemfs::interfaces::ObjectData _return_value = __response->get__return_value();return _return_value; - } - - virtual void - xtreemfs_cleanup_get_results - ( - org::xtreemfs::interfaces::StringSet& results - ) - { - xtreemfs_cleanup_get_resultsRequest* __request = new xtreemfs_cleanup_get_resultsRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - results = __response->get_results(); - } - - virtual void xtreemfs_cleanup_is_running( bool& is_running ) - { - xtreemfs_cleanup_is_runningRequest* __request = new xtreemfs_cleanup_is_runningRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - is_running = __response->get_is_running(); - } - - virtual void - xtreemfs_cleanup_start - ( - bool remove_zombies, - bool remove_unavail_volume, - bool lost_and_found - ) - { - xtreemfs_cleanup_startRequest* __request = new xtreemfs_cleanup_startRequest( remove_zombies, remove_unavail_volume, lost_and_found ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void xtreemfs_cleanup_status( string& status ) - { - xtreemfs_cleanup_statusRequest* __request = new xtreemfs_cleanup_statusRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - status = __response->get_status(); - } - - virtual void xtreemfs_cleanup_stop() - { - xtreemfs_cleanup_stopRequest* __request = new xtreemfs_cleanup_stopRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_rwr_fetch - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - org::xtreemfs::interfaces::ObjectData& object_data - ) - { - xtreemfs_rwr_fetchRequest* __request = new xtreemfs_rwr_fetchRequest( file_credentials, file_id, object_number, object_version ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - object_data = __response->get_object_data(); - } - - virtual void - xtreemfs_rwr_flease_msg - ( - ::yidl::runtime::Buffer* fleaseMessage, - const string& senderHostname, - uint32_t senderPort - ) - { - xtreemfs_rwr_flease_msgRequest* __request = new xtreemfs_rwr_flease_msgRequest( fleaseMessage, senderHostname, senderPort ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_rwr_notify - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - { - xtreemfs_rwr_notifyRequest* __request = new xtreemfs_rwr_notifyRequest( file_credentials, file_id ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_rwr_status - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - int64_t max_local_obj_version, - org::xtreemfs::interfaces::ReplicaStatus& local_state - ) - { - xtreemfs_rwr_statusRequest* __request = new xtreemfs_rwr_statusRequest( file_credentials, file_id, max_local_obj_version ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - local_state = __response->get_local_state(); - } - - virtual void - xtreemfs_rwr_truncate - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size, - uint64_t object_version - ) - { - xtreemfs_rwr_truncateRequest* __request = new xtreemfs_rwr_truncateRequest( file_credentials, file_id, new_file_size, object_version ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_rwr_update - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint32_t offset, - const org::xtreemfs::interfaces::ObjectData& object_data - ) - { - xtreemfs_rwr_updateRequest* __request = new xtreemfs_rwr_updateRequest( file_credentials, file_id, object_number, object_version, offset, object_data ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual org::xtreemfs::interfaces::InternalGmax - xtreemfs_internal_get_gmax - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - { - xtreemfs_internal_get_gmaxRequest* __request = new xtreemfs_internal_get_gmaxRequest( file_credentials, file_id ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - org::xtreemfs::interfaces::InternalGmax _return_value = __response->get__return_value();return _return_value; - } - - virtual void - xtreemfs_internal_truncate - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t new_file_size, - org::xtreemfs::interfaces::OSDWriteResponse& osd_write_response - ) - { - xtreemfs_internal_truncateRequest* __request = new xtreemfs_internal_truncateRequest( file_credentials, file_id, new_file_size ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - osd_write_response = __response->get_osd_write_response(); - } - - virtual uint64_t - xtreemfs_internal_get_file_size - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - { - xtreemfs_internal_get_file_sizeRequest* __request = new xtreemfs_internal_get_file_sizeRequest( file_credentials, file_id ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - uint64_t _return_value = __response->get__return_value();return _return_value; - } - - virtual org::xtreemfs::interfaces::InternalReadLocalResponse - xtreemfs_internal_read_local - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - uint64_t object_number, - uint64_t object_version, - uint64_t offset, - uint64_t length, - bool attach_object_list, - const org::xtreemfs::interfaces::ObjectListSet& required_objects - ) - { - xtreemfs_internal_read_localRequest* __request = new xtreemfs_internal_read_localRequest( file_credentials, file_id, object_number, object_version, offset, length, attach_object_list, required_objects ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - org::xtreemfs::interfaces::InternalReadLocalResponse _return_value = __response->get__return_value();return _return_value; - } - - virtual org::xtreemfs::interfaces::ObjectList - xtreemfs_internal_get_object_set - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id - ) - { - xtreemfs_internal_get_object_setRequest* __request = new xtreemfs_internal_get_object_setRequest( file_credentials, file_id ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - org::xtreemfs::interfaces::ObjectList _return_value = __response->get__return_value();return _return_value; - } - - virtual org::xtreemfs::interfaces::Lock - xtreemfs_lock_acquire - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& client_uuid, - int32_t client_pid, - const string& file_id, - uint64_t offset, - uint64_t length, - bool exclusive - ) - { - xtreemfs_lock_acquireRequest* __request = new xtreemfs_lock_acquireRequest( file_credentials, client_uuid, client_pid, file_id, offset, length, exclusive ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - org::xtreemfs::interfaces::Lock _return_value = __response->get__return_value();return _return_value; - } - - virtual org::xtreemfs::interfaces::Lock - xtreemfs_lock_check - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& client_uuid, - int32_t client_pid, - const string& file_id, - uint64_t offset, - uint64_t length, - bool exclusive - ) - { - xtreemfs_lock_checkRequest* __request = new xtreemfs_lock_checkRequest( file_credentials, client_uuid, client_pid, file_id, offset, length, exclusive ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - org::xtreemfs::interfaces::Lock _return_value = __response->get__return_value();return _return_value; - } - - virtual void - xtreemfs_lock_release - ( - const org::xtreemfs::interfaces::FileCredentials& file_credentials, - const string& file_id, - const org::xtreemfs::interfaces::Lock& lock - ) - { - xtreemfs_lock_releaseRequest* __request = new xtreemfs_lock_releaseRequest( file_credentials, file_id, lock ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - virtual void - xtreemfs_ping - ( - const org::xtreemfs::interfaces::VivaldiCoordinates& coordinates, - org::xtreemfs::interfaces::VivaldiCoordinates& remote_coordinates - ) - { - xtreemfs_pingRequest* __request = new xtreemfs_pingRequest( coordinates ); - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - remote_coordinates = __response->get_remote_coordinates(); - } - - virtual void xtreemfs_shutdown() - { - xtreemfs_shutdownRequest* __request = new xtreemfs_shutdownRequest; - - ::yidl::runtime::auto_Object< ::yield::concurrency::ResponseQueue > - __response_queue( new ::yield::concurrency::ResponseQueue ); - __request->set_response_handler( *__response_queue ); - - handle( *__request ); - - ::yidl::runtime::auto_Object __response = __response_queue->dequeue(); - } - - private: - // __request_handler is not a counted reference, since that would create - // a reference cycle when __request_handler is a subclass of OSDInterfaceProxy - ::yield::concurrency::EventHandler& __request_handler; - };}; - }; -}; -#endif diff --git a/include/xtreemfs/interfaces/types.h b/include/xtreemfs/interfaces/types.h deleted file mode 100644 index a61926979cfe9047c27e02cd3dc3c84dd929ef58..0000000000000000000000000000000000000000 --- a/include/xtreemfs/interfaces/types.h +++ /dev/null @@ -1,122 +0,0 @@ -#ifndef _2048554652_H_ -#define _2048554652_H_ - - -#include "yidl.h" - - -namespace org -{ - namespace xtreemfs - { - namespace interfaces - { - - class StringSet - : public ::yidl::runtime::Sequence, - public vector - { - public: - StringSet() { } - StringSet( const string& first_value ) { vector::push_back( first_value ); } - StringSet( size_type size ) : vector( size ) { } - virtual ~StringSet() { } - - // yidl::runtime::Object - StringSet& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030917 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "StringSet"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - size_type value_i_max = size(); - for ( size_type value_i = 0; value_i < value_i_max; value_i++ ) - { - marshaller.write( ::yidl::runtime::Marshaller::Key(), ( *this )[value_i] ); - } - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - string value; - unmarshaller.read( ::yidl::runtime::Marshaller::Key(), value ); - push_back( value ); - } - - // yidl::runtime::Sequence - size_t get_size() const { return size(); } - }; - - class UserCredentials : public ::yidl::runtime::Struct - { - public: - UserCredentials() { } - - UserCredentials - ( - const string& user_id, - const org::xtreemfs::interfaces::StringSet& group_ids, - const string& password - ) - : user_id( user_id ), group_ids( group_ids ), password( password ) - { } - - UserCredentials( const UserCredentials& other ) - : user_id( other.get_user_id() ), - group_ids( other.get_group_ids() ), - password( other.get_password() ) - { } - - virtual ~UserCredentials() { } - - const string& get_user_id() const { return user_id; } - const org::xtreemfs::interfaces::StringSet& get_group_ids() const { return group_ids; } - const string& get_password() const { return password; } - void set_user_id( const string& user_id ) { this->user_id = user_id; } - void set_group_ids( const org::xtreemfs::interfaces::StringSet& group_ids ) { this->group_ids = group_ids; } - void set_password( const string& password ) { this->password = password; } - - bool operator==( const UserCredentials& other ) const - { - return get_user_id() == other.get_user_id() - && - get_group_ids() == other.get_group_ids() - && - get_password() == other.get_password(); - } - - // yidl::runtime::Object - UserCredentials& inc_ref() { return Object::inc_ref( *this ); } - - // yidl::runtime::MarshallableObject - const static uint32_t TYPE_ID = static_cast( 2010030918 ); - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "UserCredentials"; } - - void marshal( ::yidl::runtime::Marshaller& marshaller ) const - { - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "user_id", 0 ), get_user_id() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "group_ids", 0 ), get_group_ids() ); - marshaller.write( ::yidl::runtime::Marshaller::StringLiteralKey( "password", 0 ), get_password() ); - } - - void unmarshal( ::yidl::runtime::Unmarshaller& unmarshaller ) - { - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "user_id", 0 ), user_id ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "group_ids", 0 ), group_ids ); - unmarshaller.read( ::yidl::runtime::Unmarshaller::StringLiteralKey( "password", 0 ), password ); - } - - protected: - string user_id; - org::xtreemfs::interfaces::StringSet group_ids; - string password; - }; - - }; - }; -}; -#endif diff --git a/include/xtreemfs/mrc_proxy.h b/include/xtreemfs/mrc_proxy.h deleted file mode 100644 index 7fd7fe2904ef4972a167aec0c54332aab2c921c7..0000000000000000000000000000000000000000 --- a/include/xtreemfs/mrc_proxy.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_MRC_PROXY_H_ -#define _XTREEMFS_MRC_PROXY_H_ - -#include "xtreemfs/proxy.h" -#include "xtreemfs/interfaces/mrc_interface.h" - - -namespace xtreemfs -{ - class Options; - class UserDatabase; - using yield::concurrency::Request; - - - class MRCProxy - : public org::xtreemfs::interfaces::MRCInterfaceProxy, - public Proxy - { - public: - MRCProxy - ( - EventHandler& request_handler, // Steals this reference - const char* password = NULL, - UserDatabase* user_database = NULL - ); - - virtual ~MRCProxy(); - - static MRCProxy& - create - ( - const URI& absolute_uri, - const Options& options, - const char* password = "" - ); - - static MRCProxy& - create - ( - const URI& absolute_uri, - Log* error_log = NULL, - const char* password = "", -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* ssl_context = NULL, -#endif - Log* trace_log = NULL, - UserDatabase* user_database = NULL - ); - - // yidl::runtime::Object - MRCProxy& inc_ref() { return Object::inc_ref( *this ); } - - // yield::concurrency::RequestHandler - virtual void handle( Request& request ); - - private: - string password; - UserDatabase* user_database; - }; -}; - -#endif diff --git a/include/xtreemfs/options.h b/include/xtreemfs/options.h deleted file mode 100644 index 6f0139a02f93d5fc20425ac840b03e1a58b29769..0000000000000000000000000000000000000000 --- a/include/xtreemfs/options.h +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_OPTIONS_H_ -#define _XTREEMFS_OPTIONS_H_ - -#include "yield.h" - - -namespace xtreemfs -{ -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - using yield::ipc::SSLContext; -#endif - using yield::ipc::URI; - using yield::platform::Log; - using yield::platform::OptionParser; - using yield::platform::Path; - using yield::platform::Time; - - - class Options : public OptionParser::ParsedOptions - { - public: - Options( const Options& other ); - virtual ~Options(); - - Log* get_error_log() const { return error_log; } - const Path& get_error_log_file_path() const { return error_log_file_path; } - const Log::Level& get_error_log_level() const { return error_log_level; } - const vector& get_positional_arguments() const; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* get_ssl_context() const { return ssl_context; } -#endif - Log* get_trace_log() const { return trace_log; } - URI* get_uri() const { return uri; } - - // Parse global options only - static Options parse( int argc, char** argv ); - - // Parse global options + other_options - static Options - parse - ( - int argc, - char** argv, - const OptionParser::Options& other_options - ); - - // Return usage for global options only - static string usage(); - - // Return usage for global options + other options - static string usage( const OptionParser::Options& other_options ); - - private: - Options - ( - Log* error_log, - const Path& error_log_file_path, - const Log::Level& error_log_level, - const OptionParser::ParsedOptions& parsed_options, - const vector& positional_arguments, -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* ssl_context, -#endif - Log* trace_log, - URI* uri - ); - - static void add_global_options( OptionParser& option_parser ); - - private: - Log* error_log; - Path error_log_file_path; - Log::Level error_log_level; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* ssl_context; -#endif - Log* trace_log; - URI* uri; - vector positional_arguments; - }; -}; - -#endif diff --git a/include/xtreemfs/osd_proxies.h b/include/xtreemfs/osd_proxies.h deleted file mode 100644 index 1644ea79837f133b238d2d9f42edf91ff54d5c91..0000000000000000000000000000000000000000 --- a/include/xtreemfs/osd_proxies.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_OSD_PROXIES_H_ -#define _XTREEMFS_OSD_PROXIES_H_ - -#include "xtreemfs/osd_proxy.h" - - -namespace xtreemfs -{ - class DIRProxy; - using org::xtreemfs::interfaces::XLocSet; - using yield::concurrency::StageGroup; - - - class OSDProxies - : public yidl::runtime::Object, - private map - { - public: - OSDProxies - ( - DIRProxy& dir_proxy, - Log* error_log = NULL, -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* osd_proxy_ssl_context = NULL, -#endif - StageGroup* osd_proxy_stage_group = NULL, - Log* trace_log = NULL - ); - - ~OSDProxies(); - - // yidl::runtime::Object - OSDProxies& inc_ref() { return yidl::runtime::Object::inc_ref( *this ); } - - OSDProxy& get_osd_proxy - ( - uint64_t object_number, - size_t& selected_file_replica_i, - const XLocSet& xlocs - ); - - OSDProxy& get_osd_proxy( const string& osd_uuid ); - - private: - DIRProxy& dir_proxy; - Log* error_log; - yield::platform::Mutex lock; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* osd_proxy_ssl_context; -#endif - StageGroup* osd_proxy_stage_group; - Log* trace_log; - }; -}; - -#endif diff --git a/include/xtreemfs/osd_proxy.h b/include/xtreemfs/osd_proxy.h deleted file mode 100644 index ee639438c04530b4ca129282fe5ec98b52a35d2e..0000000000000000000000000000000000000000 --- a/include/xtreemfs/osd_proxy.h +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_OSD_PROXY_H_ -#define _XTREEMFS_OSD_PROXY_H_ - -#include "xtreemfs/proxy.h" -#include "xtreemfs/interfaces/osd_interface.h" - - -namespace xtreemfs -{ - class OSDProxy - : public org::xtreemfs::interfaces::OSDInterfaceProxy, - public Proxy - { - public: - OSDProxy( EventHandler& request_handler ); // Steals this reference - virtual ~OSDProxy() { } - - static OSDProxy& - create - ( - const URI& absolute_uri, - Log* error_log = NULL, -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* ssl_context = NULL, -#endif - Log* trace_log = NULL - ); - - // yidl::runtime::Object - OSDProxy& inc_ref() { return yidl::runtime::Object::inc_ref( *this ); } - }; -}; - - -bool operator> -( - const org::xtreemfs::interfaces::OSDWriteResponse& left, - const org::xtreemfs::interfaces::OSDWriteResponse& right -); - -#endif diff --git a/include/xtreemfs/policy.h b/include/xtreemfs/policy.h deleted file mode 100644 index e6870b7da2bc37629ed6fd50f5d1039ebc1c7144..0000000000000000000000000000000000000000 --- a/include/xtreemfs/policy.h +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_POLICY_H_ -#define _XTREEMFS_POLICY_H_ - -#ifdef _WIN32 -#include -#else -#include // For size_t -#endif - - -#ifndef DLLEXPORT -#ifdef __cplusplus -#if defined(_MSC_VER) -#define DLLEXPORT extern "C" __declspec(dllexport) -#elif defined(__GNUC__) && __GNUC__ >= 4 -#define DLLEXPORT extern "C" __attribute__ ( ( visibility( "default" ) ) ) -#else -#define DLLEXPORT extern "C" -#endif -#else -#if defined(_MSC_VER) -#define DLLEXPORT __declspec(dllexport) -#elif defined(__GNUC__) && __GNUC__ >= 4 -#define DLLEXPORT __attribute__ ( ( visibility( "default" ) ) ) -#else -#define DLLEXPORT -#endif -#endif -#endif - - -#ifndef _WIN32 -typedef -int -( *get_passwd_t ) -( - const char* user_id, - const char* group_ids, - uid_t* out_uid, - gid_t* out_gid -); - -typedef -int -( *get_user_credentials_t ) -( - uid_t uid, - gid_t gid, - char* out_user_id, - size_t* out_user_id_size, - char* out_group_ids, - size_t* out_group_ids_size -); - -#endif - -// - -#endif diff --git a/include/xtreemfs/proxy.h b/include/xtreemfs/proxy.h deleted file mode 100644 index d170616db9eea9b3f3e0bb9b496e1f71715728c2..0000000000000000000000000000000000000000 --- a/include/xtreemfs/proxy.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_PROXY_H_ -#define _XTREEMFS_PROXY_H_ - -#include "yield.h" - - -namespace xtreemfs -{ - using yield::concurrency::EventHandler; - using yield::concurrency::MessageFactory; - using yield::ipc::URI; - using yield::platform::Exception; - using yield::platform::Log; - using yield::platform::SSLContext; - - - class Proxy - { - protected: - Proxy() { } - virtual ~Proxy() { } - - static EventHandler& - createONCRPCClient - ( - const URI& absolute_uri, - MessageFactory& message_factory, - uint16_t port_default, - uint32_t prog, - uint32_t vers, - Log* error_log = NULL, -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* ssl_context = NULL, -#endif - Log* trace_log = NULL - ); - }; -}; - -#endif diff --git a/include/xtreemfs/volume.h b/include/xtreemfs/volume.h deleted file mode 100644 index 1a53ae3f94564a664fca78e6bf3ac666d0963d39..0000000000000000000000000000000000000000 --- a/include/xtreemfs/volume.h +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the XtreemFS project. -// It is licensed under the New BSD license: -// -// 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 the XtreemFS project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _XTREEMFS_VOLUME_H_ -#define _XTREEMFS_VOLUME_H_ - -#include "xtreemfs/dir_proxy.h" -#include "xtreemfs/mrc_proxy.h" -#include "xtreemfs/osd_proxies.h" - - -namespace xtreemfs -{ - class File; - class OpenFileTable; - class Options; - class Stat; - class StatCache; - using org::xtreemfs::interfaces::FileCredentials; - using org::xtreemfs::interfaces::VivaldiCoordinates; - using org::xtreemfs::interfaces::XCap; - - using yield::concurrency::StageGroup; - using yield::platform::Mutex; - using yield::platform::Path; - - - class Volume : public yield::platform::Volume - { - public: - static uint32_t ERROR_CODE_DEFAULT; // The error code for internal exceptions - - const static uint32_t FLAG_WRITE_BACK_DATA_CACHE = 1; - const static uint32_t FLAG_WRITE_BACK_FILE_SIZE_CACHE = 2; - const static uint32_t FLAG_WRITE_BACK_STAT_CACHE = 4; - const static uint32_t FLAG_WRITE_THROUGH_DATA_CACHE = 8; - const static uint32_t FLAG_WRITE_THROUGH_FILE_SIZE_CACHE = 16; - const static uint32_t FLAG_WRITE_THROUGH_STAT_CACHE = 32; - const static uint32_t FLAGS_DEFAULT = FLAG_WRITE_BACK_FILE_SIZE_CACHE; - - - virtual ~Volume(); - - void close( File& file ); - - static Volume& - create - ( - const Options& options, - uint32_t flags = FLAGS_DEFAULT, - const Path& vivaldi_coordinates_file_path = Path() - ); - - static Volume& - create - ( - const URI& dir_uri, - const string& name_utf8, - Log* error_log = NULL, - uint32_t flags = FLAGS_DEFAULT, -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - SSLContext* proxy_ssl_context = NULL, -#endif - Log* trace_log = NULL, - const Path& vivaldi_coordinates_file_path = Path() - ); - - // fsetattr is used for setting the file size - void fsetattr - ( - const Path& path, - const Stat& stbuf, - uint32_t to_set, - const XCap& write_xcap - ); - - DIRProxy& get_dir_proxy() const { return dir_proxy; } - uint32_t get_flags() const { return flags; } - MRCProxy& get_mrc_proxy() const { return mrc_proxy; } - const string& get_name() const { return name_utf8; } - OSDProxies& get_osd_proxies() const { return osd_proxies; } - Log* get_trace_log() const { return trace_log; } - UserDatabase& get_user_database() const; - const string& get_uuid() const { return uuid; } - VivaldiCoordinates get_vivaldi_coordinates() const; - void metadatasync( const Path& path, const XCap& write_xcap ); - void set_errno( const char* operation_name, Exception& exception ); - void set_errno( const char* operation_name, std::exception& exception ); - - // yidl::runtime::Object - Volume& inc_ref() { return Object::inc_ref( *this ); } - - // yield::platform::Volume - YIELD_PLATFORM_VOLUME_PROTOTYPES; - - private: - Volume - ( - DIRProxy& dir_proxy, - Log* error_log, - uint32_t flags, - MRCProxy& mrc_proxy, - const string& name_utf8, - OSDProxies& osd_proxies, - StageGroup& stage_group, - Log* trace_log, - UserDatabase& user_database, - const Path& vivaldi_coordinates_file_path - ); - - void osd_unlink( const FileCredentials& file_credentials ); - - private: - DIRProxy& dir_proxy; - Log* error_log; - class FileState; - typedef map FileStateMap; - FileStateMap file_state_map; - Mutex file_state_map_lock; - uint32_t flags; - MRCProxy& mrc_proxy; - string name_utf8; - OSDProxies& osd_proxies; - StageGroup& stage_group; - string uuid; - StatCache* stat_cache; - Log* trace_log; - UserDatabase& user_database; - Path vivaldi_coordinates_file_path; - }; -}; - -#endif diff --git a/man/man1/lsfs.xtreemfs.1 b/man/man1/lsfs.xtreemfs.1 deleted file mode 100644 index 4857b9b4a10a69a84817ed348dc84eb087a05c01..0000000000000000000000000000000000000000 --- a/man/man1/lsfs.xtreemfs.1 +++ /dev/null @@ -1,69 +0,0 @@ -.TH lsfs.xtreemfs 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS client" -.SH NAME -lsfs.xtreemfs \- list all XtreemFS volumes on an MRC -.SH SYNOPSIS -\fBlsfs.xtreemfs [\fIoptions\fB] [oncrpc[s]://]\fImrchost\fR[:\fIport\fR] -.br - -.SH DESCRIPTION -.I lsfs.xtreemfs -lists all volumes located on the XtreemFS MRC running at \fImrchost\fR:\fIport\fR. - -.SH EXAMPLE USAGE -.B "lsfs.xtreemfs remote.mrc.machine -.br -.B "lsfs.xtreemfs -l oncrpc://remote.mrc.machine:11111 - -.SH OPTIONS -.TP -\fB\-d/\-\-debug/\-\-log\-level=\fIEMERG|ALERT|CRIT|ERR|WARNING|NOTICE|INFO|DEBUG -log level -.TP -\fB\-h/\-\-help -print help and exit -.TP -\fB\-l/\-\-log\-file\-path=\fIlog_file_path -path to the client log file -.TP -\fB\-t/\-\-timeout\-ms=\fImillis -request timeout in milliseconds -.TP -\fB\-\-cert/-\-pem\-certificate\-file\-path=\fIcertfile -PEM certificate file path (for SSL installations only) -.TP -\fB\-\-pass/\-\-pem\-private\-key\-passphrase=\fIpass -PEM private key passphrase (for SSL installations only) -.TP -\fB\-\-pkcs12\-file\-path=\fIfile -PKCS#12 file path (for SSL installations only) -.TP -\fB\-\-pkcs12\-passphrase=\fIpass -PKCS#12 file passphrase (for SSL installations only) -.TP -\fB\-\-pkey/\-\-pem\-private\-key\-file\-path=\fIfile -PEM private key file path -.TP -\fB\-\-trace\-auth -trace authentication -.TP -\fB\-\-trace\-network\-io -trace network I/O -.TP -\fB\-\-trace\-network\-operations -trace network operations - -.SH "SEE ALSO" -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH AVAILABILITY -The lsfs.xtreemfs command is part of the XtreemFS-client package and is available from http://www.xtreemfs.org \ No newline at end of file diff --git a/man/man1/mkfs.xtreemfs.1 b/man/man1/mkfs.xtreemfs.1 deleted file mode 100644 index 746a5f17f365531f72b183272ec7a48ffe87deb2..0000000000000000000000000000000000000000 --- a/man/man1/mkfs.xtreemfs.1 +++ /dev/null @@ -1,94 +0,0 @@ -.TH mkfs.xtreemfs 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS client" -.SH NAME -mkfs.xtreemfs \- create a new XtreemFS volume -.SH SYNOPSIS -\fBmkfs.xtreemfs [\fIoptions\fB] [oncrpc[s]://]\fImrchost|dirhost\fR[:\fIport\fR]/\fIvolume -.br - -.SH DESCRIPTION -.I mkfs.xtreemfs -creates a new volume named \fIvolume\fR. Users may choose to either specify the MRC URI \fImrchost\fR:\fIport\fR at which the volume will be created, or the Directory Service URI \fIdirhost\fR:\fIport\fR at which the volume will be registered. In the latter case, the volume will be created on random MRC registered at the Directory Service. - -.SH EXAMPLE USAGE -.B "mkfs.xtreemfs remote.mrc.machine/myVolume" -.br -.B "mkfs.xtreemfs -p RAID0 -w 2 -s 256 -a POSIX oncrpc://remote.mrc.machine/myVolume" - -.SH OPTIONS -.TP -\fB\-a/\-\-access\-control\-policy=\fINULL|POSIX|VOLUME -access control policy for the volume -.TP -\fB\-d/\-\-debug/\-\-log\-level=\fIEMERG|ALERT|CRIT|ERR|WARNING|NOTICE|INFO|DEBUG -log level -.TP -\fB\-g/\-\-owner\-group\-id=\fIgroup ID -group ID string of the volume's owning group -.TP -\fB\-h/\-\-help -print help and exit -.TP -\fB\-l/\-\-log\-file\-path=\fIlog_file_path -path to the client log file -.TP -\fB\-m/\-\-mode=n -initial POSIX access mode for the root directory -.TP -\fB\-p/\-\-striping\-policy=\fINONE|RAID0 -default striping policy for the volume -.TP -\fB\-s/\-\-striping\-policy\-stripe\-size=\fIn -stripe size for the volume's default striping policy -.TP -\fB\-t/\-\-timeout\-ms=\fImillis -request timeout in milliseconds -.TP -\fB\-u/\-\-owner\-user\-id=\fIuser ID -user ID string of the volume's owner -.TP -\fB\-w/\-\-striping\-policy\-width=\fIn -striping width (default number of OSDs) for the volume's default striping policy -.TP -\fB\-\-cert/-\-pem\-certificate\-file\-path=\fIcertfile -PEM certificate file path (for SSL installations only) -.TP -\fB\-\-pass/\-\-pem\-private\-key\-passphrase=\fIpass -PEM private key passphrase (for SSL installations only) -.TP -\fB\-\-password=\fIpassword -MRC administrator password (if required) -.TP -\fB\-\-pkcs12\-file\-path=\fIfile -PKCS#12 file path (for SSL installations only) -.TP -\fB\-\-pkcs12\-passphrase=\fIpass -PKCS#12 file passphrase (for SSL installations only) -.TP -\fB\-\-pkey/\-\-pem\-private\-key\-file\-path=\fIfile -PEM private key file path -.TP -\fB\-\-trace\-auth -trace authentication -.TP -\fB\-\-trace\-network\-io -trace network I/O -.TP -\fB\-\-trace\-network\-operations -trace network operations - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - - -.SH AVAILABILITY -The mkfs.xtreemfs command is part of the XtreemFS-client package and is available from http://www.xtreemfs.org \ No newline at end of file diff --git a/man/man1/mount.xtreemfs.1 b/man/man1/mount.xtreemfs.1 deleted file mode 100644 index 102bb25ae9fc939fb8c668576d83099f49decb2f..0000000000000000000000000000000000000000 --- a/man/man1/mount.xtreemfs.1 +++ /dev/null @@ -1,104 +0,0 @@ -.TH mount.xtreemfs 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS client" -.SH NAME -mount.xtreemfs \- mounts an XtreemFS volume -.SH SYNOPSIS -\fBmount.xtreemfs [\fIoptions\fB] [oncrpc[s]://]\fIdirhost\fR[:\fIport\fR]/\fIvolume mountpoint -.br - -.SH DESCRIPTION -.I mount.xtreemfs -mounts the volume \fIvolume\fR registered at the Directory Service \fIdirhost\fR:\fIport\fR to the local directory \fImountpoint\fR. \fImount.xtreemfs\fR is implemented as a FUSE user-level file system driver. Other than in-kernel drives, it operates as a detached process per mount point. - -.SH EXAMPLE USAGE -.B "mount.xtreemfs remote.dirservice.machine/MyVolume /mnt" - -.SH OPTIONS -.TP -\fB\-d/\-\-debug/\-\-log\-level=\fIEMERG|ALERT|CRIT|ERR|WARNING|NOTICE|INFO|DEBUG -log level -.TP -\fB\-f/\-\-foreground -run the client process in the foreground (blocks the shell until the volume is un-mounted) -.TP -\fB\-h/\-\-help -print help and exit -.TP -\fB\-l/\-\-log\-file\-path=\fIlog_file_path -path to the client log file -.TP -\fB\-o=\fIfuse_option -additional parameters that are passed to FUSE -.TP -\fB\-t/\-\-operation\-timeout\-ms=\fIms -request timeout in milliseconds -.TP -\fB\-\-cert/-\-pem\-certificate\-file\-path=\fIcertfile -PEM certificate file path (for SSL installations only) -.TP -\fB\-\-pass/\-\-pem\-private\-key\-passphrase=\fIpass -PEM private key passphrase (for SSL installations only) -.TP -\fB\-\-pkcs12\-file\-path=\fIfile -PKCS#12 file path (for SSL installations only) -.TP -\fB\-\-pkcs12\-passphrase=\fIpass -PKCS#12 file passphrase (for SSL installations only) -.TP -\fB\-\-pkey/\-\-pem\-private\-key\-file\-path=\fIfile -PEM private key file path -.TP -\fB\-\-trace\-auth -trace authentication -.TP -\fB\-\-trace\-file\-io -trace file I/O -.TP -\fB\-\-trace\-network\-io -trace network I/O -.TP -\fB\-\-trace\-network\-operations -trace network operations -.TP -\fB\-\-trace\-volume\-operations -trace volume operations -.TP -\fB\-\-vivaldi\-coordinates\-file\-path=\fIpath -path to Vivaldi coordinates file produced by xtfs_vivaldi -.TP -\fB\-\-write\-back\-data\-cache -enables write-back caching of data -.TP -\fB\-\-write\-back\-stat\-cache -enables write-back caching of stat information -.TP -\fB\-\-write\-through\-data\-cache -enables write-through caching of data -.TP -\fB\-\-write\-through\-file\-size\-cache -enables write-through caching of file sizes -.TP -\fB\-\-write\-through\-stat\-cache -enables write-through caching of stat information - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH "KNOWN ISSUES" -FUSE does not support mmap in connection with direct I/O. In order to get applications running on XtreemFS that rely on mmap, volumes have to be mounted without using the FUSE option -.B "-o direct_io" -. However, this might lead to inconsistencies if different clients access a file concurrently, as requests might be serviced from the local page cache. - -When run on older Linux kernels (2.6.18 or earlier), the XtreemFS client might fail to enforce access control when changing to a directory. The problem can be solved by passing \fB"-o default_permissions"\fR to FUSE. - -.SH AVAILABILITY -The mount.xtreemfs command is part of the XtreemFS-client package and is available from http://www.xtreemfs.org diff --git a/man/man1/rmfs.xtreemfs.1 b/man/man1/rmfs.xtreemfs.1 deleted file mode 100644 index 4b317ae9e3ee41f227210dfd94277291b776e87c..0000000000000000000000000000000000000000 --- a/man/man1/rmfs.xtreemfs.1 +++ /dev/null @@ -1,58 +0,0 @@ -.TH rmfs.xtreemfs 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS client" -.SH NAME -rmfs.xtreemfs \- delete a volume including all files on an XtreemFS MRC -.SH SYNOPSIS -\fBrmfs.xtreemfs [\fIoptions\fB] [oncrpc[s]://]\fImrchost\fR[:\fIport\fR]/\fIvolume -.br - -.SH DESCRIPTION -.I rmfs.xtreemfs -deletes the volume named \fIvolume\fR from the XtreemFS MRC running at \fImrchost\fR:\fIport\fR. Be careful, this command will delete the volume and all files on it! - -.SH EXAMPLE USAGE -.B "rmfs.xtreemfs remote.mrc.machine/myVolume" - -.SH OPTIONS -.TP -\fB\-d/\-\-debug/\-\-log\-level=\fIEMERG|ALERT|CRIT|ERR|WARNING|NOTICE|INFO|DEBUG -log level -.TP -\fB\-h/\-\-help -print help and exit -.TP -\fB\-l/\-\-log\-file\-path=\fIlog_file_path -path to the client log file -.TP -\fB\-t/\-\-timeout\-ms=\fImillis -request timeout in milliseconds -.TP -\fB\-\-cert/-\-pem\-certificate\-file\-path=\fIcertfile -PEM certificate file path (for SSL installations only) -.TP -\fB\-\-pass/\-\-pem\-private\-key\-passphrase=\fIpass -PEM private key passphrase (for SSL installations only) -.TP -\fB\-\-pkcs12\-file\-path=\fIfile -PKCS#12 file path (for SSL installations only) -.TP -\fB\-\-pkcs12\-passphrase=\fIpass -PKCS#12 file passphrase (for SSL installations only) -.TP -\fB\-\-pkey/\-\-pem\-private\-key\-file\-path=\fIfile -PEM private key file path - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH AVAILABILITY -The rmfs.xtreemfs command is part of the XtreemFS-client package and is available from http://www.xtreemfs.org \ No newline at end of file diff --git a/man/man1/umount.xtreemfs.1 b/man/man1/umount.xtreemfs.1 deleted file mode 100644 index a41b95c244c6ee9fac5d875ea8ab0b9425cfc3dc..0000000000000000000000000000000000000000 --- a/man/man1/umount.xtreemfs.1 +++ /dev/null @@ -1,29 +0,0 @@ -.TH umount.xtreemfs 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS client" -.SH NAME -umount.xtreemfs \- unmounts an XtreemFS volume -.SH SYNOPSIS -\fBumount.xtreemfs \fIvolume mountpoint -.br - -.SH DESCRIPTION -.I umount.xtreemfs -umounts the volume that has been mounted to \fIvolume\fR. - -.SH EXAMPLE USAGE -.B "umount.xtreemfs /mnt" - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH AVAILABILITY -The umount.xtreemfs command is part of the XtreemFS-client package and is available from http://www.xtreemfs.org \ No newline at end of file diff --git a/man/man1/xtfs_chstatus.1 b/man/man1/xtfs_chstatus.1 deleted file mode 100644 index f47959e77ec9d9496975d5a9656664e4b4544222..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_chstatus.1 +++ /dev/null @@ -1,59 +0,0 @@ -.TH xtfs_chstatus 1 "January 2010" "The XtreemFS Distributed File System" "XtreemFS tools" -.SH NAME -xtfs_chstatus \- changes the status flag of an OSD -.SH SYNOPSIS -\fBxtfs_chstatus [ \fIoptions\fB ] \fI {online|removed}\fB -.br - -.SH DESCRIPTION -.I xtfs_chstatus -Displays and changes the status flag of an OSD. The status can be 0 (online) and 2 (permanently dead/removed). The status flag is used by the scrubber to identify dead OSDs. Files and replicas on dead OSDs are removed by the scrubber tool. - -.SH EXAMPLE USAGE -.B "xtfs_chstatus -dir oncrpc://localhost:32638 2e3d-424b-b3d2 removed -.PP -Changes the status of the OSD with UUID 2e3d-424b-b3d2 registered at the Directory Service 'oncrpc://localhost:32638' to 2 (removed) - -.SH OPTIONS -.TP -.TP -\fB-c \fI -a PKCS#12 file containing user credentials for SSL-based server connections -.TP -\fB-cpass \fI -a pass phrase to decrypt the the user credentials file for SSL-based server connections -.TP -\fB\-delete -deletes files where the objects are lost because they were stored on a failed/removed OSD -.TP -\fB-dir \fI -Specifies the directory service to use (e.g. 'oncrpc://localhost:32638'). If no URI is specified, URI and security settings are taken from '/etc/xos/xtreemfs/default_dir'. In case of a secured URI ('oncrpcs://...'), it is necessary to also specify SSL settings. -.TP -\fB-h -show usage info -.TP -\fB-t \fI -a PKCS#12 file containing a set of certificates from trusted CAs for SSL-based server connections -.TP -\fB\-thrs \fI<#threads> -number of threads to use for scrubbing (default=10) -.TP -\fB-tpass \fI -a pass phrase to decrypt the trusted CAs file for SSL-based server connections - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1), -.BR xtfs_scrub (1) -.BR - -.SH AVAILABILITY -The xtfs_chstatus command is part of the XtreemFS-tools package and is available from http://www.xtreemfs.org diff --git a/man/man1/xtfs_cleanup.1 b/man/man1/xtfs_cleanup.1 deleted file mode 100644 index ac6040e7eb1de9ed81d3ffdaca1148e6bf97fb8e..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_cleanup.1 +++ /dev/null @@ -1,69 +0,0 @@ -.TH xtfs_cleanup 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS tools" -.SH NAME -xtfs_cleanup \- checks for each file on the OSD, if it has an entry at the Metadata Server (MRC). -.SH SYNOPSIS -\fBxtfs_cleanup [ \fIoptions\fB ] \fIuuid: -.BR - -.SH DESCRIPTION -.I xtfs_cleanup -Performs a check of each file on the given Object Storage Device (OSD) whether it is registered at a MRC or not. - -.SH EXAMPLE USAGE -.B "xtfs_cleanup uuid:4ef54-kl345-2l35jn-3k4jl" -.PP -Starts the cleanup process on the OSD identified by UUID '4ef54-kl345-2l35jn-3k4jl'. - -.SH OPTIONS -.TP -\fB-c \fI -a PKCS#12 file containing user credentials for SSL-based server connections -.TP -\fB-cpass \fI -a pass phrase to decrypt the the user credentials file for SSL-based server connections -.TP -\fB-deleteVolumes -volume deletion - deletes volumes that might be dead! -.TP -\fB-dir \fI -Specifies the directory service to use (e.g. 'oncrpc://localhost:32638'). If no URI is specified, URI and security settings are taken from '/etc/xos/xtreemfs/default_dir'. In case of a secured URI ('oncrpcs://...'), it is necessary to also specify SSL settings. -.TP -\fB-e -erase mode - all files will be removed without further request! -.TP -\fB-h -show usage info -.TP -\fB-i -interactive mode -.TP -\fB-p \fI -the administrator password for password protection-enabled systems -.TP -\fB-r -restore mode - all files will be restored to directory '/lost+found/' at the volume they are located -.TP -\fB-stop -suspend the currently running cleanup -.TP -\fB-t \fI -a PKCS#12 file containing a set of certificates from trusted CAs for SSL-based server connections -.TP -\fB-tpass \fI -a pass phrase to decrypt the trusted CAs file for SSL-based server connections - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH AVAILABILITY -The xtfs_cleanup command is part of the XtreemFS-tools package and is available from http://www.xtreemfs.org. diff --git a/man/man1/xtfs_dirreplicationtool.1 b/man/man1/xtfs_dirreplicationtool.1 deleted file mode 100644 index f33a605fd4581c7dc9e82b92237b52c0ba425839..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_dirreplicationtool.1 +++ /dev/null @@ -1,58 +0,0 @@ -.TH xtfs_dirreplicationtool 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS tools" -.SH NAME -xtfs_dirreplicationtool \- configure the replication of the DIR. -.SH SYNOPSIS -\fBxtfs_dirreplicationtool [\fIoptions\fB] \fIdtoMaster -.br - -.SH DESCRIPTION -.I xtfs_dirreplicationtool -Declares a DIR \fItoMaster\fP in the context of a master-slave-replicated setup. - -.SH EXAMPLE USAGE -.B "xtfs_dirreplicationtool -dir oncrpc://localhost:32638 toMaster" -.PP -Sets the DIR running on \fIlocalhost:32638\fP in master-mode and sets other for the replication registered participants -into slave-mode. The DIR has to be started with replication enabled! And at least one more participant has to -registered to it. - -.SH OPTIONS -.TP -.B \-c \fIcreds_file -Path to a PKCS#12 credentials file (private key + certificate) to use for SSL authentication. Must be present when DIR URL starts with oncrpcs://. -.TP -.B \-cpass \fIcreds_passphrase -An optional passphrase to access the credentials file. -.TP -.B \-h -Print help. -.TP -.B \-dir \fIdir_url -The URL the DIR, e.g. oncrpc://localhost:32638. -.TP -.B \-p \fIpassphrase -The administrator password, if password protection is enabled -.TP -.B \-t \fItrusted_CAs -Path to a PKCS#12 file containing a set of certificates from trusted certification authorities. These certificates will be used to authenticate the DIR. Must be present when DIR URL starts with oncrpcs://. -.TP -.B \-tpass \fItrusted_passphrase -An optional passphrase to access the truststore file. -.RE - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.br mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH AVAILABILITY -The xtfs_dirreplicationtool command is part of the XtreemFS-tools package and is available from http://www.xtreemfs.org diff --git a/man/man1/xtfs_lsvol.1 b/man/man1/xtfs_lsvol.1 deleted file mode 120000 index 2426675e24bac6970e4a5d469665dd04db6575d8..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_lsvol.1 +++ /dev/null @@ -1 +0,0 @@ -lsfs.xtreemfs.1 \ No newline at end of file diff --git a/man/man1/xtfs_mkvol.1 b/man/man1/xtfs_mkvol.1 deleted file mode 120000 index 6daa9f9ba41413301dfb56900d9aa3823afece63..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_mkvol.1 +++ /dev/null @@ -1 +0,0 @@ -mkfs.xtreemfs.1 \ No newline at end of file diff --git a/man/man1/xtfs_mount.1 b/man/man1/xtfs_mount.1 deleted file mode 120000 index 1c4098097fc6eb236ccc94c67d5a3489352142c1..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_mount.1 +++ /dev/null @@ -1 +0,0 @@ -mount.xtreemfs.1 \ No newline at end of file diff --git a/man/man1/xtfs_mrcdbtool.1 b/man/man1/xtfs_mrcdbtool.1 deleted file mode 100644 index 717fd79d9806ed9b809bcbdb3c7e251ab836527f..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_mrcdbtool.1 +++ /dev/null @@ -1,59 +0,0 @@ -.TH xtfs_mrcdbtool 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS tools" -.SH NAME -xtfs_mrcdbtool \- dump and restore MRC databases. -.SH SYNOPSIS -\fBxtfs_mrcdbtool [\fIoptions\fB] \fIdump|restore dump_file -.br - -.SH DESCRIPTION -.I xtfs_mrcdbtool -dumps an MRC database to a file, or restores an MRC database from a dump file. An XML dump of the MRC database is created if the \fIdump\fP parameter is present. When dumping an MRC database, the XML file containing the dump will be created on the server at the path \fIdump_file\fP. Dumps can be restored by using the \fIrestore\fP parameter. For safety reasons, this is only possible if the target MRC does not have a database yet. - -.SH EXAMPLE USAGE -.B "xtfs_mrcdbtool -mrc oncrpc://localhost:32636 dump /tmp/dump.xml" -.PP -Dumps the database of the MRC running on \fIlocalhost:32636\fP to \fI/tmp/dump.xml\fP - -.B "xtfs_mrcdbtool -mrc oncrpc://localhost:32636 restore /tmp/dump.xml" -.PP -Restores the database of the MRC running on \fIlocalhost:32636\fP from the dump in \fI/tmp/dump.xml\fP - -.SH OPTIONS -.TP -.B \-c \fIcreds_file -Path to a PKCS#12 credentials file (private key + certificate) to use for SSL authentication. Must be present when MRC URL starts with oncrpcs://. -.TP -.B \-cpass \fIcreds_passphrase -An optional passphrase to access the credentials file. -.TP -.B \-h -Print help. -.TP -.B \-mrc \fImrc_url -The URL the MRC, e.g. oncrpc://localhost:32636. -.TP -.B \-p \fIpassphrase -The administrator password, if password protection is enabled -.TP -.B \-t \fItrusted_CAs -Path to a PKCS#12 file containing a set of certificates from trusted certification authorities. These certificates will be used to authenticate the MRC. Must be present when MRC URL starts with oncrpcs://. -.TP -.B \-tpass \fItrusted_passphrase -An optional passphrase to access the truststore file. -.RE - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH AVAILABILITY -The xtfs_mrcdbtool command is part of the XtreemFS-tools package and is available from http://www.xtreemfs.org \ No newline at end of file diff --git a/man/man1/xtfs_repl.1 b/man/man1/xtfs_repl.1 deleted file mode 100644 index 8aca3e88a0d742810926c590739c48f962652d1d..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_repl.1 +++ /dev/null @@ -1,130 +0,0 @@ -.TH xtfs_repl 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS tools" -.SH NAME -xtfs_repl \- tool for the management of file replicas and OSD selection. -.SH SYNOPSIS -\fBxtfs_repl [ \fIoptions\fB ] -.br - -.SH DESCRIPTION -.I xtfs_repl -adds, removes and lists replicas of a given file. - -.SH EXAMPLE USAGE -.B "xtfs_repl --set_readonly --auto_add dns xtreemfs/file.txt" -.PP -Marks the file 'xtreemfs/file.txt' as read-only and automatically adds a new replica to the file, provided that the path refers to a file in a mounted XtreemFS volume. OSDs for the new replica are automatically selected, as close to the client as possible. - -.SH OPTIONS -.TP -.TP -\fB-a \fI -Adds a replica from the given space-separated list of OSDs. Since the replica will be assigned the same striping policy as the original file, the number of OSDs must match the number of OSDs in the original file's striping policy. -.TP -\fB-c \fI -a PKCS#12 file containing user credentials for SSL-based server connections -.TP -\fB-cpass \fI -a pass phrase to decrypt the the user credentials file for SSL-based server connections -.TP -\fB-h/--help -show usage info -.TP -\fB-l -lists all replicas of the given file -.TP -\fB-o -Lists all suitable OSDs that can be used for a new replica of the given file. OSDs that are already assigned other replicas of the file will be automatically excluded from the list. -.TP -\fB-r \fI -Removes the replica with the given head OSD. The head OSD is the first OSD in the OSD list of a replica. -.TP -\fB-t \fI -a PKCS#12 file containing a set of certificates from trusted CAs for SSL-based server connections -.TP -\fB-tpass \fI -a pass phrase to decrypt the trusted CAs file for SSL-based server connections -.TP -\fB-w \fI<#OSDs> -specifies the number of OSDs to be used for this replica (i.e. stripe width) -.TP -\fB--add_auto \fIrandom|dns -Adds a replica and automatically selects OSDs according to the chosen method. The \fIrandom\fP method selects a random subset of all available OSDs for the new replica. The \fIdns\fP method selects those OSDs that are closest to the machine at which this command is executed. -.TP -\fB--full -if set, the replica will be a complete copy of the file; otherwise only requested data will be replicated -.TP -\fB--is_complete \fI -Checks if the given replica is complete, i.e. is a complete copy of the initial replica without any missing objects. -.TP -\fB--ocr_factor_set \fI -Adjusts the number of replicas assigned to a file when the file is closed after a write. A value of 1 indicates that no replicas will be added and the file remains writable. -.TP -\fB--ocr_factor_get -shows the current on-close replication factor -.TP -\fB--ocr_full_set \fItrue | false -sets whether full replicas will be created when on-close replication is in effect -.TP -\fB--ocr_full_get -shows whether full replicas will be created by means of the on-close replication mechanism -.TP -\fB--pol_attrs_get -shows all policy-specific attributes -.TP -\fB--pol_attr_set \fI -Sets a policy-specific attribute. Policy-specific attributes can be used to configure OSD and replica selection policies. - -The following attributes will be recognized by the predefined policies (policy IDs in brackets): - \fIdomains\fP (1001) - a list of comma or space-separated domain names, one of which an OSD must be in to be regarded as suitable for a new file or replica (leading and trailing '*'s are possible) - \fIfree_capacity_bytes\fP (1000) - the minimum free capacity in bytes an OSD must have to be regarded as suitable for a new file or replica - \fIoffline_time_secs\fP (1000) - the maximum time in seconds an OSD may have failed to send a heartbeat signal in order to be regarded as suitable for a new file or replica - \fIuuids\fP (1002) - a list of comma or space-separated UUIDs, one of which an OSD must have to be regarded as suitable for a new file or replica (leading and trailing '*'s are possible) -.TP -\fB--osp_get -shows the volume's current list of OSD selection policies -.TP -\fB--osp_set \fIdefault | fqdn | uuid | dcmap | -Sets a list of successively applied OSD selection policies. OSD selection policies are used to select subsets among all known OSDs that are assigned to newly created files and replicas. \fIdefault\fP, \fIfqdn\fP and \fIdcmap\fP are pre-packaged policies that select OSDs randomly, based on their host's FQDNs, and based on a data center map, accordingly. - -The following policies are available by default: - \fI1000\fP - filter out dead OSDs and OSDs that do not have sufficient space - \fI1001\fP - filter out OSDs with FQDNs that do not match a given set of domains - \fI1002\fP - filter out OSDs with UUIDs that do not match a given set of UUIDs - \fI2000\fP - select a group of OSDs according to a data center map - \fI2001\fP - select the group of OSDs that provides enough OSDs, is in the same domain, and is closest to the client -.TP -\fB--rsp_get -shows the volume's current list of replica selection policies -.TP -\fB--rsp_set \fIdefault | random | fqdn | dcmap | -Sets a list of successively applied replica selection policies. Replica selection policies are used to define the order in which the client will attempt to access the replicas of a file. The client will first try to access the first replica, and - in case of a failed attempt - the next one, and so on. Replica selection policies can e.g. be used to make sure that clients will always attempt to access local replicas first. \fIdefault\fP, \fIfqdn\fP and \fIdcmap\fP are pre-packaged policies that do not reorder the list at all, reorder it based on the distance between the client's and OSD host's FQDN, and based on a data center map, accordingly. - -The following policies are available by default: - \fI3000\fP - randomly shuffles the list of OSDs - \fI3001\fP - sorts the list of OSDs in the order of their distance to the client, according to the data center map - \fI3002\fP - sorts the list of OSDs in the order of their distances between the hosts' FQDNs and the client's FQDN -.TP -\fB--set_readonly -Marks the file as read-only. Having marked the file as read-only will effect that any kind of write access to the file will be denied in the future. Marking a file as read-only is a prerequisite for adding new replicas to the file. -.TP -\fB--set_writeable -Revokes the read-only status of a file. This is only possible as long as the file has no more than a single replica. -.TP -\fB--strategy \fIrandom|sequential -EXPERIMENTAL - specifies the strategy for data transfers that are initiated between OSDs in order to stream data between replicas - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1) -.BR - -.SH AVAILABILITY -The xtfs_repl command is part of the XtreemFS-tools package and is available from http://www.xtreemfs.org diff --git a/man/man1/xtfs_rmvol.1 b/man/man1/xtfs_rmvol.1 deleted file mode 120000 index 8632c9eb587dd3d6a15cf82f21d35f2feb3fec01..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_rmvol.1 +++ /dev/null @@ -1 +0,0 @@ -rmfs.xtreemfs.1 \ No newline at end of file diff --git a/man/man1/xtfs_scrub.1 b/man/man1/xtfs_scrub.1 deleted file mode 100644 index 5194612c309627ea8482db6a91b49c514625e3a3..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_scrub.1 +++ /dev/null @@ -1,64 +0,0 @@ -.TH xtfs_scrub 1 "January 2010" "The XtreemFS Distributed File System" "XtreemFS tools" -.SH NAME -xtfs_scrub \- checks for each file in a volume if the MRC file size is outdated and if the checksum of all objects is correct. The scrubber can also replace defective replicas in repair mode. -.SH SYNOPSIS -\fBxtfs_scrub [ \fIoptions\fB ] \fI\fB -.br - -.SH DESCRIPTION -.I xtfs_scrub -performs a consistency check of each file in a given volume. If run without -repair or -delete it will only perform checks and report problems. Th scrubber checks for file if the file size on the OSDs is stored on the MRC and fixes inconsistencies if run in the -repair mode. In addition, the scrubber checks the checksum for each object of a file if the checksums are enabled on the OSD. - -For replicated files the scrubber will check each replica for objects with inccorect checksum. In addition, it marks full replicas that successfully copied all objects as "complete" replicas. In the -repair mode, the scrubber will also replace replicas that contain ramoved OSDs. An OSD must be marked as dead/removed with the xtfs_chstatus tool, otherwise the scrubber will consider the OSD as temporarily unavailable and won't replace the replica. - -.SH EXAMPLE USAGE -.B "xtfs_scrub -dir oncrpc://localhost:32638 myVolume -.PP -Scrubs all files in the volume named 'myVolume' registered at the Directory Service 'oncrpc://localhost:32638'. - -.SH OPTIONS -.TP -.TP -\fB-c \fI -a PKCS#12 file containing user credentials for SSL-based server connections -.TP -\fB-cpass \fI -a pass phrase to decrypt the the user credentials file for SSL-based server connections -.TP -\fB\-delete -deletes files where the objects are lost because they were stored on a failed/removed OSD -.TP -\fB-dir \fI -Specifies the directory service to use (e.g. 'oncrpc://localhost:32638'). If no URI is specified, URI and security settings are taken from '/etc/xos/xtreemfs/default_dir'. In case of a secured URI ('oncrpcs://...'), it is necessary to also specify SSL settings. -.TP -\fB-h -show usage info -.TP -\fB\-repair -repair inconsistent file sizes and replace replicas on failed/removed OSD -.TP -\fB-t \fI -a PKCS#12 file containing a set of certificates from trusted CAs for SSL-based server connections -.TP -\fB\-thrs \fI<#threads> -number of threads to use for scrubbing (default=10) -.TP -\fB-tpass \fI -a pass phrase to decrypt the trusted CAs file for SSL-based server connections - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_sp (1), -.BR xtfs_stat (1), -.BR xtfs_chstatus (1) -.BR - -.SH AVAILABILITY -The xtfs_scrub command is part of the XtreemFS-tools package and is available from http://www.xtreemfs.org diff --git a/man/man1/xtfs_sp.1 b/man/man1/xtfs_sp.1 deleted file mode 100644 index d28d9ad97ff7ba87a106f7ec4e507ba16ab0d593..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_sp.1 +++ /dev/null @@ -1,61 +0,0 @@ -.TH xtfs_sp 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS client" -.SH NAME -xtfs_sp \- get and set the default striping policy associated with an XtreemFS directory or volume. -.SH SYNOPSIS -\fBxtfs_sp \--get|--set [options] \fIpath\fP -.br - -.SH DESCRIPTION -.I xtfs_sp -gets or sets the default striping policy assigned to a directory, where \fIpath\fP -refers to a file or directory that is part of a mounted XtreemFS volume. The \fIset\fP command sets the default striping policy of \fIpath\fP. The \fIget\fP command shows the striping policy currently assigned to \fIpath\fP. - -.SH OPTIONS - -.TP -\fB\-h -print usage info -.TP -\fB\-p/\-\-striping-policy=\fINONE|RAID0 -the striping pattern -.TP -\fB\-s/\-\-striping-policy-stripe-size=\fIkb -size of each stripe (object) in kB -.TP -\fB\-v/\-\-verbose -print more information -.TP -\fB\-w/\-\-striping-policy-width=\fIn -the number of OSDs to stripe the file to -.TP -\fB\-\-get -retrieve and display the default striping policy for a volume or directory -.TP -\fB\-\-set -changes the default striping policy for a volume or directory, -p -s and -w must be specified - -.SH EXAMPLE USAGE -.B "xtfs_sp --set -p RAID0 -w 4 -s 256 ./xtfs-dir -.PP -sets the default striping policy of the directory \fB./xtfs-dir\fP to a \fBRAID0\fP striping pattern with a stripe size of \fB256kb\fP and a maximum amount of \fB4\fP OSDs. -.PP -.B "xtfs_sp --get ./xtfs-dir -.PP -shows the default striping policy assigned to the directory \fB./xtfs-dir\fP. - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_stat (1) -.BR - - -.SH AVAILABILITY -The xtfs_sp command is part of the XtreemFS-tools package and is available from http://www.XtreemFS.org \ No newline at end of file diff --git a/man/man1/xtfs_stat.1 b/man/man1/xtfs_stat.1 deleted file mode 100644 index a4693199010cf9f6df1ca9aa7ea5e236408b8991..0000000000000000000000000000000000000000 --- a/man/man1/xtfs_stat.1 +++ /dev/null @@ -1,29 +0,0 @@ -.TH xtfs_stat 1 "October 2009" "The XtreemFS Distributed File System" "XtreemFS client" -.SH NAME -xtfs_stat \- shows extended information on an XtreemFS file or directory -.SH SYNOPSIS -\fBxtfs_stat [\fIpath\fR] -.br - -.SH DESCRIPTION -.I xtfs_stat -shows information about a file or directory \fIpath\fP. \fIxtfs_stat\fR lists all kinds of POSIX and XtreemFS-specific metadata. - -.SH EXAMPLE USAGE -.B "xtfs_stat xtfs-mount/somedir/myfile" - -.SH "SEE ALSO" -.BR lsfs.xtreemfs (1), -.BR mkfs.xtreemfs (1), -.BR mount.xtreemfs (1), -.BR rmfs.xtreemfs (1), -.BR umount.xtreemfs (1), -.BR xtfs_cleanup (1), -.BR xtfs_mrcdbtool (1), -.BR xtfs_repl (1), -.BR xtfs_scrub (1), -.BR xtfs_sp (1) -.BR - -.SH AVAILABILITY -The xtfs_stat command is part of the XtreemFS-tools package and is available from http://www.xtreemfs.org. \ No newline at end of file diff --git a/packaging/README b/packaging/README deleted file mode 100644 index d10a4d8dbba7a6d6c51ddba593015c9eb2415295..0000000000000000000000000000000000000000 --- a/packaging/README +++ /dev/null @@ -1,11 +0,0 @@ -HOW TO PACKAGE AND DEPLOY A NEW VERSION OF XTREEMFS -=================================================== - -1. create a new release branch/tag for the new version in the SVN -2. check out the release branch/tag -3. cd /packaging -4. ./build_release-pacakges .. -5. ./deploy_release-packages dist test - -If the test distribution works w/o any problems: -6. ./deploy_release-packages dist release diff --git a/packaging/build-service/meta.xml b/packaging/build-service/meta.xml deleted file mode 100644 index 5d89842a67d9817c0a5be37f6ee44b57fd18740b..0000000000000000000000000000000000000000 --- a/packaging/build-service/meta.xml +++ /dev/null @@ -1,11 +0,0 @@ - - XtreemFS _VERSION_ - - XtreemFS is a parallel, object-based file system, which is designed for deployment in federated IT infrastructures. It specifically addresses the challenges posed by high latencies and complex failure cases of a cross-site cross-organization environment. - The first release of XtreemFS provides high-performance file access with object-based striping of file data across storage servers. It comes with access control and authentication that seamlessly integrates with XtreemOS' Grid security infrastructure and implements Unix access control and POSIX ACLs. Pluggable access policies make it flexible enough to adapt it to other X.509-based security infrastructures. - - - - - - diff --git a/packaging/build-service/xtreemfs/debian.changelog b/packaging/build-service/xtreemfs/debian.changelog deleted file mode 100644 index d001cbe85393ae274b88eb8e4c01f5114453686f..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.changelog +++ /dev/null @@ -1,6 +0,0 @@ -xtreemfs (_VERSION_) stable; urgency=low - - * Release _VERSION_ - - -- xtreemfs Wed, 16 Jun 2008 15:42:09 +0200 - diff --git a/packaging/build-service/xtreemfs/debian.control b/packaging/build-service/xtreemfs/debian.control deleted file mode 100644 index c79abfb820d662ff3c0636b424e915439ce9f65a..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.control +++ /dev/null @@ -1,37 +0,0 @@ -Source: xtreemfs -Section: utils -Priority: optional -Maintainer: xtreemfs -Build-Depends: debhelper (>= 5), build-essential (>=11), libssl-dev (>= 0.9), libfuse-dev (>= 2.6), python (>= 2.4) | python2.4 | python2.5 | python2.6, ant (>= 1.6.5), java6-sdk -Homepage: http://www.xtreemfs.org/ -Standards-Version: 3.7.2 - -Package: xtreemfs-client -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, fuse-utils (>= 2.6) -Description: XtreemFS client - XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. This package contains the XtreemFS client module. - -Package: xtreemfs-client-policies-gridmap-flog -Architecture: any -Depends: ${shlibs:Depends}, ${misc:Depends}, xtreemfs-client (= ${binary:Version}) -Description: XtreemFS client gridmap_flog policy - XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. This package contains the gridmap_flog policy for the XtreemFS client. - -Package: xtreemfs-backend -Architecture: all -Depends: ${shlibs:Depends}, ${misc:Depends}, sudo, java6-runtime-headless -Description: XtreemFS server - XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. This package contains the XtreemFS server components (DIR, MRC, OSD). To run the XtreemFS services, a SUN JAVA 6 RUNTIME ENVIROMENT IS REQUIRED! Make sure that Java is installed in /usr/bin, or $JAVA_HOME is set. - -Package: xtreemfs-server -Architecture: all -Depends: ${shlibs:Depends}, ${misc:Depends}, xtreemfs-backend (= ${binary:Version}), sudo, java6-runtime-headless, uuid-runtime -Description: XtreemFS server - XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. This package contains the XtreemFS server components (DIR, MRC, OSD). To run the XtreemFS services, a SUN JAVA 6 RUNTIME ENVIROMENT IS REQUIRED! Make sure that Java is installed in /usr/bin, or $JAVA_HOME is set. - -Package: xtreemfs-tools -Architecture: all -Depends: ${shlibs:Depends}, ${misc:Depends}, xtreemfs-backend (= ${binary:Version}), attr (>=2), python (>= 2.6) | python2.6, java6-runtime-headless -Description: XtreemFS administration tools - XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. This package contains XtreemFS administration tools. To run the tools, a SUN JAVA 6 RUNTIME ENVIROMENT IS REQUIRED! Make sure that Java is installed in /usr/bin, or $JAVA_HOME is set. diff --git a/packaging/build-service/xtreemfs/debian.rules b/packaging/build-service/xtreemfs/debian.rules deleted file mode 100644 index 30e8457cd4ae2462522e9e2c18731976f66e0163..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.rules +++ /dev/null @@ -1,167 +0,0 @@ -#!/usr/bin/make -f -# Sample debian/rules that uses debhelper. -# GNU copyright 1997 to 1999 by Joey Hess. - -# Uncomment this to turn on verbose mode. -#export DH_VERBOSE=1 - -# This is the debhelper compatibility version to use. -export DH_COMPAT=4 - -CFLAGS = -g -ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) -CFLAGS += -O0 -else -CFLAGS += -O2 -endif - -BUILD_DIR:=$(CURDIR)/debian/xtreemfs - -build: build-stamp -build-stamp: - dh_testdir - - # Add here commands to compile the package. - sed -i -e "s@.*policy_dir_paths\.push_back( \"src/policies/lib\" );.*@@g"\ - -e "s@/lib/xtreemfs/policies/@/usr/lib/xtreemfs/policies/@g" src/libxtreemfs/user_database.cpp - make - # python share/scons.py - # --- end custom part for compiling - - touch build-stamp - -clean: - dh_testdir - dh_testroot - rm -f build-stamp - - # Add here commands to clean up after the build process. - #make clean - #make -C "." clean - # --- end custom part for cleaning up - - dh_clean - -install: build - dh_testdir - dh_testroot - dh_clean -k - dh_installdirs - - # Add here commands to install the package - # The DESTDIR Has To Be Exactly /usr/src/packages/BUILD/debian/debian/ - make install DESTDIR=$(BUILD_DIR) - - # remove copyright notes (let the sections below handle that) - rm $(BUILD_DIR)/usr/share/doc/xtreemfs-client/COPYING - rm $(BUILD_DIR)/usr/share/doc/xtreemfs-server/COPYING - rm $(BUILD_DIR)/usr/share/doc/xtreemfs-tools/COPYING - rmdir $(BUILD_DIR)/usr/share/doc/xtreemfs-client - rmdir $(BUILD_DIR)/usr/share/doc/xtreemfs-server - rmdir $(BUILD_DIR)/usr/share/doc/xtreemfs-tools - - # remove test program - rm -f $(BUILD_DIR)/usr/bin/xtfs_test - - # --- end custom part for installing - - # move files of the xtreemfs-client package - mkdir -p $(BUILD_DIR)-client/usr/bin - mv -t $(BUILD_DIR)-client/usr/bin \ - $(BUILD_DIR)/usr/bin/*.xtreemfs \ - $(BUILD_DIR)/usr/bin/xtfs_mount \ - $(BUILD_DIR)/usr/bin/xtfs_umount \ - $(BUILD_DIR)/usr/bin/xtfs_vivaldi \ - $(BUILD_DIR)/usr/bin/xtfs_lsvol \ - $(BUILD_DIR)/usr/bin/xtfs_mkvol \ - $(BUILD_DIR)/usr/bin/xtfs_rmvol - mkdir -p $(BUILD_DIR)-client/etc/init.d - mv -t $(BUILD_DIR)-client/etc/init.d \ - $(BUILD_DIR)/etc/init.d/xtreemfs-vivaldi - mkdir -p $(BUILD_DIR)-client/usr/share/man/man1 - mv -t $(BUILD_DIR)-client/usr/share/man/man1 \ - $(BUILD_DIR)/usr/share/man/man1/*.xtreemfs* - mkdir -p $(BUILD_DIR)-client/etc/xos/xtreemfs - mv -t $(BUILD_DIR)-client/etc/xos/xtreemfs \ - $(BUILD_DIR)/etc/xos/xtreemfs/default_dir - mkdir -p $(BUILD_DIR)-client/usr/share/doc/xtreemfs-client - cp -t $(BUILD_DIR)-client/usr/share/doc/xtreemfs-client \ - $(CURDIR)/COPYING - - # move files of the xtreemfs-client-policies-gridmap_flog package - mkdir -p $(BUILD_DIR)-client-policies-gridmap-flog/usr/lib/xtreemfs/policies/ - cp -t $(BUILD_DIR)-client-policies-gridmap-flog/usr/lib/xtreemfs/policies/ \ - $(CURDIR)/lib/libgridmap_flog.so - - # move files of the xtreemfs-backend package - mkdir -p $(BUILD_DIR)-backend/usr/share/java - mv -t $(BUILD_DIR)-backend/usr/share/java \ - $(BUILD_DIR)/usr/share/java/XtreemFS.jar \ - $(BUILD_DIR)/usr/share/java/yidl.jar \ - $(BUILD_DIR)/usr/share/java/BabuDB.jar - mkdir -p $(BUILD_DIR)-backend/usr/share/doc/xtreemfs-backend - cp -t $(BUILD_DIR)-backend/usr/share/doc/xtreemfs-backend \ - $(CURDIR)/COPYING - - # move files of the xtreemfs-server package - mkdir -p $(BUILD_DIR)-server/etc/init.d - mv -t $(BUILD_DIR)-server/etc/init.d \ - $(BUILD_DIR)/etc/init.d/xtreemfs-* - mkdir -p $(BUILD_DIR)-server/etc/xos/xtreemfs - mv -t $(BUILD_DIR)-server/etc/xos/xtreemfs \ - $(BUILD_DIR)/etc/xos/xtreemfs/*.properties \ - $(BUILD_DIR)/etc/xos/xtreemfs/generate_uuid \ - $(BUILD_DIR)/etc/xos/xtreemfs/postinstall_setup.sh - mkdir -p $(BUILD_DIR)-server/usr/share/doc/xtreemfs-server - cp -t $(BUILD_DIR)-server/usr/share/doc/xtreemfs-server \ - $(CURDIR)/COPYING - - # move files of the xtreemfs-tools package - # this file has already been moved and does not have to be explicitly excluded: - # %exclude /usr/bin/xtfs_*mount - mkdir -p $(BUILD_DIR)-tools/usr/bin - mv -t $(BUILD_DIR)-tools/usr/bin \ - $(BUILD_DIR)/usr/bin/xtfs_* - mkdir -p $(BUILD_DIR)-tools/usr/share/man/man1 - mv -t $(BUILD_DIR)-tools/usr/share/man/man1 \ - $(BUILD_DIR)/usr/share/man/man1/xtfs_* - mkdir -p $(BUILD_DIR)-tools/usr/share/doc/xtreemfs-tools - cp -t $(BUILD_DIR)-tools/usr/share/doc/xtreemfs-tools \ - $(CURDIR)/COPYING - -# Build architecture-independent files here. -binary-indep: build install - # We have nothing to do by default. - -# Build architecture-dependent files here. -binary-arch: build install - dh_testdir - dh_testroot - #dh_installdebconf - dh_installdocs - dh_installexamples - dh_installmenu - #dh_installlogrotate - #dh_installemacsen - #dh_installpam - #dh_installmime - #dh_installinit - dh_installcron - dh_installman - dh_installinfo - #dh_undocumented - dh_installchangelogs - dh_link - dh_strip - dh_compress - dh_fixperms - #dh_makeshlibs - dh_installdeb - #dh_perl - dh_shlibdeps - dh_gencontrol - dh_md5sums - dh_builddeb - -binary: binary-indep binary-arch -.PHONY: build clean binary-indep binary-arch binary install diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-client.conffiles b/packaging/build-service/xtreemfs/debian.xtreemfs-client.conffiles deleted file mode 100644 index 1f465d3d836e2d18c51c5283266aafb8cb590ecc..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-client.conffiles +++ /dev/null @@ -1,2 +0,0 @@ -/etc/xos/xtreemfs/default_dir -/etc/init.d/xtreemfs-vivaldi diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-client.postinst b/packaging/build-service/xtreemfs/debian.xtreemfs-client.postinst deleted file mode 100644 index 632fa9aef8e017cc63f26c74abf3476d0d7355c6..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-client.postinst +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -e -# this scripts uses the tool 'uuidgen' - -#XTREEMFS_CONFIG_DIR=/etc/xos/xtreemfs/ -#$XTREEMFS_CONFIG_DIR/postinstall_setup.sh -_POSTINSTALL_ - -echo "Installing vivaldi RC-links..." -update-rc.d xtreemfs-vivaldi defaults > /dev/null - -echo "Re-starting vivaldi service if started..." -if which invoke-rc.d >/dev/null 2>&1; then - invoke-rc.d xtreemfs-vivaldi try-restart -else - /etc/init.d/xtreemfs-vivaldi try-restart -fi - -exit 0 diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-client.postrm b/packaging/build-service/xtreemfs/debian.xtreemfs-client.postrm deleted file mode 100644 index 81fdef66471967af9a73ff4baf0f4de43d5615fd..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-client.postrm +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -e - -if [ "$1" = purge ]; then - echo "Removing vivaldi RC-links" - update-rc.d -f xtreemfs-vivaldi remove > /dev/null -fi - -exit 0 diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-client.prerm b/packaging/build-service/xtreemfs/debian.xtreemfs-client.prerm deleted file mode 100644 index f34b37e7d10149ec278e5eb31ce0642babae1e2e..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-client.prerm +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -e - -# stop before remove -if [ "$1" = "remove" -o "$1" = "deconfigure" ]; then - echo "Stopping vivaldi service..." - if which invoke-rc.d >/dev/null 2>&1; then - invoke-rc.d xtreemfs-vivaldi stop - else - /etc/init.d/xtreemfs-vivaldi stop - fi -fi - -exit 0 diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-server.conffiles b/packaging/build-service/xtreemfs/debian.xtreemfs-server.conffiles deleted file mode 100644 index 00f9268f354342568e373a4ed37a6d17355ba118..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-server.conffiles +++ /dev/null @@ -1,7 +0,0 @@ -/etc/xos/xtreemfs/dirconfig.properties -/etc/xos/xtreemfs/generate_uuid -/etc/xos/xtreemfs/mrcconfig.properties -/etc/xos/xtreemfs/osdconfig.properties -/etc/init.d/xtreemfs-dir -/etc/init.d/xtreemfs-mrc -/etc/init.d/xtreemfs-osd diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-server.postinst b/packaging/build-service/xtreemfs/debian.xtreemfs-server.postinst deleted file mode 100644 index ef375176e4397734fd8fc7c89e57f2be51c0e147..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-server.postinst +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -set -e -# this scripts uses the tool 'uuidgen' - -XTREEMFS_CONFIG_DIR=/etc/xos/xtreemfs/ - -# generate UUIDs -if [ -x $XTREEMFS_CONFIG_DIR/generate_uuid ]; then - $XTREEMFS_CONFIG_DIR/generate_uuid $XTREEMFS_CONFIG_DIR/dirconfig.properties - $XTREEMFS_CONFIG_DIR/generate_uuid $XTREEMFS_CONFIG_DIR/mrcconfig.properties - $XTREEMFS_CONFIG_DIR/generate_uuid $XTREEMFS_CONFIG_DIR/osdconfig.properties -else - echo "UUID can't be generated automatically. Please enter a correct UUID in each config file of a xtreemfs service." -fi - -#$XTREEMFS_CONFIG_DIR/postinstall_setup.sh -_POSTINSTALL_ - -echo "Installing dir, mrc, osd RC-links..." -update-rc.d xtreemfs-dir defaults > /dev/null -update-rc.d xtreemfs-mrc defaults > /dev/null -update-rc.d xtreemfs-osd defaults > /dev/null - -echo "Re-starting dir, mrc, osd services if started..." -if which invoke-rc.d >/dev/null 2>&1; then - invoke-rc.d xtreemfs-dir try-restart - invoke-rc.d xtreemfs-mrc try-restart - invoke-rc.d xtreemfs-osd try-restart -else - /etc/init.d/xtreemfs-dir try-restart - /etc/init.d/xtreemfs-mrc try-restart - /etc/init.d/xtreemfs-osd try-restart -fi - -exit 0 diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-server.postrm b/packaging/build-service/xtreemfs/debian.xtreemfs-server.postrm deleted file mode 100644 index c572ec00ebe912fbf18ddda8a9af791ee94de5b5..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-server.postrm +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -set -e - -if [ "$1" = purge ]; then - echo "Removing dir, mrc, osd RC-links" - update-rc.d -f xtreemfs-dir remove > /dev/null - update-rc.d -f xtreemfs-mrc remove > /dev/null - update-rc.d -f xtreemfs-osd remove > /dev/null -fi - -exit 0 diff --git a/packaging/build-service/xtreemfs/debian.xtreemfs-server.prerm b/packaging/build-service/xtreemfs/debian.xtreemfs-server.prerm deleted file mode 100644 index 18f39410649b20e60fd74c51fd7a52aeb9614ad1..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/debian.xtreemfs-server.prerm +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash -set -e - -# stop before remove -if [ "$1" = "remove" -o "$1" = "deconfigure" ]; then - echo "Stopping dir, mrc, osd services..." - if which invoke-rc.d >/dev/null 2>&1; then - invoke-rc.d xtreemfs-dir stop - invoke-rc.d xtreemfs-mrc stop - invoke-rc.d xtreemfs-osd stop - else - /etc/init.d/xtreemfs-dir stop - /etc/init.d/xtreemfs-mrc stop - /etc/init.d/xtreemfs-osd stop - fi -fi - -exit 0 diff --git a/packaging/build-service/xtreemfs/xtreemfs.dsc b/packaging/build-service/xtreemfs/xtreemfs.dsc deleted file mode 100644 index 3537272d339f8e760138b37a5aacf519a19b6595..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/xtreemfs.dsc +++ /dev/null @@ -1,9 +0,0 @@ -Format: 1.0 -Source: xtreemfs -Version: _VERSION_ -Binary: xtreemfs -Maintainer: xtreemfs -Architecture: any -Build-Depends: debhelper (>= 5), build-essential (>=11), libssl-dev (>= 0.9), libfuse-dev (>= 2.6), python (>= 2.4) | python2.4 | python2.5 | python2.6, ant (>= 1.6.5), java6-sdk -Files: - d57283ebb8157ae919762c58419353c8 133282 XtreemFS-_VERSION_.tar.gz diff --git a/packaging/build-service/xtreemfs/xtreemfs.spec b/packaging/build-service/xtreemfs/xtreemfs.spec deleted file mode 100644 index e97614a7837a1abc103aabfe7a752f1281d8933e..0000000000000000000000000000000000000000 --- a/packaging/build-service/xtreemfs/xtreemfs.spec +++ /dev/null @@ -1,354 +0,0 @@ -# norootforbuild - -%if 0%{?mandriva_version} == 2007 || 0%{?mdkversion} == 200700 || 0%{?rhel_version} == 501 || 0%{?centos_version} == 501 || 0%{?sles_version} == 10 -%define client_subpackage 0 -%else -%define client_subpackage 1 -%endif - -Name: xtreemfs -Version: _VERSION_ -Release: 1 -License: GPL -BuildRoot: %{_tmppath}/%{name}-%{version}-build -Group: System/Filesystems -Summary: XtreemFS base package -Source0: XtreemFS-%{version}.tar.gz - -#requires for any distribution -BuildRequires: ant >= 1.6.5 java-devel >= 1.6.0 -%if %{client_subpackage} -BuildRequires: python >= 2.4 gcc-c++ >= 4.1 fuse >= 2.6 fuse-devel >= 2.6 openssl-devel >= 0.9.8 -%endif - -# openSUSE >=10.2 -%if 0%{?suse_version} >= 1020 -%define init_script_requires_pre /usr/sbin/groupadd /usr/sbin/useradd /bin/mkdir /usr/bin/grep /bin/chmod /bin/chown /bin/chgrp /usr/bin/stat %insserv_prereq -BuildRequires: pwdutils >= 3 -%endif - -# Mandriva >=2008 -%if 0%{?mandriva_version} >= 2007 -%define init_script_requires_pre /usr/sbin/groupadd /usr/sbin/useradd /bin/mkdir /bin/grep /bin/chmod /bin/chown /bin/chgrp /bin/stat -%endif - -# Fedora >=7 with Extras -%if 0%{?fedora_version} >= 7 -%define init_script_requires_pre /usr/sbin/groupadd /usr/sbin/useradd /bin/mkdir /bin/grep /bin/chmod /bin/chown /bin/chgrp /usr/bin/stat -BuildRequires: kernel redhat-rpm-config -%endif - -%description -XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. - -%if %{client_subpackage} -%package client -Summary: XtreemFS client -Group: System/Filesystems -#Requires: %{name} == %{version}-%{release} -Requires: fuse >= 2.6 -Provides: XtreemFS-client = %{version} -Obsoletes: XtreemFS-client < %{version} -%if 0%{?suse_version} -PreReq: %init_script_requires_pre -%endif -%if 0%{?mandriva_version} -Requires(pre): %init_script_requires_pre -Requires(preun): rpm-helper -Requires(post): rpm-helper -%endif -%if 0%{?fedora_version} -Requires(pre): %init_script_requires_pre -Requires(preun): chkconfig initscripts -Requires(post): chkconfig -Requires(postun): initscripts -%endif - -%description client -XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. - -This package contains the XtreemFS client module. - -%package client-policies-gridmap-flog -Summary: XtreemFS client gridmap_flog policy -Group: System/Filesystems -Requires: %{name}-client == %{version}-%{release} - -%description client-policies-gridmap-flog -XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. - -This package contains the gridmap_flog policy for the XtreemFS client. -%endif - -%package backend -Summary: XtreemFS backend modules and libraries -Group: System/Filesystems -#Requires: %{name} == %{version}-%{release} -Requires: jre >= 1.6.0 - -%description backend -XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. - -This package contains the backend modules and libraries shared between the server and tools sub-packages. - -%package server -Summary: XtreemFS server components (DIR, MRC, OSD) -Group: System/Filesystems -Requires: %{name}-backend == %{version}-%{release} -Requires: grep sudo -Requires: jre >= 1.6.0 -Provides: XtreemFS-server = %{version} -Obsoletes: XtreemFS-server < %{version} -Requires(post): util-linux -%if 0%{?suse_version} -PreReq: %init_script_requires_pre -%endif -%if 0%{?mandriva_version} -Requires(pre): %init_script_requires_pre -Requires(preun): rpm-helper -Requires(post): rpm-helper -%endif -%if 0%{?fedora_version} -Requires(pre): %init_script_requires_pre -Requires(preun): chkconfig initscripts -Requires(post): chkconfig -Requires(postun): initscripts -%endif - -%description server -XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. - -This package contains the XtreemFS server components (DIR, MRC, OSD). -To run the XtreemFS services, a SUN JAVA 6 RUNTIME ENVIROMENT IS REQUIRED! Make sure that Java is installed in /usr/bin, or $JAVA_HOME is set. - -%package tools -Summary: XtreemFS administration tools -Group: System/Filesystems -Requires: %{name}-backend == %{version}-%{release} -Requires: python >= 2.6 attr jre >= 1.6.0 -Provides: XtreemFS-tools = %{version} -Obsoletes: XtreemFS-tools < %{version} - -%description tools -XtreemFS is a distributed and replicated file system for the internet. For more details, visit www.xtreemfs.org. - -This package contains XtreemFS administration tools. -To run the tools, a SUN JAVA 6 RUNTIME ENVIROMENT IS REQUIRED! Make sure that Java is installed in /usr/bin, or $JAVA_HOME is set. - -%prep -%setup -q -n XtreemFS-%{version} - - -%build -export CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing" -export CXXFLAGS=$CFLAGS - -%if 0%{?mandriva_version} == 2008 || 0%{?centos_version} >= 501 || 0%{?rhel_version} >= 501 || 0%{?suse_version} == 1030 -export CCFLAGS="$CCFLAGS -fPIC" -%endif - -%if %{client_subpackage} -sed -i -e "s@.*policy_dir_paths\.push_back( \"src/policies/lib\" );.*@@g"\ - -e "s@/lib/xtreemfs/policies/@%{_libdir}/xtreemfs/policies/@g" src/libxtreemfs/user_database.cpp -make %{?jobs:-j%jobs} -%else -make %{?jobs:-j%jobs} server -#python share/scons.py -%endif - -%install -export NO_BRP_CHECK_BYTECODE_VERSION=true - -%if %{client_subpackage} -make install DESTDIR=$RPM_BUILD_ROOT -mkdir -p $RPM_BUILD_ROOT%{_libdir}/xtreemfs/policies/ -cp lib/libgridmap_flog.so $RPM_BUILD_ROOT%{_libdir}/xtreemfs/policies/ -%else -make install-server DESTDIR=$RPM_BUILD_ROOT -make install-tools DESTDIR=$RPM_BUILD_ROOT -%endif - -# add /etc/xos/xtreemfs/truststore/certs/ folder used for storing certificates -mkdir -p $RPM_BUILD_ROOT/etc/xos/xtreemfs/truststore/certs/ - -# remove copyright notes (let rpm handle that) -%if %{client_subpackage} -rm $RPM_BUILD_ROOT/usr/share/doc/xtreemfs-client/COPYING -rmdir $RPM_BUILD_ROOT/usr/share/doc/xtreemfs-client -%endif -rm $RPM_BUILD_ROOT/usr/share/doc/xtreemfs-server/COPYING -rmdir $RPM_BUILD_ROOT/usr/share/doc/xtreemfs-server -rm $RPM_BUILD_ROOT/usr/share/doc/xtreemfs-tools/COPYING -rmdir $RPM_BUILD_ROOT/usr/share/doc/xtreemfs-tools - -# remove test program -rm -f $RPM_BUILD_ROOT/usr/bin/xtfs_test - -%post server -XTREEMFS_CONFIG_DIR=/etc/xos/xtreemfs/ - -# generate UUIDs -if [ -x $XTREEMFS_CONFIG_DIR/generate_uuid ]; then - $XTREEMFS_CONFIG_DIR/generate_uuid $XTREEMFS_CONFIG_DIR/dirconfig.properties - $XTREEMFS_CONFIG_DIR/generate_uuid $XTREEMFS_CONFIG_DIR/mrcconfig.properties - $XTREEMFS_CONFIG_DIR/generate_uuid $XTREEMFS_CONFIG_DIR/osdconfig.properties -else - echo "UUID can't be generated automatically. Please enter a correct UUID in each config file of a xtreemfs service." -fi - -#$XTREEMFS_CONFIG_DIR/postinstall_setup.sh -_POSTINSTALL_ - -%if 0%{?suse_version} -%fillup_and_insserv -f xtreemfs-dir xtreemfs-mrc xtreemfs-osd -%restart_on_update xtreemfs-dir xtreemfs-mrc xtreemfs-osd -%endif -%if 0%{?fedora_version} -/sbin/chkconfig --add xtreemfs-dir xtreemfs-mrc xtreemfs-osd -%endif -%if 0%{?mandriva_version} -%_post_service xtreemfs-dir xtreemfs-mrc xtreemfs-osd -%endif - -%preun server -%if 0%{?suse_version} -%stop_on_removal xtreemfs-dir xtreemfs-mrc xtreemfs-osd -%endif -%if 0%{?fedora_version} -# 0 packages after uninstall -> pkg is about to be removed - if [ "$1" = "0" ] ; then - /sbin/service xtreemfs-dir stop >/dev/null 2>&1 - /sbin/service xtreemfs-mrc stop >/dev/null 2>&1 - /sbin/service xtreemfs-osd stop >/dev/null 2>&1 - /sbin/chkconfig --del xtreemfs-dir xtreemfs-mrc xtreemfs-osd - fi -%endif -%if 0%{?mandriva_version} -%_preun_service xtreemfs-dir xtreemfs-mrc xtreemfs-osd -%endif - -%postun server -%if 0%{?suse_version} -%insserv_cleanup -%endif -%if 0%{?fedora_version} -# >=1 packages after uninstall -> pkg was updated -> restart -if [ "$1" -ge "1" ] ; then - /sbin/service xtreemfs-dir condrestart >/dev/null 2>&1 || : - /sbin/service xtreemfs-mrc condrestart >/dev/null 2>&1 || : - /sbin/service xtreemfs-osd condrestart >/dev/null 2>&1 || : -fi -%endif -%if 0%{?mandriva_version} -%endif - -%if %{client_subpackage} -%post client -#XTREEMFS_CONFIG_DIR=/etc/xos/xtreemfs/ -#$XTREEMFS_CONFIG_DIR/postinstall_setup.sh -_POSTINSTALL_ - -%if 0%{?suse_version} -%fillup_and_insserv -f xtreemfs-vivaldi -%restart_on_update xtreemfs-vivaldi -%endif -%if 0%{?fedora_version} -/sbin/chkconfig --add xtreemfs-vivaldi -%endif -%if 0%{?mandriva_version} -%_post_service xtreemfs-vivaldi -%endif - -%preun client -%if 0%{?suse_version} -%stop_on_removal xtreemfs-vivaldi -%endif -%if 0%{?fedora_version} -# 0 packages after uninstall -> pkg is about to be removed - if [ "$1" = "0" ] ; then - /sbin/service xtreemfs-vivaldi stop >/dev/null 2>&1 - /sbin/chkconfig --del xtreemfs-vivaldi - fi -%endif -%if 0%{?mandriva_version} -%_preun_service xtreemfs-vivaldi -%endif - -%postun client -%if 0%{?suse_version} -%insserv_cleanup -%endif -%if 0%{?fedora_version} -# >=1 packages after uninstall -> pkg was updated -> restart -if [ "$1" -ge "1" ] ; then - /sbin/service xtreemfs-vivaldi condrestart >/dev/null 2>&1 || : -fi -%endif -%if 0%{?mandriva_version} -%endif -%endif - -%clean -rm -rf $RPM_BUILD_ROOT - -%if %{client_subpackage} -%files client -%defattr(-,root,root) -/usr/bin/*.xtreemfs -/usr/bin/xtfs_mount -/usr/bin/xtfs_umount -/usr/bin/xtfs_vivaldi -/usr/bin/xtfs_lsvol -/usr/bin/xtfs_mkvol -/usr/bin/xtfs_rmvol -%dir %{_libdir}/xtreemfs -%dir %{_libdir}/xtreemfs/policies -%config /etc/init.d/xtreemfs-vivaldi -/usr/share/man/man1/*.xtreemfs* -%dir /etc/xos/ -%dir /etc/xos/xtreemfs/ -%config(noreplace) /etc/xos/xtreemfs/default_dir -#/usr/share/doc/xtreemfs-client/ -%doc COPYING - -%files client-policies-gridmap-flog -%defattr(-,root,root) -%{_libdir}/xtreemfs/policies/libgridmap_flog.so -%endif - -%files backend -%defattr(-,root,root) -/usr/share/java/XtreemFS.jar -/usr/share/java/yidl.jar -/usr/share/java/BabuDB.jar -%doc COPYING - -%files server -%defattr(-,root,root) -%config /etc/init.d/xtreemfs-* -%exclude /etc/init.d/xtreemfs-vivaldi -%dir /etc/xos/ -%dir /etc/xos/xtreemfs/ -%dir %attr(0750,root,root) /etc/xos/xtreemfs/truststore/ -%dir %attr(0750,root,root) /etc/xos/xtreemfs/truststore/certs/ -%config(noreplace) %attr(0750,root,root) /etc/xos/xtreemfs/*.properties -/etc/xos/xtreemfs/generate_uuid -/etc/xos/xtreemfs/postinstall_setup.sh -#/usr/share/doc/xtreemfs-server/ -%doc COPYING - -%files tools -%defattr(-,root,root) -/usr/bin/xtfs_acl -/usr/bin/xtfs_chstatus -/usr/bin/xtfs_cleanup -/usr/bin/xtfs_mrcdbtool -/usr/bin/xtfs_repl -/usr/bin/xtfs_scrub -/usr/bin/xtfs_sp -/usr/bin/xtfs_stat -/usr/share/man/man1/xtfs_* -#/usr/share/doc/xtreemfs-tools/ -%doc COPYING - -%changelog diff --git a/packaging/build_release-packages.sh b/packaging/build_release-packages.sh deleted file mode 100755 index 63c23ffaba802b6d96fe1e24582b6696552fba0a..0000000000000000000000000000000000000000 --- a/packaging/build_release-packages.sh +++ /dev/null @@ -1,220 +0,0 @@ -#!/bin/bash - -# -------------------------- -# configuration -# -------------------------- - -# temporary directory for this script -TMP_PATH="/tmp/fsdRLgT24fDM7YqmfFlg85gLVf6aLGA6G" - -# white list for files/dirs which should be copied -# source (relative from XTREEMFS_HOME_DIR) and destination (in package) -XOS_ADDONS_WHITE_LIST=( - "src/servers/xtreemos" "xtreemos" - "src/policies" "policies" - "AUTHORS" "" - "COPYING" "" -) - -# black list for files/dirs which should NEVER be copied -XOS_ADDONS_BLACK_LIST=( -) - -# black list for files/dirs which should NEVER be copied -SOURCE_BLACK_LIST=( - "doc" - "bin/xtfs_snap" - "etc/xos/xtreemfs/*test" -) - -# -------------------------- -# begin script -# -------------------------- -usage() { -# creates packages for xtreemfs client and server - cat < [] -EOF - exit 0 -} - -# source tarball -build_source_tarball() { - PACKAGE_PATH="$TMP_PATH/$SOURCE_TARBALL_NAME" - - echo "build source distribution" - - cleanup_client $PACKAGE_PATH - - # delete all from black-list in temporary dir - delete_source_black_list $PACKAGE_PATH - - # wipe all files and directories from the 'packaging' directory, except - # for the post install and uuid gen scripts - mkdir $PACKAGE_PATH/tmp - mv $PACKAGE_PATH/packaging/generate_uuid $PACKAGE_PATH/tmp - mv $PACKAGE_PATH/packaging/postinstall_setup.sh $PACKAGE_PATH/tmp - rm -rf $PACKAGE_PATH/packaging - mv $PACKAGE_PATH/tmp $PACKAGE_PATH/packaging - - # delete all .svn directories - delete_svn $PACKAGE_PATH - - # delete UUID from config-files - grep -v '^uuid\W*=\W*\w\+' $PACKAGE_PATH/etc/xos/xtreemfs/dirconfig.properties > $PACKAGE_PATH/etc/xos/xtreemfs/dirconfig.properties_new - grep -v '^uuid\W*=\W*\w\+' $PACKAGE_PATH/etc/xos/xtreemfs/mrcconfig.properties > $PACKAGE_PATH/etc/xos/xtreemfs/mrcconfig.properties_new - grep -v '^uuid\W*=\W*\w\+' $PACKAGE_PATH/etc/xos/xtreemfs/osdconfig.properties > $PACKAGE_PATH/etc/xos/xtreemfs/osdconfig.properties_new - mv $PACKAGE_PATH/etc/xos/xtreemfs/dirconfig.properties_new $PACKAGE_PATH/etc/xos/xtreemfs/dirconfig.properties - mv $PACKAGE_PATH/etc/xos/xtreemfs/mrcconfig.properties_new $PACKAGE_PATH/etc/xos/xtreemfs/mrcconfig.properties - mv $PACKAGE_PATH/etc/xos/xtreemfs/osdconfig.properties_new $PACKAGE_PATH/etc/xos/xtreemfs/osdconfig.properties - - # create archive - tar -czf "$SOURCE_TARBALL_NAME.tar.gz" -C $TMP_PATH $SOURCE_TARBALL_NAME -} - -build_xtreemos_addons() { - - PACKAGE_PATH="$TMP_PATH/$XOS_ADDONS_PACKAGE_NAME" - PACKAGE_PATH_TMP="$TMP_PATH/$XOS_ADDONS_PACKAGE_NAME""_tmp" - - echo "build XtreemOS addons package" - - create_dir $PACKAGE_PATH - create_dir $PACKAGE_PATH_TMP - cp -a $XTREEMFS_HOME_DIR/* $PACKAGE_PATH_TMP - - # replace the scons.py softlink + dependencies - cp $PACKAGE_PATH_TMP/share/scons.py $PACKAGE_PATH_TMP/src/policies/scons.py - cp -r $PACKAGE_PATH_TMP/share/scons-local-* $PACKAGE_PATH_TMP/src/policies - - # delete all from black-list in temporary dir - delete_xos_addons_black_list $PACKAGE_PATH_TMP - - # copy white-list to temporary dir - copy_xos_addons_white_list $PACKAGE_PATH_TMP $PACKAGE_PATH - - # delete all .svn directories - delete_svn $PACKAGE_PATH - - tar czf "$XOS_ADDONS_PACKAGE_NAME.tar.gz" -C $PACKAGE_PATH . -} - -function copy_xos_addons_white_list() { - SRC_PATH=$1 - DEST_PATH=$2 - - for (( i = 0 ; i < ${#XOS_ADDONS_WHITE_LIST[@]} ; i=i+2 )) - do - SRC="$SRC_PATH/${XOS_ADDONS_WHITE_LIST[$i]}" - # if directory doesn't exist, create it for copying file - if [ -d $SRC_PATH/${XOS_ADDONS_WHITE_LIST[i]} ]; then - mkdir -p "$DEST_PATH/${XOS_ADDONS_WHITE_LIST[i+1]}" - SRC="$SRC/*" - else - TMP_DIRNAME=${XOS_ADDONS_WHITE_LIST[i+1]%/*} - mkdir -p "$DEST_PATH/$TMP_DIRNAME" - fi - cp -a $SRC "$DEST_PATH/${XOS_ADDONS_WHITE_LIST[$i+1]}" - done -} - -function delete_xos_addons_black_list() { - SRC_PATH=$1 - - for (( i = 0 ; i < ${#XOS_ADDONS_BLACK_LIST[@]} ; i++ )) - do - rm -Rf "$SRC_PATH/${XOS_ADDONS_BLACK_LIST[i]}" - done -} - -function delete_source_black_list() { - SRC_PATH=$1 - - for (( i = 0 ; i < ${#SOURCE_BLACK_LIST[@]} ; i++ )) - do - rm -Rf $SRC_PATH/${SOURCE_BLACK_LIST[i]} - done -} - -function create_dir() { - CREATE_DIR=$1 - if [ -d "$CREATE_DIR" ]; then - rm -Rf $CREATE_DIR - fi - mkdir -p $CREATE_DIR -} - -function cleanup_client() { - CLEANUP_PATH=$1 - echo "cleanup client" - - # copy to temporary dir - create_dir $CLEANUP_PATH - cp -a $XTREEMFS_HOME_DIR/* "$CLEANUP_PATH" - - make -C "$CLEANUP_PATH" distclean -} - -function delete_svn() { - PACKAGE_PATH=$1 - find $PACKAGE_PATH -name ".svn" -print0 | xargs -0 rm -rf -} - -function prepare_build_files() { - cp -r $BUILD_FILES_DIR/xtreemfs $TARGET_DIR/xtreemfs - cp -r $BUILD_FILES_DIR/xtreemfs $TARGET_DIR/xtreemfs-testing - find $TARGET_DIR -type f -exec sed -i "s/_VERSION_/$VERSION/g" {} \; - # write contents of postinstall_setup.sh into the packages' spec files: - find $TARGET_DIR -type f -exec sed -i -e "/_POSTINSTALL_/r $BUILD_FILES_DIR/../postinstall_setup.sh" -e '/_POSTINSTALL_/d' {} \; - - cp $BUILD_FILES_DIR/meta.xml $TARGET_DIR/ - sed -i "s/_VERSION_/$VERSION/g" $TARGET_DIR/meta.xml -} - -function move_packages() { - cp $SOURCE_TARBALL_NAME.tar.gz $TARGET_DIR/xtreemfs - cp $SOURCE_TARBALL_NAME.tar.gz $TARGET_DIR/xtreemfs-testing - mv $XOS_ADDONS_PACKAGE_NAME.tar.gz $TARGET_DIR - mv $SOURCE_TARBALL_NAME.tar.gz $TARGET_DIR - echo $VERSION > $TARGET_DIR/VER -} - -VERSION= -XTREEMFS_HOME_DIR= - -# parse command line options -if [ -z "$1" ]; then - usage -fi -if [ -z "$2" ]; then - XTREEMFS_HOME_DIR="." -else - XTREEMFS_HOME_DIR="$2" -fi - -VERSION="$1" -if [ ! -d "$XTREEMFS_HOME_DIR/src/servers" ] ; -then - echo "directory is not the xtreemfs home directory" - usage -fi - -BUILD_FILES_DIR=$XTREEMFS_HOME_DIR/packaging/build-service -XOS_ADDONS_PACKAGE_NAME="XtreemFS-XOS-addons-$VERSION" -SOURCE_TARBALL_NAME="XtreemFS-$VERSION" - -TARGET_DIR=./dist - -# create temporary directory -create_dir $TMP_PATH -create_dir $TARGET_DIR - -# build packages -prepare_build_files -build_xtreemos_addons -build_source_tarball -move_packages - -# delete temporary directory -rm -Rf $TMP_PATH diff --git a/packaging/deploy_release-packages.sh b/packaging/deploy_release-packages.sh deleted file mode 100755 index ed40d506a557d2f40f315241b3f56a0a89dc2194..0000000000000000000000000000000000000000 --- a/packaging/deploy_release-packages.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash - - -usage() { -# deploys pacakges -cat < test|release -EOF - exit 0 -} - -# parse command line options -if [ -z "$2" ]; then - usage -fi - -DIR=$1 -CMD=$2 -VERSION=`cat $DIR/VER` - -TMP_DIR=/tmp/xtreemfs-upload - -if [ ! -f "/usr/bin/osc" ]; then - echo "osc command not found - please install osc first!" - exit 1 -fi - -cd $DIR -if [ $CMD == "test" ]; then - - # create a tmp dir, check out current build files, delete all files - mkdir -p $TMP_DIR - cd $TMP_DIR - osc co home:xtreemfs xtreemfs-testing - rm $TMP_DIR/home:xtreemfs/xtreemfs-testing/* - cd - - - # copy all new files, add new and delete old files, check in project - cp xtreemfs-testing/* $TMP_DIR/home:xtreemfs/xtreemfs-testing - osc addremove $TMP_DIR/home:xtreemfs/xtreemfs-testing/ - osc ci -m "update" $TMP_DIR/home:xtreemfs/xtreemfs-testing/ - - rm -rf $TMP_DIR - -elif [ $CMD == "release" ]; then - - # create release packages on the server - osc meta pkg home:xtreemfs xtreemfs-$VERSION --file meta.xml - - # create a tmp dir, check out current build files - mkdir -p $TMP_DIR - cd $TMP_DIR - - # copy the source packes to the new packages - osc co home:xtreemfs xtreemfs-$VERSION - - cd - - - cp xtreemfs/* $TMP_DIR/home:xtreemfs/xtreemfs-$VERSION - - # add and commit the new files - osc add $TMP_DIR/home:xtreemfs/xtreemfs-$VERSION/* - - cd - - cd $TMP_DIR/home:xtreemfs - osc ci -m "imported xtreemfs $VERSION" xtreemfs-$VERSION - cd - - - rm -rf $TMP_DIR - -fi diff --git a/packaging/generate_uuid b/packaging/generate_uuid deleted file mode 100755 index 48eaab1274a1781cf8993bf3185145fe83dce47a..0000000000000000000000000000000000000000 --- a/packaging/generate_uuid +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash -# this scripts uses the tool 'uuidgen' - -CFGFILE=$1 #name of the config file (osdconfig, mrcconfig) - -grep -e '^uuid\W*=\W*\w\+' $CFGFILE > /dev/null - -if [ $? -ne 0 ] -then - UUID=`which uuidgen` - if [ $? -ne 0 ] - then - UUID=$RANDOM"-"$RANDOM"-"$RANDOM"-"$RANDOM - echo "WARNING: uuidgen is not available, the generated UUID contains just random numbers. THIS UUID IS PROBABLY NOT UNIQUE, PLEASE CREATE A REAL UUID OF YOU INTEND TO USE THIS SERVICE IN A MULTI-SERVER ENVIRONMENT." - else - UUID=`$UUID` - fi - - echo "" >> $CFGFILE - echo "# The UUID is the globally unique name of this service." >> $CFGFILE - echo "# You must not change the UUID once the service has been used" >> $CFGFILE - echo "# to change the address/hostname or port of a service please" >> $CFGFILE - echo "# change the UUID Mapping in the directory service." >> $CFGFILE - echo "uuid = "$UUID >> $CFGFILE -fi \ No newline at end of file diff --git a/packaging/postinstall_setup.sh b/packaging/postinstall_setup.sh deleted file mode 100644 index 995abe85c16dce44e907ad6ab1453ffd7e5efaf5..0000000000000000000000000000000000000000 --- a/packaging/postinstall_setup.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -set -e - -XTREEMFS_LOG_DIR=/var/log/xtreemfs -XTREEMFS_HOME=/var/lib/xtreemfs -XTREEMFS_ETC=/etc/xos/xtreemfs -XTREEMFS_USER=xtreemfs -XTREEMFS_GROUP=xtreemfs - -group_exists=`grep -c 1$XTREEMFS_GROUP /etc/group || true` -if [ $group_exists -eq 0 ]; then - groupadd $XTREEMFS_GROUP - echo "created group $XTREEMFS_GROUP" -fi -exists=`grep -c $XTREEMFS_USER /etc/passwd || true` -if [ $exists -eq 0 ]; then - mkdir $XTREEMFS_HOME - useradd -r --home $XTREEMFS_HOME -g $XTREEMFS_GROUP $XTREEMFS_USER - chown $XTREEMFS_USER $XTREEMFS_HOME - echo "created user $XTREEMFS_USER and data directory $XTREEMFS_HOME" -else - if [ ! -d $XTREEMFS_HOME ]; then - mkdir $XTREEMFS_HOME - echo "user $XTREEMFS_USER exists but created data directory $XTREEMFS_HOME" - fi - owner=`stat -c %U $XTREEMFS_HOME` - if [ $owner != $XTREEMFS_USER ]; then - echo "directory $XTREEMFS_HOME is not owned by $XTREEMFS_USER, executing chmod (may take some time)" - chown -R $XTREEMFS_USER $XTREEMFS_HOME - fi -fi - -if [ ! -e $XTREEMFS_LOG_DIR ]; then - mkdir $XTREEMFS_LOG_DIR - chown -R $XTREEMFS_USER $XTREEMFS_LOG_DIR -fi - -if [ -e $XTREEMFS_ETC ]; then - group=`stat -c %G $XTREEMFS_ETC` - if [ $group != $XTREEMFS_GROUP ]; then - echo "directory $XTREEMFS_ETC is not owned by $XTREEMFS_GROUP, executing chmod (may take some time)" - chgrp -R $XTREEMFS_GROUP $XTREEMFS_ETC - fi - if [ -f $XTREEMFS_ETC/*.properties ]; then - echo "setting $XTREEMFS_ETC/*.properties 0750, executing chmod" - chmod 0750 $XTREEMFS_ETC/*.properties - fi - if [ -d "$XTREEMFS_ETC/truststore/" ] - then - echo "setting $XTREEMFS_ETC/truststore/ to 0750, executing chmod (may take some time)" - chmod -R 0750 $XTREEMFS_ETC/truststore/ - fi -fi diff --git a/packaging/windows/XtreemFS Client Setup/XtreemFS Client Setup.vdproj b/packaging/windows/XtreemFS Client Setup/XtreemFS Client Setup.vdproj deleted file mode 100644 index b6cffb2ba29a3d254cf93a673be34ef49b21bcdd..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS Client Setup/XtreemFS Client Setup.vdproj +++ /dev/null @@ -1,1579 +0,0 @@ -"DeployProject" -{ -"VSVersion" = "3:800" -"ProjectType" = "8:{978C614F-708E-4E1A-B201-565925725DBA}" -"IsWebType" = "8:FALSE" -"ProjectName" = "8:xtreemfs-client-setup" -"LanguageId" = "3:1033" -"CodePage" = "3:1252" -"UILanguageId" = "3:1033" -"SccProjectName" = "8:" -"SccLocalPath" = "8:" -"SccAuxPath" = "8:" -"SccProvider" = "8:" - "Hierarchy" - { - "Entry" - { - "MsmKey" = "8:_030F3F58D4C84BB0BA2D98BC9A0F291F" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_13793C01461F339109A5263EA2A05103" - "OwnerKey" = "8:_030F3F58D4C84BB0BA2D98BC9A0F291F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_13793C01461F339109A5263EA2A05103" - "OwnerKey" = "8:_F174E0C5AA1F41EF823B26CCCC60C433" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_13793C01461F339109A5263EA2A05103" - "OwnerKey" = "8:_D7E3E18AEAD748A984D29AC7E0F107A7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_13793C01461F339109A5263EA2A05103" - "OwnerKey" = "8:_813FC4DBF3BF49FA8891E893A805EBBB" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_13793C01461F339109A5263EA2A05103" - "OwnerKey" = "8:_62097A22EAD342D89A71DD8BDEFF5DAF" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_168FF2C98F1E4121862FDC56705C25F0" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_24852FEEA9F04548802A909D0CB49B27" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2539652531B4431885CC00A9BA084F3D" - "OwnerKey" = "8:_030F3F58D4C84BB0BA2D98BC9A0F291F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2539652531B4431885CC00A9BA084F3D" - "OwnerKey" = "8:_F174E0C5AA1F41EF823B26CCCC60C433" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2539652531B4431885CC00A9BA084F3D" - "OwnerKey" = "8:_D7E3E18AEAD748A984D29AC7E0F107A7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2539652531B4431885CC00A9BA084F3D" - "OwnerKey" = "8:_813FC4DBF3BF49FA8891E893A805EBBB" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2539652531B4431885CC00A9BA084F3D" - "OwnerKey" = "8:_62097A22EAD342D89A71DD8BDEFF5DAF" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2AC0821EC04BE735757A1CF7C5E64740" - "OwnerKey" = "8:_030F3F58D4C84BB0BA2D98BC9A0F291F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2AC0821EC04BE735757A1CF7C5E64740" - "OwnerKey" = "8:_F174E0C5AA1F41EF823B26CCCC60C433" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2AC0821EC04BE735757A1CF7C5E64740" - "OwnerKey" = "8:_D7E3E18AEAD748A984D29AC7E0F107A7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2AC0821EC04BE735757A1CF7C5E64740" - "OwnerKey" = "8:_813FC4DBF3BF49FA8891E893A805EBBB" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_2AC0821EC04BE735757A1CF7C5E64740" - "OwnerKey" = "8:_62097A22EAD342D89A71DD8BDEFF5DAF" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_4F37B9A4C3BD44D480307F676F6FB0CB" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_4FC5143C80F24A3EBB772E157A735BAA" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5A2DBFE685657D2E9310109BDCB5EE17" - "OwnerKey" = "8:_F174E0C5AA1F41EF823B26CCCC60C433" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5A2DBFE685657D2E9310109BDCB5EE17" - "OwnerKey" = "8:_D7E3E18AEAD748A984D29AC7E0F107A7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5A2DBFE685657D2E9310109BDCB5EE17" - "OwnerKey" = "8:_813FC4DBF3BF49FA8891E893A805EBBB" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5A2DBFE685657D2E9310109BDCB5EE17" - "OwnerKey" = "8:_62097A22EAD342D89A71DD8BDEFF5DAF" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5A2DBFE685657D2E9310109BDCB5EE17" - "OwnerKey" = "8:_030F3F58D4C84BB0BA2D98BC9A0F291F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_5B6D903177C641AB8DA3D5E59B48AC4B" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_62097A22EAD342D89A71DD8BDEFF5DAF" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_7D41E6E0D906FE29F9C3E2E383F344A7" - "OwnerKey" = "8:_030F3F58D4C84BB0BA2D98BC9A0F291F" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_7D41E6E0D906FE29F9C3E2E383F344A7" - "OwnerKey" = "8:_F174E0C5AA1F41EF823B26CCCC60C433" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_7D41E6E0D906FE29F9C3E2E383F344A7" - "OwnerKey" = "8:_D7E3E18AEAD748A984D29AC7E0F107A7" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_7D41E6E0D906FE29F9C3E2E383F344A7" - "OwnerKey" = "8:_813FC4DBF3BF49FA8891E893A805EBBB" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_7D41E6E0D906FE29F9C3E2E383F344A7" - "OwnerKey" = "8:_62097A22EAD342D89A71DD8BDEFF5DAF" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_813FC4DBF3BF49FA8891E893A805EBBB" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_C0D2BB9D8D074B00AEE80E76DF374E95" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D530F0DE72B04DF8BAE304E6F3369DB0" - "OwnerKey" = "8:_2539652531B4431885CC00A9BA084F3D" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_D7E3E18AEAD748A984D29AC7E0F107A7" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_F174E0C5AA1F41EF823B26CCCC60C433" - "OwnerKey" = "8:_UNDEFINED" - "MsmSig" = "8:_UNDEFINED" - } - "Entry" - { - "MsmKey" = "8:_UNDEFINED" - "OwnerKey" = "8:_5B6D903177C641AB8DA3D5E59B48AC4B" - "MsmSig" = "8:_UNDEFINED" - } - } - "Configurations" - { - "Debug" - { - "DisplayName" = "8:Debug" - "IsDebugOnly" = "11:TRUE" - "IsReleaseOnly" = "11:FALSE" - "OutputFilename" = "8:Debug\\XtreemFS Client Setup.msi" - "PackageFilesAs" = "3:2" - "PackageFileSize" = "3:-2147483648" - "CabType" = "3:1" - "Compression" = "3:2" - "SignOutput" = "11:FALSE" - "CertificateFile" = "8:" - "PrivateKeyFile" = "8:" - "TimeStampServer" = "8:" - "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5" - { - "Name" = "8:.NET Framework 3.5" - "ProductCode" = "8:Microsoft.Net.Framework.3.5" - } - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" - { - "Name" = "8:Windows Installer 3.1" - "ProductCode" = "8:Microsoft.Windows.Installer.3.1" - } - } - } - } - "Release" - { - "DisplayName" = "8:Release" - "IsDebugOnly" = "11:FALSE" - "IsReleaseOnly" = "11:TRUE" - "OutputFilename" = "8:Release\\XtreemFS Client Setup.msi" - "PackageFilesAs" = "3:2" - "PackageFileSize" = "3:-2147483648" - "CabType" = "3:1" - "Compression" = "3:2" - "SignOutput" = "11:FALSE" - "CertificateFile" = "8:" - "PrivateKeyFile" = "8:" - "TimeStampServer" = "8:" - "InstallerBootstrapper" = "3:2" - "BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}" - { - "Enabled" = "11:TRUE" - "PromptEnabled" = "11:TRUE" - "PrerequisitesLocation" = "2:1" - "Url" = "8:" - "ComponentsUrl" = "8:" - "Items" - { - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Net.Framework.3.5" - { - "Name" = "8:.NET Framework 3.5" - "ProductCode" = "8:Microsoft.Net.Framework.3.5" - } - "{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1" - { - "Name" = "8:Windows Installer 3.1" - "ProductCode" = "8:Microsoft.Windows.Installer.3.1" - } - } - } - } - } - "Deployable" - { - "CustomAction" - { - "{4AA51A2D-7D85-4A59-BA75-B0809FC8B380}:_0B2EE00F7DCE461082EA5D45D4C59D44" - { - "Name" = "8:dokanCtl.vbs" - "Condition" = "8:" - "Object" = "8:_C0D2BB9D8D074B00AEE80E76DF374E95" - "FileType" = "3:4" - "InstallAction" = "3:2" - "Arguments" = "8:" - "EntryPoint" = "8:" - "Sequence" = "3:1" - "Identifier" = "8:_CA190535_2F62_4D93_ABC9_D9BE9216B03E" - "InstallerClass" = "11:FALSE" - "CustomActionData" = "8:" - } - } - "DefaultFeature" - { - "Name" = "8:DefaultFeature" - "Title" = "8:" - "Description" = "8:" - } - "ExternalPersistence" - { - "LaunchCondition" - { - "{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_7BFF780F2F0643D6BA8BA45F56B596EF" - { - "Name" = "8:.NET Framework" - "Message" = "8:[VSDNETMSG]" - "Version" = "8:2.0.50727" - "AllowLaterVersions" = "11:FALSE" - "InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=76617" - } - } - } - "File" - { - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_13793C01461F339109A5263EA2A05103" - { - "SourcePath" = "8:NETAPI32.dll" - "TargetName" = "8:NETAPI32.dll" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_168FF2C98F1E4121862FDC56705C25F0" - { - "SourcePath" = "8:src\\license.rtf" - "TargetName" = "8:license.rtf" - "Tag" = "8:" - "Folder" = "8:_228D917002644B3BBD28F16D482D8378" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2AC0821EC04BE735757A1CF7C5E64740" - { - "SourcePath" = "8:LIBEAY32.dll" - "TargetName" = "8:LIBEAY32.dll" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_4FC5143C80F24A3EBB772E157A735BAA" - { - "SourcePath" = "8:src\\quickstart.rtf" - "TargetName" = "8:quickstart.rtf" - "Tag" = "8:" - "Folder" = "8:_228D917002644B3BBD28F16D482D8378" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5A2DBFE685657D2E9310109BDCB5EE17" - { - "SourcePath" = "8:dokan.dll" - "TargetName" = "8:dokan.dll" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:TRUE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7D41E6E0D906FE29F9C3E2E383F344A7" - { - "SourcePath" = "8:SSLEAY32.dll" - "TargetName" = "8:SSLEAY32.dll" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:TRUE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_97862E0BE00C485DB2C0E167DCA10D6D" - { - "SourcePath" = "8:src\\logo.jpg" - "TargetName" = "8:logo.jpg" - "Tag" = "8:" - "Folder" = "8:_228D917002644B3BBD28F16D482D8378" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_C0D2BB9D8D074B00AEE80E76DF374E95" - { - "SourcePath" = "8:src\\dokanCtl.vbs" - "TargetName" = "8:dokanCtl.vbs" - "Tag" = "8:" - "Folder" = "8:_228D917002644B3BBD28F16D482D8378" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - } - } - "FileType" - { - } - "Folder" - { - "{3C67513D-01DD-4637-8A68-80971EB9504F}:_228D917002644B3BBD28F16D482D8378" - { - "DefaultLocation" = "8:[ProgramFilesFolder]\\[ProductName]" - "Name" = "8:#1925" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:TARGETDIR" - "Folders" - { - } - } - "{1525181F-901A-416C-8A58-119130FE478E}:_4105870C245842A2B4A5786AAB01615C" - { - "Name" = "8:#1919" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:ProgramMenuFolder" - "Folders" - { - "{9EF0B969-E518-4E46-987F-47570745A589}:_80C1B9E571EA4F5CB82D8D7FA2B42FE9" - { - "Name" = "8:XtreemFS client" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:_48B5792BB8A84416B4FBEBCA13BE0B92" - "Folders" - { - } - } - } - } - "{1525181F-901A-416C-8A58-119130FE478E}:_9685661D2E3F4CB2A3377E30C36F09CF" - { - "Name" = "8:#1914" - "AlwaysCreate" = "11:FALSE" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Property" = "8:SystemFolder" - "Folders" - { - } - } - } - "LaunchCondition" - { - "{836E08B8-0285-4809-BA42-01DB6754A45D}:_856FA47D2C59403584504247C7EC715B" - { - "Name" = "8:dokanCondition" - "Condition" = "8:DOKANEXISTS1 OR DOKANEXISTS2 OR DOKANEXISTS3" - "Message" = "8:The DokanLibrary release 0.42 (x86) does not exist! Do you want to download and install it now?" - "InstallUrl" = "8:http://dokan-dev.net/en/" - } - } - "Locator" - { - "{B8A5E33E-1082-4FE2-AC2E-1197791E9409}:_3677EBF38A4E4708A73ECEB783EA13D0" - { - "Name" = "8:searchForDokan1" - "ComponentId" = "8:{ACD1DD7F-56FA-5F49-F290-DA4BA164E493}" - "Property" = "8:DOKANEXISTS1" - } - "{B8A5E33E-1082-4FE2-AC2E-1197791E9409}:_4850CC948AA34E349CC664133E76426E" - { - "Name" = "8:searchForDokan3" - "ComponentId" = "8:{CB22E88F-B038-8EEB-BA8A-221CA5BAFA8D}" - "Property" = "8:DOKANEXISTS3" - } - "{B8A5E33E-1082-4FE2-AC2E-1197791E9409}:_F1D428ACF6214CEF88B9070F41507429" - { - "Name" = "8:searchForDokan2" - "ComponentId" = "8:{8CF99CEF-08BD-CD71-C4D5-46203E133DA2}" - "Property" = "8:DOKANEXISTS2" - } - } - "MsiBootstrapper" - { - "LangId" = "3:1033" - "RequiresElevation" = "11:FALSE" - } - "Product" - { - "Name" = "8:Microsoft Visual Studio" - "ProductName" = "8:XtreemFS client" - "ProductCode" = "8:{BB0A6B75-6FFF-4BDD-B786-10D2C1E23337}" - "PackageCode" = "8:{9319C206-55D1-4E0F-89BB-7EE4E0BEB5B6}" - "UpgradeCode" = "8:{2A86374A-0526-47B2-B1E8-02CBE9E2AC01}" - "RestartWWWService" = "11:FALSE" - "RemovePreviousVersions" = "11:TRUE" - "DetectNewerInstalledVersion" = "11:TRUE" - "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.0.0" - "Manufacturer" = "8:Zuse Institute Berlin" - "ARPHELPTELEPHONE" = "8:" - "ARPHELPLINK" = "8:http://www.xtreemfs.org/" - "Title" = "8:XtreemFS client setup" - "Subject" = "8:Client for the fast, distributed, replicated XtreemFS." - "ARPCONTACT" = "8:Zuse Institute Berlin" - "Keywords" = "8:opensource, filesystem, distributed, replication, striping, posix" - "ARPCOMMENTS" = "8:XtreemFS is a distributed, object-based file system developed within the EU funded project XtreemOS." - "ARPURLINFOABOUT" = "8:http://www.zib.de/" - "ARPPRODUCTICON" = "8:" - "ARPIconIndex" = "3:0" - "SearchPath" = "8:" - "UseSystemSearchPath" = "11:TRUE" - "TargetPlatform" = "3:0" - "PreBuildEvent" = "8:" - "PostBuildEvent" = "8:" - "RunPostBuildEvent" = "3:0" - } - "Registry" - { - "HKLM" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BFFC8F01F0B64D06B31C69B592FE4C52" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_ADEC6FE806E844B2B3BDEB78E433B23A" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCU" - { - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_E25357497B8A4AD79CA9F9B4702BDA30" - { - "Name" = "8:Software" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - "{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_DBC5238EB9E64F9C86EA1D3CFA445406" - { - "Name" = "8:[Manufacturer]" - "Condition" = "8:" - "AlwaysCreate" = "11:FALSE" - "DeleteAtUninstall" = "11:FALSE" - "Transitive" = "11:FALSE" - "Keys" - { - } - "Values" - { - } - } - } - "Values" - { - } - } - } - } - "HKCR" - { - "Keys" - { - } - } - "HKU" - { - "Keys" - { - } - } - "HKPU" - { - "Keys" - { - } - } - } - "Sequences" - { - } - "Shortcut" - { - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_1A6BB33DB8334F0B9F1A9151DD1A6C29" - { - "Name" = "8:xtreemfs-client-utillity" - "Arguments" = "8:" - "Description" = "8:" - "ShowCmd" = "3:1" - "IconIndex" = "3:0" - "Transitive" = "11:FALSE" - "Target" = "8:_5B6D903177C641AB8DA3D5E59B48AC4B" - "Folder" = "8:_80C1B9E571EA4F5CB82D8D7FA2B42FE9" - "WorkingFolder" = "8:_228D917002644B3BBD28F16D482D8378" - "Icon" = "8:" - "Feature" = "8:" - } - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_54D2E2546709404489E19759E0CB5CBE" - { - "Name" = "8:license.rtf" - "Arguments" = "8:" - "Description" = "8:" - "ShowCmd" = "3:1" - "IconIndex" = "3:0" - "Transitive" = "11:FALSE" - "Target" = "8:_168FF2C98F1E4121862FDC56705C25F0" - "Folder" = "8:_80C1B9E571EA4F5CB82D8D7FA2B42FE9" - "WorkingFolder" = "8:_228D917002644B3BBD28F16D482D8378" - "Icon" = "8:" - "Feature" = "8:" - } - "{970C0BB2-C7D0-45D7-ABFA-7EC378858BC0}:_722E3A83C6DE4016910D6D154F6EE193" - { - "Name" = "8:quickstart.rtf" - "Arguments" = "8:" - "Description" = "8:" - "ShowCmd" = "3:1" - "IconIndex" = "3:0" - "Transitive" = "11:FALSE" - "Target" = "8:_4FC5143C80F24A3EBB772E157A735BAA" - "Folder" = "8:_80C1B9E571EA4F5CB82D8D7FA2B42FE9" - "WorkingFolder" = "8:_228D917002644B3BBD28F16D482D8378" - "Icon" = "8:" - "Feature" = "8:" - } - } - "UserInterface" - { - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_226D0782558847978D348C8686D555F0" - { - "Name" = "8:#1900" - "Sequence" = "3:2" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_568FF36F282B4978A013D7AB86A005F6" - { - "Sequence" = "3:220" - "DisplayName" = "8:Installation bestätigen" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_65A507553FA746A891B764A8602D9EA9" - { - "Sequence" = "3:100" - "DisplayName" = "8:Willkommen" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:XtreemFS is developed in the Data Management Work Package of the XtreemOS project, a software research and development project funded by the European Commission. More information about the XtreemOS project as well as software downloads can be found on www.XtreemOS.eu ." - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E761E9757FCF4E769F9E1A5D2A29CF50" - { - "Sequence" = "3:210" - "DisplayName" = "8:Lizenzvertrag" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminLicenseDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "EulaText" - { - "Name" = "8:EulaText" - "DisplayName" = "8:#1008" - "Description" = "8:#1108" - "Type" = "3:6" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:_168FF2C98F1E4121862FDC56705C25F0" - "UsePlugInResources" = "11:TRUE" - } - "Sunken" - { - "Name" = "8:Sunken" - "DisplayName" = "8:#1007" - "Description" = "8:#1107" - "Type" = "3:5" - "ContextData" = "8:4;True=4;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:4" - "DefaultValue" = "3:4" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_55E14984BC8C4D1186C2F08476051991" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdUserInterface.wim" - } - "{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_5A68F53ADDD64915BE22A5F8EF6D7D73" - { - "UseDynamicProperties" = "11:FALSE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdBasicDialogs.wim" - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_7B1E7D5AE2AF44E3ADCA12E70D770D48" - { - "Name" = "8:#1902" - "Sequence" = "3:1" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_175A8BD203074956B2271C6CF588B43F" - { - "Sequence" = "3:110" - "DisplayName" = "8:Fertig" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "UpdateText" - { - "Name" = "8:UpdateText" - "DisplayName" = "8:#1058" - "Description" = "8:#1158" - "Type" = "3:15" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1258" - "DefaultValue" = "8:#1258" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E542EDE92D444E94888310F641E511BE" - { - "Sequence" = "3:100" - "DisplayName" = "8:Infodatei" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdReadmeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "ReadmeText" - { - "Name" = "8:ReadmeText" - "DisplayName" = "8:#1010" - "Description" = "8:#1110" - "Type" = "3:6" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:_4FC5143C80F24A3EBB772E157A735BAA" - "UsePlugInResources" = "11:TRUE" - } - "Sunken" - { - "Name" = "8:Sunken" - "DisplayName" = "8:#1007" - "Description" = "8:#1107" - "Type" = "3:5" - "ContextData" = "8:4;True=4;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:4" - "DefaultValue" = "3:4" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_8568E071421847C9A0F70776EE3E2CF7" - { - "Name" = "8:#1901" - "Sequence" = "3:2" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_995EA8B2204843119F7EE239A01A3C0C" - { - "Sequence" = "3:100" - "DisplayName" = "8:Status" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_940A6A35C9064FB4BC8AD2F7589CE76D" - { - "Name" = "8:#1900" - "Sequence" = "3:1" - "Attributes" = "3:1" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_29838957B63F432FA2D54AAD009FF598" - { - "Sequence" = "3:100" - "DisplayName" = "8:Willkommen" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdWelcomeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "CopyrightWarning" - { - "Name" = "8:CopyrightWarning" - "DisplayName" = "8:#1002" - "Description" = "8:#1102" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:XtreemFS is developed in the Data Management Work Package of the XtreemOS project, a software research and development project funded by the European Commission. More information about the XtreemOS project as well as software downloads can be found on www.XtreemOS.eu ." - "DefaultValue" = "8:#1202" - "UsePlugInResources" = "11:TRUE" - } - "Welcome" - { - "Name" = "8:Welcome" - "DisplayName" = "8:#1003" - "Description" = "8:#1103" - "Type" = "3:3" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:1" - "Value" = "8:#1203" - "DefaultValue" = "8:#1203" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_548B6B75D523476685DDCF8209DF74FD" - { - "Sequence" = "3:300" - "DisplayName" = "8:Installation bestätigen" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdConfirmDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A43745785A884A4AB613C626F0662D18" - { - "Sequence" = "3:200" - "DisplayName" = "8:Lizenzvertrag" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdLicenseDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "EulaText" - { - "Name" = "8:EulaText" - "DisplayName" = "8:#1008" - "Description" = "8:#1108" - "Type" = "3:6" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:_168FF2C98F1E4121862FDC56705C25F0" - "UsePlugInResources" = "11:TRUE" - } - "Sunken" - { - "Name" = "8:Sunken" - "DisplayName" = "8:#1007" - "Description" = "8:#1107" - "Type" = "3:5" - "ContextData" = "8:4;True=4;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:4" - "DefaultValue" = "3:4" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_AC1FF94A892045568B2C0D57A7D6A0A3" - { - "Name" = "8:#1901" - "Sequence" = "3:1" - "Attributes" = "3:2" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1265CF9B29AB46839169EE51FE9B581E" - { - "Sequence" = "3:100" - "DisplayName" = "8:Status" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdProgressDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "ShowProgress" - { - "Name" = "8:ShowProgress" - "DisplayName" = "8:#1009" - "Description" = "8:#1109" - "Type" = "3:5" - "ContextData" = "8:1;True=1;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:1" - "DefaultValue" = "3:1" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - "{DF760B10-853B-4699-99F2-AFF7185B4A62}:_B531E2EF6B8445F5B3657B18A01E766C" - { - "Name" = "8:#1902" - "Sequence" = "3:2" - "Attributes" = "3:3" - "Dialogs" - { - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_7FF61C67EF0F47F39972B104C918ABE0" - { - "Sequence" = "3:110" - "DisplayName" = "8:Infodatei" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminReadmeDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - "ReadmeText" - { - "Name" = "8:ReadmeText" - "DisplayName" = "8:#1010" - "Description" = "8:#1110" - "Type" = "3:6" - "ContextData" = "8:" - "Attributes" = "3:0" - "Setting" = "3:2" - "Value" = "8:_4FC5143C80F24A3EBB772E157A735BAA" - "UsePlugInResources" = "11:TRUE" - } - "Sunken" - { - "Name" = "8:Sunken" - "DisplayName" = "8:#1007" - "Description" = "8:#1107" - "Type" = "3:5" - "ContextData" = "8:4;True=4;False=0" - "Attributes" = "3:0" - "Setting" = "3:0" - "Value" = "3:4" - "DefaultValue" = "3:4" - "UsePlugInResources" = "11:TRUE" - } - } - } - "{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E307910314A945F39E9D1C4FBDBF7B2F" - { - "Sequence" = "3:120" - "DisplayName" = "8:Fertig" - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:FALSE" - "SourcePath" = "8:\\VsdAdminFinishedDlg.wid" - "Properties" - { - "BannerBitmap" - { - "Name" = "8:BannerBitmap" - "DisplayName" = "8:#1001" - "Description" = "8:#1101" - "Type" = "3:8" - "ContextData" = "8:Bitmap" - "Attributes" = "3:4" - "Setting" = "3:2" - "Value" = "8:_97862E0BE00C485DB2C0E167DCA10D6D" - "UsePlugInResources" = "11:TRUE" - } - } - } - } - } - } - "MergeModule" - { - "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_2539652531B4431885CC00A9BA084F3D" - { - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:TRUE" - "SourcePath" = "8:policy_9_0_Microsoft_VC90_DebugCRT_x86.msm" - "Properties" - { - } - "LanguageId" = "3:0" - "Exclude" = "11:FALSE" - "Folder" = "8:" - "Feature" = "8:" - "IsolateTo" = "8:" - } - "{CEE29DC0-9FBA-4B99-8D47-5BC643D9B626}:_D530F0DE72B04DF8BAE304E6F3369DB0" - { - "UseDynamicProperties" = "11:TRUE" - "IsDependency" = "11:TRUE" - "SourcePath" = "8:microsoft_vc90_debugcrt_x86.msm" - "Properties" - { - } - "LanguageId" = "3:0" - "Exclude" = "11:FALSE" - "Folder" = "8:" - "Feature" = "8:" - "IsolateTo" = "8:" - } - } - "ProjectOutput" - { - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_030F3F58D4C84BB0BA2D98BC9A0F291F" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\bin\\xtfs_lsvol.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:TRUE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{02C4D457-D09C-4097-B3B4-13F1086EA10F}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_24852FEEA9F04548802A909D0CB49B27" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\lib\\xtreemfs-client.lib" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:TRUE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{FFA69254-B8BC-4E99-B60C-F4B96511124A}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_4F37B9A4C3BD44D480307F676F6FB0CB" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\lib\\google-breakpad.lib" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:TRUE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{AF7AE548-AC85-424F-87CD-417ECBC12291}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_5B6D903177C641AB8DA3D5E59B48AC4B" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\Release\\xtreemfs-client-utillity.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_228D917002644B3BBD28F16D482D8378" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:FALSE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{AF07DB69-BFAB-4018-9004-EB24C5059AF5}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_62097A22EAD342D89A71DD8BDEFF5DAF" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\bin\\xtfs_stat.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:TRUE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{A6E92EC2-8CFD-4F32-80BE-67BFB275AB9D}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_813FC4DBF3BF49FA8891E893A805EBBB" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\bin\\xtfs_rmvol.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:TRUE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{F7BCFCF3-E465-4557-A8D4-C23CE23B2400}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_D7E3E18AEAD748A984D29AC7E0F107A7" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\bin\\xtfs_mkvol.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:TRUE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{45FC9A01-4BBB-4D27-A9DE-F3B165DD932B}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - "{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_F174E0C5AA1F41EF823B26CCCC60C433" - { - "SourcePath" = "8:..\\..\\..\\src\\client\\bin\\xtfs_mount.exe" - "TargetName" = "8:" - "Tag" = "8:" - "Folder" = "8:_9685661D2E3F4CB2A3377E30C36F09CF" - "Condition" = "8:" - "Transitive" = "11:FALSE" - "Vital" = "11:TRUE" - "ReadOnly" = "11:FALSE" - "Hidden" = "11:FALSE" - "System" = "11:TRUE" - "Permanent" = "11:FALSE" - "SharedLegacy" = "11:FALSE" - "PackageAs" = "3:1" - "Register" = "3:1" - "Exclude" = "11:FALSE" - "IsDependency" = "11:FALSE" - "IsolateTo" = "8:" - "ProjectOutputGroupRegister" = "3:1" - "OutputConfiguration" = "8:" - "OutputGroupCanonicalName" = "8:Built" - "OutputProjectGuid" = "8:{9323E77E-EE3C-4B13-A763-921F6A7F52A5}" - "ShowKeyOutput" = "11:TRUE" - "ExcludeFilters" - { - } - } - } - } -} diff --git a/packaging/windows/XtreemFS Client Setup/src/dokanCtl.vbs b/packaging/windows/XtreemFS Client Setup/src/dokanCtl.vbs deleted file mode 100644 index ab914ad3a3084d8f72db7d13d92ecf8f6f878c27..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS Client Setup/src/dokanCtl.vbs +++ /dev/null @@ -1,49 +0,0 @@ -'get the environment -Set fso = CreateObject("Scripting.FileSystemObject") -Set WshShell = CreateObject("WScript.Shell") -Set objEnv = WshShell.Environment("PROCESS") - -WshShell.Popup "finding the path to the dokanctl.exe to copy it to the windows system directory. this will take several minutes...",10,"dokanCtl" - -Dim source -source = "" -Dim dest -dest = objenv("SystemRoot") & "\" - -'check the default path -If fso.FileExists(objenv("ProgramFiles") & "\Dokan\DokanLibrary\dokanctl.exe") Then - source = objenv("ProgramFiles") & "\Dokan\DokanLibrary\dokanctl.exe" -Else - FindFile(objenv("ProgramFiles") & "\") -End If - -If source = "" Then - MsgBox "execution failed. unmount will not be available on the GUI tool.",0,"dokanCtl" -Else - fso.CopyFile source, dest, TRUE - MsgBox "execution successful.",0,"dokanCtl" -End If - - - -Sub FindFile(ThisFolder) - - Dim File - Dim Folder - For Each Folder In fso.GetFolder(ThisFolder).SubFolders - For Each File In Folder.Files - If LCase(File.Name) = "dokanctl.exe" Then - Set source = File - Exit For - End If - Next 'File - - If source = "" Then - Call FindFile(Folder) - Else - Exit For - End If - - Next 'Folder - -END SUB \ No newline at end of file diff --git a/packaging/windows/XtreemFS Client Setup/src/license.rtf b/packaging/windows/XtreemFS Client Setup/src/license.rtf deleted file mode 100644 index 4ea1c418e78a7db32780e5b4a580fc3db9361234..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS Client Setup/src/license.rtf +++ /dev/null @@ -1,345 +0,0 @@ -{\rtf1\ansi\ansicpg1252\deff0\deflang1031{\fonttbl{\f0\fnil Courier New;}{\f1\fswiss\fcharset0 Arial;}} -{\colortbl ;\red0\green0\blue0;} -{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20\tab\tab GNU GENERAL PUBLIC LICENSE\par -\tab\tab Version 2, June 1991\par -\par - Copyright (C) 1989, 1991 Free Software Foundation, Inc.\par - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\par - Everyone is permitted to copy and distribute \cf1\ul verbatim\cf0\ulnone copies\par - of this license document, but changing it is not allowed.\par -\par -\tab\tab\tab \cf1\ul Preamble\cf0\ulnone\par -\par - The licenses for most software are designed to take away your\par -freedom to share and change it. By contrast, the GNU General Public\par -License is intended to guarantee your freedom to share and change free\par -software--to make sure the software is free for all its users. This\par -General Public License applies to most of the Free Software\par -Foundation's software and to any other program whose authors commit to\par -using it. (Some other Free Software Foundation software is covered by\par -the GNU Library General Public License instead.) You can apply it to\par -your programs, too.\par -\par - When we speak of free software, we are referring to freedom, not\par -price. Our General Public Licenses are designed to make sure that you\par -have the freedom to distribute copies of free software (and charge for\par -this service if you wish), that you receive source code or can get it\par -if you want it, that you can change the software or use pieces of it\par -in new free programs; and that you know you can do these things.\par -\par - To protect your rights, we need to make restrictions that forbid\par -anyone to deny you these rights or to ask you to surrender the rights.\par -These restrictions translate to certain responsibilities for you if you\par -distribute copies of the software, or if you modify it.\par -\par - For example, if you distribute copies of such a program, whether\par -\cf1\ul gratis\cf0\ulnone or for a fee, you must give the recipients all the rights that\par -you have. You must make sure that they, too, receive or can get the\par -source code. And you must show them these terms so they know their\par -rights.\par -\par - We protect your rights with two steps: (1) copyright the software, and\par -(2) offer you this license which gives you legal permission to copy,\par -distribute and/or modify the software.\par -\par - Also, for each author's protection and ours, we want to make certain\par -that everyone understands that there is no warranty for this free\par -software. If the software is modified by someone else and passed on, we\par -want its recipients to know that what they have is not the original, so\par -that any problems introduced by others will not reflect on the original\par -authors' reputations.\par -\par - Finally, any free program is threatened constantly by software\par -patents. We wish to avoid the danger that \cf1\ul redistributors\cf0\ulnone of a free\par -program will individually obtain patent licenses, in effect making the\par -program proprietary. To prevent this, we have made it clear that any\par -patent must be licensed for everyone's free use or not licensed at all.\par -\par - The precise terms and conditions for copying, distribution and\par -modification follow.\par -\page\par -\tab\tab GNU GENERAL PUBLIC LICENSE\par - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\par -\par - 0. This License applies to any program or other work which contains\par -a notice placed by the copyright holder saying it may be distributed\par -under the terms of this General Public License. The "Program", below,\par -refers to any such program or work, and a "work based on the Program"\par -means either the Program or any derivative work under copyright law:\par -that is to say, a work containing the Program or a portion of it,\par -either \cf1\ul verbatim\cf0\ulnone or with modifications and/or translated into another\par -language. (Hereinafter, translation is included without limitation in\par -the term "modification".) Each licensee is addressed as "you".\par -\par -Activities other than copying, distribution and modification are not\par -covered by this License; they are outside its scope. The act of\par -running the Program is not restricted, and the output from the Program\par -is covered only if its contents constitute a work based on the\par -Program (independent of having been made by running the Program).\par -Whether that is true depends on what the Program does.\par -\par - 1. You may copy and distribute \cf1\ul verbatim\cf0\ulnone copies of the Program's\par -source code as you receive it, in any medium, provided that you\par -conspicuously and appropriately publish on each copy an appropriate\par -copyright notice and disclaimer of warranty; keep intact all the\par -notices that refer to this License and to the absence of any warranty;\par -and give any other recipients of the Program a copy of this License\par -along with the Program.\par -\par -You may charge a fee for the physical act of transferring a copy, and\par -you may at your option offer warranty protection in exchange for a fee.\par -\par - 2. You may modify your copy or copies of the Program or any portion\par -of it, thus forming a work based on the Program, and copy and\par -distribute such modifications or work under the terms of Section 1\par -above, provided that you also meet all of these conditions:\par -\par - a) You must cause the modified files to carry prominent notices\par - stating that you changed the files and the date of any change.\par -\par - b) You must cause any work that you distribute or publish, that in\par - whole or in part contains or is derived from the Program or any\par - part thereof, to be licensed as a whole at no charge to all third\par - parties under the terms of this License.\par -\par - c) If the modified program normally reads commands interactively\par - when run, you must cause it, when started running for such\par - interactive use in the most ordinary way, to print or display an\par - announcement including an appropriate copyright notice and a\par - notice that there is no warranty (or else, saying that you provide\par - a warranty) and that users may redistribute the program under\par - these conditions, and telling the user how to view a copy of this\par - License. (Exception: if the Program itself is interactive but\par - does not normally print such an announcement, your work based on\par - the Program is not required to print an announcement.)\par -\page\par -These requirements apply to the modified work as a whole. If\par -identifiable sections of that work are not derived from the Program,\par -and can be reasonably considered independent and separate works in\par -themselves, then this License, and its terms, do not apply to those\par -sections when you distribute them as separate works. But when you\par -distribute the same sections as part of a whole which is a work based\par -on the Program, the distribution of the whole must be on the terms of\par -this License, whose permissions for other licensees extend to the\par -entire whole, and thus to each and every part regardless of who wrote it.\par -\par -Thus, it is not the intent of this section to claim rights or contest\par -your rights to work written entirely by you; rather, the intent is to\par -exercise the right to control the distribution of derivative or\par -collective works based on the Program.\par -\par -In addition, mere aggregation of another work not based on the Program\par -with the Program (or with a work based on the Program) on a volume of\par -a storage or distribution medium does not bring the other work under\par -the scope of this License.\par -\par - 3. You may copy and distribute the Program (or a work based on it,\par -under Section 2) in object code or executable form under the terms of\par -Sections 1 and 2 above provided that you also do one of the following:\par -\par - a) Accompany it with the complete corresponding machine-readable\par - source code, which must be distributed under the terms of Sections\par - 1 and 2 above on a medium customarily used for software interchange; or,\par -\par - b) Accompany it with a written offer, valid for at least three\par - years, to give any third party, for a charge no more than your\par - cost of physically performing source distribution, a complete\par - machine-readable copy of the corresponding source code, to be\par - distributed under the terms of Sections 1 and 2 above on a medium\par - customarily used for software interchange; or,\par -\par - c) Accompany it with the information you received as to the offer\par - to distribute corresponding source code. (This alternative is\par - allowed only for \cf1\ul noncommercial\cf0\ulnone distribution and only if you\par - received the program in object code or executable form with such\par - an offer, in accord with Subsection b above.)\par -\par -The source code for a work means the preferred form of the work for\par -making modifications to it. For an executable work, complete source\par -code means all the source code for all modules it contains, plus any\par -associated interface definition files, plus the scripts used to\par -control compilation and installation of the executable. However, as a\par -special exception, the source code distributed need not include\par -anything that is normally distributed (in either source or binary\par -form) with the major components (compiler, kernel, and so on) of the\par -operating system on which the executable runs, unless that component\par -itself accompanies the executable.\par -\par -If distribution of executable or object code is made by offering\par -access to copy from a designated place, then offering equivalent\par -access to copy the source code from the same place counts as\par -distribution of the source code, even though third parties are not\par -compelled to copy the source along with the object code.\par -\page\par - 4. You may not copy, modify, \cf1\ul sublicense\cf0\ulnone , or distribute the Program\par -except as expressly provided under this License. Any attempt\par -otherwise to copy, modify, \cf1\ul sublicense\cf0\ulnone or distribute the Program is\par -void, and will automatically terminate your rights under this License.\par -However, parties who have received copies, or rights, from you under\par -this License will not have their licenses terminated so long as such\par -parties remain in full compliance.\par -\par - 5. You are not required to accept this License, since you have not\par -signed it. However, nothing else grants you permission to modify or\par -distribute the Program or its derivative works. These actions are\par -prohibited by law if you do not accept this License. Therefore, by\par -modifying or distributing the Program (or any work based on the\par -Program), you indicate your acceptance of this License to do so, and\par -all its terms and conditions for copying, distributing or modifying\par -the Program or works based on it.\par -\par - 6. Each time you redistribute the Program (or any work based on the\par -Program), the recipient automatically receives a license from the\par -original \cf1\ul licensor\cf0\ulnone to copy, distribute or modify the Program subject to\par -these terms and conditions. You may not impose any further\par -restrictions on the recipients' exercise of the rights granted herein.\par -You are not responsible for enforcing compliance by third parties to\par -this License.\par -\par - 7. If, as a consequence of a court judgment or allegation of patent\par -infringement or for any other reason (not limited to patent issues),\par -conditions are imposed on you (whether by court order, agreement or\par -otherwise) that contradict the conditions of this License, they do not\par -excuse you from the conditions of this License. If you cannot\par -distribute so as to satisfy simultaneously your obligations under this\par -License and any other pertinent obligations, then as a consequence you\par -may not distribute the Program at all. For example, if a patent\par -license would not permit royalty-free redistribution of the Program by\par -all those who receive copies directly or indirectly through you, then\par -the only way you could satisfy both it and this License would be to\par -refrain entirely from distribution of the Program.\par -\par -If any portion of this section is held invalid or \cf1\ul unenforceable\cf0\ulnone under\par -any particular circumstance, the balance of the section is intended to\par -apply and the section as a whole is intended to apply in other\par -circumstances.\par -\par -It is not the purpose of this section to induce you to infringe any\par -patents or other property right claims or to contest validity of any\par -such claims; this section has the sole purpose of protecting the\par -integrity of the free software distribution system, which is\par -implemented by public license practices. Many people have made\par -generous contributions to the wide range of software distributed\par -through that system in reliance on consistent application of that\par -system; it is up to the author/\cf1\ul donor\cf0\ulnone to decide if he or she is willing\par -to distribute software through any other system and a licensee cannot\par -impose that choice.\par -\par -This section is intended to make thoroughly clear what is believed to\par -be a consequence of the rest of this License.\par -\page\par - 8. If the distribution and/or use of the Program is restricted in\par -certain countries either by patents or by copyrighted interfaces, the\par -original copyright holder who places the Program under this License\par -may add an explicit geographical distribution limitation excluding\par -those countries, so that distribution is permitted only in or among\par -countries not thus excluded. In such case, this License incorporates\par -the limitation as if written in the body of this License.\par -\par - 9. The Free Software Foundation may publish revised and/or new versions\par -of the General Public License from time to time. Such new versions will\par -be similar in spirit to the present version, but may differ in detail to\par -address new problems or concerns.\par -\par -Each version is given a distinguishing version number. If the Program\par -specifies a version number of this License which applies to it and "any\par -later version", you have the option of following the terms and conditions\par -either of that version or of any later version published by the Free\par -Software Foundation. If the Program does not specify a version number of\par -this License, you may choose any version ever published by the Free Software\par -Foundation.\par -\par - 10. If you wish to incorporate parts of the Program into other free\par -programs whose distribution conditions are different, write to the author\par -to ask for permission. For software which is copyrighted by the Free\par -Software Foundation, write to the Free Software Foundation; we sometimes\par -make exceptions for this. Our decision will be guided by the two goals\par -of preserving the free status of all derivatives of our free software and\par -of promoting the sharing and reuse of software generally.\par -\par -\tab\tab\tab NO WARRANTY\par -\par - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\par -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\par -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\par -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\par -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\par -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\par -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\par -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\par -REPAIR OR CORRECTION.\par -\par - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\par -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\par -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\par -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\par -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\par -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\par -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\par -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\par -POSSIBILITY OF SUCH DAMAGES.\par -\par -\tab\tab END OF TERMS AND CONDITIONS\par -\page\par -\tab How to Apply These Terms to Your New Programs\par -\par - If you develop a new program, and you want it to be of the greatest\par -possible use to the public, the best way to achieve this is to make it\par -free software which everyone can redistribute and change under these terms.\par -\par - To do so, attach the following notices to the program. It is safest\par -to attach them to the start of each source file to most effectively\par -convey the exclusion of warranty; and each file should have at least\par -the "copyright" line and a pointer to where the full notice is found.\par -\par - \par - Copyright (C) \par -\par - This program is free software; you can redistribute it and/or modify\par - it under the terms of the GNU General Public License as published by\par - the Free Software Foundation; either version 2 of the License, or\par - (at your option) any later version.\par -\par - This program is distributed in the hope that it will be useful,\par - but WITHOUT ANY WARRANTY; without even the implied warranty of\par - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\par - GNU General Public License for more details.\par -\par - You should have received a copy of the GNU General Public License\par - along with this program; if not, write to the Free Software\par - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\par -\par -\par -Also add information on how to contact you by electronic and paper mail.\par -\par -If the program is interactive, make it output a short notice like this\par -when it starts in an interactive mode:\par -\par - \cf1\ul Gnomovision\cf0\ulnone version 69, Copyright (C) year name of author\par - \cf1\ul Gnomovision\cf0\ulnone comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\par - This is free software, and you are welcome to redistribute it\par - under certain conditions; type `show c' for details.\par -\par -The hypothetical commands `show w' and `show c' should show the appropriate\par -parts of the General Public License. Of course, the commands you use may\par -be called something other than `show w' and `show c'; they could even be\par -mouse-clicks or menu items--whatever suits your program.\par -\par -You should also get your employer (if you work as a programmer) or your\par -school, if any, to sign a "copyright disclaimer" for the program, if\par -necessary. Here is a sample; alter the names:\par -\par - \cf1\ul Yoyodyne\cf0\ulnone , Inc., hereby disclaims all copyright interest in the program\par - `\cf1\ul Gnomovision\cf0\ulnone ' (which makes passes at compilers) written by James Hacker.\par -\par - , 1 April 1989\par - \cf1\ul Ty\cf0\ulnone Coon, President of Vice\par -\par -This General Public License does not permit incorporating your program into\par -proprietary programs. If your program is a subroutine library, you may\par -consider it more useful to permit linking proprietary applications with the\par -library. If this is what you want to do, use the GNU Library General\par -Public License instead of this License.\par -\f1\par -} - \ No newline at end of file diff --git a/packaging/windows/XtreemFS Client Setup/src/logo.jpg b/packaging/windows/XtreemFS Client Setup/src/logo.jpg deleted file mode 100644 index b4317030cc2bf4301bbc55f5f44a63003b27e6a4..0000000000000000000000000000000000000000 Binary files a/packaging/windows/XtreemFS Client Setup/src/logo.jpg and /dev/null differ diff --git a/packaging/windows/XtreemFS Client Setup/src/quickstart.rtf b/packaging/windows/XtreemFS Client Setup/src/quickstart.rtf deleted file mode 100644 index 4b311e610ec204a28d855774f5bbf40760eb5db5..0000000000000000000000000000000000000000 Binary files a/packaging/windows/XtreemFS Client Setup/src/quickstart.rtf and /dev/null differ diff --git a/packaging/windows/XtreemFS client utillity/AssemblyInfo.cpp b/packaging/windows/XtreemFS client utillity/AssemblyInfo.cpp deleted file mode 100644 index f66f95a2f1390a784178db33d57e66ba91131c42..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/AssemblyInfo.cpp +++ /dev/null @@ -1,40 +0,0 @@ -#include "stdafx.h" - -using namespace System; -using namespace System::Reflection; -using namespace System::Runtime::CompilerServices; -using namespace System::Runtime::InteropServices; -using namespace System::Security::Permissions; - -// -// Allgemeine Informationen ber eine Assembly werden ber die folgenden -// Attribute gesteuert. ndern Sie diese Attributwerte, um die Informationen zu ndern, -// die mit einer Assembly verknpft sind. -// -[assembly:AssemblyTitleAttribute("XtreemFSclientutillity")]; -[assembly:AssemblyDescriptionAttribute("")]; -[assembly:AssemblyConfigurationAttribute("")]; -[assembly:AssemblyCompanyAttribute("")]; -[assembly:AssemblyProductAttribute("XtreemFSclientutillity")]; -[assembly:AssemblyCopyrightAttribute("Copyright (c) 2009")]; -[assembly:AssemblyTrademarkAttribute("")]; -[assembly:AssemblyCultureAttribute("")]; - -// -// Versionsinformationen fr eine Assembly bestehen aus den folgenden vier Werten: -// -// Hauptversion -// Nebenversion -// Buildnummer -// Revision -// -// Sie knnen alle Werte angeben oder fr die Revisions- und Buildnummer den Standard -// bernehmen, indem Sie "*" eingeben: - -[assembly:AssemblyVersionAttribute("1.0.*")]; - -[assembly:ComVisible(false)]; - -[assembly:CLSCompliantAttribute(true)]; - -[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)]; diff --git a/packaging/windows/XtreemFS client utillity/Form1.h b/packaging/windows/XtreemFS client utillity/Form1.h deleted file mode 100644 index 682fb0ef262dca9aec954ff4acd407e71e98fdfb..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/Form1.h +++ /dev/null @@ -1,843 +0,0 @@ -#pragma once - - -namespace XtreemFSclientutillity { - - using namespace System; - using namespace System::ComponentModel; - using namespace System::Collections; - using namespace System::Windows::Forms; - using namespace System::Data; - using namespace System::Drawing; - - ///

- /// Zusammenfassung fr Form1 - /// - /// Warnung: Wenn Sie den Namen dieser Klasse ndern, mssen Sie auch - /// die Ressourcendateiname-Eigenschaft fr das Tool zur Kompilierung verwalteter Ressourcen ndern, - /// das allen RESX-Dateien zugewiesen ist, von denen diese Klasse abhngt. - /// Anderenfalls knnen die Designer nicht korrekt mit den lokalisierten Ressourcen - /// arbeiten, die diesem Formular zugewiesen sind. - /// - public ref class Form1 : public System::Windows::Forms::Form - { - public: - Form1(void) - { - InitializeComponent(); - // - //TODO: Konstruktorcode hier hinzufgen. - // - } - - protected: - /// - /// Verwendete Ressourcen bereinigen. - /// - ~Form1() - { - if (components) - { - delete components; - } - } - private: System::Windows::Forms::ToolStripContainer^ toolStripContainer1; - private: System::Windows::Forms::ToolStrip^ toolStrip; - protected: - - private: System::Windows::Forms::ToolStripButton^ createButton; - - private: System::Windows::Forms::ToolStripButton^ mountButton; - private: System::Windows::Forms::ToolStripButton^ unmountButton; - private: System::Windows::Forms::ToolStripButton^ deleteButton; - - private: System::Windows::Forms::ToolStripLabel^ utilitiesLabel; - private: System::Windows::Forms::ToolStripSeparator^ listSeparator; - private: System::Windows::Forms::ToolStripSeparator^ mountSeparator; - - private: System::Windows::Forms::ToolStripButton^ listButton; - private: System::Windows::Forms::Panel^ createPanel; - private: System::Diagnostics::Process^ createProcess; - private: System::Windows::Forms::TextBox^ mrcInputBoxC; - - - private: System::Diagnostics::Process^ mountProcess; - private: System::Diagnostics::Process^ unmountProcess; - private: System::Windows::Forms::TextBox^ volInputBoxC; - - - - private: System::Windows::Forms::Label^ createMRCLabel; - - private: System::Diagnostics::Process^ deleteProcess; - private: System::Diagnostics::Process^ listProcess; - private: System::Windows::Forms::Label^ createVolLabel; - private: System::Windows::Forms::ToolStripButton^ quitButton; - private: System::Windows::Forms::Button^ proceedCreateButton; - private: System::Windows::Forms::ToolStripSeparator^ quitSeparator; - private: System::Windows::Forms::GroupBox^ createBox; - private: System::Windows::Forms::GroupBox^ mountBox; - private: System::Windows::Forms::Label^ label1; - private: System::Windows::Forms::TextBox^ volInputBoxM; - private: System::Windows::Forms::Label^ mountDIRLabel; - private: System::Windows::Forms::TextBox^ dirInputBoxM; - private: System::Windows::Forms::GroupBox^ listBox; - - private: System::Windows::Forms::Button^ mountProceedButton; - private: System::Windows::Forms::TextBox^ mrcInputBoxL; - private: System::Windows::Forms::Button^ listProceedButton; - - private: System::Windows::Forms::Label^ label2; - private: System::Windows::Forms::GroupBox^ unmountBox; - private: System::Windows::Forms::Label^ label3; - - private: System::Windows::Forms::Button^ unmountProceedButton; - private: System::Windows::Forms::GroupBox^ deleteBox; - - private: System::Windows::Forms::Label^ label5; - private: System::Windows::Forms::TextBox^ volInputBoxD; - private: System::Windows::Forms::Label^ label6; - private: System::Windows::Forms::TextBox^ mrcInputBoxD; - private: System::Windows::Forms::Button^ deleteProceedButton; - - private: System::Windows::Forms::Label^ label4; - - private: System::Windows::Forms::ListBox^ mountPoint; - private: System::Windows::Forms::ListBox^ umountPoint; - private: System::Windows::Forms::Label^ lable; - private: System::Windows::Forms::StatusStrip^ statusStrip1; - private: System::Windows::Forms::ToolStripStatusLabel^ toolStripStatusLabel1; - - - - private: System::ComponentModel::IContainer^ components; - - private: - /// - /// Erforderliche Designervariable. - /// - - -#pragma region Windows Form Designer generated code - /// - /// Erforderliche Methode fr die Designeruntersttzung. - /// Der Inhalt der Methode darf nicht mit dem Code-Editor gendert werden. - /// - void InitializeComponent(void) - { - System::ComponentModel::ComponentResourceManager^ resources = (gcnew System::ComponentModel::ComponentResourceManager(Form1::typeid)); - this->toolStripContainer1 = (gcnew System::Windows::Forms::ToolStripContainer()); - this->createPanel = (gcnew System::Windows::Forms::Panel()); - this->statusStrip1 = (gcnew System::Windows::Forms::StatusStrip()); - this->toolStripStatusLabel1 = (gcnew System::Windows::Forms::ToolStripStatusLabel()); - this->createBox = (gcnew System::Windows::Forms::GroupBox()); - this->createMRCLabel = (gcnew System::Windows::Forms::Label()); - this->proceedCreateButton = (gcnew System::Windows::Forms::Button()); - this->createVolLabel = (gcnew System::Windows::Forms::Label()); - this->volInputBoxC = (gcnew System::Windows::Forms::TextBox()); - this->mrcInputBoxC = (gcnew System::Windows::Forms::TextBox()); - this->mountBox = (gcnew System::Windows::Forms::GroupBox()); - this->lable = (gcnew System::Windows::Forms::Label()); - this->mountPoint = (gcnew System::Windows::Forms::ListBox()); - this->mountProceedButton = (gcnew System::Windows::Forms::Button()); - this->label1 = (gcnew System::Windows::Forms::Label()); - this->volInputBoxM = (gcnew System::Windows::Forms::TextBox()); - this->mountDIRLabel = (gcnew System::Windows::Forms::Label()); - this->dirInputBoxM = (gcnew System::Windows::Forms::TextBox()); - this->listBox = (gcnew System::Windows::Forms::GroupBox()); - this->listProceedButton = (gcnew System::Windows::Forms::Button()); - this->label2 = (gcnew System::Windows::Forms::Label()); - this->mrcInputBoxL = (gcnew System::Windows::Forms::TextBox()); - this->unmountBox = (gcnew System::Windows::Forms::GroupBox()); - this->label4 = (gcnew System::Windows::Forms::Label()); - this->umountPoint = (gcnew System::Windows::Forms::ListBox()); - this->unmountProceedButton = (gcnew System::Windows::Forms::Button()); - this->deleteBox = (gcnew System::Windows::Forms::GroupBox()); - this->label5 = (gcnew System::Windows::Forms::Label()); - this->volInputBoxD = (gcnew System::Windows::Forms::TextBox()); - this->label6 = (gcnew System::Windows::Forms::Label()); - this->mrcInputBoxD = (gcnew System::Windows::Forms::TextBox()); - this->deleteProceedButton = (gcnew System::Windows::Forms::Button()); - this->toolStrip = (gcnew System::Windows::Forms::ToolStrip()); - this->utilitiesLabel = (gcnew System::Windows::Forms::ToolStripLabel()); - this->createButton = (gcnew System::Windows::Forms::ToolStripButton()); - this->mountButton = (gcnew System::Windows::Forms::ToolStripButton()); - this->mountSeparator = (gcnew System::Windows::Forms::ToolStripSeparator()); - this->listButton = (gcnew System::Windows::Forms::ToolStripButton()); - this->listSeparator = (gcnew System::Windows::Forms::ToolStripSeparator()); - this->unmountButton = (gcnew System::Windows::Forms::ToolStripButton()); - this->deleteButton = (gcnew System::Windows::Forms::ToolStripButton()); - this->quitSeparator = (gcnew System::Windows::Forms::ToolStripSeparator()); - this->quitButton = (gcnew System::Windows::Forms::ToolStripButton()); - this->label3 = (gcnew System::Windows::Forms::Label()); - this->createProcess = (gcnew System::Diagnostics::Process()); - this->mountProcess = (gcnew System::Diagnostics::Process()); - this->unmountProcess = (gcnew System::Diagnostics::Process()); - this->deleteProcess = (gcnew System::Diagnostics::Process()); - this->listProcess = (gcnew System::Diagnostics::Process()); - this->toolStripContainer1->ContentPanel->SuspendLayout(); - this->toolStripContainer1->TopToolStripPanel->SuspendLayout(); - this->toolStripContainer1->SuspendLayout(); - this->createPanel->SuspendLayout(); - this->statusStrip1->SuspendLayout(); - this->createBox->SuspendLayout(); - this->mountBox->SuspendLayout(); - this->listBox->SuspendLayout(); - this->unmountBox->SuspendLayout(); - this->deleteBox->SuspendLayout(); - this->toolStrip->SuspendLayout(); - this->SuspendLayout(); - // - // toolStripContainer1 - // - this->toolStripContainer1->BottomToolStripPanelVisible = false; - // - // toolStripContainer1.ContentPanel - // - this->toolStripContainer1->ContentPanel->Controls->Add(this->createPanel); - this->toolStripContainer1->ContentPanel->Size = System::Drawing::Size(445, 145); - this->toolStripContainer1->Dock = System::Windows::Forms::DockStyle::Fill; - this->toolStripContainer1->LeftToolStripPanelVisible = false; - this->toolStripContainer1->Location = System::Drawing::Point(0, 0); - this->toolStripContainer1->Name = L"toolStripContainer1"; - this->toolStripContainer1->RightToolStripPanelVisible = false; - this->toolStripContainer1->Size = System::Drawing::Size(445, 170); - this->toolStripContainer1->TabIndex = 0; - this->toolStripContainer1->Text = L"toolStripContainer1"; - // - // toolStripContainer1.TopToolStripPanel - // - this->toolStripContainer1->TopToolStripPanel->Controls->Add(this->toolStrip); - // - // createPanel - // - this->createPanel->Controls->Add(this->statusStrip1); - this->createPanel->Controls->Add(this->createBox); - this->createPanel->Controls->Add(this->mountBox); - this->createPanel->Controls->Add(this->listBox); - this->createPanel->Controls->Add(this->unmountBox); - this->createPanel->Controls->Add(this->deleteBox); - this->createPanel->Dock = System::Windows::Forms::DockStyle::Fill; - this->createPanel->Location = System::Drawing::Point(0, 0); - this->createPanel->Name = L"createPanel"; - this->createPanel->Size = System::Drawing::Size(445, 145); - this->createPanel->TabIndex = 0; - // - // statusStrip1 - // - this->statusStrip1->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(1) {this->toolStripStatusLabel1}); - this->statusStrip1->Location = System::Drawing::Point(0, 123); - this->statusStrip1->Name = L"statusStrip1"; - this->statusStrip1->Size = System::Drawing::Size(445, 22); - this->statusStrip1->TabIndex = 8; - this->statusStrip1->Text = L"statusStrip1"; - // - // toolStripStatusLabel1 - // - this->toolStripStatusLabel1->Name = L"toolStripStatusLabel1"; - this->toolStripStatusLabel1->Size = System::Drawing::Size(37, 17); - this->toolStripStatusLabel1->Text = L"status"; - // - // createBox - // - this->createBox->Controls->Add(this->createMRCLabel); - this->createBox->Controls->Add(this->proceedCreateButton); - this->createBox->Controls->Add(this->createVolLabel); - this->createBox->Controls->Add(this->volInputBoxC); - this->createBox->Controls->Add(this->mrcInputBoxC); - this->createBox->Location = System::Drawing::Point(3, 3); - this->createBox->Name = L"createBox"; - this->createBox->Size = System::Drawing::Size(439, 114); - this->createBox->TabIndex = 5; - this->createBox->TabStop = false; - this->createBox->Text = L"Create volume"; - // - // createMRCLabel - // - this->createMRCLabel->AutoSize = true; - this->createMRCLabel->Location = System::Drawing::Point(6, 22); - this->createMRCLabel->Name = L"createMRCLabel"; - this->createMRCLabel->Size = System::Drawing::Size(89, 13); - this->createMRCLabel->TabIndex = 2; - this->createMRCLabel->Text = L"Metadata Server:"; - // - // proceedCreateButton - // - this->proceedCreateButton->Location = System::Drawing::Point(158, 79); - this->proceedCreateButton->Name = L"proceedCreateButton"; - this->proceedCreateButton->Size = System::Drawing::Size(86, 29); - this->proceedCreateButton->TabIndex = 4; - this->proceedCreateButton->Text = L"Create"; - this->proceedCreateButton->UseVisualStyleBackColor = true; - this->proceedCreateButton->Click += gcnew System::EventHandler(this, &Form1::createProceedButton_Click); - // - // createVolLabel - // - this->createVolLabel->AutoSize = true; - this->createVolLabel->Location = System::Drawing::Point(6, 56); - this->createVolLabel->Name = L"createVolLabel"; - this->createVolLabel->Size = System::Drawing::Size(45, 13); - this->createVolLabel->TabIndex = 3; - this->createVolLabel->Text = L"Volume:"; - // - // volInputBoxC - // - this->volInputBoxC->Location = System::Drawing::Point(158, 53); - this->volInputBoxC->Name = L"volInputBoxC"; - this->volInputBoxC->Size = System::Drawing::Size(226, 20); - this->volInputBoxC->TabIndex = 1; - // - // mrcInputBoxC - // - this->mrcInputBoxC->Location = System::Drawing::Point(158, 19); - this->mrcInputBoxC->Name = L"mrcInputBoxC"; - this->mrcInputBoxC->Size = System::Drawing::Size(226, 20); - this->mrcInputBoxC->TabIndex = 0; - // - // mountBox - // - this->mountBox->Controls->Add(this->lable); - this->mountBox->Controls->Add(this->mountPoint); - this->mountBox->Controls->Add(this->mountProceedButton); - this->mountBox->Controls->Add(this->label1); - this->mountBox->Controls->Add(this->volInputBoxM); - this->mountBox->Controls->Add(this->mountDIRLabel); - this->mountBox->Controls->Add(this->dirInputBoxM); - this->mountBox->Location = System::Drawing::Point(3, 3); - this->mountBox->Name = L"mountBox"; - this->mountBox->Size = System::Drawing::Size(439, 114); - this->mountBox->TabIndex = 5; - this->mountBox->TabStop = false; - this->mountBox->Text = L"Mount volume"; - this->mountBox->Visible = false; - // - // lable - // - this->lable->AutoSize = true; - this->lable->Location = System::Drawing::Point(6, 87); - this->lable->Name = L"lable"; - this->lable->Size = System::Drawing::Size(61, 13); - this->lable->TabIndex = 8; - this->lable->Text = L"Drive letter:"; - // - // mountPoint - // - this->mountPoint->FormattingEnabled = true; - this->mountPoint->Items->AddRange(gcnew cli::array< System::Object^ >(23) {L"Z", L"Y", L"X", L"W", L"V", L"U", L"T", L"S", - L"R", L"Q", L"P", L"O", L"N", L"M", L"L", L"K", L"J", L"I", L"H", L"G", L"F", L"E", L"D"}); - this->mountPoint->Location = System::Drawing::Point(158, 87); - this->mountPoint->Name = L"mountPoint"; - this->mountPoint->Size = System::Drawing::Size(34, 17); - this->mountPoint->TabIndex = 7; - // - // mountProceedButton - // - this->mountProceedButton->Location = System::Drawing::Point(298, 79); - this->mountProceedButton->Name = L"mountProceedButton"; - this->mountProceedButton->Size = System::Drawing::Size(86, 29); - this->mountProceedButton->TabIndex = 6; - this->mountProceedButton->Text = L"Mount"; - this->mountProceedButton->UseVisualStyleBackColor = true; - this->mountProceedButton->Click += gcnew System::EventHandler(this, &Form1::mountProceedButton_Click); - // - // label1 - // - this->label1->AutoSize = true; - this->label1->Location = System::Drawing::Point(6, 56); - this->label1->Name = L"label1"; - this->label1->Size = System::Drawing::Size(45, 13); - this->label1->TabIndex = 5; - this->label1->Text = L"Volume:"; - // - // volInputBoxM - // - this->volInputBoxM->Location = System::Drawing::Point(158, 53); - this->volInputBoxM->Name = L"volInputBoxM"; - this->volInputBoxM->Size = System::Drawing::Size(226, 20); - this->volInputBoxM->TabIndex = 4; - // - // mountDIRLabel - // - this->mountDIRLabel->AutoSize = true; - this->mountDIRLabel->Location = System::Drawing::Point(6, 22); - this->mountDIRLabel->Name = L"mountDIRLabel"; - this->mountDIRLabel->Size = System::Drawing::Size(86, 13); - this->mountDIRLabel->TabIndex = 3; - this->mountDIRLabel->Text = L"Directory Server:"; - // - // dirInputBoxM - // - this->dirInputBoxM->Location = System::Drawing::Point(158, 19); - this->dirInputBoxM->Name = L"dirInputBoxM"; - this->dirInputBoxM->Size = System::Drawing::Size(226, 20); - this->dirInputBoxM->TabIndex = 1; - // - // listBox - // - this->listBox->Controls->Add(this->listProceedButton); - this->listBox->Controls->Add(this->label2); - this->listBox->Controls->Add(this->mrcInputBoxL); - this->listBox->Location = System::Drawing::Point(3, 3); - this->listBox->Name = L"listBox"; - this->listBox->Size = System::Drawing::Size(439, 114); - this->listBox->TabIndex = 6; - this->listBox->TabStop = false; - this->listBox->Text = L"List volumes of a MRC"; - this->listBox->Visible = false; - // - // listProceedButton - // - this->listProceedButton->Location = System::Drawing::Point(158, 79); - this->listProceedButton->Name = L"listProceedButton"; - this->listProceedButton->Size = System::Drawing::Size(86, 29); - this->listProceedButton->TabIndex = 7; - this->listProceedButton->Text = L"List"; - this->listProceedButton->UseVisualStyleBackColor = true; - this->listProceedButton->Click += gcnew System::EventHandler(this, &Form1::listProceedButton_Click); - // - // label2 - // - this->label2->AutoSize = true; - this->label2->Location = System::Drawing::Point(6, 22); - this->label2->Name = L"label2"; - this->label2->Size = System::Drawing::Size(89, 13); - this->label2->TabIndex = 4; - this->label2->Text = L"Metadata Server:"; - // - // mrcInputBoxL - // - this->mrcInputBoxL->Location = System::Drawing::Point(158, 19); - this->mrcInputBoxL->Name = L"mrcInputBoxL"; - this->mrcInputBoxL->Size = System::Drawing::Size(226, 20); - this->mrcInputBoxL->TabIndex = 2; - // - // unmountBox - // - this->unmountBox->Controls->Add(this->label4); - this->unmountBox->Controls->Add(this->umountPoint); - this->unmountBox->Controls->Add(this->unmountProceedButton); - this->unmountBox->Location = System::Drawing::Point(3, 3); - this->unmountBox->Name = L"unmountBox"; - this->unmountBox->Size = System::Drawing::Size(439, 114); - this->unmountBox->TabIndex = 6; - this->unmountBox->TabStop = false; - this->unmountBox->Text = L"Unmount volume"; - this->unmountBox->Visible = false; - // - // label4 - // - this->label4->AutoSize = true; - this->label4->Location = System::Drawing::Point(6, 22); - this->label4->Name = L"label4"; - this->label4->Size = System::Drawing::Size(61, 13); - this->label4->TabIndex = 12; - this->label4->Text = L"Drive letter:"; - // - // umountPoint - // - this->umountPoint->FormattingEnabled = true; - this->umountPoint->Items->AddRange(gcnew cli::array< System::Object^ >(23) {L"Z", L"Y", L"X", L"W", L"V", L"U", L"T", L"S", - L"R", L"Q", L"P", L"O", L"N", L"M", L"L", L"K", L"J", L"I", L"H", L"G", L"F", L"E", L"D"}); - this->umountPoint->Location = System::Drawing::Point(158, 19); - this->umountPoint->Name = L"umountPoint"; - this->umountPoint->Size = System::Drawing::Size(34, 17); - this->umountPoint->TabIndex = 11; - // - // unmountProceedButton - // - this->unmountProceedButton->Location = System::Drawing::Point(158, 79); - this->unmountProceedButton->Name = L"unmountProceedButton"; - this->unmountProceedButton->Size = System::Drawing::Size(86, 29); - this->unmountProceedButton->TabIndex = 8; - this->unmountProceedButton->Text = L"Unmount"; - this->unmountProceedButton->UseVisualStyleBackColor = true; - this->unmountProceedButton->Click += gcnew System::EventHandler(this, &Form1::unmountProceedButton_Click); - // - // deleteBox - // - this->deleteBox->Controls->Add(this->label5); - this->deleteBox->Controls->Add(this->volInputBoxD); - this->deleteBox->Controls->Add(this->label6); - this->deleteBox->Controls->Add(this->mrcInputBoxD); - this->deleteBox->Controls->Add(this->deleteProceedButton); - this->deleteBox->Location = System::Drawing::Point(3, 3); - this->deleteBox->Name = L"deleteBox"; - this->deleteBox->Size = System::Drawing::Size(439, 114); - this->deleteBox->TabIndex = 7; - this->deleteBox->TabStop = false; - this->deleteBox->Text = L"Delete volume"; - this->deleteBox->Visible = false; - // - // label5 - // - this->label5->AutoSize = true; - this->label5->Location = System::Drawing::Point(6, 56); - this->label5->Name = L"label5"; - this->label5->Size = System::Drawing::Size(45, 13); - this->label5->TabIndex = 12; - this->label5->Text = L"Volume:"; - // - // volInputBoxD - // - this->volInputBoxD->Location = System::Drawing::Point(158, 53); - this->volInputBoxD->Name = L"volInputBoxD"; - this->volInputBoxD->Size = System::Drawing::Size(226, 20); - this->volInputBoxD->TabIndex = 11; - // - // label6 - // - this->label6->AutoSize = true; - this->label6->Location = System::Drawing::Point(6, 22); - this->label6->Name = L"label6"; - this->label6->Size = System::Drawing::Size(89, 13); - this->label6->TabIndex = 10; - this->label6->Text = L"Metadata Server:"; - // - // mrcInputBoxD - // - this->mrcInputBoxD->Location = System::Drawing::Point(158, 19); - this->mrcInputBoxD->Name = L"mrcInputBoxD"; - this->mrcInputBoxD->Size = System::Drawing::Size(226, 20); - this->mrcInputBoxD->TabIndex = 9; - // - // deleteProceedButton - // - this->deleteProceedButton->Location = System::Drawing::Point(158, 79); - this->deleteProceedButton->Name = L"deleteProceedButton"; - this->deleteProceedButton->Size = System::Drawing::Size(86, 29); - this->deleteProceedButton->TabIndex = 8; - this->deleteProceedButton->Text = L"Delete"; - this->deleteProceedButton->UseVisualStyleBackColor = true; - this->deleteProceedButton->Click += gcnew System::EventHandler(this, &Form1::deleteProceedButton_Click); - // - // toolStrip - // - this->toolStrip->Dock = System::Windows::Forms::DockStyle::None; - this->toolStrip->Items->AddRange(gcnew cli::array< System::Windows::Forms::ToolStripItem^ >(10) {this->utilitiesLabel, this->createButton, - this->mountButton, this->mountSeparator, this->listButton, this->listSeparator, this->unmountButton, this->deleteButton, this->quitSeparator, - this->quitButton}); - this->toolStrip->Location = System::Drawing::Point(3, 0); - this->toolStrip->Name = L"toolStrip"; - this->toolStrip->Size = System::Drawing::Size(281, 25); - this->toolStrip->TabIndex = 0; - // - // utilitiesLabel - // - this->utilitiesLabel->Name = L"utilitiesLabel"; - this->utilitiesLabel->Size = System::Drawing::Size(45, 22); - this->utilitiesLabel->Text = L"Utilities:"; - // - // createButton - // - this->createButton->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Text; - this->createButton->Enabled = false; - this->createButton->Image = (cli::safe_cast(resources->GetObject(L"createButton.Image"))); - this->createButton->ImageTransparentColor = System::Drawing::Color::Magenta; - this->createButton->Name = L"createButton"; - this->createButton->Size = System::Drawing::Size(44, 22); - this->createButton->Text = L"Create"; - this->createButton->ToolTipText = L"Create a new volume."; - this->createButton->Click += gcnew System::EventHandler(this, &Form1::createButton_Click); - // - // mountButton - // - this->mountButton->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Text; - this->mountButton->Image = (cli::safe_cast(resources->GetObject(L"mountButton.Image"))); - this->mountButton->ImageTransparentColor = System::Drawing::Color::Magenta; - this->mountButton->Name = L"mountButton"; - this->mountButton->Size = System::Drawing::Size(41, 22); - this->mountButton->Text = L"Mount"; - this->mountButton->ToolTipText = L"Mount a volume."; - this->mountButton->Click += gcnew System::EventHandler(this, &Form1::mountButton_Click); - // - // mountSeparator - // - this->mountSeparator->Name = L"mountSeparator"; - this->mountSeparator->Size = System::Drawing::Size(6, 25); - // - // listButton - // - this->listButton->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Text; - this->listButton->Image = (cli::safe_cast(resources->GetObject(L"listButton.Image"))); - this->listButton->ImageTransparentColor = System::Drawing::Color::Magenta; - this->listButton->Name = L"listButton"; - this->listButton->Size = System::Drawing::Size(27, 22); - this->listButton->Text = L"List"; - this->listButton->ToolTipText = L"List available volumes."; - this->listButton->Visible = false; - this->listButton->Click += gcnew System::EventHandler(this, &Form1::listButton_Click); - // - // listSeparator - // - this->listSeparator->Name = L"listSeparator"; - this->listSeparator->Size = System::Drawing::Size(6, 25); - this->listSeparator->Visible = false; - // - // unmountButton - // - this->unmountButton->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Text; - this->unmountButton->Image = (cli::safe_cast(resources->GetObject(L"unmountButton.Image"))); - this->unmountButton->ImageTransparentColor = System::Drawing::Color::Magenta; - this->unmountButton->Name = L"unmountButton"; - this->unmountButton->Size = System::Drawing::Size(54, 22); - this->unmountButton->Text = L"Unmount"; - this->unmountButton->ToolTipText = L"Unmount a volume."; - this->unmountButton->Click += gcnew System::EventHandler(this, &Form1::unmountButton_Click); - // - // deleteButton - // - this->deleteButton->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Text; - this->deleteButton->Image = (cli::safe_cast(resources->GetObject(L"deleteButton.Image"))); - this->deleteButton->ImageTransparentColor = System::Drawing::Color::Magenta; - this->deleteButton->Name = L"deleteButton"; - this->deleteButton->Size = System::Drawing::Size(42, 22); - this->deleteButton->Text = L"Delete"; - this->deleteButton->ToolTipText = L"Delete an existing volume."; - this->deleteButton->Click += gcnew System::EventHandler(this, &Form1::deleteButton_Click); - // - // quitSeparator - // - this->quitSeparator->Name = L"quitSeparator"; - this->quitSeparator->Size = System::Drawing::Size(6, 25); - // - // quitButton - // - this->quitButton->DisplayStyle = System::Windows::Forms::ToolStripItemDisplayStyle::Text; - this->quitButton->Image = (cli::safe_cast(resources->GetObject(L"quitButton.Image"))); - this->quitButton->ImageTransparentColor = System::Drawing::Color::Magenta; - this->quitButton->Name = L"quitButton"; - this->quitButton->Size = System::Drawing::Size(31, 22); - this->quitButton->Text = L"Quit"; - this->quitButton->Click += gcnew System::EventHandler(this, &Form1::quitButton_Click); - // - // label3 - // - this->label3->Location = System::Drawing::Point(0, 0); - this->label3->Name = L"label3"; - this->label3->Size = System::Drawing::Size(100, 23); - this->label3->TabIndex = 0; - // - // createProcess - // - this->createProcess->EnableRaisingEvents = true; - this->createProcess->StartInfo->Domain = L""; - this->createProcess->StartInfo->ErrorDialog = true; - this->createProcess->StartInfo->FileName = L"xtfs_mkvol"; - this->createProcess->StartInfo->LoadUserProfile = false; - this->createProcess->StartInfo->Password = nullptr; - this->createProcess->StartInfo->StandardErrorEncoding = nullptr; - this->createProcess->StartInfo->StandardOutputEncoding = nullptr; - this->createProcess->StartInfo->UserName = L""; - this->createProcess->StartInfo->UseShellExecute = false; - this->createProcess->SynchronizingObject = this; - this->createProcess->Exited += gcnew System::EventHandler(this, &Form1::createProcess_Exited); - // - // mountProcess - // - this->mountProcess->EnableRaisingEvents = true; - this->mountProcess->StartInfo->Domain = L""; - this->mountProcess->StartInfo->ErrorDialog = true; - this->mountProcess->StartInfo->FileName = L"xtfs_mount"; - this->mountProcess->StartInfo->LoadUserProfile = false; - this->mountProcess->StartInfo->Password = nullptr; - this->mountProcess->StartInfo->StandardErrorEncoding = nullptr; - this->mountProcess->StartInfo->StandardOutputEncoding = nullptr; - this->mountProcess->StartInfo->UserName = L""; - this->mountProcess->StartInfo->UseShellExecute = false; - this->mountProcess->SynchronizingObject = this; - this->mountProcess->Exited += gcnew System::EventHandler(this, &Form1::mountProcess_Exited); - // - // unmountProcess - // - this->unmountProcess->EnableRaisingEvents = true; - this->unmountProcess->StartInfo->Domain = L""; - this->unmountProcess->StartInfo->ErrorDialog = true; - this->unmountProcess->StartInfo->FileName = L"dokanctl"; - this->unmountProcess->StartInfo->LoadUserProfile = false; - this->unmountProcess->StartInfo->Password = nullptr; - this->unmountProcess->StartInfo->StandardErrorEncoding = nullptr; - this->unmountProcess->StartInfo->StandardOutputEncoding = nullptr; - this->unmountProcess->StartInfo->UserName = L""; - this->unmountProcess->StartInfo->UseShellExecute = false; - this->unmountProcess->SynchronizingObject = this; - this->unmountProcess->Exited += gcnew System::EventHandler(this, &Form1::unmountProcess_Exited); - // - // deleteProcess - // - this->deleteProcess->EnableRaisingEvents = true; - this->deleteProcess->StartInfo->Domain = L""; - this->deleteProcess->StartInfo->ErrorDialog = true; - this->deleteProcess->StartInfo->FileName = L"xtfs_rmvol"; - this->deleteProcess->StartInfo->LoadUserProfile = false; - this->deleteProcess->StartInfo->Password = nullptr; - this->deleteProcess->StartInfo->StandardErrorEncoding = nullptr; - this->deleteProcess->StartInfo->StandardOutputEncoding = nullptr; - this->deleteProcess->StartInfo->UserName = L""; - this->deleteProcess->SynchronizingObject = this; - this->deleteProcess->Exited += gcnew System::EventHandler(this, &Form1::deleteProcess_Exited); - // - // listProcess - // - this->listProcess->EnableRaisingEvents = true; - this->listProcess->StartInfo->Domain = L""; - this->listProcess->StartInfo->ErrorDialog = true; - this->listProcess->StartInfo->FileName = L"xtfs_lsvol"; - this->listProcess->StartInfo->LoadUserProfile = false; - this->listProcess->StartInfo->Password = nullptr; - this->listProcess->StartInfo->StandardErrorEncoding = nullptr; - this->listProcess->StartInfo->StandardOutputEncoding = nullptr; - this->listProcess->StartInfo->UserName = L""; - this->listProcess->SynchronizingObject = this; - this->listProcess->Exited += gcnew System::EventHandler(this, &Form1::listProcess_Exited); - // - // Form1 - // - this->AutoScaleDimensions = System::Drawing::SizeF(6, 13); - this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font; - this->ClientSize = System::Drawing::Size(445, 170); - this->Controls->Add(this->toolStripContainer1); - this->Name = L"Form1"; - this->Text = L"XtreemFS client utility"; - this->toolStripContainer1->ContentPanel->ResumeLayout(false); - this->toolStripContainer1->TopToolStripPanel->ResumeLayout(false); - this->toolStripContainer1->TopToolStripPanel->PerformLayout(); - this->toolStripContainer1->ResumeLayout(false); - this->toolStripContainer1->PerformLayout(); - this->createPanel->ResumeLayout(false); - this->createPanel->PerformLayout(); - this->statusStrip1->ResumeLayout(false); - this->statusStrip1->PerformLayout(); - this->createBox->ResumeLayout(false); - this->createBox->PerformLayout(); - this->mountBox->ResumeLayout(false); - this->mountBox->PerformLayout(); - this->listBox->ResumeLayout(false); - this->listBox->PerformLayout(); - this->unmountBox->ResumeLayout(false); - this->unmountBox->PerformLayout(); - this->deleteBox->ResumeLayout(false); - this->deleteBox->PerformLayout(); - this->toolStrip->ResumeLayout(false); - this->toolStrip->PerformLayout(); - this->ResumeLayout(false); - - } -#pragma endregion -private: System::Void createProceedButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->createProcess->StartInfo->Arguments = - this->mrcInputBoxC->Text+"/"+this->volInputBoxC->Text; - this->mrcInputBoxC->ResetText(); - this->volInputBoxC->ResetText(); - this->createProcess->Start(); - this->toolStripStatusLabel1->Text = "executed: "+this->createProcess->StartInfo->FileName+" "+this->createProcess->StartInfo->Arguments; - } -private: System::Void mountProceedButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->mountProcess->StartInfo->Arguments = - this->dirInputBoxM->Text+"/"+this->volInputBoxM->Text+" "+this->mountPoint->SelectedItem; - this->dirInputBoxM->ResetText(); - this->volInputBoxM->ResetText(); - this->mountProcess->Start(); - this->toolStripStatusLabel1->Text = "executed: "+this->mountProcess->StartInfo->FileName+" "+this->mountProcess->StartInfo->Arguments; - } -private: System::Void listProceedButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->listProcess->Start(); - this->toolStripStatusLabel1->Text = "executed: "+this->listProcess->StartInfo->FileName+" "+this->listProcess->StartInfo->Arguments; - } -private: System::Void unmountProceedButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->unmountProcess->StartInfo->Arguments = "/u "+this->umountPoint->SelectedItem; - this->toolStripStatusLabel1->Text = "executed: "+this->unmountProcess->StartInfo->FileName+" "+this->unmountProcess->StartInfo->Arguments; - this->unmountProcess->Start(); - } -private: System::Void deleteProceedButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->deleteProcess->StartInfo->Arguments = - this->mrcInputBoxD->Text+"/"+this->volInputBoxD->Text; - this->mrcInputBoxD->ResetText(); - this->volInputBoxD->ResetText(); - this->deleteProcess->Start(); - this->toolStripStatusLabel1->Text = "executed: "+this->deleteProcess->StartInfo->FileName+" "+this->deleteProcess->StartInfo->Arguments; - } -private: System::Void createButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->createButton->Enabled = false; - this->mountButton->Enabled = true; - this->listButton->Enabled = false; - this->unmountButton->Enabled = true; - this->deleteButton->Enabled = true; - - this->createBox->Visible = true; - this->mountBox->Visible = false; - this->listBox->Visible = false; - this->unmountBox->Visible = false; - this->deleteBox->Visible = false; - } -private: System::Void mountButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->createButton->Enabled = true; - this->mountButton->Enabled = false; - this->listButton->Enabled = false; - this->unmountButton->Enabled = true; - this->deleteButton->Enabled = true; - - this->createBox->Visible = false; - this->mountBox->Visible = true; - this->listBox->Visible = false; - this->unmountBox->Visible = false; - this->deleteBox->Visible = false; - } -private: System::Void listButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->createButton->Enabled = true; - this->mountButton->Enabled = true; - this->listButton->Enabled = false; - this->unmountButton->Enabled = true; - this->deleteButton->Enabled = true; - - this->createBox->Visible = false; - this->mountBox->Visible = false; - this->listBox->Visible = true; - this->unmountBox->Visible = false; - this->deleteBox->Visible = false; - } -private: System::Void unmountButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->createButton->Enabled = true; - this->mountButton->Enabled = true; - this->listButton->Enabled = false; - this->unmountButton->Enabled = false; - this->deleteButton->Enabled = true; - - this->createBox->Visible = false; - this->mountBox->Visible = false; - this->listBox->Visible = false; - this->unmountBox->Visible = true; - this->deleteBox->Visible = false; - } -private: System::Void deleteButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->createButton->Enabled = true; - this->mountButton->Enabled = true; - this->listButton->Enabled = false; - this->unmountButton->Enabled = true; - this->deleteButton->Enabled = false; - - this->createBox->Visible = false; - this->mountBox->Visible = false; - this->listBox->Visible = false; - this->unmountBox->Visible = false; - this->deleteBox->Visible = true; - } -private: System::Void quitButton_Click(System::Object^ sender, System::EventArgs^ e) { - this->Close(); - } -private: System::Void createProcess_Exited(System::Object^ sender, System::EventArgs^ e) { - - } -private: System::Void mountProcess_Exited(System::Object^ sender, System::EventArgs^ e) { - - } -private: System::Void listProcess_Exited(System::Object^ sender, System::EventArgs^ e) { - - } -private: System::Void unmountProcess_Exited(System::Object^ sender, System::EventArgs^ e) { - - } -private: System::Void deleteProcess_Exited(System::Object^ sender, System::EventArgs^ e) { - - } -}; -} diff --git a/packaging/windows/XtreemFS client utillity/Form1.resx b/packaging/windows/XtreemFS client utillity/Form1.resx deleted file mode 100644 index 6b3e4441dc2ee80f3f6520bd8551438376571298..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/Form1.resx +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 136, 54 - - - 17, 17 - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL - U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI - VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ - QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 - /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 - cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j - 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR - dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb - NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE - s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL - U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI - VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ - QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 - /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 - cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j - 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR - dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb - NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE - s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL - U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI - VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ - QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 - /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 - cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j - 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR - dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb - NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE - s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL - U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI - VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ - QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 - /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 - cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j - 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR - dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb - NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE - s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL - U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI - VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ - QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 - /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 - cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j - 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR - dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb - NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE - s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAgxJREFUOE+lkvtL - U2EYx+0PEbtpFwnBKPGKiJImGP0gYhIYs1E5GF5gIxkpA00JRSmMEF0ohMh+GaRWYlqabMVcNdS2QpaI - VqiDIYhk397vA6fXhCjyhYdzeM/5fp7vczkAdeL2cwho7v/wWzT1zcN+Pwhr51uY2/y41PQaF+wzKKiZ - QvaN58g0jyLd5KEUcQbg+84P/Cm2tncQjW3j68YWIqubCC3FcOJc478BAuGoZM6zvoRnakXEruEIjhc4 - /g5gZop9c+voGAyLbQIfeBZxLL9BA1jzXvuGbWamuKh+GmmVbswE19A59FEBbmoAG7YbsLtm2mZmiml9 - cvabNDwpz6YB7LYBoMXCumkJr7LOmnnHzBQ/9X2Bo2cOibm1GsBREbAQiYmw/8lnuCeWkVzcgnZlnw1j - 3HV/wuNXK6i/9x5Hc6wawDlTXHbLJ+LZUBQPRyKwdQdxutwl1h+NLXHh5Ht1ewBHsiwawCW57HyDAfWR - dvl0uhZQ1eqX8aVc7EKLqrum651ATLf9OJx5XQM4KmY0xPzZ0hFAiQJnXB0WwME0E3IsL5B17ZlADqWb - NYDrOepdlcysmTWWOrxqbceRWtaLk0VO1XW72D5Vckd2gMBfq8zdpmUG62NJvKM4+XyziDk24xmfWoGE - s1c0gHPmbrPTpHNJKOCo2G1mZs20zcwUJ5yp1AB5+8/zEwgF5GMVDxh4AAAAAElFTkSuQmCC - - - - 116, 17 - - - 79 - - - 236, 17 - - - 460, 17 - - - 17, 54 - - - 357, 17 - - \ No newline at end of file diff --git a/packaging/windows/XtreemFS client utillity/ReadMe.txt b/packaging/windows/XtreemFS client utillity/ReadMe.txt deleted file mode 100644 index 467b447ad363abecd87edae0eff27b1b02fb5fa9..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/ReadMe.txt +++ /dev/null @@ -1,35 +0,0 @@ -======================================================================== - ANWENDUNG: XtreemFS client utillity-Projektbersicht -======================================================================== - -Diese XtreemFS client utillity-Anwendung wurde vom Anwendungs-Assistenten fr Sie erstellt. - -Diese Datei enthlt eine Zusammenfassung dessen, was Sie in jeder der Dateien -finden, aus denen Ihre XtreemFS client utillity-Anwendung besteht. - -XtreemFS client utillity.vcproj - Dies ist die Hauptprojektdatei fr VC++-Projekte, die mit dem Anwendungs- - Assistenten generiert werden. - Sie enthlt Informationen ber die Version von Visual C++, in der die Datei - generiert wurde, sowie ber die Plattformen, Konfigurationen und - Projektfeatures, die im Anwendungs-Assistenten ausgewhlt wurden. - -XtreemFS client utillity.cpp - Dies ist die Hauptquelldatei der Anwendung. - Enthlt den Code zum Anzeigen des Formulars. - -Form1.h - Enhlt die Implementierung der Formularklasse und der InitializeComponent()-Funktion. - -AssemblyInfo.cpp - Enthlt benutzerdefinierte Attribute zum ndern von Assemblymetadaten. - -///////////////////////////////////////////////////////////////////////////// -Weitere Standarddateien: - -StdAfx.h, StdAfx.cpp - Diese Dateien werden verwendet, um eine vorkompilierte Headerdatei - (PCH-Datei) mit dem Namen "XtreemFS client utillity.pch und eine - vorkompilierte Typendatei mit dem Namen "StdAfx.obj" zu erstellen. - -///////////////////////////////////////////////////////////////////////////// diff --git a/packaging/windows/XtreemFS client utillity/XtreemFS client utillity.cpp b/packaging/windows/XtreemFS client utillity/XtreemFS client utillity.cpp deleted file mode 100644 index 28f443c19df3a491d845403f7c84067531c105b5..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/XtreemFS client utillity.cpp +++ /dev/null @@ -1,18 +0,0 @@ -// XtreemFS client utillity.cpp: Hauptprojektdatei. - -#include "stdafx.h" -#include "Form1.h" - -using namespace XtreemFSclientutillity; - -[STAThreadAttribute] -int main(array ^args) -{ - // Aktivieren visueller Effekte von Windows XP, bevor Steuerelemente erstellt werden - Application::EnableVisualStyles(); - Application::SetCompatibleTextRenderingDefault(false); - - // Hauptfenster erstellen und ausfhren - Application::Run(gcnew Form1()); - return 0; -} diff --git a/packaging/windows/XtreemFS client utillity/XtreemFS client utillity.vcproj b/packaging/windows/XtreemFS client utillity/XtreemFS client utillity.vcproj deleted file mode 100644 index 4d684905709085b2a3124ae99943582740ee0723..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/XtreemFS client utillity.vcproj +++ /dev/null @@ -1,272 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/windows/XtreemFS client utillity/app.ico b/packaging/windows/XtreemFS client utillity/app.ico deleted file mode 100644 index 3a5525fd794f7a7c5c8e6187f470ea3af38cd2b6..0000000000000000000000000000000000000000 Binary files a/packaging/windows/XtreemFS client utillity/app.ico and /dev/null differ diff --git a/packaging/windows/XtreemFS client utillity/app.rc b/packaging/windows/XtreemFS client utillity/app.rc deleted file mode 100644 index c120ab6d9bca5fae52ef2cb898114c93e0d67666..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/app.rc +++ /dev/null @@ -1,63 +0,0 @@ -// In Microsoft Visual C++ generiertes Ressourcenskript. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Englische Ressourcen (US) - - -///////////////////////////////////////////////////////////////////////////// -// -// Symbol -// - -// Das Symbol an erster Stelle oder mit dem niedrigsten ID-Wert wird das Anwendungssymbol. - -LANGUAGE 7, 1 -#pragma code_page(1252) -1 ICON "app.ico" - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" - "\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\0" -END - -#endif // APSTUDIO_INVOKED - -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Von der Ressource TEXTINCLUDE 3 generiert. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // nicht APSTUDIO_INVOKED - diff --git a/packaging/windows/XtreemFS client utillity/resource.h b/packaging/windows/XtreemFS client utillity/resource.h deleted file mode 100644 index 1f2251c2bdecd53055c446ad232048f7221cfaef..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/resource.h +++ /dev/null @@ -1,3 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by app.rc diff --git a/packaging/windows/XtreemFS client utillity/stdafx.cpp b/packaging/windows/XtreemFS client utillity/stdafx.cpp deleted file mode 100644 index 95875fdb0035385dcf9421a03c2717823390a3cf..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/stdafx.cpp +++ /dev/null @@ -1,7 +0,0 @@ -// stdafx.cpp : Quelldatei, die nur die Standard-Includes einbindet. -// XtreemFS client utillity.pch ist der vorkompilierte Header. -// stdafx.obj enthlt die vorkompilierten Typinformationen. - -#include "stdafx.h" - - diff --git a/packaging/windows/XtreemFS client utillity/stdafx.h b/packaging/windows/XtreemFS client utillity/stdafx.h deleted file mode 100644 index 79e0160fa687f9e0c952f7d8c3d20e73b99eba1e..0000000000000000000000000000000000000000 --- a/packaging/windows/XtreemFS client utillity/stdafx.h +++ /dev/null @@ -1,6 +0,0 @@ -// stdafx.h : Includedatei fr Standardsystem-Includedateien -// oder hufig verwendete projektspezifische Includedateien, -// die nur in unregelmigen Abstnden gendert werden. -#pragma once - -// TODO: Hier auf zustzliche Header, die das Programm erfordert, verweisen. diff --git a/packaging/xos-addons/xtreemfs-xos-addons.spec b/packaging/xos-addons/xtreemfs-xos-addons.spec deleted file mode 100644 index 8ec08e6fbbf4c05ecc57a61e9688569c02704822..0000000000000000000000000000000000000000 --- a/packaging/xos-addons/xtreemfs-xos-addons.spec +++ /dev/null @@ -1,36 +0,0 @@ -Name: XtreemFS-XOS-addons -Version: 0.99.3 -Release: 1 -License: GPL -BuildRoot: %{_tmppath}/%{name}-%{version}-build -#BuildRequires: fastjar -Group: Networking -Summary: XtreemOS server addons for XtreemFS -Source0: %{name}-%{version}.tar.gz -Requires: tar - -%description -XtreemFS is an object-based file system that is designed for federated IT infrastructures that are connected by wide-area networks. This package contains optional XtreemOS add-ons (DIR, MRC, OSD). - -NOTE: REQUIRES SUN JAVA 6 RUNTIME ENVIREMENT! - -%prep -%setup - -%build - -%install -TARGET_DIR=$RPM_BUILD_ROOT/etc/xos/xtreemfs/policies - -# copy content -mkdir -p $TARGET_DIR -cp -r * $TARGET_DIR - -%clean -rm -rf $RPM_BUILD_ROOT - -%files -%defattr(-,root,root) -/etc/xos -/etc/xos/xtreemfs -/etc/xos/xtreemfs/policies/* diff --git a/proj/google-breakpad/google-breakpad.SConscript b/proj/google-breakpad/google-breakpad.SConscript deleted file mode 100644 index 722672a9795dc59db4991d7b1520b0d0f898c7b4..0000000000000000000000000000000000000000 --- a/proj/google-breakpad/google-breakpad.SConscript +++ /dev/null @@ -1,64 +0,0 @@ -import sys, os.path, platform - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -for custom_SConscript in ['google-breakpad_custom.SConscript']: - SConscript( custom_SConscript ) - diff --git a/proj/google-breakpad/google-breakpad.vcproj b/proj/google-breakpad/google-breakpad.vcproj deleted file mode 100644 index 19d6a419fb3bcc995161e1e2b6bee5ef1dc9ec28..0000000000000000000000000000000000000000 --- a/proj/google-breakpad/google-breakpad.vcproj +++ /dev/null @@ -1,213 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proj/google-breakpad/google-breakpad_custom.SConscript b/proj/google-breakpad/google-breakpad_custom.SConscript deleted file mode 100644 index f43829b04ee0527e486efc7bc1d0cb3a24016ba2..0000000000000000000000000000000000000000 --- a/proj/google-breakpad/google-breakpad_custom.SConscript +++ /dev/null @@ -1,14 +0,0 @@ -import sys, platform - -Import( "build_env", "build_conf" ) - - -if sys.platform.startswith( "win" ): - SConscript( "google-breakpad_windows.SConscript" ) - if ARGUMENTS.get( "release", 0 ): build_env["LIBS"].append( "google-breakpad.lib" ) - else: build_env["LIBS"].append( "google-breakpad_d.lib" ) -elif sys.platform.startswith( "linux" ): # and platform.machine() != "x86_64": - SConscript( "google-breakpad_linux.SConscript" ) - build_env["LIBS"].append( "google-breakpad" ) -#else: -# raise NotImplementedError, "Google Breakpad not supported on " + sys.platform diff --git a/proj/google-breakpad/google-breakpad_linux.SConscript b/proj/google-breakpad/google-breakpad_linux.SConscript deleted file mode 100644 index 5a200e9742d98269e5f0c9a82e2e8a199396d1a5..0000000000000000000000000000000000000000 --- a/proj/google-breakpad/google-breakpad_linux.SConscript +++ /dev/null @@ -1,88 +0,0 @@ -import sys, os.path, platform - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -build_env.Library( "../../lib/google-breakpad", ( - r"../../share/google-breakpad/src/client/linux/crash_generation/crash_generation_client.cc", - r"../../share/google-breakpad/src/client/linux/crash_generation/crash_generation_server.cc", - r"../../share/google-breakpad/src/client/linux/handler/exception_handler.cc", - r"../../share/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc", - r"../../share/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc", - r"../../share/google-breakpad/src/client/minidump_file_writer.cc", - r"../../share/google-breakpad/src/common/convert_UTF.c", - r"../../share/google-breakpad/src/common/dwarf/bytereader.cc", - r"../../share/google-breakpad/src/common/dwarf/dwarf2diehandler.cc", - r"../../share/google-breakpad/src/common/dwarf/dwarf2reader.cc", - r"../../share/google-breakpad/src/common/dwarf/functioninfo.cc", - r"../../share/google-breakpad/src/common/linux/dump_stabs.cc", - r"../../share/google-breakpad/src/common/linux/dump_symbols.cc", - r"../../share/google-breakpad/src/common/linux/dwarf_cu_to_module.cc", - r"../../share/google-breakpad/src/common/linux/dwarf_line_to_module.cc", - r"../../share/google-breakpad/src/common/linux/file_id.cc", - r"../../share/google-breakpad/src/common/linux/guid_creator.cc", - r"../../share/google-breakpad/src/common/linux/language.cc", - r"../../share/google-breakpad/src/common/linux/module.cc", - r"../../share/google-breakpad/src/common/linux/stabs_reader.cc", - r"../../share/google-breakpad/src/common/md5.c", - r"../../share/google-breakpad/src/common/string_conversion.cc" ) ) diff --git a/proj/google-breakpad/google-breakpad_windows.SConscript b/proj/google-breakpad/google-breakpad_windows.SConscript deleted file mode 100644 index 541338afba58f99773b0df89f7404a400b2e04fc..0000000000000000000000000000000000000000 --- a/proj/google-breakpad/google-breakpad_windows.SConscript +++ /dev/null @@ -1,83 +0,0 @@ -import sys, os.path, platform - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["UNICODE"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -build_env.Library( "../../lib/google-breakpad", ( - r"../../share/google-breakpad/src/client/windows/crash_generation/client_info.cc", - r"../../share/google-breakpad/src/client/windows/crash_generation/crash_generation_client.cc", - r"../../share/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc", - r"../../share/google-breakpad/src/client/windows/crash_generation/minidump_generator.cc", - r"../../share/google-breakpad/src/client/windows/handler/exception_handler.cc", - r"../../share/google-breakpad/src/common/convert_UTF.c", - r"../../share/google-breakpad/src/common/string_conversion.cc", - r"../../share/google-breakpad/src/common/windows/guid_string.cc", - r"../../share/google-breakpad/src/common/windows/string_utils.cc" ) ) diff --git a/proj/libxtreemfs/libxtreemfs.SConscript b/proj/libxtreemfs/libxtreemfs.SConscript deleted file mode 100644 index 7f5cba0b25c74c27d0aa4a2660e04e097b39a914..0000000000000000000000000000000000000000 --- a/proj/libxtreemfs/libxtreemfs.SConscript +++ /dev/null @@ -1,111 +0,0 @@ -import sys, os.path, platform - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["YIELD_PLATFORM_HAVE_OPENSSL"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' ), os.path.abspath( '../../share/yidl/include' ), os.path.abspath( '../../share/yield/src' ), os.path.abspath( '../../share/yieldfs/include' ), os.path.abspath( '../../share/yield/include' ), os.path.abspath( '../../include' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -lib_dir_paths = [os.path.abspath( '../../lib' )] -for lib_dir_path in lib_dir_paths: - if not lib_dir_path in build_env["LIBPATH"]: build_env["LIBPATH"].append( lib_dir_path ) - -for custom_SConscript in ['libxtreemfs_custom.SConscript']: - SConscript( custom_SConscript ) - -# Don't add libs until after custom and dependency SConscripts, to avoid failing build_conf checks because of missing -l libs -for lib in []: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) -if sys.platform.startswith( "win" ): - for lib in ["libeay32.lib", "ssleay32.lib"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - -if not sys.platform.startswith( "win" ): - for lib in ["crypto", "fuse", "ssl"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - - -build_env.Library( "../../lib/xtreemfs", ( - r"../../share/yield/src/yield/concurrency.cpp", - r"../../share/yield/src/yield/ipc.cpp", - r"../../share/yield/src/yield/platform.cpp", - r"../../share/yieldfs/src/yieldfs.cpp", - r"../../src/libxtreemfs/crash_reporter.cpp", - r"../../src/libxtreemfs/dir_proxy.cpp", - r"../../src/libxtreemfs/directory.cpp", - r"../../src/libxtreemfs/file.cpp", - r"../../src/libxtreemfs/grid_ssl_socket.cpp", - r"../../src/libxtreemfs/mrc_proxy.cpp", - r"../../src/libxtreemfs/options.cpp", - r"../../src/libxtreemfs/osd_proxies.cpp", - r"../../src/libxtreemfs/osd_proxy.cpp", - r"../../src/libxtreemfs/proxy.cpp", - r"../../src/libxtreemfs/stat.cpp", - r"../../src/libxtreemfs/stat_cache.cpp", - r"../../src/libxtreemfs/user_database.cpp", - r"../../src/libxtreemfs/volume.cpp" ) ) diff --git a/proj/libxtreemfs/libxtreemfs.vcproj b/proj/libxtreemfs/libxtreemfs.vcproj deleted file mode 100644 index bc3a608246f7b113b147ee2170568c0f97a94e8d..0000000000000000000000000000000000000000 --- a/proj/libxtreemfs/libxtreemfs.vcproj +++ /dev/null @@ -1,494 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proj/libxtreemfs/libxtreemfs_custom.SConscript b/proj/libxtreemfs/libxtreemfs_custom.SConscript deleted file mode 100644 index be9892a137d4574b636dad5adc0fb837e464f40e..0000000000000000000000000000000000000000 --- a/proj/libxtreemfs/libxtreemfs_custom.SConscript +++ /dev/null @@ -1,7 +0,0 @@ -import sys - -Import( "build_env", "build_conf" ) - -if not sys.platform.startswith( "win") and not sys.platform.startswith( "sunos" ): - if not "-DYIELD_HAVE_XATTR_H " in build_env["CCFLAGS"] and build_conf.CheckCHeader( "sys/xattr.h" ): - build_env["CCFLAGS"] += "-DYIELD_HAVE_XATTR_H " diff --git a/proj/lsfs.xtreemfs/lsfs.xtreemfs.SConscript b/proj/lsfs.xtreemfs/lsfs.xtreemfs.SConscript deleted file mode 100644 index da0f12988c911b1e2b4e6c63809994c200e86209..0000000000000000000000000000000000000000 --- a/proj/lsfs.xtreemfs/lsfs.xtreemfs.SConscript +++ /dev/null @@ -1,86 +0,0 @@ -import sys, os.path, platform - -SConscript( '../libxtreemfs/libxtreemfs.SConscript' ) -SConscript( '../google-breakpad/google-breakpad.SConscript' ) - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["YIELD_PLATFORM_HAVE_OPENSSL"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' ), os.path.abspath( '../../share/yidl/include' ), os.path.abspath( '../../share/yield/src' ), os.path.abspath( '../../share/yieldfs/include' ), os.path.abspath( '../../share/yield/include' ), os.path.abspath( '../../include' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -lib_dir_paths = [os.path.abspath( '../../lib' )] -for lib_dir_path in lib_dir_paths: - if not lib_dir_path in build_env["LIBPATH"]: build_env["LIBPATH"].append( lib_dir_path ) - -# Don't add libs until after custom and dependency SConscripts, to avoid failing build_conf checks because of missing -l libs -for lib in ["xtreemfs"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - -build_env.Program( "../../bin/lsfs.xtreemfs", ( - r"../../src/lsfs.xtreemfs/lsfs.xtreemfs.cpp" ) ) diff --git a/proj/lsfs.xtreemfs/lsfs.xtreemfs.vcproj b/proj/lsfs.xtreemfs/lsfs.xtreemfs.vcproj deleted file mode 100644 index 32d18a4cd8ce8060677a63344e564ac8add1a450..0000000000000000000000000000000000000000 --- a/proj/lsfs.xtreemfs/lsfs.xtreemfs.vcproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proj/mkfs.xtreemfs/mkfs.xtreemfs.SConscript b/proj/mkfs.xtreemfs/mkfs.xtreemfs.SConscript deleted file mode 100644 index 9ae02a880682c66dc9844b1c3be79aa468c2ad17..0000000000000000000000000000000000000000 --- a/proj/mkfs.xtreemfs/mkfs.xtreemfs.SConscript +++ /dev/null @@ -1,86 +0,0 @@ -import sys, os.path, platform - -SConscript( '../libxtreemfs/libxtreemfs.SConscript' ) -SConscript( '../google-breakpad/google-breakpad.SConscript' ) - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["YIELD_PLATFORM_HAVE_OPENSSL"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' ), os.path.abspath( '../../share/yidl/include' ), os.path.abspath( '../../share/yield/src' ), os.path.abspath( '../../share/yieldfs/include' ), os.path.abspath( '../../share/yield/include' ), os.path.abspath( '../../include' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -lib_dir_paths = [os.path.abspath( '../../lib' )] -for lib_dir_path in lib_dir_paths: - if not lib_dir_path in build_env["LIBPATH"]: build_env["LIBPATH"].append( lib_dir_path ) - -# Don't add libs until after custom and dependency SConscripts, to avoid failing build_conf checks because of missing -l libs -for lib in ["xtreemfs"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - -build_env.Program( "../../bin/mkfs.xtreemfs", ( - r"../../src/mkfs.xtreemfs/mkfs.xtreemfs.cpp" ) ) diff --git a/proj/mkfs.xtreemfs/mkfs.xtreemfs.vcproj b/proj/mkfs.xtreemfs/mkfs.xtreemfs.vcproj deleted file mode 100644 index f182d7e295541617fb8d6af54b4531c8864f00c0..0000000000000000000000000000000000000000 --- a/proj/mkfs.xtreemfs/mkfs.xtreemfs.vcproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proj/mount.xtreemfs/mount.xtreemfs.SConscript b/proj/mount.xtreemfs/mount.xtreemfs.SConscript deleted file mode 100644 index 073930d605db81f69cb2a01c7baa40d3591f63c2..0000000000000000000000000000000000000000 --- a/proj/mount.xtreemfs/mount.xtreemfs.SConscript +++ /dev/null @@ -1,86 +0,0 @@ -import sys, os.path, platform - -SConscript( '../libxtreemfs/libxtreemfs.SConscript' ) -SConscript( '../google-breakpad/google-breakpad.SConscript' ) - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["YIELD_PLATFORM_HAVE_OPENSSL"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' ), os.path.abspath( '../../share/yidl/include' ), os.path.abspath( '../../share/yield/src' ), os.path.abspath( '../../share/yieldfs/include' ), os.path.abspath( '../../share/yield/include' ), os.path.abspath( '../../include' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -lib_dir_paths = [os.path.abspath( '../../lib' )] -for lib_dir_path in lib_dir_paths: - if not lib_dir_path in build_env["LIBPATH"]: build_env["LIBPATH"].append( lib_dir_path ) - -# Don't add libs until after custom and dependency SConscripts, to avoid failing build_conf checks because of missing -l libs -for lib in ["xtreemfs"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - -build_env.Program( "../../bin/mount.xtreemfs", ( - r"../../src/mount.xtreemfs/mount.xtreemfs.cpp" ) ) diff --git a/proj/mount.xtreemfs/mount.xtreemfs.vcproj b/proj/mount.xtreemfs/mount.xtreemfs.vcproj deleted file mode 100644 index 28106cf3b0f3e027959c2fe1119aa09d79b0ed19..0000000000000000000000000000000000000000 --- a/proj/mount.xtreemfs/mount.xtreemfs.vcproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proj/nettest.xtreemfs/nettest.xtreemfs.SConscript b/proj/nettest.xtreemfs/nettest.xtreemfs.SConscript deleted file mode 100644 index ad5805433bf43a93d82e8d9892f8abc95c1ed3ce..0000000000000000000000000000000000000000 --- a/proj/nettest.xtreemfs/nettest.xtreemfs.SConscript +++ /dev/null @@ -1,87 +0,0 @@ -import sys, os.path, platform - -SConscript( '../libxtreemfs/libxtreemfs.SConscript' ) -SConscript( '../google-breakpad/google-breakpad.SConscript' ) - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["YIELD_PLATFORM_HAVE_OPENSSL"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' ), os.path.abspath( '../../share/yidl/include' ), os.path.abspath( '../../share/yield/src' ), os.path.abspath( '../../share/yieldfs/include' ), os.path.abspath( '../../share/yield/include' ), os.path.abspath( '../../include' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -lib_dir_paths = [os.path.abspath( '../../lib' )] -for lib_dir_path in lib_dir_paths: - if not lib_dir_path in build_env["LIBPATH"]: build_env["LIBPATH"].append( lib_dir_path ) - -# Don't add libs until after custom and dependency SConscripts, to avoid failing build_conf checks because of missing -l libs -for lib in ["xtreemfs"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - -build_env.Program( "../../bin/nettest.xtreemfs", ( - r"../../src/nettest.xtreemfs/nettest.xtreemfs.cpp", - r"../../src/nettest.xtreemfs/nettest_proxy.cpp" ) ) diff --git a/proj/nettest.xtreemfs/nettest.xtreemfs.vcproj b/proj/nettest.xtreemfs/nettest.xtreemfs.vcproj deleted file mode 100644 index 869e7d26bc257ade47996538952f77184d761a42..0000000000000000000000000000000000000000 --- a/proj/nettest.xtreemfs/nettest.xtreemfs.vcproj +++ /dev/null @@ -1,187 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proj/rmfs.xtreemfs/rmfs.xtreemfs.SConscript b/proj/rmfs.xtreemfs/rmfs.xtreemfs.SConscript deleted file mode 100644 index 2a5bfaf49e403acf40bd7bf17e8b5231cfcbd853..0000000000000000000000000000000000000000 --- a/proj/rmfs.xtreemfs/rmfs.xtreemfs.SConscript +++ /dev/null @@ -1,86 +0,0 @@ -import sys, os.path, platform - -SConscript( '../libxtreemfs/libxtreemfs.SConscript' ) -SConscript( '../google-breakpad/google-breakpad.SConscript' ) - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["YIELD_PLATFORM_HAVE_OPENSSL"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' ), os.path.abspath( '../../share/yidl/include' ), os.path.abspath( '../../share/yield/src' ), os.path.abspath( '../../share/yieldfs/include' ), os.path.abspath( '../../share/yield/include' ), os.path.abspath( '../../include' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -lib_dir_paths = [os.path.abspath( '../../lib' )] -for lib_dir_path in lib_dir_paths: - if not lib_dir_path in build_env["LIBPATH"]: build_env["LIBPATH"].append( lib_dir_path ) - -# Don't add libs until after custom and dependency SConscripts, to avoid failing build_conf checks because of missing -l libs -for lib in ["xtreemfs"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - -build_env.Program( "../../bin/rmfs.xtreemfs", ( - r"../../src/rmfs.xtreemfs/rmfs.xtreemfs.cpp" ) ) diff --git a/proj/rmfs.xtreemfs/rmfs.xtreemfs.vcproj b/proj/rmfs.xtreemfs/rmfs.xtreemfs.vcproj deleted file mode 100644 index 99684b59bb2d3a60867e9f724396a90ae178c2cc..0000000000000000000000000000000000000000 --- a/proj/rmfs.xtreemfs/rmfs.xtreemfs.vcproj +++ /dev/null @@ -1,175 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/proj/xtfs_vivaldi/xtfs_vivaldi.SConscript b/proj/xtfs_vivaldi/xtfs_vivaldi.SConscript deleted file mode 100644 index e4b1363c3f234afe469d8c07d8eb737b05e239d7..0000000000000000000000000000000000000000 --- a/proj/xtfs_vivaldi/xtfs_vivaldi.SConscript +++ /dev/null @@ -1,88 +0,0 @@ -import sys, os.path, platform - -SConscript( '../libxtreemfs/libxtreemfs.SConscript' ) -SConscript( '../google-breakpad/google-breakpad.SConscript' ) - - -try: - Import( "build_env", "build_conf" ) -except: - build_env = {} # Init Environment() from this so that it doesn't start with default values for e.g. CC, which induces pkginfo popens on Sun - - include_dir_paths = os.environ.has_key( "CPPPATH" ) and os.environ["CPPPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - - if os.environ.get( "CC" ): build_env["CC"] = os.environ.get( "CC" ) - if os.environ.get( "CXX" ): build_env["CXX"] = os.environ.get( "CXX" ) - build_env["CCFLAGS"] = os.environ.get( "CCFLAGS", "" ).strip() - lib_dir_paths = os.environ.has_key( "LIBPATH" ) and os.environ["LIBPATH"].split( sys.platform.startswith( "win" ) and ';' or ':' ) or [] - build_env["LINKFLAGS"] = os.environ.get( "LINKFLAGS", "" ).strip() - build_env["LIBS"] = os.environ.has_key( "LIBS" ) and os.environ["LIBS"].split( " " ) or [] - - if sys.platform.startswith( "win" ): - if os.environ.has_key( "INCLUDE" ): include_dir_paths.extend( os.environ["INCLUDE"].split( ';' ) ) - if os.environ.has_key( "LIB" ): lib_dir_paths.extend( os.environ["LIB"].split( ';' ) ) - build_env["CCFLAGS"] += ' /EHsc /GR- /D "_CRT_DISABLE_PERFCRIT_LOCKS" /D "WIN32" /nologo ' # GR- is -fno-rtti, EHsc is to enable exception handling - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "/MD " - else: build_env["CCFLAGS"] += "/MDd /ZI /W3 " - if not "user32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "user32.lib" ) - if not "advapi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "advapi32.lib" ) - if not "gdi32.lib" in build_env["LIBS"]: build_env["LIBS"].append( "gdi32.lib" ) - else: - build_env["CCFLAGS"] += " -Wall -Wold-style-cast -Wunused-macros " - if sys.platform == "linux2": - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "util", "dl", "rt", "stdc++" ) ) - elif sys.platform == "darwin": - build_env["CCFLAGS"] += " -D_FILE_OFFSET_BITS=64 " - # build_env["LINKFLAGS"] += "-framework Carbon " - build_env["LIBS"].append( "iconv" ) - elif sys.platform.startswith( "freebsd" ): - build_env["CCFLAGS"] += "-D_FILE_OFFSET_BITS=64 " - build_env["LIBS"].extend( ( "pthread", "intl", "iconv" ) ) - elif sys.platform == "sunos5": - build_env["tools"] = ["gcc", "g++", "gnulink", "ar"] - build_env["CCFLAGS"] += "-Dupgrade_the_compiler_to_use_STL=1 -D_REENTRANT " - build_env["LIBS"].extend( ( "stdc++", "m", "socket", "nsl", "kstat", "rt", "iconv", "cpc" ) ) - - if ARGUMENTS.get( "coverage", 0 ): build_env["CCFLAGS"] += "-pg --coverage "; build_env["LINKFLAGS"] += "-pg --coverage " - if ARGUMENTS.get( "profile-cpu", 0 ): build_env["CCFLAGS"] += "-pg "; build_env["LINKFLAGS"] += "-pg " - if ARGUMENTS.get( "profile-heap", 0 ): build_env["CCFLAGS"] += "-fno-omit-frame-pointer "; build_env["LIBS"].append( "tcmalloc" ) - if ARGUMENTS.get( "release", 0 ): build_env["CCFLAGS"] += "-O2 " - else: build_env["CCFLAGS"] += "-g -D_DEBUG " - if ARGUMENTS.get( "shared", 0 ): build_env["CCFLAGS"] += "-fPIC " - if not ARGUMENTS.get( "with-rtti", 0 ) and sys.platform != "darwin": build_env["CCFLAGS"] += "-fno-rtti " # Disable RTTI by default - - build_env["CPPPATH"] = list( set( [os.path.abspath( include_dir_path ) for include_dir_path in include_dir_paths] ) ) - build_env["LIBPATH"] = list( set( [os.path.abspath( lib_dir_path ) for lib_dir_path in lib_dir_paths] ) ) - build_env = Environment( **build_env ) - - build_conf = build_env.Configure() - if sys.platform.startswith( "linux" ) and platform.machine() == "i686": - build_env["CCFLAGS"] += "-march=i686 " - - Export( "build_env", "build_conf" ) - -defines = ["YIELD_PLATFORM_HAVE_OPENSSL"] -if sys.platform.startswith( "win" ): defines.extend( [] ) -else: defines.extend( [] ) -for define in defines: - if sys.platform.startswith( "win" ): define_switch = '/D "' + define + '"' - else: define_switch = "-D" + define - if not define_switch in build_env["CCFLAGS"]: build_env["CCFLAGS"] += define_switch + " " - -include_dir_paths = [os.path.abspath( '../../share/google-breakpad/src' ), os.path.abspath( '../../share/yidl/include' ), os.path.abspath( '../../share/yield/src' ), os.path.abspath( '../../share/yieldfs/include' ), os.path.abspath( '../../share/yield/include' ), os.path.abspath( '../../include' )] -for include_dir_path in include_dir_paths: - if not include_dir_path in build_env["CPPPATH"]: build_env["CPPPATH"].append( include_dir_path ) - -lib_dir_paths = [os.path.abspath( '../../lib' )] -for lib_dir_path in lib_dir_paths: - if not lib_dir_path in build_env["LIBPATH"]: build_env["LIBPATH"].append( lib_dir_path ) - -# Don't add libs until after custom and dependency SConscripts, to avoid failing build_conf checks because of missing -l libs -for lib in ["xtreemfs"]: - if not lib in build_env["LIBS"]: build_env["LIBS"].insert( 0, lib ) - -build_env.Program( "../../bin/xtfs_vivaldi", ( - r"../../src/xtfs_vivaldi/vivaldi_node.cpp", - r"../../src/xtfs_vivaldi/xtfs_vivaldi.cpp", - r"../../src/xtfs_vivaldi/zipf_generator.cpp" ) ) diff --git a/proj/xtfs_vivaldi/xtfs_vivaldi.vcproj b/proj/xtfs_vivaldi/xtfs_vivaldi.vcproj deleted file mode 100644 index dc46bf881a13a40b42820f78e6f7e866df6e8d17..0000000000000000000000000000000000000000 --- a/proj/xtfs_vivaldi/xtfs_vivaldi.vcproj +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/share/google-breakpad/COPYING b/share/google-breakpad/COPYING deleted file mode 100644 index af96468d0d03012699d8729441e00947187b0735..0000000000000000000000000000000000000000 --- a/share/google-breakpad/COPYING +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2006, 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. diff --git a/share/google-breakpad/src/client/linux/crash_generation/client_info.h b/share/google-breakpad/src/client/linux/crash_generation/client_info.h deleted file mode 100644 index 173b34d88c47c73b6310e34db9c6246d89387dc5..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/crash_generation/client_info.h +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_ -#define CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_ - -namespace google_breakpad { - -class CrashGenerationServer; - -struct ClientInfo { - CrashGenerationServer* crash_server_; - pid_t pid_; -}; - -} - -#endif // CLIENT_LINUX_CRASH_GENERATION_CLIENT_INFO_H_ diff --git a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_client.cc b/share/google-breakpad/src/client/linux/crash_generation/crash_generation_client.cc deleted file mode 100644 index 2463f1ed82803056b290e31daeab0b2bf0704e6a..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_client.cc +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) 2010 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. - -#include -#include - -#include - -#include "client/linux/crash_generation/crash_generation_client.h" -#include "common/linux/eintr_wrapper.h" -#include "common/linux/linux_libc_support.h" -#include "common/linux/linux_syscall_support.h" - -namespace google_breakpad { - -bool -CrashGenerationClient::RequestDump(const void* blob, size_t blob_size) -{ - int fds[2]; - sys_socketpair(AF_UNIX, SOCK_STREAM, 0, fds); - - static const unsigned kControlMsgSize = CMSG_SPACE(sizeof(int)); - - struct kernel_msghdr msg; - my_memset(&msg, 0, sizeof(struct kernel_msghdr)); - struct kernel_iovec iov[1]; - iov[0].iov_base = const_cast(blob); - iov[0].iov_len = blob_size; - - msg.msg_iov = iov; - msg.msg_iovlen = sizeof(iov) / sizeof(iov[0]); - char cmsg[kControlMsgSize]; - my_memset(cmsg, 0, kControlMsgSize); - msg.msg_control = cmsg; - msg.msg_controllen = sizeof(cmsg); - - struct cmsghdr* hdr = CMSG_FIRSTHDR(&msg); - hdr->cmsg_level = SOL_SOCKET; - hdr->cmsg_type = SCM_RIGHTS; - hdr->cmsg_len = CMSG_LEN(sizeof(int)); - *((int*) CMSG_DATA(hdr)) = fds[1]; - - HANDLE_EINTR(sys_sendmsg(server_fd_, &msg, 0)); - sys_close(fds[1]); - - // wait for an ACK from the server - char b; - HANDLE_EINTR(sys_read(fds[0], &b, 1)); - - return true; -} - -//static -CrashGenerationClient* -CrashGenerationClient::TryCreate(int server_fd) -{ - if (0 > server_fd) - return NULL; - return new CrashGenerationClient(server_fd); -} - -} diff --git a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_client.h b/share/google-breakpad/src/client/linux/crash_generation/crash_generation_client.h deleted file mode 100644 index 7139dff44d86f86e807ea8c0f2cc29c55e28b1e1..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_client.h +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ -#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ - -#include - -namespace google_breakpad { - -class CrashGenerationClient { -public: - ~CrashGenerationClient() - { - } - - // Request the crash server to generate a dump. |blob| is a hack, - // see exception_handler.h and minidump_writer.h - // - // Return true if the dump was successful; false otherwise. - bool RequestDump(const void* blob, size_t blob_size); - - // Return a new CrashGenerationClient if |server_fd| is valid and - // connects to a CrashGenerationServer. Otherwise, return NULL. - // The returned CrashGenerationClient* is owned by the caller of - // this function. - static CrashGenerationClient* TryCreate(int server_fd); - -private: - CrashGenerationClient(int server_fd) : server_fd_(server_fd) - { - } - - int server_fd_; - - // prevent copy construction and assignment - CrashGenerationClient(const CrashGenerationClient&); - CrashGenerationClient& operator=(const CrashGenerationClient&); -}; - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H_ diff --git a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_server.cc b/share/google-breakpad/src/client/linux/crash_generation/crash_generation_server.cc deleted file mode 100644 index ff380aa5221e0360ffb426573468b2766c59b1ea..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_server.cc +++ /dev/null @@ -1,466 +0,0 @@ -// Copyright (c) 2010 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. - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "client/linux/crash_generation/crash_generation_server.h" -#include "client/linux/crash_generation/client_info.h" -#include "client/linux/handler/exception_handler.h" -#include "client/linux/minidump_writer/minidump_writer.h" -#include "common/linux/eintr_wrapper.h" -#include "common/linux/guid_creator.h" - -static const char kCommandQuit = 'x'; - -static bool -GetInodeForFileDescriptor(ino_t* inode_out, int fd) -{ - assert(inode_out); - - struct stat buf; - if (fstat(fd, &buf) < 0) - return false; - - if (!S_ISSOCK(buf.st_mode)) - return false; - - *inode_out = buf.st_ino; - return true; -} - -// expected prefix of the target of the /proc/self/fd/%d link for a socket -static const char kSocketLinkPrefix[] = "socket:["; - -// Parse a symlink in /proc/pid/fd/$x and return the inode number of the -// socket. -// inode_out: (output) set to the inode number on success -// path: e.g. /proc/1234/fd/5 (must be a UNIX domain socket descriptor) -static bool -GetInodeForProcPath(ino_t* inode_out, const char* path) -{ - assert(inode_out); - assert(path); - - char buf[256]; - const ssize_t n = readlink(path, buf, sizeof(buf) - 1); - if (n == -1) { - return false; - } - buf[n] = 0; - - if (0 != memcmp(kSocketLinkPrefix, buf, sizeof(kSocketLinkPrefix) - 1)) { - return false; - } - - char* endptr; - const u_int64_t inode_ul = - strtoull(buf + sizeof(kSocketLinkPrefix) - 1, &endptr, 10); - if (*endptr != ']') - return false; - - if (inode_ul == ULLONG_MAX) { - return false; - } - - *inode_out = inode_ul; - return true; -} - -static bool -FindProcessHoldingSocket(pid_t* pid_out, ino_t socket_inode) -{ - assert(pid_out); - bool already_found = false; - - DIR* proc = opendir("/proc"); - if (!proc) { - return false; - } - - std::vector pids; - - struct dirent* dent; - while ((dent = readdir(proc))) { - char* endptr; - const unsigned long int pid_ul = strtoul(dent->d_name, &endptr, 10); - if (pid_ul == ULONG_MAX || '\0' != *endptr) - continue; - pids.push_back(pid_ul); - } - closedir(proc); - - for (std::vector::const_iterator - i = pids.begin(); i != pids.end(); ++i) { - const pid_t current_pid = *i; - char buf[256]; - snprintf(buf, sizeof(buf), "/proc/%d/fd", current_pid); - DIR* fd = opendir(buf); - if (!fd) - continue; - - while ((dent = readdir(fd))) { - if (snprintf(buf, sizeof(buf), "/proc/%d/fd/%s", current_pid, - dent->d_name) >= static_cast(sizeof(buf))) { - continue; - } - - ino_t fd_inode; - if (GetInodeForProcPath(&fd_inode, buf) - && fd_inode == socket_inode) { - if (already_found) { - closedir(fd); - return false; - } - - already_found = true; - *pid_out = current_pid; - break; - } - } - - closedir(fd); - } - - return already_found; -} - -namespace google_breakpad { - -CrashGenerationServer::CrashGenerationServer( - const int listen_fd, - OnClientDumpRequestCallback dump_callback, - void* dump_context, - OnClientExitingCallback exit_callback, - void* exit_context, - bool generate_dumps, - const std::string* dump_path) : - server_fd_(listen_fd), - dump_callback_(dump_callback), - dump_context_(dump_context), - exit_callback_(exit_callback), - exit_context_(exit_context), - generate_dumps_(generate_dumps), - started_(false) -{ - if (dump_path) - dump_dir_ = *dump_path; - else - dump_dir_ = "/tmp"; -} - -CrashGenerationServer::~CrashGenerationServer() -{ - if (started_) - Stop(); -} - -bool -CrashGenerationServer::Start() -{ - if (started_ || 0 > server_fd_) - return false; - - int control_pipe[2]; - if (pipe(control_pipe)) - return false; - - if (fcntl(control_pipe[0], F_SETFD, FD_CLOEXEC)) - return false; - if (fcntl(control_pipe[1], F_SETFD, FD_CLOEXEC)) - return false; - - if (fcntl(control_pipe[0], F_SETFL, O_NONBLOCK)) - return false; - - control_pipe_in_ = control_pipe[0]; - control_pipe_out_ = control_pipe[1]; - - if (pthread_create(&thread_, NULL, - ThreadMain, reinterpret_cast(this))) - return false; - - started_ = true; - return true; -} - -void -CrashGenerationServer::Stop() -{ - assert(pthread_self() != thread_); - - if (!started_) - return; - - HANDLE_EINTR(write(control_pipe_out_, &kCommandQuit, 1)); - - void* dummy; - pthread_join(thread_, &dummy); - - started_ = false; -} - -//static -bool -CrashGenerationServer::CreateReportChannel(int* server_fd, int* client_fd) -{ - int fds[2]; - - if (socketpair(AF_UNIX, SOCK_SEQPACKET, 0, fds)) - return false; - - static const int on = 1; - // Enable passcred on the server end of the socket - if (setsockopt(fds[1], SOL_SOCKET, SO_PASSCRED, &on, sizeof(on))) - return false; - - if (fcntl(fds[1], F_SETFL, O_NONBLOCK)) - return false; - if (fcntl(fds[1], F_SETFD, FD_CLOEXEC)) - return false; - - *client_fd = fds[0]; - *server_fd = fds[1]; - return true; -} - -// The following methods/functions execute on the server thread - -void -CrashGenerationServer::Run() -{ - struct pollfd pollfds[2]; - memset(&pollfds, 0, sizeof(pollfds)); - - pollfds[0].fd = server_fd_; - pollfds[0].events = POLLIN; - - pollfds[1].fd = control_pipe_in_; - pollfds[1].events = POLLIN; - - while (true) { - // infinite timeout - int nevents = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), -1); - if (-1 == nevents) { - if (EINTR == errno) { - continue; - } else { - return; - } - } - - if (pollfds[0].revents && !ClientEvent(pollfds[0].revents)) - return; - - if (pollfds[1].revents && !ControlEvent(pollfds[1].revents)) - return; - } -} - -bool -CrashGenerationServer::ClientEvent(short revents) -{ - if (POLLHUP & revents) - return false; - assert(POLLIN & revents); - - // A process has crashed and has signaled us by writing a datagram - // to the death signal socket. The datagram contains the crash context needed - // for writing the minidump as well as a file descriptor and a credentials - // block so that they can't lie about their pid. - - // The length of the control message: - static const unsigned kControlMsgSize = - CMSG_SPACE(sizeof(int)) + CMSG_SPACE(sizeof(struct ucred)); - // The length of the regular payload: - static const unsigned kCrashContextSize = - sizeof(google_breakpad::ExceptionHandler::CrashContext); - - struct msghdr msg = {0}; - struct iovec iov[1]; - char crash_context[kCrashContextSize]; - char control[kControlMsgSize]; - const ssize_t expected_msg_size = sizeof(crash_context); - - iov[0].iov_base = crash_context; - iov[0].iov_len = sizeof(crash_context); - msg.msg_iov = iov; - msg.msg_iovlen = sizeof(iov)/sizeof(iov[0]); - msg.msg_control = control; - msg.msg_controllen = kControlMsgSize; - - const ssize_t msg_size = HANDLE_EINTR(recvmsg(server_fd_, &msg, 0)); - if (msg_size != expected_msg_size) - return true; - - if (msg.msg_controllen != kControlMsgSize || - msg.msg_flags & ~MSG_TRUNC) - return true; - - // Walk the control payload and extract the file descriptor and validated pid. - pid_t crashing_pid = -1; - int signal_fd = -1; - for (struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg); hdr; - hdr = CMSG_NXTHDR(&msg, hdr)) { - if (hdr->cmsg_level != SOL_SOCKET) - continue; - if (hdr->cmsg_type == SCM_RIGHTS) { - const unsigned len = hdr->cmsg_len - - (((uint8_t*)CMSG_DATA(hdr)) - (uint8_t*)hdr); - assert(len % sizeof(int) == 0u); - const unsigned num_fds = len / sizeof(int); - if (num_fds > 1 || num_fds == 0) { - // A nasty process could try and send us too many descriptors and - // force a leak. - for (unsigned i = 0; i < num_fds; ++i) - HANDLE_EINTR(close(reinterpret_cast(CMSG_DATA(hdr))[i])); - return true; - } else { - signal_fd = reinterpret_cast(CMSG_DATA(hdr))[0]; - } - } else if (hdr->cmsg_type == SCM_CREDENTIALS) { - const struct ucred *cred = - reinterpret_cast(CMSG_DATA(hdr)); - crashing_pid = cred->pid; - } - } - - if (crashing_pid == -1 || signal_fd == -1) { - if (signal_fd) - HANDLE_EINTR(close(signal_fd)); - return true; - } - - // Kernel bug workaround (broken in 2.6.30 at least): - // The kernel doesn't translate PIDs in SCM_CREDENTIALS across PID - // namespaces. Thus |crashing_pid| might be garbage from our point of view. - // In the future we can remove this workaround, but we have to wait a couple - // of years to be sure that it's worked its way out into the world. - - ino_t inode_number; - if (!GetInodeForFileDescriptor(&inode_number, signal_fd)) { - HANDLE_EINTR(close(signal_fd)); - return true; - } - - if (!FindProcessHoldingSocket(&crashing_pid, inode_number - 1)) { - HANDLE_EINTR(close(signal_fd)); - return true; - } - - std::string minidump_filename; - if (!MakeMinidumpFilename(minidump_filename)) - return true; - - if (!google_breakpad::WriteMinidump(minidump_filename.c_str(), - crashing_pid, crash_context, - kCrashContextSize)) { - HANDLE_EINTR(close(signal_fd)); - return true; - } - - if (dump_callback_) { - ClientInfo info; - - info.crash_server_ = this; - info.pid_ = crashing_pid; - - dump_callback_(dump_context_, &info, &minidump_filename); - } - - // Send the done signal to the process: it can exit now. - memset(&msg, 0, sizeof(msg)); - struct iovec done_iov; - done_iov.iov_base = const_cast("\x42"); - done_iov.iov_len = 1; - msg.msg_iov = &done_iov; - msg.msg_iovlen = 1; - - HANDLE_EINTR(sendmsg(signal_fd, &msg, MSG_DONTWAIT | MSG_NOSIGNAL)); - HANDLE_EINTR(close(signal_fd)); - - return true; -} - -bool -CrashGenerationServer::ControlEvent(short revents) -{ - if (POLLHUP & revents) - return false; - assert(POLLIN & revents); - - char command; - if (read(control_pipe_in_, &command, 1)) - return false; - - switch (command) { - case kCommandQuit: - return false; - default: - assert(0); - } - - return true; -} - -bool -CrashGenerationServer::MakeMinidumpFilename(std::string& outFilename) -{ - GUID guid; - char guidString[kGUIDStringLength+1]; - - if (!(CreateGUID(&guid) - && GUIDToString(&guid, guidString, sizeof(guidString)))) - return false; - - char path[PATH_MAX]; - snprintf(path, sizeof(path), "%s/%s.dmp", dump_dir_.c_str(), guidString); - - outFilename = path; - return true; -} - -// static -void* -CrashGenerationServer::ThreadMain(void *arg) -{ - reinterpret_cast(arg)->Run(); - return NULL; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_server.h b/share/google-breakpad/src/client/linux/crash_generation/crash_generation_server.h deleted file mode 100644 index a9dc1f7f7069dd5d8621a53f75210844bb65b479..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/crash_generation/crash_generation_server.h +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ -#define CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ - -#include - -#include - -namespace google_breakpad { - -class ClientInfo; - -class CrashGenerationServer { -public: - // WARNING: callbacks may be invoked on a different thread - // than that which creates the CrashGenerationServer. They must - // be thread safe. - typedef void (*OnClientDumpRequestCallback)(void* context, - const ClientInfo* client_info, - const std::string* file_path); - - typedef void (*OnClientExitingCallback)(void* context, - const ClientInfo* client_info); - - // Create an instance with the given parameters. - // - // Parameter listen_fd: The server fd created by CreateReportChannel(). - // Parameter dump_callback: Callback for a client crash dump request. - // Parameter dump_context: Context for client crash dump request callback. - // Parameter exit_callback: Callback for client process exit. - // Parameter exit_context: Context for client exit callback. - // Parameter generate_dumps: Whether to automatically generate dumps. - // Client code of this class might want to generate dumps explicitly - // in the crash dump request callback. In that case, false can be - // passed for this parameter. - // Parameter dump_path: Path for generating dumps; required only if true is - // passed for generateDumps parameter; NULL can be passed otherwise. - CrashGenerationServer(const int listen_fd, - OnClientDumpRequestCallback dump_callback, - void* dump_context, - OnClientExitingCallback exit_callback, - void* exit_context, - bool generate_dumps, - const std::string* dump_path); - - ~CrashGenerationServer(); - - // Perform initialization steps needed to start listening to clients. - // - // Return true if initialization is successful; false otherwise. - bool Start(); - - // Stop the server. - void Stop(); - - // Create a "channel" that can be used by clients to report crashes - // to a CrashGenerationServer. |*server_fd| should be passed to - // this class's constructor, and |*client_fd| should be passed to - // the ExceptionHandler constructor in the client process. - static bool CreateReportChannel(int* server_fd, int* client_fd); - -private: - // Run the server's event loop - void Run(); - - // Invoked when an child process (client) event occurs - // Returning true => "keep running", false => "exit loop" - bool ClientEvent(short revents); - - // Invoked when the controlling thread (main) event occurs - // Returning true => "keep running", false => "exit loop" - bool ControlEvent(short revents); - - // Return a unique filename at which a minidump can be written - bool MakeMinidumpFilename(std::string& outFilename); - - // Trampoline to |Run()| - static void* ThreadMain(void* arg); - - int server_fd_; - - OnClientDumpRequestCallback dump_callback_; - void* dump_context_; - - OnClientExitingCallback exit_callback_; - void* exit_context_; - - bool generate_dumps_; - - std::string dump_dir_; - - bool started_; - - pthread_t thread_; - int control_pipe_in_; - int control_pipe_out_; - - // disable these - CrashGenerationServer(const CrashGenerationServer&); - CrashGenerationServer& operator=(const CrashGenerationServer&); -}; - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_CRASH_GENERATION_CRASH_GENERATION_SERVER_H_ diff --git a/share/google-breakpad/src/client/linux/handler/exception_handler.cc b/share/google-breakpad/src/client/linux/handler/exception_handler.cc deleted file mode 100644 index 01081878621ff55f58f95560950b62d2ec1d388d..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/handler/exception_handler.cc +++ /dev/null @@ -1,383 +0,0 @@ -// Copyright (c) 2010 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. - -// The ExceptionHandler object installs signal handlers for a number of -// signals. We rely on the signal handler running on the thread which crashed -// in order to identify it. This is true of the synchronous signals (SEGV etc), -// but not true of ABRT. Thus, if you send ABRT to yourself in a program which -// uses ExceptionHandler, you need to use tgkill to direct it to the current -// thread. -// -// The signal flow looks like this: -// -// SignalHandler (uses a global stack of ExceptionHandler objects to find -// | one to handle the signal. If the first rejects it, try -// | the second etc...) -// V -// HandleSignal ----------------------------| (clones a new process which -// | | shares an address space with -// (wait for cloned | the crashed process. This -// process) | allows us to ptrace the crashed -// | | process) -// V V -// (set signal handler to ThreadEntry (static function to bounce -// SIG_DFL and rethrow, | back into the object) -// killing the crashed | -// process) V -// DoDump (writes minidump) -// | -// V -// sys_exit -// - -// This code is a little fragmented. Different functions of the ExceptionHandler -// class run in a number of different contexts. Some of them run in a normal -// context and are easy to code, others run in a compromised context and the -// restrictions at the top of minidump_writer.cc apply: no libc and use the -// alternative malloc. Each function should have comment above it detailing the -// context which it runs in. - -#include "client/linux/handler/exception_handler.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "common/linux/linux_libc_support.h" -#include "common/linux/linux_syscall_support.h" -#include "common/linux/memory.h" -#include "client/linux/minidump_writer/minidump_writer.h" -#include "common/linux/guid_creator.h" - -// A wrapper for the tgkill syscall: send a signal to a specific thread. -static int tgkill(pid_t tgid, pid_t tid, int sig) { - syscall(__NR_tgkill, tgid, tid, sig); - return 0; -} - -namespace google_breakpad { - -// The list of signals which we consider to be crashes. The default action for -// all these signals must be Core (see man 7 signal) because we rethrow the -// signal after handling it and expect that it'll be fatal. -static const int kExceptionSignals[] = { - SIGSEGV, SIGABRT, SIGFPE, SIGILL, SIGBUS, -1 -}; - -// We can stack multiple exception handlers. In that case, this is the global -// which holds the stack. -std::vector* ExceptionHandler::handler_stack_ = NULL; -unsigned ExceptionHandler::handler_stack_index_ = 0; -pthread_mutex_t ExceptionHandler::handler_stack_mutex_ = - PTHREAD_MUTEX_INITIALIZER; - -// Runs before crashing: normal context. -ExceptionHandler::ExceptionHandler(const std::string &dump_path, - FilterCallback filter, - MinidumpCallback callback, - void *callback_context, - bool install_handler) - : filter_(filter), - callback_(callback), - callback_context_(callback_context), - handler_installed_(install_handler) -{ - Init(dump_path, -1); -} - -ExceptionHandler::ExceptionHandler(const std::string &dump_path, - FilterCallback filter, - MinidumpCallback callback, - void* callback_context, - bool install_handler, - const int server_fd) - : filter_(filter), - callback_(callback), - callback_context_(callback_context), - handler_installed_(install_handler) -{ - Init(dump_path, server_fd); -} - -// Runs before crashing: normal context. -ExceptionHandler::~ExceptionHandler() { - UninstallHandlers(); -} - -void ExceptionHandler::Init(const std::string &dump_path, - const int server_fd) -{ - crash_handler_ = NULL; - - if (0 <= server_fd) - crash_generation_client_ - .reset(CrashGenerationClient::TryCreate(server_fd)); - - if (handler_installed_) - InstallHandlers(); - - if (!IsOutOfProcess()) - set_dump_path(dump_path); - - pthread_mutex_lock(&handler_stack_mutex_); - if (handler_stack_ == NULL) - handler_stack_ = new std::vector; - handler_stack_->push_back(this); - pthread_mutex_unlock(&handler_stack_mutex_); -} - -// Runs before crashing: normal context. -bool ExceptionHandler::InstallHandlers() { - // We run the signal handlers on an alternative stack because we might have - // crashed because of a stack overflow. - - // We use this value rather than SIGSTKSZ because we would end up overrunning - // such a small stack. - static const unsigned kSigStackSize = 8192; - - signal_stack = malloc(kSigStackSize); - stack_t stack; - memset(&stack, 0, sizeof(stack)); - stack.ss_sp = signal_stack; - stack.ss_size = kSigStackSize; - - if (sigaltstack(&stack, NULL) == -1) - return false; - - struct sigaction sa; - memset(&sa, 0, sizeof(sa)); - sigemptyset(&sa.sa_mask); - - // mask all exception signals when we're handling one of them. - for (unsigned i = 0; kExceptionSignals[i] != -1; ++i) - sigaddset(&sa.sa_mask, kExceptionSignals[i]); - - sa.sa_sigaction = SignalHandler; - sa.sa_flags = SA_ONSTACK | SA_SIGINFO; - - for (unsigned i = 0; kExceptionSignals[i] != -1; ++i) { - struct sigaction* old = new struct sigaction; - if (sigaction(kExceptionSignals[i], &sa, old) == -1) - return false; - old_handlers_.push_back(std::make_pair(kExceptionSignals[i], old)); - } - return true; -} - -// Runs before crashing: normal context. -void ExceptionHandler::UninstallHandlers() { - for (unsigned i = 0; i < old_handlers_.size(); ++i) { - struct sigaction *action = - reinterpret_cast(old_handlers_[i].second); - sigaction(old_handlers_[i].first, action, NULL); - delete action; - } - - old_handlers_.clear(); -} - -// Runs before crashing: normal context. -void ExceptionHandler::UpdateNextID() { - GUID guid; - char guid_str[kGUIDStringLength + 1]; - if (CreateGUID(&guid) && GUIDToString(&guid, guid_str, sizeof(guid_str))) { - next_minidump_id_ = guid_str; - next_minidump_id_c_ = next_minidump_id_.c_str(); - - char minidump_path[PATH_MAX]; - snprintf(minidump_path, sizeof(minidump_path), "%s/%s.dmp", - dump_path_c_, - guid_str); - - next_minidump_path_ = minidump_path; - next_minidump_path_c_ = next_minidump_path_.c_str(); - } -} - -// This function runs in a compromised context: see the top of the file. -// Runs on the crashing thread. -// static -void ExceptionHandler::SignalHandler(int sig, siginfo_t* info, void* uc) { - // All the exception signals are blocked at this point. - - pthread_mutex_lock(&handler_stack_mutex_); - - if (!handler_stack_->size()) { - pthread_mutex_unlock(&handler_stack_mutex_); - return; - } - - for (int i = handler_stack_->size() - 1; i >= 0; --i) { - if ((*handler_stack_)[i]->HandleSignal(sig, info, uc)) { - // successfully handled: We are in an invalid state since an exception - // signal has been delivered. We don't call the exit handlers because - // they could end up corrupting on-disk state. - break; - } - } - - pthread_mutex_unlock(&handler_stack_mutex_); - - // Terminate ourselves with the same signal so that our parent knows that we - // crashed. The default action for all the signals which we catch is Core, so - // this is the end of us. - signal(sig, SIG_DFL); - tgkill(getpid(), sys_gettid(), sig); - - // not reached. -} - -struct ThreadArgument { - pid_t pid; // the crashing process - ExceptionHandler* handler; - const void* context; // a CrashContext structure - size_t context_size; -}; - -// This is the entry function for the cloned process. We are in a compromised -// context here: see the top of the file. -// static -int ExceptionHandler::ThreadEntry(void *arg) { - const ThreadArgument *thread_arg = reinterpret_cast(arg); - return thread_arg->handler->DoDump(thread_arg->pid, thread_arg->context, - thread_arg->context_size) == false; -} - -// This function runs in a compromised context: see the top of the file. -// Runs on the crashing thread. -bool ExceptionHandler::HandleSignal(int sig, siginfo_t* info, void* uc) { - if (filter_ && !filter_(callback_context_)) - return false; - - // Allow ourselves to be dumped. - sys_prctl(PR_SET_DUMPABLE, 1); - - CrashContext context; - memcpy(&context.siginfo, info, sizeof(siginfo_t)); - memcpy(&context.context, uc, sizeof(struct ucontext)); - memcpy(&context.float_state, ((struct ucontext *)uc)->uc_mcontext.fpregs, - sizeof(context.float_state)); - context.tid = sys_gettid(); - - if (crash_handler_ && crash_handler_(&context, sizeof(context), - callback_context_)) - return true; - - return GenerateDump(&context); -} - -// This function may run in a compromised context: see the top of the file. -bool ExceptionHandler::GenerateDump(CrashContext *context) { - if (IsOutOfProcess()) - return crash_generation_client_->RequestDump(context, sizeof(*context)); - - static const unsigned kChildStackSize = 8000; - PageAllocator allocator; - uint8_t* stack = (uint8_t*) allocator.Alloc(kChildStackSize); - if (!stack) - return false; - // clone() needs the top-most address. (scrub just to be safe) - stack += kChildStackSize; - my_memset(stack - 16, 0, 16); - - ThreadArgument thread_arg; - thread_arg.handler = this; - thread_arg.pid = getpid(); - thread_arg.context = context; - thread_arg.context_size = sizeof(*context); - - const pid_t child = sys_clone( - ThreadEntry, stack, CLONE_FILES | CLONE_FS | CLONE_UNTRACED, - &thread_arg, NULL, NULL, NULL); - int r, status; - do { - r = sys_waitpid(child, &status, __WALL); - } while (r == -1 && errno == EINTR); - - if (r == -1) { - static const char msg[] = "ExceptionHandler::GenerateDump waitpid failed:"; - sys_write(2, msg, sizeof(msg) - 1); - sys_write(2, strerror(errno), strlen(strerror(errno))); - sys_write(2, "\n", 1); - } - - bool success = r != -1 && WIFEXITED(status) && WEXITSTATUS(status) == 0; - - if (callback_) - success = callback_(dump_path_c_, next_minidump_id_c_, - callback_context_, success); - - return success; -} - -// This function runs in a compromised context: see the top of the file. -// Runs on the cloned process. -bool ExceptionHandler::DoDump(pid_t crashing_process, const void* context, - size_t context_size) { - return google_breakpad::WriteMinidump( - next_minidump_path_c_, crashing_process, context, context_size); -} - -// static -bool ExceptionHandler::WriteMinidump(const std::string &dump_path, - MinidumpCallback callback, - void* callback_context) { - ExceptionHandler eh(dump_path, NULL, callback, callback_context, false); - return eh.WriteMinidump(); -} - -bool ExceptionHandler::WriteMinidump() { - // Allow ourselves to be dumped. - sys_prctl(PR_SET_DUMPABLE, 1); - - CrashContext context; - int getcontext_result = getcontext(&context.context); - if (getcontext_result) - return false; - memcpy(&context.float_state, context.context.uc_mcontext.fpregs, - sizeof(context.float_state)); - context.tid = sys_gettid(); - - bool success = GenerateDump(&context); - UpdateNextID(); - return success; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/linux/handler/exception_handler.h b/share/google-breakpad/src/client/linux/handler/exception_handler.h deleted file mode 100644 index 6182a6c1a921fbe6a930763691b33c7601966195..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/handler/exception_handler.h +++ /dev/null @@ -1,224 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_ -#define CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_ - -#include -#include - -#include - -#include "client/linux/crash_generation/crash_generation_client.h" -#include "processor/scoped_ptr.h" - -struct sigaction; - -namespace google_breakpad { - -// ExceptionHandler -// -// ExceptionHandler can write a minidump file when an exception occurs, -// or when WriteMinidump() is called explicitly by your program. -// -// To have the exception handler write minidumps when an uncaught exception -// (crash) occurs, you should create an instance early in the execution -// of your program, and keep it around for the entire time you want to -// have crash handling active (typically, until shutdown). -// (NOTE): There should be only be one this kind of exception handler -// object per process. -// -// If you want to write minidumps without installing the exception handler, -// you can create an ExceptionHandler with install_handler set to false, -// then call WriteMinidump. You can also use this technique if you want to -// use different minidump callbacks for different call sites. -// -// In either case, a callback function is called when a minidump is written, -// which receives the unqiue id of the minidump. The caller can use this -// id to collect and write additional application state, and to launch an -// external crash-reporting application. -// -// Caller should try to make the callbacks as crash-friendly as possible, -// it should avoid use heap memory allocation as much as possible. -class ExceptionHandler { - public: - // A callback function to run before Breakpad performs any substantial - // processing of an exception. A FilterCallback is called before writing - // a minidump. context is the parameter supplied by the user as - // callback_context when the handler was created. - // - // If a FilterCallback returns true, Breakpad will continue processing, - // attempting to write a minidump. If a FilterCallback returns false, - // Breakpad will immediately report the exception as unhandled without - // writing a minidump, allowing another handler the opportunity to handle it. - typedef bool (*FilterCallback)(void *context); - - // A callback function to run after the minidump has been written. - // minidump_id is a unique id for the dump, so the minidump - // file is \.dmp. context is the parameter supplied - // by the user as callback_context when the handler was created. succeeded - // indicates whether a minidump file was successfully written. - // - // If an exception occurred and the callback returns true, Breakpad will - // treat the exception as fully-handled, suppressing any other handlers from - // being notified of the exception. If the callback returns false, Breakpad - // will treat the exception as unhandled, and allow another handler to handle - // it. If there are no other handlers, Breakpad will report the exception to - // the system as unhandled, allowing a debugger or native crash dialog the - // opportunity to handle the exception. Most callback implementations - // should normally return the value of |succeeded|, or when they wish to - // not report an exception of handled, false. Callbacks will rarely want to - // return true directly (unless |succeeded| is true). - typedef bool (*MinidumpCallback)(const char *dump_path, - const char *minidump_id, - void *context, - bool succeeded); - - // In certain cases, a user may wish to handle the generation of the minidump - // themselves. In this case, they can install a handler callback which is - // called when a crash has occured. If this function returns true, no other - // processing of occurs and the process will shortly be crashed. If this - // returns false, the normal processing continues. - typedef bool (*HandlerCallback)(const void* crash_context, - size_t crash_context_size, - void* context); - - // Creates a new ExceptionHandler instance to handle writing minidumps. - // Before writing a minidump, the optional filter callback will be called. - // Its return value determines whether or not Breakpad should write a - // minidump. Minidump files will be written to dump_path, and the optional - // callback is called after writing the dump file, as described above. - // If install_handler is true, then a minidump will be written whenever - // an unhandled exception occurs. If it is false, minidumps will only - // be written when WriteMinidump is called. - ExceptionHandler(const std::string &dump_path, - FilterCallback filter, MinidumpCallback callback, - void *callback_context, - bool install_handler); - - // Creates a new ExceptionHandler instance that can attempt to - // perform out-of-process dump generation if server_fd is valid. If - // server_fd is invalid, in-process dump generation will be - // used. See the above ctor for a description of the other - // parameters. - ExceptionHandler(const std::string& dump_path, - FilterCallback filter, MinidumpCallback callback, - void* callback_context, - bool install_handler, - const int server_fd); - - ~ExceptionHandler(); - - // Get and set the minidump path. - std::string dump_path() const { return dump_path_; } - void set_dump_path(const std::string &dump_path) { - dump_path_ = dump_path; - dump_path_c_ = dump_path_.c_str(); - UpdateNextID(); - } - - void set_crash_handler(HandlerCallback callback) { - crash_handler_ = callback; - } - - // Writes a minidump immediately. This can be used to capture the - // execution state independently of a crash. Returns true on success. - bool WriteMinidump(); - - // Convenience form of WriteMinidump which does not require an - // ExceptionHandler instance. - static bool WriteMinidump(const std::string &dump_path, - MinidumpCallback callback, - void *callback_context); - - // This structure is passed to minidump_writer.h:WriteMinidump via an opaque - // blob. It shouldn't be needed in any user code. - struct CrashContext { - siginfo_t siginfo; - pid_t tid; // the crashing thread. - struct ucontext context; - struct _libc_fpstate float_state; - }; - - // Returns whether out-of-process dump generation is used or not. - bool IsOutOfProcess() const { - return crash_generation_client_.get() != NULL; - } - - private: - void Init(const std::string &dump_path, - const int server_fd); - bool InstallHandlers(); - void UninstallHandlers(); - void PreresolveSymbols(); - bool GenerateDump(CrashContext *context); - - void UpdateNextID(); - static void SignalHandler(int sig, siginfo_t* info, void* uc); - bool HandleSignal(int sig, siginfo_t* info, void* uc); - static int ThreadEntry(void* arg); - bool DoDump(pid_t crashing_process, const void* context, - size_t context_size); - - const FilterCallback filter_; - const MinidumpCallback callback_; - void* const callback_context_; - - scoped_ptr crash_generation_client_; - - std::string dump_path_; - std::string next_minidump_path_; - std::string next_minidump_id_; - - // Pointers to C-string representations of the above. These are set - // when the above are set so we can avoid calling c_str during - // an exception. - const char* dump_path_c_; - const char* next_minidump_path_c_; - const char* next_minidump_id_c_; - - const bool handler_installed_; - void* signal_stack; // the handler stack. - HandlerCallback crash_handler_; - - // The global exception handler stack. This is need becuase there may exist - // multiple ExceptionHandler instances in a process. Each will have itself - // registered in this stack. - static std::vector *handler_stack_; - // The index of the handler that should handle the next exception. - static unsigned handler_stack_index_; - static pthread_mutex_t handler_stack_mutex_; - - // A vector of the old signal handlers. - std::vector > old_handlers_; -}; - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_HANDLER_EXCEPTION_HANDLER_H_ diff --git a/share/google-breakpad/src/client/linux/minidump_writer/directory_reader.h b/share/google-breakpad/src/client/linux/minidump_writer/directory_reader.h deleted file mode 100644 index 4698b7e5b917abd0fe831ad8340599e6a0c94c16..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/minidump_writer/directory_reader.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) 2009, 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. - -#ifndef CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_ -#define CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_ - -#include -#include -#include -#include -#include -#include - -#include "common/linux/linux_syscall_support.h" - -namespace google_breakpad { - -// A class for enumerating a directory without using diropen/readdir or other -// functions which may allocate memory. -class DirectoryReader { - public: - DirectoryReader(int fd) - : fd_(fd), - buf_used_(0) { - } - - // Return the next entry from the directory - // name: (output) the NUL terminated entry name - // - // Returns true iff successful (false on EOF). - // - // After calling this, one must call |PopEntry| otherwise you'll get the same - // entry over and over. - bool GetNextEntry(const char** name) { - struct kernel_dirent* const dent = - reinterpret_cast(buf_); - - if (buf_used_ == 0) { - // need to read more entries. - const int n = sys_getdents(fd_, dent, sizeof(buf_)); - if (n < 0) { - return false; - } else if (n == 0) { - hit_eof_ = true; - } else { - buf_used_ += n; - } - } - - if (buf_used_ == 0 && hit_eof_) - return false; - - assert(buf_used_ > 0); - - *name = dent->d_name; - return true; - } - - void PopEntry() { - if (!buf_used_) - return; - - const struct kernel_dirent* const dent = - reinterpret_cast(buf_); - - buf_used_ -= dent->d_reclen; - memmove(buf_, buf_ + dent->d_reclen, buf_used_); - } - - private: - const int fd_; - bool hit_eof_; - unsigned buf_used_; - uint8_t buf_[sizeof(struct kernel_dirent) + NAME_MAX + 1]; -}; - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_MINIDUMP_WRITER_DIRECTORY_READER_H_ diff --git a/share/google-breakpad/src/client/linux/minidump_writer/line_reader.h b/share/google-breakpad/src/client/linux/minidump_writer/line_reader.h deleted file mode 100644 index 5c0a1154b374f02c79a76fe3cf194f55adce4748..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/minidump_writer/line_reader.h +++ /dev/null @@ -1,130 +0,0 @@ -// Copyright (c) 2009, 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. - -#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_ -#define CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_ - -#include -#include -#include - -#include "common/linux/linux_syscall_support.h" - -namespace google_breakpad { - -// A class for reading a file, line by line, without using fopen/fgets or other -// functions which may allocate memory. -class LineReader { - public: - LineReader(int fd) - : fd_(fd), - hit_eof_(false), - buf_used_(0) { - } - - // The maximum length of a line. - static const size_t kMaxLineLen = 512; - - // Return the next line from the file. - // line: (output) a pointer to the start of the line. The line is NUL - // terminated. - // len: (output) the length of the line (not inc the NUL byte) - // - // Returns true iff successful (false on EOF). - // - // One must call |PopLine| after this function, otherwise you'll continue to - // get the same line over and over. - bool GetNextLine(const char **line, unsigned *len) { - for (;;) { - if (buf_used_ == 0 && hit_eof_) - return false; - - for (unsigned i = 0; i < buf_used_; ++i) { - if (buf_[i] == '\n' || buf_[i] == 0) { - buf_[i] = 0; - *len = i; - *line = buf_; - return true; - } - } - - if (buf_used_ == sizeof(buf_)) { - // we scanned the whole buffer and didn't find an end-of-line marker. - // This line is too long to process. - return false; - } - - // We didn't find any end-of-line terminators in the buffer. However, if - // this is the last line in the file it might not have one: - if (hit_eof_) { - assert(buf_used_); - // There's room for the NUL because of the buf_used_ == sizeof(buf_) - // check above. - buf_[buf_used_] = 0; - *len = buf_used_; - buf_used_ += 1; // since we appended the NUL. - *line = buf_; - return true; - } - - // Otherwise, we should pull in more data from the file - const ssize_t n = sys_read(fd_, buf_ + buf_used_, - sizeof(buf_) - buf_used_); - if (n < 0) { - return false; - } else if (n == 0) { - hit_eof_ = true; - } else { - buf_used_ += n; - } - - // At this point, we have either set the hit_eof_ flag, or we have more - // data to process... - } - } - - void PopLine(unsigned len) { - // len doesn't include the NUL byte at the end. - - assert(buf_used_ >= len + 1); - buf_used_ -= len + 1; - memmove(buf_, buf_ + len + 1, buf_used_); - } - - private: - const int fd_; - - bool hit_eof_; - unsigned buf_used_; - char buf_[kMaxLineLen]; -}; - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_MINIDUMP_WRITER_LINE_READER_H_ diff --git a/share/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc b/share/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc deleted file mode 100644 index 41929b8ae8598c7967a60a02a393444a62eb3594..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/minidump_writer/linux_dumper.cc +++ /dev/null @@ -1,453 +0,0 @@ -// Copyright (c) 2009, 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. - -// This code deals with the mechanics of getting information about a crashed -// process. Since this code may run in a compromised address space, the same -// rules apply as detailed at the top of minidump_writer.h: no libc calls and -// use the alternative allocator. - -#include "client/linux/minidump_writer/linux_dumper.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -#include -#include -#include - -#include - -#include "client/linux/minidump_writer/directory_reader.h" -#include "client/linux/minidump_writer/line_reader.h" -#include "common/linux/file_id.h" -#include "common/linux/linux_libc_support.h" -#include "common/linux/linux_syscall_support.h" - -// Suspend a thread by attaching to it. -static bool SuspendThread(pid_t pid) { - // This may fail if the thread has just died or debugged. - errno = 0; - if (sys_ptrace(PTRACE_ATTACH, pid, NULL, NULL) != 0 && - errno != 0) { - return false; - } - while (sys_waitpid(pid, NULL, __WALL) < 0) { - if (errno != EINTR) { - sys_ptrace(PTRACE_DETACH, pid, NULL, NULL); - return false; - } - } - return true; -} - -// Resume a thread by detaching from it. -static bool ResumeThread(pid_t pid) { - return sys_ptrace(PTRACE_DETACH, pid, NULL, NULL) >= 0; -} - -namespace google_breakpad { - -LinuxDumper::LinuxDumper(int pid) - : pid_(pid), - threads_suspened_(false), - threads_(&allocator_, 8), - mappings_(&allocator_) { -} - -bool LinuxDumper::Init() { - return EnumerateThreads(&threads_) && - EnumerateMappings(&mappings_); -} - -bool LinuxDumper::ThreadsSuspend() { - if (threads_suspened_) - return true; - bool good = true; - for (size_t i = 0; i < threads_.size(); ++i) - good &= SuspendThread(threads_[i]); - threads_suspened_ = true; - return good; -} - -bool LinuxDumper::ThreadsResume() { - if (!threads_suspened_) - return false; - bool good = true; - for (size_t i = 0; i < threads_.size(); ++i) - good &= ResumeThread(threads_[i]); - threads_suspened_ = false; - return good; -} - -void -LinuxDumper::BuildProcPath(char* path, pid_t pid, const char* node) const { - assert(path); - if (!path) { - return; - } - - path[0] = '\0'; - - const unsigned pid_len = my_int_len(pid); - - assert(node); - if (!node) { - return; - } - - size_t node_len = my_strlen(node); - assert(node_len < NAME_MAX); - if (node_len >= NAME_MAX) { - return; - } - - assert(node_len > 0); - if (node_len == 0) { - return; - } - - assert(pid > 0); - if (pid <= 0) { - return; - } - - const size_t total_length = 6 + pid_len + 1 + node_len; - - assert(total_length < NAME_MAX); - if (total_length >= NAME_MAX) { - return; - } - - memcpy(path, "/proc/", 6); - my_itos(path + 6, pid, pid_len); - memcpy(path + 6 + pid_len, "/", 1); - memcpy(path + 6 + pid_len + 1, node, node_len); - memcpy(path + total_length, "\0", 1); -} - -bool -LinuxDumper::ElfFileIdentifierForMapping(unsigned int mapping_id, - uint8_t identifier[sizeof(MDGUID)]) -{ - assert(mapping_id < mappings_.size()); - const MappingInfo* mapping = mappings_[mapping_id]; - int fd = sys_open(mapping->name, O_RDONLY, 0); - if (fd < 0) - return false; - struct kernel_stat st; - if (sys_fstat(fd, &st) != 0) { - sys_close(fd); - return false; - } -#if defined(__x86_64) -#define sys_mmap2 sys_mmap -#endif - void* base = sys_mmap2(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - sys_close(fd); - if (base == MAP_FAILED) - return false; - - bool success = FileID::ElfFileIdentifierFromMappedFile(base, identifier); - sys_munmap(base, st.st_size); - return success; -} - -void* -LinuxDumper::FindBeginningOfLinuxGateSharedLibrary(const pid_t pid) const { - char auxv_path[80]; - BuildProcPath(auxv_path, pid, "auxv"); - - // If BuildProcPath errors out due to invalid input, we'll handle it when - // we try to sys_open the file. - - // Find the AT_SYSINFO_EHDR entry for linux-gate.so - // See http://www.trilithium.com/johan/2005/08/linux-gate/ for more - // information. - int fd = sys_open(auxv_path, O_RDONLY, 0); - if (fd < 0) { - return NULL; - } - - elf_aux_entry one_aux_entry; - while (sys_read(fd, - &one_aux_entry, - sizeof(elf_aux_entry)) == sizeof(elf_aux_entry) && - one_aux_entry.a_type != AT_NULL) { - if (one_aux_entry.a_type == AT_SYSINFO_EHDR) { - close(fd); - return reinterpret_cast(one_aux_entry.a_un.a_val); - } - } - close(fd); - return NULL; -} - -bool -LinuxDumper::EnumerateMappings(wasteful_vector* result) const { - char maps_path[80]; - BuildProcPath(maps_path, pid_, "maps"); - - // linux_gate_loc is the beginning of the kernel's mapping of - // linux-gate.so in the process. It doesn't actually show up in the - // maps list as a filename, so we use the aux vector to find it's - // load location and special case it's entry when creating the list - // of mappings. - const void* linux_gate_loc; - linux_gate_loc = FindBeginningOfLinuxGateSharedLibrary(pid_); - - const int fd = sys_open(maps_path, O_RDONLY, 0); - if (fd < 0) - return false; - LineReader* const line_reader = new(allocator_) LineReader(fd); - - const char* line; - unsigned line_len; - while (line_reader->GetNextLine(&line, &line_len)) { - uintptr_t start_addr, end_addr, offset; - - const char* i1 = my_read_hex_ptr(&start_addr, line); - if (*i1 == '-') { - const char* i2 = my_read_hex_ptr(&end_addr, i1 + 1); - if (*i2 == ' ') { - const char* i3 = my_read_hex_ptr(&offset, i2 + 6 /* skip ' rwxp ' */); - if (*i3 == ' ') { - MappingInfo* const module = new(allocator_) MappingInfo; - memset(module, 0, sizeof(MappingInfo)); - module->start_addr = start_addr; - module->size = end_addr - start_addr; - module->offset = offset; - const char* name = NULL; - // Only copy name if the name is a valid path name, or if - // we've found the VDSO image - if ((name = my_strchr(line, '/')) != NULL) { - const unsigned l = my_strlen(name); - if (l < sizeof(module->name)) - memcpy(module->name, name, l); - } else if (linux_gate_loc && - reinterpret_cast(module->start_addr) == - linux_gate_loc) { - memcpy(module->name, - kLinuxGateLibraryName, - my_strlen(kLinuxGateLibraryName)); - module->offset = 0; - } - result->push_back(module); - } - } - } - line_reader->PopLine(line_len); - } - - sys_close(fd); - - return result->size() > 0; -} - -// Parse /proc/$pid/task to list all the threads of the process identified by -// pid. -bool LinuxDumper::EnumerateThreads(wasteful_vector* result) const { - char task_path[80]; - BuildProcPath(task_path, pid_, "task"); - - const int fd = sys_open(task_path, O_RDONLY | O_DIRECTORY, 0); - if (fd < 0) - return false; - DirectoryReader* dir_reader = new(allocator_) DirectoryReader(fd); - - // The directory may contain duplicate entries which we filter by assuming - // that they are consecutive. - int last_tid = -1; - const char* dent_name; - while (dir_reader->GetNextEntry(&dent_name)) { - if (my_strcmp(dent_name, ".") && - my_strcmp(dent_name, "..")) { - int tid = 0; - if (my_strtoui(&tid, dent_name) && - last_tid != tid) { - last_tid = tid; - result->push_back(tid); - } - } - dir_reader->PopEntry(); - } - - sys_close(fd); - return true; -} - -// Read thread info from /proc/$pid/status. -// Fill out the |tgid|, |ppid| and |pid| members of |info|. If unavailible, -// these members are set to -1. Returns true iff all three members are -// availible. -bool LinuxDumper::ThreadInfoGet(pid_t tid, ThreadInfo* info) { - assert(info != NULL); - char status_path[80]; - BuildProcPath(status_path, tid, "status"); - - const int fd = open(status_path, O_RDONLY); - if (fd < 0) - return false; - - LineReader* const line_reader = new(allocator_) LineReader(fd); - const char* line; - unsigned line_len; - - info->ppid = info->tgid = -1; - - while (line_reader->GetNextLine(&line, &line_len)) { - if (my_strncmp("Tgid:\t", line, 6) == 0) { - my_strtoui(&info->tgid, line + 6); - } else if (my_strncmp("PPid:\t", line, 6) == 0) { - my_strtoui(&info->ppid, line + 6); - } - - line_reader->PopLine(line_len); - } - - if (info->ppid == -1 || info->tgid == -1) - return false; - - if (sys_ptrace(PTRACE_GETREGS, tid, NULL, &info->regs) == -1 || - sys_ptrace(PTRACE_GETFPREGS, tid, NULL, &info->fpregs) == -1) { - return false; - } - -#if defined(__i386) - if (sys_ptrace(PTRACE_GETFPXREGS, tid, NULL, &info->fpxregs) == -1) - return false; -#endif - -#if defined(__i386) || defined(__x86_64) - for (unsigned i = 0; i < ThreadInfo::kNumDebugRegisters; ++i) { - if (sys_ptrace( - PTRACE_PEEKUSER, tid, - reinterpret_cast (offsetof(struct user, - u_debugreg[0]) + i * - sizeof(debugreg_t)), - &info->dregs[i]) == -1) { - return false; - } - } -#endif - - const uint8_t* stack_pointer; -#if defined(__i386) - memcpy(&stack_pointer, &info->regs.esp, sizeof(info->regs.esp)); -#elif defined(__x86_64) - memcpy(&stack_pointer, &info->regs.rsp, sizeof(info->regs.rsp)); -#else -#error "This code hasn't been ported to your platform yet." -#endif - - if (!GetStackInfo(&info->stack, &info->stack_len, - (uintptr_t) stack_pointer)) - return false; - - return true; -} - -// Get information about the stack, given the stack pointer. We don't try to -// walk the stack since we might not have all the information needed to do -// unwind. So we just grab, up to, 32k of stack. -bool LinuxDumper::GetStackInfo(const void** stack, size_t* stack_len, - uintptr_t int_stack_pointer) { -#if defined(__i386) || defined(__x86_64) - static const bool stack_grows_down = true; - static const uintptr_t page_size = 4096; -#else -#error "This code has not been ported to your platform yet." -#endif - // Move the stack pointer to the bottom of the page that it's in. - uint8_t* const stack_pointer = - reinterpret_cast(int_stack_pointer & ~(page_size - 1)); - - // The number of bytes of stack which we try to capture. - static ptrdiff_t kStackToCapture = 32 * 1024; - - const MappingInfo* mapping = FindMapping(stack_pointer); - if (!mapping) - return false; - if (stack_grows_down) { - const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr; - const ptrdiff_t distance_to_end = - static_cast(mapping->size) - offset; - *stack_len = distance_to_end > kStackToCapture ? - kStackToCapture : distance_to_end; - *stack = stack_pointer; - } else { - const ptrdiff_t offset = stack_pointer - (uint8_t*) mapping->start_addr; - *stack_len = offset > kStackToCapture ? kStackToCapture : offset; - *stack = stack_pointer - *stack_len; - } - - return true; -} - -// static -void LinuxDumper::CopyFromProcess(void* dest, pid_t child, const void* src, - size_t length) { - unsigned long tmp; - size_t done = 0; - static const size_t word_size = sizeof(tmp); - uint8_t* const local = (uint8_t*) dest; - uint8_t* const remote = (uint8_t*) src; - - while (done < length) { - const size_t l = length - done > word_size ? word_size : length - done; - if (sys_ptrace(PTRACE_PEEKDATA, child, remote + done, &tmp) == -1) - tmp = 0; - memcpy(local + done, &tmp, l); - done += l; - } -} - -// Find the mapping which the given memory address falls in. -const MappingInfo* LinuxDumper::FindMapping(const void* address) const { - const uintptr_t addr = (uintptr_t) address; - - for (size_t i = 0; i < mappings_.size(); ++i) { - const uintptr_t start = static_cast(mappings_[i]->start_addr); - if (addr >= start && addr - start < mappings_[i]->size) - return mappings_[i]; - } - - return NULL; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/linux/minidump_writer/linux_dumper.h b/share/google-breakpad/src/client/linux/minidump_writer/linux_dumper.h deleted file mode 100644 index 3e8869b5293afd5e41305a333ddf54434b91fac7..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/minidump_writer/linux_dumper.h +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright (c) 2009, 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. - -#ifndef CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ -#define CLIENT_LINUX_MINIDUMP_WRITER_LINUX_DUMPER_H_ - -#include -#include -#include -#include -#include - -#include "common/linux/memory.h" -#include "google_breakpad/common/minidump_format.h" - -namespace google_breakpad { - -typedef typeof(((struct user*) 0)->u_debugreg[0]) debugreg_t; - -// Typedef for our parsing of the auxv variables in /proc/pid/auxv. -#if defined(__i386) -typedef Elf32_auxv_t elf_aux_entry; -#elif defined(__x86_64__) -typedef Elf64_auxv_t elf_aux_entry; -#endif -// When we find the VDSO mapping in the process's address space, this -// is the name we use for it when writing it to the minidump. -// This should always be less than NAME_MAX! -const char kLinuxGateLibraryName[] = "linux-gate.so"; - -// We produce one of these structures for each thread in the crashed process. -struct ThreadInfo { - pid_t tgid; // thread group id - pid_t ppid; // parent process - - // Even on platforms where the stack grows down, the following will point to - // the smallest address in the stack. - const void* stack; // pointer to the stack area - size_t stack_len; // length of the stack to copy - - user_regs_struct regs; - user_fpregs_struct fpregs; -#if defined(__i386) - user_fpxregs_struct fpxregs; -#endif - -#if defined(__i386) || defined(__x86_64) - - static const unsigned kNumDebugRegisters = 8; - debugreg_t dregs[8]; -#endif -}; - -// One of these is produced for each mapping in the process (i.e. line in -// /proc/$x/maps). -struct MappingInfo { - uintptr_t start_addr; - size_t size; - size_t offset; // offset into the backed file. - char name[NAME_MAX]; -}; - -class LinuxDumper { - public: - explicit LinuxDumper(pid_t pid); - - // Parse the data for |threads| and |mappings|. - bool Init(); - - // Suspend/resume all threads in the given process. - bool ThreadsSuspend(); - bool ThreadsResume(); - - // Read information about the given thread. Returns true on success. One must - // have called |ThreadsSuspend| first. - bool ThreadInfoGet(pid_t tid, ThreadInfo* info); - - // These are only valid after a call to |Init|. - const wasteful_vector &threads() { return threads_; } - const wasteful_vector &mappings() { return mappings_; } - const MappingInfo* FindMapping(const void* address) const; - - // Find a block of memory to take as the stack given the top of stack pointer. - // stack: (output) the lowest address in the memory area - // stack_len: (output) the length of the memory area - // stack_top: the current top of the stack - bool GetStackInfo(const void** stack, size_t* stack_len, uintptr_t stack_top); - - PageAllocator* allocator() { return &allocator_; } - - // memcpy from a remote process. - static void CopyFromProcess(void* dest, pid_t child, const void* src, - size_t length); - - // Builds a proc path for a certain pid for a node. path is a - // character array that is overwritten, and node is the final node - // without any slashes. - void BuildProcPath(char* path, pid_t pid, const char* node) const; - - // Generate a File ID from the .text section of a mapped entry - bool ElfFileIdentifierForMapping(unsigned int mapping_id, - uint8_t identifier[sizeof(MDGUID)]); - - // Utility method to find the location of where the kernel has - // mapped linux-gate.so in memory(shows up in /proc/pid/maps as - // [vdso], but we can't guarantee that it's the only virtual dynamic - // shared object. Parsing the auxilary vector for AT_SYSINFO_EHDR - // is the safest way to go.) - void* FindBeginningOfLinuxGateSharedLibrary(const pid_t pid) const; - private: - bool EnumerateMappings(wasteful_vector* result) const; - bool EnumerateThreads(wasteful_vector* result) const; - - const pid_t pid_; - - mutable PageAllocator allocator_; - - bool threads_suspened_; - wasteful_vector threads_; // the ids of all the threads - wasteful_vector mappings_; // info from /proc//maps -}; - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_HANDLER_LINUX_DUMPER_H_ diff --git a/share/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc b/share/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc deleted file mode 100644 index 166b8e5c90c2cddfdf4a74abd3a41a56bece3a10..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/minidump_writer/minidump_writer.cc +++ /dev/null @@ -1,857 +0,0 @@ -// Copyright (c) 2009, 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. - -// This code writes out minidump files: -// http://msdn.microsoft.com/en-us/library/ms680378(VS.85,loband).aspx -// -// Minidumps are a Microsoft format which Breakpad uses for recording crash -// dumps. This code has to run in a compromised environment (the address space -// may have received SIGSEGV), thus the following rules apply: -// * You may not enter the dynamic linker. This means that we cannot call -// any symbols in a shared library (inc libc). Because of this we replace -// libc functions in linux_libc_support.h. -// * You may not call syscalls via the libc wrappers. This rule is a subset -// of the first rule but it bears repeating. We have direct wrappers -// around the system calls in linux_syscall_support.h. -// * You may not malloc. There's an alternative allocator in memory.h and -// a canonical instance in the LinuxDumper object. We use the placement -// new form to allocate objects and we don't delete them. - -#include "client/linux/minidump_writer/minidump_writer.h" -#include "client/minidump_file_writer-inl.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "client/minidump_file_writer.h" -#include "google_breakpad/common/minidump_format.h" -#include "google_breakpad/common/minidump_cpu_amd64.h" -#include "google_breakpad/common/minidump_cpu_x86.h" - -#include "client/linux/handler/exception_handler.h" -#include "client/linux/minidump_writer/line_reader.h" -#include "client/linux/minidump_writer//linux_dumper.h" -#include "common/linux/linux_libc_support.h" -#include "common/linux/linux_syscall_support.h" - -// These are additional minidump stream values which are specific to the linux -// breakpad implementation. -enum { - MD_LINUX_CPU_INFO = 0x47670003, /* /proc/cpuinfo */ - MD_LINUX_PROC_STATUS = 0x47670004, /* /proc/$x/status */ - MD_LINUX_LSB_RELEASE = 0x47670005, /* /etc/lsb-release */ - MD_LINUX_CMD_LINE = 0x47670006, /* /proc/$x/cmdline */ - MD_LINUX_ENVIRON = 0x47670007, /* /proc/$x/environ */ - MD_LINUX_AUXV = 0x47670008 /* /proc/$x/auxv */ -}; - -// Minidump defines register structures which are different from the raw -// structures which we get from the kernel. These are platform specific -// functions to juggle the ucontext and user structures into minidump format. -#if defined(__i386) -typedef MDRawContextX86 RawContextCPU; - -// Write a uint16_t to memory -// out: memory location to write to -// v: value to write. -static void U16(void* out, uint16_t v) { - memcpy(out, &v, sizeof(v)); -} - -// Write a uint32_t to memory -// out: memory location to write to -// v: value to write. -static void U32(void* out, uint32_t v) { - memcpy(out, &v, sizeof(v)); -} - -// Juggle an x86 user_(fp|fpx|)regs_struct into minidump format -// out: the minidump structure -// info: the collection of register structures. -static void CPUFillFromThreadInfo(MDRawContextX86 *out, - const google_breakpad::ThreadInfo &info) { - out->context_flags = MD_CONTEXT_X86_ALL; - - out->dr0 = info.dregs[0]; - out->dr1 = info.dregs[1]; - out->dr2 = info.dregs[2]; - out->dr3 = info.dregs[3]; - // 4 and 5 deliberatly omitted because they aren't included in the minidump - // format. - out->dr6 = info.dregs[6]; - out->dr7 = info.dregs[7]; - - out->gs = info.regs.xgs; - out->fs = info.regs.xfs; - out->es = info.regs.xes; - out->ds = info.regs.xds; - - out->edi = info.regs.edi; - out->esi = info.regs.esi; - out->ebx = info.regs.ebx; - out->edx = info.regs.edx; - out->ecx = info.regs.ecx; - out->eax = info.regs.eax; - - out->ebp = info.regs.ebp; - out->eip = info.regs.eip; - out->cs = info.regs.xcs; - out->eflags = info.regs.eflags; - out->esp = info.regs.esp; - out->ss = info.regs.xss; - - out->float_save.control_word = info.fpregs.cwd; - out->float_save.status_word = info.fpregs.swd; - out->float_save.tag_word = info.fpregs.twd; - out->float_save.error_offset = info.fpregs.fip; - out->float_save.error_selector = info.fpregs.fcs; - out->float_save.data_offset = info.fpregs.foo; - out->float_save.data_selector = info.fpregs.fos; - - // 8 registers * 10 bytes per register. - memcpy(out->float_save.register_area, info.fpregs.st_space, 10 * 8); - - // This matches the Intel fpsave format. - U16(out->extended_registers + 0, info.fpregs.cwd); - U16(out->extended_registers + 2, info.fpregs.swd); - U16(out->extended_registers + 4, info.fpregs.twd); - U16(out->extended_registers + 6, info.fpxregs.fop); - U32(out->extended_registers + 8, info.fpxregs.fip); - U16(out->extended_registers + 12, info.fpxregs.fcs); - U32(out->extended_registers + 16, info.fpregs.foo); - U16(out->extended_registers + 20, info.fpregs.fos); - U32(out->extended_registers + 24, info.fpxregs.mxcsr); - - memcpy(out->extended_registers + 32, &info.fpxregs.st_space, 128); - memcpy(out->extended_registers + 160, &info.fpxregs.xmm_space, 128); -} - -// Juggle an x86 ucontext into minidump format -// out: the minidump structure -// info: the collection of register structures. -static void CPUFillFromUContext(MDRawContextX86 *out, const ucontext *uc, - const struct _libc_fpstate* fp) { - const greg_t* regs = uc->uc_mcontext.gregs; - - out->context_flags = MD_CONTEXT_X86_FULL | - MD_CONTEXT_X86_FLOATING_POINT; - - out->gs = regs[REG_GS]; - out->fs = regs[REG_FS]; - out->es = regs[REG_ES]; - out->ds = regs[REG_DS]; - - out->edi = regs[REG_EDI]; - out->esi = regs[REG_ESI]; - out->ebx = regs[REG_EBX]; - out->edx = regs[REG_EDX]; - out->ecx = regs[REG_ECX]; - out->eax = regs[REG_EAX]; - - out->ebp = regs[REG_EBP]; - out->eip = regs[REG_EIP]; - out->cs = regs[REG_CS]; - out->eflags = regs[REG_EFL]; - out->esp = regs[REG_UESP]; - out->ss = regs[REG_SS]; - - out->float_save.control_word = fp->cw; - out->float_save.status_word = fp->sw; - out->float_save.tag_word = fp->tag; - out->float_save.error_offset = fp->ipoff; - out->float_save.error_selector = fp->cssel; - out->float_save.data_offset = fp->dataoff; - out->float_save.data_selector = fp->datasel; - - // 8 registers * 10 bytes per register. - memcpy(out->float_save.register_area, fp->_st, 10 * 8); -} - -#elif defined(__x86_64) -typedef MDRawContextAMD64 RawContextCPU; - -static void CPUFillFromThreadInfo(MDRawContextAMD64 *out, - const google_breakpad::ThreadInfo &info) { - out->context_flags = MD_CONTEXT_AMD64_FULL | - MD_CONTEXT_AMD64_SEGMENTS; - - out->cs = info.regs.cs; - - out->ds = info.regs.ds; - out->es = info.regs.es; - out->fs = info.regs.fs; - out->gs = info.regs.gs; - - out->ss = info.regs.ss; - out->eflags = info.regs.eflags; - - out->dr0 = info.dregs[0]; - out->dr1 = info.dregs[1]; - out->dr2 = info.dregs[2]; - out->dr3 = info.dregs[3]; - // 4 and 5 deliberatly omitted because they aren't included in the minidump - // format. - out->dr6 = info.dregs[6]; - out->dr7 = info.dregs[7]; - - out->rax = info.regs.rax; - out->rcx = info.regs.rcx; - out->rdx = info.regs.rdx; - out->rbx = info.regs.rbx; - - out->rsp = info.regs.rsp; - - out->rbp = info.regs.rbp; - out->rsi = info.regs.rsi; - out->rdi = info.regs.rdi; - out->r8 = info.regs.r8; - out->r9 = info.regs.r9; - out->r10 = info.regs.r10; - out->r11 = info.regs.r11; - out->r12 = info.regs.r12; - out->r13 = info.regs.r13; - out->r14 = info.regs.r14; - out->r15 = info.regs.r15; - - out->rip = info.regs.rip; - - out->flt_save.control_word = info.fpregs.cwd; - out->flt_save.status_word = info.fpregs.swd; - out->flt_save.tag_word = info.fpregs.ftw; - out->flt_save.error_opcode = info.fpregs.fop; - out->flt_save.error_offset = info.fpregs.rip; - out->flt_save.error_selector = 0; // We don't have this. - out->flt_save.data_offset = info.fpregs.rdp; - out->flt_save.data_selector = 0; // We don't have this. - out->flt_save.mx_csr = info.fpregs.mxcsr; - out->flt_save.mx_csr_mask = info.fpregs.mxcr_mask; - memcpy(&out->flt_save.float_registers, &info.fpregs.st_space, 8 * 16); - memcpy(&out->flt_save.xmm_registers, &info.fpregs.xmm_space, 16 * 16); -} - -static void CPUFillFromUContext(MDRawContextAMD64 *out, const ucontext *uc, - const struct _libc_fpstate* fpregs) { - const greg_t* regs = uc->uc_mcontext.gregs; - - out->context_flags = MD_CONTEXT_AMD64_FULL; - - out->cs = regs[REG_CSGSFS] & 0xffff; - - out->fs = (regs[REG_CSGSFS] >> 32) & 0xffff; - out->gs = (regs[REG_CSGSFS] >> 16) & 0xffff; - - out->eflags = regs[REG_EFL]; - - out->rax = regs[REG_RAX]; - out->rcx = regs[REG_RCX]; - out->rdx = regs[REG_RDX]; - out->rbx = regs[REG_RBX]; - - out->rsp = regs[REG_RSP]; - out->rbp = regs[REG_RBP]; - out->rsi = regs[REG_RSI]; - out->rdi = regs[REG_RDI]; - out->r8 = regs[REG_R8]; - out->r9 = regs[REG_R9]; - out->r10 = regs[REG_R10]; - out->r11 = regs[REG_R11]; - out->r12 = regs[REG_R12]; - out->r13 = regs[REG_R13]; - out->r14 = regs[REG_R14]; - out->r15 = regs[REG_R15]; - - out->rip = regs[REG_RIP]; - - out->flt_save.control_word = fpregs->cwd; - out->flt_save.status_word = fpregs->swd; - out->flt_save.tag_word = fpregs->ftw; - out->flt_save.error_opcode = fpregs->fop; - out->flt_save.error_offset = fpregs->rip; - out->flt_save.data_offset = fpregs->rdp; - out->flt_save.error_selector = 0; // We don't have this. - out->flt_save.data_selector = 0; // We don't have this. - out->flt_save.mx_csr = fpregs->mxcsr; - out->flt_save.mx_csr_mask = fpregs->mxcr_mask; - memcpy(&out->flt_save.float_registers, &fpregs->_st, 8 * 16); - memcpy(&out->flt_save.xmm_registers, &fpregs->_xmm, 16 * 16); -} - -#else -#error "This code has not been ported to your platform yet." -#endif - -namespace google_breakpad { - -class MinidumpWriter { - public: - MinidumpWriter(const char* filename, - pid_t crashing_pid, - const ExceptionHandler::CrashContext* context) - : filename_(filename), - siginfo_(&context->siginfo), - ucontext_(&context->context), - float_state_(&context->float_state), - crashing_tid_(context->tid), - dumper_(crashing_pid) { - } - - bool Init() { - return dumper_.Init() && minidump_writer_.Open(filename_) && - dumper_.ThreadsSuspend(); - } - - ~MinidumpWriter() { - minidump_writer_.Close(); - dumper_.ThreadsResume(); - } - - bool Dump() { - // A minidump file contains a number of tagged streams. This is the number - // of stream which we write. - static const unsigned kNumWriters = 11; - - TypedMDRVA header(&minidump_writer_); - TypedMDRVA dir(&minidump_writer_); - if (!header.Allocate()) - return false; - if (!dir.AllocateArray(kNumWriters)) - return false; - memset(header.get(), 0, sizeof(MDRawHeader)); - - header.get()->signature = MD_HEADER_SIGNATURE; - header.get()->version = MD_HEADER_VERSION; - header.get()->time_date_stamp = time(NULL); - header.get()->stream_count = kNumWriters; - header.get()->stream_directory_rva = dir.position(); - - unsigned dir_index = 0; - MDRawDirectory dirent; - - if (!WriteThreadListStream(&dirent)) - return false; - dir.CopyIndex(dir_index++, &dirent); - - if (!WriteMappings(&dirent)) - return false; - dir.CopyIndex(dir_index++, &dirent); - - if (!WriteExceptionStream(&dirent)) - return false; - dir.CopyIndex(dir_index++, &dirent); - - if (!WriteSystemInfoStream(&dirent)) - return false; - dir.CopyIndex(dir_index++, &dirent); - - dirent.stream_type = MD_LINUX_CPU_INFO; - if (!WriteFile(&dirent.location, "/proc/cpuinfo")) - NullifyDirectoryEntry(&dirent); - dir.CopyIndex(dir_index++, &dirent); - - dirent.stream_type = MD_LINUX_PROC_STATUS; - if (!WriteProcFile(&dirent.location, crashing_tid_, "status")) - NullifyDirectoryEntry(&dirent); - dir.CopyIndex(dir_index++, &dirent); - - dirent.stream_type = MD_LINUX_LSB_RELEASE; - if (!WriteFile(&dirent.location, "/etc/lsb-release")) - NullifyDirectoryEntry(&dirent); - dir.CopyIndex(dir_index++, &dirent); - - dirent.stream_type = MD_LINUX_CMD_LINE; - if (!WriteProcFile(&dirent.location, crashing_tid_, "cmdline")) - NullifyDirectoryEntry(&dirent); - dir.CopyIndex(dir_index++, &dirent); - - dirent.stream_type = MD_LINUX_ENVIRON; - if (!WriteProcFile(&dirent.location, crashing_tid_, "environ")) - NullifyDirectoryEntry(&dirent); - dir.CopyIndex(dir_index++, &dirent); - - dirent.stream_type = MD_LINUX_AUXV; - if (!WriteProcFile(&dirent.location, crashing_tid_, "auxv")) - NullifyDirectoryEntry(&dirent); - dir.CopyIndex(dir_index++, &dirent); - - dirent.stream_type = MD_LINUX_AUXV; - if (!WriteProcFile(&dirent.location, crashing_tid_, "maps")) - NullifyDirectoryEntry(&dirent); - dir.CopyIndex(dir_index++, &dirent); - - // If you add more directory entries, don't forget to update kNumWriters, - // above. - - dumper_.ThreadsResume(); - return true; - } - - // Write information about the threads. - bool WriteThreadListStream(MDRawDirectory* dirent) { - const unsigned num_threads = dumper_.threads().size(); - - TypedMDRVA list(&minidump_writer_); - if (!list.AllocateObjectAndArray(num_threads, sizeof(MDRawThread))) - return false; - - dirent->stream_type = MD_THREAD_LIST_STREAM; - dirent->location = list.location(); - - *list.get() = num_threads; - - for (unsigned i = 0; i < num_threads; ++i) { - MDRawThread thread; - my_memset(&thread, 0, sizeof(thread)); - thread.thread_id = dumper_.threads()[i]; - // We have a different source of information for the crashing thread. If - // we used the actual state of the thread we would find it running in the - // signal handler with the alternative stack, which would be deeply - // unhelpful. - if ((pid_t)thread.thread_id == crashing_tid_) { - const void* stack; - size_t stack_len; - if (!dumper_.GetStackInfo(&stack, &stack_len, GetStackPointer())) - return false; - UntypedMDRVA memory(&minidump_writer_); - if (!memory.Allocate(stack_len)) - return false; - uint8_t* stack_copy = (uint8_t*) dumper_.allocator()->Alloc(stack_len); - dumper_.CopyFromProcess(stack_copy, thread.thread_id, stack, stack_len); - memory.Copy(stack_copy, stack_len); - thread.stack.start_of_memory_range = (uintptr_t) (stack); - thread.stack.memory = memory.location(); - TypedMDRVA cpu(&minidump_writer_); - if (!cpu.Allocate()) - return false; - my_memset(cpu.get(), 0, sizeof(RawContextCPU)); - CPUFillFromUContext(cpu.get(), ucontext_, float_state_); - thread.thread_context = cpu.location(); - crashing_thread_context_ = cpu.location(); - } else { - ThreadInfo info; - if (!dumper_.ThreadInfoGet(dumper_.threads()[i], &info)) - return false; - UntypedMDRVA memory(&minidump_writer_); - if (!memory.Allocate(info.stack_len)) - return false; - uint8_t* stack_copy = - (uint8_t*) dumper_.allocator()->Alloc(info.stack_len); - dumper_.CopyFromProcess(stack_copy, thread.thread_id, info.stack, - info.stack_len); - memory.Copy(stack_copy, info.stack_len); - thread.stack.start_of_memory_range = (uintptr_t)(info.stack); - thread.stack.memory = memory.location(); - TypedMDRVA cpu(&minidump_writer_); - if (!cpu.Allocate()) - return false; - my_memset(cpu.get(), 0, sizeof(RawContextCPU)); - CPUFillFromThreadInfo(cpu.get(), info); - thread.thread_context = cpu.location(); - } - - list.CopyIndexAfterObject(i, &thread, sizeof(thread)); - } - - return true; - } - - static bool ShouldIncludeMapping(const MappingInfo& mapping) { - if (mapping.name[0] == 0 || // we only want modules with filenames. - mapping.offset || // we only want to include one mapping per shared lib. - mapping.size < 4096) { // too small to get a signature for. - return false; - } - - return true; - } - - // Write information about the mappings in effect. Because we are using the - // minidump format, the information about the mappings is pretty limited. - // Because of this, we also include the full, unparsed, /proc/$x/maps file in - // another stream in the file. - bool WriteMappings(MDRawDirectory* dirent) { - const unsigned num_mappings = dumper_.mappings().size(); - unsigned num_output_mappings = 0; - - for (unsigned i = 0; i < dumper_.mappings().size(); ++i) { - const MappingInfo& mapping = *dumper_.mappings()[i]; - if (ShouldIncludeMapping(mapping)) - num_output_mappings++; - } - - TypedMDRVA list(&minidump_writer_); - if (!list.AllocateObjectAndArray(num_output_mappings, MD_MODULE_SIZE)) - return false; - - dirent->stream_type = MD_MODULE_LIST_STREAM; - dirent->location = list.location(); - *list.get() = num_output_mappings; - - for (unsigned i = 0, j = 0; i < num_mappings; ++i) { - const MappingInfo& mapping = *dumper_.mappings()[i]; - if (!ShouldIncludeMapping(mapping)) - continue; - - MDRawModule mod; - my_memset(&mod, 0, MD_MODULE_SIZE); - mod.base_of_image = mapping.start_addr; - mod.size_of_image = mapping.size; - const size_t filepath_len = my_strlen(mapping.name); - - // Figure out file name from path - const char* filename_ptr = mapping.name + filepath_len - 1; - while (filename_ptr >= mapping.name) { - if (*filename_ptr == '/') - break; - filename_ptr--; - } - filename_ptr++; - const size_t filename_len = mapping.name + filepath_len - filename_ptr; - - uint8_t cv_buf[MDCVInfoPDB70_minsize + NAME_MAX]; - uint8_t* cv_ptr = cv_buf; - UntypedMDRVA cv(&minidump_writer_); - if (!cv.Allocate(MDCVInfoPDB70_minsize + filename_len + 1)) - return false; - - const uint32_t cv_signature = MD_CVINFOPDB70_SIGNATURE; - memcpy(cv_ptr, &cv_signature, sizeof(cv_signature)); - cv_ptr += sizeof(cv_signature); - uint8_t* signature = cv_ptr; - cv_ptr += sizeof(MDGUID); - dumper_.ElfFileIdentifierForMapping(i, signature); - my_memset(cv_ptr, 0, sizeof(uint32_t)); // Set age to 0 on Linux. - cv_ptr += sizeof(uint32_t); - - // Write pdb_file_name - memcpy(cv_ptr, filename_ptr, filename_len + 1); - cv.Copy(cv_buf, MDCVInfoPDB70_minsize + filename_len + 1); - - mod.cv_record = cv.location(); - - MDLocationDescriptor ld; - if (!minidump_writer_.WriteString(mapping.name, filepath_len, &ld)) - return false; - mod.module_name_rva = ld.rva; - - list.CopyIndexAfterObject(j++, &mod, MD_MODULE_SIZE); - } - - return true; - } - - bool WriteExceptionStream(MDRawDirectory* dirent) { - TypedMDRVA exc(&minidump_writer_); - if (!exc.Allocate()) - return false; - my_memset(exc.get(), 0, sizeof(MDRawExceptionStream)); - - dirent->stream_type = MD_EXCEPTION_STREAM; - dirent->location = exc.location(); - - exc.get()->thread_id = crashing_tid_; - exc.get()->exception_record.exception_code = siginfo_->si_signo; - exc.get()->exception_record.exception_address = - (uintptr_t) siginfo_->si_addr; - exc.get()->thread_context = crashing_thread_context_; - - return true; - } - - bool WriteSystemInfoStream(MDRawDirectory* dirent) { - TypedMDRVA si(&minidump_writer_); - if (!si.Allocate()) - return false; - my_memset(si.get(), 0, sizeof(MDRawSystemInfo)); - - dirent->stream_type = MD_SYSTEM_INFO_STREAM; - dirent->location = si.location(); - - WriteCPUInformation(si.get()); - WriteOSInformation(si.get()); - - return true; - } - - private: -#if defined(__i386) - uintptr_t GetStackPointer() { - return ucontext_->uc_mcontext.gregs[REG_ESP]; - } -#elif defined(__x86_64) - uintptr_t GetStackPointer() { - return ucontext_->uc_mcontext.gregs[REG_RSP]; - } -#else -#error "This code has not been ported to your platform yet." -#endif - - void NullifyDirectoryEntry(MDRawDirectory* dirent) { - dirent->stream_type = 0; - dirent->location.data_size = 0; - dirent->location.rva = 0; - } - - bool WriteCPUInformation(MDRawSystemInfo* sys_info) { - char vendor_id[sizeof(sys_info->cpu.x86_cpu_info.vendor_id) + 1] = {0}; - static const char vendor_id_name[] = "vendor_id"; - static const size_t vendor_id_name_length = sizeof(vendor_id_name) - 1; - - struct CpuInfoEntry { - const char* info_name; - int value; - bool found; - } cpu_info_table[] = { - { "processor", -1, false }, - { "model", 0, false }, - { "stepping", 0, false }, - { "cpu family", 0, false }, - }; - - // processor_architecture should always be set, do this first - sys_info->processor_architecture = -#if defined(__i386) - MD_CPU_ARCHITECTURE_X86; -#elif defined(__x86_64) - MD_CPU_ARCHITECTURE_AMD64; -#else -#error "Unknown CPU arch" -#endif - - const int fd = sys_open("/proc/cpuinfo", O_RDONLY, 0); - if (fd < 0) - return false; - - { - PageAllocator allocator; - LineReader* const line_reader = new(allocator) LineReader(fd); - const char* line; - unsigned line_len; - while (line_reader->GetNextLine(&line, &line_len)) { - for (size_t i = 0; - i < sizeof(cpu_info_table) / sizeof(cpu_info_table[0]); - i++) { - CpuInfoEntry* entry = &cpu_info_table[i]; - if (entry->found) - continue; - if (!strncmp(line, entry->info_name, strlen(entry->info_name))) { - const char* value = strchr(line, ':'); - if (!value) - continue; - - // the above strncmp only matches the prefix, it might be the wrong - // line. i.e. we matched "model name" instead of "model". - // check and make sure there is only spaces between the prefix and - // the colon. - const char* space_ptr = line + strlen(entry->info_name); - for (; space_ptr < value; space_ptr++) { - if (!isspace(*space_ptr)) { - break; - } - } - if (space_ptr != value) - continue; - - sscanf(++value, " %d", &(entry->value)); - entry->found = true; - } - } - - // special case for vendor_id - if (!strncmp(line, vendor_id_name, vendor_id_name_length)) { - const char* value = strchr(line, ':'); - if (!value) - goto popline; - - // skip ':" and all the spaces that follows - do { - value++; - } while (isspace(*value)); - - if (*value) { - size_t length = strlen(value); - if (length == 0) - goto popline; - // we don't want the trailing newline - if (value[length - 1] == '\n') - length--; - // ensure we have space for the value - if (length < sizeof(vendor_id)) - strncpy(vendor_id, value, length); - } - } - -popline: - line_reader->PopLine(line_len); - } - sys_close(fd); - } - - // make sure we got everything we wanted - for (size_t i = 0; - i < sizeof(cpu_info_table) / sizeof(cpu_info_table[0]); - i++) { - if (!cpu_info_table[i].found) { - return false; - } - } - // /proc/cpuinfo contains cpu id, change it into number by adding one. - cpu_info_table[0].value++; - - sys_info->number_of_processors = cpu_info_table[0].value; - sys_info->processor_level = cpu_info_table[3].value; - sys_info->processor_revision = cpu_info_table[1].value << 8 | - cpu_info_table[2].value; - - if (vendor_id[0] != '\0') { - memcpy(sys_info->cpu.x86_cpu_info.vendor_id, vendor_id, - sizeof(sys_info->cpu.x86_cpu_info.vendor_id)); - } - return true; - } - - bool WriteFile(MDLocationDescriptor* result, const char* filename) { - const int fd = sys_open(filename, O_RDONLY, 0); - if (fd < 0) - return false; - - // We can't stat the files because several of the files that we want to - // read are kernel seqfiles, which always have a length of zero. So we have - // to read as much as we can into a buffer. - static const unsigned kMaxFileSize = 1024; - uint8_t* data = (uint8_t*) dumper_.allocator()->Alloc(kMaxFileSize); - - size_t done = 0; - while (done < kMaxFileSize) { - ssize_t r; - do { - r = sys_read(fd, data + done, kMaxFileSize - done); - } while (r == -1 && errno == EINTR); - - if (r < 1) - break; - done += r; - } - sys_close(fd); - - if (!done) - return false; - - UntypedMDRVA memory(&minidump_writer_); - if (!memory.Allocate(done)) - return false; - memory.Copy(data, done); - *result = memory.location(); - return true; - } - - bool WriteOSInformation(MDRawSystemInfo* sys_info) { - sys_info->platform_id = MD_OS_LINUX; - - struct utsname uts; - if (uname(&uts)) - return false; - - static const size_t buf_len = 512; - char buf[buf_len] = {0}; - size_t space_left = buf_len - 1; - const char* info_table[] = { - uts.sysname, - uts.release, - uts.version, - uts.machine, - NULL - }; - bool first_item = true; - for (const char** cur_info = info_table; *cur_info; cur_info++) { - static const char* separator = " "; - size_t separator_len = strlen(separator); - size_t info_len = strlen(*cur_info); - if (info_len == 0) - continue; - - if (space_left < info_len + (first_item ? 0 : separator_len)) - break; - - if (!first_item) { - strcat(buf, separator); - space_left -= separator_len; - } - - first_item = false; - strcat(buf, *cur_info); - space_left -= info_len; - } - - MDLocationDescriptor location; - if (!minidump_writer_.WriteString(buf, 0, &location)) - return false; - sys_info->csd_version_rva = location.rva; - - return true; - } - - bool WriteProcFile(MDLocationDescriptor* result, pid_t pid, - const char* filename) { - char buf[80]; - memcpy(buf, "/proc/", 6); - const unsigned pid_len = my_int_len(pid); - my_itos(buf + 6, pid, pid_len); - buf[6 + pid_len] = '/'; - memcpy(buf + 6 + pid_len + 1, filename, my_strlen(filename) + 1); - return WriteFile(result, buf); - } - - const char* const filename_; // output filename - const siginfo_t* const siginfo_; // from the signal handler (see sigaction) - const struct ucontext* const ucontext_; // also from the signal handler - const struct _libc_fpstate* const float_state_; // ditto - const pid_t crashing_tid_; // the process which actually crashed - LinuxDumper dumper_; - MinidumpFileWriter minidump_writer_; - MDLocationDescriptor crashing_thread_context_; -}; - -bool WriteMinidump(const char* filename, pid_t crashing_process, - const void* blob, size_t blob_size) { - if (blob_size != sizeof(ExceptionHandler::CrashContext)) - return false; - const ExceptionHandler::CrashContext* context = - reinterpret_cast(blob); - MinidumpWriter writer(filename, crashing_process, context); - if (!writer.Init()) - return false; - return writer.Dump(); -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/linux/minidump_writer/minidump_writer.h b/share/google-breakpad/src/client/linux/minidump_writer/minidump_writer.h deleted file mode 100644 index 579f68cdae7983a39257440171a1211602554c21..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/linux/minidump_writer/minidump_writer.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) 2009, 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. - -#ifndef CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_ -#define CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_ - -#include -#include - -namespace google_breakpad { - -// Write a minidump to the filesystem. This function does not malloc nor use -// libc functions which may. Thus, it can be used in contexts where the state -// of the heap may be corrupt. -// filename: the filename to write to. This is opened O_EXCL and fails if -// open fails. -// crashing_process: the pid of the crashing process. This must be trusted. -// blob: a blob of data from the crashing process. See exception_handler.h -// blob_size: the length of |blob|, in bytes -// -// Returns true iff successful. -bool WriteMinidump(const char* filename, pid_t crashing_process, - const void* blob, size_t blob_size); - -} // namespace google_breakpad - -#endif // CLIENT_LINUX_MINIDUMP_WRITER_MINIDUMP_WRITER_H_ diff --git a/share/google-breakpad/src/client/minidump_file_writer-inl.h b/share/google-breakpad/src/client/minidump_file_writer-inl.h deleted file mode 100644 index 7c556a27c957edf9b073ad2a225e44f0b833a7e4..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/minidump_file_writer-inl.h +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright (c) 2006, 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. - -// minidump_file_writer-inl.h: Minidump file writer implementation. -// -// See minidump_file_writer.h for documentation. - -#ifndef CLIENT_MINIDUMP_FILE_WRITER_INL_H__ -#define CLIENT_MINIDUMP_FILE_WRITER_INL_H__ - -#include - -#include "client/minidump_file_writer.h" -#include "google_breakpad/common/minidump_size.h" - -namespace google_breakpad { - -template -inline bool TypedMDRVA::Allocate() { - allocation_state_ = SINGLE_OBJECT; - return UntypedMDRVA::Allocate(minidump_size::size()); -} - -template -inline bool TypedMDRVA::Allocate(size_t additional) { - allocation_state_ = SINGLE_OBJECT; - return UntypedMDRVA::Allocate(minidump_size::size() + additional); -} - -template -inline bool TypedMDRVA::AllocateArray(size_t count) { - assert(count); - allocation_state_ = ARRAY; - return UntypedMDRVA::Allocate(minidump_size::size() * count); -} - -template -inline bool TypedMDRVA::AllocateObjectAndArray(unsigned int count, - size_t size) { - assert(count && size); - allocation_state_ = SINGLE_OBJECT_WITH_ARRAY; - return UntypedMDRVA::Allocate(minidump_size::size() + count * size); -} - -template -inline bool TypedMDRVA::CopyIndex(unsigned int index, MDType *item) { - assert(allocation_state_ == ARRAY); - return writer_->Copy(position_ + index * minidump_size::size(), item, - minidump_size::size()); -} - -template -inline bool TypedMDRVA::CopyIndexAfterObject(unsigned int index, - const void *src, - size_t size) { - assert(allocation_state_ == SINGLE_OBJECT_WITH_ARRAY); - return writer_->Copy(position_ + minidump_size::size() + index * size, - src, size); -} - -template -inline bool TypedMDRVA::Flush() { - return writer_->Copy(position_, &data_, minidump_size::size()); -} - -} // namespace google_breakpad - -#endif // CLIENT_MINIDUMP_FILE_WRITER_INL_H__ diff --git a/share/google-breakpad/src/client/minidump_file_writer.cc b/share/google-breakpad/src/client/minidump_file_writer.cc deleted file mode 100644 index 354ffc90b7555173ee65ae10d763b6d53b821d6b..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/minidump_file_writer.cc +++ /dev/null @@ -1,268 +0,0 @@ -// Copyright (c) 2006, 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. - -// minidump_file_writer.cc: Minidump file writer implementation. -// -// See minidump_file_writer.h for documentation. - -#include -#include -#include -#include -#include - -#include "common/linux/linux_syscall_support.h" -#include "common/linux/linux_libc_support.h" -#include "client/minidump_file_writer-inl.h" -#include "common/string_conversion.h" - -namespace google_breakpad { - -const MDRVA MinidumpFileWriter::kInvalidMDRVA = static_cast(-1); - -MinidumpFileWriter::MinidumpFileWriter() : file_(-1), position_(0), size_(0) { -} - -MinidumpFileWriter::~MinidumpFileWriter() { - Close(); -} - -bool MinidumpFileWriter::Open(const char *path) { - assert(file_ == -1); -#if __linux__ - file_ = sys_open(path, O_WRONLY | O_CREAT | O_EXCL, 0600); -#else - file_ = open(path, O_WRONLY | O_CREAT | O_EXCL, 0600); -#endif - - return file_ != -1; -} - -bool MinidumpFileWriter::Close() { - bool result = true; - - if (file_ != -1) { - ftruncate(file_, position_); -#if __linux__ - result = (sys_close(file_) == 0); -#else - result = (close(file_) == 0); -#endif - file_ = -1; - } - - return result; -} - -bool MinidumpFileWriter::CopyStringToMDString(const wchar_t *str, - unsigned int length, - TypedMDRVA *mdstring) { - bool result = true; - if (sizeof(wchar_t) == sizeof(u_int16_t)) { - // Shortcut if wchar_t is the same size as MDString's buffer - result = mdstring->Copy(str, mdstring->get()->length); - } else { - u_int16_t out[2]; - int out_idx = 0; - - // Copy the string character by character - while (length && result) { - UTF32ToUTF16Char(*str, out); - if (!out[0]) - return false; - - // Process one character at a time - --length; - ++str; - - // Append the one or two UTF-16 characters. The first one will be non- - // zero, but the second one may be zero, depending on the conversion from - // UTF-32. - int out_count = out[1] ? 2 : 1; - int out_size = sizeof(u_int16_t) * out_count; - result = mdstring->CopyIndexAfterObject(out_idx, out, out_size); - out_idx += out_count; - } - } - return result; -} - -bool MinidumpFileWriter::CopyStringToMDString(const char *str, - unsigned int length, - TypedMDRVA *mdstring) { - bool result = true; - u_int16_t out[2]; - int out_idx = 0; - - // Copy the string character by character - while (length && result) { - int conversion_count = UTF8ToUTF16Char(str, length, out); - if (!conversion_count) - return false; - - // Move the pointer along based on the nubmer of converted characters - length -= conversion_count; - str += conversion_count; - - // Append the one or two UTF-16 characters - int out_count = out[1] ? 2 : 1; - int out_size = sizeof(u_int16_t) * out_count; - result = mdstring->CopyIndexAfterObject(out_idx, out, out_size); - out_idx += out_count; - } - return result; -} - -template -bool MinidumpFileWriter::WriteStringCore(const CharType *str, - unsigned int length, - MDLocationDescriptor *location) { - assert(str); - assert(location); - // Calculate the mdstring length by either limiting to |length| as passed in - // or by finding the location of the NULL character. - unsigned int mdstring_length = 0; - if (!length) - length = INT_MAX; - for (; mdstring_length < length && str[mdstring_length]; ++mdstring_length) - ; - - // Allocate the string buffer - TypedMDRVA mdstring(this); - if (!mdstring.AllocateObjectAndArray(mdstring_length + 1, sizeof(u_int16_t))) - return false; - - // Set length excluding the NULL and copy the string - mdstring.get()->length = mdstring_length * sizeof(u_int16_t); - bool result = CopyStringToMDString(str, mdstring_length, &mdstring); - - // NULL terminate - if (result) { - u_int16_t ch = 0; - result = mdstring.CopyIndexAfterObject(mdstring_length, &ch, sizeof(ch)); - - if (result) - *location = mdstring.location(); - } - - return result; -} - -bool MinidumpFileWriter::WriteString(const wchar_t *str, unsigned int length, - MDLocationDescriptor *location) { - return WriteStringCore(str, length, location); -} - -bool MinidumpFileWriter::WriteString(const char *str, unsigned int length, - MDLocationDescriptor *location) { - return WriteStringCore(str, length, location); -} - -bool MinidumpFileWriter::WriteMemory(const void *src, size_t size, - MDMemoryDescriptor *output) { - assert(src); - assert(output); - UntypedMDRVA mem(this); - - if (!mem.Allocate(size)) - return false; - if (!mem.Copy(src, mem.size())) - return false; - - output->start_of_memory_range = reinterpret_cast(src); - output->memory = mem.location(); - - return true; -} - -MDRVA MinidumpFileWriter::Allocate(size_t size) { - assert(size); - assert(file_ != -1); - size_t aligned_size = (size + 7) & ~7; // 64-bit alignment - - if (position_ + aligned_size > size_) { - size_t growth = aligned_size; - size_t minimal_growth = getpagesize(); - - // Ensure that the file grows by at least the size of a memory page - if (growth < minimal_growth) - growth = minimal_growth; - - size_t new_size = size_ + growth; - if (ftruncate(file_, new_size) != 0) - return kInvalidMDRVA; - - size_ = new_size; - } - - MDRVA current_position = position_; - position_ += static_cast(aligned_size); - - return current_position; -} - -bool MinidumpFileWriter::Copy(MDRVA position, const void *src, ssize_t size) { - assert(src); - assert(size); - assert(file_ != -1); - - // Ensure that the data will fit in the allocated space - if (size + position > size_) - return false; - - // Seek and write the data -#if __linux__ - if (sys_lseek(file_, position, SEEK_SET) == static_cast(position)) { - if (sys_write(file_, src, size) == size) { -#else - if (lseek(file_, position, SEEK_SET) == static_cast(position)) { - if (write(file_, src, size) == size) { -#endif - return true; - } - } - - return false; -} - -bool UntypedMDRVA::Allocate(size_t size) { - assert(size_ == 0); - size_ = size; - position_ = writer_->Allocate(size_); - return position_ != MinidumpFileWriter::kInvalidMDRVA; -} - -bool UntypedMDRVA::Copy(MDRVA position, const void *src, size_t size) { - assert(src); - assert(size); - assert(position + size <= position_ + size_); - return writer_->Copy(position, src, size); -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/minidump_file_writer.h b/share/google-breakpad/src/client/minidump_file_writer.h deleted file mode 100644 index f569a553597f9f0573a94613259080b5b0f6337b..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/minidump_file_writer.h +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright (c) 2006, 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. - -// minidump_file_writer.h: Implements file-based minidump generation. It's -// intended to be used with the Google Breakpad open source crash handling -// project. - -#ifndef CLIENT_MINIDUMP_FILE_WRITER_H__ -#define CLIENT_MINIDUMP_FILE_WRITER_H__ - -#include - -#include "google_breakpad/common/minidump_format.h" - -namespace google_breakpad { - -class UntypedMDRVA; -template class TypedMDRVA; - -// The user of this class can Open() a file and add minidump streams, data, and -// strings using the definitions in minidump_format.h. Since this class is -// expected to be used in a situation where the current process may be -// damaged, it will not allocate heap memory. -// Sample usage: -// MinidumpFileWriter writer; -// writer.Open("/tmp/minidump.dmp"); -// TypedMDRVA header(&writer_); -// header.Allocate(); -// header->get()->signature = MD_HEADER_SIGNATURE; -// : -// writer.Close(); -class MinidumpFileWriter { -public: - // Invalid MDRVA (Minidump Relative Virtual Address) - // returned on failed allocation - static const MDRVA kInvalidMDRVA; - - MinidumpFileWriter(); - ~MinidumpFileWriter(); - - // Open |path| as the destination of the minidump data. Any existing file - // will be overwritten. - // Return true on success, or false on failure - bool Open(const char *path); - - // Close the current file - // Return true on success, or false on failure - bool Close(); - - // Copy the contents of |str| to a MDString and write it to the file. - // |str| is expected to be either UTF-16 or UTF-32 depending on the size - // of wchar_t. - // Maximum |length| of characters to copy from |str|, or specify 0 to use the - // entire NULL terminated string. Copying will stop at the first NULL. - // |location| the allocated location - // Return true on success, or false on failure - bool WriteString(const wchar_t *str, unsigned int length, - MDLocationDescriptor *location); - - // Same as above, except with |str| as a UTF-8 string - bool WriteString(const char *str, unsigned int length, - MDLocationDescriptor *location); - - // Write |size| bytes starting at |src| into the current position. - // Return true on success and set |output| to position, or false on failure - bool WriteMemory(const void *src, size_t size, MDMemoryDescriptor *output); - - // Copies |size| bytes from |src| to |position| - // Return true on success, or false on failure - bool Copy(MDRVA position, const void *src, ssize_t size); - - // Return the current position for writing to the minidump - inline MDRVA position() const { return position_; } - - private: - friend class UntypedMDRVA; - - // Allocates an area of |size| bytes. - // Returns the position of the allocation, or kInvalidMDRVA if it was - // unable to allocate the bytes. - MDRVA Allocate(size_t size); - - // The file descriptor for the output file - int file_; - - // Current position in buffer - MDRVA position_; - - // Current allocated size - size_t size_; - - // Copy |length| characters from |str| to |mdstring|. These are distinct - // because the underlying MDString is a UTF-16 based string. The wchar_t - // variant may need to create a MDString that has more characters than the - // source |str|, whereas the UTF-8 variant may coalesce characters to form - // a single UTF-16 character. - bool CopyStringToMDString(const wchar_t *str, unsigned int length, - TypedMDRVA *mdstring); - bool CopyStringToMDString(const char *str, unsigned int length, - TypedMDRVA *mdstring); - - // The common templated code for writing a string - template - bool WriteStringCore(const CharType *str, unsigned int length, - MDLocationDescriptor *location); -}; - -// Represents an untyped allocated chunk -class UntypedMDRVA { - public: - explicit UntypedMDRVA(MinidumpFileWriter *writer) - : writer_(writer), - position_(writer->position()), - size_(0) {} - - // Allocates |size| bytes. Must not call more than once. - // Return true on success, or false on failure - bool Allocate(size_t size); - - // Returns the current position or kInvalidMDRVA if allocation failed - inline MDRVA position() const { return position_; } - - // Number of bytes allocated - inline size_t size() const { return size_; } - - // Return size and position - inline MDLocationDescriptor location() const { - MDLocationDescriptor location = { size_, position_ }; - return location; - } - - // Copy |size| bytes starting at |src| into the minidump at |position| - // Return true on success, or false on failure - bool Copy(MDRVA position, const void *src, size_t size); - - // Copy |size| bytes from |src| to the current position - inline bool Copy(const void *src, size_t size) { - return Copy(position_, src, size); - } - - protected: - // Writer we associate with - MinidumpFileWriter *writer_; - - // Position of the start of the data - MDRVA position_; - - // Allocated size - size_t size_; -}; - -// Represents a Minidump object chunk. Additional memory can be allocated at -// the end of the object as a: -// - single allocation -// - Array of MDType objects -// - A MDType object followed by an array -template -class TypedMDRVA : public UntypedMDRVA { - public: - // Constructs an unallocated MDRVA - explicit TypedMDRVA(MinidumpFileWriter *writer) - : UntypedMDRVA(writer), - data_(), - allocation_state_(UNALLOCATED) {} - - inline ~TypedMDRVA() { - // Ensure that the data_ object is written out - if (allocation_state_ != ARRAY) - Flush(); - } - - // Address of object data_ of MDType. This is not declared const as the - // typical usage will be to access the underlying |data_| object as to - // alter its contents. - MDType *get() { return &data_; } - - // Allocates minidump_size::size() bytes. - // Must not call more than once. - // Return true on success, or false on failure - bool Allocate(); - - // Allocates minidump_size::size() + |additional| bytes. - // Must not call more than once. - // Return true on success, or false on failure - bool Allocate(size_t additional); - - // Allocate an array of |count| elements of MDType. - // Must not call more than once. - // Return true on success, or false on failure - bool AllocateArray(size_t count); - - // Allocate an array of |count| elements of |size| after object of MDType - // Must not call more than once. - // Return true on success, or false on failure - bool AllocateObjectAndArray(unsigned int count, size_t size); - - // Copy |item| to |index| - // Must have been allocated using AllocateArray(). - // Return true on success, or false on failure - bool CopyIndex(unsigned int index, MDType *item); - - // Copy |size| bytes starting at |str| to |index| - // Must have been allocated using AllocateObjectAndArray(). - // Return true on success, or false on failure - bool CopyIndexAfterObject(unsigned int index, const void *src, size_t size); - - // Write data_ - bool Flush(); - - private: - enum AllocationState { - UNALLOCATED = 0, - SINGLE_OBJECT, - ARRAY, - SINGLE_OBJECT_WITH_ARRAY - }; - - MDType data_; - AllocationState allocation_state_; -}; - -} // namespace google_breakpad - -#endif // CLIENT_MINIDUMP_FILE_WRITER_H__ diff --git a/share/google-breakpad/src/client/windows/common/auto_critical_section.h b/share/google-breakpad/src/client/windows/common/auto_critical_section.h deleted file mode 100644 index 82c7b7f1415821460828fec4fb17c1745f176d42..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/common/auto_critical_section.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) 2008, 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. - -#ifndef CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ -#define CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ - -#include - -namespace google_breakpad { - -// Automatically enters the critical section in the constructor and leaves -// the critical section in the destructor. -class AutoCriticalSection { - public: - // Creates a new instance with the given critical section object - // and enters the critical section immediately. - explicit AutoCriticalSection(CRITICAL_SECTION* cs) : cs_(cs) { - assert(cs_); - EnterCriticalSection(cs_); - } - - // Destructor: leaves the critical section. - ~AutoCriticalSection() { - LeaveCriticalSection(cs_); - } - - private: - // Disable copy ctor and operator=. - AutoCriticalSection(const AutoCriticalSection&); - AutoCriticalSection& operator=(const AutoCriticalSection&); - - CRITICAL_SECTION* cs_; -}; - -} // namespace google_breakpad - -#endif // CLIENT_WINDOWS_COMMON_AUTO_CRITICAL_SECTION_H__ diff --git a/share/google-breakpad/src/client/windows/common/ipc_protocol.h b/share/google-breakpad/src/client/windows/common/ipc_protocol.h deleted file mode 100644 index 7d101d38667946326ac3f7b2f530e4a175bc3393..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/common/ipc_protocol.h +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright (c) 2008, 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. - -#ifndef CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ -#define CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ - -#include -#include -#include -#include -#include "common/windows/string_utils-inl.h" -#include "google_breakpad/common/minidump_format.h" - -namespace google_breakpad { - -// Name/value pair for custom client information. -struct CustomInfoEntry { - // Maximum length for name and value for client custom info. - static const int kNameMaxLength = 64; - static const int kValueMaxLength = 64; - - CustomInfoEntry() { - // Putting name and value in initializer list makes VC++ show warning 4351. - set_name(NULL); - set_value(NULL); - } - - CustomInfoEntry(const wchar_t* name_arg, const wchar_t* value_arg) { - set_name(name_arg); - set_value(value_arg); - } - - void set_name(const wchar_t* name_arg) { - if (!name_arg) { - name[0] = L'\0'; - return; - } - WindowsStringUtils::safe_wcscpy(name, kNameMaxLength, name_arg); - } - - void set_value(const wchar_t* value_arg) { - if (!value_arg) { - value[0] = L'\0'; - return; - } - - WindowsStringUtils::safe_wcscpy(value, kValueMaxLength, value_arg); - } - - void set(const wchar_t* name_arg, const wchar_t* value_arg) { - set_name(name_arg); - set_value(value_arg); - } - - wchar_t name[kNameMaxLength]; - wchar_t value[kValueMaxLength]; -}; - -// Constants for the protocol between client and the server. - -// Tags sent with each message indicating the purpose of -// the message. -enum MessageTag { - MESSAGE_TAG_NONE = 0, - MESSAGE_TAG_REGISTRATION_REQUEST = 1, - MESSAGE_TAG_REGISTRATION_RESPONSE = 2, - MESSAGE_TAG_REGISTRATION_ACK = 3 -}; - -struct CustomClientInfo { - const CustomInfoEntry* entries; - size_t count; -}; - -// Message structure for IPC between crash client and crash server. -struct ProtocolMessage { - ProtocolMessage() - : tag(MESSAGE_TAG_NONE), - pid(0), - dump_type(MiniDumpNormal), - thread_id(0), - exception_pointers(NULL), - assert_info(NULL), - custom_client_info(), - dump_request_handle(NULL), - dump_generated_handle(NULL), - server_alive_handle(NULL) { - } - - // Creates an instance with the given parameters. - ProtocolMessage(MessageTag arg_tag, - DWORD arg_pid, - MINIDUMP_TYPE arg_dump_type, - DWORD* arg_thread_id, - EXCEPTION_POINTERS** arg_exception_pointers, - MDRawAssertionInfo* arg_assert_info, - const CustomClientInfo& custom_info, - HANDLE arg_dump_request_handle, - HANDLE arg_dump_generated_handle, - HANDLE arg_server_alive) - : tag(arg_tag), - pid(arg_pid), - dump_type(arg_dump_type), - thread_id(arg_thread_id), - exception_pointers(arg_exception_pointers), - assert_info(arg_assert_info), - custom_client_info(custom_info), - dump_request_handle(arg_dump_request_handle), - dump_generated_handle(arg_dump_generated_handle), - server_alive_handle(arg_server_alive) { - } - - // Tag in the message. - MessageTag tag; - - // Process id. - DWORD pid; - - // Dump type requested. - MINIDUMP_TYPE dump_type; - - // Client thread id pointer. - DWORD* thread_id; - - // Exception information. - EXCEPTION_POINTERS** exception_pointers; - - // Assert information in case of an invalid parameter or - // pure call failure. - MDRawAssertionInfo* assert_info; - - // Custom client information. - CustomClientInfo custom_client_info; - - // Handle to signal the crash event. - HANDLE dump_request_handle; - - // Handle to check if server is done generating crash. - HANDLE dump_generated_handle; - - // Handle to a mutex that becomes signaled (WAIT_ABANDONED) - // if server process goes down. - HANDLE server_alive_handle; - - private: - // Disable copy ctor and operator=. - ProtocolMessage(const ProtocolMessage& msg); - ProtocolMessage& operator=(const ProtocolMessage& msg); -}; - -} // namespace google_breakpad - -#endif // CLIENT_WINDOWS_COMMON_IPC_PROTOCOL_H__ diff --git a/share/google-breakpad/src/client/windows/crash_generation/client_info.cc b/share/google-breakpad/src/client/windows/crash_generation/client_info.cc deleted file mode 100644 index 4752c4aeaa92d235d0b8433ca231d0c06087b1ad..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/client_info.cc +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) 2008, 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. - -#include "client/windows/crash_generation/client_info.h" -#include "client/windows/common/ipc_protocol.h" - -static const wchar_t kCustomInfoProcessUptimeName[] = L"ptime"; - -namespace google_breakpad { - -ClientInfo::ClientInfo(CrashGenerationServer* crash_server, - DWORD pid, - MINIDUMP_TYPE dump_type, - DWORD* thread_id, - EXCEPTION_POINTERS** ex_info, - MDRawAssertionInfo* assert_info, - const CustomClientInfo& custom_client_info) - : crash_server_(crash_server), - pid_(pid), - dump_type_(dump_type), - ex_info_(ex_info), - assert_info_(assert_info), - custom_client_info_(custom_client_info), - thread_id_(thread_id), - process_handle_(NULL), - dump_requested_handle_(NULL), - dump_generated_handle_(NULL), - dump_request_wait_handle_(NULL), - process_exit_wait_handle_(NULL) { - GetSystemTimeAsFileTime(&start_time_); -} - -bool ClientInfo::Initialize() { - process_handle_ = OpenProcess(GENERIC_ALL, FALSE, pid_); - if (!process_handle_) { - return false; - } - - dump_requested_handle_ = CreateEvent(NULL, // Security attributes. - TRUE, // Manual reset. - FALSE, // Initial state. - NULL); // Name. - if (!dump_requested_handle_) { - return false; - } - - dump_generated_handle_ = CreateEvent(NULL, // Security attributes. - TRUE, // Manual reset. - FALSE, // Initial state. - NULL); // Name. - return dump_generated_handle_ != NULL; -} - -ClientInfo::~ClientInfo() { - if (dump_request_wait_handle_) { - // Wait for callbacks that might already be running to finish. - UnregisterWaitEx(dump_request_wait_handle_, INVALID_HANDLE_VALUE); - } - - if (process_exit_wait_handle_) { - // Wait for the callback that might already be running to finish. - UnregisterWaitEx(process_exit_wait_handle_, INVALID_HANDLE_VALUE); - } - - if (process_handle_) { - CloseHandle(process_handle_); - } - - if (dump_requested_handle_) { - CloseHandle(dump_requested_handle_); - } - - if (dump_generated_handle_) { - CloseHandle(dump_generated_handle_); - } -} - -bool ClientInfo::UnregisterWaits() { - bool success = true; - - if (dump_request_wait_handle_) { - if (!UnregisterWait(dump_request_wait_handle_)) { - success = false; - } else { - dump_request_wait_handle_ = NULL; - } - } - - if (process_exit_wait_handle_) { - if (!UnregisterWait(process_exit_wait_handle_)) { - success = false; - } else { - process_exit_wait_handle_ = NULL; - } - } - - return success; -} - -bool ClientInfo::GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const { - SIZE_T bytes_count = 0; - if (!ReadProcessMemory(process_handle_, - ex_info_, - ex_info, - sizeof(*ex_info), - &bytes_count)) { - return false; - } - - return bytes_count == sizeof(*ex_info); -} - -bool ClientInfo::GetClientThreadId(DWORD* thread_id) const { - SIZE_T bytes_count = 0; - if (!ReadProcessMemory(process_handle_, - thread_id_, - thread_id, - sizeof(*thread_id), - &bytes_count)) { - return false; - } - - return bytes_count == sizeof(*thread_id); -} - -void ClientInfo::SetProcessUptime() { - FILETIME now = {0}; - GetSystemTimeAsFileTime(&now); - - ULARGE_INTEGER time_start; - time_start.HighPart = start_time_.dwHighDateTime; - time_start.LowPart = start_time_.dwLowDateTime; - - ULARGE_INTEGER time_now; - time_now.HighPart = now.dwHighDateTime; - time_now.LowPart = now.dwLowDateTime; - - // Calculate the delay and convert it from 100-nanoseconds to milliseconds. - __int64 delay = (time_now.QuadPart - time_start.QuadPart) / 10 / 1000; - - // Convert it to a string. - wchar_t* value = custom_info_entries_.get()[custom_client_info_.count].value; - _i64tow_s(delay, value, CustomInfoEntry::kValueMaxLength, 10); -} - -bool ClientInfo::PopulateCustomInfo() { - SIZE_T bytes_count = 0; - SIZE_T read_count = sizeof(CustomInfoEntry) * custom_client_info_.count; - - // If the scoped array for custom info already has an array, it will be - // the same size as what we need. This is because the number of custom info - // entries is always the same. So allocate memory only if scoped array has - // a NULL pointer. - if (!custom_info_entries_.get()) { - // Allocate an extra entry for reporting uptime for the client process. - custom_info_entries_.reset( - new CustomInfoEntry[custom_client_info_.count + 1]); - // Use the last element in the array for uptime. - custom_info_entries_.get()[custom_client_info_.count].set_name( - kCustomInfoProcessUptimeName); - } - - if (!ReadProcessMemory(process_handle_, - custom_client_info_.entries, - custom_info_entries_.get(), - read_count, - &bytes_count)) { - return false; - } - - SetProcessUptime(); - return (bytes_count != read_count); -} - -CustomClientInfo ClientInfo::GetCustomInfo() const { - CustomClientInfo custom_info; - custom_info.entries = custom_info_entries_.get(); - // Add 1 to the count from the client process to account for extra entry for - // process uptime. - custom_info.count = custom_client_info_.count + 1; - return custom_info; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/windows/crash_generation/client_info.h b/share/google-breakpad/src/client/windows/crash_generation/client_info.h deleted file mode 100644 index 774816fb13df11c6fca12c37634abefdca8f0682..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/client_info.h +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright (c) 2008, 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. - -#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ -#define CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ - -#include -#include -#include "client/windows/common/ipc_protocol.h" -#include "google_breakpad/common/minidump_format.h" -#include "processor/scoped_ptr.h" - -namespace google_breakpad { - -class CrashGenerationServer; - -// Abstraction for a crash client process. -class ClientInfo { - public: - // Creates an instance with the given values. Gets the process - // handle for the given process id and creates necessary event - // objects. - ClientInfo(CrashGenerationServer* crash_server, - DWORD pid, - MINIDUMP_TYPE dump_type, - DWORD* thread_id, - EXCEPTION_POINTERS** ex_info, - MDRawAssertionInfo* assert_info, - const CustomClientInfo& custom_client_info); - - ~ClientInfo(); - - CrashGenerationServer* crash_server() const { return crash_server_; } - DWORD pid() const { return pid_; } - MINIDUMP_TYPE dump_type() const { return dump_type_; } - EXCEPTION_POINTERS** ex_info() const { return ex_info_; } - MDRawAssertionInfo* assert_info() const { return assert_info_; } - DWORD* thread_id() const { return thread_id_; } - HANDLE process_handle() const { return process_handle_; } - HANDLE dump_requested_handle() const { return dump_requested_handle_; } - HANDLE dump_generated_handle() const { return dump_generated_handle_; } - - HANDLE dump_request_wait_handle() const { - return dump_request_wait_handle_; - } - - void set_dump_request_wait_handle(HANDLE value) { - dump_request_wait_handle_ = value; - } - - HANDLE process_exit_wait_handle() const { - return process_exit_wait_handle_; - } - - void set_process_exit_wait_handle(HANDLE value) { - process_exit_wait_handle_ = value; - } - - // Unregister all waits for the client. - bool UnregisterWaits(); - - bool Initialize(); - bool GetClientExceptionInfo(EXCEPTION_POINTERS** ex_info) const; - bool GetClientThreadId(DWORD* thread_id) const; - - // Reads the custom information from the client process address space. - bool PopulateCustomInfo(); - - // Returns the client custom information. - CustomClientInfo GetCustomInfo() const; - - private: - // Calcualtes the uptime for the client process, converts it to a string and - // stores it in the last entry of client custom info. - void SetProcessUptime(); - - // Crash generation server. - CrashGenerationServer* crash_server_; - - // Client process ID. - DWORD pid_; - - // Dump type requested by the client. - MINIDUMP_TYPE dump_type_; - - // Address of an EXCEPTION_POINTERS* variable in the client - // process address space that will point to an instance of - // EXCEPTION_POINTERS containing information about crash. - // - // WARNING: Do not dereference these pointers as they are pointers - // in the address space of another process. - EXCEPTION_POINTERS** ex_info_; - - // Address of an instance of MDRawAssertionInfo in the client - // process address space that will contain information about - // non-exception related crashes like invalid parameter assertion - // failures and pure calls. - // - // WARNING: Do not dereference these pointers as they are pointers - // in the address space of another process. - MDRawAssertionInfo* assert_info_; - - // Custom information about the client. - CustomClientInfo custom_client_info_; - - // Contains the custom client info entries read from the client process - // memory. This will be populated only if the method GetClientCustomInfo - // is called. - scoped_array custom_info_entries_; - - // Address of a variable in the client process address space that - // will contain the thread id of the crashing client thread. - // - // WARNING: Do not dereference these pointers as they are pointers - // in the address space of another process. - DWORD* thread_id_; - - // Client process handle. - HANDLE process_handle_; - - // Dump request event handle. - HANDLE dump_requested_handle_; - - // Dump generated event handle. - HANDLE dump_generated_handle_; - - // Wait handle for dump request event. - HANDLE dump_request_wait_handle_; - - // Wait handle for process exit event. - HANDLE process_exit_wait_handle_; - - // Time when the client process started. It is used to determine the uptime - // for the client process when it signals a crash. - FILETIME start_time_; - - // Disallow copy ctor and operator=. - ClientInfo(const ClientInfo& client_info); - ClientInfo& operator=(const ClientInfo& client_info); -}; - -} // namespace google_breakpad - -#endif // CLIENT_WINDOWS_CRASH_GENERATION_CLIENT_INFO_H__ diff --git a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_client.cc b/share/google-breakpad/src/client/windows/crash_generation/crash_generation_client.cc deleted file mode 100644 index 197807ab80150ac8d191651486c02942505a1cef..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_client.cc +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright (c) 2008, 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. - -#include "client/windows/crash_generation/crash_generation_client.h" -#include -#include -#include "client/windows/common/ipc_protocol.h" - -namespace google_breakpad { - -const int kPipeBusyWaitTimeoutMs = 2000; - -#ifdef _DEBUG -const DWORD kWaitForServerTimeoutMs = INFINITE; -#else -const DWORD kWaitForServerTimeoutMs = 15000; -#endif - -const int kPipeConnectMaxAttempts = 2; - -const DWORD kPipeDesiredAccess = FILE_READ_DATA | - FILE_WRITE_DATA | - FILE_WRITE_ATTRIBUTES; - -const DWORD kPipeFlagsAndAttributes = SECURITY_IDENTIFICATION | - SECURITY_SQOS_PRESENT; - -const DWORD kPipeMode = PIPE_READMODE_MESSAGE; - -const size_t kWaitEventCount = 2; - -// This function is orphan for production code. It can be used -// for debugging to help repro some scenarios like the client -// is slow in writing to the pipe after connecting, the client -// is slow in reading from the pipe after writing, etc. The parameter -// overlapped below is not used and it is present to match the signature -// of this function to TransactNamedPipe Win32 API. Uncomment if needed -// for debugging. -/** -static bool TransactNamedPipeDebugHelper(HANDLE pipe, - const void* in_buffer, - DWORD in_size, - void* out_buffer, - DWORD out_size, - DWORD* bytes_count, - LPOVERLAPPED) { - // Uncomment the next sleep to create a gap before writing - // to pipe. - // Sleep(5000); - - if (!WriteFile(pipe, - in_buffer, - in_size, - bytes_count, - NULL)) { - return false; - } - - // Uncomment the next sleep to create a gap between write - // and read. - // Sleep(5000); - - return ReadFile(pipe, out_buffer, out_size, bytes_count, NULL) != FALSE; -} -**/ - -CrashGenerationClient::CrashGenerationClient( - const wchar_t* pipe_name, - MINIDUMP_TYPE dump_type, - const CustomClientInfo* custom_info) - : pipe_name_(pipe_name), - dump_type_(dump_type), - thread_id_(0), - server_process_id_(0), - crash_event_(NULL), - crash_generated_(NULL), - server_alive_(NULL), - exception_pointers_(NULL), - custom_info_() { - memset(&assert_info_, 0, sizeof(assert_info_)); - if (custom_info) { - custom_info_ = *custom_info; - } -} - -CrashGenerationClient::~CrashGenerationClient() { - if (crash_event_) { - CloseHandle(crash_event_); - } - - if (crash_generated_) { - CloseHandle(crash_generated_); - } - - if (server_alive_) { - CloseHandle(server_alive_); - } -} - -// Performs the registration step with the server process. -// The registration step involves communicating with the server -// via a named pipe. The client sends the following pieces of -// data to the server: -// -// * Message tag indicating the client is requesting registration. -// * Process id of the client process. -// * Address of a DWORD variable in the client address space -// that will contain the thread id of the client thread that -// caused the crash. -// * Address of a EXCEPTION_POINTERS* variable in the client -// address space that will point to an instance of EXCEPTION_POINTERS -// when the crash happens. -// * Address of an instance of MDRawAssertionInfo that will contain -// relevant information in case of non-exception crashes like assertion -// failures and pure calls. -// -// In return the client expects the following information from the server: -// -// * Message tag indicating successful registration. -// * Server process id. -// * Handle to an object that client can signal to request dump -// generation from the server. -// * Handle to an object that client can wait on after requesting -// dump generation for the server to finish dump generation. -// * Handle to a mutex object that client can wait on to make sure -// server is still alive. -// -// If any step of the expected behavior mentioned above fails, the -// registration step is not considered successful and hence out-of-process -// dump generation service is not available. -// -// Returns true if the registration is successful; false otherwise. -bool CrashGenerationClient::Register() { - HANDLE pipe = ConnectToServer(); - if (!pipe) { - return false; - } - - bool success = RegisterClient(pipe); - CloseHandle(pipe); - return success; -} - -HANDLE CrashGenerationClient::ConnectToServer() { - HANDLE pipe = ConnectToPipe(pipe_name_.c_str(), - kPipeDesiredAccess, - kPipeFlagsAndAttributes); - if (!pipe) { - return NULL; - } - - DWORD mode = kPipeMode; - if (!SetNamedPipeHandleState(pipe, &mode, NULL, NULL)) { - CloseHandle(pipe); - pipe = NULL; - } - - return pipe; -} - -bool CrashGenerationClient::RegisterClient(HANDLE pipe) { - ProtocolMessage msg(MESSAGE_TAG_REGISTRATION_REQUEST, - GetCurrentProcessId(), - dump_type_, - &thread_id_, - &exception_pointers_, - &assert_info_, - custom_info_, - NULL, - NULL, - NULL); - ProtocolMessage reply; - DWORD bytes_count = 0; - // The call to TransactNamedPipe below can be changed to a call - // to TransactNamedPipeDebugHelper to help repro some scenarios. - // For details see comments for TransactNamedPipeDebugHelper. - if (!TransactNamedPipe(pipe, - &msg, - sizeof(msg), - &reply, - sizeof(ProtocolMessage), - &bytes_count, - NULL)) { - return false; - } - - if (!ValidateResponse(reply)) { - return false; - } - - ProtocolMessage ack_msg; - ack_msg.tag = MESSAGE_TAG_REGISTRATION_ACK; - - if (!WriteFile(pipe, &ack_msg, sizeof(ack_msg), &bytes_count, NULL)) { - return false; - } - crash_event_ = reply.dump_request_handle; - crash_generated_ = reply.dump_generated_handle; - server_alive_ = reply.server_alive_handle; - server_process_id_ = reply.pid; - - return true; -} - -HANDLE CrashGenerationClient::ConnectToPipe(const wchar_t* pipe_name, - DWORD pipe_access, - DWORD flags_attrs) { - for (int i = 0; i < kPipeConnectMaxAttempts; ++i) { - HANDLE pipe = CreateFile(pipe_name, - pipe_access, - 0, - NULL, - OPEN_EXISTING, - flags_attrs, - NULL); - if (pipe != INVALID_HANDLE_VALUE) { - return pipe; - } - - // Cannot continue retrying if error is something other than - // ERROR_PIPE_BUSY. - if (GetLastError() != ERROR_PIPE_BUSY) { - break; - } - - // Cannot continue retrying if wait on pipe fails. - if (!WaitNamedPipe(pipe_name, kPipeBusyWaitTimeoutMs)) { - break; - } - } - - return NULL; -} - -bool CrashGenerationClient::ValidateResponse( - const ProtocolMessage& msg) const { - return (msg.tag == MESSAGE_TAG_REGISTRATION_RESPONSE) && - (msg.pid != 0) && - (msg.dump_request_handle != NULL) && - (msg.dump_generated_handle != NULL) && - (msg.server_alive_handle != NULL); -} - -bool CrashGenerationClient::IsRegistered() const { - return crash_event_ != NULL; -} - -bool CrashGenerationClient::RequestDump(EXCEPTION_POINTERS* ex_info) { - if (!IsRegistered()) { - return false; - } - - exception_pointers_ = ex_info; - thread_id_ = GetCurrentThreadId(); - - assert_info_.line = 0; - assert_info_.type = 0; - assert_info_.expression[0] = 0; - assert_info_.file[0] = 0; - assert_info_.function[0] = 0; - - return SignalCrashEventAndWait(); -} - -bool CrashGenerationClient::RequestDump(MDRawAssertionInfo* assert_info) { - if (!IsRegistered()) { - return false; - } - - exception_pointers_ = NULL; - - if (assert_info) { - memcpy(&assert_info_, assert_info, sizeof(assert_info_)); - } else { - memset(&assert_info_, 0, sizeof(assert_info_)); - } - - thread_id_ = GetCurrentThreadId(); - - return SignalCrashEventAndWait(); -} - -bool CrashGenerationClient::SignalCrashEventAndWait() { - assert(crash_event_); - assert(crash_generated_); - assert(server_alive_); - - // Reset the dump generated event before signaling the crash - // event so that the server can set the dump generated event - // once it is done generating the event. - if (!ResetEvent(crash_generated_)) { - return false; - } - - if (!SetEvent(crash_event_)) { - return false; - } - - HANDLE wait_handles[kWaitEventCount] = {crash_generated_, server_alive_}; - - DWORD result = WaitForMultipleObjects(kWaitEventCount, - wait_handles, - FALSE, - kWaitForServerTimeoutMs); - - // Crash dump was successfully generated only if the server - // signaled the crash generated event. - return result == WAIT_OBJECT_0; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_client.h b/share/google-breakpad/src/client/windows/crash_generation/crash_generation_client.h deleted file mode 100644 index 81b0e6caba7ca37e5d06947a3bc55108f5f7485d..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_client.h +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) 2008, 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. - -#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ -#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ - -#include -#include -#include -#include -#include "client/windows/common/ipc_protocol.h" -#include "processor/scoped_ptr.h" - -namespace google_breakpad { - -struct CustomClientInfo; - -// Abstraction of client-side implementation of out of process -// crash generation. -// -// The process that desires to have out-of-process crash dump -// generation service can use this class in the following way: -// -// * Create an instance. -// * Call Register method so that the client tries to register -// with the server process and check the return value. If -// registration is not successful, out-of-process crash dump -// generation will not be available -// * Request dump generation by calling either of the two -// overloaded RequestDump methods - one in case of exceptions -// and the other in case of assertion failures -// -// Note that it is the responsibility of the client code of -// this class to set the unhandled exception filter with the -// system by calling the SetUnhandledExceptionFilter function -// and the client code should explicitly request dump generation. -class CrashGenerationClient { - public: - CrashGenerationClient(const wchar_t* pipe_name, - MINIDUMP_TYPE dump_type, - const CustomClientInfo* custom_info); - - ~CrashGenerationClient(); - - // Registers the client process with the crash server. - // - // Returns true if the registration is successful; false otherwise. - bool Register(); - - // Requests the crash server to generate a dump with the given - // exception information. - // - // Returns true if the dump was successful; false otherwise. Note that - // if the registration step was not performed or it was not successful, - // false will be returned. - bool RequestDump(EXCEPTION_POINTERS* ex_info); - - // Requests the crash server to generate a dump with the given - // assertion information. - // - // Returns true if the dump was successful; false otherwise. Note that - // if the registration step was not performed or it was not successful, - // false will be returned. - bool RequestDump(MDRawAssertionInfo* assert_info); - - private: - // Connects to the appropriate pipe and sets the pipe handle state. - // - // Returns the pipe handle if everything goes well; otherwise Returns NULL. - HANDLE ConnectToServer(); - - // Performs a handshake with the server over the given pipe which should be - // already connected to the server. - // - // Returns true if handshake with the server was successful; false otherwise. - bool RegisterClient(HANDLE pipe); - - // Validates the given server response. - bool ValidateResponse(const ProtocolMessage& msg) const; - - // Returns true if the registration step succeeded; false otherwise. - bool IsRegistered() const; - - // Connects to the given named pipe with given parameters. - // - // Returns true if the connection is successful; false otherwise. - HANDLE ConnectToPipe(const wchar_t* pipe_name, - DWORD pipe_access, - DWORD flags_attrs); - - // Signals the crash event and wait for the server to generate crash. - bool SignalCrashEventAndWait(); - - // Pipe name to use to talk to server. - std::wstring pipe_name_; - - // Custom client information - CustomClientInfo custom_info_; - - // Type of dump to generate. - MINIDUMP_TYPE dump_type_; - - // Event to signal in case of a crash. - HANDLE crash_event_; - - // Handle to wait on after signaling a crash for the server - // to finish generating crash dump. - HANDLE crash_generated_; - - // Handle to a mutex that will become signaled with WAIT_ABANDONED - // if the server process goes down. - HANDLE server_alive_; - - // Server process id. - DWORD server_process_id_; - - // Id of the thread that caused the crash. - DWORD thread_id_; - - // Exception pointers for an exception crash. - EXCEPTION_POINTERS* exception_pointers_; - - // Assertion info for an invalid parameter or pure call crash. - MDRawAssertionInfo assert_info_; - - // Disable copy ctor and operator=. - CrashGenerationClient(const CrashGenerationClient& crash_client); - CrashGenerationClient& operator=(const CrashGenerationClient& crash_client); -}; - -} // namespace google_breakpad - -#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_CLIENT_H__ diff --git a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc b/share/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc deleted file mode 100644 index dafa5c2acb1166778a3f41cf8bd0d1f996ac1276..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_server.cc +++ /dev/null @@ -1,854 +0,0 @@ -// Copyright (c) 2008, 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. - -#include "client/windows/crash_generation/crash_generation_server.h" -#include -#include -#include -#include "client/windows/common/auto_critical_section.h" -#include "processor/scoped_ptr.h" - -namespace google_breakpad { - -// Output buffer size. -static const size_t kOutBufferSize = 64; - -// Input buffer size. -static const size_t kInBufferSize = 64; - -// Access flags for the client on the dump request event. -static const DWORD kDumpRequestEventAccess = EVENT_MODIFY_STATE; - -// Access flags for the client on the dump generated event. -static const DWORD kDumpGeneratedEventAccess = EVENT_MODIFY_STATE | - SYNCHRONIZE; - -// Access flags for the client on the mutex. -static const DWORD kMutexAccess = SYNCHRONIZE; - -// Attribute flags for the pipe. -static const DWORD kPipeAttr = FILE_FLAG_FIRST_PIPE_INSTANCE | - PIPE_ACCESS_DUPLEX | - FILE_FLAG_OVERLAPPED; - -// Mode for the pipe. -static const DWORD kPipeMode = PIPE_TYPE_MESSAGE | - PIPE_READMODE_MESSAGE | - PIPE_WAIT; - -// For pipe I/O, execute the callback in the wait thread itself, -// since the callback does very little work. The callback executes -// the code for one of the states of the server state machine and -// the code for all of the states perform async I/O and hence -// finish very quickly. -static const ULONG kPipeIOThreadFlags = WT_EXECUTEINWAITTHREAD; - -// Dump request threads will, most likely, generate dumps. That may -// take some time to finish, so specify WT_EXECUTELONGFUNCTION flag. -static const ULONG kDumpRequestThreadFlags = WT_EXECUTEINWAITTHREAD | - WT_EXECUTELONGFUNCTION; - -// Maximum delay during server shutdown if some work items -// are still executing. -static const int kShutdownDelayMs = 10000; - -// Interval for each sleep during server shutdown. -static const int kShutdownSleepIntervalMs = 5; - -static bool IsClientRequestValid(const ProtocolMessage& msg) { - return msg.tag == MESSAGE_TAG_REGISTRATION_REQUEST && - msg.pid != 0 && - msg.thread_id != NULL && - msg.exception_pointers != NULL && - msg.assert_info != NULL; -} - -CrashGenerationServer::CrashGenerationServer( - const std::wstring& pipe_name, - SECURITY_ATTRIBUTES* pipe_sec_attrs, - OnClientConnectedCallback connect_callback, - void* connect_context, - OnClientDumpRequestCallback dump_callback, - void* dump_context, - OnClientExitedCallback exit_callback, - void* exit_context, - bool generate_dumps, - const std::wstring* dump_path) - : pipe_name_(pipe_name), - pipe_sec_attrs_(pipe_sec_attrs), - pipe_(NULL), - pipe_wait_handle_(NULL), - server_alive_handle_(NULL), - connect_callback_(connect_callback), - connect_context_(connect_context), - dump_callback_(dump_callback), - dump_context_(dump_context), - exit_callback_(exit_callback), - exit_context_(exit_context), - generate_dumps_(generate_dumps), - dump_generator_(NULL), - server_state_(IPC_SERVER_STATE_INITIAL), - shutting_down_(false), - overlapped_(), - client_info_(NULL), - cleanup_item_count_(0) { - InitializeCriticalSection(&clients_sync_); - - if (dump_path) { - dump_generator_.reset(new MinidumpGenerator(*dump_path)); - } -} - -CrashGenerationServer::~CrashGenerationServer() { - // Indicate to existing threads that server is shutting down. - shutting_down_ = true; - - // Even if there are no current worker threads running, it is possible that - // an I/O request is pending on the pipe right now but not yet done. In fact, - // it's very likely this is the case unless we are in an ERROR state. If we - // don't wait for the pending I/O to be done, then when the I/O completes, - // it may write to invalid memory. AppVerifier will flag this problem too. - // So we disconnect from the pipe and then wait for the server to get into - // error state so that the pending I/O will fail and get cleared. - DisconnectNamedPipe(pipe_); - int num_tries = 100; - while (num_tries-- && server_state_ != IPC_SERVER_STATE_ERROR) { - Sleep(10); - } - - // Unregister wait on the pipe. - if (pipe_wait_handle_) { - // Wait for already executing callbacks to finish. - UnregisterWaitEx(pipe_wait_handle_, INVALID_HANDLE_VALUE); - } - - // Close the pipe to avoid further client connections. - if (pipe_) { - CloseHandle(pipe_); - } - - // Request all ClientInfo objects to unregister all waits. - // New scope to hold the lock for the shortest time. - { - AutoCriticalSection lock(&clients_sync_); - - std::list::iterator iter; - for (iter = clients_.begin(); iter != clients_.end(); ++iter) { - ClientInfo* client_info = *iter; - client_info->UnregisterWaits(); - } - } - - // Now that all waits have been unregistered, wait for some time - // for all pending work items to finish. - int total_wait = 0; - while (cleanup_item_count_ > 0) { - Sleep(kShutdownSleepIntervalMs); - - total_wait += kShutdownSleepIntervalMs; - - if (total_wait >= kShutdownDelayMs) { - break; - } - } - - // Clean up all the ClientInfo objects. - // New scope to hold the lock for the shortest time. - { - AutoCriticalSection lock(&clients_sync_); - - std::list::iterator iter; - for (iter = clients_.begin(); iter != clients_.end(); ++iter) { - ClientInfo* client_info = *iter; - delete client_info; - } - } - - if (server_alive_handle_) { - // Release the mutex before closing the handle so that clients requesting - // dumps wait for a long time for the server to generate a dump. - ReleaseMutex(server_alive_handle_); - CloseHandle(server_alive_handle_); - } - - DeleteCriticalSection(&clients_sync_); -} - -bool CrashGenerationServer::Start() { - server_state_ = IPC_SERVER_STATE_INITIAL; - - server_alive_handle_ = CreateMutex(NULL, TRUE, NULL); - if (!server_alive_handle_) { - return false; - } - - // Event to signal the client connection and pipe reads and writes. - overlapped_.hEvent = CreateEvent(NULL, // Security descriptor. - TRUE, // Manual reset. - FALSE, // Initially signaled. - NULL); // Name. - if (!overlapped_.hEvent) { - return false; - } - - // Register a callback with the thread pool for the client connection. - if (!RegisterWaitForSingleObject(&pipe_wait_handle_, - overlapped_.hEvent, - OnPipeConnected, - this, - INFINITE, - kPipeIOThreadFlags)) { - return false; - } - - pipe_ = CreateNamedPipe(pipe_name_.c_str(), - kPipeAttr, - kPipeMode, - 1, - kOutBufferSize, - kInBufferSize, - 0, - pipe_sec_attrs_); - if (pipe_ == INVALID_HANDLE_VALUE) { - return false; - } - - // Signal the event to start a separate thread to handle - // client connections. - return SetEvent(overlapped_.hEvent) != FALSE; -} - -// If the server thread serving clients ever gets into the -// ERROR state, reset the event, close the pipe and remain -// in the error state forever. Error state means something -// that we didn't account for has happened, and it's dangerous -// to do anything unknowingly. -void CrashGenerationServer::HandleErrorState() { - assert(server_state_ == IPC_SERVER_STATE_ERROR); - - // If the server is shutting down anyway, don't clean up - // here since shut down process will clean up. - if (shutting_down_) { - return; - } - - if (pipe_wait_handle_) { - UnregisterWait(pipe_wait_handle_); - pipe_wait_handle_ = NULL; - } - - if (pipe_) { - CloseHandle(pipe_); - pipe_ = NULL; - } - - if (overlapped_.hEvent) { - CloseHandle(overlapped_.hEvent); - overlapped_.hEvent = NULL; - } -} - -// When the server thread serving clients is in the INITIAL state, -// try to connect to the pipe asynchronously. If the connection -// finishes synchronously, directly go into the CONNECTED state; -// otherwise go into the CONNECTING state. For any problems, go -// into the ERROR state. -void CrashGenerationServer::HandleInitialState() { - assert(server_state_ == IPC_SERVER_STATE_INITIAL); - - if (!ResetEvent(overlapped_.hEvent)) { - server_state_ = IPC_SERVER_STATE_ERROR; - return; - } - - bool success = ConnectNamedPipe(pipe_, &overlapped_) != FALSE; - - // From MSDN, it is not clear that when ConnectNamedPipe is used - // in an overlapped mode, will it ever return non-zero value, and - // if so, in what cases. - assert(!success); - - DWORD error_code = GetLastError(); - switch (error_code) { - case ERROR_IO_PENDING: - server_state_ = IPC_SERVER_STATE_CONNECTING; - break; - - case ERROR_PIPE_CONNECTED: - if (SetEvent(overlapped_.hEvent)) { - server_state_ = IPC_SERVER_STATE_CONNECTED; - } else { - server_state_ = IPC_SERVER_STATE_ERROR; - } - break; - - default: - server_state_ = IPC_SERVER_STATE_ERROR; - break; - } -} - -// When the server thread serving the clients is in the CONNECTING state, -// try to get the result of the asynchronous connection request using -// the OVERLAPPED object. If the result indicates the connection is done, -// go into the CONNECTED state. If the result indicates I/O is still -// INCOMPLETE, remain in the CONNECTING state. For any problems, -// go into the DISCONNECTING state. -void CrashGenerationServer::HandleConnectingState() { - assert(server_state_ == IPC_SERVER_STATE_CONNECTING); - - DWORD bytes_count = 0; - bool success = GetOverlappedResult(pipe_, - &overlapped_, - &bytes_count, - FALSE) != FALSE; - - if (success) { - server_state_ = IPC_SERVER_STATE_CONNECTED; - return; - } - - if (GetLastError() != ERROR_IO_INCOMPLETE) { - server_state_ = IPC_SERVER_STATE_DISCONNECTING; - } -} - -// When the server thread serving the clients is in the CONNECTED state, -// try to issue an asynchronous read from the pipe. If read completes -// synchronously or if I/O is pending then go into the READING state. -// For any problems, go into the DISCONNECTING state. -void CrashGenerationServer::HandleConnectedState() { - assert(server_state_ == IPC_SERVER_STATE_CONNECTED); - - DWORD bytes_count = 0; - memset(&msg_, 0, sizeof(msg_)); - bool success = ReadFile(pipe_, - &msg_, - sizeof(msg_), - &bytes_count, - &overlapped_) != FALSE; - - // Note that the asynchronous read issued above can finish before the - // code below executes. But, it is okay to change state after issuing - // the asynchronous read. This is because even if the asynchronous read - // is done, the callback for it would not be executed until the current - // thread finishes its execution. - if (success || GetLastError() == ERROR_IO_PENDING) { - server_state_ = IPC_SERVER_STATE_READING; - } else { - server_state_ = IPC_SERVER_STATE_DISCONNECTING; - } -} - -// When the server thread serving the clients is in the READING state, -// try to get the result of the async read. If async read is done, -// go into the READ_DONE state. For any problems, go into the -// DISCONNECTING state. -void CrashGenerationServer::HandleReadingState() { - assert(server_state_ == IPC_SERVER_STATE_READING); - - DWORD bytes_count = 0; - bool success = GetOverlappedResult(pipe_, - &overlapped_, - &bytes_count, - FALSE) != FALSE; - - if (success && bytes_count == sizeof(ProtocolMessage)) { - server_state_ = IPC_SERVER_STATE_READ_DONE; - return; - } - - DWORD error_code; - error_code = GetLastError(); - - // We should never get an I/O incomplete since we should not execute this - // unless the Read has finished and the overlapped event is signaled. If - // we do get INCOMPLETE, we have a bug in our code. - assert(error_code != ERROR_IO_INCOMPLETE); - - server_state_ = IPC_SERVER_STATE_DISCONNECTING; -} - -// When the server thread serving the client is in the READ_DONE state, -// validate the client's request message, register the client by -// creating appropriate objects and prepare the response. Then try to -// write the response to the pipe asynchronously. If that succeeds, -// go into the WRITING state. For any problems, go into the DISCONNECTING -// state. -void CrashGenerationServer::HandleReadDoneState() { - assert(server_state_ == IPC_SERVER_STATE_READ_DONE); - - if (!IsClientRequestValid(msg_)) { - server_state_ = IPC_SERVER_STATE_DISCONNECTING; - return; - } - - scoped_ptr client_info( - new ClientInfo(this, - msg_.pid, - msg_.dump_type, - msg_.thread_id, - msg_.exception_pointers, - msg_.assert_info, - msg_.custom_client_info)); - - if (!client_info->Initialize()) { - server_state_ = IPC_SERVER_STATE_DISCONNECTING; - return; - } - - if (!RespondToClient(client_info.get())) { - server_state_ = IPC_SERVER_STATE_DISCONNECTING; - return; - } - - // Note that the asynchronous write issued by RespondToClient function - // can finish before the code below executes. But it is okay to change - // state after issuing the asynchronous write. This is because even if - // the asynchronous write is done, the callback for it would not be - // executed until the current thread finishes its execution. - server_state_ = IPC_SERVER_STATE_WRITING; - client_info_ = client_info.release(); -} - -// When the server thread serving the clients is in the WRITING state, -// try to get the result of the async write. If the async write is done, -// go into the WRITE_DONE state. For any problems, go into the -// DISONNECTING state. -void CrashGenerationServer::HandleWritingState() { - assert(server_state_ == IPC_SERVER_STATE_WRITING); - - DWORD bytes_count = 0; - bool success = GetOverlappedResult(pipe_, - &overlapped_, - &bytes_count, - FALSE) != FALSE; - - if (success) { - server_state_ = IPC_SERVER_STATE_WRITE_DONE; - return; - } - - DWORD error_code; - error_code = GetLastError(); - - // We should never get an I/O incomplete since we should not execute this - // unless the Write has finished and the overlapped event is signaled. If - // we do get INCOMPLETE, we have a bug in our code. - assert(error_code != ERROR_IO_INCOMPLETE); - - server_state_ = IPC_SERVER_STATE_DISCONNECTING; -} - -// When the server thread serving the clients is in the WRITE_DONE state, -// try to issue an async read on the pipe. If the read completes synchronously -// or if I/O is still pending then go into the READING_ACK state. For any -// issues, go into the DISCONNECTING state. -void CrashGenerationServer::HandleWriteDoneState() { - assert(server_state_ == IPC_SERVER_STATE_WRITE_DONE); - - server_state_ = IPC_SERVER_STATE_READING_ACK; - - DWORD bytes_count = 0; - bool success = ReadFile(pipe_, - &msg_, - sizeof(msg_), - &bytes_count, - &overlapped_) != FALSE; - - if (success) { - return; - } - - DWORD error_code = GetLastError(); - - if (error_code != ERROR_IO_PENDING) { - server_state_ = IPC_SERVER_STATE_DISCONNECTING; - } -} - -// When the server thread serving the clients is in the READING_ACK state, -// try to get result of async read. Go into the DISCONNECTING state. -void CrashGenerationServer::HandleReadingAckState() { - assert(server_state_ == IPC_SERVER_STATE_READING_ACK); - - DWORD bytes_count = 0; - bool success = GetOverlappedResult(pipe_, - &overlapped_, - &bytes_count, - FALSE) != FALSE; - - if (success) { - // The connection handshake with the client is now complete; perform - // the callback. - if (connect_callback_) { - connect_callback_(connect_context_, client_info_); - } - } else { - DWORD error_code = GetLastError(); - - // We should never get an I/O incomplete since we should not execute this - // unless the Read has finished and the overlapped event is signaled. If - // we do get INCOMPLETE, we have a bug in our code. - assert(error_code != ERROR_IO_INCOMPLETE); - } - - server_state_ = IPC_SERVER_STATE_DISCONNECTING; -} - -// When the server thread serving the client is in the DISCONNECTING state, -// disconnect from the pipe and reset the event. If anything fails, go into -// the ERROR state. If it goes well, go into the INITIAL state and set the -// event to start all over again. -void CrashGenerationServer::HandleDisconnectingState() { - assert(server_state_ == IPC_SERVER_STATE_DISCONNECTING); - - // Done serving the client. - client_info_ = NULL; - - overlapped_.Internal = NULL; - overlapped_.InternalHigh = NULL; - overlapped_.Offset = 0; - overlapped_.OffsetHigh = 0; - overlapped_.Pointer = NULL; - - if (!ResetEvent(overlapped_.hEvent)) { - server_state_ = IPC_SERVER_STATE_ERROR; - return; - } - - if (!DisconnectNamedPipe(pipe_)) { - server_state_ = IPC_SERVER_STATE_ERROR; - return; - } - - // If the server is shutting down do not connect to the - // next client. - if (shutting_down_) { - return; - } - - server_state_ = IPC_SERVER_STATE_INITIAL; - if (!SetEvent(overlapped_.hEvent)) { - server_state_ = IPC_SERVER_STATE_ERROR; - } -} - -bool CrashGenerationServer::PrepareReply(const ClientInfo& client_info, - ProtocolMessage* reply) const { - reply->tag = MESSAGE_TAG_REGISTRATION_RESPONSE; - reply->pid = GetCurrentProcessId(); - - if (CreateClientHandles(client_info, reply)) { - return true; - } - - if (reply->dump_request_handle) { - CloseHandle(reply->dump_request_handle); - } - - if (reply->dump_generated_handle) { - CloseHandle(reply->dump_generated_handle); - } - - if (reply->server_alive_handle) { - CloseHandle(reply->server_alive_handle); - } - - return false; -} - -bool CrashGenerationServer::CreateClientHandles(const ClientInfo& client_info, - ProtocolMessage* reply) const { - HANDLE current_process = GetCurrentProcess(); - if (!DuplicateHandle(current_process, - client_info.dump_requested_handle(), - client_info.process_handle(), - &reply->dump_request_handle, - kDumpRequestEventAccess, - FALSE, - 0)) { - return false; - } - - if (!DuplicateHandle(current_process, - client_info.dump_generated_handle(), - client_info.process_handle(), - &reply->dump_generated_handle, - kDumpGeneratedEventAccess, - FALSE, - 0)) { - return false; - } - - if (!DuplicateHandle(current_process, - server_alive_handle_, - client_info.process_handle(), - &reply->server_alive_handle, - kMutexAccess, - FALSE, - 0)) { - return false; - } - - return true; -} - -bool CrashGenerationServer::RespondToClient(ClientInfo* client_info) { - ProtocolMessage reply; - if (!PrepareReply(*client_info, &reply)) { - return false; - } - - if (!AddClient(client_info)) { - return false; - } - - DWORD bytes_count = 0; - bool success = WriteFile(pipe_, - &reply, - sizeof(reply), - &bytes_count, - &overlapped_) != FALSE; - - return success || GetLastError() == ERROR_IO_PENDING; -} - -// The server thread servicing the clients runs this method. The method -// implements the state machine described in ReadMe.txt along with the -// helper methods HandleXXXState. -void CrashGenerationServer::HandleConnectionRequest() { - // If we are shutting doen then get into ERROR state, reset the event so more - // workers don't run and return immediately. - if (shutting_down_) { - server_state_ = IPC_SERVER_STATE_ERROR; - ResetEvent(overlapped_.hEvent); - return; - } - - switch (server_state_) { - case IPC_SERVER_STATE_ERROR: - HandleErrorState(); - break; - - case IPC_SERVER_STATE_INITIAL: - HandleInitialState(); - break; - - case IPC_SERVER_STATE_CONNECTING: - HandleConnectingState(); - break; - - case IPC_SERVER_STATE_CONNECTED: - HandleConnectedState(); - break; - - case IPC_SERVER_STATE_READING: - HandleReadingState(); - break; - - case IPC_SERVER_STATE_READ_DONE: - HandleReadDoneState(); - break; - - case IPC_SERVER_STATE_WRITING: - HandleWritingState(); - break; - - case IPC_SERVER_STATE_WRITE_DONE: - HandleWriteDoneState(); - break; - - case IPC_SERVER_STATE_READING_ACK: - HandleReadingAckState(); - break; - - case IPC_SERVER_STATE_DISCONNECTING: - HandleDisconnectingState(); - break; - - default: - assert(false); - // This indicates that we added one more state without - // adding handling code. - server_state_ = IPC_SERVER_STATE_ERROR; - break; - } -} - -bool CrashGenerationServer::AddClient(ClientInfo* client_info) { - HANDLE request_wait_handle = NULL; - if (!RegisterWaitForSingleObject(&request_wait_handle, - client_info->dump_requested_handle(), - OnDumpRequest, - client_info, - INFINITE, - kDumpRequestThreadFlags)) { - return false; - } - - client_info->set_dump_request_wait_handle(request_wait_handle); - - // OnClientEnd will be called when the client process terminates. - HANDLE process_wait_handle = NULL; - if (!RegisterWaitForSingleObject(&process_wait_handle, - client_info->process_handle(), - OnClientEnd, - client_info, - INFINITE, - WT_EXECUTEONLYONCE)) { - return false; - } - - client_info->set_process_exit_wait_handle(process_wait_handle); - - // New scope to hold the lock for the shortest time. - { - AutoCriticalSection lock(&clients_sync_); - clients_.push_back(client_info); - } - - return true; -} - -// static -void CALLBACK CrashGenerationServer::OnPipeConnected(void* context, BOOLEAN) { - assert (context); - - CrashGenerationServer* obj = - reinterpret_cast(context); - obj->HandleConnectionRequest(); -} - -// static -void CALLBACK CrashGenerationServer::OnDumpRequest(void* context, BOOLEAN) { - assert(context); - ClientInfo* client_info = reinterpret_cast(context); - client_info->PopulateCustomInfo(); - - CrashGenerationServer* crash_server = client_info->crash_server(); - assert(crash_server); - crash_server->HandleDumpRequest(*client_info); - - ResetEvent(client_info->dump_requested_handle()); -} - -// static -void CALLBACK CrashGenerationServer::OnClientEnd(void* context, BOOLEAN) { - assert(context); - ClientInfo* client_info = reinterpret_cast(context); - - CrashGenerationServer* crash_server = client_info->crash_server(); - assert(crash_server); - - InterlockedIncrement(&crash_server->cleanup_item_count_); - - if (!QueueUserWorkItem(CleanupClient, context, WT_EXECUTEDEFAULT)) { - InterlockedDecrement(&crash_server->cleanup_item_count_); - } -} - -// static -DWORD WINAPI CrashGenerationServer::CleanupClient(void* context) { - assert(context); - ClientInfo* client_info = reinterpret_cast(context); - - CrashGenerationServer* crash_server = client_info->crash_server(); - assert(crash_server); - - if (crash_server->exit_callback_) { - crash_server->exit_callback_(crash_server->exit_context_, client_info); - } - - crash_server->DoCleanup(client_info); - - InterlockedDecrement(&crash_server->cleanup_item_count_); - return 0; -} - -void CrashGenerationServer::DoCleanup(ClientInfo* client_info) { - assert(client_info); - - // Start a new scope to release lock automatically. - { - AutoCriticalSection lock(&clients_sync_); - clients_.remove(client_info); - } - - delete client_info; -} - -void CrashGenerationServer::HandleDumpRequest(const ClientInfo& client_info) { - // Generate the dump only if it's explicitly requested by the - // server application; otherwise the server might want to generate - // dump in the callback. - std::wstring dump_path; - if (generate_dumps_) { - if (!GenerateDump(client_info, &dump_path)) { - return; - } - } - - if (dump_callback_) { - std::wstring* ptr_dump_path = (dump_path == L"") ? NULL : &dump_path; - dump_callback_(dump_context_, &client_info, ptr_dump_path); - } - - SetEvent(client_info.dump_generated_handle()); -} - -bool CrashGenerationServer::GenerateDump(const ClientInfo& client, - std::wstring* dump_path) { - assert(client.pid() != 0); - assert(client.process_handle()); - - // We have to get the address of EXCEPTION_INFORMATION from - // the client process address space. - EXCEPTION_POINTERS* client_ex_info = NULL; - if (!client.GetClientExceptionInfo(&client_ex_info)) { - return false; - } - - DWORD client_thread_id = 0; - if (!client.GetClientThreadId(&client_thread_id)) { - return false; - } - - return dump_generator_->WriteMinidump(client.process_handle(), - client.pid(), - client_thread_id, - GetCurrentThreadId(), - client_ex_info, - client.assert_info(), - client.dump_type(), - true, - dump_path); -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h b/share/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h deleted file mode 100644 index cacb639aee64382332cb081430f6f9b4cab324d6..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/crash_generation_server.h +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright (c) 2008, 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. - -#ifndef CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ -#define CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ - -#include -#include -#include "client/windows/common/ipc_protocol.h" -#include "client/windows/crash_generation/client_info.h" -#include "client/windows/crash_generation/minidump_generator.h" -#include "processor/scoped_ptr.h" - -namespace google_breakpad { - -// Abstraction for server side implementation of out-of-process crash -// generation protocol for Windows platform only. It generates Windows -// minidump files for client processes that request dump generation. When -// the server is requested to start listening for clients (by calling the -// Start method), it creates a named pipe and waits for the clients to -// register. In response, it hands them event handles that the client can -// signal to request dump generation. When the clients request dump -// generation in this way, the server generates Windows minidump files. -class CrashGenerationServer { - public: - typedef void (*OnClientConnectedCallback)(void* context, - const ClientInfo* client_info); - - typedef void (*OnClientDumpRequestCallback)(void* context, - const ClientInfo* client_info, - const std::wstring* file_path); - - typedef void (*OnClientExitedCallback)(void* context, - const ClientInfo* client_info); - - // Creates an instance with the given parameters. - // - // Parameter pipe_name: Name of the Windows named pipe - // Parameter pipe_sec_attrs Security attributes to set on the pipe. Pass - // NULL to use default security on the pipe. By default, the pipe created - // allows Local System, Administrators and the Creator full control and - // the Everyone group read access on the pipe. - // Parameter connect_callback: Callback for a new client connection. - // Parameter connect_context: Context for client connection callback. - // Parameter crash_callback: Callback for a client crash dump request. - // Parameter crash_context: Context for client crash dump request callback. - // Parameter exit_callback: Callback for client process exit. - // Parameter exit_context: Context for client exit callback. - // Parameter generate_dumps: Whether to automatically generate dumps. - // Client code of this class might want to generate dumps explicitly in the - // crash dump request callback. In that case, false can be passed for this - // parameter. - // Parameter dump_path: Path for generating dumps; required only if true is - // passed for generateDumps parameter; NULL can be passed otherwise. - CrashGenerationServer(const std::wstring& pipe_name, - SECURITY_ATTRIBUTES* pipe_sec_attrs, - OnClientConnectedCallback connect_callback, - void* connect_context, - OnClientDumpRequestCallback dump_callback, - void* dump_context, - OnClientExitedCallback exit_callback, - void* exit_context, - bool generate_dumps, - const std::wstring* dump_path); - - ~CrashGenerationServer(); - - // Performs initialization steps needed to start listening to clients. - // - // Returns true if initialization is successful; false otherwise. - bool Start(); - - private: - // Various states the client can be in during the handshake with - // the server. - enum IPCServerState { - // Server is in error state and it cannot serve any clients. - IPC_SERVER_STATE_ERROR, - - // Server starts in this state. - IPC_SERVER_STATE_INITIAL, - - // Server has issued an async connect to the pipe and it is waiting - // for the connection to be established. - IPC_SERVER_STATE_CONNECTING, - - // Server is connected successfully. - IPC_SERVER_STATE_CONNECTED, - - // Server has issued an async read from the pipe and it is waiting for - // the read to finish. - IPC_SERVER_STATE_READING, - - // Server is done reading from the pipe. - IPC_SERVER_STATE_READ_DONE, - - // Server has issued an async write to the pipe and it is waiting for - // the write to finish. - IPC_SERVER_STATE_WRITING, - - // Server is done writing to the pipe. - IPC_SERVER_STATE_WRITE_DONE, - - // Server has issued an async read from the pipe for an ack and it - // is waiting for the read to finish. - IPC_SERVER_STATE_READING_ACK, - - // Server is done writing to the pipe and it is now ready to disconnect - // and reconnect. - IPC_SERVER_STATE_DISCONNECTING - }; - - // - // Helper methods to handle various server IPC states. - // - void HandleErrorState(); - void HandleInitialState(); - void HandleConnectingState(); - void HandleConnectedState(); - void HandleReadingState(); - void HandleReadDoneState(); - void HandleWritingState(); - void HandleWriteDoneState(); - void HandleReadingAckState(); - void HandleDisconnectingState(); - - // Prepares reply for a client from the given parameters. - bool PrepareReply(const ClientInfo& client_info, - ProtocolMessage* reply) const; - - // Duplicates various handles in the ClientInfo object for the client - // process and stores them in the given ProtocolMessage instance. If - // creating any handle fails, ProtocolMessage will contain the handles - // already created successfully, which should be closed by the caller. - bool CreateClientHandles(const ClientInfo& client_info, - ProtocolMessage* reply) const; - - // Response to the given client. Return true if all steps of - // responding to the client succeed, false otherwise. - bool RespondToClient(ClientInfo* client_info); - - // Handles a connection request from the client. - void HandleConnectionRequest(); - - // Handles a dump request from the client. - void HandleDumpRequest(const ClientInfo& client_info); - - // Callback for pipe connected event. - static void CALLBACK OnPipeConnected(void* context, BOOLEAN timer_or_wait); - - // Callback for a dump request. - static void CALLBACK OnDumpRequest(void* context, BOOLEAN timer_or_wait); - - // Callback for client process exit event. - static void CALLBACK OnClientEnd(void* context, BOOLEAN timer_or_wait); - - // Releases resources for a client. - static DWORD WINAPI CleanupClient(void* context); - - // Cleans up for the given client. - void DoCleanup(ClientInfo* client_info); - - // Adds the given client to the list of registered clients. - bool AddClient(ClientInfo* client_info); - - // Generates dump for the given client. - bool GenerateDump(const ClientInfo& client, std::wstring* dump_path); - - // Sync object for thread-safe access to the shared list of clients. - CRITICAL_SECTION clients_sync_; - - // List of clients. - std::list clients_; - - // Pipe name. - std::wstring pipe_name_; - - // Pipe security attributes - SECURITY_ATTRIBUTES* pipe_sec_attrs_; - - // Handle to the pipe used for handshake with clients. - HANDLE pipe_; - - // Pipe wait handle. - HANDLE pipe_wait_handle_; - - // Handle to server-alive mutex. - HANDLE server_alive_handle_; - - // Callback for a successful client connection. - OnClientConnectedCallback connect_callback_; - - // Context for client connected callback. - void* connect_context_; - - // Callback for a client dump request. - OnClientDumpRequestCallback dump_callback_; - - // Context for client dump request callback. - void* dump_context_; - - // Callback for client process exit. - OnClientExitedCallback exit_callback_; - - // Context for client process exit callback. - void* exit_context_; - - // Whether to generate dumps. - bool generate_dumps_; - - // Instance of a mini dump generator. - scoped_ptr dump_generator_; - - // State of the server in performing the IPC with the client. - // Note that since we restrict the pipe to one instance, we - // only need to keep one state of the server. Otherwise, server - // would have one state per client it is talking to. - volatile IPCServerState server_state_; - - // Whether the server is shutting down. - volatile bool shutting_down_; - - // Overlapped instance for async I/O on the pipe. - OVERLAPPED overlapped_; - - // Message object used in IPC with the client. - ProtocolMessage msg_; - - // Client Info for the client that's connecting to the server. - ClientInfo* client_info_; - - // Count of clean-up work items that are currently running or are - // already queued to run. - volatile LONG cleanup_item_count_; - - // Disable copy ctor and operator=. - CrashGenerationServer(const CrashGenerationServer& crash_server); - CrashGenerationServer& operator=(const CrashGenerationServer& crash_server); -}; - -} // namespace google_breakpad - -#endif // CLIENT_WINDOWS_CRASH_GENERATION_CRASH_GENERATION_SERVER_H__ diff --git a/share/google-breakpad/src/client/windows/crash_generation/minidump_generator.cc b/share/google-breakpad/src/client/windows/crash_generation/minidump_generator.cc deleted file mode 100644 index c03b191ae26501be4c3934e9c900254a566b1f48..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/minidump_generator.cc +++ /dev/null @@ -1,289 +0,0 @@ -// Copyright (c) 2008, 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. - -#include "client/windows/crash_generation/minidump_generator.h" -#include -#include "client/windows/common/auto_critical_section.h" -#include "common/windows/guid_string.h" - -using std::wstring; - -namespace google_breakpad { - -MinidumpGenerator::MinidumpGenerator(const wstring& dump_path) - : dbghelp_module_(NULL), - rpcrt4_module_(NULL), - dump_path_(dump_path), - write_dump_(NULL), - create_uuid_(NULL) { - InitializeCriticalSection(&module_load_sync_); - InitializeCriticalSection(&get_proc_address_sync_); -} - -MinidumpGenerator::~MinidumpGenerator() { - if (dbghelp_module_) { - FreeLibrary(dbghelp_module_); - } - - if (rpcrt4_module_) { - FreeLibrary(rpcrt4_module_); - } - - DeleteCriticalSection(&get_proc_address_sync_); - DeleteCriticalSection(&module_load_sync_); -} - -bool MinidumpGenerator::WriteMinidump(HANDLE process_handle, - DWORD process_id, - DWORD thread_id, - DWORD requesting_thread_id, - EXCEPTION_POINTERS* exception_pointers, - MDRawAssertionInfo* assert_info, - MINIDUMP_TYPE dump_type, - bool is_client_pointers, - wstring* dump_path) { - MiniDumpWriteDumpType write_dump = GetWriteDump(); - if (!write_dump) { - return false; - } - - wstring dump_file_path; - if (!GenerateDumpFilePath(&dump_file_path)) { - return false; - } - - // If the client requests a full memory dump, we will write a normal mini - // dump and a full memory dump. Both dump files use the same uuid as file - // name prefix. - bool full_memory_dump = (dump_type & MiniDumpWithFullMemory) != 0; - wstring full_dump_file_path; - if (full_memory_dump) { - full_dump_file_path.assign(dump_file_path); - full_dump_file_path.resize(full_dump_file_path.size() - 4); // strip .dmp - full_dump_file_path.append(TEXT("-full.dmp")); - } - - HANDLE dump_file = CreateFile(dump_file_path.c_str(), - GENERIC_WRITE, - 0, - NULL, - CREATE_NEW, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (dump_file == INVALID_HANDLE_VALUE) { - return false; - } - - HANDLE full_dump_file = INVALID_HANDLE_VALUE; - if (full_memory_dump) { - full_dump_file = CreateFile(full_dump_file_path.c_str(), - GENERIC_WRITE, - 0, - NULL, - CREATE_NEW, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (full_dump_file == INVALID_HANDLE_VALUE) { - CloseHandle(dump_file); - return false; - } - } - - MINIDUMP_EXCEPTION_INFORMATION* dump_exception_pointers = NULL; - MINIDUMP_EXCEPTION_INFORMATION dump_exception_info; - - // Setup the exception information object only if it's a dump - // due to an exception. - if (exception_pointers) { - dump_exception_pointers = &dump_exception_info; - dump_exception_info.ThreadId = thread_id; - dump_exception_info.ExceptionPointers = exception_pointers; - dump_exception_info.ClientPointers = is_client_pointers; - } - - // Add an MDRawBreakpadInfo stream to the minidump, to provide additional - // information about the exception handler to the Breakpad processor. - // The information will help the processor determine which threads are - // relevant. The Breakpad processor does not require this information but - // can function better with Breakpad-generated dumps when it is present. - // The native debugger is not harmed by the presence of this information. - MDRawBreakpadInfo breakpad_info = {0}; - if (!is_client_pointers) { - // Set the dump thread id and requesting thread id only in case of - // in-process dump generation. - breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | - MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; - breakpad_info.dump_thread_id = thread_id; - breakpad_info.requesting_thread_id = requesting_thread_id; - } - - // Leave room in user_stream_array for a possible assertion info stream. - MINIDUMP_USER_STREAM user_stream_array[2]; - user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM; - user_stream_array[0].BufferSize = sizeof(breakpad_info); - user_stream_array[0].Buffer = &breakpad_info; - - MINIDUMP_USER_STREAM_INFORMATION user_streams; - user_streams.UserStreamCount = 1; - user_streams.UserStreamArray = user_stream_array; - - MDRawAssertionInfo* actual_assert_info = assert_info; - MDRawAssertionInfo client_assert_info = {0}; - - if (assert_info) { - // If the assertion info object lives in the client process, - // read the memory of the client process. - if (is_client_pointers) { - SIZE_T bytes_read = 0; - if (!ReadProcessMemory(process_handle, - assert_info, - &client_assert_info, - sizeof(client_assert_info), - &bytes_read)) { - CloseHandle(dump_file); - if (full_dump_file != INVALID_HANDLE_VALUE) - CloseHandle(full_dump_file); - return false; - } - - if (bytes_read != sizeof(client_assert_info)) { - CloseHandle(dump_file); - if (full_dump_file != INVALID_HANDLE_VALUE) - CloseHandle(full_dump_file); - return false; - } - - actual_assert_info = &client_assert_info; - } - - user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM; - user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo); - user_stream_array[1].Buffer = actual_assert_info; - ++user_streams.UserStreamCount; - } - - bool result_minidump = write_dump( - process_handle, - process_id, - dump_file, - static_cast((dump_type & (~MiniDumpWithFullMemory)) - | MiniDumpNormal), - exception_pointers ? &dump_exception_info : NULL, - &user_streams, - NULL) != FALSE; - - bool result_full_memory = true; - if (full_memory_dump) { - result_full_memory = write_dump( - process_handle, - process_id, - full_dump_file, - static_cast(dump_type & (~MiniDumpNormal)), - exception_pointers ? &dump_exception_info : NULL, - &user_streams, - NULL) != FALSE; - } - - bool result = result_minidump && result_full_memory; - - CloseHandle(dump_file); - if (full_dump_file != INVALID_HANDLE_VALUE) - CloseHandle(full_dump_file); - - // Store the path of the dump file in the out parameter if dump generation - // succeeded. - if (result && dump_path) { - *dump_path = dump_file_path; - } - - return result; -} - -HMODULE MinidumpGenerator::GetDbghelpModule() { - AutoCriticalSection lock(&module_load_sync_); - if (!dbghelp_module_) { - dbghelp_module_ = LoadLibrary(TEXT("dbghelp.dll")); - } - - return dbghelp_module_; -} - -MinidumpGenerator::MiniDumpWriteDumpType MinidumpGenerator::GetWriteDump() { - AutoCriticalSection lock(&get_proc_address_sync_); - if (!write_dump_) { - HMODULE module = GetDbghelpModule(); - if (module) { - FARPROC proc = GetProcAddress(module, "MiniDumpWriteDump"); - write_dump_ = reinterpret_cast(proc); - } - } - - return write_dump_; -} - -HMODULE MinidumpGenerator::GetRpcrt4Module() { - AutoCriticalSection lock(&module_load_sync_); - if (!rpcrt4_module_) { - rpcrt4_module_ = LoadLibrary(TEXT("rpcrt4.dll")); - } - - return rpcrt4_module_; -} - -MinidumpGenerator::UuidCreateType MinidumpGenerator::GetCreateUuid() { - AutoCriticalSection lock(&module_load_sync_); - if (!create_uuid_) { - HMODULE module = GetRpcrt4Module(); - if (module) { - FARPROC proc = GetProcAddress(module, "UuidCreate"); - create_uuid_ = reinterpret_cast(proc); - } - } - - return create_uuid_; -} - -bool MinidumpGenerator::GenerateDumpFilePath(wstring* file_path) { - UUID id = {0}; - - UuidCreateType create_uuid = GetCreateUuid(); - if(!create_uuid) { - return false; - } - - create_uuid(&id); - wstring id_str = GUIDString::GUIDToWString(&id); - - *file_path = dump_path_ + TEXT("\\") + id_str + TEXT(".dmp"); - return true; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/windows/crash_generation/minidump_generator.h b/share/google-breakpad/src/client/windows/crash_generation/minidump_generator.h deleted file mode 100644 index 8ab6a8f66f0a3d5408c37456c1a78819b70a24b6..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/crash_generation/minidump_generator.h +++ /dev/null @@ -1,121 +0,0 @@ -// Copyright (c) 2008, 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. - -#ifndef CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ -#define CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ - -#include -#include -#include -#include "google_breakpad/common/minidump_format.h" - -namespace google_breakpad { - -// Abstraction for various objects and operations needed to generate -// minidump on Windows. This abstraction is useful to hide all the gory -// details for minidump generation and provide a clean interface to -// the clients to generate minidumps. -class MinidumpGenerator { - public: - // Creates an instance with the given dump path. - explicit MinidumpGenerator(const std::wstring& dump_path); - - ~MinidumpGenerator(); - - // Writes the minidump with the given parameters. Stores the - // dump file path in the dump_path parameter if dump generation - // succeeds. - bool WriteMinidump(HANDLE process_handle, - DWORD process_id, - DWORD thread_id, - DWORD requesting_thread_id, - EXCEPTION_POINTERS* exception_pointers, - MDRawAssertionInfo* assert_info, - MINIDUMP_TYPE dump_type, - bool is_client_pointers, - std::wstring* dump_path); - - private: - // Function pointer type for MiniDumpWriteDump, which is looked up - // dynamically. - typedef BOOL (WINAPI* MiniDumpWriteDumpType)( - HANDLE hProcess, - DWORD ProcessId, - HANDLE hFile, - MINIDUMP_TYPE DumpType, - CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); - - // Function pointer type for UuidCreate, which is looked up dynamically. - typedef RPC_STATUS (RPC_ENTRY* UuidCreateType)(UUID* Uuid); - - // Loads the appropriate DLL lazily in a thread safe way. - HMODULE GetDbghelpModule(); - - // Loads the appropriate DLL and gets a pointer to the MiniDumpWriteDump - // function lazily and in a thread-safe manner. - MiniDumpWriteDumpType GetWriteDump(); - - // Loads the appropriate DLL lazily in a thread safe way. - HMODULE GetRpcrt4Module(); - - // Loads the appropriate DLL and gets a pointer to the UuidCreate - // function lazily and in a thread-safe manner. - UuidCreateType GetCreateUuid(); - - // Returns the path for the file to write dump to. - bool GenerateDumpFilePath(std::wstring* file_path); - - // Handle to dynamically loaded DbgHelp.dll. - HMODULE dbghelp_module_; - - // Pointer to the MiniDumpWriteDump function. - MiniDumpWriteDumpType write_dump_; - - // Handle to dynamically loaded rpcrt4.dll. - HMODULE rpcrt4_module_; - - // Pointer to the UuidCreate function. - UuidCreateType create_uuid_; - - // Folder path to store dump files. - std::wstring dump_path_; - - // Critical section to sychronize action of loading modules dynamically. - CRITICAL_SECTION module_load_sync_; - - // Critical section to synchronize action of dynamically getting function - // addresses from modules. - CRITICAL_SECTION get_proc_address_sync_; -}; - -} // namespace google_breakpad - -#endif // CLIENT_WINDOWS_CRASH_GENERATION_MINIDUMP_GENERATION_H__ diff --git a/share/google-breakpad/src/client/windows/handler/exception_handler.cc b/share/google-breakpad/src/client/windows/handler/exception_handler.cc deleted file mode 100644 index be9e5eb21ad8a4e4da7e58f748355aec35c72621..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/handler/exception_handler.cc +++ /dev/null @@ -1,748 +0,0 @@ -// Copyright (c) 2006, 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. - -#include - -#include -#include - -#include "common/windows/string_utils-inl.h" - -#include "client/windows/common/ipc_protocol.h" -#include "client/windows/handler/exception_handler.h" -#include "common/windows/guid_string.h" - -namespace google_breakpad { - -static const int kWaitForHandlerThreadMs = 60000; -static const int kExceptionHandlerThreadInitialStackSize = 64 * 1024; - -vector* ExceptionHandler::handler_stack_ = NULL; -LONG ExceptionHandler::handler_stack_index_ = 0; -CRITICAL_SECTION ExceptionHandler::handler_stack_critical_section_; -volatile LONG ExceptionHandler::instance_count_ = 0; - -ExceptionHandler::ExceptionHandler(const wstring& dump_path, - FilterCallback filter, - MinidumpCallback callback, - void* callback_context, - int handler_types, - MINIDUMP_TYPE dump_type, - const wchar_t* pipe_name, - const CustomClientInfo* custom_info) { - Initialize(dump_path, - filter, - callback, - callback_context, - handler_types, - dump_type, - pipe_name, - custom_info); -} - -ExceptionHandler::ExceptionHandler(const wstring &dump_path, - FilterCallback filter, - MinidumpCallback callback, - void* callback_context, - int handler_types) { - Initialize(dump_path, - filter, - callback, - callback_context, - handler_types, - MiniDumpNormal, - NULL, - NULL); -} - -void ExceptionHandler::Initialize(const wstring& dump_path, - FilterCallback filter, - MinidumpCallback callback, - void* callback_context, - int handler_types, - MINIDUMP_TYPE dump_type, - const wchar_t* pipe_name, - const CustomClientInfo* custom_info) { - LONG instance_count = InterlockedIncrement(&instance_count_); - filter_ = filter; - callback_ = callback; - callback_context_ = callback_context; - dump_path_c_ = NULL; - next_minidump_id_c_ = NULL; - next_minidump_path_c_ = NULL; - dbghelp_module_ = NULL; - minidump_write_dump_ = NULL; - dump_type_ = dump_type; - rpcrt4_module_ = NULL; - uuid_create_ = NULL; - handler_types_ = handler_types; - previous_filter_ = NULL; -#if _MSC_VER >= 1400 // MSVC 2005/8 - previous_iph_ = NULL; -#endif // _MSC_VER >= 1400 - previous_pch_ = NULL; - handler_thread_ = NULL; - is_shutdown_ = false; - handler_start_semaphore_ = NULL; - handler_finish_semaphore_ = NULL; - requesting_thread_id_ = 0; - exception_info_ = NULL; - assertion_ = NULL; - handler_return_value_ = false; - handle_debug_exceptions_ = false; - - // Attempt to use out-of-process if user has specified pipe name. - if (pipe_name != NULL) { - scoped_ptr client( - new CrashGenerationClient(pipe_name, - dump_type_, - custom_info)); - - // If successful in registering with the monitoring process, - // there is no need to setup in-process crash generation. - if (client->Register()) { - crash_generation_client_.reset(client.release()); - } - } - - if (!IsOutOfProcess()) { - // Either client did not ask for out-of-process crash generation - // or registration with the server process failed. In either case, - // setup to do in-process crash generation. - - // Set synchronization primitives and the handler thread. Each - // ExceptionHandler object gets its own handler thread because that's the - // only way to reliably guarantee sufficient stack space in an exception, - // and it allows an easy way to get a snapshot of the requesting thread's - // context outside of an exception. - InitializeCriticalSection(&handler_critical_section_); - handler_start_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); - assert(handler_start_semaphore_ != NULL); - - handler_finish_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); - assert(handler_finish_semaphore_ != NULL); - - // Don't attempt to create the thread if we could not create the semaphores. - if (handler_finish_semaphore_ != NULL && handler_start_semaphore_ != NULL) { - DWORD thread_id; - handler_thread_ = CreateThread(NULL, // lpThreadAttributes - kExceptionHandlerThreadInitialStackSize, - ExceptionHandlerThreadMain, - this, // lpParameter - 0, // dwCreationFlags - &thread_id); - assert(handler_thread_ != NULL); - } - - dbghelp_module_ = LoadLibrary(L"dbghelp.dll"); - if (dbghelp_module_) { - minidump_write_dump_ = reinterpret_cast( - GetProcAddress(dbghelp_module_, "MiniDumpWriteDump")); - } - - // Load this library dynamically to not affect existing projects. Most - // projects don't link against this directly, it's usually dynamically - // loaded by dependent code. - rpcrt4_module_ = LoadLibrary(L"rpcrt4.dll"); - if (rpcrt4_module_) { - uuid_create_ = reinterpret_cast( - GetProcAddress(rpcrt4_module_, "UuidCreate")); - } - - // set_dump_path calls UpdateNextID. This sets up all of the path and id - // strings, and their equivalent c_str pointers. - set_dump_path(dump_path); - } - - // There is a race condition here. If the first instance has not yet - // initialized the critical section, the second (and later) instances may - // try to use uninitialized critical section object. The feature of multiple - // instances in one module is not used much, so leave it as is for now. - // One way to solve this in the current design (that is, keeping the static - // handler stack) is to use spin locks with volatile bools to synchronize - // the handler stack. This works only if the compiler guarantees to generate - // cache coherent code for volatile. - // TODO(munjal): Fix this in a better way by changing the design if possible. - - // Lazy initialization of the handler_stack_critical_section_ - if (instance_count == 1) { - InitializeCriticalSection(&handler_stack_critical_section_); - } - - if (handler_types != HANDLER_NONE) { - EnterCriticalSection(&handler_stack_critical_section_); - - // The first time an ExceptionHandler that installs a handler is - // created, set up the handler stack. - if (!handler_stack_) { - handler_stack_ = new vector(); - } - handler_stack_->push_back(this); - - if (handler_types & HANDLER_EXCEPTION) - previous_filter_ = SetUnhandledExceptionFilter(HandleException); - -#if _MSC_VER >= 1400 // MSVC 2005/8 - if (handler_types & HANDLER_INVALID_PARAMETER) - previous_iph_ = _set_invalid_parameter_handler(HandleInvalidParameter); -#endif // _MSC_VER >= 1400 - - if (handler_types & HANDLER_PURECALL) - previous_pch_ = _set_purecall_handler(HandlePureVirtualCall); - - LeaveCriticalSection(&handler_stack_critical_section_); - } -} - -ExceptionHandler::~ExceptionHandler() { - if (dbghelp_module_) { - FreeLibrary(dbghelp_module_); - } - - if (rpcrt4_module_) { - FreeLibrary(rpcrt4_module_); - } - - if (handler_types_ != HANDLER_NONE) { - EnterCriticalSection(&handler_stack_critical_section_); - - if (handler_types_ & HANDLER_EXCEPTION) - SetUnhandledExceptionFilter(previous_filter_); - -#if _MSC_VER >= 1400 // MSVC 2005/8 - if (handler_types_ & HANDLER_INVALID_PARAMETER) - _set_invalid_parameter_handler(previous_iph_); -#endif // _MSC_VER >= 1400 - - if (handler_types_ & HANDLER_PURECALL) - _set_purecall_handler(previous_pch_); - - if (handler_stack_->back() == this) { - handler_stack_->pop_back(); - } else { - // TODO(mmentovai): use advapi32!ReportEvent to log the warning to the - // system's application event log. - fprintf(stderr, "warning: removing Breakpad handler out of order\n"); - vector::iterator iterator = handler_stack_->begin(); - while (iterator != handler_stack_->end()) { - if (*iterator == this) { - iterator = handler_stack_->erase(iterator); - } else { - ++iterator; - } - } - } - - if (handler_stack_->empty()) { - // When destroying the last ExceptionHandler that installed a handler, - // clean up the handler stack. - delete handler_stack_; - handler_stack_ = NULL; - } - - LeaveCriticalSection(&handler_stack_critical_section_); - } - - // Some of the objects were only initialized if out of process - // registration was not done. - if (!IsOutOfProcess()) { -#ifdef BREAKPAD_NO_TERMINATE_THREAD - // Clean up the handler thread and synchronization primitives. The handler - // thread is either waiting on the semaphore to handle a crash or it is - // handling a crash. Coming out of the wait is fast but wait more in the - // eventuality a crash is handled. This compilation option results in a - // deadlock if the exception handler is destroyed while executing code - // inside DllMain. - is_shutdown_ = true; - ReleaseSemaphore(handler_start_semaphore_, 1, NULL); - WaitForSingleObject(handler_thread_, kWaitForHandlerThreadMs); -#else - TerminateThread(handler_thread_, 1); -#endif // BREAKPAD_NO_TERMINATE_THREAD - - CloseHandle(handler_thread_); - handler_thread_ = NULL; - DeleteCriticalSection(&handler_critical_section_); - CloseHandle(handler_start_semaphore_); - CloseHandle(handler_finish_semaphore_); - } - - // There is a race condition in the code below: if this instance is - // deleting the static critical section and a new instance of the class - // is created, then there is a possibility that the critical section be - // initialized while the same critical section is being deleted. Given the - // usage pattern for the code, this race condition is unlikely to hit, but it - // is a race condition nonetheless. - if (InterlockedDecrement(&instance_count_) == 0) { - DeleteCriticalSection(&handler_stack_critical_section_); - } -} - -// static -DWORD ExceptionHandler::ExceptionHandlerThreadMain(void* lpParameter) { - ExceptionHandler* self = reinterpret_cast(lpParameter); - assert(self); - assert(self->handler_start_semaphore_ != NULL); - assert(self->handler_finish_semaphore_ != NULL); - - while (true) { - if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) == - WAIT_OBJECT_0) { - // Perform the requested action. - if (self->is_shutdown_) { - // The instance of the exception handler is being destroyed. - break; - } else { - self->handler_return_value_ = - self->WriteMinidumpWithException(self->requesting_thread_id_, - self->exception_info_, - self->assertion_); - } - - // Allow the requesting thread to proceed. - ReleaseSemaphore(self->handler_finish_semaphore_, 1, NULL); - } - } - - // This statement is not reached when the thread is unconditionally - // terminated by the ExceptionHandler destructor. - return 0; -} - -// HandleException and HandleInvalidParameter must create an -// AutoExceptionHandler object to maintain static state and to determine which -// ExceptionHandler instance to use. The constructor locates the correct -// instance, and makes it available through get_handler(). The destructor -// restores the state in effect prior to allocating the AutoExceptionHandler. -class AutoExceptionHandler { - public: - AutoExceptionHandler() { - // Increment handler_stack_index_ so that if another Breakpad handler is - // registered using this same HandleException function, and it needs to be - // called while this handler is running (either becaause this handler - // declines to handle the exception, or an exception occurs during - // handling), HandleException will find the appropriate ExceptionHandler - // object in handler_stack_ to deliver the exception to. - // - // Because handler_stack_ is addressed in reverse (as |size - index|), - // preincrementing handler_stack_index_ avoids needing to subtract 1 from - // the argument to |at|. - // - // The index is maintained instead of popping elements off of the handler - // stack and pushing them at the end of this method. This avoids ruining - // the order of elements in the stack in the event that some other thread - // decides to manipulate the handler stack (such as creating a new - // ExceptionHandler object) while an exception is being handled. - EnterCriticalSection(&ExceptionHandler::handler_stack_critical_section_); - handler_ = ExceptionHandler::handler_stack_->at( - ExceptionHandler::handler_stack_->size() - - ++ExceptionHandler::handler_stack_index_); - LeaveCriticalSection(&ExceptionHandler::handler_stack_critical_section_); - - // In case another exception occurs while this handler is doing its thing, - // it should be delivered to the previous filter. - SetUnhandledExceptionFilter(handler_->previous_filter_); -#if _MSC_VER >= 1400 // MSVC 2005/8 - _set_invalid_parameter_handler(handler_->previous_iph_); -#endif // _MSC_VER >= 1400 - _set_purecall_handler(handler_->previous_pch_); - } - - ~AutoExceptionHandler() { - // Put things back the way they were before entering this handler. - SetUnhandledExceptionFilter(ExceptionHandler::HandleException); -#if _MSC_VER >= 1400 // MSVC 2005/8 - _set_invalid_parameter_handler(ExceptionHandler::HandleInvalidParameter); -#endif // _MSC_VER >= 1400 - _set_purecall_handler(ExceptionHandler::HandlePureVirtualCall); - - EnterCriticalSection(&ExceptionHandler::handler_stack_critical_section_); - --ExceptionHandler::handler_stack_index_; - LeaveCriticalSection(&ExceptionHandler::handler_stack_critical_section_); - } - - ExceptionHandler* get_handler() const { return handler_; } - - private: - ExceptionHandler* handler_; -}; - -// static -LONG ExceptionHandler::HandleException(EXCEPTION_POINTERS* exinfo) { - AutoExceptionHandler auto_exception_handler; - ExceptionHandler* current_handler = auto_exception_handler.get_handler(); - - // Ignore EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP exceptions. This - // logic will short-circuit before calling WriteMinidumpOnHandlerThread, - // allowing something else to handle the breakpoint without incurring the - // overhead transitioning to and from the handler thread. This behavior - // can be overridden by calling ExceptionHandler::set_handle_debug_exceptions. - DWORD code = exinfo->ExceptionRecord->ExceptionCode; - LONG action; - bool is_debug_exception = (code == EXCEPTION_BREAKPOINT) || - (code == EXCEPTION_SINGLE_STEP); - - bool success = false; - - if (!is_debug_exception || - current_handler->get_handle_debug_exceptions()) { - // If out-of-proc crash handler client is available, we have to use that - // to generate dump and we cannot fall back on in-proc dump generation - // because we never prepared for an in-proc dump generation - - // In case of out-of-process dump generation, directly call - // WriteMinidumpWithException since there is no separate thread running. - if (current_handler->IsOutOfProcess()) { - success = current_handler->WriteMinidumpWithException( - GetCurrentThreadId(), - exinfo, - NULL); - } else { - success = current_handler->WriteMinidumpOnHandlerThread(exinfo, NULL); - } - } - - // The handler fully handled the exception. Returning - // EXCEPTION_EXECUTE_HANDLER indicates this to the system, and usually - // results in the application being terminated. - // - // Note: If the application was launched from within the Cygwin - // environment, returning EXCEPTION_EXECUTE_HANDLER seems to cause the - // application to be restarted. - if (success) { - action = EXCEPTION_EXECUTE_HANDLER; - } else { - // There was an exception, it was a breakpoint or something else ignored - // above, or it was passed to the handler, which decided not to handle it. - // This could be because the filter callback didn't want it, because - // minidump writing failed for some reason, or because the post-minidump - // callback function indicated failure. Give the previous handler a - // chance to do something with the exception. If there is no previous - // handler, return EXCEPTION_CONTINUE_SEARCH, which will allow a debugger - // or native "crashed" dialog to handle the exception. - if (current_handler->previous_filter_) { - action = current_handler->previous_filter_(exinfo); - } else { - action = EXCEPTION_CONTINUE_SEARCH; - } - } - - return action; -} - -#if _MSC_VER >= 1400 // MSVC 2005/8 -// static -void ExceptionHandler::HandleInvalidParameter(const wchar_t* expression, - const wchar_t* function, - const wchar_t* file, - unsigned int line, - uintptr_t reserved) { - // This is an invalid parameter, not an exception. It's safe to play with - // sprintf here. - AutoExceptionHandler auto_exception_handler; - ExceptionHandler* current_handler = auto_exception_handler.get_handler(); - - MDRawAssertionInfo assertion; - memset(&assertion, 0, sizeof(assertion)); - _snwprintf_s(reinterpret_cast(assertion.expression), - sizeof(assertion.expression) / sizeof(assertion.expression[0]), - _TRUNCATE, L"%s", expression); - _snwprintf_s(reinterpret_cast(assertion.function), - sizeof(assertion.function) / sizeof(assertion.function[0]), - _TRUNCATE, L"%s", function); - _snwprintf_s(reinterpret_cast(assertion.file), - sizeof(assertion.file) / sizeof(assertion.file[0]), - _TRUNCATE, L"%s", file); - assertion.line = line; - assertion.type = MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER; - - bool success = false; - // In case of out-of-process dump generation, directly call - // WriteMinidumpWithException since there is no separate thread running. - if (current_handler->IsOutOfProcess()) { - success = current_handler->WriteMinidumpWithException( - GetCurrentThreadId(), - NULL, - &assertion); - } else { - success = current_handler->WriteMinidumpOnHandlerThread(NULL, &assertion); - } - - if (!success) { - if (current_handler->previous_iph_) { - // The handler didn't fully handle the exception. Give it to the - // previous invalid parameter handler. - current_handler->previous_iph_(expression, - function, - file, - line, - reserved); - } else { - // If there's no previous handler, pass the exception back in to the - // invalid parameter handler's core. That's the routine that called this - // function, but now, since this function is no longer registered (and in - // fact, no function at all is registered), this will result in the - // default code path being taken: _CRT_DEBUGGER_HOOK and _invoke_watson. - // Use _invalid_parameter where it exists (in _DEBUG builds) as it passes - // more information through. In non-debug builds, it is not available, - // so fall back to using _invalid_parameter_noinfo. See invarg.c in the - // CRT source. -#ifdef _DEBUG - _invalid_parameter(expression, function, file, line, reserved); -#else // _DEBUG - _invalid_parameter_noinfo(); -#endif // _DEBUG - } - } - - // The handler either took care of the invalid parameter problem itself, - // or passed it on to another handler. "Swallow" it by exiting, paralleling - // the behavior of "swallowing" exceptions. - exit(0); -} -#endif // _MSC_VER >= 1400 - -// static -void ExceptionHandler::HandlePureVirtualCall() { - AutoExceptionHandler auto_exception_handler; - ExceptionHandler* current_handler = auto_exception_handler.get_handler(); - - MDRawAssertionInfo assertion; - memset(&assertion, 0, sizeof(assertion)); - assertion.type = MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL; - - bool success = false; - // In case of out-of-process dump generation, directly call - // WriteMinidumpWithException since there is no separate thread running. - - if (current_handler->IsOutOfProcess()) { - success = current_handler->WriteMinidumpWithException( - GetCurrentThreadId(), - NULL, - &assertion); - } else { - success = current_handler->WriteMinidumpOnHandlerThread(NULL, &assertion); - } - - if (!success) { - if (current_handler->previous_pch_) { - // The handler didn't fully handle the exception. Give it to the - // previous purecall handler. - current_handler->previous_pch_(); - } else { - // If there's no previous handler, return and let _purecall handle it. - // This will just put up an assertion dialog. - return; - } - } - - // The handler either took care of the invalid parameter problem itself, - // or passed it on to another handler. "Swallow" it by exiting, paralleling - // the behavior of "swallowing" exceptions. - exit(0); -} - -bool ExceptionHandler::WriteMinidumpOnHandlerThread( - EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion) { - EnterCriticalSection(&handler_critical_section_); - - // There isn't much we can do if the handler thread - // was not successfully created. - if (handler_thread_ == NULL) { - LeaveCriticalSection(&handler_critical_section_); - return false; - } - - // The handler thread should only be created when the semaphores are valid. - assert(handler_start_semaphore_ != NULL); - assert(handler_finish_semaphore_ != NULL); - - // Set up data to be passed in to the handler thread. - requesting_thread_id_ = GetCurrentThreadId(); - exception_info_ = exinfo; - assertion_ = assertion; - - // This causes the handler thread to call WriteMinidumpWithException. - ReleaseSemaphore(handler_start_semaphore_, 1, NULL); - - // Wait until WriteMinidumpWithException is done and collect its return value. - WaitForSingleObject(handler_finish_semaphore_, INFINITE); - bool status = handler_return_value_; - - // Clean up. - requesting_thread_id_ = 0; - exception_info_ = NULL; - assertion_ = NULL; - - LeaveCriticalSection(&handler_critical_section_); - - return status; -} - -bool ExceptionHandler::WriteMinidump() { - return WriteMinidumpForException(NULL); -} - -bool ExceptionHandler::WriteMinidumpForException(EXCEPTION_POINTERS* exinfo) { - // In case of out-of-process dump generation, directly call - // WriteMinidumpWithException since there is no separate thread running. - if (IsOutOfProcess()) { - return WriteMinidumpWithException(GetCurrentThreadId(), - exinfo, - NULL); - } - - bool success = WriteMinidumpOnHandlerThread(exinfo, NULL); - UpdateNextID(); - return success; -} - -// static -bool ExceptionHandler::WriteMinidump(const wstring &dump_path, - MinidumpCallback callback, - void* callback_context) { - ExceptionHandler handler(dump_path, NULL, callback, callback_context, - HANDLER_NONE); - return handler.WriteMinidump(); -} - -bool ExceptionHandler::WriteMinidumpWithException( - DWORD requesting_thread_id, - EXCEPTION_POINTERS* exinfo, - MDRawAssertionInfo* assertion) { - // Give user code a chance to approve or prevent writing a minidump. If the - // filter returns false, don't handle the exception at all. If this method - // was called as a result of an exception, returning false will cause - // HandleException to call any previous handler or return - // EXCEPTION_CONTINUE_SEARCH on the exception thread, allowing it to appear - // as though this handler were not present at all. - if (filter_ && !filter_(callback_context_, exinfo, assertion)) { - return false; - } - - bool success = false; - if (IsOutOfProcess()) { - // Use the EXCEPTION_POINTERS overload for RequestDump if - // both exinfo and assertion are NULL. - if (!assertion) { - success = crash_generation_client_->RequestDump(exinfo); - } else { - success = crash_generation_client_->RequestDump(assertion); - } - } else { - if (minidump_write_dump_) { - HANDLE dump_file = CreateFile(next_minidump_path_c_, - GENERIC_WRITE, - 0, // no sharing - NULL, - CREATE_NEW, // fail if exists - FILE_ATTRIBUTE_NORMAL, - NULL); - if (dump_file != INVALID_HANDLE_VALUE) { - MINIDUMP_EXCEPTION_INFORMATION except_info; - except_info.ThreadId = requesting_thread_id; - except_info.ExceptionPointers = exinfo; - except_info.ClientPointers = FALSE; - - // Add an MDRawBreakpadInfo stream to the minidump, to provide additional - // information about the exception handler to the Breakpad processor. The - // information will help the processor determine which threads are - // relevant. The Breakpad processor does not require this information but - // can function better with Breakpad-generated dumps when it is present. - // The native debugger is not harmed by the presence of this information. - MDRawBreakpadInfo breakpad_info; - breakpad_info.validity = MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID | - MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID; - breakpad_info.dump_thread_id = GetCurrentThreadId(); - breakpad_info.requesting_thread_id = requesting_thread_id; - - // Leave room in user_stream_array for a possible assertion info stream. - MINIDUMP_USER_STREAM user_stream_array[2]; - user_stream_array[0].Type = MD_BREAKPAD_INFO_STREAM; - user_stream_array[0].BufferSize = sizeof(breakpad_info); - user_stream_array[0].Buffer = &breakpad_info; - - MINIDUMP_USER_STREAM_INFORMATION user_streams; - user_streams.UserStreamCount = 1; - user_streams.UserStreamArray = user_stream_array; - - if (assertion) { - user_stream_array[1].Type = MD_ASSERTION_INFO_STREAM; - user_stream_array[1].BufferSize = sizeof(MDRawAssertionInfo); - user_stream_array[1].Buffer = assertion; - ++user_streams.UserStreamCount; - } - - // The explicit comparison to TRUE avoids a warning (C4800). - success = (minidump_write_dump_(GetCurrentProcess(), - GetCurrentProcessId(), - dump_file, - dump_type_, - exinfo ? &except_info : NULL, - &user_streams, - NULL) == TRUE); - - CloseHandle(dump_file); - } - } - } - - if (callback_) { - // TODO(munjal): In case of out-of-process dump generation, both - // dump_path_c_ and next_minidump_id_ will be NULL. For out-of-process - // scenario, the server process ends up creating the dump path and dump - // id so they are not known to the client. - success = callback_(dump_path_c_, next_minidump_id_c_, callback_context_, - exinfo, assertion, success); - } - - return success; -} - -void ExceptionHandler::UpdateNextID() { - assert(uuid_create_); - UUID id = {0}; - if (uuid_create_) { - uuid_create_(&id); - } - next_minidump_id_ = GUIDString::GUIDToWString(&id); - next_minidump_id_c_ = next_minidump_id_.c_str(); - - wchar_t minidump_path[MAX_PATH]; - swprintf(minidump_path, MAX_PATH, L"%s\\%s.dmp", - dump_path_c_, next_minidump_id_c_); - - // remove when VC++7.1 is no longer supported - minidump_path[MAX_PATH - 1] = L'\0'; - - next_minidump_path_ = minidump_path; - next_minidump_path_c_ = next_minidump_path_.c_str(); -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/client/windows/handler/exception_handler.h b/share/google-breakpad/src/client/windows/handler/exception_handler.h deleted file mode 100644 index 2cacdc382f25f22f7890d7f6ff305396e1eaa029..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/client/windows/handler/exception_handler.h +++ /dev/null @@ -1,415 +0,0 @@ -// Copyright (c) 2006, 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. - -// ExceptionHandler can write a minidump file when an exception occurs, -// or when WriteMinidump() is called explicitly by your program. -// -// To have the exception handler write minidumps when an uncaught exception -// (crash) occurs, you should create an instance early in the execution -// of your program, and keep it around for the entire time you want to -// have crash handling active (typically, until shutdown). -// -// If you want to write minidumps without installing the exception handler, -// you can create an ExceptionHandler with install_handler set to false, -// then call WriteMinidump. You can also use this technique if you want to -// use different minidump callbacks for different call sites. -// -// In either case, a callback function is called when a minidump is written, -// which receives the unqiue id of the minidump. The caller can use this -// id to collect and write additional application state, and to launch an -// external crash-reporting application. -// -// It is important that creation and destruction of ExceptionHandler objects -// be nested cleanly, when using install_handler = true. -// Avoid the following pattern: -// ExceptionHandler *e = new ExceptionHandler(...); -// ExceptionHandler *f = new ExceptionHandler(...); -// delete e; -// This will put the exception filter stack into an inconsistent state. - -#ifndef CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ -#define CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ - -#include -#include -#include -#include - -#pragma warning( push ) -// Disable exception handler warnings. -#pragma warning( disable : 4530 ) - -#include -#include - -#include "client/windows/common/ipc_protocol.h" -#include "client/windows/crash_generation/crash_generation_client.h" -#include "google_breakpad/common/minidump_format.h" -#include "processor/scoped_ptr.h" - -namespace google_breakpad { - -using std::vector; -using std::wstring; - -class ExceptionHandler { - public: - // A callback function to run before Breakpad performs any substantial - // processing of an exception. A FilterCallback is called before writing - // a minidump. context is the parameter supplied by the user as - // callback_context when the handler was created. exinfo points to the - // exception record, if any; assertion points to assertion information, - // if any. - // - // If a FilterCallback returns true, Breakpad will continue processing, - // attempting to write a minidump. If a FilterCallback returns false, Breakpad - // will immediately report the exception as unhandled without writing a - // minidump, allowing another handler the opportunity to handle it. - typedef bool (*FilterCallback)(void* context, EXCEPTION_POINTERS* exinfo, - MDRawAssertionInfo* assertion); - - // A callback function to run after the minidump has been written. - // minidump_id is a unique id for the dump, so the minidump - // file is \.dmp. context is the parameter supplied - // by the user as callback_context when the handler was created. exinfo - // points to the exception record, or NULL if no exception occurred. - // succeeded indicates whether a minidump file was successfully written. - // assertion points to information about an assertion if the handler was - // invoked by an assertion. - // - // If an exception occurred and the callback returns true, Breakpad will treat - // the exception as fully-handled, suppressing any other handlers from being - // notified of the exception. If the callback returns false, Breakpad will - // treat the exception as unhandled, and allow another handler to handle it. - // If there are no other handlers, Breakpad will report the exception to the - // system as unhandled, allowing a debugger or native crash dialog the - // opportunity to handle the exception. Most callback implementations - // should normally return the value of |succeeded|, or when they wish to - // not report an exception of handled, false. Callbacks will rarely want to - // return true directly (unless |succeeded| is true). - // - // For out-of-process dump generation, dump path and minidump ID will always - // be NULL. In case of out-of-process dump generation, the dump path and - // minidump id are controlled by the server process and are not communicated - // back to the crashing process. - typedef bool (*MinidumpCallback)(const wchar_t* dump_path, - const wchar_t* minidump_id, - void* context, - EXCEPTION_POINTERS* exinfo, - MDRawAssertionInfo* assertion, - bool succeeded); - - // HandlerType specifies which types of handlers should be installed, if - // any. Use HANDLER_NONE for an ExceptionHandler that remains idle, - // without catching any failures on its own. This type of handler may - // still be triggered by calling WriteMinidump. Otherwise, use a - // combination of the other HANDLER_ values, or HANDLER_ALL to install - // all handlers. - enum HandlerType { - HANDLER_NONE = 0, - HANDLER_EXCEPTION = 1 << 0, // SetUnhandledExceptionFilter - HANDLER_INVALID_PARAMETER = 1 << 1, // _set_invalid_parameter_handler - HANDLER_PURECALL = 1 << 2, // _set_purecall_handler - HANDLER_ALL = HANDLER_EXCEPTION | - HANDLER_INVALID_PARAMETER | - HANDLER_PURECALL - }; - - // Creates a new ExceptionHandler instance to handle writing minidumps. - // Before writing a minidump, the optional filter callback will be called. - // Its return value determines whether or not Breakpad should write a - // minidump. Minidump files will be written to dump_path, and the optional - // callback is called after writing the dump file, as described above. - // handler_types specifies the types of handlers that should be installed. - ExceptionHandler(const wstring& dump_path, - FilterCallback filter, - MinidumpCallback callback, - void* callback_context, - int handler_types); - - // Creates a new ExcetpionHandler instance that can attempt to perform - // out-of-process dump generation if pipe_name is not NULL. If pipe_name is - // NULL, or if out-of-process dump generation registration step fails, - // in-process dump generation will be used. This also allows specifying - // the dump type to generate. - ExceptionHandler(const wstring& dump_path, - FilterCallback filter, - MinidumpCallback callback, - void* callback_context, - int handler_types, - MINIDUMP_TYPE dump_type, - const wchar_t* pipe_name, - const CustomClientInfo* custom_info); - - ~ExceptionHandler(); - - // Get and set the minidump path. - wstring dump_path() const { return dump_path_; } - void set_dump_path(const wstring &dump_path) { - dump_path_ = dump_path; - dump_path_c_ = dump_path_.c_str(); - UpdateNextID(); // Necessary to put dump_path_ in next_minidump_path_. - } - - // Writes a minidump immediately. This can be used to capture the - // execution state independently of a crash. Returns true on success. - bool WriteMinidump(); - - // Writes a minidump immediately, with the user-supplied exception - // information. - bool WriteMinidumpForException(EXCEPTION_POINTERS* exinfo); - - // Convenience form of WriteMinidump which does not require an - // ExceptionHandler instance. - static bool WriteMinidump(const wstring &dump_path, - MinidumpCallback callback, void* callback_context); - - // Get the thread ID of the thread requesting the dump (either the exception - // thread or any other thread that called WriteMinidump directly). This - // may be useful if you want to include additional thread state in your - // dumps. - DWORD get_requesting_thread_id() const { return requesting_thread_id_; } - - // Controls behavior of EXCEPTION_BREAKPOINT and EXCEPTION_SINGLE_STEP. - bool get_handle_debug_exceptions() const { return handle_debug_exceptions_; } - void set_handle_debug_exceptions(bool handle_debug_exceptions) { - handle_debug_exceptions_ = handle_debug_exceptions; - } - - // Returns whether out-of-process dump generation is used or not. - bool IsOutOfProcess() const { return crash_generation_client_.get() != NULL; } - - private: - friend class AutoExceptionHandler; - - // Initializes the instance with given values. - void Initialize(const wstring& dump_path, - FilterCallback filter, - MinidumpCallback callback, - void* callback_context, - int handler_types, - MINIDUMP_TYPE dump_type, - const wchar_t* pipe_name, - const CustomClientInfo* custom_info); - - // Function pointer type for MiniDumpWriteDump, which is looked up - // dynamically. - typedef BOOL (WINAPI *MiniDumpWriteDump_type)( - HANDLE hProcess, - DWORD dwPid, - HANDLE hFile, - MINIDUMP_TYPE DumpType, - CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, - CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, - CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); - - // Function pointer type for UuidCreate, which is looked up dynamically. - typedef RPC_STATUS (RPC_ENTRY *UuidCreate_type)(UUID* Uuid); - - // Runs the main loop for the exception handler thread. - static DWORD WINAPI ExceptionHandlerThreadMain(void* lpParameter); - - // Called on the exception thread when an unhandled exception occurs. - // Signals the exception handler thread to handle the exception. - static LONG WINAPI HandleException(EXCEPTION_POINTERS* exinfo); - -#if _MSC_VER >= 1400 // MSVC 2005/8 - // This function will be called by some CRT functions when they detect - // that they were passed an invalid parameter. Note that in _DEBUG builds, - // the CRT may display an assertion dialog before calling this function, - // and the function will not be called unless the assertion dialog is - // dismissed by clicking "Ignore." - static void HandleInvalidParameter(const wchar_t* expression, - const wchar_t* function, - const wchar_t* file, - unsigned int line, - uintptr_t reserved); -#endif // _MSC_VER >= 1400 - - // This function will be called by the CRT when a pure virtual - // function is called. - static void HandlePureVirtualCall(); - - // This is called on the exception thread or on another thread that - // the user wishes to produce a dump from. It calls - // WriteMinidumpWithException on the handler thread, avoiding stack - // overflows and inconsistent dumps due to writing the dump from - // the exception thread. If the dump is requested as a result of an - // exception, exinfo contains exception information, otherwise, it - // is NULL. If the dump is requested as a result of an assertion - // (such as an invalid parameter being passed to a CRT function), - // assertion contains data about the assertion, otherwise, it is NULL. - bool WriteMinidumpOnHandlerThread(EXCEPTION_POINTERS* exinfo, - MDRawAssertionInfo* assertion); - - // This function does the actual writing of a minidump. It is called - // on the handler thread. requesting_thread_id is the ID of the thread - // that requested the dump. If the dump is requested as a result of - // an exception, exinfo contains exception information, otherwise, - // it is NULL. - bool WriteMinidumpWithException(DWORD requesting_thread_id, - EXCEPTION_POINTERS* exinfo, - MDRawAssertionInfo* assertion); - - // Generates a new ID and stores it in next_minidump_id_, and stores the - // path of the next minidump to be written in next_minidump_path_. - void UpdateNextID(); - - FilterCallback filter_; - MinidumpCallback callback_; - void* callback_context_; - - scoped_ptr crash_generation_client_; - - // The directory in which a minidump will be written, set by the dump_path - // argument to the constructor, or set_dump_path. - wstring dump_path_; - - // The basename of the next minidump to be written, without the extension. - wstring next_minidump_id_; - - // The full pathname of the next minidump to be written, including the file - // extension. - wstring next_minidump_path_; - - // Pointers to C-string representations of the above. These are set when - // the above wstring versions are set in order to avoid calling c_str during - // an exception, as c_str may attempt to allocate heap memory. These - // pointers are not owned by the ExceptionHandler object, but their lifetimes - // should be equivalent to the lifetimes of the associated wstring, provided - // that the wstrings are not altered. - const wchar_t* dump_path_c_; - const wchar_t* next_minidump_id_c_; - const wchar_t* next_minidump_path_c_; - - HMODULE dbghelp_module_; - MiniDumpWriteDump_type minidump_write_dump_; - MINIDUMP_TYPE dump_type_; - - HMODULE rpcrt4_module_; - UuidCreate_type uuid_create_; - - // Tracks the handler types that were installed according to the - // handler_types constructor argument. - int handler_types_; - - // When installed_handler_ is true, previous_filter_ is the unhandled - // exception filter that was set prior to installing ExceptionHandler as - // the unhandled exception filter and pointing it to |this|. NULL indicates - // that there is no previous unhandled exception filter. - LPTOP_LEVEL_EXCEPTION_FILTER previous_filter_; - -#if _MSC_VER >= 1400 // MSVC 2005/8 - // Beginning in VC 8, the CRT provides an invalid parameter handler that will - // be called when some CRT functions are passed invalid parameters. In - // earlier CRTs, the same conditions would cause unexpected behavior or - // crashes. - _invalid_parameter_handler previous_iph_; -#endif // _MSC_VER >= 1400 - - // The CRT allows you to override the default handler for pure - // virtual function calls. - _purecall_handler previous_pch_; - - // The exception handler thread. - HANDLE handler_thread_; - - // True if the exception handler is being destroyed. - // Starting with MSVC 2005, Visual C has stronger guarantees on volatile vars. - // It has release semantics on write and acquire semantics on reads. - // See the msdn documentation. - volatile bool is_shutdown_; - - // The critical section enforcing the requirement that only one exception be - // handled by a handler at a time. - CRITICAL_SECTION handler_critical_section_; - - // Semaphores used to move exception handling between the exception thread - // and the handler thread. handler_start_semaphore_ is signalled by the - // exception thread to wake up the handler thread when an exception occurs. - // handler_finish_semaphore_ is signalled by the handler thread to wake up - // the exception thread when handling is complete. - HANDLE handler_start_semaphore_; - HANDLE handler_finish_semaphore_; - - // The next 2 fields contain data passed from the requesting thread to - // the handler thread. - - // The thread ID of the thread requesting the dump (either the exception - // thread or any other thread that called WriteMinidump directly). - DWORD requesting_thread_id_; - - // The exception info passed to the exception handler on the exception - // thread, if an exception occurred. NULL for user-requested dumps. - EXCEPTION_POINTERS* exception_info_; - - // If the handler is invoked due to an assertion, this will contain a - // pointer to the assertion information. It is NULL at other times. - MDRawAssertionInfo* assertion_; - - // The return value of the handler, passed from the handler thread back to - // the requesting thread. - bool handler_return_value_; - - // If true, the handler will intercept EXCEPTION_BREAKPOINT and - // EXCEPTION_SINGLE_STEP exceptions. Leave this false (the default) - // to not interfere with debuggers. - bool handle_debug_exceptions_; - - // A stack of ExceptionHandler objects that have installed unhandled - // exception filters. This vector is used by HandleException to determine - // which ExceptionHandler object to route an exception to. When an - // ExceptionHandler is created with install_handler true, it will append - // itself to this list. - static vector* handler_stack_; - - // The index of the ExceptionHandler in handler_stack_ that will handle the - // next exception. Note that 0 means the last entry in handler_stack_, 1 - // means the next-to-last entry, and so on. This is used by HandleException - // to support multiple stacked Breakpad handlers. - static LONG handler_stack_index_; - - // handler_stack_critical_section_ guards operations on handler_stack_ and - // handler_stack_index_. The critical section is initialized by the - // first instance of the class and destroyed by the last instance of it. - static CRITICAL_SECTION handler_stack_critical_section_; - - // The number of instances of this class. - volatile static LONG instance_count_; - - // disallow copy ctor and operator= - explicit ExceptionHandler(const ExceptionHandler &); - void operator=(const ExceptionHandler &); -}; - -} // namespace google_breakpad - -#pragma warning( pop ) - -#endif // CLIENT_WINDOWS_HANDLER_EXCEPTION_HANDLER_H__ diff --git a/share/google-breakpad/src/common/convert_UTF.c b/share/google-breakpad/src/common/convert_UTF.c deleted file mode 100644 index 80178d35ef9c712101df83fa5b36802f8b2a124d..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/convert_UTF.c +++ /dev/null @@ -1,533 +0,0 @@ -/* - * Copyright 2001-2004 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* --------------------------------------------------------------------- - -Conversions between UTF32, UTF-16, and UTF-8. Source code file. -Author: Mark E. Davis, 1994. -Rev History: Rick McGowan, fixes & updates May 2001. -Sept 2001: fixed const & error conditions per -mods suggested by S. Parent & A. Lillich. -June 2002: Tim Dodd added detection and handling of incomplete -source sequences, enhanced error detection, added casts -to eliminate compiler warnings. -July 2003: slight mods to back out aggressive FFFE detection. -Jan 2004: updated switches in from-UTF8 conversions. -Oct 2004: updated to use UNI_MAX_LEGAL_UTF32 in UTF-32 conversions. - -See the header file "ConvertUTF.h" for complete documentation. - ------------------------------------------------------------------------- */ - - -#include "convert_UTF.h" -#ifdef CVTUTF_DEBUG -#include -#endif - -static const int halfShift = 10; /* used for shifting by 10 bits */ - -static const UTF32 halfBase = 0x0010000UL; -static const UTF32 halfMask = 0x3FFUL; - -#define UNI_SUR_HIGH_START (UTF32)0xD800 -#define UNI_SUR_HIGH_END (UTF32)0xDBFF -#define UNI_SUR_LOW_START (UTF32)0xDC00 -#define UNI_SUR_LOW_END (UTF32)0xDFFF -#define false 0 -#define true 1 - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF32* source = *sourceStart; - UTF16* target = *targetStart; - while (source < sourceEnd) { - UTF32 ch; - if (target >= targetEnd) { - result = targetExhausted; break; - } - ch = *source++; - if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ - /* UTF-16 surrogate values are illegal in UTF-32; 0xffff or 0xfffe are both reserved values */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { - if (flags == strictConversion) { - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } else { - *target++ = UNI_REPLACEMENT_CHAR; - } - } else { - *target++ = (UTF16)ch; /* normal case */ - } - } else if (ch > UNI_MAX_LEGAL_UTF32) { - if (flags == strictConversion) { - result = sourceIllegal; - } else { - *target++ = UNI_REPLACEMENT_CHAR; - } - } else { - /* target is a character in range 0xFFFF - 0x10FFFF. */ - if (target + 1 >= targetEnd) { - --source; /* Back up source pointer! */ - result = targetExhausted; break; - } - ch -= halfBase; - *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); - *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); - } - } -*sourceStart = source; -*targetStart = target; -return result; -} - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd, - UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF16* source = *sourceStart; - UTF32* target = *targetStart; - UTF32 ch, ch2; - while (source < sourceEnd) { - const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ - ch = *source++; - /* If we have a surrogate pair, convert to UTF32 first. */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { - /* If the 16 bits following the high surrogate are in the source buffer... */ - if (source < sourceEnd) { - ch2 = *source; - /* If it's a low surrogate, convert to UTF32. */ - if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { - ch = ((ch - UNI_SUR_HIGH_START) << halfShift) - + (ch2 - UNI_SUR_LOW_START) + halfBase; - ++source; - } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } - } else { /* We don't have the 16 bits following the high surrogate. */ - --source; /* return to the high surrogate */ - result = sourceExhausted; - break; - } - } else if (flags == strictConversion) { - /* UTF-16 surrogate values are illegal in UTF-32 */ - if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } - } - if (target >= targetEnd) { - source = oldSource; /* Back up source pointer! */ - result = targetExhausted; break; - } - *target++ = ch; - } - *sourceStart = source; - *targetStart = target; -#ifdef CVTUTF_DEBUG - if (result == sourceIllegal) { - fprintf(stderr, "ConvertUTF16toUTF32 illegal seq 0x%04x,%04x\n", ch, ch2); - fflush(stderr); - } -#endif - return result; -} - -/* --------------------------------------------------------------------- */ - -/* - * Index into the table below with the first byte of a UTF-8 sequence to - * get the number of trailing bytes that are supposed to follow it. - * Note that *legal* UTF-8 values can't have 4 or 5-bytes. The table is - * left as-is for anyone who may want to do such conversion, which was - * allowed in earlier algorithms. - */ -static const char trailingBytesForUTF8[256] = { - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, - 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, - 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 -}; - -/* - * Magic values subtracted from a buffer value during UTF8 conversion. - * This table contains as many values as there might be trailing bytes - * in a UTF-8 sequence. - */ -static const UTF32 offsetsFromUTF8[6] = { 0x00000000UL, 0x00003080UL, 0x000E2080UL, - 0x03C82080UL, 0xFA082080UL, 0x82082080UL }; - -/* - * Once the bits are split out into bytes of UTF-8, this is a mask OR-ed - * into the first byte, depending on how many bytes follow. There are - * as many entries in this table as there are UTF-8 sequence types. - * (I.e., one byte sequence, two byte... etc.). Remember that sequencs - * for *legal* UTF-8 will be 4 or fewer bytes total. - */ -static const UTF8 firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC }; - -/* --------------------------------------------------------------------- */ - -/* The interface converts a whole buffer to avoid function-call overhead. -* Constants have been gathered. Loops & conditionals have been removed as -* much as possible for efficiency, in favor of drop-through switches. -* (See "Note A" at the bottom of the file for equivalent code.) -* If your compiler supports it, the "isLegalUTF8" call can be turned -* into an inline function. -*/ - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF16* source = *sourceStart; - UTF8* target = *targetStart; - while (source < sourceEnd) { - UTF32 ch; - unsigned short bytesToWrite = 0; - const UTF32 byteMask = 0xBF; - const UTF32 byteMark = 0x80; - const UTF16* oldSource = source; /* In case we have to back up because of target overflow. */ - ch = *source++; - /* If we have a surrogate pair, convert to UTF32 first. */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_HIGH_END) { - /* If the 16 bits following the high surrogate are in the source buffer... */ - if (source < sourceEnd) { - UTF32 ch2 = *source; - /* If it's a low surrogate, convert to UTF32. */ - if (ch2 >= UNI_SUR_LOW_START && ch2 <= UNI_SUR_LOW_END) { - ch = ((ch - UNI_SUR_HIGH_START) << halfShift) - + (ch2 - UNI_SUR_LOW_START) + halfBase; - ++source; - } else if (flags == strictConversion) { /* it's an unpaired high surrogate */ - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } - } else { /* We don't have the 16 bits following the high surrogate. */ - --source; /* return to the high surrogate */ - result = sourceExhausted; - break; - } - } else if (flags == strictConversion) { - /* UTF-16 surrogate values are illegal in UTF-32 */ - if (ch >= UNI_SUR_LOW_START && ch <= UNI_SUR_LOW_END) { - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } - } - /* Figure out how many bytes the result will require */ - if (ch < (UTF32)0x80) { bytesToWrite = 1; - } else if (ch < (UTF32)0x800) { bytesToWrite = 2; - } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; - } else if (ch < (UTF32)0x110000) { bytesToWrite = 4; - } else { bytesToWrite = 3; - ch = UNI_REPLACEMENT_CHAR; - } - - target += bytesToWrite; - if (target > targetEnd) { - source = oldSource; /* Back up source pointer! */ - target -= bytesToWrite; result = targetExhausted; break; - } - switch (bytesToWrite) { /* note: everything falls through. */ - case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 1: *--target = (UTF8)(ch | firstByteMark[bytesToWrite]); - } - target += bytesToWrite; - } -*sourceStart = source; -*targetStart = target; -return result; -} - -/* --------------------------------------------------------------------- */ - -/* - * Utility routine to tell whether a sequence of bytes is legal UTF-8. - * This must be called with the length pre-determined by the first byte. - * If not calling this from ConvertUTF8to*, then the length can be set by: - * length = trailingBytesForUTF8[*source]+1; - * and the sequence is illegal right away if there aren't that many bytes - * available. - * If presented with a length > 4, this returns false. The Unicode - * definition of UTF-8 goes up to 4-byte sequences. - */ - -static Boolean isLegalUTF8(const UTF8 *source, int length) { - UTF8 a; - const UTF8 *srcptr = source+length; - switch (length) { - default: return false; - /* Everything else falls through when "true"... */ - case 4: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; - case 3: if ((a = (*--srcptr)) < 0x80 || a > 0xBF) return false; - case 2: if ((a = (*--srcptr)) > 0xBF) return false; - - switch (*source) { - /* no fall-through in this inner switch */ - case 0xE0: if (a < 0xA0) return false; break; - case 0xED: if (a > 0x9F) return false; break; - case 0xF0: if (a < 0x90) return false; break; - case 0xF4: if (a > 0x8F) return false; break; - default: if (a < 0x80) return false; - } - - case 1: if (*source >= 0x80 && *source < 0xC2) return false; - } - if (*source > 0xF4) return false; - return true; -} - -/* --------------------------------------------------------------------- */ - -/* - * Exported function to return whether a UTF-8 sequence is legal or not. - * This is not used here; it's just exported. - */ -Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd) { - int length = trailingBytesForUTF8[*source]+1; - if (source+length > sourceEnd) { - return false; - } - return isLegalUTF8(source, length); -} - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF8* source = *sourceStart; - UTF16* target = *targetStart; - while (source < sourceEnd) { - UTF32 ch = 0; - unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; - if (source + extraBytesToRead >= sourceEnd) { - result = sourceExhausted; break; - } - /* Do this check whether lenient or strict */ - if (! isLegalUTF8(source, extraBytesToRead+1)) { - result = sourceIllegal; - break; - } - /* - * The cases all fall through. See "Note A" below. - */ - switch (extraBytesToRead) { - case 5: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 4: ch += *source++; ch <<= 6; /* remember, illegal UTF-8 */ - case 3: ch += *source++; ch <<= 6; - case 2: ch += *source++; ch <<= 6; - case 1: ch += *source++; ch <<= 6; - case 0: ch += *source++; - } - ch -= offsetsFromUTF8[extraBytesToRead]; - - if (target >= targetEnd) { - source -= (extraBytesToRead+1); /* Back up source pointer! */ - result = targetExhausted; break; - } - if (ch <= UNI_MAX_BMP) { /* Target is a character <= 0xFFFF */ - /* UTF-16 surrogate values are illegal in UTF-32 */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { - if (flags == strictConversion) { - source -= (extraBytesToRead+1); /* return to the illegal value itself */ - result = sourceIllegal; - break; - } else { - *target++ = UNI_REPLACEMENT_CHAR; - } - } else { - *target++ = (UTF16)ch; /* normal case */ - } - } else if (ch > UNI_MAX_UTF16) { - if (flags == strictConversion) { - result = sourceIllegal; - source -= (extraBytesToRead+1); /* return to the start */ - break; /* Bail out; shouldn't continue */ - } else { - *target++ = UNI_REPLACEMENT_CHAR; - } - } else { - /* target is a character in range 0xFFFF - 0x10FFFF. */ - if (target + 1 >= targetEnd) { - source -= (extraBytesToRead+1); /* Back up source pointer! */ - result = targetExhausted; break; - } - ch -= halfBase; - *target++ = (UTF16)((ch >> halfShift) + UNI_SUR_HIGH_START); - *target++ = (UTF16)((ch & halfMask) + UNI_SUR_LOW_START); - } - } -*sourceStart = source; -*targetStart = target; -return result; -} - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF32* source = *sourceStart; - UTF8* target = *targetStart; - while (source < sourceEnd) { - UTF32 ch; - unsigned short bytesToWrite = 0; - const UTF32 byteMask = 0xBF; - const UTF32 byteMark = 0x80; - ch = *source++; - if (flags == strictConversion ) { - /* UTF-16 surrogate values are illegal in UTF-32 */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { - --source; /* return to the illegal value itself */ - result = sourceIllegal; - break; - } - } - /* - * Figure out how many bytes the result will require. Turn any - * illegally large UTF32 things (> Plane 17) into replacement chars. - */ - if (ch < (UTF32)0x80) { bytesToWrite = 1; - } else if (ch < (UTF32)0x800) { bytesToWrite = 2; - } else if (ch < (UTF32)0x10000) { bytesToWrite = 3; - } else if (ch <= UNI_MAX_LEGAL_UTF32) { bytesToWrite = 4; - } else { bytesToWrite = 3; - ch = UNI_REPLACEMENT_CHAR; - result = sourceIllegal; - } - - target += bytesToWrite; - if (target > targetEnd) { - --source; /* Back up source pointer! */ - target -= bytesToWrite; result = targetExhausted; break; - } - switch (bytesToWrite) { /* note: everything falls through. */ - case 4: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 3: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 2: *--target = (UTF8)((ch | byteMark) & byteMask); ch >>= 6; - case 1: *--target = (UTF8) (ch | firstByteMark[bytesToWrite]); - } - target += bytesToWrite; - } -*sourceStart = source; -*targetStart = target; -return result; -} - -/* --------------------------------------------------------------------- */ - -ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd, - UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags) { - ConversionResult result = conversionOK; - const UTF8* source = *sourceStart; - UTF32* target = *targetStart; - while (source < sourceEnd) { - UTF32 ch = 0; - unsigned short extraBytesToRead = trailingBytesForUTF8[*source]; - if (source + extraBytesToRead >= sourceEnd) { - result = sourceExhausted; break; - } - /* Do this check whether lenient or strict */ - if (! isLegalUTF8(source, extraBytesToRead+1)) { - result = sourceIllegal; - break; - } - /* - * The cases all fall through. See "Note A" below. - */ - switch (extraBytesToRead) { - case 5: ch += *source++; ch <<= 6; - case 4: ch += *source++; ch <<= 6; - case 3: ch += *source++; ch <<= 6; - case 2: ch += *source++; ch <<= 6; - case 1: ch += *source++; ch <<= 6; - case 0: ch += *source++; - } - ch -= offsetsFromUTF8[extraBytesToRead]; - - if (target >= targetEnd) { - source -= (extraBytesToRead+1); /* Back up the source pointer! */ - result = targetExhausted; break; - } - if (ch <= UNI_MAX_LEGAL_UTF32) { - /* - * UTF-16 surrogate values are illegal in UTF-32, and anything - * over Plane 17 (> 0x10FFFF) is illegal. - */ - if (ch >= UNI_SUR_HIGH_START && ch <= UNI_SUR_LOW_END) { - if (flags == strictConversion) { - source -= (extraBytesToRead+1); /* return to the illegal value itself */ - result = sourceIllegal; - break; - } else { - *target++ = UNI_REPLACEMENT_CHAR; - } - } else { - *target++ = ch; - } - } else { /* i.e., ch > UNI_MAX_LEGAL_UTF32 */ - result = sourceIllegal; - *target++ = UNI_REPLACEMENT_CHAR; - } - } - *sourceStart = source; - *targetStart = target; - return result; -} - -/* --------------------------------------------------------------------- - -Note A. -The fall-through switches in UTF-8 reading code save a -temp variable, some decrements & conditionals. The switches -are equivalent to the following loop: -{ - int tmpBytesToRead = extraBytesToRead+1; - do { - ch += *source++; - --tmpBytesToRead; - if (tmpBytesToRead) ch <<= 6; - } while (tmpBytesToRead > 0); -} -In UTF-8 writing code, the switches on "bytesToWrite" are -similarly unrolled loops. - ---------------------------------------------------------------------- */ diff --git a/share/google-breakpad/src/common/convert_UTF.h b/share/google-breakpad/src/common/convert_UTF.h deleted file mode 100644 index b1556de81e6feb44285839f64f76f1feb56eeb98..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/convert_UTF.h +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2001-2004 Unicode, Inc. - * - * Disclaimer - * - * This source code is provided as is by Unicode, Inc. No claims are - * made as to fitness for any particular purpose. No warranties of any - * kind are expressed or implied. The recipient agrees to determine - * applicability of information provided. If this file has been - * purchased on magnetic or optical media from Unicode, Inc., the - * sole remedy for any claim will be exchange of defective media - * within 90 days of receipt. - * - * Limitations on Rights to Redistribute This Code - * - * Unicode, Inc. hereby grants the right to freely use the information - * supplied in this file in the creation of products supporting the - * Unicode Standard, and to make copies of this file in any form - * for internal or external distribution as long as this notice - * remains attached. - */ - -/* --------------------------------------------------------------------- - -Conversions between UTF32, UTF-16, and UTF-8. Header file. - -Several funtions are included here, forming a complete set of -conversions between the three formats. UTF-7 is not included -here, but is handled in a separate source file. - -Each of these routines takes pointers to input buffers and output -buffers. The input buffers are const. - -Each routine converts the text between *sourceStart and sourceEnd, -putting the result into the buffer between *targetStart and -targetEnd. Note: the end pointers are *after* the last item: e.g. -*(sourceEnd - 1) is the last item. - -The return result indicates whether the conversion was successful, -and if not, whether the problem was in the source or target buffers. -(Only the first encountered problem is indicated.) - -After the conversion, *sourceStart and *targetStart are both -updated to point to the end of last text successfully converted in -the respective buffers. - -Input parameters: -sourceStart - pointer to a pointer to the source buffer. -The contents of this are modified on return so that -it points at the next thing to be converted. -targetStart - similarly, pointer to pointer to the target buffer. -sourceEnd, targetEnd - respectively pointers to the ends of the -two buffers, for overflow checking only. - -These conversion functions take a ConversionFlags argument. When this -flag is set to strict, both irregular sequences and isolated surrogates -will cause an error. When the flag is set to lenient, both irregular -sequences and isolated surrogates are converted. - -Whether the flag is strict or lenient, all illegal sequences will cause -an error return. This includes sequences such as: , , -or in UTF-8, and values above 0x10FFFF in UTF-32. Conformant code -must check for illegal sequences. - -When the flag is set to lenient, characters over 0x10FFFF are converted -to the replacement character; otherwise (when the flag is set to strict) -they constitute an error. - -Output parameters: -The value "sourceIllegal" is returned from some routines if the input -sequence is malformed. When "sourceIllegal" is returned, the source -value will point to the illegal value that caused the problem. E.g., -in UTF-8 when a sequence is malformed, it points to the start of the -malformed sequence. - -Author: Mark E. Davis, 1994. -Rev History: Rick McGowan, fixes & updates May 2001. -Fixes & updates, Sept 2001. - ------------------------------------------------------------------------- */ - -/* --------------------------------------------------------------------- -The following 4 definitions are compiler-specific. -The C standard does not guarantee that wchar_t has at least -16 bits, so wchar_t is no less portable than unsigned short! -All should be unsigned values to avoid sign extension during -bit mask & shift operations. ------------------------------------------------------------------------- */ - -typedef unsigned long UTF32; /* at least 32 bits */ -typedef unsigned short UTF16; /* at least 16 bits */ -typedef unsigned char UTF8; /* typically 8 bits */ -typedef unsigned char Boolean; /* 0 or 1 */ - -/* Some fundamental constants */ -#define UNI_REPLACEMENT_CHAR (UTF32)0x0000FFFD -#define UNI_MAX_BMP (UTF32)0x0000FFFF -#define UNI_MAX_UTF16 (UTF32)0x0010FFFF -#define UNI_MAX_UTF32 (UTF32)0x7FFFFFFF -#define UNI_MAX_LEGAL_UTF32 (UTF32)0x0010FFFF - -typedef enum { - conversionOK, /* conversion successful */ - sourceExhausted, /* partial character in source, but hit end */ - targetExhausted, /* insuff. room in target for conversion */ - sourceIllegal /* source sequence is illegal/malformed */ -} ConversionResult; - -typedef enum { - strictConversion = 0, - lenientConversion -} ConversionFlags; - -/* This is for C++ and does no harm in C */ -#ifdef __cplusplus -extern "C" { -#endif - -ConversionResult ConvertUTF8toUTF16 (const UTF8** sourceStart, const UTF8* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); - -ConversionResult ConvertUTF16toUTF8 (const UTF16** sourceStart, const UTF16* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); - -ConversionResult ConvertUTF8toUTF32 (const UTF8** sourceStart, const UTF8* sourceEnd, - UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); - -ConversionResult ConvertUTF32toUTF8 (const UTF32** sourceStart, const UTF32* sourceEnd, - UTF8** targetStart, UTF8* targetEnd, ConversionFlags flags); - -ConversionResult ConvertUTF16toUTF32 (const UTF16** sourceStart, const UTF16* sourceEnd, - UTF32** targetStart, UTF32* targetEnd, ConversionFlags flags); - -ConversionResult ConvertUTF32toUTF16 (const UTF32** sourceStart, const UTF32* sourceEnd, - UTF16** targetStart, UTF16* targetEnd, ConversionFlags flags); - -Boolean isLegalUTF8Sequence(const UTF8 *source, const UTF8 *sourceEnd); - -#ifdef __cplusplus -} -#endif - -/* --------------------------------------------------------------------- */ diff --git a/share/google-breakpad/src/common/dwarf/bytereader-inl.h b/share/google-breakpad/src/common/dwarf/bytereader-inl.h deleted file mode 100644 index e8b4efaa121f7e21489fac5cadf2aed5606d1d56..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/bytereader-inl.h +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2006 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. - -#ifndef UTIL_DEBUGINFO_BYTEREADER_INL_H__ -#define UTIL_DEBUGINFO_BYTEREADER_INL_H__ - -#include - -#include "common/dwarf/bytereader.h" - -namespace dwarf2reader { - -inline uint8 ByteReader::ReadOneByte(const char* buffer) const { - return buffer[0]; -} - -inline uint16 ByteReader::ReadTwoBytes(const char* signed_buffer) const { - const unsigned char *buffer - = reinterpret_cast(signed_buffer); - const uint16 buffer0 = buffer[0]; - const uint16 buffer1 = buffer[1]; - if (endian_ == ENDIANNESS_LITTLE) { - return buffer0 | buffer1 << 8; - } else { - return buffer1 | buffer0 << 8; - } -} - -inline uint64 ByteReader::ReadFourBytes(const char* signed_buffer) const { - const unsigned char *buffer - = reinterpret_cast(signed_buffer); - const uint32 buffer0 = buffer[0]; - const uint32 buffer1 = buffer[1]; - const uint32 buffer2 = buffer[2]; - const uint32 buffer3 = buffer[3]; - if (endian_ == ENDIANNESS_LITTLE) { - return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24; - } else { - return buffer3 | buffer2 << 8 | buffer1 << 16 | buffer0 << 24; - } -} - -inline uint64 ByteReader::ReadEightBytes(const char* signed_buffer) const { - const unsigned char *buffer - = reinterpret_cast(signed_buffer); - const uint64 buffer0 = buffer[0]; - const uint64 buffer1 = buffer[1]; - const uint64 buffer2 = buffer[2]; - const uint64 buffer3 = buffer[3]; - const uint64 buffer4 = buffer[4]; - const uint64 buffer5 = buffer[5]; - const uint64 buffer6 = buffer[6]; - const uint64 buffer7 = buffer[7]; - if (endian_ == ENDIANNESS_LITTLE) { - return buffer0 | buffer1 << 8 | buffer2 << 16 | buffer3 << 24 | - buffer4 << 32 | buffer5 << 40 | buffer6 << 48 | buffer7 << 56; - } else { - return buffer7 | buffer6 << 8 | buffer5 << 16 | buffer4 << 24 | - buffer3 << 32 | buffer2 << 40 | buffer1 << 48 | buffer0 << 56; - } -} - -// Read an unsigned LEB128 number. Each byte contains 7 bits of -// information, plus one bit saying whether the number continues or -// not. - -inline uint64 ByteReader::ReadUnsignedLEB128(const char* buffer, - size_t* len) const { - uint64 result = 0; - size_t num_read = 0; - unsigned int shift = 0; - unsigned char byte; - - do { - byte = *buffer++; - num_read++; - - result |= (static_cast(byte & 0x7f)) << shift; - - shift += 7; - - } while (byte & 0x80); - - *len = num_read; - - return result; -} - -// Read a signed LEB128 number. These are like regular LEB128 -// numbers, except the last byte may have a sign bit set. - -inline int64 ByteReader::ReadSignedLEB128(const char* buffer, - size_t* len) const { - int64 result = 0; - unsigned int shift = 0; - size_t num_read = 0; - unsigned char byte; - - do { - byte = *buffer++; - num_read++; - result |= (static_cast(byte & 0x7f) << shift); - shift += 7; - } while (byte & 0x80); - - if ((shift < 8 * sizeof (result)) && (byte & 0x40)) - result |= -((static_cast(1)) << shift); - *len = num_read; - return result; -} - -inline uint64 ByteReader::ReadOffset(const char* buffer) const { - assert(this->offset_reader_); - return (this->*offset_reader_)(buffer); -} - -inline uint64 ByteReader::ReadAddress(const char* buffer) const { - assert(this->address_reader_); - return (this->*address_reader_)(buffer); -} - -} // namespace dwarf2reader - -#endif // UTIL_DEBUGINFO_BYTEREADER_INL_H__ diff --git a/share/google-breakpad/src/common/dwarf/bytereader.cc b/share/google-breakpad/src/common/dwarf/bytereader.cc deleted file mode 100644 index ca072980e49f75a9098842d5ffda802a8b6517ca..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/bytereader.cc +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright (c) 2010 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. - -#include - -#include "common/dwarf/bytereader-inl.h" -#include "common/dwarf/bytereader.h" - -namespace dwarf2reader { - -ByteReader::ByteReader(enum Endianness endian) - :offset_reader_(NULL), address_reader_(NULL), endian_(endian), - address_size_(0), offset_size_(0) -{ } - -ByteReader::~ByteReader() { } - -void ByteReader::SetOffsetSize(uint8 size) { - offset_size_ = size; - assert(size == 4 || size == 8); - if (size == 4) { - this->offset_reader_ = &ByteReader::ReadFourBytes; - } else { - this->offset_reader_ = &ByteReader::ReadEightBytes; - } -} - -void ByteReader::SetAddressSize(uint8 size) { - address_size_ = size; - assert(size == 4 || size == 8); - if (size == 4) { - this->address_reader_ = &ByteReader::ReadFourBytes; - } else { - this->address_reader_ = &ByteReader::ReadEightBytes; - } -} - -uint64 ByteReader::ReadInitialLength(const char* start, size_t* len) { - const uint64 initial_length = ReadFourBytes(start); - start += 4; - - // In DWARF2/3, if the initial length is all 1 bits, then the offset - // size is 8 and we need to read the next 8 bytes for the real length. - if (initial_length == 0xffffffff) { - SetOffsetSize(8); - *len = 12; - return ReadOffset(start); - } else { - SetOffsetSize(4); - *len = 4; - } - return initial_length; -} - -} // namespace dwarf2reader diff --git a/share/google-breakpad/src/common/dwarf/bytereader.h b/share/google-breakpad/src/common/dwarf/bytereader.h deleted file mode 100644 index bda450d1adba843162734a15a0bac3c8e6ee9073..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/bytereader.h +++ /dev/null @@ -1,219 +0,0 @@ -// -*- mode: C++ -*- - -// Copyright (c) 2010 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. - -#ifndef COMMON_DWARF_BYTEREADER_H__ -#define COMMON_DWARF_BYTEREADER_H__ - -#include -#include "common/dwarf/types.h" - -namespace dwarf2reader { - -// We can't use the obvious name of LITTLE_ENDIAN and BIG_ENDIAN -// because it conflicts with a macro -enum Endianness { - ENDIANNESS_BIG, - ENDIANNESS_LITTLE -}; - -// A ByteReader knows how to read single- and multi-byte values of -// various endiannesses, sizes, and encodings, as used in DWARF -// debugging information. -class ByteReader { - public: - // Construct a ByteReader capable of reading one-, two-, four-, and - // eight-byte values according to ENDIANNESS, absolute machine-sized - // addresses, DWARF-style "initial length" values, and signed and - // unsigned LEB128 numbers. - explicit ByteReader(enum Endianness endianness); - virtual ~ByteReader(); - - // Read a single byte from BUFFER and return it as an unsigned 8 bit - // number. - uint8 ReadOneByte(const char* buffer) const; - - // Read two bytes from BUFFER and return them as an unsigned 16 bit - // number, using this ByteReader's endianness. - uint16 ReadTwoBytes(const char* buffer) const; - - // Read four bytes from BUFFER and return them as an unsigned 32 bit - // number, using this ByteReader's endianness. This function returns - // a uint64 so that it is compatible with ReadAddress and - // ReadOffset. The number it returns will never be outside the range - // of an unsigned 32 bit integer. - uint64 ReadFourBytes(const char* buffer) const; - - // Read eight bytes from BUFFER and return them as an unsigned 64 - // bit number, using this ByteReader's endianness. - uint64 ReadEightBytes(const char* buffer) const; - - // Read an unsigned LEB128 (Little Endian Base 128) number from - // BUFFER and return it as an unsigned 64 bit integer. Set LEN to - // the number of bytes read. - // - // The unsigned LEB128 representation of an integer N is a variable - // number of bytes: - // - // - If N is between 0 and 0x7f, then its unsigned LEB128 - // representation is a single byte whose value is N. - // - // - Otherwise, its unsigned LEB128 representation is (N & 0x7f) | - // 0x80, followed by the unsigned LEB128 representation of N / - // 128, rounded towards negative infinity. - // - // In other words, we break VALUE into groups of seven bits, put - // them in little-endian order, and then write them as eight-bit - // bytes with the high bit on all but the last. - uint64 ReadUnsignedLEB128(const char* buffer, size_t* len) const; - - // Read a signed LEB128 number from BUFFER and return it as an - // signed 64 bit integer. Set LEN to the number of bytes read. - // - // The signed LEB128 representation of an integer N is a variable - // number of bytes: - // - // - If N is between -0x40 and 0x3f, then its signed LEB128 - // representation is a single byte whose value is N in two's - // complement. - // - // - Otherwise, its signed LEB128 representation is (N & 0x7f) | - // 0x80, followed by the signed LEB128 representation of N / 128, - // rounded towards negative infinity. - // - // In other words, we break VALUE into groups of seven bits, put - // them in little-endian order, and then write them as eight-bit - // bytes with the high bit on all but the last. - int64 ReadSignedLEB128(const char* buffer, size_t* len) const; - - // Indicate that addresses on this architecture are SIZE bytes long. SIZE - // must be either 4 or 8. (DWARF allows addresses to be any number of - // bytes in length from 1 to 255, but we only support 32- and 64-bit - // addresses at the moment.) You must call this before using the - // ReadAddress member function. - // - // For data in a .debug_info section, or something that .debug_info - // refers to like line number or macro data, the compilation unit - // header's address_size field indicates the address size to use. Call - // frame information doesn't indicate its address size (a shortcoming of - // the spec); you must supply the appropriate size based on the - // architecture of the target machine. - void SetAddressSize(uint8 size); - - // Return the current address size, in bytes. This is either 4, - // indicating 32-bit addresses, or 8, indicating 64-bit addresses. - uint8 AddressSize() const { return address_size_; } - - // Read an address from BUFFER and return it as an unsigned 64 bit - // integer, respecting this ByteReader's endianness and address size. You - // must call SetAddressSize before calling this function. - uint64 ReadAddress(const char* buffer) const; - - // DWARF actually defines two slightly different formats: 32-bit DWARF - // and 64-bit DWARF. This is *not* related to the size of registers or - // addresses on the target machine; it refers only to the size of section - // offsets and data lengths appearing in the DWARF data. One only needs - // 64-bit DWARF when the debugging data itself is larger than 4GiB. - // 32-bit DWARF can handle x86_64 or PPC64 code just fine, unless the - // debugging data itself is very large. - // - // DWARF information identifies itself as 32-bit or 64-bit DWARF: each - // compilation unit and call frame information entry begins with an - // "initial length" field, which, in addition to giving the length of the - // data, also indicates the size of section offsets and lengths appearing - // in that data. The ReadInitialLength member function, below, reads an - // initial length and sets the ByteReader's offset size as a side effect. - // Thus, in the normal process of reading DWARF data, the appropriate - // offset size is set automatically. So, you should only need to call - // SetOffsetSize if you are using the same ByteReader to jump from the - // midst of one block of DWARF data into another. - - // Read a DWARF "initial length" field from START, and return it as - // an unsigned 64 bit integer, respecting this ByteReader's - // endianness. Set *LEN to the length of the initial length in - // bytes, either four or twelve. As a side effect, set this - // ByteReader's offset size to either 4 (if we see a 32-bit DWARF - // initial length) or 8 (if we see a 64-bit DWARF initial length). - // - // A DWARF initial length is either: - // - // - a byte count stored as an unsigned 32-bit value less than - // 0xffffff00, indicating that the data whose length is being - // measured uses the 32-bit DWARF format, or - // - // - The 32-bit value 0xffffffff, followed by a 64-bit byte count, - // indicating that the data whose length is being measured uses - // the 64-bit DWARF format. - uint64 ReadInitialLength(const char* start, size_t* len); - - // Read an offset from BUFFER and return it as an unsigned 64 bit - // integer, respecting the ByteReader's endianness. In 32-bit DWARF, the - // offset is 4 bytes long; in 64-bit DWARF, the offset is eight bytes - // long. You must call ReadInitialLength or SetOffsetSize before calling - // this function; see the comments above for details. - uint64 ReadOffset(const char* buffer) const; - - // Return the current offset size, in bytes. - // A return value of 4 indicates that we are reading 32-bit DWARF. - // A return value of 8 indicates that we are reading 64-bit DWARF. - uint8 OffsetSize() const { return offset_size_; } - - // Indicate that section offsets and lengths are SIZE bytes long. SIZE - // must be either 4 (meaning 32-bit DWARF) or 8 (meaning 64-bit DWARF). - // Usually, you should not call this function yourself; instead, let a - // call to ReadInitialLength establish the data's offset size - // automatically. - void SetOffsetSize(uint8 size); - - private: - - // Function pointer type for our address and offset readers. - typedef uint64 (ByteReader::*AddressReader)(const char*) const; - - // Read an offset from BUFFER and return it as an unsigned 64 bit - // integer. DWARF2/3 define offsets as either 4 or 8 bytes, - // generally depending on the amount of DWARF2/3 info present. - // This function pointer gets set by SetOffsetSize. - AddressReader offset_reader_; - - // Read an address from BUFFER and return it as an unsigned 64 bit - // integer. DWARF2/3 allow addresses to be any size from 0-255 - // bytes currently. Internally we support 4 and 8 byte addresses, - // and will CHECK on anything else. - // This function pointer gets set by SetAddressSize. - AddressReader address_reader_; - - Endianness endian_; - uint8 address_size_; - uint8 offset_size_; -}; - -} // namespace dwarf2reader - -#endif // COMMON_DWARF_BYTEREADER_H__ diff --git a/share/google-breakpad/src/common/dwarf/dwarf2diehandler.cc b/share/google-breakpad/src/common/dwarf/dwarf2diehandler.cc deleted file mode 100644 index 099f5193a6cd39ea9747ae469100435ea8af26a5..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/dwarf2diehandler.cc +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// dwarf2diehandler.cc: Implement the dwarf2reader::DieDispatcher class. -// See dwarf2diehandler.h for details. - -#include - -#include "common/dwarf/dwarf2diehandler.h" - -namespace dwarf2reader { - -DIEDispatcher::~DIEDispatcher() { - while (!die_handlers_.empty()) { - HandlerStack &entry = die_handlers_.top(); - if (entry.handler_ != root_handler_) - delete entry.handler_; - die_handlers_.pop(); - } -} - -bool DIEDispatcher::StartCompilationUnit(uint64 offset, uint8 address_size, - uint8 offset_size, uint64 cu_length, - uint8 dwarf_version) { - return root_handler_->StartCompilationUnit(offset, address_size, - offset_size, cu_length, - dwarf_version); -} - -bool DIEDispatcher::StartDIE(uint64 offset, enum DwarfTag tag, - const AttributeList& attrs) { - // The stack entry for the parent of this DIE, if there is one. - HandlerStack *parent = die_handlers_.empty() ? NULL : &die_handlers_.top(); - - // Does this call indicate that we're done receiving the parent's - // attributes' values? If so, call its EndAttributes member function. - if (parent && parent->handler_ && !parent->reported_attributes_end_) { - parent->reported_attributes_end_ = true; - if (!parent->handler_->EndAttributes()) { - // Finish off this handler now. and edit *PARENT to indicate that - // we don't want to visit any of the children. - parent->handler_->Finish(); - if (parent->handler_ != root_handler_) - delete parent->handler_; - parent->handler_ = NULL; - return false; - } - } - - // Find a handler for this DIE. - DIEHandler *handler; - if (parent) { - if (parent->handler_) - // Ask the parent to find a handler. - handler = parent->handler_->FindChildHandler(offset, tag, attrs); - else - // No parent handler means we're not interested in any of our - // children. - handler = NULL; - } else { - // This is the root DIE. For a non-root DIE, the parent's handler - // decides whether to visit it, but the root DIE has no parent - // handler, so we have a special method on the root DIE handler - // itself to decide. - if (root_handler_->StartRootDIE(offset, tag, attrs)) - handler = root_handler_; - else - handler = NULL; - } - - // Push a handler stack entry for this new handler. As an - // optimization, we don't push NULL-handler entries on top of other - // NULL-handler entries; we just let the oldest such entry stand for - // the whole subtree. - if (handler || !parent || parent->handler_) { - HandlerStack entry; - entry.offset_ = offset; - entry.handler_ = handler; - entry.reported_attributes_end_ = false; - die_handlers_.push(entry); - } - - return handler != NULL; -} - -void DIEDispatcher::EndDIE(uint64 offset) { - assert(!die_handlers_.empty()); - HandlerStack *entry = &die_handlers_.top(); - if (entry->handler_) { - // This entry had better be the handler for this DIE. - assert(entry->offset_ == offset); - // If a DIE has no children, this EndDIE call indicates that we're - // done receiving its attributes' values. - if (!entry->reported_attributes_end_) - entry->handler_->EndAttributes(); // Ignore return value: no children. - entry->handler_->Finish(); - if (entry->handler_ != root_handler_) - delete entry->handler_; - } else { - // If this DIE is within a tree we're ignoring, then don't pop the - // handler stack: that entry stands for the whole tree. - if (entry->offset_ != offset) - return; - } - die_handlers_.pop(); -} - -void DIEDispatcher::ProcessAttributeUnsigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - HandlerStack ¤t = die_handlers_.top(); - // This had better be an attribute of the DIE we were meant to handle. - assert(offset == current.offset_); - current.handler_->ProcessAttributeUnsigned(attr, form, data); -} - -void DIEDispatcher::ProcessAttributeSigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - int64 data) { - HandlerStack ¤t = die_handlers_.top(); - // This had better be an attribute of the DIE we were meant to handle. - assert(offset == current.offset_); - current.handler_->ProcessAttributeSigned(attr, form, data); -} - -void DIEDispatcher::ProcessAttributeReference(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - HandlerStack ¤t = die_handlers_.top(); - // This had better be an attribute of the DIE we were meant to handle. - assert(offset == current.offset_); - current.handler_->ProcessAttributeReference(attr, form, data); -} - -void DIEDispatcher::ProcessAttributeBuffer(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const char* data, - uint64 len) { - HandlerStack ¤t = die_handlers_.top(); - // This had better be an attribute of the DIE we were meant to handle. - assert(offset == current.offset_); - current.handler_->ProcessAttributeBuffer(attr, form, data, len); -} - -void DIEDispatcher::ProcessAttributeString(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const string& data) { - HandlerStack ¤t = die_handlers_.top(); - // This had better be an attribute of the DIE we were meant to handle. - assert(offset == current.offset_); - current.handler_->ProcessAttributeString(attr, form, data); -} - -} // namespace dwarf2reader diff --git a/share/google-breakpad/src/common/dwarf/dwarf2diehandler.h b/share/google-breakpad/src/common/dwarf/dwarf2diehandler.h deleted file mode 100644 index 4c9d7536a856da268201e322cc030bf74d78dd68..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/dwarf2diehandler.h +++ /dev/null @@ -1,358 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// dwarf2reader::CompilationUnit is a simple and direct parser for -// DWARF data, but its handler interface is not convenient to use. In -// particular: -// -// - CompilationUnit calls Dwarf2Handler's member functions to report -// every attribute's value, regardless of what sort of DIE it is. -// As a result, the ProcessAttributeX functions end up looking like -// this: -// -// switch (parent_die_tag) { -// case DW_TAG_x: -// switch (attribute_name) { -// case DW_AT_y: -// handle attribute y of DIE type x -// ... -// } break; -// ... -// } -// -// In C++ it's much nicer to use virtual function dispatch to find -// the right code for a given case than to switch on the DIE tag -// like this. -// -// - Processing different kinds of DIEs requires different sets of -// data: lexical block DIEs have start and end addresses, but struct -// type DIEs don't. It would be nice to be able to have separate -// handler classes for separate kinds of DIEs, each with the members -// appropriate to its role, instead of having one handler class that -// needs to hold data for every DIE type. -// -// - There should be a separate instance of the appropriate handler -// class for each DIE, instead of a single object with tables -// tracking all the dies in the compilation unit. -// -// - It's not convenient to take some action after all a DIE's -// attributes have been seen, but before visiting any of its -// children. The only indication you have that a DIE's attribute -// list is complete is that you get either a StartDIE or an EndDIE -// call. -// -// - It's not convenient to make use of the tree structure of the -// DIEs. Skipping all the children of a given die requires -// maintaining state and returning false from StartDIE until we get -// an EndDIE call with the appropriate offset. -// -// This interface tries to take care of all that. (You're shocked, I'm sure.) -// -// Using the classes here, you provide an initial handler for the root -// DIE of the compilation unit. Each handler receives its DIE's -// attributes, and provides fresh handler objects for children of -// interest, if any. The three classes are: -// -// - DIEHandler: the base class for your DIE-type-specific handler -// classes. -// -// - RootDIEHandler: derived from DIEHandler, the base class for your -// root DIE handler class. -// -// - DIEDispatcher: derived from Dwarf2Handler, an instance of this -// invokes your DIE-type-specific handler objects. -// -// In detail: -// -// - Define handler classes specialized for the DIE types you're -// interested in. These handler classes must inherit from -// DIEHandler. Thus: -// -// class My_DW_TAG_X_Handler: public DIEHandler { ... }; -// class My_DW_TAG_Y_Handler: public DIEHandler { ... }; -// -// DIEHandler subclasses needn't correspond exactly to single DIE -// types, as shown here; the point is that you can have several -// different classes appropriate to different kinds of DIEs. -// -// - In particular, define a handler class for the compilation -// unit's root DIE, that inherits from RootDIEHandler: -// -// class My_DW_TAG_compile_unit_Handler: public RootDIEHandler { ... }; -// -// RootDIEHandler inherits from DIEHandler, adding a few additional -// member functions for examining the compilation unit as a whole, -// and other quirks of rootness. -// -// - Then, create a DIEDispatcher instance, passing it an instance of -// your root DIE handler class, and use that DIEDispatcher as the -// dwarf2reader::CompilationUnit's handler: -// -// My_DW_TAG_compile_unit_Handler root_die_handler(...); -// DIEDispatcher die_dispatcher(&root_die_handler); -// CompilationUnit reader(sections, offset, bytereader, &die_dispatcher); -// -// Here, 'die_dispatcher' acts as a shim between 'reader' and the -// various DIE-specific handlers you have defined. -// -// - When you call reader.Start(), die_dispatcher behaves as follows, -// starting with your root die handler and the compilation unit's -// root DIE: -// -// - It calls the handler's ProcessAttributeX member functions for -// each of the DIE's attributes. -// -// - It calls the handler's EndAttributes member function. This -// should return true if any of the DIE's children should be -// visited, in which case: -// -// - For each of the DIE's children, die_dispatcher calls the -// DIE's handler's FindChildHandler member function. If that -// returns a pointer to a DIEHandler instance, then -// die_dispatcher uses that handler to process the child, using -// this procedure recursively. Alternatively, if -// FindChildHandler returns NULL, die_dispatcher ignores that -// child and its descendants. -// -// - When die_dispatcher has finished processing all the DIE's -// children, it invokes the handler's Finish() member function, -// and destroys the handler. (As a special case, it doesn't -// destroy the root DIE handler.) -// -// This allows the code for handling a particular kind of DIE to be -// gathered together in a single class, makes it easy to skip all the -// children or individual children of a particular DIE, and provides -// appropriate parental context for each die. - -#ifndef COMMON_DWARF_DWARF2DIEHANDLER_H__ -#define COMMON_DWARF_DWARF2DIEHANDLER_H__ - -#include - -#include "common/dwarf/types.h" -#include "common/dwarf/dwarf2enums.h" -#include "common/dwarf/dwarf2reader.h" - -namespace dwarf2reader { - -// A base class for handlers for specific DIE types. The series of -// calls made on a DIE handler is as follows: -// -// - for each attribute of the DIE: -// - ProcessAttributeX() -// - EndAttributes() -// - if that returned true, then for each child: -// - FindChildHandler() -// - if that returns a non-NULL pointer to a new handler: -// - recurse, with the new handler and the child die -// - Finish() -// - destruction -class DIEHandler { - public: - DIEHandler() { } - virtual ~DIEHandler() { } - - // When we visit a DIE, we first use these member functions to - // report the DIE's attributes and their values. These have the - // same restrictions as the corresponding member functions of - // dwarf2reader::Dwarf2Handler. - // - // Since DWARF does not specify in what order attributes must - // appear, avoid making decisions in these functions that would be - // affected by the presence of other attributes. The EndAttributes - // function is a more appropriate place for such work, as all the - // DIE's attributes have been seen at that point. - // - // The default definitions ignore the values they are passed. - virtual void ProcessAttributeUnsigned(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { } - virtual void ProcessAttributeSigned(enum DwarfAttribute attr, - enum DwarfForm form, - int64 data) { } - virtual void ProcessAttributeReference(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { } - virtual void ProcessAttributeBuffer(enum DwarfAttribute attr, - enum DwarfForm form, - const char* data, - uint64 len) { } - virtual void ProcessAttributeString(enum DwarfAttribute attr, - enum DwarfForm form, - const string& data) { } - - // Once we have reported all the DIE's attributes' values, we call - // this member function. If it returns false, we skip all the DIE's - // children. If it returns true, we call FindChildHandler on each - // child. If that returns a handler object, we use that to visit - // the child; otherwise, we skip the child. - // - // This is a good place to make decisions that depend on more than - // one attribute. DWARF does not specify in what order attributes - // must appear, so only when the EndAttributes function is called - // does the handler have a complete picture of the DIE's attributes. - // - // The default definition elects to ignore the DIE's children. - // You'll need to override this if you override FindChildHandler, - // but at least the default behavior isn't to pass the children to - // FindChildHandler, which then ignores them all. - virtual bool EndAttributes() { return false; } - - // If EndAttributes returns true to indicate that some of the DIE's - // children might be of interest, then we apply this function to - // each of the DIE's children. If it returns a handler object, then - // we use that to visit the child DIE. If it returns NULL, we skip - // that child DIE (and all its descendants). - // - // OFFSET is the offset of the child; TAG indicates what kind of DIE - // it is; and ATTRS is the list of attributes the DIE will have, and - // their forms (their values are not provided). - // - // The default definition skips all children. - virtual DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag, - const AttributeList &attrs) { - return NULL; - } - - // When we are done processing a DIE, we call this member function. - // This happens after the EndAttributes call, all FindChildHandler - // calls (if any), and all operations on the children themselves (if - // any). We call Finish on every handler --- even if EndAttributes - // returns false. - virtual void Finish() { }; -}; - -// A subclass of DIEHandler, with additional kludges for handling the -// compilation unit's root die. -class RootDIEHandler: public DIEHandler { - public: - RootDIEHandler() { } - virtual ~RootDIEHandler() { } - - // We pass the values reported via Dwarf2Handler::StartCompilationUnit - // to this member function, and skip the entire compilation unit if it - // returns false. So the root DIE handler is actually also - // responsible for handling the compilation unit metadata. - // The default definition always visits the compilation unit. - virtual bool StartCompilationUnit(uint64 offset, uint8 address_size, - uint8 offset_size, uint64 cu_length, - uint8 dwarf_version) { return true; } - - // For the root DIE handler only, we pass the offset, tag and - // attributes of the compilation unit's root DIE. This is the only - // way the root DIE handler can find the root DIE's tag. If this - // function returns true, we will visit the root DIE using the usual - // DIEHandler methods; otherwise, we skip the entire compilation - // unit. - // - // The default definition elects to visit the root DIE. - virtual bool StartRootDIE(uint64 offset, enum DwarfTag tag, - const AttributeList& attrs) { return true; } -}; - -class DIEDispatcher: public Dwarf2Handler { - public: - // Create a Dwarf2Handler which uses ROOT_HANDLER as the handler for - // the compilation unit's root die, as described for the DIEHandler - // class. - DIEDispatcher(RootDIEHandler *root_handler) : root_handler_(root_handler) { } - // Destroying a DIEDispatcher destroys all active handler objects - // except the root handler. - ~DIEDispatcher(); - bool StartCompilationUnit(uint64 offset, uint8 address_size, - uint8 offset_size, uint64 cu_length, - uint8 dwarf_version); - bool StartDIE(uint64 offset, enum DwarfTag tag, - const AttributeList &attrs); - void ProcessAttributeUnsigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - void ProcessAttributeSigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - int64 data); - void ProcessAttributeReference(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - void ProcessAttributeBuffer(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const char* data, - uint64 len); - void ProcessAttributeString(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const string &data); - void EndDIE(uint64 offset); - - private: - - // The type of a handler stack entry. This includes some fields - // which don't really need to be on the stack --- they could just be - // single data members of DIEDispatcher --- but putting them here - // makes it easier to see that the code is correct. - struct HandlerStack { - // The offset of the DIE for this handler stack entry. - uint64 offset_; - - // The handler object interested in this DIE's attributes and - // children. If NULL, we're not interested in either. - DIEHandler *handler_; - - // Have we reported the end of this DIE's attributes to the handler? - bool reported_attributes_end_; - }; - - // Stack of DIE attribute handlers. At StartDIE(D), the top of the - // stack is the handler of D's parent, whom we may ask for a handler - // for D itself. At EndDIE(D), the top of the stack is D's handler. - // Special cases: - // - // - Before we've seen the compilation unit's root DIE, the stack is - // empty; we'll call root_handler_'s special member functions, and - // perhaps push root_handler_ on the stack to look at the root's - // immediate children. - // - // - When we decide to ignore a subtree, we only push an entry on - // the stack for the root of the tree being ignored, rather than - // pushing lots of stack entries with handler_ set to NULL. - stack die_handlers_; - - // The root handler. We don't push it on die_handlers_ until we - // actually get the StartDIE call for the root. - RootDIEHandler *root_handler_; -}; - -} // namespace dwarf2reader -#endif // COMMON_DWARF_DWARF2DIEHANDLER_H__ diff --git a/share/google-breakpad/src/common/dwarf/dwarf2enums.h b/share/google-breakpad/src/common/dwarf/dwarf2enums.h deleted file mode 100644 index 9e6c027810b6e4596c6a63584f622f83f181c7b2..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/dwarf2enums.h +++ /dev/null @@ -1,534 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef COMMON_DWARF_DWARF2ENUMS_H__ -#define COMMON_DWARF_DWARF2ENUMS_H__ - -namespace dwarf2reader { - -// These enums do not follow the google3 style only because they are -// known universally (specs, other implementations) by the names in -// exactly this capitalization. -// Tag names and codes. -enum DwarfTag { - DW_TAG_padding = 0x00, - DW_TAG_array_type = 0x01, - DW_TAG_class_type = 0x02, - DW_TAG_entry_point = 0x03, - DW_TAG_enumeration_type = 0x04, - DW_TAG_formal_parameter = 0x05, - DW_TAG_imported_declaration = 0x08, - DW_TAG_label = 0x0a, - DW_TAG_lexical_block = 0x0b, - DW_TAG_member = 0x0d, - DW_TAG_pointer_type = 0x0f, - DW_TAG_reference_type = 0x10, - DW_TAG_compile_unit = 0x11, - DW_TAG_string_type = 0x12, - DW_TAG_structure_type = 0x13, - DW_TAG_subroutine_type = 0x15, - DW_TAG_typedef = 0x16, - DW_TAG_union_type = 0x17, - DW_TAG_unspecified_parameters = 0x18, - DW_TAG_variant = 0x19, - DW_TAG_common_block = 0x1a, - DW_TAG_common_inclusion = 0x1b, - DW_TAG_inheritance = 0x1c, - DW_TAG_inlined_subroutine = 0x1d, - DW_TAG_module = 0x1e, - DW_TAG_ptr_to_member_type = 0x1f, - DW_TAG_set_type = 0x20, - DW_TAG_subrange_type = 0x21, - DW_TAG_with_stmt = 0x22, - DW_TAG_access_declaration = 0x23, - DW_TAG_base_type = 0x24, - DW_TAG_catch_block = 0x25, - DW_TAG_const_type = 0x26, - DW_TAG_constant = 0x27, - DW_TAG_enumerator = 0x28, - DW_TAG_file_type = 0x29, - DW_TAG_friend = 0x2a, - DW_TAG_namelist = 0x2b, - DW_TAG_namelist_item = 0x2c, - DW_TAG_packed_type = 0x2d, - DW_TAG_subprogram = 0x2e, - DW_TAG_template_type_param = 0x2f, - DW_TAG_template_value_param = 0x30, - DW_TAG_thrown_type = 0x31, - DW_TAG_try_block = 0x32, - DW_TAG_variant_part = 0x33, - DW_TAG_variable = 0x34, - DW_TAG_volatile_type = 0x35, - // DWARF 3. - DW_TAG_dwarf_procedure = 0x36, - DW_TAG_restrict_type = 0x37, - DW_TAG_interface_type = 0x38, - DW_TAG_namespace = 0x39, - DW_TAG_imported_module = 0x3a, - DW_TAG_unspecified_type = 0x3b, - DW_TAG_partial_unit = 0x3c, - DW_TAG_imported_unit = 0x3d, - // SGI/MIPS Extensions. - DW_TAG_MIPS_loop = 0x4081, - // HP extensions. See: - // ftp://ftp.hp.com/pub/lang/tools/WDB/wdb-4.0.tar.gz - DW_TAG_HP_array_descriptor = 0x4090, - // GNU extensions. - DW_TAG_format_label = 0x4101, // For FORTRAN 77 and Fortran 90. - DW_TAG_function_template = 0x4102, // For C++. - DW_TAG_class_template = 0x4103, // For C++. - DW_TAG_GNU_BINCL = 0x4104, - DW_TAG_GNU_EINCL = 0x4105, - // Extensions for UPC. See: http://upc.gwu.edu/~upc. - DW_TAG_upc_shared_type = 0x8765, - DW_TAG_upc_strict_type = 0x8766, - DW_TAG_upc_relaxed_type = 0x8767, - // PGI (STMicroelectronics) extensions. No documentation available. - DW_TAG_PGI_kanji_type = 0xA000, - DW_TAG_PGI_interface_block = 0xA020 -}; - - -enum DwarfHasChild { - DW_children_no = 0, - DW_children_yes = 1 -}; - -// Form names and codes. -enum DwarfForm { - DW_FORM_addr = 0x01, - DW_FORM_block2 = 0x03, - DW_FORM_block4 = 0x04, - DW_FORM_data2 = 0x05, - DW_FORM_data4 = 0x06, - DW_FORM_data8 = 0x07, - DW_FORM_string = 0x08, - DW_FORM_block = 0x09, - DW_FORM_block1 = 0x0a, - DW_FORM_data1 = 0x0b, - DW_FORM_flag = 0x0c, - DW_FORM_sdata = 0x0d, - DW_FORM_strp = 0x0e, - DW_FORM_udata = 0x0f, - DW_FORM_ref_addr = 0x10, - DW_FORM_ref1 = 0x11, - DW_FORM_ref2 = 0x12, - DW_FORM_ref4 = 0x13, - DW_FORM_ref8 = 0x14, - DW_FORM_ref_udata = 0x15, - DW_FORM_indirect = 0x16 -}; - -// Attribute names and codes -enum DwarfAttribute { - DW_AT_sibling = 0x01, - DW_AT_location = 0x02, - DW_AT_name = 0x03, - DW_AT_ordering = 0x09, - DW_AT_subscr_data = 0x0a, - DW_AT_byte_size = 0x0b, - DW_AT_bit_offset = 0x0c, - DW_AT_bit_size = 0x0d, - DW_AT_element_list = 0x0f, - DW_AT_stmt_list = 0x10, - DW_AT_low_pc = 0x11, - DW_AT_high_pc = 0x12, - DW_AT_language = 0x13, - DW_AT_member = 0x14, - DW_AT_discr = 0x15, - DW_AT_discr_value = 0x16, - DW_AT_visibility = 0x17, - DW_AT_import = 0x18, - DW_AT_string_length = 0x19, - DW_AT_common_reference = 0x1a, - DW_AT_comp_dir = 0x1b, - DW_AT_const_value = 0x1c, - DW_AT_containing_type = 0x1d, - DW_AT_default_value = 0x1e, - DW_AT_inline = 0x20, - DW_AT_is_optional = 0x21, - DW_AT_lower_bound = 0x22, - DW_AT_producer = 0x25, - DW_AT_prototyped = 0x27, - DW_AT_return_addr = 0x2a, - DW_AT_start_scope = 0x2c, - DW_AT_stride_size = 0x2e, - DW_AT_upper_bound = 0x2f, - DW_AT_abstract_origin = 0x31, - DW_AT_accessibility = 0x32, - DW_AT_address_class = 0x33, - DW_AT_artificial = 0x34, - DW_AT_base_types = 0x35, - DW_AT_calling_convention = 0x36, - DW_AT_count = 0x37, - DW_AT_data_member_location = 0x38, - DW_AT_decl_column = 0x39, - DW_AT_decl_file = 0x3a, - DW_AT_decl_line = 0x3b, - DW_AT_declaration = 0x3c, - DW_AT_discr_list = 0x3d, - DW_AT_encoding = 0x3e, - DW_AT_external = 0x3f, - DW_AT_frame_base = 0x40, - DW_AT_friend = 0x41, - DW_AT_identifier_case = 0x42, - DW_AT_macro_info = 0x43, - DW_AT_namelist_items = 0x44, - DW_AT_priority = 0x45, - DW_AT_segment = 0x46, - DW_AT_specification = 0x47, - DW_AT_static_link = 0x48, - DW_AT_type = 0x49, - DW_AT_use_location = 0x4a, - DW_AT_variable_parameter = 0x4b, - DW_AT_virtuality = 0x4c, - DW_AT_vtable_elem_location = 0x4d, - // DWARF 3 values. - DW_AT_allocated = 0x4e, - DW_AT_associated = 0x4f, - DW_AT_data_location = 0x50, - DW_AT_stride = 0x51, - DW_AT_entry_pc = 0x52, - DW_AT_use_UTF8 = 0x53, - DW_AT_extension = 0x54, - DW_AT_ranges = 0x55, - DW_AT_trampoline = 0x56, - DW_AT_call_column = 0x57, - DW_AT_call_file = 0x58, - DW_AT_call_line = 0x59, - // SGI/MIPS extensions. - DW_AT_MIPS_fde = 0x2001, - DW_AT_MIPS_loop_begin = 0x2002, - DW_AT_MIPS_tail_loop_begin = 0x2003, - DW_AT_MIPS_epilog_begin = 0x2004, - DW_AT_MIPS_loop_unroll_factor = 0x2005, - DW_AT_MIPS_software_pipeline_depth = 0x2006, - DW_AT_MIPS_linkage_name = 0x2007, - DW_AT_MIPS_stride = 0x2008, - DW_AT_MIPS_abstract_name = 0x2009, - DW_AT_MIPS_clone_origin = 0x200a, - DW_AT_MIPS_has_inlines = 0x200b, - // HP extensions. - DW_AT_HP_block_index = 0x2000, - DW_AT_HP_unmodifiable = 0x2001, // Same as DW_AT_MIPS_fde. - DW_AT_HP_actuals_stmt_list = 0x2010, - DW_AT_HP_proc_per_section = 0x2011, - DW_AT_HP_raw_data_ptr = 0x2012, - DW_AT_HP_pass_by_reference = 0x2013, - DW_AT_HP_opt_level = 0x2014, - DW_AT_HP_prof_version_id = 0x2015, - DW_AT_HP_opt_flags = 0x2016, - DW_AT_HP_cold_region_low_pc = 0x2017, - DW_AT_HP_cold_region_high_pc = 0x2018, - DW_AT_HP_all_variables_modifiable = 0x2019, - DW_AT_HP_linkage_name = 0x201a, - DW_AT_HP_prof_flags = 0x201b, // In comp unit of procs_info for -g. - // GNU extensions. - DW_AT_sf_names = 0x2101, - DW_AT_src_info = 0x2102, - DW_AT_mac_info = 0x2103, - DW_AT_src_coords = 0x2104, - DW_AT_body_begin = 0x2105, - DW_AT_body_end = 0x2106, - DW_AT_GNU_vector = 0x2107, - // VMS extensions. - DW_AT_VMS_rtnbeg_pd_address = 0x2201, - // UPC extension. - DW_AT_upc_threads_scaled = 0x3210, - // PGI (STMicroelectronics) extensions. - DW_AT_PGI_lbase = 0x3a00, - DW_AT_PGI_soffset = 0x3a01, - DW_AT_PGI_lstride = 0x3a02 -}; - - -// Line number opcodes. -enum DwarfLineNumberOps { - DW_LNS_extended_op = 0, - DW_LNS_copy = 1, - DW_LNS_advance_pc = 2, - DW_LNS_advance_line = 3, - DW_LNS_set_file = 4, - DW_LNS_set_column = 5, - DW_LNS_negate_stmt = 6, - DW_LNS_set_basic_block = 7, - DW_LNS_const_add_pc = 8, - DW_LNS_fixed_advance_pc = 9, - // DWARF 3. - DW_LNS_set_prologue_end = 10, - DW_LNS_set_epilogue_begin = 11, - DW_LNS_set_isa = 12 -}; - -// Line number extended opcodes. -enum DwarfLineNumberExtendedOps { - DW_LNE_end_sequence = 1, - DW_LNE_set_address = 2, - DW_LNE_define_file = 3, - // HP extensions. - DW_LNE_HP_negate_is_UV_update = 0x11, - DW_LNE_HP_push_context = 0x12, - DW_LNE_HP_pop_context = 0x13, - DW_LNE_HP_set_file_line_column = 0x14, - DW_LNE_HP_set_routine_name = 0x15, - DW_LNE_HP_set_sequence = 0x16, - DW_LNE_HP_negate_post_semantics = 0x17, - DW_LNE_HP_negate_function_exit = 0x18, - DW_LNE_HP_negate_front_end_logical = 0x19, - DW_LNE_HP_define_proc = 0x20 -}; - -// Type encoding names and codes -enum DwarfEncoding { - DW_ATE_address =0x1, - DW_ATE_boolean =0x2, - DW_ATE_complex_float =0x3, - DW_ATE_float =0x4, - DW_ATE_signed =0x5, - DW_ATE_signed_char =0x6, - DW_ATE_unsigned =0x7, - DW_ATE_unsigned_char =0x8, - // DWARF3/DWARF3f - DW_ATE_imaginary_float =0x9, - DW_ATE_packed_decimal =0xa, - DW_ATE_numeric_string =0xb, - DW_ATE_edited =0xc, - DW_ATE_signed_fixed =0xd, - DW_ATE_unsigned_fixed =0xe, - DW_ATE_decimal_float =0xf, - DW_ATE_lo_user =0x80, - DW_ATE_hi_user =0xff -}; - -// Location virtual machine opcodes -enum DwarfOpcode { - DW_OP_addr =0x03, - DW_OP_deref =0x06, - DW_OP_const1u =0x08, - DW_OP_const1s =0x09, - DW_OP_const2u =0x0a, - DW_OP_const2s =0x0b, - DW_OP_const4u =0x0c, - DW_OP_const4s =0x0d, - DW_OP_const8u =0x0e, - DW_OP_const8s =0x0f, - DW_OP_constu =0x10, - DW_OP_consts =0x11, - DW_OP_dup =0x12, - DW_OP_drop =0x13, - DW_OP_over =0x14, - DW_OP_pick =0x15, - DW_OP_swap =0x16, - DW_OP_rot =0x17, - DW_OP_xderef =0x18, - DW_OP_abs =0x19, - DW_OP_and =0x1a, - DW_OP_div =0x1b, - DW_OP_minus =0x1c, - DW_OP_mod =0x1d, - DW_OP_mul =0x1e, - DW_OP_neg =0x1f, - DW_OP_not =0x20, - DW_OP_or =0x21, - DW_OP_plus =0x22, - DW_OP_plus_uconst =0x23, - DW_OP_shl =0x24, - DW_OP_shr =0x25, - DW_OP_shra =0x26, - DW_OP_xor =0x27, - DW_OP_bra =0x28, - DW_OP_eq =0x29, - DW_OP_ge =0x2a, - DW_OP_gt =0x2b, - DW_OP_le =0x2c, - DW_OP_lt =0x2d, - DW_OP_ne =0x2e, - DW_OP_skip =0x2f, - DW_OP_lit0 =0x30, - DW_OP_lit1 =0x31, - DW_OP_lit2 =0x32, - DW_OP_lit3 =0x33, - DW_OP_lit4 =0x34, - DW_OP_lit5 =0x35, - DW_OP_lit6 =0x36, - DW_OP_lit7 =0x37, - DW_OP_lit8 =0x38, - DW_OP_lit9 =0x39, - DW_OP_lit10 =0x3a, - DW_OP_lit11 =0x3b, - DW_OP_lit12 =0x3c, - DW_OP_lit13 =0x3d, - DW_OP_lit14 =0x3e, - DW_OP_lit15 =0x3f, - DW_OP_lit16 =0x40, - DW_OP_lit17 =0x41, - DW_OP_lit18 =0x42, - DW_OP_lit19 =0x43, - DW_OP_lit20 =0x44, - DW_OP_lit21 =0x45, - DW_OP_lit22 =0x46, - DW_OP_lit23 =0x47, - DW_OP_lit24 =0x48, - DW_OP_lit25 =0x49, - DW_OP_lit26 =0x4a, - DW_OP_lit27 =0x4b, - DW_OP_lit28 =0x4c, - DW_OP_lit29 =0x4d, - DW_OP_lit30 =0x4e, - DW_OP_lit31 =0x4f, - DW_OP_reg0 =0x50, - DW_OP_reg1 =0x51, - DW_OP_reg2 =0x52, - DW_OP_reg3 =0x53, - DW_OP_reg4 =0x54, - DW_OP_reg5 =0x55, - DW_OP_reg6 =0x56, - DW_OP_reg7 =0x57, - DW_OP_reg8 =0x58, - DW_OP_reg9 =0x59, - DW_OP_reg10 =0x5a, - DW_OP_reg11 =0x5b, - DW_OP_reg12 =0x5c, - DW_OP_reg13 =0x5d, - DW_OP_reg14 =0x5e, - DW_OP_reg15 =0x5f, - DW_OP_reg16 =0x60, - DW_OP_reg17 =0x61, - DW_OP_reg18 =0x62, - DW_OP_reg19 =0x63, - DW_OP_reg20 =0x64, - DW_OP_reg21 =0x65, - DW_OP_reg22 =0x66, - DW_OP_reg23 =0x67, - DW_OP_reg24 =0x68, - DW_OP_reg25 =0x69, - DW_OP_reg26 =0x6a, - DW_OP_reg27 =0x6b, - DW_OP_reg28 =0x6c, - DW_OP_reg29 =0x6d, - DW_OP_reg30 =0x6e, - DW_OP_reg31 =0x6f, - DW_OP_breg0 =0x70, - DW_OP_breg1 =0x71, - DW_OP_breg2 =0x72, - DW_OP_breg3 =0x73, - DW_OP_breg4 =0x74, - DW_OP_breg5 =0x75, - DW_OP_breg6 =0x76, - DW_OP_breg7 =0x77, - DW_OP_breg8 =0x78, - DW_OP_breg9 =0x79, - DW_OP_breg10 =0x7a, - DW_OP_breg11 =0x7b, - DW_OP_breg12 =0x7c, - DW_OP_breg13 =0x7d, - DW_OP_breg14 =0x7e, - DW_OP_breg15 =0x7f, - DW_OP_breg16 =0x80, - DW_OP_breg17 =0x81, - DW_OP_breg18 =0x82, - DW_OP_breg19 =0x83, - DW_OP_breg20 =0x84, - DW_OP_breg21 =0x85, - DW_OP_breg22 =0x86, - DW_OP_breg23 =0x87, - DW_OP_breg24 =0x88, - DW_OP_breg25 =0x89, - DW_OP_breg26 =0x8a, - DW_OP_breg27 =0x8b, - DW_OP_breg28 =0x8c, - DW_OP_breg29 =0x8d, - DW_OP_breg30 =0x8e, - DW_OP_breg31 =0x8f, - DW_OP_regX =0x90, - DW_OP_fbreg =0x91, - DW_OP_bregX =0x92, - DW_OP_piece =0x93, - DW_OP_deref_size =0x94, - DW_OP_xderef_size =0x95, - DW_OP_nop =0x96, - // DWARF3/DWARF3f - DW_OP_push_object_address =0x97, - DW_OP_call2 =0x98, - DW_OP_call4 =0x99, - DW_OP_call_ref =0x9a, - DW_OP_form_tls_address =0x9b, - DW_OP_call_frame_cfa =0x9c, - DW_OP_bit_piece =0x9d, - DW_OP_lo_user =0xe0, - DW_OP_hi_user =0xff, - // GNU extensions - DW_OP_GNU_push_tls_address =0xe0 -}; - -// Source languages. These are values for DW_AT_language. -enum DwarfLanguage - { - DW_LANG_none =0x0000, - DW_LANG_C89 =0x0001, - DW_LANG_C =0x0002, - DW_LANG_Ada83 =0x0003, - DW_LANG_C_plus_plus =0x0004, - DW_LANG_Cobol74 =0x0005, - DW_LANG_Cobol85 =0x0006, - DW_LANG_Fortran77 =0x0007, - DW_LANG_Fortran90 =0x0008, - DW_LANG_Pascal83 =0x0009, - DW_LANG_Modula2 =0x000a, - DW_LANG_Java =0x000b, - DW_LANG_C99 =0x000c, - DW_LANG_Ada95 =0x000d, - DW_LANG_Fortran95 =0x000e, - DW_LANG_PLI =0x000f, - DW_LANG_ObjC =0x0010, - DW_LANG_ObjC_plus_plus =0x0011, - DW_LANG_UPC =0x0012, - DW_LANG_D =0x0013, - // Implementation-defined language code range. - DW_LANG_lo_user = 0x8000, - DW_LANG_hi_user = 0xffff, - - // Extensions. - - // MIPS assembly language. The GNU toolchain uses this for all - // assembly languages, since there's no generic DW_LANG_ value for that. - // See include/dwarf2.h in the binutils, gdb, or gcc source trees. - DW_LANG_Mips_Assembler =0x8001, - DW_LANG_Upc =0x8765 // Unified Parallel C - }; - -// Inline codes. These are values for DW_AT_inline. -enum DwarfInline { - DW_INL_not_inlined =0x0, - DW_INL_inlined =0x1, - DW_INL_declared_not_inlined =0x2, - DW_INL_declared_inlined =0x3, -}; - -} // namespace dwarf2reader -#endif // COMMON_DWARF_DWARF2ENUMS_H__ diff --git a/share/google-breakpad/src/common/dwarf/dwarf2reader.cc b/share/google-breakpad/src/common/dwarf/dwarf2reader.cc deleted file mode 100644 index ec30a3092d923d0e7cf637ac04b8b0ce2aefa7b7..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/dwarf2reader.cc +++ /dev/null @@ -1,867 +0,0 @@ -// Copyright (c) 2010 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. - -// Implementation of dwarf2reader::LineInfo and dwarf2reader::CompilationUnit. -// See dwarf2reader.h for details. - -#include -#include -#include -#include -#include -#include - -#include "common/dwarf/bytereader-inl.h" -#include "common/dwarf/dwarf2reader.h" -#include "common/dwarf/bytereader.h" -#include "common/dwarf/line_state_machine.h" - -namespace dwarf2reader { - -CompilationUnit::CompilationUnit(const SectionMap& sections, uint64 offset, - ByteReader* reader, Dwarf2Handler* handler) - : offset_from_section_start_(offset), reader_(reader), - sections_(sections), handler_(handler), abbrevs_(NULL), - string_buffer_(NULL), string_buffer_length_(0) {} - -// Read a DWARF2/3 abbreviation section. -// Each abbrev consists of a abbreviation number, a tag, a byte -// specifying whether the tag has children, and a list of -// attribute/form pairs. -// The list of forms is terminated by a 0 for the attribute, and a -// zero for the form. The entire abbreviation section is terminated -// by a zero for the code. - -void CompilationUnit::ReadAbbrevs() { - if (abbrevs_) - return; - - // First get the debug_abbrev section. ".debug_abbrev" is the name - // recommended in the DWARF spec, and used on Linux; - // "__debug_abbrev" is the name used in Mac OS X Mach-O files. - SectionMap::const_iterator iter = sections_.find(".debug_abbrev"); - if (iter == sections_.end()) - iter = sections_.find("__debug_abbrev"); - assert(iter != sections_.end()); - - abbrevs_ = new vector; - abbrevs_->resize(1); - - // The only way to check whether we are reading over the end of the - // buffer would be to first compute the size of the leb128 data by - // reading it, then go back and read it again. - const char* abbrev_start = iter->second.first + - header_.abbrev_offset; - const char* abbrevptr = abbrev_start; -#ifndef NDEBUG - const uint64 abbrev_length = iter->second.second - header_.abbrev_offset; -#endif - - while (1) { - CompilationUnit::Abbrev abbrev; - size_t len; - const uint32 number = reader_->ReadUnsignedLEB128(abbrevptr, &len); - - if (number == 0) - break; - abbrev.number = number; - abbrevptr += len; - - assert(abbrevptr < abbrev_start + abbrev_length); - const uint32 tag = reader_->ReadUnsignedLEB128(abbrevptr, &len); - abbrevptr += len; - abbrev.tag = static_cast(tag); - - assert(abbrevptr < abbrev_start + abbrev_length); - abbrev.has_children = reader_->ReadOneByte(abbrevptr); - abbrevptr += 1; - - assert(abbrevptr < abbrev_start + abbrev_length); - - while (1) { - const uint32 nametemp = reader_->ReadUnsignedLEB128(abbrevptr, &len); - abbrevptr += len; - - assert(abbrevptr < abbrev_start + abbrev_length); - const uint32 formtemp = reader_->ReadUnsignedLEB128(abbrevptr, &len); - abbrevptr += len; - if (nametemp == 0 && formtemp == 0) - break; - - const enum DwarfAttribute name = - static_cast(nametemp); - const enum DwarfForm form = static_cast(formtemp); - abbrev.attributes.push_back(make_pair(name, form)); - } - assert(abbrev.number == abbrevs_->size()); - abbrevs_->push_back(abbrev); - } -} - -// Skips a single DIE's attributes. -const char* CompilationUnit::SkipDIE(const char* start, - const Abbrev& abbrev) { - for (AttributeList::const_iterator i = abbrev.attributes.begin(); - i != abbrev.attributes.end(); - i++) { - start = SkipAttribute(start, i->second); - } - return start; -} - -// Skips a single attribute form's data. -const char* CompilationUnit::SkipAttribute(const char* start, - enum DwarfForm form) { - size_t len; - - switch (form) { - case DW_FORM_indirect: - form = static_cast(reader_->ReadUnsignedLEB128(start, - &len)); - start += len; - return SkipAttribute(start, form); - break; - - case DW_FORM_data1: - case DW_FORM_flag: - case DW_FORM_ref1: - return start + 1; - break; - case DW_FORM_ref2: - case DW_FORM_data2: - return start + 2; - break; - case DW_FORM_ref4: - case DW_FORM_data4: - return start + 4; - break; - case DW_FORM_ref8: - case DW_FORM_data8: - return start + 8; - break; - case DW_FORM_string: - return start + strlen(start) + 1; - break; - case DW_FORM_udata: - case DW_FORM_ref_udata: - reader_->ReadUnsignedLEB128(start, &len); - return start + len; - break; - - case DW_FORM_sdata: - reader_->ReadSignedLEB128(start, &len); - return start + len; - break; - case DW_FORM_addr: - return start + reader_->AddressSize(); - break; - case DW_FORM_ref_addr: - // DWARF2 and 3 differ on whether ref_addr is address size or - // offset size. - assert(header_.version == 2 || header_.version == 3); - if (header_.version == 2) { - return start + reader_->AddressSize(); - } else if (header_.version == 3) { - return start + reader_->OffsetSize(); - } - break; - - case DW_FORM_block1: - return start + 1 + reader_->ReadOneByte(start); - break; - case DW_FORM_block2: - return start + 2 + reader_->ReadTwoBytes(start); - break; - case DW_FORM_block4: - return start + 4 + reader_->ReadFourBytes(start); - break; - case DW_FORM_block: { - uint64 size = reader_->ReadUnsignedLEB128(start, &len); - return start + size + len; - } - break; - case DW_FORM_strp: - return start + reader_->OffsetSize(); - break; - default: - fprintf(stderr,"Unhandled form type"); - } - fprintf(stderr,"Unhandled form type"); - return NULL; -} - -// Read a DWARF2/3 header. -// The header is variable length in DWARF3 (and DWARF2 as extended by -// most compilers), and consists of an length field, a version number, -// the offset in the .debug_abbrev section for our abbrevs, and an -// address size. -void CompilationUnit::ReadHeader() { - const char* headerptr = buffer_; - size_t initial_length_size; - - assert(headerptr + 4 < buffer_ + buffer_length_); - const uint64 initial_length - = reader_->ReadInitialLength(headerptr, &initial_length_size); - headerptr += initial_length_size; - header_.length = initial_length; - - assert(headerptr + 2 < buffer_ + buffer_length_); - header_.version = reader_->ReadTwoBytes(headerptr); - headerptr += 2; - - assert(headerptr + reader_->OffsetSize() < buffer_ + buffer_length_); - header_.abbrev_offset = reader_->ReadOffset(headerptr); - headerptr += reader_->OffsetSize(); - - assert(headerptr + 1 < buffer_ + buffer_length_); - header_.address_size = reader_->ReadOneByte(headerptr); - reader_->SetAddressSize(header_.address_size); - headerptr += 1; - - after_header_ = headerptr; - - // This check ensures that we don't have to do checking during the - // reading of DIEs. header_.length does not include the size of the - // initial length. - assert(buffer_ + initial_length_size + header_.length <= - buffer_ + buffer_length_); -} - -uint64 CompilationUnit::Start() { - // First get the debug_info section. ".debug_info" is the name - // recommended in the DWARF spec, and used on Linux; "__debug_info" - // is the name used in Mac OS X Mach-O files. - SectionMap::const_iterator iter = sections_.find(".debug_info"); - if (iter == sections_.end()) - iter = sections_.find("__debug_info"); - assert(iter != sections_.end()); - - // Set up our buffer - buffer_ = iter->second.first + offset_from_section_start_; - buffer_length_ = iter->second.second - offset_from_section_start_; - - // Read the header - ReadHeader(); - - // Figure out the real length from the end of the initial length to - // the end of the compilation unit, since that is the value we - // return. - uint64 ourlength = header_.length; - if (reader_->OffsetSize() == 8) - ourlength += 12; - else - ourlength += 4; - - // See if the user wants this compilation unit, and if not, just return. - if (!handler_->StartCompilationUnit(offset_from_section_start_, - reader_->AddressSize(), - reader_->OffsetSize(), - header_.length, - header_.version)) - return ourlength; - - // Otherwise, continue by reading our abbreviation entries. - ReadAbbrevs(); - - // Set the string section if we have one. ".debug_str" is the name - // recommended in the DWARF spec, and used on Linux; "__debug_str" - // is the name used in Mac OS X Mach-O files. - iter = sections_.find(".debug_str"); - if (iter == sections_.end()) - iter = sections_.find("__debug_str"); - if (iter != sections_.end()) { - string_buffer_ = iter->second.first; - string_buffer_length_ = iter->second.second; - } - - // Now that we have our abbreviations, start processing DIE's. - ProcessDIEs(); - - return ourlength; -} - -// If one really wanted, you could merge SkipAttribute and -// ProcessAttribute -// This is all boring data manipulation and calling of the handler. -const char* CompilationUnit::ProcessAttribute( - uint64 dieoffset, const char* start, enum DwarfAttribute attr, - enum DwarfForm form) { - size_t len; - - switch (form) { - // DW_FORM_indirect is never used because it is such a space - // waster. - case DW_FORM_indirect: - form = static_cast(reader_->ReadUnsignedLEB128(start, - &len)); - start += len; - return ProcessAttribute(dieoffset, start, attr, form); - break; - - case DW_FORM_data1: - case DW_FORM_flag: - handler_->ProcessAttributeUnsigned(dieoffset, attr, form, - reader_->ReadOneByte(start)); - return start + 1; - break; - case DW_FORM_data2: - handler_->ProcessAttributeUnsigned(dieoffset, attr, form, - reader_->ReadTwoBytes(start)); - return start + 2; - break; - case DW_FORM_data4: - handler_->ProcessAttributeUnsigned(dieoffset, attr, form, - reader_->ReadFourBytes(start)); - return start + 4; - break; - case DW_FORM_data8: - handler_->ProcessAttributeUnsigned(dieoffset, attr, form, - reader_->ReadEightBytes(start)); - return start + 8; - break; - case DW_FORM_string: { - const char* str = start; - handler_->ProcessAttributeString(dieoffset, attr, form, - str); - return start + strlen(str) + 1; - } - break; - case DW_FORM_udata: - handler_->ProcessAttributeUnsigned(dieoffset, attr, form, - reader_->ReadUnsignedLEB128(start, - &len)); - return start + len; - break; - - case DW_FORM_sdata: - handler_->ProcessAttributeSigned(dieoffset, attr, form, - reader_->ReadSignedLEB128(start, &len)); - return start + len; - break; - case DW_FORM_addr: - handler_->ProcessAttributeUnsigned(dieoffset, attr, form, - reader_->ReadAddress(start)); - return start + reader_->AddressSize(); - break; - - case DW_FORM_ref1: - handler_->ProcessAttributeReference(dieoffset, attr, form, - reader_->ReadOneByte(start) - + offset_from_section_start_); - return start + 1; - break; - case DW_FORM_ref2: - handler_->ProcessAttributeReference(dieoffset, attr, form, - reader_->ReadTwoBytes(start) - + offset_from_section_start_); - return start + 2; - break; - case DW_FORM_ref4: - handler_->ProcessAttributeReference(dieoffset, attr, form, - reader_->ReadFourBytes(start) - + offset_from_section_start_); - return start + 4; - break; - case DW_FORM_ref8: - handler_->ProcessAttributeReference(dieoffset, attr, form, - reader_->ReadEightBytes(start) - + offset_from_section_start_); - return start + 8; - break; - case DW_FORM_ref_udata: - handler_->ProcessAttributeReference(dieoffset, attr, form, - reader_->ReadUnsignedLEB128(start, - &len) - + offset_from_section_start_); - return start + len; - break; - case DW_FORM_ref_addr: - // DWARF2 and 3 differ on whether ref_addr is address size or - // offset size. - assert(header_.version == 2 || header_.version == 3); - if (header_.version == 2) { - handler_->ProcessAttributeReference(dieoffset, attr, form, - reader_->ReadAddress(start)); - return start + reader_->AddressSize(); - } else if (header_.version == 3) { - handler_->ProcessAttributeReference(dieoffset, attr, form, - reader_->ReadOffset(start)); - return start + reader_->OffsetSize(); - } - break; - - case DW_FORM_block1: { - uint64 datalen = reader_->ReadOneByte(start); - handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 1, - datalen); - return start + 1 + datalen; - } - break; - case DW_FORM_block2: { - uint64 datalen = reader_->ReadTwoBytes(start); - handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 2, - datalen); - return start + 2 + datalen; - } - break; - case DW_FORM_block4: { - uint64 datalen = reader_->ReadFourBytes(start); - handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + 4, - datalen); - return start + 4 + datalen; - } - break; - case DW_FORM_block: { - uint64 datalen = reader_->ReadUnsignedLEB128(start, &len); - handler_->ProcessAttributeBuffer(dieoffset, attr, form, start + len, - datalen); - return start + datalen + len; - } - break; - case DW_FORM_strp: { - assert(string_buffer_ != NULL); - - const uint64 offset = reader_->ReadOffset(start); - assert(string_buffer_ + offset < string_buffer_ + string_buffer_length_); - - const char* str = string_buffer_ + offset; - handler_->ProcessAttributeString(dieoffset, attr, form, - str); - return start + reader_->OffsetSize(); - } - break; - default: - fprintf(stderr, "Unhandled form type"); - } - fprintf(stderr, "Unhandled form type"); - return NULL; -} - -const char* CompilationUnit::ProcessDIE(uint64 dieoffset, - const char* start, - const Abbrev& abbrev) { - for (AttributeList::const_iterator i = abbrev.attributes.begin(); - i != abbrev.attributes.end(); - i++) { - start = ProcessAttribute(dieoffset, start, i->first, i->second); - } - return start; -} - -void CompilationUnit::ProcessDIEs() { - const char* dieptr = after_header_; - size_t len; - - // lengthstart is the place the length field is based on. - // It is the point in the header after the initial length field - const char* lengthstart = buffer_; - - // In 64 bit dwarf, the initial length is 12 bytes, because of the - // 0xffffffff at the start. - if (reader_->OffsetSize() == 8) - lengthstart += 12; - else - lengthstart += 4; - - // we need semantics of boost scoped_ptr here - no intention of trasnferring - // ownership of the stack. use const, but then we limit ourselves to not - // ever being able to call .reset() on the smart pointer. - std::auto_ptr > const die_stack(new stack); - - while (dieptr < (lengthstart + header_.length)) { - // We give the user the absolute offset from the beginning of - // debug_info, since they need it to deal with ref_addr forms. - uint64 absolute_offset = (dieptr - buffer_) + offset_from_section_start_; - - uint64 abbrev_num = reader_->ReadUnsignedLEB128(dieptr, &len); - - dieptr += len; - - // Abbrev == 0 represents the end of a list of children. - if (abbrev_num == 0) { - const uint64 offset = die_stack->top(); - die_stack->pop(); - handler_->EndDIE(offset); - continue; - } - - const Abbrev& abbrev = abbrevs_->at(abbrev_num); - const enum DwarfTag tag = abbrev.tag; - if (!handler_->StartDIE(absolute_offset, tag, abbrev.attributes)) { - dieptr = SkipDIE(dieptr, abbrev); - } else { - dieptr = ProcessDIE(absolute_offset, dieptr, abbrev); - } - - if (abbrev.has_children) { - die_stack->push(absolute_offset); - } else { - handler_->EndDIE(absolute_offset); - } - } -} - -LineInfo::LineInfo(const char* buffer, uint64 buffer_length, - ByteReader* reader, LineInfoHandler* handler): - handler_(handler), reader_(reader), buffer_(buffer), - buffer_length_(buffer_length) { - header_.std_opcode_lengths = NULL; -} - -uint64 LineInfo::Start() { - ReadHeader(); - ReadLines(); - return after_header_ - buffer_; -} - -// The header for a debug_line section is mildly complicated, because -// the line info is very tightly encoded. -void LineInfo::ReadHeader() { - const char* lineptr = buffer_; - size_t initial_length_size; - - const uint64 initial_length - = reader_->ReadInitialLength(lineptr, &initial_length_size); - - lineptr += initial_length_size; - header_.total_length = initial_length; - assert(buffer_ + initial_length_size + header_.total_length <= - buffer_ + buffer_length_); - - // Address size *must* be set by CU ahead of time. - assert(reader_->AddressSize() != 0); - - header_.version = reader_->ReadTwoBytes(lineptr); - lineptr += 2; - - header_.prologue_length = reader_->ReadOffset(lineptr); - lineptr += reader_->OffsetSize(); - - header_.min_insn_length = reader_->ReadOneByte(lineptr); - lineptr += 1; - - header_.default_is_stmt = reader_->ReadOneByte(lineptr); - lineptr += 1; - - header_.line_base = *reinterpret_cast(lineptr); - lineptr += 1; - - header_.line_range = reader_->ReadOneByte(lineptr); - lineptr += 1; - - header_.opcode_base = reader_->ReadOneByte(lineptr); - lineptr += 1; - - header_.std_opcode_lengths = new vector; - header_.std_opcode_lengths->resize(header_.opcode_base + 1); - (*header_.std_opcode_lengths)[0] = 0; - for (int i = 1; i < header_.opcode_base; i++) { - (*header_.std_opcode_lengths)[i] = reader_->ReadOneByte(lineptr); - lineptr += 1; - } - - // It is legal for the directory entry table to be empty. - if (*lineptr) { - uint32 dirindex = 1; - while (*lineptr) { - const char* dirname = lineptr; - handler_->DefineDir(dirname, dirindex); - lineptr += strlen(dirname) + 1; - dirindex++; - } - } - lineptr++; - - // It is also legal for the file entry table to be empty. - if (*lineptr) { - uint32 fileindex = 1; - size_t len; - while (*lineptr) { - const char* filename = lineptr; - lineptr += strlen(filename) + 1; - - uint64 dirindex = reader_->ReadUnsignedLEB128(lineptr, &len); - lineptr += len; - - uint64 mod_time = reader_->ReadUnsignedLEB128(lineptr, &len); - lineptr += len; - - uint64 filelength = reader_->ReadUnsignedLEB128(lineptr, &len); - lineptr += len; - handler_->DefineFile(filename, fileindex, dirindex, mod_time, - filelength); - fileindex++; - } - } - lineptr++; - - after_header_ = lineptr; -} - -/* static */ -bool LineInfo::ProcessOneOpcode(ByteReader* reader, - LineInfoHandler* handler, - const struct LineInfoHeader &header, - const char* start, - struct LineStateMachine* lsm, - size_t* len, - uintptr pc, - bool *lsm_passes_pc) { - size_t oplen = 0; - size_t templen; - uint8 opcode = reader->ReadOneByte(start); - oplen++; - start++; - - // If the opcode is great than the opcode_base, it is a special - // opcode. Most line programs consist mainly of special opcodes. - if (opcode >= header.opcode_base) { - opcode -= header.opcode_base; - const int64 advance_address = (opcode / header.line_range) - * header.min_insn_length; - const int64 advance_line = (opcode % header.line_range) - + header.line_base; - - // Check if the lsm passes "pc". If so, mark it as passed. - if (lsm_passes_pc && - lsm->address <= pc && pc < lsm->address + advance_address) { - *lsm_passes_pc = true; - } - - lsm->address += advance_address; - lsm->line_num += advance_line; - lsm->basic_block = true; - *len = oplen; - return true; - } - - // Otherwise, we have the regular opcodes - switch (opcode) { - case DW_LNS_copy: { - lsm->basic_block = false; - *len = oplen; - return true; - } - - case DW_LNS_advance_pc: { - uint64 advance_address = reader->ReadUnsignedLEB128(start, &templen); - oplen += templen; - - // Check if the lsm passes "pc". If so, mark it as passed. - if (lsm_passes_pc && lsm->address <= pc && - pc < lsm->address + header.min_insn_length * advance_address) { - *lsm_passes_pc = true; - } - - lsm->address += header.min_insn_length * advance_address; - } - break; - case DW_LNS_advance_line: { - const int64 advance_line = reader->ReadSignedLEB128(start, &templen); - oplen += templen; - lsm->line_num += advance_line; - - // With gcc 4.2.1, we can get the line_no here for the first time - // since DW_LNS_advance_line is called after DW_LNE_set_address is - // called. So we check if the lsm passes "pc" here, not in - // DW_LNE_set_address. - if (lsm_passes_pc && lsm->address == pc) { - *lsm_passes_pc = true; - } - } - break; - case DW_LNS_set_file: { - const uint64 fileno = reader->ReadUnsignedLEB128(start, &templen); - oplen += templen; - lsm->file_num = fileno; - } - break; - case DW_LNS_set_column: { - const uint64 colno = reader->ReadUnsignedLEB128(start, &templen); - oplen += templen; - lsm->column_num = colno; - } - break; - case DW_LNS_negate_stmt: { - lsm->is_stmt = !lsm->is_stmt; - } - break; - case DW_LNS_set_basic_block: { - lsm->basic_block = true; - } - break; - case DW_LNS_fixed_advance_pc: { - const uint16 advance_address = reader->ReadTwoBytes(start); - oplen += 2; - - // Check if the lsm passes "pc". If so, mark it as passed. - if (lsm_passes_pc && - lsm->address <= pc && pc < lsm->address + advance_address) { - *lsm_passes_pc = true; - } - - lsm->address += advance_address; - } - break; - case DW_LNS_const_add_pc: { - const int64 advance_address = header.min_insn_length - * ((255 - header.opcode_base) - / header.line_range); - - // Check if the lsm passes "pc". If so, mark it as passed. - if (lsm_passes_pc && - lsm->address <= pc && pc < lsm->address + advance_address) { - *lsm_passes_pc = true; - } - - lsm->address += advance_address; - } - break; - case DW_LNS_extended_op: { - const size_t extended_op_len = reader->ReadUnsignedLEB128(start, - &templen); - start += templen; - oplen += templen + extended_op_len; - - const uint64 extended_op = reader->ReadOneByte(start); - start++; - - switch (extended_op) { - case DW_LNE_end_sequence: { - lsm->end_sequence = true; - *len = oplen; - return true; - } - break; - case DW_LNE_set_address: { - // With gcc 4.2.1, we cannot tell the line_no here since - // DW_LNE_set_address is called before DW_LNS_advance_line is - // called. So we do not check if the lsm passes "pc" here. See - // also the comment in DW_LNS_advance_line. - uint64 address = reader->ReadAddress(start); - lsm->address = address; - } - break; - case DW_LNE_define_file: { - const char* filename = start; - - templen = strlen(filename) + 1; - start += templen; - - uint64 dirindex = reader->ReadUnsignedLEB128(start, &templen); - oplen += templen; - - const uint64 mod_time = reader->ReadUnsignedLEB128(start, - &templen); - oplen += templen; - - const uint64 filelength = reader->ReadUnsignedLEB128(start, - &templen); - oplen += templen; - - if (handler) { - handler->DefineFile(filename, -1, dirindex, mod_time, - filelength); - } - } - break; - } - } - break; - - default: { - // Ignore unknown opcode silently - if (header.std_opcode_lengths) { - for (int i = 0; i < (*header.std_opcode_lengths)[opcode]; i++) { - size_t templen; - reader->ReadUnsignedLEB128(start, &templen); - start += templen; - oplen += templen; - } - } - } - break; - } - *len = oplen; - return false; -} - -void LineInfo::ReadLines() { - struct LineStateMachine lsm; - - // lengthstart is the place the length field is based on. - // It is the point in the header after the initial length field - const char* lengthstart = buffer_; - - // In 64 bit dwarf, the initial length is 12 bytes, because of the - // 0xffffffff at the start. - if (reader_->OffsetSize() == 8) - lengthstart += 12; - else - lengthstart += 4; - - const char* lineptr = after_header_; - lsm.Reset(header_.default_is_stmt); - - // The LineInfoHandler interface expects each line's length along - // with its address, but DWARF only provides addresses (sans - // length), and an end-of-sequence address; one infers the length - // from the next address. So we report a line only when we get the - // next line's address, or the end-of-sequence address. - bool have_pending_line = false; - uint64 pending_address = 0; - uint32 pending_file_num = 0, pending_line_num = 0, pending_column_num = 0; - - while (lineptr < lengthstart + header_.total_length) { - size_t oplength; - bool add_row = ProcessOneOpcode(reader_, handler_, header_, - lineptr, &lsm, &oplength, (uintptr)-1, - NULL); - if (add_row) { - if (have_pending_line) - handler_->AddLine(pending_address, lsm.address - pending_address, - pending_file_num, pending_line_num, - pending_column_num); - if (lsm.end_sequence) { - lsm.Reset(header_.default_is_stmt); - have_pending_line = false; - } else { - pending_address = lsm.address; - pending_file_num = lsm.file_num; - pending_line_num = lsm.line_num; - pending_column_num = lsm.column_num; - have_pending_line = true; - } - } - lineptr += oplength; - } - - after_header_ = lengthstart + header_.total_length; -} - -} // namespace dwarf2reader diff --git a/share/google-breakpad/src/common/dwarf/dwarf2reader.h b/share/google-breakpad/src/common/dwarf/dwarf2reader.h deleted file mode 100644 index d99de334aca12a62508d1349c64fbd129163e6fa..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/dwarf2reader.h +++ /dev/null @@ -1,404 +0,0 @@ -// Copyright (c) 2010 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. - -// This file contains definitions related to the DWARF2/3 reader and -// it's handler interfaces. -// The DWARF2/3 specification can be found at -// http://dwarf.freestandards.org and should be considered required -// reading if you wish to modify the implementation. -// Only a cursory attempt is made to explain terminology that is -// used here, as it is much better explained in the standard documents -#ifndef COMMON_DWARF_DWARF2READER_H__ -#define COMMON_DWARF_DWARF2READER_H__ - -#include -#include -#include -#include -#include - -#include "common/dwarf/dwarf2enums.h" -#include "common/dwarf/types.h" - -using namespace std; - -namespace dwarf2reader { -struct LineStateMachine; -class ByteReader; -class Dwarf2Handler; -class LineInfoHandler; - -// This maps from a string naming a section to a pair containing a -// the data for the section, and the size of the section. -typedef map > SectionMap; -typedef list > AttributeList; -typedef AttributeList::iterator AttributeIterator; -typedef AttributeList::const_iterator ConstAttributeIterator; - -struct LineInfoHeader { - uint64 total_length; - uint16 version; - uint64 prologue_length; - uint8 min_insn_length; // insn stands for instructin - bool default_is_stmt; // stmt stands for statement - int8 line_base; - uint8 line_range; - uint8 opcode_base; - // Use a pointer so that signalsafe_addr2line is able to use this structure - // without heap allocation problem. - vector *std_opcode_lengths; -}; - -class LineInfo { - public: - - // Initializes a .debug_line reader. Buffer and buffer length point - // to the beginning and length of the line information to read. - // Reader is a ByteReader class that has the endianness set - // properly. - LineInfo(const char* buffer_, uint64 buffer_length, - ByteReader* reader, LineInfoHandler* handler); - - virtual ~LineInfo() { - if (header_.std_opcode_lengths) { - delete header_.std_opcode_lengths; - } - } - - // Start processing line info, and calling callbacks in the handler. - // Consumes the line number information for a single compilation unit. - // Returns the number of bytes processed. - uint64 Start(); - - // Process a single line info opcode at START using the state - // machine at LSM. Return true if we should define a line using the - // current state of the line state machine. Place the length of the - // opcode in LEN. - // If LSM_PASSES_PC is non-NULL, this function also checks if the lsm - // passes the address of PC. In other words, LSM_PASSES_PC will be - // set to true, if the following condition is met. - // - // lsm's old address < PC <= lsm's new address - static bool ProcessOneOpcode(ByteReader* reader, - LineInfoHandler* handler, - const struct LineInfoHeader &header, - const char* start, - struct LineStateMachine* lsm, - size_t* len, - uintptr pc, - bool *lsm_passes_pc); - - private: - // Reads the DWARF2/3 header for this line info. - void ReadHeader(); - - // Reads the DWARF2/3 line information - void ReadLines(); - - // The associated handler to call processing functions in - LineInfoHandler* handler_; - - // The associated ByteReader that handles endianness issues for us - ByteReader* reader_; - - // A DWARF2/3 line info header. This is not the same size as - // in the actual file, as the one in the file may have a 32 bit or - // 64 bit lengths - - struct LineInfoHeader header_; - - // buffer is the buffer for our line info, starting at exactly where - // the line info to read is. after_header is the place right after - // the end of the line information header. - const char* buffer_; - uint64 buffer_length_; - const char* after_header_; -}; - -// This class is the main interface between the line info reader and -// the client. The virtual functions inside this get called for -// interesting events that happen during line info reading. The -// default implementation does nothing - -class LineInfoHandler { - public: - LineInfoHandler() { } - - virtual ~LineInfoHandler() { } - - // Called when we define a directory. NAME is the directory name, - // DIR_NUM is the directory number - virtual void DefineDir(const string& name, uint32 dir_num) { } - - // Called when we define a filename. NAME is the filename, FILE_NUM - // is the file number which is -1 if the file index is the next - // index after the last numbered index (this happens when files are - // dynamically defined by the line program), DIR_NUM is the - // directory index for the directory name of this file, MOD_TIME is - // the modification time of the file, and LENGTH is the length of - // the file - virtual void DefineFile(const string& name, int32 file_num, - uint32 dir_num, uint64 mod_time, - uint64 length) { } - - // Called when the line info reader has a new line, address pair - // ready for us. ADDRESS is the address of the code, LENGTH is the - // length of its machine code in bytes, FILE_NUM is the file number - // containing the code, LINE_NUM is the line number in that file for - // the code, and COLUMN_NUM is the column number the code starts at, - // if we know it (0 otherwise). - virtual void AddLine(uint64 address, uint64 length, - uint32 file_num, uint32 line_num, uint32 column_num) { } -}; - -// The base of DWARF2/3 debug info is a DIE (Debugging Information -// Entry. -// DWARF groups DIE's into a tree and calls the root of this tree a -// "compilation unit". Most of the time, there is one compilation -// unit in the .debug_info section for each file that had debug info -// generated. -// Each DIE consists of - -// 1. a tag specifying a thing that is being described (ie -// DW_TAG_subprogram for functions, DW_TAG_variable for variables, etc -// 2. attributes (such as DW_AT_location for location in memory, -// DW_AT_name for name), and data for each attribute. -// 3. A flag saying whether the DIE has children or not - -// In order to gain some amount of compression, the format of -// each DIE (tag name, attributes and data forms for the attributes) -// are stored in a separate table called the "abbreviation table". -// This is done because a large number of DIEs have the exact same tag -// and list of attributes, but different data for those attributes. -// As a result, the .debug_info section is just a stream of data, and -// requires reading of the .debug_abbrev section to say what the data -// means. - -// As a warning to the user, it should be noted that the reason for -// using absolute offsets from the beginning of .debug_info is that -// DWARF2/3 supports referencing DIE's from other DIE's by their offset -// from either the current compilation unit start, *or* the beginning -// of the .debug_info section. This means it is possible to reference -// a DIE in one compilation unit from a DIE in another compilation -// unit. This style of reference is usually used to eliminate -// duplicated information that occurs across compilation -// units, such as base types, etc. GCC 3.4+ support this with -// -feliminate-dwarf2-dups. Other toolchains will sometimes do -// duplicate elimination in the linker. - -class CompilationUnit { - public: - - // Initialize a compilation unit. This requires a map of sections, - // the offset of this compilation unit in the .debug_info section, a - // ByteReader, and a Dwarf2Handler class to call callbacks in. - CompilationUnit(const SectionMap& sections, uint64 offset, - ByteReader* reader, Dwarf2Handler* handler); - virtual ~CompilationUnit() { - if (abbrevs_) delete abbrevs_; - } - - // Begin reading a Dwarf2 compilation unit, and calling the - // callbacks in the Dwarf2Handler - - // Return the full length of the compilation unit, including - // headers. This plus the starting offset passed to the constructor - // is the offset of the end of the compilation unit --- and the - // start of the next compilation unit, if there is one. - uint64 Start(); - - private: - - // This struct represents a single DWARF2/3 abbreviation - // The abbreviation tells how to read a DWARF2/3 DIE, and consist of a - // tag and a list of attributes, as well as the data form of each attribute. - struct Abbrev { - uint32 number; - enum DwarfTag tag; - bool has_children; - AttributeList attributes; - }; - - // A DWARF2/3 compilation unit header. This is not the same size as - // in the actual file, as the one in the file may have a 32 bit or - // 64 bit length. - struct CompilationUnitHeader { - uint64 length; - uint16 version; - uint64 abbrev_offset; - uint8 address_size; - } header_; - - // Reads the DWARF2/3 header for this compilation unit. - void ReadHeader(); - - // Reads the DWARF2/3 abbreviations for this compilation unit - void ReadAbbrevs(); - - // Processes a single DIE for this compilation unit and return a new - // pointer just past the end of it - const char* ProcessDIE(uint64 dieoffset, - const char* start, - const Abbrev& abbrev); - - // Processes a single attribute and return a new pointer just past the - // end of it - const char* ProcessAttribute(uint64 dieoffset, - const char* start, - enum DwarfAttribute attr, - enum DwarfForm form); - - // Processes all DIEs for this compilation unit - void ProcessDIEs(); - - // Skips the die with attributes specified in ABBREV starting at - // START, and return the new place to position the stream to. - const char* SkipDIE(const char* start, - const Abbrev& abbrev); - - // Skips the attribute starting at START, with FORM, and return the - // new place to position the stream to. - const char* SkipAttribute(const char* start, - enum DwarfForm form); - - // Offset from section start is the offset of this compilation unit - // from the beginning of the .debug_info section. - uint64 offset_from_section_start_; - - // buffer is the buffer for our CU, starting at .debug_info + offset - // passed in from constructor. - // after_header points to right after the compilation unit header. - const char* buffer_; - uint64 buffer_length_; - const char* after_header_; - - // The associated ByteReader that handles endianness issues for us - ByteReader* reader_; - - // The map of sections in our file to buffers containing their data - const SectionMap& sections_; - - // The associated handler to call processing functions in - Dwarf2Handler* handler_; - - // Set of DWARF2/3 abbreviations for this compilation unit. Indexed - // by abbreviation number, which means that abbrevs_[0] is not - // valid. - vector* abbrevs_; - - // String section buffer and length, if we have a string section. - // This is here to avoid doing a section lookup for strings in - // ProcessAttribute, which is in the hot path for DWARF2 reading. - const char* string_buffer_; - uint64 string_buffer_length_; -}; - -// This class is the main interface between the reader and the -// client. The virtual functions inside this get called for -// interesting events that happen during DWARF2 reading. -// The default implementation skips everything. - -class Dwarf2Handler { - public: - Dwarf2Handler() { } - - virtual ~Dwarf2Handler() { } - - // Start to process a compilation unit at OFFSET from the beginning of the - // .debug_info section. Return false if you would like to skip this - // compilation unit. - virtual bool StartCompilationUnit(uint64 offset, uint8 address_size, - uint8 offset_size, uint64 cu_length, - uint8 dwarf_version) { return false; } - - // Start to process a DIE at OFFSET from the beginning of the .debug_info - // section. Return false if you would like to skip this DIE. - virtual bool StartDIE(uint64 offset, enum DwarfTag tag, - const AttributeList& attrs) { return false; } - - // Called when we have an attribute with unsigned data to give to our - // handler. The attribute is for the DIE at OFFSET from the beginning of the - // .debug_info section. Its name is ATTR, its form is FORM, and its value is - // DATA. - virtual void ProcessAttributeUnsigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { } - - // Called when we have an attribute with signed data to give to our handler. - // The attribute is for the DIE at OFFSET from the beginning of the - // .debug_info section. Its name is ATTR, its form is FORM, and its value is - // DATA. - virtual void ProcessAttributeSigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - int64 data) { } - - // Called when we have an attribute whose value is a reference to - // another DIE. The attribute belongs to the DIE at OFFSET from the - // beginning of the .debug_info section. Its name is ATTR, its form - // is FORM, and the offset of the DIE being referred to from the - // beginning of the .debug_info section is DATA. - virtual void ProcessAttributeReference(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { } - - // Called when we have an attribute with a buffer of data to give to our - // handler. The attribute is for the DIE at OFFSET from the beginning of the - // .debug_info section. Its name is ATTR, its form is FORM, DATA points to - // the buffer's contents, and its length in bytes is LENGTH. The buffer is - // owned by the caller, not the callee, and may not persist for very long. - // If you want the data to be available later, it needs to be copied. - virtual void ProcessAttributeBuffer(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const char* data, - uint64 len) { } - - // Called when we have an attribute with string data to give to our handler. - // The attribute is for the DIE at OFFSET from the beginning of the - // .debug_info section. Its name is ATTR, its form is FORM, and its value is - // DATA. - virtual void ProcessAttributeString(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const string& data) { } - - // Called when finished processing the DIE at OFFSET. - // Because DWARF2/3 specifies a tree of DIEs, you may get starts - // before ends of the previous DIE, as we process children before - // ending the parent. - virtual void EndDIE(uint64 offset) { } - -}; - - -} // namespace dwarf2reader - -#endif // UTIL_DEBUGINFO_DWARF2READER_H__ diff --git a/share/google-breakpad/src/common/dwarf/functioninfo.cc b/share/google-breakpad/src/common/dwarf/functioninfo.cc deleted file mode 100644 index 73556191abb44d4c5001d83babfb80ac609cafbc..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/functioninfo.cc +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright (c) 2010 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. - -// This is a client for the dwarf2reader to extract function and line -// information from the debug info. - -#include -#include -#include - -#include -#include -#include -#include - -#include "common/dwarf/functioninfo.h" - -#include "common/dwarf/bytereader.h" - - -namespace dwarf2reader { - -CULineInfoHandler::CULineInfoHandler(vector* files, - vector* dirs, - LineMap* linemap):linemap_(linemap), - files_(files), - dirs_(dirs) { - // The dirs and files are 1 indexed, so just make sure we put - // nothing in the 0 vector. - assert(dirs->size() == 0); - assert(files->size() == 0); - dirs->push_back(""); - SourceFileInfo s; - s.name = ""; - s.lowpc = ULLONG_MAX; - files->push_back(s); -} - -void CULineInfoHandler::DefineDir(const string& name, uint32 dir_num) { - // These should never come out of order, actually - assert(dir_num == dirs_->size()); - dirs_->push_back(name); -} - -void CULineInfoHandler::DefineFile(const string& name, - int32 file_num, uint32 dir_num, - uint64 mod_time, uint64 length) { - assert(dir_num >= 0); - assert(dir_num < dirs_->size()); - - // These should never come out of order, actually. - if (file_num == (int32)files_->size() || file_num == -1) { - string dir = dirs_->at(dir_num); - - SourceFileInfo s; - s.lowpc = ULLONG_MAX; - - if (dir == "") { - s.name = name; - } else { - s.name = dir + "/" + name; - } - - files_->push_back(s); - } else { - fprintf(stderr, "error in DefineFile"); - } -} - -void CULineInfoHandler::AddLine(uint64 address, uint64 length, uint32 file_num, - uint32 line_num, uint32 column_num) { - if (file_num < files_->size()) { - linemap_->insert(make_pair(address, make_pair(files_->at(file_num).name.c_str(), - line_num))); - - if(address < files_->at(file_num).lowpc) { - files_->at(file_num).lowpc = address; - } - } else { - fprintf(stderr,"error in AddLine"); - } -} - -bool CUFunctionInfoHandler::StartCompilationUnit(uint64 offset, - uint8 address_size, - uint8 offset_size, - uint64 cu_length, - uint8 dwarf_version) { - current_compilation_unit_offset_ = offset; - return true; -} - - -// For function info, we only care about subprograms and inlined -// subroutines. For line info, the DW_AT_stmt_list lives in the -// compile unit tag. - -bool CUFunctionInfoHandler::StartDIE(uint64 offset, enum DwarfTag tag, - const AttributeList& attrs) { - switch (tag) { - case DW_TAG_subprogram: - case DW_TAG_inlined_subroutine: { - current_function_info_ = new FunctionInfo; - current_function_info_->lowpc = current_function_info_->highpc = 0; - current_function_info_->name = ""; - current_function_info_->line = 0; - current_function_info_->file = ""; - offset_to_funcinfo_->insert(make_pair(offset, current_function_info_)); - }; - // FALLTHROUGH - case DW_TAG_compile_unit: - return true; - default: - return false; - } - return false; -} - -// Only care about the name attribute for functions - -void CUFunctionInfoHandler::ProcessAttributeString(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const string &data) { - if (current_function_info_) { - if (attr == DW_AT_name) - current_function_info_->name = data; - else if(attr == DW_AT_MIPS_linkage_name) - current_function_info_->mangled_name = data; - } -} - -void CUFunctionInfoHandler::ProcessAttributeUnsigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - if (attr == DW_AT_stmt_list) { - SectionMap::const_iterator iter = sections_.find("__debug_line"); - assert(iter != sections_.end()); - - // this should be a scoped_ptr but we dont' use boost :-( - auto_ptr lireader(new LineInfo(iter->second.first + data, - iter->second.second - data, - reader_, linehandler_)); - lireader->Start(); - } else if (current_function_info_) { - switch (attr) { - case DW_AT_low_pc: - current_function_info_->lowpc = data; - break; - case DW_AT_high_pc: - current_function_info_->highpc = data; - break; - case DW_AT_decl_line: - current_function_info_->line = data; - break; - case DW_AT_decl_file: - current_function_info_->file = files_->at(data).name; - break; - default: - break; - } - } -} - -void CUFunctionInfoHandler::ProcessAttributeReference(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - if (current_function_info_) { - switch (attr) { - case DW_AT_specification: { - // Some functions have a "specification" attribute - // which means they were defined elsewhere. The name - // attribute is not repeated, and must be taken from - // the specification DIE. Here we'll assume that - // any DIE referenced in this manner will already have - // been seen, but that's not really required by the spec. - FunctionMap::iterator iter = offset_to_funcinfo_->find(data); - if (iter != offset_to_funcinfo_->end()) { - current_function_info_->name = iter->second->name; - current_function_info_->mangled_name = iter->second->mangled_name; - } else { - // If you hit this, this code probably needs to be rewritten. - fprintf(stderr, "Error: DW_AT_specification was seen before the referenced DIE! (Looking for DIE at offset %08llx, in DIE at offset %08llx)\n", data, offset); - } - break; - } - default: - break; - } - } -} - -void CUFunctionInfoHandler::EndDIE(uint64 offset) { - if (current_function_info_ && current_function_info_->lowpc) - address_to_funcinfo_->insert(make_pair(current_function_info_->lowpc, - current_function_info_)); -} - -} // namespace dwarf2reader diff --git a/share/google-breakpad/src/common/dwarf/functioninfo.h b/share/google-breakpad/src/common/dwarf/functioninfo.h deleted file mode 100644 index 901b7df50dc70b3b0e9d6d1bc6d324a1e8a40126..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/functioninfo.h +++ /dev/null @@ -1,188 +0,0 @@ -// Copyright (c) 2010 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. - - -// This file contains the definitions for a DWARF2/3 information -// collector that uses the DWARF2/3 reader interface to build a mapping -// of addresses to files, lines, and functions. - -#ifndef COMMON_DWARF_FUNCTIONINFO_H__ -#define COMMON_DWARF_FUNCTIONINFO_H__ - -#include -#include -#include -#include - -#include "common/dwarf/dwarf2reader.h" - - -namespace dwarf2reader { - -struct FunctionInfo { - // Name of the function - string name; - // Mangled name of the function - string mangled_name; - // File containing this function - string file; - // Line number for start of function. - uint32 line; - // Beginning address for this function - uint64 lowpc; - // End address for this function. - uint64 highpc; -}; - -struct SourceFileInfo { - // Name of the source file name - string name; - // Low address of source file name - uint64 lowpc; -}; - -typedef map FunctionMap; -typedef map > LineMap; - -// This class is a basic line info handler that fills in the dirs, -// file, and linemap passed into it with the data produced from the -// LineInfoHandler. -class CULineInfoHandler: public LineInfoHandler { - public: - - // - CULineInfoHandler(vector* files, - vector* dirs, - LineMap* linemap); - virtual ~CULineInfoHandler() { } - - // Called when we define a directory. We just place NAME into dirs_ - // at position DIR_NUM. - virtual void DefineDir(const string& name, uint32 dir_num); - - // Called when we define a filename. We just place - // concat(dirs_[DIR_NUM], NAME) into files_ at position FILE_NUM. - virtual void DefineFile(const string& name, int32 file_num, - uint32 dir_num, uint64 mod_time, uint64 length); - - - // Called when the line info reader has a new line, address pair - // ready for us. ADDRESS is the address of the code, LENGTH is the - // length of its machine code in bytes, FILE_NUM is the file number - // containing the code, LINE_NUM is the line number in that file for - // the code, and COLUMN_NUM is the column number the code starts at, - // if we know it (0 otherwise). - virtual void AddLine(uint64 address, uint64 length, - uint32 file_num, uint32 line_num, uint32 column_num); - - private: - LineMap* linemap_; - vector* files_; - vector* dirs_; -}; - -class CUFunctionInfoHandler: public Dwarf2Handler { - public: - CUFunctionInfoHandler(vector* files, - vector* dirs, - LineMap* linemap, - FunctionMap* offset_to_funcinfo, - FunctionMap* address_to_funcinfo, - CULineInfoHandler* linehandler, - const SectionMap& sections, - ByteReader* reader) - : files_(files), dirs_(dirs), linemap_(linemap), - offset_to_funcinfo_(offset_to_funcinfo), - address_to_funcinfo_(address_to_funcinfo), - linehandler_(linehandler), sections_(sections), - reader_(reader), current_function_info_(NULL) { } - - virtual ~CUFunctionInfoHandler() { } - - // Start to process a compilation unit at OFFSET from the beginning of the - // .debug_info section. We want to see all compilation units, so we - // always return true. - - virtual bool StartCompilationUnit(uint64 offset, uint8 address_size, - uint8 offset_size, uint64 cu_length, - uint8 dwarf_version); - - // Start to process a DIE at OFFSET from the beginning of the - // .debug_info section. We only care about function related DIE's. - virtual bool StartDIE(uint64 offset, enum DwarfTag tag, - const AttributeList& attrs); - - // Called when we have an attribute with unsigned data to give to - // our handler. The attribute is for the DIE at OFFSET from the - // beginning of the .debug_info section, has a name of ATTR, a form of - // FORM, and the actual data of the attribute is in DATA. - virtual void ProcessAttributeUnsigned(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - - // Called when we have an attribute with a DIE reference to give to - // our handler. The attribute is for the DIE at OFFSET from the - // beginning of the .debug_info section, has a name of ATTR, a form of - // FORM, and the offset of the referenced DIE from the start of the - // .debug_info section is in DATA. - virtual void ProcessAttributeReference(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - - // Called when we have an attribute with string data to give to - // our handler. The attribute is for the DIE at OFFSET from the - // beginning of the .debug_info section, has a name of ATTR, a form of - // FORM, and the actual data of the attribute is in DATA. - virtual void ProcessAttributeString(uint64 offset, - enum DwarfAttribute attr, - enum DwarfForm form, - const string& data); - - // Called when finished processing the DIE at OFFSET. - // Because DWARF2/3 specifies a tree of DIEs, you may get starts - // before ends of the previous DIE, as we process children before - // ending the parent. - virtual void EndDIE(uint64 offset); - - private: - vector* files_; - vector* dirs_; - LineMap* linemap_; - FunctionMap* offset_to_funcinfo_; - FunctionMap* address_to_funcinfo_; - CULineInfoHandler* linehandler_; - const SectionMap& sections_; - ByteReader* reader_; - FunctionInfo* current_function_info_; - uint64 current_compilation_unit_offset_; -}; - -} // namespace dwarf2reader -#endif // COMMON_DWARF_FUNCTIONINFO_H__ diff --git a/share/google-breakpad/src/common/dwarf/line_state_machine.h b/share/google-breakpad/src/common/dwarf/line_state_machine.h deleted file mode 100644 index 6f9fb72b85bfa3ff05f070a16fca5b1f31bb3865..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/line_state_machine.h +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2008 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. - - -#ifndef COMMON_DWARF_LINE_STATE_MACHINE_H__ -#define COMMON_DWARF_LINE_STATE_MACHINE_H__ - -namespace dwarf2reader { - -// This is the format of a DWARF2/3 line state machine that we process -// opcodes using. There is no need for anything outside the lineinfo -// processor to know how this works. -struct LineStateMachine { - void Reset(bool default_is_stmt) { - file_num = 1; - address = 0; - line_num = 1; - column_num = 0; - is_stmt = default_is_stmt; - basic_block = false; - end_sequence = false; - } - - uint32 file_num; - uint64 address; - uint64 line_num; - uint32 column_num; - bool is_stmt; // stmt means statement. - bool basic_block; - bool end_sequence; -}; - -} // namespace dwarf2reader - - -#endif // COMMON_DWARF_LINE_STATE_MACHINE_H__ diff --git a/share/google-breakpad/src/common/dwarf/types.h b/share/google-breakpad/src/common/dwarf/types.h deleted file mode 100644 index 08a325aaf0d79ee7a14179f5178623879e6aae8f..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/dwarf/types.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2008 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. - - -// This file contains some typedefs for basic types - - -#ifndef _COMMON_DWARF_TYPES_H__ -#define _COMMON_DWARF_TYPES_H__ - -typedef signed char int8; -typedef short int16; -typedef int int32; -typedef long long int64; - -typedef unsigned char uint8; -typedef unsigned short uint16; -typedef unsigned int uint32; -typedef unsigned long long uint64; - -#ifdef __PTRDIFF_TYPE__ -typedef __PTRDIFF_TYPE__ intptr; -typedef unsigned __PTRDIFF_TYPE__ uintptr; -#else -#error "Can't find pointer-sized integral types." -#endif - -#endif // _COMMON_DWARF_TYPES_H__ diff --git a/share/google-breakpad/src/common/linux/dump_stabs.cc b/share/google-breakpad/src/common/linux/dump_stabs.cc deleted file mode 100644 index adc79fd0c944daa982d968133ffbbba25f5d0661..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dump_stabs.cc +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// dump_stabs.cc --- implement the DumpStabsHandler class. - -#include -#include - -#include -#include - -#include "common/linux/dump_stabs.h" - -namespace google_breakpad { - -using std::string; - -// Demangle using abi call. -// Older GCC may not support it. -static string Demangle(const string &mangled) { - int status = 0; - char *demangled = abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status); - if (status == 0 && demangled != NULL) { - string str(demangled); - free(demangled); - return str; - } - return string(mangled); -} - -bool DumpStabsHandler::StartCompilationUnit(const char *name, uint64_t address, - const char *build_directory) { - assert(!comp_unit_base_address_); - current_source_file_name_ = name; - current_source_file_ = module_->FindFile(name); - comp_unit_base_address_ = address; - boundaries_.push_back(static_cast(address)); - return true; -} - -bool DumpStabsHandler::EndCompilationUnit(uint64_t address) { - assert(comp_unit_base_address_); - comp_unit_base_address_ = 0; - current_source_file_ = NULL; - current_source_file_name_ = NULL; - if (address) - boundaries_.push_back(static_cast(address)); - return true; -} - -bool DumpStabsHandler::StartFunction(const string &name, - uint64_t address) { - assert(!current_function_); - Module::Function *f = new Module::Function; - f->name = Demangle(name); - f->address = address; - f->size = 0; // We compute this in DumpStabsHandler::Finalize(). - f->parameter_size = 0; // We don't provide this information. - current_function_ = f; - boundaries_.push_back(static_cast(address)); - return true; -} - -bool DumpStabsHandler::EndFunction(uint64_t address) { - assert(current_function_); - // Functions in this compilation unit should have address bigger - // than the compilation unit's starting address. There may be a lot - // of duplicated entries for functions in the STABS data; only one - // entry can meet this requirement. - // - // (I don't really understand the above comment; just bringing it - // along from the previous code, and leaving the behaivor unchanged. - // If you know the whole story, please patch this comment. --jimb) - if (current_function_->address >= comp_unit_base_address_) - functions_.push_back(current_function_); - else - delete current_function_; - current_function_ = NULL; - if (address) - boundaries_.push_back(static_cast(address)); - return true; -} - -bool DumpStabsHandler::Line(uint64_t address, const char *name, int number) { - assert(current_function_); - assert(current_source_file_); - if (name != current_source_file_name_) { - current_source_file_ = module_->FindFile(name); - current_source_file_name_ = name; - } - Module::Line line; - line.address = address; - line.size = 0; // We compute this in DumpStabsHandler::Finalize(). - line.file = current_source_file_; - line.number = number; - current_function_->lines.push_back(line); - return true; -} - -void DumpStabsHandler::Warning(const char *format, ...) { - va_list args; - va_start(args, format); - vfprintf(stderr, format, args); - va_end(args); -} - -void DumpStabsHandler::Finalize() { - // Sort our boundary list, so we can search it quickly. - sort(boundaries_.begin(), boundaries_.end()); - // Sort all functions by address, just for neatness. - sort(functions_.begin(), functions_.end(), - Module::Function::CompareByAddress); - for (vector::iterator func_it = functions_.begin(); - func_it != functions_.end(); - func_it++) { - Module::Function *f = *func_it; - // Compute the function f's size. - vector::iterator boundary - = std::upper_bound(boundaries_.begin(), boundaries_.end(), f->address); - if (boundary != boundaries_.end()) - f->size = *boundary - f->address; - else - // If this is the last function in the module, and the STABS - // reader was unable to give us its ending address, then assign - // it a bogus, very large value. This will happen at most once - // per module: since we've added all functions' addresses to the - // boundary table, only one can be the last. - f->size = kFallbackSize; - - // Compute sizes for each of the function f's lines --- if it has any. - if (!f->lines.empty()) { - stable_sort(f->lines.begin(), f->lines.end(), - Module::Line::CompareByAddress); - vector::iterator last_line = f->lines.end() - 1; - for (vector::iterator line_it = f->lines.begin(); - line_it != last_line; line_it++) - line_it[0].size = line_it[1].address - line_it[0].address; - // Compute the size of the last line from f's end address. - last_line->size = (f->address + f->size) - last_line->address; - } - } - // Now that everything has a size, add our functions to the module, and - // dispose of our private list. - module_->AddFunctions(functions_.begin(), functions_.end()); - functions_.clear(); -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/dump_stabs.h b/share/google-breakpad/src/common/linux/dump_stabs.h deleted file mode 100644 index fb69e596a6659925792c08e590dd9019799bafad..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dump_stabs.h +++ /dev/null @@ -1,133 +0,0 @@ -// -*- mode: C++ -*- - -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// dump_stabs.h: Define the DumpStabsHandler class, which receives -// STABS debugging information from a parser and adds it to a Breakpad -// symbol file. - -#ifndef COMMON_LINUX_DUMP_STABS_H__ -#define COMMON_LINUX_DUMP_STABS_H__ - -#include - -#include -#include - -#include "common/linux/module.h" -#include "common/linux/stabs_reader.h" - -namespace google_breakpad { - -using std::string; -using std::vector; - -// A DumpStabsHandler is a handler that receives parsed STABS -// debugging information from a StabsReader, and uses that to populate -// a Module. (All classes are in the google_breakpad namespace.) A -// Module represents the contents of a Breakpad symbol file, and knows -// how to write itself out as such. A DumpStabsHandler thus acts as -// the bridge between STABS and Breakpad data. -class DumpStabsHandler: public google_breakpad::StabsHandler { - public: - // Receive parsed debugging information from a StabsReader, and - // store it all in MODULE. - DumpStabsHandler(Module *module) : - module_(module), - comp_unit_base_address_(0), - current_function_(NULL), - current_source_file_(NULL), - current_source_file_name_(NULL) { } - - // The standard StabsHandler virtual member functions. - bool StartCompilationUnit(const char *name, uint64_t address, - const char *build_directory); - bool EndCompilationUnit(uint64_t address); - bool StartFunction(const string &name, uint64_t address); - bool EndFunction(uint64_t address); - bool Line(uint64_t address, const char *name, int number); - void Warning(const char *format, ...); - - // Do any final processing necessary to make module_ contain all the - // data provided by the STABS reader. - // - // Because STABS does not provide reliable size information for - // functions and lines, we need to make a pass over the data after - // processing all the STABS to compute those sizes. We take care of - // that here. - void Finalize(); - - private: - - // An arbitrary, but very large, size to use for functions whose - // size we can't compute properly. - static const uint64_t kFallbackSize = 0x10000000; - - // The module we're contributing debugging info to. - Module *module_; - - // The functions we've generated so far. We don't add these to - // module_ as we parse them. Instead, we wait until we've computed - // their ending address, and their lines' ending addresses. - // - // We could just stick them in module_ from the outset, but if - // module_ already contains data gathered from other debugging - // formats, that would complicate the size computation. - vector functions_; - - // Boundary addresses. STABS doesn't necessarily supply sizes for - // functions and lines, so we need to compute them ourselves by - // finding the next object. - vector boundaries_; - - // The base address of the current compilation unit. We use this to - // recognize functions we should omit from the symbol file. (If you - // know the details of why we omit these, please patch this - // comment.) - Module::Address comp_unit_base_address_; - - // The function we're currently contributing lines to. - Module::Function *current_function_; - - // The last Module::File we got a line number in. - Module::File *current_source_file_; - - // The pointer in the .stabstr section of the name that - // current_source_file_ is built from. This allows us to quickly - // recognize when the current line is in the same file as the - // previous one (which it usually is). - const char *current_source_file_name_; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_DUMP_STABS_H__ diff --git a/share/google-breakpad/src/common/linux/dump_symbols.cc b/share/google-breakpad/src/common/linux/dump_symbols.cc deleted file mode 100644 index 02d26987d0b42f8d707bf61a331516f722662166..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dump_symbols.cc +++ /dev/null @@ -1,413 +0,0 @@ -// Copyright (c) 2010 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. - -// Restructured in 2009 by: Jim Blandy - -// dump_symbols.cc: implement google_breakpad::WriteSymbolFile: -// Find all the debugging info in a file and dump it as a Breakpad symbol file. - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include "common/dwarf/dwarf2diehandler.h" -#include "common/linux/dump_stabs.h" -#include "common/linux/dump_symbols.h" -#include "common/linux/dwarf_cu_to_module.h" -#include "common/linux/dwarf_line_to_module.h" -#include "common/linux/file_id.h" -#include "common/linux/module.h" -#include "common/linux/stabs_reader.h" - -// This namespace contains helper functions. -namespace { - -using google_breakpad::DumpStabsHandler; -using google_breakpad::DwarfCUToModule; -using google_breakpad::DwarfLineToModule; -using google_breakpad::Module; - -// Fix offset into virtual address by adding the mapped base into offsets. -// Make life easier when want to find something by offset. -static void FixAddress(void *obj_base) { - ElfW(Addr) base = reinterpret_cast(obj_base); - ElfW(Ehdr) *elf_header = static_cast(obj_base); - elf_header->e_phoff += base; - elf_header->e_shoff += base; - ElfW(Shdr) *sections = reinterpret_cast(elf_header->e_shoff); - for (int i = 0; i < elf_header->e_shnum; ++i) - sections[i].sh_offset += base; -} - -// Find the prefered loading address of the binary. -static ElfW(Addr) GetLoadingAddress(const ElfW(Phdr) *program_headers, - int nheader) { - for (int i = 0; i < nheader; ++i) { - const ElfW(Phdr) &header = program_headers[i]; - // For executable, it is the PT_LOAD segment with offset to zero. - if (header.p_type == PT_LOAD && - header.p_offset == 0) - return header.p_vaddr; - } - // For other types of ELF, return 0. - return 0; -} - -static bool IsValidElf(const ElfW(Ehdr) *elf_header) { - return memcmp(elf_header, ELFMAG, SELFMAG) == 0; -} - -static const ElfW(Shdr) *FindSectionByName(const char *name, - const ElfW(Shdr) *sections, - const ElfW(Shdr) *section_names, - int nsection) { - assert(name != NULL); - assert(sections != NULL); - assert(nsection > 0); - - int name_len = strlen(name); - if (name_len == 0) - return NULL; - - for (int i = 0; i < nsection; ++i) { - const char *section_name = - reinterpret_cast(section_names->sh_offset + sections[i].sh_name); - if (!strncmp(name, section_name, name_len)) - return sections + i; - } - return NULL; -} - -static bool LoadStabs(const ElfW(Shdr) *stab_section, - const ElfW(Shdr) *stabstr_section, - Module *module) { - // A callback object to handle data from the STABS reader. - DumpStabsHandler handler(module); - // Find the addresses of the STABS data, and create a STABS reader object. - uint8_t *stabs = reinterpret_cast(stab_section->sh_offset); - uint8_t *stabstr = reinterpret_cast(stabstr_section->sh_offset); - google_breakpad::StabsReader reader(stabs, stab_section->sh_size, - stabstr, stabstr_section->sh_size, - &handler); - // Read the STABS data, and do post-processing. - if (!reader.Process()) - return false; - handler.Finalize(); - return true; -} - -// A line-to-module loader that accepts line number info parsed by -// dwarf2reader::LineInfo and populates a Module and a line vector -// with the results. -class DumperLineToModule: public DwarfCUToModule::LineToModuleFunctor { - public: - // Create a line-to-module converter using BYTE_READER. - DumperLineToModule(dwarf2reader::ByteReader *byte_reader) - : byte_reader_(byte_reader) { } - void operator()(const char *program, uint64 length, - Module *module, vector *lines) { - DwarfLineToModule handler(module, lines); - dwarf2reader::LineInfo parser(program, length, byte_reader_, &handler); - parser.Start(); - } - private: - dwarf2reader::ByteReader *byte_reader_; -}; - -static bool LoadDwarf(const string &dwarf_filename, - const ElfW(Ehdr) *elf_header, - Module *module) { - // Figure out what endianness this file is. - dwarf2reader::Endianness endianness; - if (elf_header->e_ident[EI_DATA] == ELFDATA2LSB) - endianness = dwarf2reader::ENDIANNESS_LITTLE; - else if (elf_header->e_ident[EI_DATA] == ELFDATA2MSB) - endianness = dwarf2reader::ENDIANNESS_BIG; - else { - fprintf(stderr, "bad data encoding in ELF header: %d\n", - elf_header->e_ident[EI_DATA]); - return false; - } - dwarf2reader::ByteReader byte_reader(endianness); - - // Construct a context for this file. - DwarfCUToModule::FileContext file_context(dwarf_filename, module); - - // Build a map of the ELF file's sections. - const ElfW(Shdr) *sections - = reinterpret_cast(elf_header->e_shoff); - int num_sections = elf_header->e_shnum; - const ElfW(Shdr) *section_names = sections + elf_header->e_shstrndx; - for (int i = 0; i < num_sections; i++) { - const ElfW(Shdr) *section = §ions[i]; - string name = reinterpret_cast(section_names->sh_offset - + section->sh_name); - const char *contents = reinterpret_cast(section->sh_offset); - uint64 length = section->sh_size; - file_context.section_map[name] = std::make_pair(contents, length); - } - - // Parse all the compilation units in the .debug_info section. - DumperLineToModule line_to_module(&byte_reader); - std::pair debug_info_section - = file_context.section_map[".debug_info"]; - // We should never have been called if the file doesn't have a - // .debug_info section. - assert(debug_info_section.first); - uint64 debug_info_length = debug_info_section.second; - for (uint64 offset = 0; offset < debug_info_length;) { - // Make a handler for the root DIE that populates MODULE with the - // data we find. - DwarfCUToModule::WarningReporter reporter(dwarf_filename, offset); - DwarfCUToModule root_handler(&file_context, &line_to_module, &reporter); - // Make a Dwarf2Handler that drives our DIEHandler. - dwarf2reader::DIEDispatcher die_dispatcher(&root_handler); - // Make a DWARF parser for the compilation unit at OFFSET. - dwarf2reader::CompilationUnit reader(file_context.section_map, - offset, - &byte_reader, - &die_dispatcher); - // Process the entire compilation unit; get the offset of the next. - offset += reader.Start(); - } - return true; -} - -static bool LoadSymbols(const std::string &obj_file, ElfW(Ehdr) *elf_header, - Module *module) { - // Translate all offsets in section headers into address. - FixAddress(elf_header); - ElfW(Addr) loading_addr = GetLoadingAddress( - reinterpret_cast(elf_header->e_phoff), - elf_header->e_phnum); - module->SetLoadAddress(loading_addr); - - const ElfW(Shdr) *sections = - reinterpret_cast(elf_header->e_shoff); - const ElfW(Shdr) *section_names = sections + elf_header->e_shstrndx; - bool found_debug_info_section = false; - const ElfW(Shdr) *stab_section - = FindSectionByName(".stab", sections, section_names, - elf_header->e_shnum); - if (stab_section) { - const ElfW(Shdr) *stabstr_section = stab_section->sh_link + sections; - if (stabstr_section) { - found_debug_info_section = true; - if (!LoadStabs(stab_section, stabstr_section, module)) - fprintf(stderr, "\".stab\" section found, but failed to load STABS" - " debugging information\n"); - } - } - const ElfW(Shdr) *dwarf_section - = FindSectionByName(".debug_info", sections, section_names, - elf_header->e_shnum); - if (dwarf_section) { - found_debug_info_section = true; - if (!LoadDwarf(obj_file, elf_header, module)) - fprintf(stderr, "\".debug_info\" section found, but failed to load " - "DWARF debugging information\n"); - } - if (!found_debug_info_section) { - fprintf(stderr, "file contains no debugging information" - " (no \".stab\" or \".debug_info\" sections)\n"); - return false; - } - return true; -} - -// -// FDWrapper -// -// Wrapper class to make sure opened file is closed. -// -class FDWrapper { - public: - explicit FDWrapper(int fd) : - fd_(fd) { - } - ~FDWrapper() { - if (fd_ != -1) - close(fd_); - } - int get() { - return fd_; - } - int release() { - int fd = fd_; - fd_ = -1; - return fd; - } - private: - int fd_; -}; - -// -// MmapWrapper -// -// Wrapper class to make sure mapped regions are unmapped. -// -class MmapWrapper { - public: - MmapWrapper(void *mapped_address, size_t mapped_size) : - base_(mapped_address), size_(mapped_size) { - } - ~MmapWrapper() { - if (base_ != NULL) { - assert(size_ > 0); - munmap(base_, size_); - } - } - void release() { - base_ = NULL; - size_ = 0; - } - - private: - void *base_; - size_t size_; -}; - -// Return the breakpad symbol file identifier for the architecture of -// ELF_HEADER. -const char *ElfArchitecture(const ElfW(Ehdr) *elf_header) { - ElfW(Half) arch = elf_header->e_machine; - switch (arch) { - case EM_386: return "x86"; - case EM_ARM: return "arm"; - case EM_MIPS: return "mips"; - case EM_PPC64: return "ppc64"; - case EM_PPC: return "ppc"; - case EM_S390: return "s390"; - case EM_SPARC: return "sparc"; - case EM_SPARCV9: return "sparcv9"; - case EM_X86_64: return "x86_64"; - default: return NULL; - } -} - -// Format the Elf file identifier in IDENTIFIER as a UUID with the -// dashes removed. -std::string FormatIdentifier(unsigned char identifier[16]) { - char identifier_str[40]; - google_breakpad::FileID::ConvertIdentifierToString( - identifier, - identifier_str, - sizeof(identifier_str)); - std::string id_no_dash; - for (int i = 0; identifier_str[i] != '\0'; ++i) - if (identifier_str[i] != '-') - id_no_dash += identifier_str[i]; - // Add an extra "0" by the end. PDB files on Windows have an 'age' - // number appended to the end of the file identifier; this isn't - // really used or necessary on other platforms, but let's preserve - // the pattern. - id_no_dash += '0'; - return id_no_dash; -} - -// Return the non-directory portion of FILENAME: the portion after the -// last slash, or the whole filename if there are no slashes. -std::string BaseFileName(const std::string &filename) { - // Lots of copies! basename's behavior is less than ideal. - char *c_filename = strdup(filename.c_str()); - std::string base = basename(c_filename); - free(c_filename); - return base; -} - -} // namespace - -namespace google_breakpad { - -bool WriteSymbolFile(const std::string &obj_file, FILE *sym_file) { - int obj_fd = open(obj_file.c_str(), O_RDONLY); - if (obj_fd < 0) { - fprintf(stderr, "Failed to open ELF file '%s': %s\n", - obj_file.c_str(), strerror(errno)); - return false; - } - FDWrapper obj_fd_wrapper(obj_fd); - struct stat st; - if (fstat(obj_fd, &st) != 0 && st.st_size <= 0) { - fprintf(stderr, "Unable to fstat ELF file '%s': %s\n", - obj_file.c_str(), strerror(errno)); - return false; - } - void *obj_base = mmap(NULL, st.st_size, - PROT_READ | PROT_WRITE, MAP_PRIVATE, obj_fd, 0); - if (obj_base == MAP_FAILED) { - fprintf(stderr, "Failed to mmap ELF file '%s': %s\n", - obj_file.c_str(), strerror(errno)); - return false; - } - MmapWrapper map_wrapper(obj_base, st.st_size); - ElfW(Ehdr) *elf_header = reinterpret_cast(obj_base); - if (!IsValidElf(elf_header)) { - fprintf(stderr, "Not a valid ELF file: %s\n", obj_file.c_str()); - return false; - } - - unsigned char identifier[16]; - google_breakpad::FileID file_id(obj_file.c_str()); - if (!file_id.ElfFileIdentifier(identifier)) { - fprintf(stderr, "Unable to generate file identifier\n"); - return false; - } - - const char *architecture = ElfArchitecture(elf_header); - if (!architecture) { - fprintf(stderr, "Unrecognized ELF machine architecture: %d\n", - elf_header->e_machine); - return false; - } - - std::string name = BaseFileName(obj_file); - std::string os = "Linux"; - std::string id = FormatIdentifier(identifier); - - Module module(name, os, architecture, id); - if (!LoadSymbols(obj_file, elf_header, &module)) - return false; - if (!module.Write(sym_file)) - return false; - - return true; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/dump_symbols.h b/share/google-breakpad/src/common/linux/dump_symbols.h deleted file mode 100644 index 0b6d0c02d0173c390e99f43ff1225af72d026610..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dump_symbols.h +++ /dev/null @@ -1,50 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010, 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. - -// dump_symbols.h: Read debugging information from an ELF file, and write -// it out as a Breakpad symbol file. - -#ifndef COMMON_LINUX_DUMP_SYMBOLS_H__ -#define COMMON_LINUX_DUMP_SYMBOLS_H__ - -#include -#include - -namespace google_breakpad { - -// Find all the debugging information in OBJ_FILE, an ELF executable -// or shared library, and write it to SYM_FILE in the Breakpad symbol -// file format. -bool WriteSymbolFile(const std::string &obj_file, FILE *sym_file); - -} // namespace google_breakpad - -#endif // COMMON_LINUX_DUMP_SYMBOLS_H__ diff --git a/share/google-breakpad/src/common/linux/dwarf_cu_to_module.cc b/share/google-breakpad/src/common/linux/dwarf_cu_to_module.cc deleted file mode 100644 index 88cea9405a813443d05838b4f4fa4bd33b0bfdf4..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dwarf_cu_to_module.cc +++ /dev/null @@ -1,887 +0,0 @@ -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// Implement the DwarfCUToModule class; see dwarf_cu_to_module.h. - -#include -#include - -#include "common/linux/dwarf_cu_to_module.h" -#include "common/linux/dwarf_line_to_module.h" - -namespace google_breakpad { - -using std::map; -using std::vector; - -// Data provided by a DWARF specification DIE. -// -// In DWARF, the DIE for a definition may contain a DW_AT_specification -// attribute giving the offset of the corresponding declaration DIE, and -// the definition DIE may omit information given in the declaration. For -// example, it's common for a function's address range to appear only in -// its definition DIE, but its name to appear only in its declaration -// DIE. -// -// The dumper needs to be able to follow DW_AT_specification links to -// bring all this information together in a FUNC record. Conveniently, -// DIEs that are the target of such links have a DW_AT_declaration flag -// set, so we can identify them when we first see them, and record their -// contents for later reference. -// -// A Specification holds information gathered from a declaration DIE that -// we may need if we find a DW_AT_specification link pointing to it. -struct DwarfCUToModule::Specification { - // The name of the enclosing scope, or the empty string if there is none. - string enclosing_name; - - // The name for the specification DIE itself, without any enclosing - // name components. - string unqualified_name; -}; - -// An abstract origin -- base definition of an inline function. -struct AbstractOrigin { - AbstractOrigin() : name() {} - AbstractOrigin(const string& name) : name(name) {} - - string name; -}; - -typedef map AbstractOriginByOffset; - -// Data global to the DWARF-bearing file that is private to the -// DWARF-to-Module process. -struct DwarfCUToModule::FilePrivate { - // A map from offsets of DIEs within the .debug_info section to - // Specifications describing those DIEs. Specification references can - // cross compilation unit boundaries. - SpecificationByOffset specifications; - - AbstractOriginByOffset origins; -}; - -DwarfCUToModule::FileContext::FileContext(const string &filename_arg, - Module *module_arg) - : filename(filename_arg), module(module_arg) { - file_private = new FilePrivate(); -} - -DwarfCUToModule::FileContext::~FileContext() { - delete file_private; -} - -// Information global to the particular compilation unit we're -// parsing. This is for data shared across the CU's entire DIE tree, -// and parameters from the code invoking the CU parser. -struct DwarfCUToModule::CUContext { - CUContext(FileContext *file_context_arg, WarningReporter *reporter_arg) - : file_context(file_context_arg), - reporter(reporter_arg), - language(Language::CPlusPlus) { } - ~CUContext() { - for (vector::iterator it = functions.begin(); - it != functions.end(); it++) - delete *it; - }; - - // The DWARF-bearing file into which this CU was incorporated. - FileContext *file_context; - - // For printing error messages. - WarningReporter *reporter; - - // The source language of this compilation unit. - const Language *language; - - // The functions defined in this compilation unit. We accumulate - // them here during parsing. Then, in DwarfCUToModule::Finish, we - // assign them lines and add them to file_context->module. - // - // Destroying this destroys all the functions this vector points to. - vector functions; -}; - -// Information about the context of a particular DIE. This is for -// information that changes as we descend the tree towards the leaves: -// the containing classes/namespaces, etc. -struct DwarfCUToModule::DIEContext { - // The fully-qualified name of the context. For example, for a - // tree like: - // - // DW_TAG_namespace Foo - // DW_TAG_class Bar - // DW_TAG_subprogram Baz - // - // in a C++ compilation unit, the DIEContext's name for the - // DW_TAG_subprogram DIE would be "Foo::Bar". The DIEContext's - // name for the DW_TAG_namespace DIE would be "". - string name; -}; - -// An abstract base class for all the dumper's DIE handlers. -class DwarfCUToModule::GenericDIEHandler: public dwarf2reader::DIEHandler { - public: - // Create a handler for the DIE at OFFSET whose compilation unit is - // described by CU_CONTEXT, and whose immediate context is described - // by PARENT_CONTEXT. - GenericDIEHandler(CUContext *cu_context, DIEContext *parent_context, - uint64 offset) - : cu_context_(cu_context), - parent_context_(parent_context), - offset_(offset), - declaration_(false), - specification_(NULL) { } - - // Derived classes' ProcessAttributeUnsigned can defer to this to - // handle DW_AT_declaration, or simply not override it. - void ProcessAttributeUnsigned(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - - // Derived classes' ProcessAttributeReference can defer to this to - // handle DW_AT_specification, or simply not override it. - void ProcessAttributeReference(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - - // Derived classes' ProcessAttributeReference can defer to this to - // handle DW_AT_specification, or simply not override it. - void ProcessAttributeString(enum DwarfAttribute attr, - enum DwarfForm form, - const string &data); - - protected: - // Compute and return the fully-qualified name of the DIE. If this - // DIE is a declaration DIE, to be cited by other DIEs' - // DW_AT_specification attributes, record its enclosing name and - // unqualified name in the specification table. - // - // Use this from EndAttributes member functions, not ProcessAttribute* - // functions; only the former can be sure that all the DIE's attributes - // have been seen. - string ComputeQualifiedName(); - - CUContext *cu_context_; - DIEContext *parent_context_; - uint64 offset_; - - // If this DIE has a DW_AT_declaration attribute, this is its value. - // It is false on DIEs with no DW_AT_declaration attribute. - bool declaration_; - - // If this DIE has a DW_AT_specification attribute, this is the - // Specification structure for the DIE the attribute refers to. - // Otherwise, this is NULL. - Specification *specification_; - - // The value of the DW_AT_name attribute, or the empty string if the - // DIE has no such attribute. - string name_attribute_; -}; - -void DwarfCUToModule::GenericDIEHandler::ProcessAttributeUnsigned( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch (attr) { - case dwarf2reader::DW_AT_declaration: declaration_ = (data != 0); break; - default: break; - } -} - -void DwarfCUToModule::GenericDIEHandler::ProcessAttributeReference( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch (attr) { - case dwarf2reader::DW_AT_specification: { - // Find the Specification to which this attribute refers, and - // set specification_ appropriately. We could do more processing - // here, but it's better to leave the real work to our - // EndAttribute member function, at which point we know we have - // seen all the DIE's attributes. - FileContext *file_context = cu_context_->file_context; - SpecificationByOffset *specifications - = &file_context->file_private->specifications; - SpecificationByOffset::iterator spec = specifications->find(data); - if (spec != specifications->end()) { - specification_ = &spec->second; - } else { - // Technically, there's no reason a DW_AT_specification - // couldn't be a forward reference, but supporting that would - // be a lot of work (changing to a two-pass structure), and I - // don't think any producers we care about ever emit such - // things. - cu_context_->reporter->UnknownSpecification(offset_, data); - } - break; - } - default: break; - } -} - -void DwarfCUToModule::GenericDIEHandler::ProcessAttributeString( - enum DwarfAttribute attr, - enum DwarfForm form, - const string &data) { - switch (attr) { - case dwarf2reader::DW_AT_name: name_attribute_ = data; break; - default: break; - } -} - -string DwarfCUToModule::GenericDIEHandler::ComputeQualifiedName() { - // Find our unqualified name. If the DIE has its own DW_AT_name - // attribute, then use that; otherwise, check our specification. - const string *unqualified_name; - if (name_attribute_.empty() && specification_) - unqualified_name = &specification_->unqualified_name; - else - unqualified_name = &name_attribute_; - - // Find the name of our enclosing context. If we have a - // specification, it's the specification's enclosing context that - // counts; otherwise, use this DIE's context. - const string *enclosing_name; - if (specification_) - enclosing_name = &specification_->enclosing_name; - else - enclosing_name = &parent_context_->name; - - // If this DIE was marked as a declaration, record its names in the - // specification table. - if (declaration_) { - FileContext *file_context = cu_context_->file_context; - Specification spec; - spec.enclosing_name = *enclosing_name; - spec.unqualified_name = *unqualified_name; - file_context->file_private->specifications[offset_] = spec; - } - - // Combine the enclosing name and unqualified name to produce our - // own fully-qualified name. - return cu_context_->language->MakeQualifiedName(*enclosing_name, - *unqualified_name); -} - -// A handler class for DW_TAG_subprogram DIEs. -class DwarfCUToModule::FuncHandler: public GenericDIEHandler { - public: - FuncHandler(CUContext *cu_context, DIEContext *parent_context, - uint64 offset) - : GenericDIEHandler(cu_context, parent_context, offset), - low_pc_(0), high_pc_(0), abstract_origin_(NULL), inline_(false) { } - void ProcessAttributeUnsigned(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - void ProcessAttributeSigned(enum DwarfAttribute attr, - enum DwarfForm form, - int64 data); - void ProcessAttributeReference(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - - bool EndAttributes(); - void Finish(); - - private: - // The fully-qualified name, as derived from name_attribute_, - // specification_, parent_context_. Computed in EndAttributes. - string name_; - uint64 low_pc_, high_pc_; // DW_AT_low_pc, DW_AT_high_pc - const AbstractOrigin* abstract_origin_; - bool inline_; -}; - -void DwarfCUToModule::FuncHandler::ProcessAttributeUnsigned( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch (attr) { - case dwarf2reader::DW_AT_inline: - switch(data) { - case dwarf2reader::DW_INL_inlined: - case dwarf2reader::DW_INL_declared_not_inlined: - case dwarf2reader::DW_INL_declared_inlined: - inline_ = true; break; - default: - break; - } - break; - case dwarf2reader::DW_AT_low_pc: low_pc_ = data; break; - case dwarf2reader::DW_AT_high_pc: high_pc_ = data; break; - default: - GenericDIEHandler::ProcessAttributeUnsigned(attr, form, data); - break; - } -} - -void DwarfCUToModule::FuncHandler::ProcessAttributeSigned( - enum DwarfAttribute attr, - enum DwarfForm form, - int64 data) { - switch (attr) { - case dwarf2reader::DW_AT_inline: - switch(data) { - case dwarf2reader::DW_INL_inlined: - case dwarf2reader::DW_INL_declared_not_inlined: - case dwarf2reader::DW_INL_declared_inlined: - inline_ = true; break; - default: - break; - } - break; - default: - break; - } -} - -void DwarfCUToModule::FuncHandler::ProcessAttributeReference( - enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch(attr) { - case dwarf2reader::DW_AT_abstract_origin: { - const AbstractOriginByOffset& origins = - cu_context_->file_context->file_private->origins; - AbstractOriginByOffset::const_iterator origin = origins.find(data); - if (origin != origins.end()) { - abstract_origin_ = &(origin->second); - } else { - cu_context_->reporter->UnknownAbstractOrigin(offset_, data); - } - break; - } - default: - GenericDIEHandler::ProcessAttributeReference(attr, form, data); - break; - } -} - -bool DwarfCUToModule::FuncHandler::EndAttributes() { - // Compute our name, and record a specification, if appropriate. - name_ = ComputeQualifiedName(); - if (name_.empty() && abstract_origin_) { - name_ = abstract_origin_->name; - } - return true; -} - -void DwarfCUToModule::FuncHandler::Finish() { - // Did we collect the information we need? Not all DWARF function - // entries have low and high addresses (for example, inlined - // functions that were never used), but all the ones we're - // interested in cover a non-empty range of bytes. - if (low_pc_ < high_pc_) { - // Create a Module::Function based on the data we've gathered, and - // add it to the functions_ list. - Module::Function *func = new Module::Function; - func->name = name_; - func->address = low_pc_; - func->size = high_pc_ - low_pc_; - func->parameter_size = 0; - cu_context_->functions.push_back(func); - } else if (inline_) { - AbstractOrigin origin(name_); - cu_context_->file_context->file_private->origins[offset_] = origin; - } -} - -// A handler for DIEs that contain functions and contribute a -// component to their names: namespaces, classes, etc. -class DwarfCUToModule::NamedScopeHandler: public GenericDIEHandler { - public: - NamedScopeHandler(CUContext *cu_context, DIEContext *parent_context, - uint64 offset) - : GenericDIEHandler(cu_context, parent_context, offset) { } - bool EndAttributes(); - DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag, - const AttributeList &attrs); - - private: - DIEContext child_context_; // A context for our children. -}; - -bool DwarfCUToModule::NamedScopeHandler::EndAttributes() { - child_context_.name = ComputeQualifiedName(); - return true; -} - -dwarf2reader::DIEHandler *DwarfCUToModule::NamedScopeHandler::FindChildHandler( - uint64 offset, - enum DwarfTag tag, - const AttributeList &attrs) { - switch (tag) { - case dwarf2reader::DW_TAG_subprogram: - return new FuncHandler(cu_context_, &child_context_, offset); - case dwarf2reader::DW_TAG_namespace: - case dwarf2reader::DW_TAG_class_type: - case dwarf2reader::DW_TAG_structure_type: - case dwarf2reader::DW_TAG_union_type: - return new NamedScopeHandler(cu_context_, &child_context_, offset); - default: - return NULL; - } -}; - -void DwarfCUToModule::WarningReporter::CUHeading() { - if (printed_cu_header_) - return; - fprintf(stderr, "%s: in compilation unit '%s' (offset 0x%llx):\n", - filename_.c_str(), cu_name_.c_str(), cu_offset_); - printed_cu_header_ = true; -} - -void DwarfCUToModule::WarningReporter::UnknownSpecification(uint64 offset, - uint64 target) { - CUHeading(); - fprintf(stderr, "%s: the DIE at offset 0x%llx has a DW_AT_specification" - " attribute referring to the die at offset 0x%llx, which either" - " was not marked as a declaration, or comes later in the file", - filename_.c_str(), offset, target); -} - -void DwarfCUToModule::WarningReporter::UnknownAbstractOrigin(uint64 offset, - uint64 target) { - CUHeading(); - fprintf(stderr, "%s: the DIE at offset 0x%llx has a DW_AT_abstract_origin" - " attribute referring to the die at offset 0x%llx, which either" - " was not marked as an inline, or comes later in the file", - filename_.c_str(), offset, target); -} - -void DwarfCUToModule::WarningReporter::MissingSection(const string &name) { - CUHeading(); - fprintf(stderr, "%s: warning: couldn't find DWARF '%s' section\n", - filename_.c_str(), name.c_str()); -} - -void DwarfCUToModule::WarningReporter::BadLineInfoOffset(uint64 offset) { - CUHeading(); - fprintf(stderr, "%s: warning: line number data offset beyond end" - " of '.debug_line' section\n", - filename_.c_str()); -} - -void DwarfCUToModule::WarningReporter::UncoveredHeading() { - if (printed_unpaired_header_) - return; - CUHeading(); - fprintf(stderr, "%s: warning: skipping unpaired lines/functions:\n", - filename_.c_str()); - printed_unpaired_header_ = true; -} - -void DwarfCUToModule::WarningReporter::UncoveredFunction( - const Module::Function &function) { - UncoveredHeading(); - fprintf(stderr, " function%s: %s\n", - function.size == 0 ? " (zero-length)" : "", - function.name.c_str()); -} - -void DwarfCUToModule::WarningReporter::UncoveredLine(const Module::Line &line) { - UncoveredHeading(); - fprintf(stderr, " line%s: %s:%d at 0x%llx\n", - (line.size == 0 ? " (zero-length)" : ""), - line.file->name.c_str(), line.number, line.address); -} - -DwarfCUToModule::DwarfCUToModule(FileContext *file_context, - LineToModuleFunctor *line_reader, - WarningReporter *reporter) - : line_reader_(line_reader), has_source_line_info_(false) { - cu_context_ = new CUContext(file_context, reporter); - child_context_ = new DIEContext(); -} - -DwarfCUToModule::~DwarfCUToModule() { - delete cu_context_; - delete child_context_; -} - -void DwarfCUToModule::ProcessAttributeSigned(enum DwarfAttribute attr, - enum DwarfForm form, - int64 data) { - switch (attr) { - case dwarf2reader::DW_AT_language: // source language of this CU - SetLanguage(static_cast(data)); - break; - default: - break; - } -} - -void DwarfCUToModule::ProcessAttributeUnsigned(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data) { - switch (attr) { - case dwarf2reader::DW_AT_stmt_list: // Line number information. - has_source_line_info_ = true; - source_line_offset_ = data; - break; - case dwarf2reader::DW_AT_language: // source language of this CU - SetLanguage(static_cast(data)); - break; - default: - break; - } -} - -void DwarfCUToModule::ProcessAttributeString(enum DwarfAttribute attr, - enum DwarfForm form, - const string &data) { - if (attr == dwarf2reader::DW_AT_name) - cu_context_->reporter->SetCUName(data); -} - -bool DwarfCUToModule::EndAttributes() { - return true; -} - -dwarf2reader::DIEHandler *DwarfCUToModule::FindChildHandler( - uint64 offset, - enum DwarfTag tag, - const AttributeList &attrs) { - switch (tag) { - case dwarf2reader::DW_TAG_subprogram: - return new FuncHandler(cu_context_, child_context_, offset); - case dwarf2reader::DW_TAG_namespace: - case dwarf2reader::DW_TAG_class_type: - case dwarf2reader::DW_TAG_structure_type: - case dwarf2reader::DW_TAG_union_type: - return new NamedScopeHandler(cu_context_, child_context_, offset); - default: - return NULL; - } -} - -void DwarfCUToModule::SetLanguage(DwarfLanguage language) { - switch (language) { - case dwarf2reader::DW_LANG_Java: - cu_context_->language = Language::Java; - break; - - // DWARF has no generic language code for assembly language; this is - // what the GNU toolchain uses. - case dwarf2reader::DW_LANG_Mips_Assembler: - cu_context_->language = Language::Assembler; - break; - - // C++ covers so many cases that it probably has some way to cope - // with whatever the other languages throw at us. So make it the - // default. - // - // Objective C and Objective C++ seem to create entries for - // methods whose DW_AT_name values are already fully-qualified: - // "-[Classname method:]". These appear at the top level. - // - // DWARF data for C should never include namespaces or functions - // nested in struct types, but if it ever does, then C++'s - // notation is probably not a bad choice for that. - default: - case dwarf2reader::DW_LANG_ObjC: - case dwarf2reader::DW_LANG_ObjC_plus_plus: - case dwarf2reader::DW_LANG_C: - case dwarf2reader::DW_LANG_C89: - case dwarf2reader::DW_LANG_C99: - case dwarf2reader::DW_LANG_C_plus_plus: - cu_context_->language = Language::CPlusPlus; - break; - } -} - -void DwarfCUToModule::ReadSourceLines(uint64 offset) { - const dwarf2reader::SectionMap §ion_map - = cu_context_->file_context->section_map; - dwarf2reader::SectionMap::const_iterator map_entry - = section_map.find(".debug_line"); - if (map_entry == section_map.end()) { - cu_context_->reporter->MissingSection(".debug_line"); - return; - } - const char *section_start = map_entry->second.first; - uint64 section_length = map_entry->second.second; - if (offset >= section_length) { - cu_context_->reporter->BadLineInfoOffset(offset); - return; - } - (*line_reader_)(section_start + offset, section_length - offset, - cu_context_->file_context->module, &lines_); -} - -namespace { -// Return true if ADDRESS falls within the range of ITEM. -template -inline bool within(const T &item, Module::Address address) { - // Because Module::Address is unsigned, and unsigned arithmetic - // wraps around, this will be false if ADDRESS falls before the - // start of ITEM, or if it falls after ITEM's end. - return address - item.address < item.size; -} -} - -void DwarfCUToModule::AssignLinesToFunctions() { - vector *functions = &cu_context_->functions; - WarningReporter *reporter = cu_context_->reporter; - - // This would be simpler if we assumed that source line entries - // don't cross function boundaries. However, there's no real reason - // to assume that (say) a series of function definitions on the same - // line wouldn't get coalesced into one line number entry. The - // DWARF spec certainly makes no such promises. - // - // So treat the functions and lines as peers, and take the trouble - // to compute their ranges' intersections precisely. In any case, - // the hair here is a constant factor for performance; the - // complexity from here on out is linear. - - // Put both our functions and lines in order by address. - sort(functions->begin(), functions->end(), - Module::Function::CompareByAddress); - sort(lines_.begin(), lines_.end(), Module::Line::CompareByAddress); - - // The last line that we used any piece of. We use this only for - // generating warnings. - const Module::Line *last_line_used = NULL; - - // The last function and line we warned about --- so we can avoid - // doing so more than once. - const Module::Function *last_function_cited = NULL; - const Module::Line *last_line_cited = NULL; - - // Make a single pass through both vectors from lower to higher - // addresses, populating each Function's lines vector with lines - // from our lines_ vector that fall within the function's address - // range. - vector::iterator func_it = functions->begin(); - vector::const_iterator line_it = lines_.begin(); - - Module::Address current; - - // Pointers to the referents of func_it and line_it, or NULL if the - // iterator is at the end of the sequence. - Module::Function *func; - const Module::Line *line; - - // Start current at the beginning of the first line or function, - // whichever is earlier. - if (func_it != functions->end() && line_it != lines_.end()) { - func = *func_it; - line = &*line_it; - current = std::min(func->address, line->address); - } else if (line_it != lines_.end()) { - func = NULL; - line = &*line_it; - current = line->address; - } else if (func_it != functions->end()) { - func = *func_it; - line = NULL; - current = (*func_it)->address; - } else { - return; - } - - while (func || line) { - // This loop has two invariants that hold at the top. - // - // First, at least one of the iterators is not at the end of its - // sequence, and those that are not refer to the earliest - // function or line that contains or starts after CURRENT. - // - // Note that every byte is in one of four states: it is covered - // or not covered by a function, and, independently, it is - // covered or not covered by a line. - // - // The second invariant is that CURRENT refers to a byte whose - // state is different from its predecessor, or it refers to the - // first byte in the address space. In other words, CURRENT is - // always the address of a transition. - // - // Note that, although each iteration advances CURRENT from one - // transition address to the next in each iteration, it might - // not advance the iterators. Suppose we have a function that - // starts with a line, has a gap, and then a second line, and - // suppose that we enter an iteration with CURRENT at the end of - // the first line. The next transition address is the start of - // the second line, after the gap, so the iteration should - // advance CURRENT to that point. At the head of that iteration, - // the invariants require that the line iterator be pointing at - // the second line. But this is also true at the head of the - // next. And clearly, the iteration must not change the function - // iterator. So neither iterator moves. - - // Assert the first invariant (see above). - assert(!func || current < func->address || within(*func, current)); - assert(!line || current < line->address || within(*line, current)); - - // The next transition after CURRENT. - Module::Address next_transition; - - // Figure out which state we're in, add lines or warn, and compute - // the next transition address. - if (func && current >= func->address) { - if (line && current >= line->address) { - // Covered by both a line and a function. - Module::Address func_left = func->size - (current - func->address); - Module::Address line_left = line->size - (current - line->address); - // This may overflow, but things work out. - next_transition = current + std::min(func_left, line_left); - Module::Line l = *line; - l.address = current; - l.size = next_transition - current; - func->lines.push_back(l); - last_line_used = line; - } else { - // Covered by a function, but no line. - if (func != last_function_cited) { - reporter->UncoveredFunction(*func); - last_function_cited = func; - } - if (line && within(*func, line->address)) - next_transition = line->address; - else - // If this overflows, we'll catch it below. - next_transition = func->address + func->size; - } - } else { - if (line && current >= line->address) { - // Covered by a line, but no function. - // - // If GCC emits padding after one function to align the start - // of the next, then it will attribute the padding - // instructions to the last source line of function (to reduce - // the size of the line number info), but omit it from the - // DW_AT_{low,high}_pc range given in .debug_info (since it - // costs nothing to be precise there). If we did use at least - // some of the line we're about to skip, and it ends at the - // start of the next function, then assume this is what - // happened, and don't warn. - if (line != last_line_cited - && !(func - && line == last_line_used - && func->address - line->address == line->size)) { - reporter->UncoveredLine(*line); - last_line_cited = line; - } - if (func && within(*line, func->address)) - next_transition = func->address; - else - // If this overflows, we'll catch it below. - next_transition = line->address + line->size; - } else { - // Covered by neither a function nor a line. By the invariant, - // both func and line begin after CURRENT. The next transition - // is the start of the next function or next line, whichever - // is earliest. - assert (func || line); - if (func && line) - next_transition = std::min(func->address, line->address); - else if (func) - next_transition = func->address; - else - next_transition = line->address; - } - } - - // If a function or line abuts the end of the address space, then - // next_transition may end up being zero, in which case we've completed - // our pass. Handle that here, instead of trying to deal with it in - // each place we compute next_transition. - if (!next_transition) - break; - - // Advance iterators as needed. If lines overlap or functions overlap, - // then we could go around more than once. We don't worry too much - // about what result we produce in that case, just as long as we don't - // hang or crash. - while (func_it != functions->end() - && current >= (*func_it)->address - && !within(**func_it, next_transition)) - func_it++; - func = (func_it != functions->end()) ? *func_it : NULL; - while (line_it != lines_.end() - && current >= line_it->address - && !within(*line_it, next_transition)) - line_it++; - line = (line_it != lines_.end()) ? &*line_it : NULL; - - // We must make progress. - assert(next_transition > current); - current = next_transition; - } -} - -void DwarfCUToModule::Finish() { - // Assembly language files have no function data, and that gives us - // no place to store our line numbers (even though the GNU toolchain - // will happily produce source line info for assembly language - // files). To avoid spurious warnings about lines we can't assign - // to functions, skip CUs in languages that lack functions. - if (!cu_context_->language->HasFunctions()) - return; - - // Read source line info, if we have any. - if (has_source_line_info_) - ReadSourceLines(source_line_offset_); - - vector *functions = &cu_context_->functions; - - // Dole out lines to the appropriate functions. - AssignLinesToFunctions(); - - // Add our functions, which now have source lines assigned to them, - // to module_. - cu_context_->file_context->module->AddFunctions(functions->begin(), - functions->end()); - - // Ownership of the function objects has shifted from cu_context to - // the Module. - functions->clear(); -} - -bool DwarfCUToModule::StartCompilationUnit(uint64 offset, - uint8 address_size, - uint8 offset_size, - uint64 cu_length, - uint8 dwarf_version) { - return dwarf_version >= 2; -} - -bool DwarfCUToModule::StartRootDIE(uint64 offset, enum DwarfTag tag, - const AttributeList& attrs) { - // We don't deal with partial compilation units (the only other tag - // likely to be used for root DIE). - return tag == dwarf2reader::DW_TAG_compile_unit; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/dwarf_cu_to_module.h b/share/google-breakpad/src/common/linux/dwarf_cu_to_module.h deleted file mode 100644 index af330cffa8679bc2f296b2780e59f99dbade7871..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dwarf_cu_to_module.h +++ /dev/null @@ -1,259 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// Add DWARF debugging information to a Breakpad symbol file. This -// file defines the DwarfCUToModule class, which accepts parsed DWARF -// data and populates a google_breakpad::Module with the results; the -// Module can then write its contents as a Breakpad symbol file. - -#ifndef COMMON_LINUX_DWARF_CU_TO_MODULE_H__ -#define COMMON_LINUX_DWARF_CU_TO_MODULE_H__ - -#include - -#include -#include -#include "common/linux/language.h" -#include "common/linux/module.h" -#include "common/dwarf/bytereader.h" -#include "common/dwarf/dwarf2diehandler.h" -#include "common/dwarf/dwarf2reader.h" - -namespace google_breakpad { - -using dwarf2reader::AttributeList; -using dwarf2reader::DwarfAttribute; -using dwarf2reader::DwarfForm; -using dwarf2reader::DwarfLanguage; -using dwarf2reader::DwarfTag; - -// Populate a google_breakpad::Module with DWARF debugging information. -// -// An instance of this class can be provided as a handler to a -// dwarf2reader::CompilationUnit DWARF parser. The handler uses the -// results of parsing to populate a google_breakpad::Module with -// source file, function, and source line information. -class DwarfCUToModule: public dwarf2reader::RootDIEHandler { - struct FilePrivate; - public: - - // Information global to the DWARF-bearing file we are processing, - // for use by DwarfCUToModule. Each DwarfCUToModule instance deals - // with a single compilation unit within the file, but information - // global to the whole file is held here. The client is responsible - // for filling it in appropriately (except for the 'file_private' - // field, which the constructor and destructor take care of), and - // then providing it to the DwarfCUToModule instance for each - // compilation unit we process in that file. - struct FileContext { - FileContext(const string &filename_arg, Module *module_arg); - ~FileContext(); - - // The name of this file, for use in error messages. - string filename; - - // A map of this file's sections, used for finding other DWARF - // sections that the .debug_info section may refer to. - dwarf2reader::SectionMap section_map; - - // The Module to which we're contributing definitions. - Module *module; - - // Inter-compilation unit data used internally by the handlers. - FilePrivate *file_private; - }; - - // An abstract base class for functors that handle DWARF line data - // for DwarfCUToModule. DwarfCUToModule could certainly just use - // dwarf2reader::LineInfo itself directly, but decoupling things - // this way makes unit testing a little easier. - class LineToModuleFunctor { - public: - LineToModuleFunctor() { } - virtual ~LineToModuleFunctor() { } - - // Populate MODULE and LINES with source file names and code/line - // mappings, given a pointer to some DWARF line number data - // PROGRAM, and an overestimate of its size. Add no zero-length - // lines to LINES. - virtual void operator()(const char *program, uint64 length, - Module *module, vector *lines) = 0; - }; - - // The interface DwarfCUToModule uses to report warnings. The member - // function definitions for this class write messages to stderr, but - // you can override them if you'd like to detect or report these - // conditions yourself. - class WarningReporter { - public: - // Warn about problems in the DWARF file FILENAME, in the - // compilation unit at OFFSET. - WarningReporter(const string &filename, uint64 cu_offset) - : filename_(filename), cu_offset_(cu_offset), printed_cu_header_(false), - printed_unpaired_header_(false) { } - virtual ~WarningReporter() { } - - // Set the name of the compilation unit we're processing to NAME. - virtual void SetCUName(const string &name) { cu_name_ = name; } - - // A DW_AT_specification in the DIE at OFFSET refers to a DIE we - // haven't processed yet, or that wasn't marked as a declaration, - // at TARGET. - virtual void UnknownSpecification(uint64 offset, uint64 target); - - // A DW_AT_abstract_origin in the DIE at OFFSET refers to a DIE we - // haven't processed yet, or that wasn't marked as inline, at TARGET. - virtual void UnknownAbstractOrigin(uint64 offset, uint64 target); - - // We were unable to find the DWARF section named SECTION_NAME. - virtual void MissingSection(const string §ion_name); - - // The CU's DW_AT_stmt_list offset OFFSET is bogus. - virtual void BadLineInfoOffset(uint64 offset); - - // FUNCTION includes code covered by no line number data. - virtual void UncoveredFunction(const Module::Function &function); - - // Line number NUMBER in LINE_FILE, of length LENGTH, includes code - // covered by no function. - virtual void UncoveredLine(const Module::Line &line); - - protected: - string filename_; - uint64 cu_offset_; - string cu_name_; - bool printed_cu_header_; - bool printed_unpaired_header_; - - private: - // Print a per-CU heading, once. - void CUHeading(); - // Print an unpaired function/line heading, once. - void UncoveredHeading(); - }; - - // Create a DWARF debugging info handler for a compilation unit - // within FILE_CONTEXT. This uses information received from the - // dwarf2reader::CompilationUnit DWARF parser to populate - // FILE_CONTEXT->module. Use LINE_READER to handle the compilation - // unit's line number data. Use REPORTER to report problems with the - // data we find. - DwarfCUToModule(FileContext *file_context, - LineToModuleFunctor *line_reader, - WarningReporter *reporter); - ~DwarfCUToModule(); - - void ProcessAttributeSigned(enum DwarfAttribute attr, - enum DwarfForm form, - int64 data); - void ProcessAttributeUnsigned(enum DwarfAttribute attr, - enum DwarfForm form, - uint64 data); - void ProcessAttributeString(enum DwarfAttribute attr, - enum DwarfForm form, - const string &data); - bool EndAttributes(); - DIEHandler *FindChildHandler(uint64 offset, enum DwarfTag tag, - const AttributeList &attrs); - - // Assign all our source Lines to the Functions that cover their - // addresses, and then add them to module_. - void Finish(); - - bool StartCompilationUnit(uint64 offset, uint8 address_size, - uint8 offset_size, uint64 cu_length, - uint8 dwarf_version); - bool StartRootDIE(uint64 offset, enum DwarfTag tag, - const AttributeList& attrs); - - private: - - // Used internally by the handler. Full definitions are in - // dwarf_cu_to_module.cc. - struct FilePrivate; - struct Specification; - struct CUContext; - struct DIEContext; - class GenericDIEHandler; - class FuncHandler; - class NamedScopeHandler; - - // A map from section offsets to specifications. - typedef map SpecificationByOffset; - - // Set this compilation unit's source language to LANGUAGE. - void SetLanguage(DwarfLanguage language); - - // Read source line information at OFFSET in the .debug_line - // section. Record source files in module_, but record source lines - // in lines_; we apportion them to functions in - // AssignLinesToFunctions. - void ReadSourceLines(uint64 offset); - - // Assign the lines in lines_ to the individual line lists of the - // functions in functions_. (DWARF line information maps an entire - // compilation unit at a time, and gives no indication of which - // lines belong to which functions, beyond their addresses.) - void AssignLinesToFunctions(); - - // The only reason cu_context_ and child_context_ are pointers is - // that we want to keep their definitions private to - // dwarf_cu_to_module.cc, instead of listing them all here. They are - // owned by this DwarfCUToModule: the constructor sets them, and the - // destructor deletes them. - - // The functor to use to handle line number data. - LineToModuleFunctor *line_reader_; - - // This compilation unit's context. - CUContext *cu_context_; - - // A context for our children. - DIEContext *child_context_; - - // True if this compilation unit has source line information. - bool has_source_line_info_; - - // The offset of this compilation unit's line number information in - // the .debug_line section. - uint64 source_line_offset_; - - // The line numbers we have seen thus far. We accumulate these here - // during parsing. Then, in Finish, we call AssignLinesToFunctions - // to dole them out to the appropriate functions. - vector lines_; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_DWARF_CU_TO_MODULE_H__ diff --git a/share/google-breakpad/src/common/linux/dwarf_line_to_module.cc b/share/google-breakpad/src/common/linux/dwarf_line_to_module.cc deleted file mode 100644 index bc1cd507fba3b98ba62d5d02cae8fc2b4bbab71e..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dwarf_line_to_module.cc +++ /dev/null @@ -1,124 +0,0 @@ -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// dwarf_line_to_module.cc: Implementation of DwarfLineToModule class. -// See dwarf_line_to_module.h for details. - -#include "common/linux/dwarf_line_to_module.h" - -// Trying to support Windows paths in a reasonable way adds a lot of -// variations to test; it would be better to just put off dealing with -// it until we actually have to deal with DWARF on Windows. - -// Return true if PATH is an absolute path, false if it is relative. -static bool PathIsAbsolute(const string &path) { - return (path.size() >= 1 && path[0] == '/'); -} - -// If PATH is an absolute path, return PATH. If PATH is a relative path, -// treat it as relative to BASE and return the combined path. -static string ExpandPath(const string &path, const string &base) { - if (PathIsAbsolute(path)) - return path; - return base + "/" + path; -} - -namespace google_breakpad { - -void DwarfLineToModule::DefineDir(const string &name, uint32 dir_num) { - // Directory number zero is reserved to mean the compilation - // directory. Silently ignore attempts to redefine it. - if (dir_num != 0) - directories_[dir_num] = name; -} - -void DwarfLineToModule::DefineFile(const string &name, int32 file_num, - uint32 dir_num, uint64 mod_time, - uint64 length) { - if (file_num == -1) - file_num = ++highest_file_number_; - else if (file_num > highest_file_number_) - highest_file_number_ = file_num; - - std::string full_name; - if (dir_num != 0) { - DirectoryTable::const_iterator directory_it = directories_.find(dir_num); - if (directory_it != directories_.end()) { - full_name = ExpandPath(name, directory_it->second); - } else { - if (!warned_bad_directory_number_) { - fprintf(stderr, "warning: DWARF line number data refers to undefined" - " directory numbers\n"); - warned_bad_directory_number_ = true; - } - full_name = name; // just treat name as relative - } - } else { - // Directory number zero is the compilation directory; we just report - // relative paths in that case. - full_name = name; - } - - // Find a Module::File object of the given name, and add it to the - // file table. - files_[file_num] = module_->FindFile(full_name); -} - -void DwarfLineToModule::AddLine(uint64 address, uint64 length, - uint32 file_num, uint32 line_num, - uint32 column_num) { - if (length == 0) - return; - - // Clip lines not to extend beyond the end of the address space. - if (address + length < address) - length = -address; - - // Find the source file being referred to. - Module::File *file = files_[file_num]; - if (!file) { - if (!warned_bad_file_number_) { - fprintf(stderr, "warning: DWARF line number data refers to " - "undefined file numbers\n"); - warned_bad_file_number_ = true; - } - return; - } - Module::Line line; - line.address = address; - // We set the size when we get the next line or the EndSequence call. - line.size = length; - line.file = file; - line.number = line_num; - lines_->push_back(line); -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/dwarf_line_to_module.h b/share/google-breakpad/src/common/linux/dwarf_line_to_module.h deleted file mode 100644 index ab8bf11df23ce3b5999563d088cf9dd6d3008092..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/dwarf_line_to_module.h +++ /dev/null @@ -1,117 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// The DwarfLineToModule class accepts line number information from a -// DWARF parser and adds it to a google_breakpad::Module. The Module -// can write that data out as a Breakpad symbol file. - -#ifndef COMMON_LINUX_DWARF_LINE_TO_MODULE_H -#define COMMON_LINUX_DWARF_LINE_TO_MODULE_H - -#include "common/linux/module.h" -#include "common/dwarf/dwarf2reader.h" - -namespace google_breakpad { - -// A class for producing a vector of google_breakpad::Module::Line -// instances from parsed DWARF line number data. -// -// An instance of this class can be provided as a handler to a -// dwarf2reader::LineInfo DWARF line number information parser. The -// handler accepts source location information from the parser and -// uses it to produce a vector of google_breakpad::Module::Line -// objects, referring to google_breakpad::Module::File objects added -// to a particular google_breakpad::Module. -class DwarfLineToModule: public dwarf2reader::LineInfoHandler { - public: - // As the DWARF line info parser passes us line records, add source - // files to MODULE, and add all lines to the end of LINES. LINES - // need not be empty. If the parser hands us a zero-length line, we - // omit it. If the parser hands us a line that extends beyond the - // end of the address space, we clip it. It's up to our client to - // sort out which lines belong to which functions; we don't add them - // to any particular function in MODULE ourselves. - DwarfLineToModule(Module *module, vector *lines) - : module_(module), - lines_(lines), - highest_file_number_(-1), - warned_bad_file_number_(false), - warned_bad_directory_number_(false) { } - - ~DwarfLineToModule() { } - - void DefineDir(const std::string &name, uint32 dir_num); - void DefineFile(const std::string &name, int32 file_num, - uint32 dir_num, uint64 mod_time, - uint64 length); - void AddLine(uint64 address, uint64 length, - uint32 file_num, uint32 line_num, uint32 column_num); - - private: - - typedef std::map DirectoryTable; - typedef std::map FileTable; - - // The module we're contributing debugging info to. Owned by our - // client. - Module *module_; - - // The vector of lines we're accumulating. Owned by our client. - // - // In a Module, as in a breakpad symbol file, lines belong to - // specific functions, but DWARF simply assigns lines to addresses; - // one must infer the line/function relationship using the - // functions' beginning and ending addresses. So we can't add these - // to the appropriate function from module_ until we've read the - // function info as well. Instead, we accumulate lines here, and let - // whoever constructed this sort it all out. - vector *lines_; - - // A table mapping directory numbers to paths. - DirectoryTable directories_; - - // A table mapping file numbers to Module::File pointers. - FileTable files_; - - // The highest file number we've seen so far, or -1 if we've seen - // none. Used for dynamically defined file numbers. - int32 highest_file_number_; - - // True if we've warned about: - bool warned_bad_file_number_; // bad file numbers - bool warned_bad_directory_number_; // bad directory numbers -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_DWARF_LINE_TO_MODULE_H diff --git a/share/google-breakpad/src/common/linux/eintr_wrapper.h b/share/google-breakpad/src/common/linux/eintr_wrapper.h deleted file mode 100644 index 225311e6b156d6b6cd03c8154ffa2e5e0ab14e79..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/eintr_wrapper.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef COMMON_LINUX_EINTR_WRAPPER_H_ -#define COMMON_LINUX_EINTR_WRAPPER_H_ - -#include - -// This provides a wrapper around system calls which may be interrupted by a -// signal and return EINTR. See man 7 signal. -// - -#define HANDLE_EINTR(x) ({ \ - typeof(x) __eintr_result__; \ - do { \ - __eintr_result__ = x; \ - } while (__eintr_result__ == -1 && errno == EINTR); \ - __eintr_result__;\ -}) - -#endif // ifndef COMMON_LINUX_EINTR_WRAPPER_H_ diff --git a/share/google-breakpad/src/common/linux/file_id.cc b/share/google-breakpad/src/common/linux/file_id.cc deleted file mode 100644 index 8fae273a6e1f1d6fe15b0bdae5f5d6bfb010937f..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/file_id.cc +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright (c) 2006, 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. -// -// file_id.cc: Return a unique identifier for a file -// -// See file_id.h for documentation -// - -#include "common/linux/file_id.h" -#include "common/linux/linux_libc_support.h" -#include "common/linux/linux_syscall_support.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace google_breakpad { - -FileID::FileID(const char* path) { - strncpy(path_, path, sizeof(path_)); -} - -// These two functions are also used inside the crashed process, so be safe -// and use the syscall/libc wrappers instead of direct syscalls or libc. - static bool FindElfTextSection(const void *elf_mapped_base, - const void **text_start, - int *text_size) { - assert(elf_mapped_base); - assert(text_start); - assert(text_size); - - const char* elf_base = - static_cast(elf_mapped_base); - const ElfW(Ehdr)* elf_header = - reinterpret_cast(elf_base); - if (my_strncmp(elf_base, ELFMAG, SELFMAG) != 0) - return false; -#if __ELF_NATIVE_CLASS == 32 -#define ELFCLASS ELFCLASS32 -#else -#define ELFCLASS ELFCLASS64 -#endif - //TODO: support dumping 32-bit binaries from a 64-bit dump_syms? - if (elf_header->e_ident[EI_CLASS] != ELFCLASS) - return false; - *text_start = NULL; - *text_size = 0; - const ElfW(Shdr)* sections = - reinterpret_cast(elf_base + elf_header->e_shoff); - const char* text_section_name = ".text"; - int name_len = my_strlen(text_section_name); - const ElfW(Shdr)* string_section = sections + elf_header->e_shstrndx; - const ElfW(Shdr)* text_section = NULL; - for (int i = 0; i < elf_header->e_shnum; ++i) { - if (sections[i].sh_type == SHT_PROGBITS) { - const char* section_name = (char*)(elf_base + - string_section->sh_offset + - sections[i].sh_name); - if (!my_strncmp(section_name, text_section_name, name_len)) { - text_section = §ions[i]; - break; - } - } - } - if (text_section != NULL && text_section->sh_size > 0) { - *text_start = elf_base + text_section->sh_offset; - *text_size = text_section->sh_size; - } - return true; -} - -// static -bool FileID::ElfFileIdentifierFromMappedFile(void* base, - uint8_t identifier[kMDGUIDSize]) -{ - const void* text_section = NULL; - int text_size = 0; - bool success = false; - if (FindElfTextSection(base, &text_section, &text_size) && (text_size > 0)) { - my_memset(identifier, 0, kMDGUIDSize); - const uint8_t* ptr = reinterpret_cast(text_section); - const uint8_t* ptr_end = ptr + std::min(text_size, 4096); - while (ptr < ptr_end) { - for (unsigned i = 0; i < kMDGUIDSize; i++) - identifier[i] ^= ptr[i]; - ptr += kMDGUIDSize; - } - success = true; - } - return success; -} - -bool FileID::ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]) { - int fd = open(path_, O_RDONLY); - if (fd < 0) - return false; - struct stat st; - if (fstat(fd, &st) != 0) { - close(fd); - return false; - } - void* base = mmap(NULL, st.st_size, - PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0); - close(fd); - if (base == MAP_FAILED) - return false; - - bool success = ElfFileIdentifierFromMappedFile(base, identifier); - munmap(base, st.st_size); - return success; -} - -// static -void FileID::ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize], - char* buffer, int buffer_length) { - uint8_t identifier_swapped[kMDGUIDSize]; - - // Endian-ness swap to match dump processor expectation. - memcpy(identifier_swapped, identifier, kMDGUIDSize); - uint32_t* data1 = reinterpret_cast(identifier_swapped); - *data1 = htonl(*data1); - uint16_t* data2 = reinterpret_cast(identifier_swapped + 4); - *data2 = htons(*data2); - uint16_t* data3 = reinterpret_cast(identifier_swapped + 6); - *data3 = htons(*data3); - - int buffer_idx = 0; - for (unsigned int idx = 0; - (buffer_idx < buffer_length) && (idx < kMDGUIDSize); - ++idx) { - int hi = (identifier_swapped[idx] >> 4) & 0x0F; - int lo = (identifier_swapped[idx]) & 0x0F; - - if (idx == 4 || idx == 6 || idx == 8 || idx == 10) - buffer[buffer_idx++] = '-'; - - buffer[buffer_idx++] = (hi >= 10) ? 'A' + hi - 10 : '0' + hi; - buffer[buffer_idx++] = (lo >= 10) ? 'A' + lo - 10 : '0' + lo; - } - - // NULL terminate - buffer[(buffer_idx < buffer_length) ? buffer_idx : buffer_idx - 1] = 0; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/file_id.h b/share/google-breakpad/src/common/linux/file_id.h deleted file mode 100644 index 2cd4953eebead1d74767229697b5114f30cfdefe..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/file_id.h +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2006, 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. -// -// file_id.h: Return a unique identifier for a file -// - -#ifndef COMMON_LINUX_FILE_ID_H__ -#define COMMON_LINUX_FILE_ID_H__ - -#include - -#include "common/linux/guid_creator.h" - -namespace google_breakpad { - -static const size_t kMDGUIDSize = sizeof(MDGUID); - -class FileID { - public: - explicit FileID(const char* path); - ~FileID() {} - - // Load the identifier for the elf file path specified in the constructor into - // |identifier|. Return false if the identifier could not be created for the - // file. - // The current implementation will XOR the first 4096 bytes of the - // .text section to generate an identifier. - bool ElfFileIdentifier(uint8_t identifier[kMDGUIDSize]); - - // Load the identifier for the elf file mapped into memory at |base| into - // |identifier|. Return false if the identifier could not be created for the - // file. - static bool ElfFileIdentifierFromMappedFile(void* base, - uint8_t identifier[kMDGUIDSize]); - - // Convert the |identifier| data to a NULL terminated string. The string will - // be formatted as a UUID (e.g., 22F065BB-FC9C-49F7-80FE-26A7CEBD7BCE). - // The |buffer| should be at least 37 bytes long to receive all of the data - // and termination. Shorter buffers will contain truncated data. - static void ConvertIdentifierToString(const uint8_t identifier[kMDGUIDSize], - char* buffer, int buffer_length); - - private: - // Storage for the path specified - char path_[PATH_MAX]; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_FILE_ID_H__ diff --git a/share/google-breakpad/src/common/linux/guid_creator.cc b/share/google-breakpad/src/common/linux/guid_creator.cc deleted file mode 100644 index 7611cc3e92393c7e6cf1b14ad6f423b9748ba6b5..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/guid_creator.cc +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright (c) 2006, 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. - -#include -#include -#include -#include -#include - -#include "common/linux/guid_creator.h" - -// -// GUIDGenerator -// -// This class is used to generate random GUID. -// Currently use random number to generate a GUID since Linux has -// no native GUID generator. This should be OK since we don't expect -// crash to happen very offen. -// -class GUIDGenerator { - public: - GUIDGenerator() { - srandom(time(NULL)); - } - - static u_int32_t BytesToUInt32(const u_int8_t bytes[]) { - return ((u_int32_t) bytes[0] - | ((u_int32_t) bytes[1] << 8) - | ((u_int32_t) bytes[2] << 16) - | ((u_int32_t) bytes[3] << 24)); - } - - static void UInt32ToBytes(u_int8_t bytes[], u_int32_t n) { - bytes[0] = n & 0xff; - bytes[1] = (n >> 8) & 0xff; - bytes[2] = (n >> 16) & 0xff; - bytes[3] = (n >> 24) & 0xff; - } - - bool CreateGUID(GUID *guid) const { - guid->data1 = random(); - guid->data2 = (u_int16_t)(random()); - guid->data3 = (u_int16_t)(random()); - UInt32ToBytes(&guid->data4[0], random()); - UInt32ToBytes(&guid->data4[4], random()); - return true; - } -}; - -// Guid generator. -const GUIDGenerator kGuidGenerator; - -bool CreateGUID(GUID *guid) { - return kGuidGenerator.CreateGUID(guid); -} - -// Parse guid to string. -bool GUIDToString(const GUID *guid, char *buf, int buf_len) { - // Should allow more space the the max length of GUID. - assert(buf_len > kGUIDStringLength); - int num = snprintf(buf, buf_len, kGUIDFormatString, - guid->data1, guid->data2, guid->data3, - GUIDGenerator::BytesToUInt32(&(guid->data4[0])), - GUIDGenerator::BytesToUInt32(&(guid->data4[4]))); - if (num != kGUIDStringLength) - return false; - - buf[num] = '\0'; - return true; -} diff --git a/share/google-breakpad/src/common/linux/guid_creator.h b/share/google-breakpad/src/common/linux/guid_creator.h deleted file mode 100644 index c86d856c4d4489069e13a7c03d386a97333b7af2..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/guid_creator.h +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2006, 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. - -#ifndef COMMON_LINUX_GUID_CREATOR_H__ -#define COMMON_LINUX_GUID_CREATOR_H__ - -#include "google_breakpad/common/minidump_format.h" - -typedef MDGUID GUID; - -// Format string for parsing GUID. -#define kGUIDFormatString "%08x-%04x-%04x-%08x-%08x" -// Length of GUID string. Don't count the ending '\0'. -#define kGUIDStringLength 36 - -// Create a guid. -bool CreateGUID(GUID *guid); - -// Get the string from guid. -bool GUIDToString(const GUID *guid, char *buf, int buf_len); - -#endif diff --git a/share/google-breakpad/src/common/linux/language.cc b/share/google-breakpad/src/common/linux/language.cc deleted file mode 100644 index 5e6473a19f1e9354833f66ad1b5977cc35a2705f..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/language.cc +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// language.cc: Subclasses and singletons for google_breakpad::Language. -// See language.h for details. - -#include "common/linux/language.h" - -namespace google_breakpad { - -// C++ language-specific operations. -class CPPLanguage: public Language { - public: - string MakeQualifiedName(const string &parent_name, - const string &name) const { - if (parent_name.empty()) - return name; - else - return parent_name + "::" + name; - } -}; - -const CPPLanguage CPPLanguageSingleton; - -// Java language-specific operations. -class JavaLanguage: public Language { - public: - string MakeQualifiedName(const string &parent_name, - const string &name) const { - if (parent_name.empty()) - return name; - else - return parent_name + "." + name; - } -}; - -JavaLanguage JavaLanguageSingleton; - -// Assembler language-specific operations. -class AssemblerLanguage: public Language { - bool HasFunctions() const { return false; } - string MakeQualifiedName(const string &parent_name, - const string &name) const { - return name; - } -}; - -AssemblerLanguage AssemblerLanguageSingleton; - -const Language * const Language::CPlusPlus = &CPPLanguageSingleton; -const Language * const Language::Java = &JavaLanguageSingleton; -const Language * const Language::Assembler = &AssemblerLanguageSingleton; - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/language.h b/share/google-breakpad/src/common/linux/language.h deleted file mode 100644 index 03bdf7f0944439028820861f0363b1e36c45dbd3..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/language.h +++ /dev/null @@ -1,84 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// language.h: Define google_breakpad::Language. Instances of -// subclasses of this class provide language-appropriate operations -// for the Breakpad symbol dumper. - -#ifndef COMMON_LINUX_LANGUAGE_H__ -#define COMMON_LINUX_LANGUAGE_H__ - -#include - -namespace google_breakpad { - -using std::string; - -// An abstract base class for language-specific operations. We choose -// an instance of a subclass of this when we find the CU's language. -// This class's definitions are appropriate for CUs with no specified -// language. -class Language { - public: - // Return true if this language has functions to which we can assign - // line numbers. (Debugging info for assembly language, for example, - // can have source location information, but does not have functions - // recorded using DW_TAG_subprogram DIEs.) - virtual bool HasFunctions() const { return true; } - - // Construct a fully-qualified, language-appropriate form of NAME, - // given that PARENT_NAME is the name of the construct enclosing - // NAME. If PARENT_NAME is the empty string, then NAME is a - // top-level name. - // - // This API sort of assumes that a fully-qualified name is always - // some simple textual composition of the unqualified name and its - // parent's name, and that we don't need to know anything else about - // the parent or the child (say, their DIEs' tags) to do the job. - // This is true for the languages we support at the moment, and - // keeps things concrete. Perhaps a more refined operation would - // take into account the parent and child DIE types, allow languages - // to use their own data type for complex parent names, etc. But if - // C++ doesn't need all that, who would? - virtual string MakeQualifiedName (const string &parent_name, - const string &name) const = 0; - - // Instances for specific languages. - static const Language * const CPlusPlus, - * const Java, - * const Assembler; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_LANGUAGE_H__ diff --git a/share/google-breakpad/src/common/linux/linux_libc_support.h b/share/google-breakpad/src/common/linux/linux_libc_support.h deleted file mode 100644 index e08f27f71356c881bc4311845221010321cafb81..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/linux_libc_support.h +++ /dev/null @@ -1,178 +0,0 @@ -// Copyright (c) 2009, 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. - -// This header provides replacements for libc functions that we need. We if -// call the libc functions directly we risk crashing in the dynamic linker as -// it tries to resolve uncached PLT entries. - -#ifndef CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_ -#define CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_ - -#include -#include -#include - -extern "C" { - -static inline size_t -my_strlen(const char* s) { - size_t len = 0; - while (*s++) len++; - return len; -} - -static inline int -my_strcmp(const char* a, const char* b) { - for (;;) { - if (*a < *b) - return -1; - else if (*a > *b) - return 1; - else if (*a == 0) - return 0; - a++; - b++; - } -} - -static inline int -my_strncmp(const char* a, const char* b, size_t len) { - for (size_t i = 0; i < len; ++i) { - if (*a < *b) - return -1; - else if (*a > *b) - return 1; - else if (*a == 0) - return 0; - a++; - b++; - } - - return 0; -} - -// Parse a non-negative integer. -// result: (output) the resulting non-negative integer -// s: a NUL terminated string -// Return true iff successful. -static inline bool -my_strtoui(int* result, const char* s) { - if (*s == 0) - return false; - int r = 0; - for (;; s++) { - if (*s == 0) - break; - const int old_r = r; - r *= 10; - if (*s < '0' || *s > '9') - return false; - r += *s - '0'; - if (r < old_r) - return false; - } - - *result = r; - return true; -} - -// Return the length of the given, non-negative integer when expressed in base -// 10. -static inline unsigned -my_int_len(int i) { - if (!i) - return 1; - - int len = 0; - while (i) { - len++; - i /= 10; - } - - return len; -} - -// Convert a non-negative integer to a string -// output: (output) the resulting string is written here. This buffer must be -// large enough to hold the resulting string. Call |my_int_len| to get the -// required length. -// i: the non-negative integer to serialise. -// i_len: the length of the integer in base 10 (see |my_int_len|). -static inline void -my_itos(char* output, int i, unsigned i_len) { - for (unsigned index = i_len; index; --index, i /= 10) - output[index - 1] = '0' + (i % 10); -} - -static inline const char* -my_strchr(const char* haystack, char needle) { - while (*haystack && *haystack != needle) - haystack++; - if (*haystack == needle) - return haystack; - return (const char*) 0; -} - -// Read a hex value -// result: (output) the resulting value -// s: a string -// Returns a pointer to the first invalid charactor. -static inline const char* -my_read_hex_ptr(uintptr_t* result, const char* s) { - uintptr_t r = 0; - - for (;; ++s) { - if (*s >= '0' && *s <= '9') { - r <<= 4; - r += *s - '0'; - } else if (*s >= 'a' && *s <= 'f') { - r <<= 4; - r += (*s - 'a') + 10; - } else if (*s >= 'A' && *s <= 'F') { - r <<= 4; - r += (*s - 'A') + 10; - } else { - break; - } - } - - *result = r; - return s; -} - -static inline void -my_memset(void* ip, char c, size_t len) { - char* p = (char *) ip; - while (len--) - *p++ = c; -} - -} // extern "C" - -#endif // CLIENT_LINUX_LINUX_LIBC_SUPPORT_H_ diff --git a/share/google-breakpad/src/common/linux/linux_syscall_support.h b/share/google-breakpad/src/common/linux/linux_syscall_support.h deleted file mode 100644 index f95400dc169ca1cdfe6d75be9d43a08d10ee2da9..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/linux_syscall_support.h +++ /dev/null @@ -1,2800 +0,0 @@ -/* Copyright (c) 2005-2008, 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. - * - * --- - * Author: Markus Gutschke - */ - -/* This file includes Linux-specific support functions common to the - * coredumper and the thread lister; primarily, this is a collection - * of direct system calls, and a couple of symbols missing from - * standard header files. - * There are a few options that the including file can set to control - * the behavior of this file: - * - * SYS_CPLUSPLUS: - * The entire header file will normally be wrapped in 'extern "C" { }", - * making it suitable for compilation as both C and C++ source. If you - * do not want to do this, you can set the SYS_CPLUSPLUS macro to inhibit - * the wrapping. N.B. doing so will suppress inclusion of all prerequisite - * system header files, too. It is the caller's responsibility to provide - * the necessary definitions. - * - * SYS_ERRNO: - * All system calls will update "errno" unless overriden by setting the - * SYS_ERRNO macro prior to including this file. SYS_ERRNO should be - * an l-value. - * - * SYS_INLINE: - * New symbols will be defined "static inline", unless overridden by - * the SYS_INLINE macro. - * - * SYS_LINUX_SYSCALL_SUPPORT_H - * This macro is used to avoid multiple inclusions of this header file. - * If you need to include this file more than once, make sure to - * unset SYS_LINUX_SYSCALL_SUPPORT_H before each inclusion. - * - * SYS_PREFIX: - * New system calls will have a prefix of "sys_" unless overridden by - * the SYS_PREFIX macro. Valid values for this macro are [0..9] which - * results in prefixes "sys[0..9]_". It is also possible to set this - * macro to -1, which avoids all prefixes. - * - * This file defines a few internal symbols that all start with "LSS_". - * Do not access these symbols from outside this file. They are not part - * of the supported API. - */ -#ifndef SYS_LINUX_SYSCALL_SUPPORT_H -#define SYS_LINUX_SYSCALL_SUPPORT_H - -/* We currently only support x86-32, x86-64, ARM, MIPS, and PPC on Linux. - * Porting to other related platforms should not be difficult. - */ -#if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ - defined(__mips__) || defined(__PPC__)) && defined(__linux) - -#ifndef SYS_CPLUSPLUS -#ifdef __cplusplus -/* Some system header files in older versions of gcc neglect to properly - * handle being included from C++. As it appears to be harmless to have - * multiple nested 'extern "C"' blocks, just add another one here. - */ -extern "C" { -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef __mips__ -/* Include definitions of the ABI currently in use. */ -#include -#endif - -#endif - -/* As glibc often provides subtly incompatible data structures (and implicit - * wrapper functions that convert them), we provide our own kernel data - * structures for use by the system calls. - * These structures have been developed by using Linux 2.6.23 headers for - * reference. Note though, we do not care about exact API compatibility - * with the kernel, and in fact the kernel often does not have a single - * API that works across architectures. Instead, we try to mimic the glibc - * API where reasonable, and only guarantee ABI compatibility with the - * kernel headers. - * Most notably, here are a few changes that were made to the structures - * defined by kernel headers: - * - * - we only define structures, but not symbolic names for kernel data - * types. For the latter, we directly use the native C datatype - * (i.e. "unsigned" instead of "mode_t"). - * - in a few cases, it is possible to define identical structures for - * both 32bit (e.g. i386) and 64bit (e.g. x86-64) platforms by - * standardizing on the 64bit version of the data types. In particular, - * this means that we use "unsigned" where the 32bit headers say - * "unsigned long". - * - overall, we try to minimize the number of cases where we need to - * conditionally define different structures. - * - the "struct kernel_sigaction" class of structures have been - * modified to more closely mimic glibc's API by introducing an - * anonymous union for the function pointer. - * - a small number of field names had to have an underscore appended to - * them, because glibc defines a global macro by the same name. - */ - -/* include/linux/dirent.h */ -struct kernel_dirent64 { - unsigned long long d_ino; - long long d_off; - unsigned short d_reclen; - unsigned char d_type; - char d_name[256]; -}; - -/* include/linux/dirent.h */ -struct kernel_dirent { - long d_ino; - long d_off; - unsigned short d_reclen; - char d_name[256]; -}; - -/* include/linux/uio.h */ -struct kernel_iovec { - void *iov_base; - unsigned long iov_len; -}; - -/* include/linux/socket.h */ -struct kernel_msghdr { - void *msg_name; - int msg_namelen; - struct kernel_iovec*msg_iov; - unsigned long msg_iovlen; - void *msg_control; - unsigned long msg_controllen; - unsigned msg_flags; -}; - -/* include/asm-generic/poll.h */ -struct kernel_pollfd { - int fd; - short events; - short revents; -}; - -/* include/linux/resource.h */ -struct kernel_rlimit { - unsigned long rlim_cur; - unsigned long rlim_max; -}; - -/* include/linux/time.h */ -struct kernel_timespec { - long tv_sec; - long tv_nsec; -}; - -/* include/linux/time.h */ -struct kernel_timeval { - long tv_sec; - long tv_usec; -}; - -/* include/linux/resource.h */ -struct kernel_rusage { - struct kernel_timeval ru_utime; - struct kernel_timeval ru_stime; - long ru_maxrss; - long ru_ixrss; - long ru_idrss; - long ru_isrss; - long ru_minflt; - long ru_majflt; - long ru_nswap; - long ru_inblock; - long ru_oublock; - long ru_msgsnd; - long ru_msgrcv; - long ru_nsignals; - long ru_nvcsw; - long ru_nivcsw; -}; - -struct siginfo; -#if defined(__i386__) || defined(__ARM_ARCH_3__) || defined(__PPC__) - -/* include/asm-{arm,i386,mips,ppc}/signal.h */ -struct kernel_old_sigaction { - union { - void (*sa_handler_)(int); - void (*sa_sigaction_)(int, struct siginfo *, void *); - }; - unsigned long sa_mask; - unsigned long sa_flags; - void (*sa_restorer)(void); -} __attribute__((packed,aligned(4))); -#elif (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) - #define kernel_old_sigaction kernel_sigaction -#endif - -/* Some kernel functions (e.g. sigaction() in 2.6.23) require that the - * exactly match the size of the signal set, even though the API was - * intended to be extensible. We define our own KERNEL_NSIG to deal with - * this. - * Please note that glibc provides signals [1.._NSIG-1], whereas the - * kernel (and this header) provides the range [1..KERNEL_NSIG]. The - * actual number of signals is obviously the same, but the constants - * differ by one. - */ -#ifdef __mips__ -#define KERNEL_NSIG 128 -#else -#define KERNEL_NSIG 64 -#endif - -/* include/asm-{arm,i386,mips,x86_64}/signal.h */ -struct kernel_sigset_t { - unsigned long sig[(KERNEL_NSIG + 8*sizeof(unsigned long) - 1)/ - (8*sizeof(unsigned long))]; -}; - -/* include/asm-{arm,i386,mips,x86_64,ppc}/signal.h */ -struct kernel_sigaction { -#ifdef __mips__ - unsigned long sa_flags; - union { - void (*sa_handler_)(int); - void (*sa_sigaction_)(int, struct siginfo *, void *); - }; - struct kernel_sigset_t sa_mask; -#else - union { - void (*sa_handler_)(int); - void (*sa_sigaction_)(int, struct siginfo *, void *); - }; - unsigned long sa_flags; - void (*sa_restorer)(void); - struct kernel_sigset_t sa_mask; -#endif -}; - -/* include/linux/socket.h */ -struct kernel_sockaddr { - unsigned short sa_family; - char sa_data[14]; -}; - -/* include/asm-{arm,i386,mips,ppc}/stat.h */ -#ifdef __mips__ -#if _MIPS_SIM == _MIPS_SIM_ABI64 -struct kernel_stat { -#else -struct kernel_stat64 { -#endif - unsigned st_dev; - unsigned __pad0[3]; - unsigned long long st_ino; - unsigned st_mode; - unsigned st_nlink; - unsigned st_uid; - unsigned st_gid; - unsigned st_rdev; - unsigned __pad1[3]; - long long st_size; - unsigned st_atime_; - unsigned st_atime_nsec_; - unsigned st_mtime_; - unsigned st_mtime_nsec_; - unsigned st_ctime_; - unsigned st_ctime_nsec_; - unsigned st_blksize; - unsigned __pad2; - unsigned long long st_blocks; -}; -#elif defined __PPC__ -struct kernel_stat64 { - unsigned long long st_dev; - unsigned long long st_ino; - unsigned st_mode; - unsigned st_nlink; - unsigned st_uid; - unsigned st_gid; - unsigned long long st_rdev; - unsigned short int __pad2; - long long st_size; - long st_blksize; - long long st_blocks; - long st_atime_; - unsigned long st_atime_nsec_; - long st_mtime_; - unsigned long st_mtime_nsec_; - long st_ctime_; - unsigned long st_ctime_nsec_; - unsigned long __unused4; - unsigned long __unused5; -}; -#else -struct kernel_stat64 { - unsigned long long st_dev; - unsigned char __pad0[4]; - unsigned __st_ino; - unsigned st_mode; - unsigned st_nlink; - unsigned st_uid; - unsigned st_gid; - unsigned long long st_rdev; - unsigned char __pad3[4]; - long long st_size; - unsigned st_blksize; - unsigned long long st_blocks; - unsigned st_atime_; - unsigned st_atime_nsec_; - unsigned st_mtime_; - unsigned st_mtime_nsec_; - unsigned st_ctime_; - unsigned st_ctime_nsec_; - unsigned long long st_ino; -}; -#endif - -/* include/asm-{arm,i386,mips,x86_64,ppc}/stat.h */ -#if defined(__i386__) || defined(__ARM_ARCH_3__) -struct kernel_stat { - /* The kernel headers suggest that st_dev and st_rdev should be 32bit - * quantities encoding 12bit major and 20bit minor numbers in an interleaved - * format. In reality, we do not see useful data in the top bits. So, - * we'll leave the padding in here, until we find a better solution. - */ - unsigned short st_dev; - short pad1; - unsigned st_ino; - unsigned short st_mode; - unsigned short st_nlink; - unsigned short st_uid; - unsigned short st_gid; - unsigned short st_rdev; - short pad2; - unsigned st_size; - unsigned st_blksize; - unsigned st_blocks; - unsigned st_atime_; - unsigned st_atime_nsec_; - unsigned st_mtime_; - unsigned st_mtime_nsec_; - unsigned st_ctime_; - unsigned st_ctime_nsec_; - unsigned __unused4; - unsigned __unused5; -}; -#elif defined(__x86_64__) -struct kernel_stat { - unsigned long st_dev; - unsigned long st_ino; - unsigned long st_nlink; - unsigned st_mode; - unsigned st_uid; - unsigned st_gid; - unsigned __pad0; - unsigned long st_rdev; - long st_size; - long st_blksize; - long st_blocks; - unsigned long st_atime_; - unsigned long st_atime_nsec_; - unsigned long st_mtime_; - unsigned long st_mtime_nsec_; - unsigned long st_ctime_; - unsigned long st_ctime_nsec_; - long __unused[3]; -}; -#elif defined(__PPC__) -struct kernel_stat { - unsigned st_dev; - unsigned long st_ino; // ino_t - unsigned long st_mode; // mode_t - unsigned short st_nlink; // nlink_t - unsigned st_uid; // uid_t - unsigned st_gid; // gid_t - unsigned st_rdev; - long st_size; // off_t - unsigned long st_blksize; - unsigned long st_blocks; - unsigned long st_atime_; - unsigned long st_atime_nsec_; - unsigned long st_mtime_; - unsigned long st_mtime_nsec_; - unsigned long st_ctime_; - unsigned long st_ctime_nsec_; - unsigned long __unused4; - unsigned long __unused5; -}; -#elif (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) -struct kernel_stat { - unsigned st_dev; - int st_pad1[3]; - unsigned st_ino; - unsigned st_mode; - unsigned st_nlink; - unsigned st_uid; - unsigned st_gid; - unsigned st_rdev; - int st_pad2[2]; - long st_size; - int st_pad3; - long st_atime_; - long st_atime_nsec_; - long st_mtime_; - long st_mtime_nsec_; - long st_ctime_; - long st_ctime_nsec_; - int st_blksize; - int st_blocks; - int st_pad4[14]; -}; -#endif - -/* include/asm-{arm,i386,mips,x86_64,ppc}/statfs.h */ -#ifdef __mips__ -#if _MIPS_SIM != _MIPS_SIM_ABI64 -struct kernel_statfs64 { - unsigned long f_type; - unsigned long f_bsize; - unsigned long f_frsize; - unsigned long __pad; - unsigned long long f_blocks; - unsigned long long f_bfree; - unsigned long long f_files; - unsigned long long f_ffree; - unsigned long long f_bavail; - struct { int val[2]; } f_fsid; - unsigned long f_namelen; - unsigned long f_spare[6]; -}; -#endif -#elif !defined(__x86_64__) -struct kernel_statfs64 { - unsigned long f_type; - unsigned long f_bsize; - unsigned long long f_blocks; - unsigned long long f_bfree; - unsigned long long f_bavail; - unsigned long long f_files; - unsigned long long f_ffree; - struct { int val[2]; } f_fsid; - unsigned long f_namelen; - unsigned long f_frsize; - unsigned long f_spare[5]; -}; -#endif - -/* include/asm-{arm,i386,mips,x86_64,ppc,generic}/statfs.h */ -#ifdef __mips__ -struct kernel_statfs { - long f_type; - long f_bsize; - long f_frsize; - long f_blocks; - long f_bfree; - long f_files; - long f_ffree; - long f_bavail; - struct { int val[2]; } f_fsid; - long f_namelen; - long f_spare[6]; -}; -#else -struct kernel_statfs { - /* x86_64 actually defines all these fields as signed, whereas all other */ - /* platforms define them as unsigned. Leaving them at unsigned should not */ - /* cause any problems. */ - unsigned long f_type; - unsigned long f_bsize; - unsigned long f_blocks; - unsigned long f_bfree; - unsigned long f_bavail; - unsigned long f_files; - unsigned long f_ffree; - struct { int val[2]; } f_fsid; - unsigned long f_namelen; - unsigned long f_frsize; - unsigned long f_spare[5]; -}; -#endif - - -/* Definitions missing from the standard header files */ -#ifndef O_DIRECTORY -#if defined(__ARM_ARCH_3__) -#define O_DIRECTORY 0040000 -#else -#define O_DIRECTORY 0200000 -#endif -#endif -#ifndef NT_PRXFPREG -#define NT_PRXFPREG 0x46e62b7f -#endif -#ifndef PTRACE_GETFPXREGS -#define PTRACE_GETFPXREGS ((enum __ptrace_request)18) -#endif -#ifndef PR_GET_DUMPABLE -#define PR_GET_DUMPABLE 3 -#endif -#ifndef PR_SET_DUMPABLE -#define PR_SET_DUMPABLE 4 -#endif -#ifndef AT_FDCWD -#define AT_FDCWD (-100) -#endif -#ifndef AT_SYMLINK_NOFOLLOW -#define AT_SYMLINK_NOFOLLOW 0x100 -#endif -#ifndef AT_REMOVEDIR -#define AT_REMOVEDIR 0x200 -#endif -#ifndef MREMAP_FIXED -#define MREMAP_FIXED 2 -#endif -#ifndef SA_RESTORER -#define SA_RESTORER 0x04000000 -#endif - -#if defined(__i386__) -#ifndef __NR_setresuid -#define __NR_setresuid 164 -#define __NR_setresgid 170 -#endif -#ifndef __NR_rt_sigaction -#define __NR_rt_sigaction 174 -#define __NR_rt_sigprocmask 175 -#define __NR_rt_sigpending 176 -#define __NR_rt_sigsuspend 179 -#endif -#ifndef __NR_pread64 -#define __NR_pread64 180 -#endif -#ifndef __NR_pwrite64 -#define __NR_pwrite64 181 -#endif -#ifndef __NR_ugetrlimit -#define __NR_ugetrlimit 191 -#endif -#ifndef __NR_stat64 -#define __NR_stat64 195 -#endif -#ifndef __NR_fstat64 -#define __NR_fstat64 197 -#endif -#ifndef __NR_setresuid32 -#define __NR_setresuid32 208 -#define __NR_setresgid32 210 -#endif -#ifndef __NR_setfsuid32 -#define __NR_setfsuid32 215 -#define __NR_setfsgid32 216 -#endif -#ifndef __NR_getdents64 -#define __NR_getdents64 220 -#endif -#ifndef __NR_gettid -#define __NR_gettid 224 -#endif -#ifndef __NR_readahead -#define __NR_readahead 225 -#endif -#ifndef __NR_setxattr -#define __NR_setxattr 226 -#endif -#ifndef __NR_lsetxattr -#define __NR_lsetxattr 227 -#endif -#ifndef __NR_getxattr -#define __NR_getxattr 229 -#endif -#ifndef __NR_lgetxattr -#define __NR_lgetxattr 230 -#endif -#ifndef __NR_futex -#define __NR_futex 240 -#endif -#ifndef __NR_sched_setaffinity -#define __NR_sched_setaffinity 241 -#define __NR_sched_getaffinity 242 -#endif -#ifndef __NR_set_tid_address -#define __NR_set_tid_address 258 -#endif -#ifndef __NR_statfs64 -#define __NR_statfs64 268 -#endif -#ifndef __NR_fstatfs64 -#define __NR_fstatfs64 269 -#endif -#ifndef __NR_fadvise64_64 -#define __NR_fadvise64_64 272 -#endif -#ifndef __NR_openat -#define __NR_openat 295 -#endif -#ifndef __NR_fstatat64 -#define __NR_fstatat64 300 -#endif -#ifndef __NR_unlinkat -#define __NR_unlinkat 301 -#endif -#ifndef __NR_move_pages -#define __NR_move_pages 317 -#endif -/* End of i386 definitions */ -#elif defined(__ARM_ARCH_3__) -#ifndef __NR_setresuid -#define __NR_setresuid (__NR_SYSCALL_BASE + 164) -#define __NR_setresgid (__NR_SYSCALL_BASE + 170) -#endif -#ifndef __NR_rt_sigaction -#define __NR_rt_sigaction (__NR_SYSCALL_BASE + 174) -#define __NR_rt_sigprocmask (__NR_SYSCALL_BASE + 175) -#define __NR_rt_sigpending (__NR_SYSCALL_BASE + 176) -#define __NR_rt_sigsuspend (__NR_SYSCALL_BASE + 179) -#endif -#ifndef __NR_pread64 -#define __NR_pread64 (__NR_SYSCALL_BASE + 180) -#endif -#ifndef __NR_pwrite64 -#define __NR_pwrite64 (__NR_SYSCALL_BASE + 181) -#endif -#ifndef __NR_ugetrlimit -#define __NR_ugetrlimit (__NR_SYSCALL_BASE + 191) -#endif -#ifndef __NR_stat64 -#define __NR_stat64 (__NR_SYSCALL_BASE + 195) -#endif -#ifndef __NR_fstat64 -#define __NR_fstat64 (__NR_SYSCALL_BASE + 197) -#endif -#ifndef __NR_setresuid32 -#define __NR_setresuid32 (__NR_SYSCALL_BASE + 208) -#define __NR_setresgid32 (__NR_SYSCALL_BASE + 210) -#endif -#ifndef __NR_setfsuid32 -#define __NR_setfsuid32 (__NR_SYSCALL_BASE + 215) -#define __NR_setfsgid32 (__NR_SYSCALL_BASE + 216) -#endif -#ifndef __NR_getdents64 -#define __NR_getdents64 (__NR_SYSCALL_BASE + 217) -#endif -#ifndef __NR_gettid -#define __NR_gettid (__NR_SYSCALL_BASE + 224) -#endif -#ifndef __NR_readahead -#define __NR_readahead (__NR_SYSCALL_BASE + 225) -#endif -#ifndef __NR_setxattr -#define __NR_setxattr (__NR_SYSCALL_BASE + 226) -#endif -#ifndef __NR_lsetxattr -#define __NR_lsetxattr (__NR_SYSCALL_BASE + 227) -#endif -#ifndef __NR_getxattr -#define __NR_getxattr (__NR_SYSCALL_BASE + 229) -#endif -#ifndef __NR_lgetxattr -#define __NR_lgetxattr (__NR_SYSCALL_BASE + 230) -#endif -#ifndef __NR_futex -#define __NR_futex (__NR_SYSCALL_BASE + 240) -#endif -#ifndef __NR_sched_setaffinity -#define __NR_sched_setaffinity (__NR_SYSCALL_BASE + 241) -#define __NR_sched_getaffinity (__NR_SYSCALL_BASE + 242) -#endif -#ifndef __NR_set_tid_address -#define __NR_set_tid_address (__NR_SYSCALL_BASE + 256) -#endif -#ifndef __NR_statfs64 -#define __NR_statfs64 (__NR_SYSCALL_BASE + 266) -#endif -#ifndef __NR_fstatfs64 -#define __NR_fstatfs64 (__NR_SYSCALL_BASE + 267) -#endif -#ifndef __NR_move_pages -#define __NR_move_pages (__NR_SYSCALL_BASE + 344) -#endif -/* End of ARM 3 definitions */ -#elif defined(__x86_64__) -#ifndef __NR_setresuid -#define __NR_setresuid 117 -#define __NR_setresgid 119 -#endif -#ifndef __NR_gettid -#define __NR_gettid 186 -#endif -#ifndef __NR_readahead -#define __NR_readahead 187 -#endif -#ifndef __NR_setxattr -#define __NR_setxattr 188 -#endif -#ifndef __NR_lsetxattr -#define __NR_lsetxattr 189 -#endif -#ifndef __NR_getxattr -#define __NR_getxattr 191 -#endif -#ifndef __NR_lgetxattr -#define __NR_lgetxattr 192 -#endif -#ifndef __NR_futex -#define __NR_futex 202 -#endif -#ifndef __NR_sched_setaffinity -#define __NR_sched_setaffinity 203 -#define __NR_sched_getaffinity 204 -#endif -#ifndef __NR_getdents64 -#define __NR_getdents64 217 -#endif -#ifndef __NR_set_tid_address -#define __NR_set_tid_address 218 -#endif -#ifndef __NR_fadvise64 -#define __NR_fadvise64 221 -#endif -#ifndef __NR_openat -#define __NR_openat 257 -#endif -#ifndef __NR_newfstatat -#define __NR_newfstatat 262 -#endif -#ifndef __NR_unlinkat -#define __NR_unlinkat 263 -#endif -#ifndef __NR_move_pages -#define __NR_move_pages 279 -#endif -/* End of x86-64 definitions */ -#elif defined(__mips__) -#if _MIPS_SIM == _MIPS_SIM_ABI32 -#ifndef __NR_setresuid -#define __NR_setresuid (__NR_Linux + 185) -#define __NR_setresgid (__NR_Linux + 190) -#endif -#ifndef __NR_rt_sigaction -#define __NR_rt_sigaction (__NR_Linux + 194) -#define __NR_rt_sigprocmask (__NR_Linux + 195) -#define __NR_rt_sigpending (__NR_Linux + 196) -#define __NR_rt_sigsuspend (__NR_Linux + 199) -#endif -#ifndef __NR_pread64 -#define __NR_pread64 (__NR_Linux + 200) -#endif -#ifndef __NR_pwrite64 -#define __NR_pwrite64 (__NR_Linux + 201) -#endif -#ifndef __NR_stat64 -#define __NR_stat64 (__NR_Linux + 213) -#endif -#ifndef __NR_fstat64 -#define __NR_fstat64 (__NR_Linux + 215) -#endif -#ifndef __NR_getdents64 -#define __NR_getdents64 (__NR_Linux + 219) -#endif -#ifndef __NR_gettid -#define __NR_gettid (__NR_Linux + 222) -#endif -#ifndef __NR_readahead -#define __NR_readahead (__NR_Linux + 223) -#endif -#ifndef __NR_setxattr -#define __NR_setxattr (__NR_Linux + 224) -#endif -#ifndef __NR_lsetxattr -#define __NR_lsetxattr (__NR_Linux + 225) -#endif -#ifndef __NR_getxattr -#define __NR_getxattr (__NR_Linux + 227) -#endif -#ifndef __NR_lgetxattr -#define __NR_lgetxattr (__NR_Linux + 228) -#endif -#ifndef __NR_futex -#define __NR_futex (__NR_Linux + 238) -#endif -#ifndef __NR_sched_setaffinity -#define __NR_sched_setaffinity (__NR_Linux + 239) -#define __NR_sched_getaffinity (__NR_Linux + 240) -#endif -#ifndef __NR_set_tid_address -#define __NR_set_tid_address (__NR_Linux + 252) -#endif -#ifndef __NR_statfs64 -#define __NR_statfs64 (__NR_Linux + 255) -#endif -#ifndef __NR_fstatfs64 -#define __NR_fstatfs64 (__NR_Linux + 256) -#endif -#ifndef __NR_openat -#define __NR_openat (__NR_Linux + 288) -#endif -#ifndef __NR_fstatat -#define __NR_fstatat (__NR_Linux + 293) -#endif -#ifndef __NR_unlinkat -#define __NR_unlinkat (__NR_Linux + 294) -#endif -#ifndef __NR_move_pages -#define __NR_move_pages (__NR_Linux + 308) -#endif -/* End of MIPS (old 32bit API) definitions */ -#elif _MIPS_SIM == _MIPS_SIM_ABI64 -#ifndef __NR_setresuid -#define __NR_setresuid (__NR_Linux + 115) -#define __NR_setresgid (__NR_Linux + 117) -#endif -#ifndef __NR_gettid -#define __NR_gettid (__NR_Linux + 178) -#endif -#ifndef __NR_readahead -#define __NR_readahead (__NR_Linux + 179) -#endif -#ifndef __NR_setxattr -#define __NR_setxattr (__NR_Linux + 180) -#endif -#ifndef __NR_lsetxattr -#define __NR_lsetxattr (__NR_Linux + 181) -#endif -#ifndef __NR_getxattr -#define __NR_getxattr (__NR_Linux + 183) -#endif -#ifndef __NR_lgetxattr -#define __NR_lgetxattr (__NR_Linux + 184) -#endif -#ifndef __NR_futex -#define __NR_futex (__NR_Linux + 194) -#endif -#ifndef __NR_sched_setaffinity -#define __NR_sched_setaffinity (__NR_Linux + 195) -#define __NR_sched_getaffinity (__NR_Linux + 196) -#endif -#ifndef __NR_set_tid_address -#define __NR_set_tid_address (__NR_Linux + 212) -#endif -#ifndef __NR_openat -#define __NR_openat (__NR_Linux + 247) -#endif -#ifndef __NR_fstatat -#define __NR_fstatat (__NR_Linux + 252) -#endif -#ifndef __NR_unlinkat -#define __NR_unlinkat (__NR_Linux + 253) -#endif -#ifndef __NR_move_pages -#define __NR_move_pages (__NR_Linux + 267) -#endif -/* End of MIPS (64bit API) definitions */ -#else -#ifndef __NR_setresuid -#define __NR_setresuid (__NR_Linux + 115) -#define __NR_setresgid (__NR_Linux + 117) -#endif -#ifndef __NR_gettid -#define __NR_gettid (__NR_Linux + 178) -#endif -#ifndef __NR_readahead -#define __NR_readahead (__NR_Linux + 179) -#endif -#ifndef __NR_setxattr -#define __NR_setxattr (__NR_Linux + 180) -#endif -#ifndef __NR_lsetxattr -#define __NR_lsetxattr (__NR_Linux + 181) -#endif -#ifndef __NR_getxattr -#define __NR_getxattr (__NR_Linux + 183) -#endif -#ifndef __NR_lgetxattr -#define __NR_lgetxattr (__NR_Linux + 184) -#endif -#ifndef __NR_futex -#define __NR_futex (__NR_Linux + 194) -#endif -#ifndef __NR_sched_setaffinity -#define __NR_sched_setaffinity (__NR_Linux + 195) -#define __NR_sched_getaffinity (__NR_Linux + 196) -#endif -#ifndef __NR_set_tid_address -#define __NR_set_tid_address (__NR_Linux + 213) -#endif -#ifndef __NR_statfs64 -#define __NR_statfs64 (__NR_Linux + 217) -#endif -#ifndef __NR_fstatfs64 -#define __NR_fstatfs64 (__NR_Linux + 218) -#endif -#ifndef __NR_openat -#define __NR_openat (__NR_Linux + 251) -#endif -#ifndef __NR_fstatat -#define __NR_fstatat (__NR_Linux + 256) -#endif -#ifndef __NR_unlinkat -#define __NR_unlinkat (__NR_Linux + 257) -#endif -#ifndef __NR_move_pages -#define __NR_move_pages (__NR_Linux + 271) -#endif -/* End of MIPS (new 32bit API) definitions */ -#endif -/* End of MIPS definitions */ -#elif defined(__PPC__) -#ifndef __NR_setfsuid -#define __NR_setfsuid 138 -#define __NR_setfsgid 139 -#endif -#ifndef __NR_setresuid -#define __NR_setresuid 164 -#define __NR_setresgid 169 -#endif -#ifndef __NR_rt_sigaction -#define __NR_rt_sigaction 173 -#define __NR_rt_sigprocmask 174 -#define __NR_rt_sigpending 175 -#define __NR_rt_sigsuspend 178 -#endif -#ifndef __NR_pread64 -#define __NR_pread64 179 -#endif -#ifndef __NR_pwrite64 -#define __NR_pwrite64 180 -#endif -#ifndef __NR_ugetrlimit -#define __NR_ugetrlimit 190 -#endif -#ifndef __NR_readahead -#define __NR_readahead 191 -#endif -#ifndef __NR_stat64 -#define __NR_stat64 195 -#endif -#ifndef __NR_fstat64 -#define __NR_fstat64 197 -#endif -#ifndef __NR_getdents64 -#define __NR_getdents64 202 -#endif -#ifndef __NR_gettid -#define __NR_gettid 207 -#endif -#ifndef __NR_setxattr -#define __NR_setxattr 209 -#endif -#ifndef __NR_lsetxattr -#define __NR_lsetxattr 210 -#endif -#ifndef __NR_getxattr -#define __NR_getxattr 212 -#endif -#ifndef __NR_lgetxattr -#define __NR_lgetxattr 213 -#endif -#ifndef __NR_futex -#define __NR_futex 221 -#endif -#ifndef __NR_sched_setaffinity -#define __NR_sched_setaffinity 222 -#define __NR_sched_getaffinity 223 -#endif -#ifndef __NR_set_tid_address -#define __NR_set_tid_address 232 -#endif -#ifndef __NR_statfs64 -#define __NR_statfs64 252 -#endif -#ifndef __NR_fstatfs64 -#define __NR_fstatfs64 253 -#endif -#ifndef __NR_fadvise64_64 -#define __NR_fadvise64_64 254 -#endif -#ifndef __NR_openat -#define __NR_openat 286 -#endif -#ifndef __NR_fstatat64 -#define __NR_fstatat64 291 -#endif -#ifndef __NR_unlinkat -#define __NR_unlinkat 292 -#endif -#ifndef __NR_move_pages -#define __NR_move_pages 301 -#endif -/* End of powerpc defininitions */ -#endif - - -/* After forking, we must make sure to only call system calls. */ -#if __BOUNDED_POINTERS__ - #error "Need to port invocations of syscalls for bounded ptrs" -#else - /* The core dumper and the thread lister get executed after threads - * have been suspended. As a consequence, we cannot call any functions - * that acquire locks. Unfortunately, libc wraps most system calls - * (e.g. in order to implement pthread_atfork, and to make calls - * cancellable), which means we cannot call these functions. Instead, - * we have to call syscall() directly. - */ - #undef LSS_ERRNO - #ifdef SYS_ERRNO - /* Allow the including file to override the location of errno. This can - * be useful when using clone() with the CLONE_VM option. - */ - #define LSS_ERRNO SYS_ERRNO - #else - #define LSS_ERRNO errno - #endif - - #undef LSS_INLINE - #ifdef SYS_INLINE - #define LSS_INLINE SYS_INLINE - #else - #define LSS_INLINE static inline - #endif - - /* Allow the including file to override the prefix used for all new - * system calls. By default, it will be set to "sys_". - */ - #undef LSS_NAME - #ifndef SYS_PREFIX - #define LSS_NAME(name) sys_##name - #elif SYS_PREFIX < 0 - #define LSS_NAME(name) name - #elif SYS_PREFIX == 0 - #define LSS_NAME(name) sys0_##name - #elif SYS_PREFIX == 1 - #define LSS_NAME(name) sys1_##name - #elif SYS_PREFIX == 2 - #define LSS_NAME(name) sys2_##name - #elif SYS_PREFIX == 3 - #define LSS_NAME(name) sys3_##name - #elif SYS_PREFIX == 4 - #define LSS_NAME(name) sys4_##name - #elif SYS_PREFIX == 5 - #define LSS_NAME(name) sys5_##name - #elif SYS_PREFIX == 6 - #define LSS_NAME(name) sys6_##name - #elif SYS_PREFIX == 7 - #define LSS_NAME(name) sys7_##name - #elif SYS_PREFIX == 8 - #define LSS_NAME(name) sys8_##name - #elif SYS_PREFIX == 9 - #define LSS_NAME(name) sys9_##name - #endif - - #undef LSS_RETURN - #if (defined(__i386__) || defined(__x86_64__) || defined(__ARM_ARCH_3__)) - /* Failing system calls return a negative result in the range of - * -1..-4095. These are "errno" values with the sign inverted. - */ - #define LSS_RETURN(type, res) \ - do { \ - if ((unsigned long)(res) >= (unsigned long)(-4095)) { \ - LSS_ERRNO = -(res); \ - res = -1; \ - } \ - return (type) (res); \ - } while (0) - #elif defined(__mips__) - /* On MIPS, failing system calls return -1, and set errno in a - * separate CPU register. - */ - #define LSS_RETURN(type, res, err) \ - do { \ - if (err) { \ - LSS_ERRNO = (res); \ - res = -1; \ - } \ - return (type) (res); \ - } while (0) - #elif defined(__PPC__) - /* On PPC, failing system calls return -1, and set errno in a - * separate CPU register. See linux/unistd.h. - */ - #define LSS_RETURN(type, res, err) \ - do { \ - if (err & 0x10000000 ) { \ - LSS_ERRNO = (res); \ - res = -1; \ - } \ - return (type) (res); \ - } while (0) - #endif - #if defined(__i386__) - /* In PIC mode (e.g. when building shared libraries), gcc for i386 - * reserves ebx. Unfortunately, most distribution ship with implementations - * of _syscallX() which clobber ebx. - * Also, most definitions of _syscallX() neglect to mark "memory" as being - * clobbered. This causes problems with compilers, that do a better job - * at optimizing across __asm__ calls. - * So, we just have to redefine all of the _syscallX() macros. - */ - #undef LSS_BODY - #define LSS_BODY(type,args...) \ - long __res; \ - __asm__ __volatile__("push %%ebx\n" \ - "movl %2,%%ebx\n" \ - "int $0x80\n" \ - "pop %%ebx" \ - args \ - : "memory"); \ - LSS_RETURN(type,__res) - #undef _syscall0 - #define _syscall0(type,name) \ - type LSS_NAME(name)(void) { \ - long __res; \ - __asm__ volatile("int $0x80" \ - : "=a" (__res) \ - : "0" (__NR_##name) \ - : "memory"); \ - LSS_RETURN(type,__res); \ - } - #undef _syscall1 - #define _syscall1(type,name,type1,arg1) \ - type LSS_NAME(name)(type1 arg1) { \ - LSS_BODY(type, \ - : "=a" (__res) \ - : "0" (__NR_##name), "ri" ((long)(arg1))); \ - } - #undef _syscall2 - #define _syscall2(type,name,type1,arg1,type2,arg2) \ - type LSS_NAME(name)(type1 arg1,type2 arg2) { \ - LSS_BODY(type, \ - : "=a" (__res) \ - : "0" (__NR_##name),"ri" ((long)(arg1)), "c" ((long)(arg2))); \ - } - #undef _syscall3 - #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ - type LSS_NAME(name)(type1 arg1,type2 arg2,type3 arg3) { \ - LSS_BODY(type, \ - : "=a" (__res) \ - : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)), \ - "d" ((long)(arg3))); \ - } - #undef _syscall4 - #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ - LSS_BODY(type, \ - : "=a" (__res) \ - : "0" (__NR_##name), "ri" ((long)(arg1)), "c" ((long)(arg2)), \ - "d" ((long)(arg3)),"S" ((long)(arg4))); \ - } - #undef _syscall5 - #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5) { \ - long __res; \ - __asm__ __volatile__("push %%ebx\n" \ - "movl %2,%%ebx\n" \ - "movl %1,%%eax\n" \ - "int $0x80\n" \ - "pop %%ebx" \ - : "=a" (__res) \ - : "i" (__NR_##name), "ri" ((long)(arg1)), \ - "c" ((long)(arg2)), "d" ((long)(arg3)), \ - "S" ((long)(arg4)), "D" ((long)(arg5)) \ - : "memory"); \ - LSS_RETURN(type,__res); \ - } - #undef _syscall6 - #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5,type6,arg6) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5, type6 arg6) { \ - long __res; \ - struct { long __a1; long __a6; } __s = { (long)arg1, (long) arg6 }; \ - __asm__ __volatile__("push %%ebp\n" \ - "push %%ebx\n" \ - "movl 4(%2),%%ebp\n" \ - "movl 0(%2), %%ebx\n" \ - "movl %1,%%eax\n" \ - "int $0x80\n" \ - "pop %%ebx\n" \ - "pop %%ebp" \ - : "=a" (__res) \ - : "i" (__NR_##name), "0" ((long)(&__s)), \ - "c" ((long)(arg2)), "d" ((long)(arg3)), \ - "S" ((long)(arg4)), "D" ((long)(arg5)) \ - : "memory"); \ - LSS_RETURN(type,__res); \ - } - LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, - int flags, void *arg, int *parent_tidptr, - void *newtls, int *child_tidptr) { - long __res; - __asm__ __volatile__(/* if (fn == NULL) - * return -EINVAL; - */ - "movl %3,%%ecx\n" - "jecxz 1f\n" - - /* if (child_stack == NULL) - * return -EINVAL; - */ - "movl %4,%%ecx\n" - "jecxz 1f\n" - - /* Set up alignment of the child stack: - * child_stack = (child_stack & ~0xF) - 20; - */ - "andl $-16,%%ecx\n" - "subl $20,%%ecx\n" - - /* Push "arg" and "fn" onto the stack that will be - * used by the child. - */ - "movl %6,%%eax\n" - "movl %%eax,4(%%ecx)\n" - "movl %3,%%eax\n" - "movl %%eax,(%%ecx)\n" - - /* %eax = syscall(%eax = __NR_clone, - * %ebx = flags, - * %ecx = child_stack, - * %edx = parent_tidptr, - * %esi = newtls, - * %edi = child_tidptr) - * Also, make sure that %ebx gets preserved as it is - * used in PIC mode. - */ - "movl %8,%%esi\n" - "movl %7,%%edx\n" - "movl %5,%%eax\n" - "movl %9,%%edi\n" - "pushl %%ebx\n" - "movl %%eax,%%ebx\n" - "movl %2,%%eax\n" - "int $0x80\n" - - /* In the parent: restore %ebx - * In the child: move "fn" into %ebx - */ - "popl %%ebx\n" - - /* if (%eax != 0) - * return %eax; - */ - "test %%eax,%%eax\n" - "jnz 1f\n" - - /* In the child, now. Terminate frame pointer chain. - */ - "movl $0,%%ebp\n" - - /* Call "fn". "arg" is already on the stack. - */ - "call *%%ebx\n" - - /* Call _exit(%ebx). Unfortunately older versions - * of gcc restrict the number of arguments that can - * be passed to asm(). So, we need to hard-code the - * system call number. - */ - "movl %%eax,%%ebx\n" - "movl $1,%%eax\n" - "int $0x80\n" - - /* Return to parent. - */ - "1:\n" - : "=a" (__res) - : "0"(-EINVAL), "i"(__NR_clone), - "m"(fn), "m"(child_stack), "m"(flags), "m"(arg), - "m"(parent_tidptr), "m"(newtls), "m"(child_tidptr) - : "memory", "ecx", "edx", "esi", "edi"); - LSS_RETURN(int, __res); - } - - #define __NR__fadvise64_64 __NR_fadvise64_64 - LSS_INLINE _syscall6(int, _fadvise64_64, int, fd, - unsigned, offset_lo, unsigned, offset_hi, - unsigned, len_lo, unsigned, len_hi, - int, advice) - - LSS_INLINE int LSS_NAME(fadvise64)(int fd, loff_t offset, - loff_t len, int advice) { - return LSS_NAME(_fadvise64_64)(fd, - (unsigned)offset, (unsigned)(offset >>32), - (unsigned)len, (unsigned)(len >> 32), - advice); - } - - LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) { - /* On i386, the kernel does not know how to return from a signal - * handler. Instead, it relies on user space to provide a - * restorer function that calls the {rt_,}sigreturn() system call. - * Unfortunately, we cannot just reference the glibc version of this - * function, as glibc goes out of its way to make it inaccessible. - */ - void (*res)(void); - __asm__ __volatile__("call 2f\n" - "0:.align 16\n" - "1:movl %1,%%eax\n" - "int $0x80\n" - "2:popl %0\n" - "addl $(1b-0b),%0\n" - : "=a" (res) - : "i" (__NR_rt_sigreturn)); - return res; - } - LSS_INLINE void (*LSS_NAME(restore)(void))(void) { - /* On i386, the kernel does not know how to return from a signal - * handler. Instead, it relies on user space to provide a - * restorer function that calls the {rt_,}sigreturn() system call. - * Unfortunately, we cannot just reference the glibc version of this - * function, as glibc goes out of its way to make it inaccessible. - */ - void (*res)(void); - __asm__ __volatile__("call 2f\n" - "0:.align 16\n" - "1:pop %%eax\n" - "movl %1,%%eax\n" - "int $0x80\n" - "2:popl %0\n" - "addl $(1b-0b),%0\n" - : "=a" (res) - : "i" (__NR_sigreturn)); - return res; - } - #elif defined(__x86_64__) - /* There are no known problems with any of the _syscallX() macros - * currently shipping for x86_64, but we still need to be able to define - * our own version so that we can override the location of the errno - * location (e.g. when using the clone() system call with the CLONE_VM - * option). - */ - #undef LSS_BODY - #define LSS_BODY(type,name, ...) \ - long __res; \ - __asm__ __volatile__("syscall" : "=a" (__res) : "0" (__NR_##name), \ - ##__VA_ARGS__ : "r11", "rcx", "memory"); \ - LSS_RETURN(type, __res) - #undef _syscall0 - #define _syscall0(type,name) \ - type LSS_NAME(name)() { \ - LSS_BODY(type, name); \ - } - #undef _syscall1 - #define _syscall1(type,name,type1,arg1) \ - type LSS_NAME(name)(type1 arg1) { \ - LSS_BODY(type, name, "D" ((long)(arg1))); \ - } - #undef _syscall2 - #define _syscall2(type,name,type1,arg1,type2,arg2) \ - type LSS_NAME(name)(type1 arg1, type2 arg2) { \ - LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2))); \ - } - #undef _syscall3 - #define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ - LSS_BODY(type, name, "D" ((long)(arg1)), "S" ((long)(arg2)), \ - "d" ((long)(arg3))); \ - } - #undef _syscall4 - #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ - long __res; \ - __asm__ __volatile__("movq %5,%%r10; syscall" : \ - "=a" (__res) : "0" (__NR_##name), \ - "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)), \ - "g" ((long)(arg4)) : "r10", "r11", "rcx", "memory"); \ - LSS_RETURN(type, __res); \ - } - #undef _syscall5 - #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5) { \ - long __res; \ - __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8; syscall" : \ - "=a" (__res) : "0" (__NR_##name), \ - "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)), \ - "g" ((long)(arg4)), "g" ((long)(arg5)) : \ - "r8", "r10", "r11", "rcx", "memory"); \ - LSS_RETURN(type, __res); \ - } - #undef _syscall6 - #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5,type6,arg6) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5, type6 arg6) { \ - long __res; \ - __asm__ __volatile__("movq %5,%%r10; movq %6,%%r8; movq %7,%%r9;" \ - "syscall" : \ - "=a" (__res) : "0" (__NR_##name), \ - "D" ((long)(arg1)), "S" ((long)(arg2)), "d" ((long)(arg3)), \ - "g" ((long)(arg4)), "g" ((long)(arg5)), "g" ((long)(arg6)) : \ - "r8", "r9", "r10", "r11", "rcx", "memory"); \ - LSS_RETURN(type, __res); \ - } - LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, - int flags, void *arg, int *parent_tidptr, - void *newtls, int *child_tidptr) { - long __res; - { - register void *__tls __asm__("r8") = newtls; - register int *__ctid __asm__("r10") = child_tidptr; - __asm__ __volatile__(/* if (fn == NULL) - * return -EINVAL; - */ - "testq %4,%4\n" - "jz 1f\n" - - /* if (child_stack == NULL) - * return -EINVAL; - */ - "testq %5,%5\n" - "jz 1f\n" - - /* childstack -= 2*sizeof(void *); - */ - "subq $16,%5\n" - - /* Push "arg" and "fn" onto the stack that will be - * used by the child. - */ - "movq %7,8(%5)\n" - "movq %4,0(%5)\n" - - /* %rax = syscall(%rax = __NR_clone, - * %rdi = flags, - * %rsi = child_stack, - * %rdx = parent_tidptr, - * %r8 = new_tls, - * %r10 = child_tidptr) - */ - "movq %2,%%rax\n" - "syscall\n" - - /* if (%rax != 0) - * return; - */ - "testq %%rax,%%rax\n" - "jnz 1f\n" - - /* In the child. Terminate frame pointer chain. - */ - "xorq %%rbp,%%rbp\n" - - /* Call "fn(arg)". - */ - "popq %%rax\n" - "popq %%rdi\n" - "call *%%rax\n" - - /* Call _exit(%ebx). - */ - "movq %%rax,%%rdi\n" - "movq %3,%%rax\n" - "syscall\n" - - /* Return to parent. - */ - "1:\n" - : "=a" (__res) - : "0"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit), - "r"(fn), "S"(child_stack), "D"(flags), "r"(arg), - "d"(parent_tidptr), "r"(__tls), "r"(__ctid) - : "memory", "r11", "rcx"); - } - LSS_RETURN(int, __res); - } - LSS_INLINE _syscall4(int, fadvise64, int, fd, loff_t, offset, loff_t, len, - int, advice) - - LSS_INLINE void (*LSS_NAME(restore_rt)(void))(void) { - /* On x86-64, the kernel does not know how to return from - * a signal handler. Instead, it relies on user space to provide a - * restorer function that calls the rt_sigreturn() system call. - * Unfortunately, we cannot just reference the glibc version of this - * function, as glibc goes out of its way to make it inaccessible. - */ - void (*res)(void); - __asm__ __volatile__("call 2f\n" - "0:.align 16\n" - "1:movq %1,%%rax\n" - "syscall\n" - "2:popq %0\n" - "addq $(1b-0b),%0\n" - : "=a" (res) - : "i" (__NR_rt_sigreturn)); - return res; - } - #elif defined(__ARM_ARCH_3__) - /* Most definitions of _syscallX() neglect to mark "memory" as being - * clobbered. This causes problems with compilers, that do a better job - * at optimizing across __asm__ calls. - * So, we just have to redefine all fo the _syscallX() macros. - */ - #undef LSS_REG - #define LSS_REG(r,a) register long __r##r __asm__("r"#r) = (long)a - #undef LSS_BODY - #define LSS_BODY(type,name,args...) \ - register long __res_r0 __asm__("r0"); \ - long __res; \ - __asm__ __volatile__ (__syscall(name) \ - : "=r"(__res_r0) : args : "lr", "memory"); \ - __res = __res_r0; \ - LSS_RETURN(type, __res) - #undef _syscall0 - #define _syscall0(type, name) \ - type LSS_NAME(name)() { \ - LSS_BODY(type, name); \ - } - #undef _syscall1 - #define _syscall1(type, name, type1, arg1) \ - type LSS_NAME(name)(type1 arg1) { \ - LSS_REG(0, arg1); LSS_BODY(type, name, "r"(__r0)); \ - } - #undef _syscall2 - #define _syscall2(type, name, type1, arg1, type2, arg2) \ - type LSS_NAME(name)(type1 arg1, type2 arg2) { \ - LSS_REG(0, arg1); LSS_REG(1, arg2); \ - LSS_BODY(type, name, "r"(__r0), "r"(__r1)); \ - } - #undef _syscall3 - #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ - LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ - LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2)); \ - } - #undef _syscall4 - #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ - LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ - LSS_REG(3, arg4); \ - LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3)); \ - } - #undef _syscall5 - #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5) { \ - LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ - LSS_REG(3, arg4); LSS_REG(4, arg5); \ - LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ - "r"(__r4)); \ - } - #undef _syscall6 - #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5,type6,arg6) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5, type6 arg6) { \ - LSS_REG(0, arg1); LSS_REG(1, arg2); LSS_REG(2, arg3); \ - LSS_REG(3, arg4); LSS_REG(4, arg5); LSS_REG(5, arg6); \ - LSS_BODY(type, name, "r"(__r0), "r"(__r1), "r"(__r2), "r"(__r3), \ - "r"(__r4), "r"(__r5)); \ - } - LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, - int flags, void *arg, int *parent_tidptr, - void *newtls, int *child_tidptr) { - long __res; - { - register int __flags __asm__("r0") = flags; - register void *__stack __asm__("r1") = child_stack; - register void *__ptid __asm__("r2") = parent_tidptr; - register void *__tls __asm__("r3") = newtls; - register int *__ctid __asm__("r4") = child_tidptr; - __asm__ __volatile__(/* if (fn == NULL || child_stack == NULL) - * return -EINVAL; - */ - "cmp %2,#0\n" - "cmpne %3,#0\n" - "moveq %0,%1\n" - "beq 1f\n" - - /* Push "arg" and "fn" onto the stack that will be - * used by the child. - */ - "str %5,[%3,#-4]!\n" - "str %2,[%3,#-4]!\n" - - /* %r0 = syscall(%r0 = flags, - * %r1 = child_stack, - * %r2 = parent_tidptr, - * %r3 = newtls, - * %r4 = child_tidptr) - */ - __syscall(clone)"\n" - - /* if (%r0 != 0) - * return %r0; - */ - "movs %0,r0\n" - "bne 1f\n" - - /* In the child, now. Call "fn(arg)". - */ - "ldr r0,[sp, #4]\n" - "mov lr,pc\n" - "ldr pc,[sp]\n" - - /* Call _exit(%r0). - */ - __syscall(exit)"\n" - "1:\n" - : "=r" (__res) - : "i"(-EINVAL), - "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), - "r"(__ptid), "r"(__tls), "r"(__ctid) - : "lr", "memory"); - } - LSS_RETURN(int, __res); - } - #elif defined(__mips__) - #undef LSS_REG - #define LSS_REG(r,a) register unsigned long __r##r __asm__("$"#r) = \ - (unsigned long)(a) - #undef LSS_BODY - #define LSS_BODY(type,name,r7,...) \ - register unsigned long __v0 __asm__("$2") = __NR_##name; \ - __asm__ __volatile__ ("syscall\n" \ - : "=&r"(__v0), r7 (__r7) \ - : "0"(__v0), ##__VA_ARGS__ \ - : "$8", "$9", "$10", "$11", "$12", \ - "$13", "$14", "$15", "$24", "memory"); \ - LSS_RETURN(type, __v0, __r7) - #undef _syscall0 - #define _syscall0(type, name) \ - type LSS_NAME(name)() { \ - register unsigned long __r7 __asm__("$7"); \ - LSS_BODY(type, name, "=r"); \ - } - #undef _syscall1 - #define _syscall1(type, name, type1, arg1) \ - type LSS_NAME(name)(type1 arg1) { \ - register unsigned long __r7 __asm__("$7"); \ - LSS_REG(4, arg1); LSS_BODY(type, name, "=r", "r"(__r4)); \ - } - #undef _syscall2 - #define _syscall2(type, name, type1, arg1, type2, arg2) \ - type LSS_NAME(name)(type1 arg1, type2 arg2) { \ - register unsigned long __r7 __asm__("$7"); \ - LSS_REG(4, arg1); LSS_REG(5, arg2); \ - LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5)); \ - } - #undef _syscall3 - #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ - register unsigned long __r7 __asm__("$7"); \ - LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ - LSS_BODY(type, name, "=r", "r"(__r4), "r"(__r5), "r"(__r6)); \ - } - #undef _syscall4 - #define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ - LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ - LSS_REG(7, arg4); \ - LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6)); \ - } - #undef _syscall5 - #if _MIPS_SIM == _MIPS_SIM_ABI32 - /* The old 32bit MIPS system call API passes the fifth and sixth argument - * on the stack, whereas the new APIs use registers "r8" and "r9". - */ - #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5) { \ - LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ - LSS_REG(7, arg4); \ - register unsigned long __v0 __asm__("$2"); \ - __asm__ __volatile__ (".set noreorder\n" \ - "lw $2, %6\n" \ - "subu $29, 32\n" \ - "sw $2, 16($29)\n" \ - "li $2, %2\n" \ - "syscall\n" \ - "addiu $29, 32\n" \ - ".set reorder\n" \ - : "=&r"(__v0), "+r" (__r7) \ - : "i" (__NR_##name), "r"(__r4), "r"(__r5), \ - "r"(__r6), "m" ((unsigned long)arg5) \ - : "$8", "$9", "$10", "$11", "$12", \ - "$13", "$14", "$15", "$24", "memory"); \ - LSS_RETURN(type, __v0, __r7); \ - } - #else - #define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5) { \ - LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ - LSS_REG(7, arg4); LSS_REG(8, arg5); \ - LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6), \ - "r"(__r8)); \ - } - #endif - #undef _syscall6 - #if _MIPS_SIM == _MIPS_SIM_ABI32 - /* The old 32bit MIPS system call API passes the fifth and sixth argument - * on the stack, whereas the new APIs use registers "r8" and "r9". - */ - #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5,type6,arg6) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5, type6 arg6) { \ - LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ - LSS_REG(7, arg4); \ - register unsigned long __v0 __asm__("$2"); \ - __asm__ __volatile__ (".set noreorder\n" \ - "lw $2, %6\n" \ - "lw $8, %7\n" \ - "subu $29, 32\n" \ - "sw $2, 16($29)\n" \ - "sw $8, 20($29)\n" \ - "li $2, %2\n" \ - "syscall\n" \ - "addiu $29, 32\n" \ - ".set reorder\n" \ - : "=&r"(__v0), "+r" (__r7) \ - : "i" (__NR_##name), "r"(__r4), "r"(__r5), \ - "r"(__r6), "r" ((unsigned long)arg5), \ - "r" ((unsigned long)arg6) \ - : "$8", "$9", "$10", "$11", "$12", \ - "$13", "$14", "$15", "$24", "memory"); \ - LSS_RETURN(type, __v0, __r7); \ - } - #else - #define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \ - type5,arg5,type6,arg6) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5,type6 arg6) { \ - LSS_REG(4, arg1); LSS_REG(5, arg2); LSS_REG(6, arg3); \ - LSS_REG(7, arg4); LSS_REG(8, arg5); LSS_REG(9, arg6); \ - LSS_BODY(type, name, "+r", "r"(__r4), "r"(__r5), "r"(__r6), \ - "r"(__r8), "r"(__r9)); \ - } - #endif - LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, - int flags, void *arg, int *parent_tidptr, - void *newtls, int *child_tidptr) { - register unsigned long __v0 __asm__("$2"); - register unsigned long __r7 __asm__("$7") = (unsigned long)newtls; - { - register int __flags __asm__("$4") = flags; - register void *__stack __asm__("$5") = child_stack; - register void *__ptid __asm__("$6") = parent_tidptr; - register int *__ctid __asm__("$8") = child_tidptr; - __asm__ __volatile__( - #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 - "subu $29,24\n" - #elif _MIPS_SIM == _MIPS_SIM_NABI32 - "sub $29,16\n" - #else - "dsubu $29,16\n" - #endif - - /* if (fn == NULL || child_stack == NULL) - * return -EINVAL; - */ - "li %0,%2\n" - "beqz %5,1f\n" - "beqz %6,1f\n" - - /* Push "arg" and "fn" onto the stack that will be - * used by the child. - */ - #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 - "subu %6,32\n" - "sw %5,0(%6)\n" - "sw %8,4(%6)\n" - #elif _MIPS_SIM == _MIPS_SIM_NABI32 - "sub %6,32\n" - "sw %5,0(%6)\n" - "sw %8,8(%6)\n" - #else - "dsubu %6,32\n" - "sd %5,0(%6)\n" - "sd %8,8(%6)\n" - #endif - - /* $7 = syscall($4 = flags, - * $5 = child_stack, - * $6 = parent_tidptr, - * $7 = newtls, - * $8 = child_tidptr) - */ - "li $2,%3\n" - "syscall\n" - - /* if ($7 != 0) - * return $2; - */ - "bnez $7,1f\n" - "bnez $2,1f\n" - - /* In the child, now. Call "fn(arg)". - */ - #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 - "lw $25,0($29)\n" - "lw $4,4($29)\n" - #elif _MIPS_SIM == _MIPS_SIM_NABI32 - "lw $25,0($29)\n" - "lw $4,8($29)\n" - #else - "ld $25,0($29)\n" - "ld $4,8($29)\n" - #endif - "jalr $25\n" - - /* Call _exit($2) - */ - "move $4,$2\n" - "li $2,%4\n" - "syscall\n" - - "1:\n" - #if _MIPS_SIM == _MIPS_SIM_ABI32 && _MIPS_SZPTR == 32 - "addu $29, 24\n" - #elif _MIPS_SIM == _MIPS_SIM_NABI32 - "add $29, 16\n" - #else - "daddu $29,16\n" - #endif - : "=&r" (__v0), "=r" (__r7) - : "i"(-EINVAL), "i"(__NR_clone), "i"(__NR_exit), - "r"(fn), "r"(__stack), "r"(__flags), "r"(arg), - "r"(__ptid), "r"(__r7), "r"(__ctid) - : "$9", "$10", "$11", "$12", "$13", "$14", "$15", - "$24", "memory"); - } - LSS_RETURN(int, __v0, __r7); - } - #elif defined (__PPC__) - #undef LSS_LOADARGS_0 - #define LSS_LOADARGS_0(name, dummy...) \ - __sc_0 = __NR_##name - #undef LSS_LOADARGS_1 - #define LSS_LOADARGS_1(name, arg1) \ - LSS_LOADARGS_0(name); \ - __sc_3 = (unsigned long) (arg1) - #undef LSS_LOADARGS_2 - #define LSS_LOADARGS_2(name, arg1, arg2) \ - LSS_LOADARGS_1(name, arg1); \ - __sc_4 = (unsigned long) (arg2) - #undef LSS_LOADARGS_3 - #define LSS_LOADARGS_3(name, arg1, arg2, arg3) \ - LSS_LOADARGS_2(name, arg1, arg2); \ - __sc_5 = (unsigned long) (arg3) - #undef LSS_LOADARGS_4 - #define LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4) \ - LSS_LOADARGS_3(name, arg1, arg2, arg3); \ - __sc_6 = (unsigned long) (arg4) - #undef LSS_LOADARGS_5 - #define LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5) \ - LSS_LOADARGS_4(name, arg1, arg2, arg3, arg4); \ - __sc_7 = (unsigned long) (arg5) - #undef LSS_LOADARGS_6 - #define LSS_LOADARGS_6(name, arg1, arg2, arg3, arg4, arg5, arg6) \ - LSS_LOADARGS_5(name, arg1, arg2, arg3, arg4, arg5); \ - __sc_8 = (unsigned long) (arg6) - #undef LSS_ASMINPUT_0 - #define LSS_ASMINPUT_0 "0" (__sc_0) - #undef LSS_ASMINPUT_1 - #define LSS_ASMINPUT_1 LSS_ASMINPUT_0, "1" (__sc_3) - #undef LSS_ASMINPUT_2 - #define LSS_ASMINPUT_2 LSS_ASMINPUT_1, "2" (__sc_4) - #undef LSS_ASMINPUT_3 - #define LSS_ASMINPUT_3 LSS_ASMINPUT_2, "3" (__sc_5) - #undef LSS_ASMINPUT_4 - #define LSS_ASMINPUT_4 LSS_ASMINPUT_3, "4" (__sc_6) - #undef LSS_ASMINPUT_5 - #define LSS_ASMINPUT_5 LSS_ASMINPUT_4, "5" (__sc_7) - #undef LSS_ASMINPUT_6 - #define LSS_ASMINPUT_6 LSS_ASMINPUT_5, "6" (__sc_8) - #undef LSS_BODY - #define LSS_BODY(nr, type, name, args...) \ - long __sc_ret, __sc_err; \ - { \ - register unsigned long __sc_0 __asm__ ("r0"); \ - register unsigned long __sc_3 __asm__ ("r3"); \ - register unsigned long __sc_4 __asm__ ("r4"); \ - register unsigned long __sc_5 __asm__ ("r5"); \ - register unsigned long __sc_6 __asm__ ("r6"); \ - register unsigned long __sc_7 __asm__ ("r7"); \ - register unsigned long __sc_8 __asm__ ("r8"); \ - \ - LSS_LOADARGS_##nr(name, args); \ - __asm__ __volatile__ \ - ("sc\n\t" \ - "mfcr %0" \ - : "=&r" (__sc_0), \ - "=&r" (__sc_3), "=&r" (__sc_4), \ - "=&r" (__sc_5), "=&r" (__sc_6), \ - "=&r" (__sc_7), "=&r" (__sc_8) \ - : LSS_ASMINPUT_##nr \ - : "cr0", "ctr", "memory", \ - "r9", "r10", "r11", "r12"); \ - __sc_ret = __sc_3; \ - __sc_err = __sc_0; \ - } \ - LSS_RETURN(type, __sc_ret, __sc_err) - #undef _syscall0 - #define _syscall0(type, name) \ - type LSS_NAME(name)(void) { \ - LSS_BODY(0, type, name); \ - } - #undef _syscall1 - #define _syscall1(type, name, type1, arg1) \ - type LSS_NAME(name)(type1 arg1) { \ - LSS_BODY(1, type, name, arg1); \ - } - #undef _syscall2 - #define _syscall2(type, name, type1, arg1, type2, arg2) \ - type LSS_NAME(name)(type1 arg1, type2 arg2) { \ - LSS_BODY(2, type, name, arg1, arg2); \ - } - #undef _syscall3 - #define _syscall3(type, name, type1, arg1, type2, arg2, type3, arg3) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3) { \ - LSS_BODY(3, type, name, arg1, arg2, arg3); \ - } - #undef _syscall4 - #define _syscall4(type, name, type1, arg1, type2, arg2, type3, arg3, \ - type4, arg4) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4) { \ - LSS_BODY(4, type, name, arg1, arg2, arg3, arg4); \ - } - #undef _syscall5 - #define _syscall5(type, name, type1, arg1, type2, arg2, type3, arg3, \ - type4, arg4, type5, arg5) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5) { \ - LSS_BODY(5, type, name, arg1, arg2, arg3, arg4, arg5); \ - } - #undef _syscall6 - #define _syscall6(type, name, type1, arg1, type2, arg2, type3, arg3, \ - type4, arg4, type5, arg5, type6, arg6) \ - type LSS_NAME(name)(type1 arg1, type2 arg2, type3 arg3, type4 arg4, \ - type5 arg5, type6 arg6) { \ - LSS_BODY(6, type, name, arg1, arg2, arg3, arg4, arg5, arg6); \ - } - /* clone function adapted from glibc 2.3.6 clone.S */ - /* TODO(csilvers): consider wrapping some args up in a struct, like we - * do for i386's _syscall6, so we can compile successfully on gcc 2.95 - */ - LSS_INLINE int LSS_NAME(clone)(int (*fn)(void *), void *child_stack, - int flags, void *arg, int *parent_tidptr, - void *newtls, int *child_tidptr) { - long __ret, __err; - { - register int (*__fn)(void *) __asm__ ("r8") = fn; - register void *__cstack __asm__ ("r4") = child_stack; - register int __flags __asm__ ("r3") = flags; - register void * __arg __asm__ ("r9") = arg; - register int * __ptidptr __asm__ ("r5") = parent_tidptr; - register void * __newtls __asm__ ("r6") = newtls; - register int * __ctidptr __asm__ ("r7") = child_tidptr; - __asm__ __volatile__( - /* check for fn == NULL - * and child_stack == NULL - */ - "cmpwi cr0, %6, 0\n\t" - "cmpwi cr1, %7, 0\n\t" - "cror cr0*4+eq, cr1*4+eq, cr0*4+eq\n\t" - "beq- cr0, 1f\n\t" - - /* set up stack frame for child */ - "clrrwi %7, %7, 4\n\t" - "li 0, 0\n\t" - "stwu 0, -16(%7)\n\t" - - /* fn, arg, child_stack are saved across the syscall: r28-30 */ - "mr 28, %6\n\t" - "mr 29, %7\n\t" - "mr 27, %9\n\t" - - /* syscall */ - "li 0, %4\n\t" - /* flags already in r3 - * child_stack already in r4 - * ptidptr already in r5 - * newtls already in r6 - * ctidptr already in r7 - */ - "sc\n\t" - - /* Test if syscall was successful */ - "cmpwi cr1, 3, 0\n\t" - "crandc cr1*4+eq, cr1*4+eq, cr0*4+so\n\t" - "bne- cr1, 1f\n\t" - - /* Do the function call */ - "mtctr 28\n\t" - "mr 3, 27\n\t" - "bctrl\n\t" - - /* Call _exit(r3) */ - "li 0, %5\n\t" - "sc\n\t" - - /* Return to parent */ - "1:\n" - "mfcr %1\n\t" - "mr %0, 3\n\t" - : "=r" (__ret), "=r" (__err) - : "0" (-1), "1" (EINVAL), - "i" (__NR_clone), "i" (__NR_exit), - "r" (__fn), "r" (__cstack), "r" (__flags), - "r" (__arg), "r" (__ptidptr), "r" (__newtls), - "r" (__ctidptr) - : "cr0", "cr1", "memory", "ctr", - "r0", "r29", "r27", "r28"); - } - LSS_RETURN(int, __ret, __err); - } - #endif - #define __NR__exit __NR_exit - #define __NR__gettid __NR_gettid - #define __NR__mremap __NR_mremap - LSS_INLINE _syscall1(int, chdir, const char *,p) - LSS_INLINE _syscall1(int, close, int, f) - LSS_INLINE _syscall1(int, dup, int, f) - LSS_INLINE _syscall2(int, dup2, int, s, - int, d) - LSS_INLINE _syscall3(int, execve, const char*, f, - const char*const*,a,const char*const*, e) - LSS_INLINE _syscall1(int, _exit, int, e) - LSS_INLINE _syscall3(int, fcntl, int, f, - int, c, long, a) - LSS_INLINE _syscall0(pid_t, fork) - LSS_INLINE _syscall2(int, fstat, int, f, - struct kernel_stat*, b) - LSS_INLINE _syscall2(int, fstatfs, int, f, - struct kernel_statfs*, b) - LSS_INLINE _syscall4(int, futex, int*, a, - int, o, int, v, - struct kernel_timespec*, t) - LSS_INLINE _syscall3(int, getdents, int, f, - struct kernel_dirent*, d, int, c) - LSS_INLINE _syscall3(int, getdents64, int, f, - struct kernel_dirent64*, d, int, c) - LSS_INLINE _syscall0(gid_t, getegid) - LSS_INLINE _syscall0(uid_t, geteuid) - LSS_INLINE _syscall0(pid_t, getpgrp) - LSS_INLINE _syscall0(pid_t, getpid) - LSS_INLINE _syscall0(pid_t, getppid) - LSS_INLINE _syscall2(int, getpriority, int, a, - int, b) - LSS_INLINE _syscall2(int, getrlimit, int, r, - struct kernel_rlimit*, l) - LSS_INLINE _syscall1(pid_t, getsid, pid_t, p) - LSS_INLINE _syscall0(pid_t, _gettid) - LSS_INLINE _syscall5(int, setxattr, const char *,p, - const char *, n, const void *,v, - size_t, s, int, f) - LSS_INLINE _syscall5(int, lsetxattr, const char *,p, - const char *, n, const void *,v, - size_t, s, int, f) - LSS_INLINE _syscall4(ssize_t, getxattr, const char *,p, - const char *, n, void *, v, size_t, s) - LSS_INLINE _syscall4(ssize_t, lgetxattr, const char *,p, - const char *, n, void *, v, size_t, s) - LSS_INLINE _syscall2(int, kill, pid_t, p, - int, s) - LSS_INLINE _syscall3(off_t, lseek, int, f, - off_t, o, int, w) - LSS_INLINE _syscall2(int, munmap, void*, s, - size_t, l) - LSS_INLINE _syscall6(long, move_pages, pid_t, p, - unsigned long, n, void **,g, int *, d, - int *, s, int, f) - LSS_INLINE _syscall5(void*, _mremap, void*, o, - size_t, os, size_t, ns, - unsigned long, f, void *, a) - LSS_INLINE _syscall3(int, open, const char*, p, - int, f, int, m) - LSS_INLINE _syscall3(int, poll, struct kernel_pollfd*, u, - unsigned int, n, int, t) - LSS_INLINE _syscall2(int, prctl, int, o, - long, a) - LSS_INLINE _syscall4(long, ptrace, int, r, - pid_t, p, void *, a, void *, d) - LSS_INLINE _syscall3(ssize_t, read, int, f, - void *, b, size_t, c) - LSS_INLINE _syscall3(int, readlink, const char*, p, - char*, b, size_t, s) - LSS_INLINE _syscall4(int, rt_sigaction, int, s, - const struct kernel_sigaction*, a, - struct kernel_sigaction*, o, size_t, c) - LSS_INLINE _syscall2(int, rt_sigpending, struct kernel_sigset_t *, s, - size_t, c) - LSS_INLINE _syscall4(int, rt_sigprocmask, int, h, - const struct kernel_sigset_t*, s, - struct kernel_sigset_t*, o, size_t, c) - LSS_INLINE _syscall2(int, rt_sigsuspend, - const struct kernel_sigset_t*, s, size_t, c) - LSS_INLINE _syscall3(int, sched_getaffinity,pid_t, p, - unsigned int, l, unsigned long *, m) - LSS_INLINE _syscall3(int, sched_setaffinity,pid_t, p, - unsigned int, l, unsigned long *, m) - LSS_INLINE _syscall0(int, sched_yield) - LSS_INLINE _syscall1(long, set_tid_address, int *, t) - LSS_INLINE _syscall1(int, setfsgid, gid_t, g) - LSS_INLINE _syscall1(int, setfsuid, uid_t, u) - LSS_INLINE _syscall2(int, setpgid, pid_t, p, - pid_t, g) - LSS_INLINE _syscall3(int, setpriority, int, a, - int, b, int, p) - LSS_INLINE _syscall3(int, setresgid, gid_t, r, - gid_t, e, gid_t, s) - LSS_INLINE _syscall3(int, setresuid, uid_t, r, - uid_t, e, uid_t, s) - LSS_INLINE _syscall2(int, setrlimit, int, r, - const struct kernel_rlimit*, l) - LSS_INLINE _syscall0(pid_t, setsid) - LSS_INLINE _syscall2(int, sigaltstack, const stack_t*, s, - const stack_t*, o) - LSS_INLINE _syscall2(int, stat, const char*, f, - struct kernel_stat*, b) - LSS_INLINE _syscall2(int, statfs, const char*, f, - struct kernel_statfs*, b) - LSS_INLINE _syscall1(int, unlink, const char*, f) - LSS_INLINE _syscall3(ssize_t, write, int, f, - const void *, b, size_t, c) - LSS_INLINE _syscall3(ssize_t, writev, int, f, - const struct kernel_iovec*, v, size_t, c) - #if defined(__x86_64__) || \ - (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) - LSS_INLINE _syscall3(int, recvmsg, int, s, - struct kernel_msghdr*, m, int, f) - LSS_INLINE _syscall3(int, sendmsg, int, s, - const struct kernel_msghdr*, m, int, f) - LSS_INLINE _syscall6(int, sendto, int, s, - const void*, m, size_t, l, - int, f, - const struct kernel_sockaddr*, a, int, t) - LSS_INLINE _syscall2(int, shutdown, int, s, - int, h) - LSS_INLINE _syscall3(int, socket, int, d, - int, t, int, p) - LSS_INLINE _syscall4(int, socketpair, int, d, - int, t, int, p, int*, s) - #endif - #if defined(__x86_64__) - LSS_INLINE _syscall6(void*, mmap, void*, s, - size_t, l, int, p, - int, f, int, d, - __off64_t, o) - LSS_INLINE _syscall4(int, newfstatat, int, d, - const char *, p, - struct kernel_stat*, b, int, f) - - LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) { - return LSS_NAME(setfsgid)(gid); - } - - LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) { - return LSS_NAME(setfsuid)(uid); - } - - LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) { - return LSS_NAME(setresgid)(rgid, egid, sgid); - } - - LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) { - return LSS_NAME(setresuid)(ruid, euid, suid); - } - - LSS_INLINE int LSS_NAME(sigaction)(int signum, - const struct kernel_sigaction *act, - struct kernel_sigaction *oldact) { - /* On x86_64, the kernel requires us to always set our own - * SA_RESTORER in order to be able to return from a signal handler. - * This function must have a "magic" signature that the "gdb" - * (and maybe the kernel?) can recognize. - */ - if (act != NULL && !(act->sa_flags & SA_RESTORER)) { - struct kernel_sigaction a = *act; - a.sa_flags |= SA_RESTORER; - a.sa_restorer = LSS_NAME(restore_rt)(); - return LSS_NAME(rt_sigaction)(signum, &a, oldact, - (KERNEL_NSIG+7)/8); - } else { - return LSS_NAME(rt_sigaction)(signum, act, oldact, - (KERNEL_NSIG+7)/8); - } - } - - LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) { - return LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8); - } - - LSS_INLINE int LSS_NAME(sigprocmask)(int how, - const struct kernel_sigset_t *set, - struct kernel_sigset_t *oldset) { - return LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8); - } - - LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) { - return LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8); - } - #endif - #if defined(__x86_64__) || defined(__ARM_ARCH_3__) || \ - (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI32) - LSS_INLINE _syscall4(pid_t, wait4, pid_t, p, - int*, s, int, o, - struct kernel_rusage*, r) - - LSS_INLINE pid_t LSS_NAME(waitpid)(pid_t pid, int *status, int options){ - return LSS_NAME(wait4)(pid, status, options, 0); - } - #endif - #if defined(__i386__) || defined(__x86_64__) - LSS_INLINE _syscall4(int, openat, int, d, const char *, p, int, f, int, m) - LSS_INLINE _syscall3(int, unlinkat, int, d, const char *, p, int, f) - #endif - #if defined(__i386__) || defined(__ARM_ARCH_3__) - #define __NR__setfsgid32 __NR_setfsgid32 - #define __NR__setfsuid32 __NR_setfsuid32 - #define __NR__setresgid32 __NR_setresgid32 - #define __NR__setresuid32 __NR_setresuid32 - LSS_INLINE _syscall2(int, ugetrlimit, int, r, - struct kernel_rlimit*, l) - LSS_INLINE _syscall1(int, _setfsgid32, gid_t, f) - LSS_INLINE _syscall1(int, _setfsuid32, uid_t, f) - LSS_INLINE _syscall3(int, _setresgid32, gid_t, r, - gid_t, e, gid_t, s) - LSS_INLINE _syscall3(int, _setresuid32, uid_t, r, - uid_t, e, uid_t, s) - - LSS_INLINE int LSS_NAME(setfsgid32)(gid_t gid) { - int rc; - if ((rc = LSS_NAME(_setfsgid32)(gid)) < 0 && - LSS_ERRNO == ENOSYS) { - if ((unsigned int)gid & ~0xFFFFu) { - rc = EINVAL; - } else { - rc = LSS_NAME(setfsgid)(gid); - } - } - return rc; - } - - LSS_INLINE int LSS_NAME(setfsuid32)(uid_t uid) { - int rc; - if ((rc = LSS_NAME(_setfsuid32)(uid)) < 0 && - LSS_ERRNO == ENOSYS) { - if ((unsigned int)uid & ~0xFFFFu) { - rc = EINVAL; - } else { - rc = LSS_NAME(setfsuid)(uid); - } - } - return rc; - } - - LSS_INLINE int LSS_NAME(setresgid32)(gid_t rgid, gid_t egid, gid_t sgid) { - int rc; - if ((rc = LSS_NAME(_setresgid32)(rgid, egid, sgid)) < 0 && - LSS_ERRNO == ENOSYS) { - if ((unsigned int)rgid & ~0xFFFFu || - (unsigned int)egid & ~0xFFFFu || - (unsigned int)sgid & ~0xFFFFu) { - rc = EINVAL; - } else { - rc = LSS_NAME(setresgid)(rgid, egid, sgid); - } - } - return rc; - } - - LSS_INLINE int LSS_NAME(setresuid32)(uid_t ruid, uid_t euid, uid_t suid) { - int rc; - if ((rc = LSS_NAME(_setresuid32)(ruid, euid, suid)) < 0 && - LSS_ERRNO == ENOSYS) { - if ((unsigned int)ruid & ~0xFFFFu || - (unsigned int)euid & ~0xFFFFu || - (unsigned int)suid & ~0xFFFFu) { - rc = EINVAL; - } else { - rc = LSS_NAME(setresuid)(ruid, euid, suid); - } - } - return rc; - } - #endif - LSS_INLINE int LSS_NAME(sigemptyset)(struct kernel_sigset_t *set) { - memset(&set->sig, 0, sizeof(set->sig)); - return 0; - } - - LSS_INLINE int LSS_NAME(sigfillset)(struct kernel_sigset_t *set) { - memset(&set->sig, -1, sizeof(set->sig)); - return 0; - } - - LSS_INLINE int LSS_NAME(sigaddset)(struct kernel_sigset_t *set, - int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { - LSS_ERRNO = EINVAL; - return -1; - } else { - set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] - |= 1UL << ((signum - 1) % (8*sizeof(set->sig[0]))); - return 0; - } - } - - LSS_INLINE int LSS_NAME(sigdelset)(struct kernel_sigset_t *set, - int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { - LSS_ERRNO = EINVAL; - return -1; - } else { - set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] - &= ~(1UL << ((signum - 1) % (8*sizeof(set->sig[0])))); - return 0; - } - } - - LSS_INLINE int LSS_NAME(sigismember)(struct kernel_sigset_t *set, - int signum) { - if (signum < 1 || signum > (int)(8*sizeof(set->sig))) { - LSS_ERRNO = EINVAL; - return -1; - } else { - return !!(set->sig[(signum - 1)/(8*sizeof(set->sig[0]))] & - (1UL << ((signum - 1) % (8*sizeof(set->sig[0]))))); - } - } - #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ - (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) || defined(__PPC__) - #define __NR__sigaction __NR_sigaction - #define __NR__sigpending __NR_sigpending - #define __NR__sigprocmask __NR_sigprocmask - #define __NR__sigsuspend __NR_sigsuspend - #define __NR__socketcall __NR_socketcall - LSS_INLINE _syscall2(int, fstat64, int, f, - struct kernel_stat64 *, b) - LSS_INLINE _syscall5(int, _llseek, uint, fd, ulong, hi, ulong, lo, - loff_t *, res, uint, wh) - LSS_INLINE _syscall1(void*, mmap, void*, a) - LSS_INLINE _syscall6(void*, mmap2, void*, s, - size_t, l, int, p, - int, f, int, d, - __off64_t, o) - LSS_INLINE _syscall3(int, _sigaction, int, s, - const struct kernel_old_sigaction*, a, - struct kernel_old_sigaction*, o) - LSS_INLINE _syscall1(int, _sigpending, unsigned long*, s) - LSS_INLINE _syscall3(int, _sigprocmask, int, h, - const unsigned long*, s, - unsigned long*, o) - #ifdef __PPC__ - LSS_INLINE _syscall1(int, _sigsuspend, unsigned long, s) - #else - LSS_INLINE _syscall3(int, _sigsuspend, const void*, a, - int, b, - unsigned long, s) - #endif - LSS_INLINE _syscall2(int, stat64, const char *, p, - struct kernel_stat64 *, b) - - LSS_INLINE int LSS_NAME(sigaction)(int signum, - const struct kernel_sigaction *act, - struct kernel_sigaction *oldact) { - int old_errno = LSS_ERRNO; - int rc; - struct kernel_sigaction a; - if (act != NULL) { - a = *act; - #ifdef __i386__ - /* On i386, the kernel requires us to always set our own - * SA_RESTORER when using realtime signals. Otherwise, it does not - * know how to return from a signal handler. This function must have - * a "magic" signature that the "gdb" (and maybe the kernel?) can - * recognize. - * Apparently, a SA_RESTORER is implicitly set by the kernel, when - * using non-realtime signals. - * - * TODO: Test whether ARM needs a restorer - */ - if (!(a.sa_flags & SA_RESTORER)) { - a.sa_flags |= SA_RESTORER; - a.sa_restorer = (a.sa_flags & SA_SIGINFO) - ? LSS_NAME(restore_rt)() : LSS_NAME(restore)(); - } - #endif - } - rc = LSS_NAME(rt_sigaction)(signum, act ? &a : act, oldact, - (KERNEL_NSIG+7)/8); - if (rc < 0 && LSS_ERRNO == ENOSYS) { - struct kernel_old_sigaction oa, ooa, *ptr_a = &oa, *ptr_oa = &ooa; - if (!act) { - ptr_a = NULL; - } else { - oa.sa_handler_ = act->sa_handler_; - memcpy(&oa.sa_mask, &act->sa_mask, sizeof(oa.sa_mask)); - #ifndef __mips__ - oa.sa_restorer = act->sa_restorer; - #endif - oa.sa_flags = act->sa_flags; - } - if (!oldact) { - ptr_oa = NULL; - } - LSS_ERRNO = old_errno; - rc = LSS_NAME(_sigaction)(signum, ptr_a, ptr_oa); - if (rc == 0 && oldact) { - if (act) { - memcpy(oldact, act, sizeof(*act)); - } else { - memset(oldact, 0, sizeof(*oldact)); - } - oldact->sa_handler_ = ptr_oa->sa_handler_; - oldact->sa_flags = ptr_oa->sa_flags; - memcpy(&oldact->sa_mask, &ptr_oa->sa_mask, sizeof(ptr_oa->sa_mask)); - #ifndef __mips__ - oldact->sa_restorer = ptr_oa->sa_restorer; - #endif - } - } - return rc; - } - - LSS_INLINE int LSS_NAME(sigpending)(struct kernel_sigset_t *set) { - int old_errno = LSS_ERRNO; - int rc = LSS_NAME(rt_sigpending)(set, (KERNEL_NSIG+7)/8); - if (rc < 0 && LSS_ERRNO == ENOSYS) { - LSS_ERRNO = old_errno; - LSS_NAME(sigemptyset)(set); - rc = LSS_NAME(_sigpending)(&set->sig[0]); - } - return rc; - } - - LSS_INLINE int LSS_NAME(sigprocmask)(int how, - const struct kernel_sigset_t *set, - struct kernel_sigset_t *oldset) { - int olderrno = LSS_ERRNO; - int rc = LSS_NAME(rt_sigprocmask)(how, set, oldset, (KERNEL_NSIG+7)/8); - if (rc < 0 && LSS_ERRNO == ENOSYS) { - LSS_ERRNO = olderrno; - if (oldset) { - LSS_NAME(sigemptyset)(oldset); - } - rc = LSS_NAME(_sigprocmask)(how, - set ? &set->sig[0] : NULL, - oldset ? &oldset->sig[0] : NULL); - } - return rc; - } - - LSS_INLINE int LSS_NAME(sigsuspend)(const struct kernel_sigset_t *set) { - int olderrno = LSS_ERRNO; - int rc = LSS_NAME(rt_sigsuspend)(set, (KERNEL_NSIG+7)/8); - if (rc < 0 && LSS_ERRNO == ENOSYS) { - LSS_ERRNO = olderrno; - rc = LSS_NAME(_sigsuspend)( - #ifndef __PPC__ - set, 0, - #endif - set->sig[0]); - } - return rc; - } - #endif - #if defined(__PPC__) - #undef LSS_SC_LOADARGS_0 - #define LSS_SC_LOADARGS_0(dummy...) - #undef LSS_SC_LOADARGS_1 - #define LSS_SC_LOADARGS_1(arg1) \ - __sc_4 = (unsigned long) (arg1) - #undef LSS_SC_LOADARGS_2 - #define LSS_SC_LOADARGS_2(arg1, arg2) \ - LSS_SC_LOADARGS_1(arg1); \ - __sc_5 = (unsigned long) (arg2) - #undef LSS_SC_LOADARGS_3 - #define LSS_SC_LOADARGS_3(arg1, arg2, arg3) \ - LSS_SC_LOADARGS_2(arg1, arg2); \ - __sc_6 = (unsigned long) (arg3) - #undef LSS_SC_LOADARGS_4 - #define LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4) \ - LSS_SC_LOADARGS_3(arg1, arg2, arg3); \ - __sc_7 = (unsigned long) (arg4) - #undef LSS_SC_LOADARGS_5 - #define LSS_SC_LOADARGS_5(arg1, arg2, arg3, arg4, arg5) \ - LSS_SC_LOADARGS_4(arg1, arg2, arg3, arg4); \ - __sc_8 = (unsigned long) (arg5) - #undef LSS_SC_BODY - #define LSS_SC_BODY(nr, type, opt, args...) \ - long __sc_ret, __sc_err; \ - { \ - register unsigned long __sc_0 __asm__ ("r0") = __NR_socketcall; \ - register unsigned long __sc_3 __asm__ ("r3") = opt; \ - register unsigned long __sc_4 __asm__ ("r4"); \ - register unsigned long __sc_5 __asm__ ("r5"); \ - register unsigned long __sc_6 __asm__ ("r6"); \ - register unsigned long __sc_7 __asm__ ("r7"); \ - register unsigned long __sc_8 __asm__ ("r8"); \ - LSS_SC_LOADARGS_##nr(args); \ - __asm__ __volatile__ \ - ("stwu 1, -48(1)\n\t" \ - "stw 4, 20(1)\n\t" \ - "stw 5, 24(1)\n\t" \ - "stw 6, 28(1)\n\t" \ - "stw 7, 32(1)\n\t" \ - "stw 8, 36(1)\n\t" \ - "addi 4, 1, 20\n\t" \ - "sc\n\t" \ - "mfcr %0" \ - : "=&r" (__sc_0), \ - "=&r" (__sc_3), "=&r" (__sc_4), \ - "=&r" (__sc_5), "=&r" (__sc_6), \ - "=&r" (__sc_7), "=&r" (__sc_8) \ - : LSS_ASMINPUT_##nr \ - : "cr0", "ctr", "memory"); \ - __sc_ret = __sc_3; \ - __sc_err = __sc_0; \ - } \ - LSS_RETURN(type, __sc_ret, __sc_err) - - LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, - int flags){ - LSS_SC_BODY(3, ssize_t, 17, s, msg, flags); - } - - LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, - const struct kernel_msghdr *msg, - int flags) { - LSS_SC_BODY(3, ssize_t, 16, s, msg, flags); - } - - // TODO(csilvers): why is this ifdef'ed out? -#if 0 - LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, - int flags, - const struct kernel_sockaddr *to, - unsigned int tolen) { - LSS_BODY(6, ssize_t, 11, s, buf, len, flags, to, tolen); - } -#endif - - LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { - LSS_SC_BODY(2, int, 13, s, how); - } - - LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { - LSS_SC_BODY(3, int, 1, domain, type, protocol); - } - - LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, - int sv[2]) { - LSS_SC_BODY(4, int, 8, d, type, protocol, sv); - } - #endif - #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ - (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) - #define __NR__socketcall __NR_socketcall - LSS_INLINE _syscall2(int, _socketcall, int, c, - va_list, a) - - LSS_INLINE int LSS_NAME(socketcall)(int op, ...) { - int rc; - va_list ap; - va_start(ap, op); - rc = LSS_NAME(_socketcall)(op, ap); - va_end(ap); - return rc; - } - - LSS_INLINE ssize_t LSS_NAME(recvmsg)(int s,struct kernel_msghdr *msg, - int flags){ - return (ssize_t)LSS_NAME(socketcall)(17, s, msg, flags); - } - - LSS_INLINE ssize_t LSS_NAME(sendmsg)(int s, - const struct kernel_msghdr *msg, - int flags) { - return (ssize_t)LSS_NAME(socketcall)(16, s, msg, flags); - } - - LSS_INLINE ssize_t LSS_NAME(sendto)(int s, const void *buf, size_t len, - int flags, - const struct kernel_sockaddr *to, - unsigned int tolen) { - return (ssize_t)LSS_NAME(socketcall)(11, s, buf, len, flags, to, tolen); - } - - LSS_INLINE int LSS_NAME(shutdown)(int s, int how) { - return LSS_NAME(socketcall)(13, s, how); - } - - LSS_INLINE int LSS_NAME(socket)(int domain, int type, int protocol) { - return LSS_NAME(socketcall)(1, domain, type, protocol); - } - - LSS_INLINE int LSS_NAME(socketpair)(int d, int type, int protocol, - int sv[2]) { - return LSS_NAME(socketcall)(8, d, type, protocol, sv); - } - #endif - #if defined(__i386__) || defined(__PPC__) - LSS_INLINE _syscall4(int, fstatat64, int, d, - const char *, p, - struct kernel_stat64 *, b, int, f) - #endif - #if defined(__i386__) || defined(__PPC__) || \ - (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI32) - LSS_INLINE _syscall3(pid_t, waitpid, pid_t, p, - int*, s, int, o) - #endif - #if defined(__mips__) - /* sys_pipe() on MIPS has non-standard calling conventions, as it returns - * both file handles through CPU registers. - */ - LSS_INLINE int LSS_NAME(pipe)(int *p) { - register unsigned long __v0 __asm__("$2") = __NR_pipe; - register unsigned long __v1 __asm__("$3"); - register unsigned long __r7 __asm__("$7"); - __asm__ __volatile__ ("syscall\n" - : "=&r"(__v0), "=&r"(__v1), "+r" (__r7) - : "0"(__v0) - : "$8", "$9", "$10", "$11", "$12", - "$13", "$14", "$15", "$24", "memory"); - if (__r7) { - LSS_ERRNO = __v0; - return -1; - } else { - p[0] = __v0; - p[1] = __v1; - return 0; - } - } - #else - LSS_INLINE _syscall1(int, pipe, int *, p) - #endif - /* TODO(csilvers): see if ppc can/should support this as well */ - #if defined(__i386__) || defined(__ARM_ARCH_3__) || \ - (defined(__mips__) && _MIPS_SIM != _MIPS_SIM_ABI64) - #define __NR__statfs64 __NR_statfs64 - #define __NR__fstatfs64 __NR_fstatfs64 - LSS_INLINE _syscall3(int, _statfs64, const char*, p, - size_t, s,struct kernel_statfs64*, b) - LSS_INLINE _syscall3(int, _fstatfs64, int, f, - size_t, s,struct kernel_statfs64*, b) - LSS_INLINE int LSS_NAME(statfs64)(const char *p, - struct kernel_statfs64 *b) { - return LSS_NAME(_statfs64)(p, sizeof(*b), b); - } - LSS_INLINE int LSS_NAME(fstatfs64)(int f,struct kernel_statfs64 *b) { - return LSS_NAME(_fstatfs64)(f, sizeof(*b), b); - } - #endif - - LSS_INLINE int LSS_NAME(execv)(const char *path, const char *const argv[]) { - extern char **environ; - return LSS_NAME(execve)(path, argv, (const char *const *)environ); - } - - LSS_INLINE pid_t LSS_NAME(gettid)() { - pid_t tid = LSS_NAME(_gettid)(); - if (tid != -1) { - return tid; - } - return LSS_NAME(getpid)(); - } - - LSS_INLINE void *LSS_NAME(mremap)(void *old_address, size_t old_size, - size_t new_size, int flags, ...) { - va_list ap; - void *new_address, *rc; - va_start(ap, flags); - new_address = va_arg(ap, void *); - rc = LSS_NAME(_mremap)(old_address, old_size, new_size, - flags, new_address); - va_end(ap); - return rc; - } - - LSS_INLINE int LSS_NAME(ptrace_detach)(pid_t pid) { - /* PTRACE_DETACH can sometimes forget to wake up the tracee and it - * then sends job control signals to the real parent, rather than to - * the tracer. We reduce the risk of this happening by starting a - * whole new time slice, and then quickly sending a SIGCONT signal - * right after detaching from the tracee. - */ - int rc, err; - LSS_NAME(sched_yield)(); - rc = LSS_NAME(ptrace)(PTRACE_DETACH, pid, (void *)0, (void *)0); - err = LSS_ERRNO; - LSS_NAME(kill)(pid, SIGCONT); - LSS_ERRNO = err; - return rc; - } - - LSS_INLINE int LSS_NAME(raise)(int sig) { - return LSS_NAME(kill)(LSS_NAME(getpid)(), sig); - } - - LSS_INLINE int LSS_NAME(setpgrp)() { - return LSS_NAME(setpgid)(0, 0); - } - - LSS_INLINE int LSS_NAME(sysconf)(int name) { - extern int __getpagesize(void); - switch (name) { - case _SC_OPEN_MAX: { - struct kernel_rlimit limit; - return LSS_NAME(getrlimit)(RLIMIT_NOFILE, &limit) < 0 - ? 8192 : limit.rlim_cur; - } - case _SC_PAGESIZE: - return __getpagesize(); - default: - errno = ENOSYS; - return -1; - } - } - #if defined(__x86_64__) || \ - (defined(__mips__) && _MIPS_SIM == _MIPS_SIM_ABI64) - /* pread64() and pwrite64() do not exist on 64-bit systems... */ - LSS_INLINE _syscall3(int, readahead, int, f, - loff_t, o, unsigned, c) - #else - #define __NR__pread64 __NR_pread64 - #define __NR__pwrite64 __NR_pwrite64 - #define __NR__readahead __NR_readahead - LSS_INLINE _syscall5(ssize_t, _pread64, int, f, - void *, b, size_t, c, unsigned, o1, - unsigned, o2) - LSS_INLINE _syscall5(ssize_t, _pwrite64, int, f, - const void *, b, size_t, c, unsigned, o1, - long, o2) - LSS_INLINE _syscall4(int, _readahead, int, f, - unsigned, o1, unsigned, o2, size_t, c) - /* We force 64bit-wide parameters onto the stack, then access each - * 32-bit component individually. This guarantees that we build the - * correct parameters independent of the native byte-order of the - * underlying architecture. - */ - LSS_INLINE ssize_t LSS_NAME(pread64)(int fd, void *buf, size_t count, - loff_t off) { - union { loff_t off; unsigned arg[2]; } o = { off }; - return LSS_NAME(_pread64)(fd, buf, count, o.arg[0], o.arg[1]); - } - LSS_INLINE ssize_t LSS_NAME(pwrite64)(int fd, const void *buf, - size_t count, loff_t off) { - union { loff_t off; unsigned arg[2]; } o = { off }; - return LSS_NAME(_pwrite64)(fd, buf, count, o.arg[0], o.arg[1]); - } - LSS_INLINE int LSS_NAME(readahead)(int fd, loff_t off, int len) { - union { loff_t off; unsigned arg[2]; } o = { off }; - return LSS_NAME(_readahead)(fd, o.arg[0], o.arg[1], len); - } - #endif -#endif - -#if defined(__cplusplus) && !defined(SYS_CPLUSPLUS) -} -#endif - -#endif -#endif diff --git a/share/google-breakpad/src/common/linux/memory.h b/share/google-breakpad/src/common/linux/memory.h deleted file mode 100644 index f10a194b47a00361e35b9aef2a6102c33f76ca63..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/memory.h +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) 2009, 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. - -#ifndef CLIENT_LINUX_HANDLER_MEMORY_H_ -#define CLIENT_LINUX_HANDLER_MEMORY_H_ - -#include -#include -#include -#include - -#include "common/linux/linux_syscall_support.h" - -namespace google_breakpad { - -// This is very simple allocator which fetches pages from the kernel directly. -// Thus, it can be used even when the heap may be corrupted. -// -// There is no free operation. The pages are only freed when the object is -// destroyed. -class PageAllocator { - public: - PageAllocator() - : page_size_(getpagesize()), - last_(NULL), - current_page_(NULL), - page_offset_(0) { - } - - ~PageAllocator() { - FreeAll(); - } - - void *Alloc(unsigned bytes) { - if (!bytes) - return NULL; - - if (current_page_ && page_size_ - page_offset_ >= bytes) { - uint8_t *const ret = current_page_ + page_offset_; - page_offset_ += bytes; - if (page_offset_ == page_size_) { - page_offset_ = 0; - current_page_ = NULL; - } - - return ret; - } - - const unsigned pages = - (bytes + sizeof(PageHeader) + page_size_ - 1) / page_size_; - uint8_t *const ret = GetNPages(pages); - if (!ret) - return NULL; - - page_offset_ = (page_size_ - (page_size_ * pages - (bytes + sizeof(PageHeader)))) % page_size_; - current_page_ = page_offset_ ? ret + page_size_ * (pages - 1) : NULL; - - return ret + sizeof(PageHeader); - } - - private: - uint8_t *GetNPages(unsigned num_pages) { -#ifdef __x86_64 - void *a = sys_mmap(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#else - void *a = sys_mmap2(NULL, page_size_ * num_pages, PROT_READ | PROT_WRITE, - MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); -#endif - if (a == MAP_FAILED) - return NULL; - - struct PageHeader *header = reinterpret_cast(a); - header->next = last_; - header->num_pages = num_pages; - last_ = header; - - return reinterpret_cast(a); - } - - void FreeAll() { - PageHeader *next; - - for (PageHeader *cur = last_; cur; cur = next) { - next = cur->next; - sys_munmap(cur, cur->num_pages * page_size_); - } - } - - struct PageHeader { - PageHeader *next; // pointer to the start of the next set of pages. - unsigned num_pages; // the number of pages in this set. - }; - - const unsigned page_size_; - PageHeader *last_; - uint8_t *current_page_; - unsigned page_offset_; -}; - -// A wasteful vector is like a normal std::vector, except that it's very much -// simplier and it allocates memory from a PageAllocator. It's wasteful -// because, when resizing, it always allocates a whole new array since the -// PageAllocator doesn't support realloc. -template -class wasteful_vector { - public: - wasteful_vector(PageAllocator *allocator, unsigned size_hint = 16) - : allocator_(allocator), - a_((T*) allocator->Alloc(sizeof(T) * size_hint)), - allocated_(size_hint), - used_(0) { - } - - void push_back(const T& new_element) { - if (used_ == allocated_) - Realloc(allocated_ * 2); - a_[used_++] = new_element; - } - - size_t size() const { - return used_; - } - - T& operator[](size_t index) { - return a_[index]; - } - - const T& operator[](size_t index) const { - return a_[index]; - } - - private: - void Realloc(unsigned new_size) { - T *new_array = - reinterpret_cast(allocator_->Alloc(sizeof(T) * new_size)); - memcpy(new_array, a_, used_ * sizeof(T)); - a_ = new_array; - allocated_ = new_size; - } - - PageAllocator *const allocator_; - T *a_; // pointer to an array of |allocated_| elements. - unsigned allocated_; // size of |a_|, in elements. - unsigned used_; // number of used slots in |a_|. -}; - -} // namespace google_breakpad - -inline void* operator new(size_t nbytes, - google_breakpad::PageAllocator& allocator) { - return allocator.Alloc(nbytes); -} - -#endif // CLIENT_LINUX_HANDLER_MEMORY_H_ diff --git a/share/google-breakpad/src/common/linux/module.cc b/share/google-breakpad/src/common/linux/module.cc deleted file mode 100644 index bd0ae9f9e9fedab2c1fb708a6e13a033ad709479..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/module.cc +++ /dev/null @@ -1,189 +0,0 @@ -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// module.cc: Implement google_breakpad::Module. See module.h. - -#include -#include - -#include "common/linux/module.h" - -namespace google_breakpad { - -Module::Module(const string &name, const string &os, - const string &architecture, const string &id) : - name_(name), - os_(os), - architecture_(architecture), - id_(id), - load_address_(0) { } - -Module::~Module() { - for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); it++) - delete it->second; - for (vector::iterator it = functions_.begin(); - it != functions_.end(); it++) - delete *it; -} - -void Module::SetLoadAddress(Address address) { - load_address_ = address; -} - -void Module::AddFunction(Function *function) { - functions_.push_back(function); -} - -void Module::AddFunctions(vector::iterator begin, - vector::iterator end) { - functions_.insert(functions_.end(), begin, end); -} - -void Module::GetFunctions(vector *vec, - vector::iterator i) { - vec->insert(i, functions_.begin(), functions_.end()); -} - -Module::File *Module::FindFile(const string &name) { - // A tricky bit here. The key of each map entry needs to be a - // pointer to the entry's File's name string. This means that we - // can't do the initial lookup with any operation that would create - // an empty entry for us if the name isn't found (like, say, - // operator[] or insert do), because such a created entry's key will - // be a pointer the string passed as our argument. Since the key of - // a map's value type is const, we can't fix it up once we've - // created our file. lower_bound does the lookup without doing an - // insertion, and returns a good hint iterator to pass to insert. - // Our "destiny" is where we belong, whether we're there or not now. - FileByNameMap::iterator destiny = files_.lower_bound(&name); - if (destiny == files_.end() - || *destiny->first != name) { // Repeated string comparison, boo hoo. - File *file = new File; - file->name = name; - file->source_id = -1; - destiny = files_.insert(destiny, - FileByNameMap::value_type(&file->name, file)); - } - return destiny->second; -} - -Module::File *Module::FindFile(const char *name) { - string name_string = name; - return FindFile(name_string); -} - -Module::File *Module::FindExistingFile(const string &name) { - FileByNameMap::iterator it = files_.find(&name); - return (it == files_.end()) ? NULL : it->second; -} - -void Module::GetFiles(vector *vec) { - vec->clear(); - for (FileByNameMap::iterator it = files_.begin(); it != files_.end(); it++) - vec->push_back(it->second); -} - -void Module::AssignSourceIds() { - // First, give every source file an id of -1. - for (FileByNameMap::iterator file_it = files_.begin(); - file_it != files_.end(); file_it++) - file_it->second->source_id = -1; - - // Next, mark all files actually cited by our functions' line number - // info, by setting each one's source id to zero. - for (vector::const_iterator func_it = functions_.begin(); - func_it != functions_.end(); func_it++) { - Function *func = *func_it; - for (vector::iterator line_it = func->lines.begin(); - line_it != func->lines.end(); line_it++) - line_it->file->source_id = 0; - } - - // Finally, assign source ids to those files that have been marked. - // We could have just assigned source id numbers while traversing - // the line numbers, but doing it this way numbers the files in - // lexicographical order by name, which is neat. - int next_source_id = 0; - for (FileByNameMap::iterator file_it = files_.begin(); - file_it != files_.end(); file_it++) - if (! file_it->second->source_id) - file_it->second->source_id = next_source_id++; -} - -bool Module::ReportError() { - fprintf(stderr, "error writing symbol file: %s\n", - strerror (errno)); - return false; -} - -bool Module::Write(FILE *stream) { - if (0 > fprintf(stream, "MODULE %s %s %s %s\n", - os_.c_str(), architecture_.c_str(), id_.c_str(), - name_.c_str())) - return ReportError(); - - AssignSourceIds(); - - // Write out files. - for (FileByNameMap::iterator file_it = files_.begin(); - file_it != files_.end(); file_it++) { - File *file = file_it->second; - if (file->source_id >= 0) { - if (0 > fprintf(stream, "FILE %d %s\n", - file->source_id, file->name.c_str())) - return ReportError(); - } - } - - // Write out functions and their lines. - for (vector::const_iterator func_it = functions_.begin(); - func_it != functions_.end(); func_it++) { - Function *func = *func_it; - if (0 > fprintf(stream, "FUNC %llx %llx %llx %s\n", - (unsigned long long) (func->address - load_address_), - (unsigned long long) func->size, - (unsigned long long) func->parameter_size, - func->name.c_str())) - return ReportError(); - for (vector::iterator line_it = func->lines.begin(); - line_it != func->lines.end(); line_it++) - if (0 > fprintf(stream, "%llx %llx %d %d\n", - (unsigned long long) (line_it->address - load_address_), - (unsigned long long) line_it->size, - line_it->number, - line_it->file->source_id)) - return ReportError(); - } - - return true; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/module.h b/share/google-breakpad/src/common/linux/module.h deleted file mode 100644 index eeda305e10c9c950fef85956f1f362d8bf08588a..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/module.h +++ /dev/null @@ -1,215 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// module.h: Define google_breakpad::Module. A Module holds debugging -// information, and can write that information out as a Breakpad -// symbol file. - -#ifndef COMMON_LINUX_MODULE_H__ -#define COMMON_LINUX_MODULE_H__ - -#include -#include -#include -#include - -#include "google_breakpad/common/breakpad_types.h" - -namespace google_breakpad { - -using std::string; -using std::vector; -using std::map; - -// A Module represents the contents of a module, and supports methods -// for adding information produced by parsing STABS or DWARF data -// --- possibly both from the same file --- and then writing out the -// unified contents as a Breakpad-format symbol file. -class Module { - public: - // The type of addresses and sizes in a symbol table. - typedef u_int64_t Address; - struct File; - struct Function; - struct Line; - - // Addresses appearing in File, Function, and Line structures are - // absolute, not relative to the the module's load address. That - // is, if the module were loaded at its nominal load address, the - // addresses would be correct. - - // A source file. - struct File { - // The name of the source file. - string name; - - // The file's source id. The Write member function clears this - // field and assigns source ids a fresh, so any value placed here - // before calling Write will be lost. - int source_id; - }; - - // A function. - struct Function { - // For sorting by address. (Not style-guide compliant, but it's - // stupid not to put this in the struct.) - static bool CompareByAddress(const Function *x, const Function *y) { - return x->address < y->address; - } - - // The function's name. - string name; - - // The start address and length of the function's code. - Address address, size; - - // The function's parameter size. - Address parameter_size; - - // Source lines belonging to this function, sorted by increasing - // address. - vector lines; - }; - - // A source line. - struct Line { - // For sorting by address. (Not style-guide compliant, but it's - // stupid not to put this in the struct.) - static bool CompareByAddress(const Module::Line &x, const Module::Line &y) { - return x.address < y.address; - } - - Address address, size; // The address and size of the line's code. - File *file; // The source file. - int number; // The source line number. - }; - - // Create a new module with the given name, operating system, - // architecture, and ID string. - Module(const string &name, const string &os, const string &architecture, - const string &id); - ~Module(); - - // Set the module's load address to LOAD_ADDRESS; addresses given - // for functions and lines will be written to the Breakpad symbol - // file as offsets from this address. Construction initializes this - // module's load address to zero: addresses written to the symbol - // file will be the same as they appear in the File and Line - // structures. - void SetLoadAddress(Address load_address); - - // Add FUNCTION to the module. - // This module owns all Function objects added with this function: - // destroying the module destroys them as well. - void AddFunction(Function *function); - - // Add all the functions in [BEGIN,END) to the module. - // This module owns all Function objects added with this function: - // destroying the module destroys them as well. - void AddFunctions(vector::iterator begin, - vector::iterator end); - - // If this module has a file named NAME, return a pointer to it. If - // it has none, then create one and return a pointer to the new - // file. This module owns all File objects created using these - // functions; destroying the module destroys them as well. - File *FindFile(const string &name); - File *FindFile(const char *name); - - // If this module has a file named NAME, return a pointer to it. - // Otherwise, return NULL. - File *FindExistingFile(const string &name); - - // Insert pointers to the functions added to this module at I in - // VEC. (Since this is effectively a copy of the function list, this - // is mostly useful for testing; other uses should probably get a - // more appropriate interface.) - void GetFunctions(vector *vec, vector::iterator i); - - // Clear VEC and fill it with pointers to the Files added to this - // module, sorted by name. (Since this is effectively a copy of the - // function list, this is mostly useful for testing; other uses - // should probably get a more appropriate interface.) - void GetFiles(vector *vec); - - // Find those files in this module that are actually referred to by - // functions' line number data, and assign them source id numbers. - // Set the source id numbers for all other files --- unused by the - // source line data --- to -1. We do this before writing out the - // symbol file, at which point we omit any unused files. - void AssignSourceIds(); - - // Call AssignSourceIds, and write this module to STREAM in the - // breakpad symbol format. Return true if all goes well, or false if - // an error occurs. This method writes out: - // - a header based on the values given to the constructor, - // - the source files added via FindFile, and finally - // - the functions added via AddFunctions, each with its lines. - // Addresses in the output are all relative to the load address - // established by SetLoadAddress. - bool Write(FILE *stream); - -private: - - // Report an error that has occurred writing the symbol file, using - // errno to find the appropriate cause. Return false. - static bool ReportError(); - - // Module header entries. - string name_, os_, architecture_, id_; - - // The module's nominal load address. Addresses for functions and - // lines are absolute, assuming the module is loaded at this - // address. - Address load_address_; - - // Relation for maps whose keys are strings shared with some other - // structure. - struct CompareStringPtrs { - bool operator()(const string *x, const string *y) { return *x < *y; }; - }; - - // A map from filenames to File structures. The map's keys are - // pointers to the Files' names. - typedef map FileByNameMap; - - // The module owns all the files and functions that have been added - // to it; destroying the module frees the Files and Functions these - // point to. - FileByNameMap files_; // This module's source files. - vector functions_; // This module's functions. -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_MODULE_H__ diff --git a/share/google-breakpad/src/common/linux/stabs_reader.cc b/share/google-breakpad/src/common/linux/stabs_reader.cc deleted file mode 100644 index e8341d303ac2822463c8ae28c70f50131c37b518..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/stabs_reader.cc +++ /dev/null @@ -1,220 +0,0 @@ -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// This file implements the google_breakpad::StabsReader class. -// See stabs_reader.h. - -#include -#include -#include -#include - -#include "common/linux/stabs_reader.h" - -namespace google_breakpad { - -StabsReader::StabsReader(const uint8_t *stab, size_t stab_size, - const uint8_t *stabstr, size_t stabstr_size, - StabsHandler *handler) : - stabstr_(stabstr), - stabstr_size_(stabstr_size), - handler_(handler), - string_offset_(0), - next_cu_string_offset_(0), - symbol_(NULL), - current_source_file_(NULL) { - symbols_ = reinterpret_cast(stab); - symbols_end_ = symbols_ + (stab_size / sizeof (*symbols_)); -} - -const char *StabsReader::SymbolString() { - ptrdiff_t offset = string_offset_ + symbol_->n_un.n_strx; - if (offset < 0 || (size_t) offset >= stabstr_size_) { - handler_->Warning("symbol %d: name offset outside the string section", - symbol_ - symbols_); - // Return our null string, to keep our promise about all names being - // taken from the string section. - offset = 0; - } - return reinterpret_cast(stabstr_ + offset); -} - -bool StabsReader::Process() { - symbol_ = symbols_; - while (symbol_ < symbols_end_) { - if (symbol_->n_type == N_SO) { - if (! ProcessCompilationUnit()) - return false; - } else if (symbol_->n_type == N_UNDF) { - // At the head of each compilation unit's entries there is an - // N_UNDF stab giving the number of symbols in the compilation - // unit, and the number of bytes that compilation unit's strings - // take up in the .stabstr section. Each CU's strings are - // separate; the n_strx values are offsets within the current - // CU's portion of the .stabstr section. - // - // As an optimization, the GNU linker combines all the - // compilation units into one, with a single N_UNDF at the - // beginning. However, other linkers, like Gold, do not perform - // this optimization. - string_offset_ = next_cu_string_offset_; - next_cu_string_offset_ = SymbolValue(); - symbol_++; - } else - symbol_++; - } - return true; -} - -bool StabsReader::ProcessCompilationUnit() { - assert(symbol_ < symbols_end_ && symbol_->n_type == N_SO); - - // There may be an N_SO entry whose name ends with a slash, - // indicating the directory in which the compilation occurred. - // The build directory defaults to NULL. - const char *build_directory = NULL; - { - const char *name = SymbolString(); - if (name[0] && name[strlen(name) - 1] == '/') { - build_directory = name; - symbol_++; - } - } - - // We expect to see an N_SO entry with a filename next, indicating - // the start of the compilation unit. - { - if (symbol_ >= symbols_end_ || symbol_->n_type != N_SO) - return true; - const char *name = SymbolString(); - if (name[0] == '\0') { - // This seems to be a stray end-of-compilation-unit marker; - // consume it, but don't report the end, since we didn't see a - // beginning. - symbol_++; - return true; - } - current_source_file_ = name; - } - - if (! handler_->StartCompilationUnit(current_source_file_, - SymbolValue(), - build_directory)) - return false; - - symbol_++; - - // The STABS documentation says that some compilers may emit - // additional N_SO entries with names immediately following the - // first, and that they should be ignored. However, the original - // Breakpad STABS reader doesn't ignore them, so we won't either. - - // Process the body of the compilation unit, up to the next N_SO. - while (symbol_ < symbols_end_ && symbol_->n_type != N_SO) { - if (symbol_->n_type == N_FUN) { - if (! ProcessFunction()) - return false; - } else - // Ignore anything else. - symbol_++; - } - - // An N_SO with an empty name indicates the end of the compilation - // unit. Default to zero. - uint64_t ending_address = 0; - if (symbol_ < symbols_end_) { - assert(symbol_->n_type == N_SO); - const char *name = SymbolString(); - if (name[0] == '\0') { - ending_address = SymbolValue(); - symbol_++; - } - } - - if (! handler_->EndCompilationUnit(ending_address)) - return false; - - return true; -} - -bool StabsReader::ProcessFunction() { - assert(symbol_ < symbols_end_ && symbol_->n_type == N_FUN); - - uint64_t function_address = SymbolValue(); - // The STABS string for an N_FUN entry is the name of the function, - // followed by a colon, followed by type information for the - // function. We want to pass the name alone to StartFunction. - const char *stab_string = SymbolString(); - const char *name_end = strchr(stab_string, ':'); - if (! name_end) - name_end = stab_string + strlen(stab_string); - std::string name(stab_string, name_end - stab_string); - if (! handler_->StartFunction(name, function_address)) - return false; - symbol_++; - - while (symbol_ < symbols_end_) { - if (symbol_->n_type == N_SO || symbol_->n_type == N_FUN) - break; - else if (symbol_->n_type == N_SLINE) { - // The value of an N_SLINE entry is the offset of the line from - // the function's start address. - uint64_t line_address = function_address + SymbolValue(); - // The n_desc of a N_SLINE entry is the line number. It's a - // signed 16-bit field; line numbers from 32768 to 65535 are - // stored as n-65536. - uint16_t line_number = symbol_->n_desc; - if (! handler_->Line(line_address, current_source_file_, line_number)) - return false; - symbol_++; - } else if (symbol_->n_type == N_SOL) { - current_source_file_ = SymbolString(); - symbol_++; - } else - // Ignore anything else. - symbol_++; - } - - // If there is a subsequent N_SO or N_FUN entry, its address is our - // end address. - uint64_t ending_address = 0; - if (symbol_ < symbols_end_) { - assert(symbol_->n_type == N_SO || symbol_->n_type == N_FUN); - ending_address = SymbolValue(); - // Note: we do not increment symbol_ here, since we haven't consumed it. - } - - if (! handler_->EndFunction(ending_address)) - return false; - - return true; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/linux/stabs_reader.h b/share/google-breakpad/src/common/linux/stabs_reader.h deleted file mode 100644 index 5cfcdfb5ef8f52515887004efa5ff1103b835fcb..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/linux/stabs_reader.h +++ /dev/null @@ -1,206 +0,0 @@ -// -*- mode: c++ -*- - -// Copyright (c) 2010 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. - -// Original author: Jim Blandy - -// stabs_reader.h: Define StabsReader, a parser for STABS debugging -// information. A description of the STABS debugging format can be -// found at: -// -// http://sourceware.org/gdb/current/onlinedocs/stabs_toc.html -// -// The comments here assume you understand the format. -// -// This parser assumes that the system's and -// headers accurately describe the layout of the STABS data; this code -// will not parse STABS data for a system with a different address -// size or endianness. - -#ifndef COMMON_LINUX_STABS_READER_H__ -#define COMMON_LINUX_STABS_READER_H__ - -#include -#include -#include - -#include - -namespace google_breakpad { - -class StabsHandler; - -class StabsReader { - public: - // Create a reader for the STABS debug information whose .stab - // section is the STAB_SIZE bytes at STAB, and whose .stabstr - // section is the STABSTR_SIZE bytes at STABSTR. The reader will - // call the member functions of HANDLER to report the information it - // finds, when the reader's 'Process' member function is called. - // - // Note that, in ELF, the .stabstr section should be found using the - // 'sh_link' field of the .stab section header, not by name. - StabsReader(const uint8_t *stab, size_t stab_size, - const uint8_t *stabstr, size_t stabstr_size, - StabsHandler *handler); - - // Process the STABS data, calling the handler's member functions to - // report what we find. While the handler functions return true, - // continue to process until we reach the end of the section. If we - // processed the entire section and all handlers returned true, - // return true. If any handler returned false, return false. - bool Process(); - - private: - // Return the name of the current symbol. - const char *SymbolString(); - - // Return the value of the current symbol. - const uint64_t SymbolValue() { - return symbol_->n_value; - } - - // Process a compilation unit starting at symbol_. Return true - // to continue processing, or false to abort. - bool ProcessCompilationUnit(); - - // Process a function in current_source_file_ starting at symbol_. - // Return true to continue processing, or false to abort. - bool ProcessFunction(); - - // The debugging information we're reading. - const struct nlist *symbols_, *symbols_end_; - const uint8_t *stabstr_; - size_t stabstr_size_; - - StabsHandler *handler_; - - // The offset of the current compilation unit's strings within stabstr_. - size_t string_offset_; - - // The value string_offset_ should have for the next compilation unit, - // as established by N_UNDF entries. - size_t next_cu_string_offset_; - - // The current symbol we're processing. - const struct nlist *symbol_; - - // The current source file name. - const char *current_source_file_; -}; - -// Consumer-provided callback structure for the STABS reader. Clients -// of the STABS reader provide an instance of this structure. The -// reader then invokes the member functions of that instance to report -// the information it finds. -// -// The default definitions of the member functions do nothing, and return -// true so processing will continue. -class StabsHandler { - public: - StabsHandler() { } - virtual ~StabsHandler() { } - - // Some general notes about the handler callback functions: - - // Processing proceeds until the end of the .stabs section, or until - // one of these functions returns false. - - // The addresses given are as reported in the STABS info, without - // regard for whether the module may be loaded at different - // addresses at different times (a shared library, say). When - // processing STABS from an ELF shared library, the addresses given - // all assume the library is loaded at its nominal load address. - // They are *not* offsets from the nominal load address. If you - // want offsets, you must subtract off the library's nominal load - // address. - - // The arguments to these functions named FILENAME are all - // references to strings stored in the .stabstr section. Because - // both the Linux and Solaris linkers factor out duplicate strings - // from the .stabstr section, the consumer can assume that if two - // FILENAME values are different addresses, they represent different - // file names. - // - // Thus, it's safe to use (say) std::map, which does - // string address comparisons, not string content comparisons. - // Since all the strings are in same array of characters --- the - // .stabstr section --- comparing their addresses produces - // predictable, if not lexicographically meaningful, results. - - // Begin processing a compilation unit whose main source file is - // named FILENAME, and whose base address is ADDRESS. If - // BUILD_DIRECTORY is non-NULL, it is the name of the build - // directory in which the compilation occurred. - virtual bool StartCompilationUnit(const char *filename, uint64_t address, - const char *build_directory) { - return true; - } - - // Finish processing the compilation unit. If ADDRESS is non-zero, - // it is the ending address of the compilation unit. If ADDRESS is - // zero, then the compilation unit's ending address is not - // available, and the consumer must infer it by other means. - virtual bool EndCompilationUnit(uint64_t address) { return true; } - - // Begin processing a function named NAME, whose starting address is - // ADDRESS. This function belongs to the compilation unit that was - // most recently started but not ended. - // - // Note that, unlike filenames, NAME is not a pointer into the - // .stabstr section; this is because the name as it appears in the - // STABS data is followed by type information. The value passed to - // StartFunction is the function name alone. - // - // In languages that use name mangling, like C++, NAME is mangled. - virtual bool StartFunction(const std::string &name, uint64_t address) { - return true; - } - - // Finish processing the function. If ADDRESS is non-zero, it is - // the ending address for the function. If ADDRESS is zero, then - // the function's ending address is not available, and the consumer - // must infer it by other means. - virtual bool EndFunction(uint64_t address) { return true; } - - // Report that the code at ADDRESS is attributable to line NUMBER of - // the source file named FILENAME. The caller must infer the ending - // address of the line. - virtual bool Line(uint64_t address, const char *filename, int number) { - return true; - } - - // Report a warning. FORMAT is a printf-like format string, - // specifying how to format the subsequent arguments. - virtual void Warning(const char *format, ...) = 0; -}; - -} // namespace google_breakpad - -#endif // COMMON_LINUX_STABS_READER_H__ diff --git a/share/google-breakpad/src/common/md5.c b/share/google-breakpad/src/common/md5.c deleted file mode 100644 index 7fc198afe8fa570b68ab506b4803a36fdc78a165..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/md5.c +++ /dev/null @@ -1,246 +0,0 @@ -/* - * written by Colin Plumb in 1993, no copyright is claimed. - * This code is in the public domain; do with it what you wish. - * - * Equivalent code is available from RSA Data Security, Inc. - * This code has been tested against that, and is equivalent, - * except that you don't need to include two pages of legalese - * with every copy. - * - * To compute the message digest of a chunk of bytes, declare an - * MD5Context structure, pass it to MD5Init, call MD5Update as - * needed on buffers full of bytes, and then call MD5Final, which - * will fill a supplied 16-byte array with the digest. - */ - -#include - -#include "common/md5.h" - -#ifndef WORDS_BIGENDIAN -#define byteReverse(buf, len) /* Nothing */ -#else -/* - * Note: this code is harmless on little-endian machines. - */ -static void byteReverse(unsigned char *buf, unsigned longs) -{ - u32 t; - do { - t = (u32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | - ((unsigned) buf[1] << 8 | buf[0]); - *(u32 *) buf = t; - buf += 4; - } while (--longs); -} -#endif - -static void MD5Transform(u32 buf[4], u32 const in[16]); - -/* - * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious - * initialization constants. - */ -void MD5Init(struct MD5Context *ctx) -{ - ctx->buf[0] = 0x67452301; - ctx->buf[1] = 0xefcdab89; - ctx->buf[2] = 0x98badcfe; - ctx->buf[3] = 0x10325476; - - ctx->bits[0] = 0; - ctx->bits[1] = 0; -} - -/* - * Update context to reflect the concatenation of another buffer full - * of bytes. - */ -void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len) -{ - u32 t; - - /* Update bitcount */ - - t = ctx->bits[0]; - if ((ctx->bits[0] = t + ((u32) len << 3)) < t) - ctx->bits[1]++; /* Carry from low to high */ - ctx->bits[1] += len >> 29; - - t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ - - /* Handle any leading odd-sized chunks */ - - if (t) { - unsigned char *p = (unsigned char *) ctx->in + t; - - t = 64 - t; - if (len < t) { - memcpy(p, buf, len); - return; - } - memcpy(p, buf, t); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (u32 *) ctx->in); - buf += t; - len -= t; - } - /* Process data in 64-byte chunks */ - - while (len >= 64) { - memcpy(ctx->in, buf, 64); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (u32 *) ctx->in); - buf += 64; - len -= 64; - } - - /* Handle any remaining bytes of data. */ - - memcpy(ctx->in, buf, len); -} - -/* - * Final wrapup - pad to 64-byte boundary with the bit pattern - * 1 0* (64-bit count of bits processed, MSB-first) - */ -void MD5Final(unsigned char digest[16], struct MD5Context *ctx) -{ - unsigned count; - unsigned char *p; - - /* Compute number of bytes mod 64 */ - count = (ctx->bits[0] >> 3) & 0x3F; - - /* Set the first char of padding to 0x80. This is safe since there is - always at least one byte free */ - p = ctx->in + count; - *p++ = 0x80; - - /* Bytes of padding needed to make 64 bytes */ - count = 64 - 1 - count; - - /* Pad out to 56 mod 64 */ - if (count < 8) { - /* Two lots of padding: Pad the first block to 64 bytes */ - memset(p, 0, count); - byteReverse(ctx->in, 16); - MD5Transform(ctx->buf, (u32 *) ctx->in); - - /* Now fill the next block with 56 bytes */ - memset(ctx->in, 0, 56); - } else { - /* Pad block to 56 bytes */ - memset(p, 0, count - 8); - } - byteReverse(ctx->in, 14); - - /* Append length in bits and transform */ - ((u32 *) ctx->in)[14] = ctx->bits[0]; - ((u32 *) ctx->in)[15] = ctx->bits[1]; - - MD5Transform(ctx->buf, (u32 *) ctx->in); - byteReverse((unsigned char *) ctx->buf, 4); - memcpy(digest, ctx->buf, 16); - memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ -} - -/* The four core functions - F1 is optimized somewhat */ - -/* #define F1(x, y, z) (x & y | ~x & z) */ -#define F1(x, y, z) (z ^ (x & (y ^ z))) -#define F2(x, y, z) F1(z, x, y) -#define F3(x, y, z) (x ^ y ^ z) -#define F4(x, y, z) (y ^ (x | ~z)) - -/* This is the central step in the MD5 algorithm. */ -#define MD5STEP(f, w, x, y, z, data, s) \ - ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) - -/* - * The core of the MD5 algorithm, this alters an existing MD5 hash to - * reflect the addition of 16 longwords of new data. MD5Update blocks - * the data and converts bytes into longwords for this routine. - */ -static void MD5Transform(u32 buf[4], u32 const in[16]) -{ - register u32 a, b, c, d; - - a = buf[0]; - b = buf[1]; - c = buf[2]; - d = buf[3]; - - MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); - MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); - MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); - MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); - MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); - MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); - MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); - MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); - MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); - MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); - MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); - MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); - MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); - MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); - MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); - MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); - - MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); - MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); - MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); - MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); - MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); - MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); - MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); - MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); - MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); - MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); - MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); - MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); - MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); - MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); - MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); - MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); - - MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); - MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); - MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); - MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); - MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); - MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); - MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); - MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); - MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); - MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); - MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); - MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); - MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); - MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); - MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); - MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); - - MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); - MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); - MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); - MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); - MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); - MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); - MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); - MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); - MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); - MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); - MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); - MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); - MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); - MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); - MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); - MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); - - buf[0] += a; - buf[1] += b; - buf[2] += c; - buf[3] += d; -} diff --git a/share/google-breakpad/src/common/md5.h b/share/google-breakpad/src/common/md5.h deleted file mode 100644 index dbf4893cd9a598531cf651b608a97aa1465957dc..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/md5.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2007 Google Inc. All Rights Reserved. -// Author: liuli@google.com (Liu Li) -#ifndef COMMON_MD5_H__ -#define COMMON_MD5_H__ - -#include - -typedef uint32_t u32; -typedef uint8_t u8; - -struct MD5Context { - u32 buf[4]; - u32 bits[2]; - u8 in[64]; -}; - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -void MD5Init(struct MD5Context *ctx); - -void MD5Update(struct MD5Context *ctx, unsigned char const *buf, unsigned len); - -void MD5Final(unsigned char digest[16], struct MD5Context *ctx); - -#ifdef __cplusplus -} -#endif - -#endif // COMMON_MD5_H__ diff --git a/share/google-breakpad/src/common/string_conversion.cc b/share/google-breakpad/src/common/string_conversion.cc deleted file mode 100644 index 50054ebc3b13f90bd9e1693245ab5fddf9959fef..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/string_conversion.cc +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright (c) 2006, 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. - -#include "common/convert_UTF.h" -#include "processor/scoped_ptr.h" -#include "common/string_conversion.h" -#include - -namespace google_breakpad { - -using std::string; -using std::vector; - -void UTF8ToUTF16(const char *in, vector *out) { - size_t source_length = strlen(in); - const UTF8 *source_ptr = reinterpret_cast(in); - const UTF8 *source_end_ptr = source_ptr + source_length; - // Erase the contents and zero fill to the expected size - out->empty(); - out->insert(out->begin(), source_length, 0); - u_int16_t *target_ptr = &(*out)[0]; - u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t); - ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr, - &target_ptr, target_end_ptr, - strictConversion); - - // Resize to be the size of the # of converted characters + NULL - out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0); -} - -int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]) { - const UTF8 *source_ptr = reinterpret_cast(in); - const UTF8 *source_end_ptr = source_ptr + sizeof(char); - u_int16_t *target_ptr = out; - u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t); - out[0] = out[1] = 0; - - // Process one character at a time - while (1) { - ConversionResult result = ConvertUTF8toUTF16(&source_ptr, source_end_ptr, - &target_ptr, target_end_ptr, - strictConversion); - - if (result == conversionOK) - return source_ptr - reinterpret_cast(in); - - // Add another character to the input stream and try again - source_ptr = reinterpret_cast(in); - ++source_end_ptr; - - if (source_end_ptr > reinterpret_cast(in) + in_length) - break; - } - - return 0; -} - -void UTF32ToUTF16(const wchar_t *in, vector *out) { - size_t source_length = wcslen(in); - const UTF32 *source_ptr = reinterpret_cast(in); - const UTF32 *source_end_ptr = source_ptr + source_length; - // Erase the contents and zero fill to the expected size - out->empty(); - out->insert(out->begin(), source_length, 0); - u_int16_t *target_ptr = &(*out)[0]; - u_int16_t *target_end_ptr = target_ptr + out->capacity() * sizeof(u_int16_t); - ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr, - &target_ptr, target_end_ptr, - strictConversion); - - // Resize to be the size of the # of converted characters + NULL - out->resize(result == conversionOK ? target_ptr - &(*out)[0] + 1: 0); -} - -void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]) { - const UTF32 *source_ptr = reinterpret_cast(&in); - const UTF32 *source_end_ptr = source_ptr + 1; - u_int16_t *target_ptr = out; - u_int16_t *target_end_ptr = target_ptr + 2 * sizeof(u_int16_t); - out[0] = out[1] = 0; - ConversionResult result = ConvertUTF32toUTF16(&source_ptr, source_end_ptr, - &target_ptr, target_end_ptr, - strictConversion); - - if (result != conversionOK) { - out[0] = out[1] = 0; - } -} - -static inline u_int16_t Swap(u_int16_t value) { - return (value >> 8) | (value << 8); -} - -string UTF16ToUTF8(const vector &in, bool swap) { - const UTF16 *source_ptr = &in[0]; - scoped_ptr source_buffer; - - // If we're to swap, we need to make a local copy and swap each byte pair - if (swap) { - int idx = 0; - source_buffer.reset(new u_int16_t[in.size()]); - UTF16 *source_buffer_ptr = source_buffer.get(); - for (vector::const_iterator it = in.begin(); - it != in.end(); ++it, ++idx) - source_buffer_ptr[idx] = Swap(*it); - - source_ptr = source_buffer.get(); - } - - // The maximum expansion would be 4x the size of the input string. - const UTF16 *source_end_ptr = source_ptr + in.size(); - int target_capacity = in.size() * 4; - scoped_array target_buffer(new UTF8[target_capacity]); - UTF8 *target_ptr = target_buffer.get(); - UTF8 *target_end_ptr = target_ptr + target_capacity; - ConversionResult result = ConvertUTF16toUTF8(&source_ptr, source_end_ptr, - &target_ptr, target_end_ptr, - strictConversion); - - if (result == conversionOK) { - const char *targetPtr = reinterpret_cast(target_buffer.get()); - string result(targetPtr); - return result; - } - - return ""; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/string_conversion.h b/share/google-breakpad/src/common/string_conversion.h deleted file mode 100644 index d51f46bb163693eac512655483ea29c861e2a58d..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/string_conversion.h +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) 2006, 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. - -// string_conversion.h: Conversion between different UTF-8/16/32 encodings. - -#ifndef COMMON_STRING_CONVERSION_H__ -#define COMMON_STRING_CONVERSION_H__ - -#include -#include -#include "google_breakpad/common/breakpad_types.h" - -namespace google_breakpad { - -using std::vector; - -// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the -// conversion failed, |out| will be zero length. -void UTF8ToUTF16(const char *in, vector *out); - -// Convert at least one character (up to a maximum of |in_length|) from |in| -// to UTF-16 into |out|. Return the number of characters consumed from |in|. -// Any unused characters in |out| will be initialized to 0. No memory will -// be allocated by this routine. -int UTF8ToUTF16Char(const char *in, int in_length, u_int16_t out[2]); - -// Convert |in| to UTF-16 into |out|. Use platform byte ordering. If the -// conversion failed, |out| will be zero length. -void UTF32ToUTF16(const wchar_t *in, vector *out); - -// Convert |in| to UTF-16 into |out|. Any unused characters in |out| will be -// initialized to 0. No memory will be allocated by this routine. -void UTF32ToUTF16Char(wchar_t in, u_int16_t out[2]); - -// Convert |in| to UTF-8. If |swap| is true, swap bytes before converting. -std::string UTF16ToUTF8(const vector &in, bool swap); - -} // namespace google_breakpad - -#endif // COMMON_STRING_CONVERSION_H__ diff --git a/share/google-breakpad/src/common/windows/guid_string.cc b/share/google-breakpad/src/common/windows/guid_string.cc deleted file mode 100644 index b7f877e66e7e559607bee7fced7504813586347d..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/windows/guid_string.cc +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright (c) 2006, 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. - -// guid_string.cc: Convert GUIDs to strings. -// -// See guid_string.h for documentation. - -#include - -#include "common/windows/string_utils-inl.h" - -#include "common/windows/guid_string.h" - -namespace google_breakpad { - -// static -wstring GUIDString::GUIDToWString(GUID *guid) { - wchar_t guid_string[37]; - swprintf( - guid_string, sizeof(guid_string) / sizeof(guid_string[0]), - L"%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", - guid->Data1, guid->Data2, guid->Data3, - guid->Data4[0], guid->Data4[1], guid->Data4[2], - guid->Data4[3], guid->Data4[4], guid->Data4[5], - guid->Data4[6], guid->Data4[7]); - - // remove when VC++7.1 is no longer supported - guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0'; - - return wstring(guid_string); -} - -// static -wstring GUIDString::GUIDToSymbolServerWString(GUID *guid) { - wchar_t guid_string[33]; - swprintf( - guid_string, sizeof(guid_string) / sizeof(guid_string[0]), - L"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X", - guid->Data1, guid->Data2, guid->Data3, - guid->Data4[0], guid->Data4[1], guid->Data4[2], - guid->Data4[3], guid->Data4[4], guid->Data4[5], - guid->Data4[6], guid->Data4[7]); - - // remove when VC++7.1 is no longer supported - guid_string[sizeof(guid_string) / sizeof(guid_string[0]) - 1] = L'\0'; - - return wstring(guid_string); -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/common/windows/guid_string.h b/share/google-breakpad/src/common/windows/guid_string.h deleted file mode 100644 index f8aa8a23135284f4fb0e7708a2af0c9b12550cd8..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/windows/guid_string.h +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) 2006, 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. - -// guid_string.cc: Convert GUIDs to strings. - -#ifndef COMMON_WINDOWS_GUID_STRING_H__ -#define COMMON_WINDOWS_GUID_STRING_H__ - -#include - -#include - -namespace google_breakpad { - -using std::wstring; - -class GUIDString { - public: - // Converts guid to a string in the format recommended by RFC 4122 and - // returns the string. - static wstring GUIDToWString(GUID *guid); - - // Converts guid to a string formatted as uppercase hexadecimal, with - // no separators, and returns the string. This is the format used for - // symbol server identifiers, although identifiers have an age tacked - // on to the string. - static wstring GUIDToSymbolServerWString(GUID *guid); -}; - -} // namespace google_breakpad - -#endif // COMMON_WINDOWS_GUID_STRING_H__ diff --git a/share/google-breakpad/src/common/windows/string_utils-inl.h b/share/google-breakpad/src/common/windows/string_utils-inl.h deleted file mode 100644 index 6f650812201cf7e5139e998de955d9998f4d45ff..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/windows/string_utils-inl.h +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright (c) 2006, 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. - -// string_utils-inl.h: Safer string manipulation on Windows, supporting -// pre-MSVC8 environments. - -#ifndef COMMON_WINDOWS_STRING_UTILS_INL_H__ -#define COMMON_WINDOWS_STRING_UTILS_INL_H__ - -#include -#include - -#include - -// The "ll" printf format size specifier corresponding to |long long| was -// intrudced in MSVC8. Earlier versions did not provide this size specifier, -// but "I64" can be used to print 64-bit types. Don't use "I64" where "ll" -// is available, in the event of oddball systems where |long long| is not -// 64 bits wide. -#if _MSC_VER >= 1400 // MSVC 2005/8 -#define WIN_STRING_FORMAT_LL "ll" -#else // MSC_VER >= 1400 -#define WIN_STRING_FORMAT_LL "I64" -#endif // MSC_VER >= 1400 - -// A nonconforming version of swprintf, without the length argument, was -// included with the CRT prior to MSVC8. Although a conforming version was -// also available via an overload, it is not reliably chosen. _snwprintf -// behaves as a standards-confirming swprintf should, so force the use of -// _snwprintf when using older CRTs. -#if _MSC_VER < 1400 // MSVC 2005/8 -#define swprintf _snwprintf -#else -// For MSVC8 and newer, swprintf_s is the recommended method. Conveniently, -// it takes the same argument list as swprintf. -#define swprintf swprintf_s -#endif // MSC_VER < 1400 - -namespace google_breakpad { - -using std::string; -using std::wstring; - -class WindowsStringUtils { - public: - // Roughly equivalent to MSVC8's wcscpy_s, except pre-MSVC8, this does - // not fail if source is longer than destination_size. The destination - // buffer is always 0-terminated. - static void safe_wcscpy(wchar_t *destination, size_t destination_size, - const wchar_t *source); - - // Roughly equivalent to MSVC8's wcsncpy_s, except that _TRUNCATE cannot - // be passed directly, and pre-MSVC8, this will not fail if source or count - // are longer than destination_size. The destination buffer is always - // 0-terminated. - static void safe_wcsncpy(wchar_t *destination, size_t destination_size, - const wchar_t *source, size_t count); - - // Performs multi-byte to wide character conversion on C++ strings, using - // mbstowcs_s (MSVC8) or mbstowcs (pre-MSVC8). Returns false on failure, - // without setting wcs. - static bool safe_mbstowcs(const string &mbs, wstring *wcs); - - // Returns the base name of a file, e.g. strips off the path. - static wstring GetBaseName(const wstring &filename); - - private: - // Disallow instantiation and other object-based operations. - WindowsStringUtils(); - WindowsStringUtils(const WindowsStringUtils&); - ~WindowsStringUtils(); - void operator=(const WindowsStringUtils&); -}; - -// static -inline void WindowsStringUtils::safe_wcscpy(wchar_t *destination, - size_t destination_size, - const wchar_t *source) { -#if _MSC_VER >= 1400 // MSVC 2005/8 - wcscpy_s(destination, destination_size, source); -#else // _MSC_VER >= 1400 - // Pre-MSVC 2005/8 doesn't have wcscpy_s. Simulate it with wcsncpy. - // wcsncpy doesn't 0-terminate the destination buffer if the source string - // is longer than size. Ensure that the destination is 0-terminated. - wcsncpy(destination, source, destination_size); - if (destination && destination_size) - destination[destination_size - 1] = 0; -#endif // _MSC_VER >= 1400 -} - -// static -inline void WindowsStringUtils::safe_wcsncpy(wchar_t *destination, - size_t destination_size, - const wchar_t *source, - size_t count) { -#if _MSC_VER >= 1400 // MSVC 2005/8 - wcsncpy_s(destination, destination_size, source, count); -#else // _MSC_VER >= 1400 - // Pre-MSVC 2005/8 doesn't have wcsncpy_s. Simulate it with wcsncpy. - // wcsncpy doesn't 0-terminate the destination buffer if the source string - // is longer than size. Ensure that the destination is 0-terminated. - if (destination_size < count) - count = destination_size; - - wcsncpy(destination, source, count); - if (destination && count) - destination[count - 1] = 0; -#endif // _MSC_VER >= 1400 -} - -} // namespace google_breakpad - -#endif // COMMON_WINDOWS_STRING_UTILS_INL_H__ diff --git a/share/google-breakpad/src/common/windows/string_utils.cc b/share/google-breakpad/src/common/windows/string_utils.cc deleted file mode 100644 index 5d4648022927e0a3c9dc7b2900b0df1678c07fad..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/common/windows/string_utils.cc +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright (c) 2006, 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. - -#include - -#include "common/windows/string_utils-inl.h" - -namespace google_breakpad { - -// static -wstring WindowsStringUtils::GetBaseName(const wstring &filename) { - wstring base_name(filename); - size_t slash_pos = base_name.find_last_of(L"/\\"); - if (slash_pos != wstring::npos) { - base_name.erase(0, slash_pos + 1); - } - return base_name; -} - -// static -bool WindowsStringUtils::safe_mbstowcs(const string &mbs, wstring *wcs) { - assert(wcs); - - // First, determine the length of the destination buffer. - size_t wcs_length; - -#if _MSC_VER >= 1400 // MSVC 2005/8 - errno_t err; - if ((err = mbstowcs_s(&wcs_length, NULL, 0, mbs.c_str(), _TRUNCATE)) != 0) { - return false; - } -#else // _MSC_VER >= 1400 - if ((wcs_length = mbstowcs(NULL, mbs.c_str(), mbs.length())) < 0) { - return false; - } - - // Leave space for the 0-terminator. - ++wcs_length; -#endif // _MSC_VER >= 1400 - - // TODO(mmentovai): move scoped_ptr into common and use it for wcs_c. - wchar_t *wcs_c = new wchar_t[wcs_length]; - - // Now, convert. -#if _MSC_VER >= 1400 // MSVC 2005/8 - if ((err = mbstowcs_s(NULL, wcs_c, wcs_length, mbs.c_str(), - _TRUNCATE)) != 0) { - delete[] wcs_c; - return false; - } -#else // _MSC_VER >= 1400 - if (mbstowcs(wcs_c, mbs.c_str(), mbs.length()) < 0) { - delete[] wcs_c; - return false; - } - - // Ensure presence of 0-terminator. - wcs_c[wcs_length - 1] = '\0'; -#endif // _MSC_VER >= 1400 - - *wcs = wcs_c; - delete[] wcs_c; - return true; -} - -} // namespace google_breakpad diff --git a/share/google-breakpad/src/google_breakpad/common/breakpad_types.h b/share/google-breakpad/src/google_breakpad/common/breakpad_types.h deleted file mode 100644 index 926b47f2abdab629ab526d950218a596e63a81ee..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/breakpad_types.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* breakpad_types.h: Precise-width types - * - * (This is C99 source, please don't corrupt it with C++.) - * - * This file ensures that types u_intN_t are defined for N = 8, 16, 32, and - * 64. Types of precise widths are crucial to the task of writing data - * structures on one platform and reading them on another. - * - * Author: Mark Mentovai */ - -#ifndef GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ -#define GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ - -#ifndef _WIN32 - -#include -#ifndef __STDC_FORMAT_MACROS -#define __STDC_FORMAT_MACROS -#endif /* __STDC_FORMAT_MACROS */ -#include - -#if defined(__SUNPRO_CC) || (defined(__GNUC__) && defined(__sun__)) -typedef uint8_t u_int8_t; -typedef uint16_t u_int16_t; -typedef uint32_t u_int32_t; -typedef uint64_t u_int64_t; -#endif - -#else /* !_WIN32 */ - -#include - -typedef unsigned __int8 u_int8_t; -typedef unsigned __int16 u_int16_t; -typedef unsigned __int32 u_int32_t; -typedef unsigned __int64 u_int64_t; - -#endif /* !_WIN32 */ - -typedef struct { - u_int64_t high; - u_int64_t low; -} u_int128_t; - -typedef u_int64_t breakpad_time_t; - -/* Try to get PRIx64 from inttypes.h, but if it's not defined, fall back to - * llx, which is the format string for "long long" - this is a 64-bit - * integral type on many systems. */ -#ifndef PRIx64 -#define PRIx64 "llx" -#endif /* !PRIx64 */ - -#endif /* GOOGLE_BREAKPAD_COMMON_BREAKPAD_TYPES_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_amd64.h b/share/google-breakpad/src/google_breakpad/common/minidump_cpu_amd64.h deleted file mode 100644 index 75dae7dd73085120cf9069fff38cdddd36f5200d..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_amd64.h +++ /dev/null @@ -1,231 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_format.h: A cross-platform reimplementation of minidump-related - * portions of DbgHelp.h from the Windows Platform SDK. - * - * (This is C99 source, please don't corrupt it with C++.) - * - * This file contains the necessary definitions to read minidump files - * produced on amd64. These files may be read on any platform provided - * that the alignments of these structures on the processing system are - * identical to the alignments of these structures on the producing system. - * For this reason, precise-sized types are used. The structures defined - * by this file have been laid out to minimize alignment problems by ensuring - * ensuring that all members are aligned on their natural boundaries. In - * In some cases, tail-padding may be significant when different ABIs specify - * different tail-padding behaviors. To avoid problems when reading or - * writing affected structures, MD_*_SIZE macros are provided where needed, - * containing the useful size of the structures without padding. - * - * Structures that are defined by Microsoft to contain a zero-length array - * are instead defined here to contain an array with one element, as - * zero-length arrays are forbidden by standard C and C++. In these cases, - * *_minsize constants are provided to be used in place of sizeof. For a - * cleaner interface to these sizes when using C++, see minidump_size.h. - * - * These structures are also sufficient to populate minidump files. - * - * These definitions may be extended to support handling minidump files - * for other CPUs and other operating systems. - * - * Because precise data type sizes are crucial for this implementation to - * function properly and portably in terms of interoperability with minidumps - * produced by DbgHelp on Windows, a set of primitive types with known sizes - * are used as the basis of each structure defined by this file. DbgHelp - * on Windows is assumed to be the reference implementation; this file - * seeks to provide a cross-platform compatible implementation. To avoid - * collisions with the types and values defined and used by DbgHelp in the - * event that this implementation is used on Windows, each type and value - * defined here is given a new name, beginning with "MD". Names of the - * equivalent types and values in the Windows Platform SDK are given in - * comments. - * - * Author: Mark Mentovai - * Change to split into its own file: Neal Sidhwaney */ - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ - - -/* - * AMD64 support, see WINNT.H - */ - -typedef struct { - u_int16_t control_word; - u_int16_t status_word; - u_int8_t tag_word; - u_int8_t reserved1; - u_int16_t error_opcode; - u_int32_t error_offset; - u_int16_t error_selector; - u_int16_t reserved2; - u_int32_t data_offset; - u_int16_t data_selector; - u_int16_t reserved3; - u_int32_t mx_csr; - u_int32_t mx_csr_mask; - u_int128_t float_registers[8]; - u_int128_t xmm_registers[16]; - u_int8_t reserved4[96]; -} MDXmmSaveArea32AMD64; /* XMM_SAVE_AREA32 */ - -#define MD_CONTEXT_AMD64_VR_COUNT 26 - -typedef struct { - /* - * Register parameter home addresses. - */ - u_int64_t p1_home; - u_int64_t p2_home; - u_int64_t p3_home; - u_int64_t p4_home; - u_int64_t p5_home; - u_int64_t p6_home; - - /* The next field determines the layout of the structure, and which parts - * of it are populated */ - u_int32_t context_flags; - u_int32_t mx_csr; - - /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ - u_int16_t cs; - - /* The next 4 registers are included with MD_CONTEXT_AMD64_SEGMENTS */ - u_int16_t ds; - u_int16_t es; - u_int16_t fs; - u_int16_t gs; - - /* The next 2 registers are included with MD_CONTEXT_AMD64_CONTROL */ - u_int16_t ss; - u_int32_t eflags; - - /* The next 6 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ - u_int64_t dr0; - u_int64_t dr1; - u_int64_t dr2; - u_int64_t dr3; - u_int64_t dr6; - u_int64_t dr7; - - /* The next 4 registers are included with MD_CONTEXT_AMD64_INTEGER */ - u_int64_t rax; - u_int64_t rcx; - u_int64_t rdx; - u_int64_t rbx; - - /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ - u_int64_t rsp; - - /* The next 11 registers are included with MD_CONTEXT_AMD64_INTEGER */ - u_int64_t rbp; - u_int64_t rsi; - u_int64_t rdi; - u_int64_t r8; - u_int64_t r9; - u_int64_t r10; - u_int64_t r11; - u_int64_t r12; - u_int64_t r13; - u_int64_t r14; - u_int64_t r15; - - /* The next register is included with MD_CONTEXT_AMD64_CONTROL */ - u_int64_t rip; - - /* The next set of registers are included with - * MD_CONTEXT_AMD64_FLOATING_POINT - */ - union { - MDXmmSaveArea32AMD64 flt_save; - struct { - u_int128_t header[2]; - u_int128_t legacy[8]; - u_int128_t xmm0; - u_int128_t xmm1; - u_int128_t xmm2; - u_int128_t xmm3; - u_int128_t xmm4; - u_int128_t xmm5; - u_int128_t xmm6; - u_int128_t xmm7; - u_int128_t xmm8; - u_int128_t xmm9; - u_int128_t xmm10; - u_int128_t xmm11; - u_int128_t xmm12; - u_int128_t xmm13; - u_int128_t xmm14; - u_int128_t xmm15; - } sse_registers; - }; - - u_int128_t vector_register[MD_CONTEXT_AMD64_VR_COUNT]; - u_int64_t vector_control; - - /* The next 5 registers are included with MD_CONTEXT_AMD64_DEBUG_REGISTERS */ - u_int64_t debug_control; - u_int64_t last_branch_to_rip; - u_int64_t last_branch_from_rip; - u_int64_t last_exception_to_rip; - u_int64_t last_exception_from_rip; - -} MDRawContextAMD64; /* CONTEXT */ - -/* For (MDRawContextAMD64).context_flags. These values indicate the type of - * context stored in the structure. The high 26 bits identify the CPU, the - * low 6 bits identify the type of context saved. */ -#define MD_CONTEXT_AMD64_CONTROL (MD_CONTEXT_AMD64 | 0x00000001) - /* CONTEXT_CONTROL */ -#define MD_CONTEXT_AMD64_INTEGER (MD_CONTEXT_AMD64 | 0x00000002) - /* CONTEXT_INTEGER */ -#define MD_CONTEXT_AMD64_SEGMENTS (MD_CONTEXT_AMD64 | 0x00000004) - /* CONTEXT_SEGMENTS */ -#define MD_CONTEXT_AMD64_FLOATING_POINT (MD_CONTEXT_AMD64 | 0x00000008) - /* CONTEXT_FLOATING_POINT */ -#define MD_CONTEXT_AMD64_DEBUG_REGISTERS (MD_CONTEXT_AMD64 | 0x00000010) - /* CONTEXT_DEBUG_REGISTERS */ -/* WinNT.h refers to CONTEXT_MMX_REGISTERS but doesn't appear to define it - * I think it really means CONTEXT_FLOATING_POINT. - */ - -#define MD_CONTEXT_AMD64_FULL (MD_CONTEXT_AMD64_CONTROL | \ - MD_CONTEXT_AMD64_INTEGER | \ - MD_CONTEXT_AMD64_FLOATING_POINT) - /* CONTEXT_FULL */ - -#define MD_CONTEXT_AMD64_ALL (MD_CONTEXT_AMD64_FULL | \ - MD_CONTEXT_AMD64_SEGMENTS | \ - MD_CONTEXT_X86_DEBUG_REGISTERS) - /* CONTEXT_ALL */ - - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_AMD64_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_arm.h b/share/google-breakpad/src/google_breakpad/common/minidump_cpu_arm.h deleted file mode 100644 index bd3d934f5e5ae23fa44a153a87daf11b83c654cf..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_arm.h +++ /dev/null @@ -1,130 +0,0 @@ -/* Copyright (c) 2009, 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. */ - -/* minidump_format.h: A cross-platform reimplementation of minidump-related - * portions of DbgHelp.h from the Windows Platform SDK. - * - * (This is C99 source, please don't corrupt it with C++.) - * - * This file contains the necessary definitions to read minidump files - * produced on ARM. These files may be read on any platform provided - * that the alignments of these structures on the processing system are - * identical to the alignments of these structures on the producing system. - * For this reason, precise-sized types are used. The structures defined - * by this file have been laid out to minimize alignment problems by - * ensuring that all members are aligned on their natural boundaries. - * In some cases, tail-padding may be significant when different ABIs specify - * different tail-padding behaviors. To avoid problems when reading or - * writing affected structures, MD_*_SIZE macros are provided where needed, - * containing the useful size of the structures without padding. - * - * Structures that are defined by Microsoft to contain a zero-length array - * are instead defined here to contain an array with one element, as - * zero-length arrays are forbidden by standard C and C++. In these cases, - * *_minsize constants are provided to be used in place of sizeof. For a - * cleaner interface to these sizes when using C++, see minidump_size.h. - * - * These structures are also sufficient to populate minidump files. - * - * Because precise data type sizes are crucial for this implementation to - * function properly and portably, a set of primitive types with known sizes - * are used as the basis of each structure defined by this file. - * - * Author: Julian Seward - */ - -/* - * ARM support - */ - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ - -#define MD_FLOATINGSAVEAREA_ARM_FPR_COUNT 32 -#define MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT 8 - -/* - * Note that these structures *do not* map directly to the CONTEXT - * structure defined in WinNT.h in the Windows Mobile SDK. That structure - * does not accomodate VFPv3, and I'm unsure if it was ever used in the - * wild anyway, as Windows CE only seems to produce "cedumps" which - * are not exactly minidumps. - */ -typedef struct { - u_int64_t fpscr; /* FPU status register */ - - /* 32 64-bit floating point registers, d0 .. d31. */ - u_int64_t regs[MD_FLOATINGSAVEAREA_ARM_FPR_COUNT]; - - /* Miscellaneous control words */ - u_int32_t extra[MD_FLOATINGSAVEAREA_ARM_FPEXTRA_COUNT]; -} MDFloatingSaveAreaARM; - -#define MD_CONTEXT_ARM_GPR_COUNT 16 - -typedef struct { - /* The next field determines the layout of the structure, and which parts - * of it are populated - */ - u_int32_t context_flags; - - /* 16 32-bit integer registers, r0 .. r15 - * Note the following fixed uses: - * r13 is the stack pointer - * r14 is the link register - * r15 is the program counter - */ - u_int32_t iregs[MD_CONTEXT_ARM_GPR_COUNT]; - - /* CPSR (flags, basically): 32 bits: - bit 31 - N (negative) - bit 30 - Z (zero) - bit 29 - C (carry) - bit 28 - V (overflow) - bit 27 - Q (saturation flag, sticky) - All other fields -- ignore */ - u_int32_t cpsr; - - /* The next field is included with MD_CONTEXT_ARM_FLOATING_POINT */ - MDFloatingSaveAreaARM float_save; - -} MDRawContextARM; - -/* For (MDRawContextARM).context_flags. These values indicate the type of - * context stored in the structure. */ -#define MD_CONTEXT_ARM_INTEGER (MD_CONTEXT_ARM | 0x00000002) -#define MD_CONTEXT_ARM_FLOATING_POINT (MD_CONTEXT_ARM | 0x00000004) - -#define MD_CONTEXT_ARM_FULL (MD_CONTEXT_ARM_INTEGER | \ - MD_CONTEXT_ARM_FLOATING_POINT) - -#define MD_CONTEXT_ARM_ALL (MD_CONTEXT_ARM_INTEGER | \ - MD_CONTEXT_ARM_FLOATING_POINT) - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_ARM_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h b/share/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h deleted file mode 100644 index 038e921a4ffae1050fb8718ba9fded70b5ce05aa..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc.h +++ /dev/null @@ -1,163 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_format.h: A cross-platform reimplementation of minidump-related - * portions of DbgHelp.h from the Windows Platform SDK. - * - * (This is C99 source, please don't corrupt it with C++.) - * - * This file contains the necessary definitions to read minidump files - * produced on ppc. These files may be read on any platform provided - * that the alignments of these structures on the processing system are - * identical to the alignments of these structures on the producing system. - * For this reason, precise-sized types are used. The structures defined - * by this file have been laid out to minimize alignment problems by ensuring - * ensuring that all members are aligned on their natural boundaries. In - * In some cases, tail-padding may be significant when different ABIs specify - * different tail-padding behaviors. To avoid problems when reading or - * writing affected structures, MD_*_SIZE macros are provided where needed, - * containing the useful size of the structures without padding. - * - * Structures that are defined by Microsoft to contain a zero-length array - * are instead defined here to contain an array with one element, as - * zero-length arrays are forbidden by standard C and C++. In these cases, - * *_minsize constants are provided to be used in place of sizeof. For a - * cleaner interface to these sizes when using C++, see minidump_size.h. - * - * These structures are also sufficient to populate minidump files. - * - * These definitions may be extended to support handling minidump files - * for other CPUs and other operating systems. - * - * Because precise data type sizes are crucial for this implementation to - * function properly and portably in terms of interoperability with minidumps - * produced by DbgHelp on Windows, a set of primitive types with known sizes - * are used as the basis of each structure defined by this file. DbgHelp - * on Windows is assumed to be the reference implementation; this file - * seeks to provide a cross-platform compatible implementation. To avoid - * collisions with the types and values defined and used by DbgHelp in the - * event that this implementation is used on Windows, each type and value - * defined here is given a new name, beginning with "MD". Names of the - * equivalent types and values in the Windows Platform SDK are given in - * comments. - * - * Author: Mark Mentovai - * Change to split into its own file: Neal Sidhwaney */ - -/* - * Breakpad minidump extension for PowerPC support. Based on Darwin/Mac OS X' - * mach/ppc/_types.h - */ - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ - -#define MD_FLOATINGSAVEAREA_PPC_FPR_COUNT 32 - -typedef struct { - /* fpregs is a double[32] in mach/ppc/_types.h, but a u_int64_t is used - * here for precise sizing. */ - u_int64_t fpregs[MD_FLOATINGSAVEAREA_PPC_FPR_COUNT]; - u_int32_t fpscr_pad; - u_int32_t fpscr; /* Status/control */ -} MDFloatingSaveAreaPPC; /* Based on ppc_float_state */ - - -#define MD_VECTORSAVEAREA_PPC_VR_COUNT 32 - -typedef struct { - /* Vector registers (including vscr) are 128 bits, but mach/ppc/_types.h - * exposes them as four 32-bit quantities. */ - u_int128_t save_vr[MD_VECTORSAVEAREA_PPC_VR_COUNT]; - u_int128_t save_vscr; /* Status/control */ - u_int32_t save_pad5[4]; - u_int32_t save_vrvalid; /* Identifies which vector registers are saved */ - u_int32_t save_pad6[7]; -} MDVectorSaveAreaPPC; /* ppc_vector_state */ - - -#define MD_CONTEXT_PPC_GPR_COUNT 32 - -/* Use the same 32-bit alignment when accessing this structure from 64-bit code - * as is used natively in 32-bit code. #pragma pack is a MSVC extension - * supported by gcc. */ -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma pack(4) -#else -#pragma pack(push, 4) -#endif - -typedef struct { - /* context_flags is not present in ppc_thread_state, but it aids - * identification of MDRawContextPPC among other raw context types, - * and it guarantees alignment when we get to float_save. */ - u_int32_t context_flags; - - u_int32_t srr0; /* Machine status save/restore: stores pc - * (instruction) */ - u_int32_t srr1; /* Machine status save/restore: stores msr - * (ps, program/machine state) */ - /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is - * used for brevity. */ - u_int32_t gpr[MD_CONTEXT_PPC_GPR_COUNT]; - u_int32_t cr; /* Condition */ - u_int32_t xer; /* Integer (fiXed-point) exception */ - u_int32_t lr; /* Link */ - u_int32_t ctr; /* Count */ - u_int32_t mq; /* Multiply/Quotient (PPC 601, POWER only) */ - u_int32_t vrsave; /* Vector save */ - - /* float_save and vector_save aren't present in ppc_thread_state, but - * are represented in separate structures that still define a thread's - * context. */ - MDFloatingSaveAreaPPC float_save; - MDVectorSaveAreaPPC vector_save; -} MDRawContextPPC; /* Based on ppc_thread_state */ - -#if defined(__SUNPRO_C) || defined(__SUNPRO_CC) -#pragma pack(0) -#else -#pragma pack(pop) -#endif - -/* For (MDRawContextPPC).context_flags. These values indicate the type of - * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its - * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other - * CPUs. */ -#define MD_CONTEXT_PPC 0x20000000 -#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001) -#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008) -#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020) - -#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE -#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \ - MD_CONTEXT_PPC_FLOATING_POINT | \ - MD_CONTEXT_PPC_VECTOR) - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h b/share/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h deleted file mode 100644 index a788e5d1315a9ee1392171db5f67ae6c5c512533..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_ppc64.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright (c) 2008, 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. */ - -/* minidump_format.h: A cross-platform reimplementation of minidump-related - * portions of DbgHelp.h from the Windows Platform SDK. - * - * (This is C99 source, please don't corrupt it with C++.) - * - * This file contains the necessary definitions to read minidump files - * produced on ppc64. These files may be read on any platform provided - * that the alignments of these structures on the processing system are - * identical to the alignments of these structures on the producing system. - * For this reason, precise-sized types are used. The structures defined - * by this file have been laid out to minimize alignment problems by ensuring - * ensuring that all members are aligned on their natural boundaries. In - * In some cases, tail-padding may be significant when different ABIs specify - * different tail-padding behaviors. To avoid problems when reading or - * writing affected structures, MD_*_SIZE macros are provided where needed, - * containing the useful size of the structures without padding. - * - * Structures that are defined by Microsoft to contain a zero-length array - * are instead defined here to contain an array with one element, as - * zero-length arrays are forbidden by standard C and C++. In these cases, - * *_minsize constants are provided to be used in place of sizeof. For a - * cleaner interface to these sizes when using C++, see minidump_size.h. - * - * These structures are also sufficient to populate minidump files. - * - * These definitions may be extended to support handling minidump files - * for other CPUs and other operating systems. - * - * Because precise data type sizes are crucial for this implementation to - * function properly and portably in terms of interoperability with minidumps - * produced by DbgHelp on Windows, a set of primitive types with known sizes - * are used as the basis of each structure defined by this file. DbgHelp - * on Windows is assumed to be the reference implementation; this file - * seeks to provide a cross-platform compatible implementation. To avoid - * collisions with the types and values defined and used by DbgHelp in the - * event that this implementation is used on Windows, each type and value - * defined here is given a new name, beginning with "MD". Names of the - * equivalent types and values in the Windows Platform SDK are given in - * comments. - * - * Author: Neal Sidhwaney */ - - -/* - * Breakpad minidump extension for PPC64 support. Based on Darwin/Mac OS X' - * mach/ppc/_types.h - */ - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ - -#include "minidump_cpu_ppc.h" - -// these types are the same in ppc64 & ppc -typedef MDFloatingSaveAreaPPC MDFloatingSaveAreaPPC64; -typedef MDVectorSaveAreaPPC MDVectorSaveAreaPPC64; - -#define MD_CONTEXT_PPC64_GPR_COUNT MD_CONTEXT_PPC_GPR_COUNT - -typedef struct { - /* context_flags is not present in ppc_thread_state, but it aids - * identification of MDRawContextPPC among other raw context types, - * and it guarantees alignment when we get to float_save. */ - u_int64_t context_flags; - - u_int64_t srr0; /* Machine status save/restore: stores pc - * (instruction) */ - u_int64_t srr1; /* Machine status save/restore: stores msr - * (ps, program/machine state) */ - /* ppc_thread_state contains 32 fields, r0 .. r31. Here, an array is - * used for brevity. */ - u_int64_t gpr[MD_CONTEXT_PPC64_GPR_COUNT]; - u_int64_t cr; /* Condition */ - u_int64_t xer; /* Integer (fiXed-point) exception */ - u_int64_t lr; /* Link */ - u_int64_t ctr; /* Count */ - u_int64_t vrsave; /* Vector save */ - - /* float_save and vector_save aren't present in ppc_thread_state, but - * are represented in separate structures that still define a thread's - * context. */ - MDFloatingSaveAreaPPC float_save; - MDVectorSaveAreaPPC vector_save; -} MDRawContextPPC64; /* Based on ppc_thread_state */ - -/* For (MDRawContextPPC).context_flags. These values indicate the type of - * context stored in the structure. MD_CONTEXT_PPC is Breakpad-defined. Its - * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other - * CPUs. */ -#define MD_CONTEXT_PPC 0x20000000 -#define MD_CONTEXT_PPC_BASE (MD_CONTEXT_PPC | 0x00000001) -#define MD_CONTEXT_PPC_FLOATING_POINT (MD_CONTEXT_PPC | 0x00000008) -#define MD_CONTEXT_PPC_VECTOR (MD_CONTEXT_PPC | 0x00000020) - -#define MD_CONTEXT_PPC_FULL MD_CONTEXT_PPC_BASE -#define MD_CONTEXT_PPC_ALL (MD_CONTEXT_PPC_FULL | \ - MD_CONTEXT_PPC_FLOATING_POINT | \ - MD_CONTEXT_PPC_VECTOR) - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_PPC64_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_sparc.h b/share/google-breakpad/src/google_breakpad/common/minidump_cpu_sparc.h deleted file mode 100644 index ee95b64eec5e32368d03d98d9d5d0ce1f38e0f67..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_sparc.h +++ /dev/null @@ -1,158 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_format.h: A cross-platform reimplementation of minidump-related - * portions of DbgHelp.h from the Windows Platform SDK. - * - * (This is C99 source, please don't corrupt it with C++.) - * - * This file contains the necessary definitions to read minidump files - * produced on sparc. These files may be read on any platform provided - * that the alignments of these structures on the processing system are - * identical to the alignments of these structures on the producing system. - * For this reason, precise-sized types are used. The structures defined - * by this file have been laid out to minimize alignment problems by ensuring - * ensuring that all members are aligned on their natural boundaries. In - * In some cases, tail-padding may be significant when different ABIs specify - * different tail-padding behaviors. To avoid problems when reading or - * writing affected structures, MD_*_SIZE macros are provided where needed, - * containing the useful size of the structures without padding. - * - * Structures that are defined by Microsoft to contain a zero-length array - * are instead defined here to contain an array with one element, as - * zero-length arrays are forbidden by standard C and C++. In these cases, - * *_minsize constants are provided to be used in place of sizeof. For a - * cleaner interface to these sizes when using C++, see minidump_size.h. - * - * These structures are also sufficient to populate minidump files. - * - * These definitions may be extended to support handling minidump files - * for other CPUs and other operating systems. - * - * Because precise data type sizes are crucial for this implementation to - * function properly and portably in terms of interoperability with minidumps - * produced by DbgHelp on Windows, a set of primitive types with known sizes - * are used as the basis of each structure defined by this file. DbgHelp - * on Windows is assumed to be the reference implementation; this file - * seeks to provide a cross-platform compatible implementation. To avoid - * collisions with the types and values defined and used by DbgHelp in the - * event that this implementation is used on Windows, each type and value - * defined here is given a new name, beginning with "MD". Names of the - * equivalent types and values in the Windows Platform SDK are given in - * comments. - * - * Author: Mark Mentovai - * Change to split into its own file: Neal Sidhwaney */ - -/* - * SPARC support, see (solaris)sys/procfs_isa.h also - */ - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ - -#define MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT 32 - -typedef struct { - - /* FPU floating point regs */ - u_int64_t regs[MD_FLOATINGSAVEAREA_SPARC_FPR_COUNT]; - - u_int64_t filler; - u_int64_t fsr; /* FPU status register */ -} MDFloatingSaveAreaSPARC; /* FLOATING_SAVE_AREA */ - -#define MD_CONTEXT_SPARC_GPR_COUNT 32 - -typedef struct { - /* The next field determines the layout of the structure, and which parts - * of it are populated - */ - u_int32_t context_flags; - u_int32_t flag_pad; - /* - * General register access (SPARC). - * Don't confuse definitions here with definitions in . - * Registers are 32 bits for ILP32, 64 bits for LP64. - * SPARC V7/V8 is for 32bit, SPARC V9 is for 64bit - */ - - /* 32 Integer working registers */ - - /* g_r[0-7] global registers(g0-g7) - * g_r[8-15] out registers(o0-o7) - * g_r[16-23] local registers(l0-l7) - * g_r[24-31] in registers(i0-i7) - */ - u_int64_t g_r[MD_CONTEXT_SPARC_GPR_COUNT]; - - /* several control registers */ - - /* Processor State register(PSR) for SPARC V7/V8 - * Condition Code register (CCR) for SPARC V9 - */ - u_int64_t ccr; - - u_int64_t pc; /* Program Counter register (PC) */ - u_int64_t npc; /* Next Program Counter register (nPC) */ - u_int64_t y; /* Y register (Y) */ - - /* Address Space Identifier register (ASI) for SPARC V9 - * WIM for SPARC V7/V8 - */ - u_int64_t asi; - - /* Floating-Point Registers State register (FPRS) for SPARC V9 - * TBR for for SPARC V7/V8 - */ - u_int64_t fprs; - - /* The next field is included with MD_CONTEXT_SPARC_FLOATING_POINT */ - MDFloatingSaveAreaSPARC float_save; - -} MDRawContextSPARC; /* CONTEXT_SPARC */ - -/* For (MDRawContextSPARC).context_flags. These values indicate the type of - * context stored in the structure. MD_CONTEXT_SPARC is Breakpad-defined. Its - * value was chosen to avoid likely conflicts with MD_CONTEXT_* for other - * CPUs. */ -#define MD_CONTEXT_SPARC 0x10000000 -#define MD_CONTEXT_SPARC_CONTROL (MD_CONTEXT_SPARC | 0x00000001) -#define MD_CONTEXT_SPARC_INTEGER (MD_CONTEXT_SPARC | 0x00000002) -#define MD_CONTEXT_SAPARC_FLOATING_POINT (MD_CONTEXT_SPARC | 0x00000004) -#define MD_CONTEXT_SAPARC_EXTRA (MD_CONTEXT_SPARC | 0x00000008) - -#define MD_CONTEXT_SPARC_FULL (MD_CONTEXT_SPARC_CONTROL | \ - MD_CONTEXT_SPARC_INTEGER) - -#define MD_CONTEXT_SPARC_ALL (MD_CONTEXT_SPARC_FULL | \ - MD_CONTEXT_SAPARC_FLOATING_POINT | \ - MD_CONTEXT_SAPARC_EXTRA) - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_SPARC_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_x86.h b/share/google-breakpad/src/google_breakpad/common/minidump_cpu_x86.h deleted file mode 100644 index 4dbc0e9a27a25bb42956e125cb9aa4571639bdaf..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_cpu_x86.h +++ /dev/null @@ -1,172 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_format.h: A cross-platform reimplementation of minidump-related - * portions of DbgHelp.h from the Windows Platform SDK. - * - * (This is C99 source, please don't corrupt it with C++.) - * - * This file contains the necessary definitions to read minidump files - * produced on x86. These files may be read on any platform provided - * that the alignments of these structures on the processing system are - * identical to the alignments of these structures on the producing system. - * For this reason, precise-sized types are used. The structures defined - * by this file have been laid out to minimize alignment problems by ensuring - * ensuring that all members are aligned on their natural boundaries. In - * In some cases, tail-padding may be significant when different ABIs specify - * different tail-padding behaviors. To avoid problems when reading or - * writing affected structures, MD_*_SIZE macros are provided where needed, - * containing the useful size of the structures without padding. - * - * Structures that are defined by Microsoft to contain a zero-length array - * are instead defined here to contain an array with one element, as - * zero-length arrays are forbidden by standard C and C++. In these cases, - * *_minsize constants are provided to be used in place of sizeof. For a - * cleaner interface to these sizes when using C++, see minidump_size.h. - * - * These structures are also sufficient to populate minidump files. - * - * These definitions may be extended to support handling minidump files - * for other CPUs and other operating systems. - * - * Because precise data type sizes are crucial for this implementation to - * function properly and portably in terms of interoperability with minidumps - * produced by DbgHelp on Windows, a set of primitive types with known sizes - * are used as the basis of each structure defined by this file. DbgHelp - * on Windows is assumed to be the reference implementation; this file - * seeks to provide a cross-platform compatible implementation. To avoid - * collisions with the types and values defined and used by DbgHelp in the - * event that this implementation is used on Windows, each type and value - * defined here is given a new name, beginning with "MD". Names of the - * equivalent types and values in the Windows Platform SDK are given in - * comments. - * - * Author: Mark Mentovai */ - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ - -#define MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE 80 - /* SIZE_OF_80387_REGISTERS */ - -typedef struct { - u_int32_t control_word; - u_int32_t status_word; - u_int32_t tag_word; - u_int32_t error_offset; - u_int32_t error_selector; - u_int32_t data_offset; - u_int32_t data_selector; - - /* register_area contains eight 80-bit (x87 "long double") quantities for - * floating-point registers %st0 (%mm0) through %st7 (%mm7). */ - u_int8_t register_area[MD_FLOATINGSAVEAREA_X86_REGISTERAREA_SIZE]; - u_int32_t cr0_npx_state; -} MDFloatingSaveAreaX86; /* FLOATING_SAVE_AREA */ - - -#define MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE 512 - /* MAXIMUM_SUPPORTED_EXTENSION */ - -typedef struct { - /* The next field determines the layout of the structure, and which parts - * of it are populated */ - u_int32_t context_flags; - - /* The next 6 registers are included with MD_CONTEXT_X86_DEBUG_REGISTERS */ - u_int32_t dr0; - u_int32_t dr1; - u_int32_t dr2; - u_int32_t dr3; - u_int32_t dr6; - u_int32_t dr7; - - /* The next field is included with MD_CONTEXT_X86_FLOATING_POINT */ - MDFloatingSaveAreaX86 float_save; - - /* The next 4 registers are included with MD_CONTEXT_X86_SEGMENTS */ - u_int32_t gs; - u_int32_t fs; - u_int32_t es; - u_int32_t ds; - /* The next 6 registers are included with MD_CONTEXT_X86_INTEGER */ - u_int32_t edi; - u_int32_t esi; - u_int32_t ebx; - u_int32_t edx; - u_int32_t ecx; - u_int32_t eax; - - /* The next 6 registers are included with MD_CONTEXT_X86_CONTROL */ - u_int32_t ebp; - u_int32_t eip; - u_int32_t cs; /* WinNT.h says "must be sanitized" */ - u_int32_t eflags; /* WinNT.h says "must be sanitized" */ - u_int32_t esp; - u_int32_t ss; - - /* The next field is included with MD_CONTEXT_X86_EXTENDED_REGISTERS. - * It contains vector (MMX/SSE) registers. It it laid out in the - * format used by the fxsave and fsrstor instructions, so it includes - * a copy of the x87 floating-point registers as well. See FXSAVE in - * "Intel Architecture Software Developer's Manual, Volume 2." */ - u_int8_t extended_registers[ - MD_CONTEXT_X86_EXTENDED_REGISTERS_SIZE]; -} MDRawContextX86; /* CONTEXT */ - -/* For (MDRawContextX86).context_flags. These values indicate the type of - * context stored in the structure. The high 26 bits identify the CPU, the - * low 6 bits identify the type of context saved. */ -#define MD_CONTEXT_X86 0x00010000 - /* CONTEXT_i386, CONTEXT_i486: identifies CPU */ -#define MD_CONTEXT_X86_CONTROL (MD_CONTEXT_X86 | 0x00000001) - /* CONTEXT_CONTROL */ -#define MD_CONTEXT_X86_INTEGER (MD_CONTEXT_X86 | 0x00000002) - /* CONTEXT_INTEGER */ -#define MD_CONTEXT_X86_SEGMENTS (MD_CONTEXT_X86 | 0x00000004) - /* CONTEXT_SEGMENTS */ -#define MD_CONTEXT_X86_FLOATING_POINT (MD_CONTEXT_X86 | 0x00000008) - /* CONTEXT_FLOATING_POINT */ -#define MD_CONTEXT_X86_DEBUG_REGISTERS (MD_CONTEXT_X86 | 0x00000010) - /* CONTEXT_DEBUG_REGISTERS */ -#define MD_CONTEXT_X86_EXTENDED_REGISTERS (MD_CONTEXT_X86 | 0x00000020) - /* CONTEXT_EXTENDED_REGISTERS */ - -#define MD_CONTEXT_X86_FULL (MD_CONTEXT_X86_CONTROL | \ - MD_CONTEXT_X86_INTEGER | \ - MD_CONTEXT_X86_SEGMENTS) - /* CONTEXT_FULL */ - -#define MD_CONTEXT_X86_ALL (MD_CONTEXT_X86_FULL | \ - MD_CONTEXT_X86_FLOATING_POINT | \ - MD_CONTEXT_X86_DEBUG_REGISTERS | \ - MD_CONTEXT_X86_EXTENDED_REGISTERS) - /* CONTEXT_ALL */ - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_CPU_X86_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_exception_linux.h b/share/google-breakpad/src/google_breakpad/common/minidump_exception_linux.h deleted file mode 100644 index d52c7519100a406b0b0bc05420aeed91fdbae543..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_exception_linux.h +++ /dev/null @@ -1,85 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_exception_linux.h: A definition of exception codes for - * Linux - * - * (This is C99 source, please don't corrupt it with C++.) - * - * Author: Mark Mentovai - * Split into its own file: Neal Sidhwaney */ - - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ - -#include - -#include "google_breakpad/common/breakpad_types.h" - - -/* For (MDException).exception_code. These values come from bits/signum.h. - */ -typedef enum { - MD_EXCEPTION_CODE_LIN_SIGHUP = 1, /* Hangup (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGINT = 2, /* Interrupt (ANSI) */ - MD_EXCEPTION_CODE_LIN_SIGQUIT = 3, /* Quit (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGILL = 4, /* Illegal instruction (ANSI) */ - MD_EXCEPTION_CODE_LIN_SIGTRAP = 5, /* Trace trap (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGABRT = 6, /* Abort (ANSI) */ - MD_EXCEPTION_CODE_LIN_SIGBUS = 7, /* BUS error (4.2 BSD) */ - MD_EXCEPTION_CODE_LIN_SIGFPE = 8, /* Floating-point exception (ANSI) */ - MD_EXCEPTION_CODE_LIN_SIGKILL = 9, /* Kill, unblockable (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGUSR1 = 10, /* User-defined signal 1 (POSIX). */ - MD_EXCEPTION_CODE_LIN_SIGSEGV = 11, /* Segmentation violation (ANSI) */ - MD_EXCEPTION_CODE_LIN_SIGUSR2 = 12, /* User-defined signal 2 (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGPIPE = 13, /* Broken pipe (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGALRM = 14, /* Alarm clock (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGTERM = 15, /* Termination (ANSI) */ - MD_EXCEPTION_CODE_LIN_SIGSTKFLT = 16, /* Stack faultd */ - MD_EXCEPTION_CODE_LIN_SIGCHLD = 17, /* Child status has changed (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGCONT = 18, /* Continue (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGSTOP = 19, /* Stop, unblockable (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGTSTP = 20, /* Keyboard stop (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGTTIN = 21, /* Background read from tty (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGTTOU = 22, /* Background write to tty (POSIX) */ - MD_EXCEPTION_CODE_LIN_SIGURG = 23, - /* Urgent condition on socket (4.2 BSD) */ - MD_EXCEPTION_CODE_LIN_SIGXCPU = 24, /* CPU limit exceeded (4.2 BSD) */ - MD_EXCEPTION_CODE_LIN_SIGXFSZ = 25, - /* File size limit exceeded (4.2 BSD) */ - MD_EXCEPTION_CODE_LIN_SIGVTALRM = 26, /* Virtual alarm clock (4.2 BSD) */ - MD_EXCEPTION_CODE_LIN_SIGPROF = 27, /* Profiling alarm clock (4.2 BSD) */ - MD_EXCEPTION_CODE_LIN_SIGWINCH = 28, /* Window size change (4.3 BSD, Sun) */ - MD_EXCEPTION_CODE_LIN_SIGIO = 29, /* I/O now possible (4.2 BSD) */ - MD_EXCEPTION_CODE_LIN_SIGPWR = 30, /* Power failure restart (System V) */ - MD_EXCEPTION_CODE_LIN_SIGSYS = 31 /* Bad system call */ -} MDExceptionCodeLinux; - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_LINUX_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_exception_mac.h b/share/google-breakpad/src/google_breakpad/common/minidump_exception_mac.h deleted file mode 100644 index 5fba44ca1e308403a350e72aace712deef6999b3..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_exception_mac.h +++ /dev/null @@ -1,193 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_exception_mac.h: A definition of exception codes for Mac - * OS X - * - * (This is C99 source, please don't corrupt it with C++.) - * - * Author: Mark Mentovai - * Split into its own file: Neal Sidhwaney */ - - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_H__ - -#include - -#include "google_breakpad/common/breakpad_types.h" - -/* For (MDException).exception_code. Breakpad minidump extension for Mac OS X - * support. Based on Darwin/Mac OS X' mach/exception_types.h. This is - * what Mac OS X calls an "exception", not a "code". */ -typedef enum { - /* Exception code. The high 16 bits of exception_code contains one of - * these values. */ - MD_EXCEPTION_MAC_BAD_ACCESS = 1, /* code can be a kern_return_t */ - /* EXC_BAD_ACCESS */ - MD_EXCEPTION_MAC_BAD_INSTRUCTION = 2, /* code is CPU-specific */ - /* EXC_BAD_INSTRUCTION */ - MD_EXCEPTION_MAC_ARITHMETIC = 3, /* code is CPU-specific */ - /* EXC_ARITHMETIC */ - MD_EXCEPTION_MAC_EMULATION = 4, /* code is CPU-specific */ - /* EXC_EMULATION */ - MD_EXCEPTION_MAC_SOFTWARE = 5, - /* EXC_SOFTWARE */ - MD_EXCEPTION_MAC_BREAKPOINT = 6, /* code is CPU-specific */ - /* EXC_BREAKPOINT */ - MD_EXCEPTION_MAC_SYSCALL = 7, - /* EXC_SYSCALL */ - MD_EXCEPTION_MAC_MACH_SYSCALL = 8, - /* EXC_MACH_SYSCALL */ - MD_EXCEPTION_MAC_RPC_ALERT = 9 - /* EXC_RPC_ALERT */ -} MDExceptionMac; - -/* For (MDException).exception_flags. Breakpad minidump extension for Mac OS X - * support. Based on Darwin/Mac OS X' mach/ppc/exception.h and - * mach/i386/exception.h. This is what Mac OS X calls a "code". */ -typedef enum { - /* With MD_EXCEPTION_BAD_ACCESS. These are relevant kern_return_t values - * from mach/kern_return.h. */ - MD_EXCEPTION_CODE_MAC_INVALID_ADDRESS = 1, - /* KERN_INVALID_ADDRESS */ - MD_EXCEPTION_CODE_MAC_PROTECTION_FAILURE = 2, - /* KERN_PROTECTION_FAILURE */ - MD_EXCEPTION_CODE_MAC_NO_ACCESS = 8, - /* KERN_NO_ACCESS */ - MD_EXCEPTION_CODE_MAC_MEMORY_FAILURE = 9, - /* KERN_MEMORY_FAILURE */ - MD_EXCEPTION_CODE_MAC_MEMORY_ERROR = 10, - /* KERN_MEMORY_ERROR */ - - /* With MD_EXCEPTION_SOFTWARE */ - MD_EXCEPTION_CODE_MAC_BAD_SYSCALL = 0x00010000, /* Mach SIGSYS */ - MD_EXCEPTION_CODE_MAC_BAD_PIPE = 0x00010001, /* Mach SIGPIPE */ - MD_EXCEPTION_CODE_MAC_ABORT = 0x00010002, /* Mach SIGABRT */ - - /* With MD_EXCEPTION_MAC_BAD_ACCESS on ppc */ - MD_EXCEPTION_CODE_MAC_PPC_VM_PROT_READ = 0x0101, - /* EXC_PPC_VM_PROT_READ */ - MD_EXCEPTION_CODE_MAC_PPC_BADSPACE = 0x0102, - /* EXC_PPC_BADSPACE */ - MD_EXCEPTION_CODE_MAC_PPC_UNALIGNED = 0x0103, - /* EXC_PPC_UNALIGNED */ - - /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on ppc */ - MD_EXCEPTION_CODE_MAC_PPC_INVALID_SYSCALL = 1, - /* EXC_PPC_INVALID_SYSCALL */ - MD_EXCEPTION_CODE_MAC_PPC_UNIMPLEMENTED_INSTRUCTION = 2, - /* EXC_PPC_UNIPL_INST */ - MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_INSTRUCTION = 3, - /* EXC_PPC_PRIVINST */ - MD_EXCEPTION_CODE_MAC_PPC_PRIVILEGED_REGISTER = 4, - /* EXC_PPC_PRIVREG */ - MD_EXCEPTION_CODE_MAC_PPC_TRACE = 5, - /* EXC_PPC_TRACE */ - MD_EXCEPTION_CODE_MAC_PPC_PERFORMANCE_MONITOR = 6, - /* EXC_PPC_PERFMON */ - - /* With MD_EXCEPTION_MAC_ARITHMETIC on ppc */ - MD_EXCEPTION_CODE_MAC_PPC_OVERFLOW = 1, - /* EXC_PPC_OVERFLOW */ - MD_EXCEPTION_CODE_MAC_PPC_ZERO_DIVIDE = 2, - /* EXC_PPC_ZERO_DIVIDE */ - MD_EXCEPTION_CODE_MAC_PPC_FLOAT_INEXACT = 3, - /* EXC_FLT_INEXACT */ - MD_EXCEPTION_CODE_MAC_PPC_FLOAT_ZERO_DIVIDE = 4, - /* EXC_PPC_FLT_ZERO_DIVIDE */ - MD_EXCEPTION_CODE_MAC_PPC_FLOAT_UNDERFLOW = 5, - /* EXC_PPC_FLT_UNDERFLOW */ - MD_EXCEPTION_CODE_MAC_PPC_FLOAT_OVERFLOW = 6, - /* EXC_PPC_FLT_OVERFLOW */ - MD_EXCEPTION_CODE_MAC_PPC_FLOAT_NOT_A_NUMBER = 7, - /* EXC_PPC_FLT_NOT_A_NUMBER */ - - /* With MD_EXCEPTION_MAC_EMULATION on ppc */ - MD_EXCEPTION_CODE_MAC_PPC_NO_EMULATION = 8, - /* EXC_PPC_NOEMULATION */ - MD_EXCEPTION_CODE_MAC_PPC_ALTIVEC_ASSIST = 9, - /* EXC_PPC_ALTIVECASSIST */ - - /* With MD_EXCEPTION_MAC_SOFTWARE on ppc */ - MD_EXCEPTION_CODE_MAC_PPC_TRAP = 0x00000001, /* EXC_PPC_TRAP */ - MD_EXCEPTION_CODE_MAC_PPC_MIGRATE = 0x00010100, /* EXC_PPC_MIGRATE */ - - /* With MD_EXCEPTION_MAC_BREAKPOINT on ppc */ - MD_EXCEPTION_CODE_MAC_PPC_BREAKPOINT = 1, /* EXC_PPC_BREAKPOINT */ - - /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86, see also x86 interrupt - * values below. */ - MD_EXCEPTION_CODE_MAC_X86_INVALID_OPERATION = 1, /* EXC_I386_INVOP */ - - /* With MD_EXCEPTION_MAC_ARITHMETIC on x86 */ - MD_EXCEPTION_CODE_MAC_X86_DIV = 1, /* EXC_I386_DIV */ - MD_EXCEPTION_CODE_MAC_X86_INTO = 2, /* EXC_I386_INTO */ - MD_EXCEPTION_CODE_MAC_X86_NOEXT = 3, /* EXC_I386_NOEXT */ - MD_EXCEPTION_CODE_MAC_X86_EXTOVR = 4, /* EXC_I386_EXTOVR */ - MD_EXCEPTION_CODE_MAC_X86_EXTERR = 5, /* EXC_I386_EXTERR */ - MD_EXCEPTION_CODE_MAC_X86_EMERR = 6, /* EXC_I386_EMERR */ - MD_EXCEPTION_CODE_MAC_X86_BOUND = 7, /* EXC_I386_BOUND */ - MD_EXCEPTION_CODE_MAC_X86_SSEEXTERR = 8, /* EXC_I386_SSEEXTERR */ - - /* With MD_EXCEPTION_MAC_BREAKPOINT on x86 */ - MD_EXCEPTION_CODE_MAC_X86_SGL = 1, /* EXC_I386_SGL */ - MD_EXCEPTION_CODE_MAC_X86_BPT = 2, /* EXC_I386_BPT */ - - /* With MD_EXCEPTION_MAC_BAD_INSTRUCTION on x86. These are the raw - * x86 interrupt codes. Most of these are mapped to other Mach - * exceptions and codes, are handled, or should not occur in user space. - * A few of these will do occur with MD_EXCEPTION_MAC_BAD_INSTRUCTION. */ - /* EXC_I386_DIVERR = 0: mapped to EXC_ARITHMETIC/EXC_I386_DIV */ - /* EXC_I386_SGLSTP = 1: mapped to EXC_BREAKPOINT/EXC_I386_SGL */ - /* EXC_I386_NMIFLT = 2: should not occur in user space */ - /* EXC_I386_BPTFLT = 3: mapped to EXC_BREAKPOINT/EXC_I386_BPT */ - /* EXC_I386_INTOFLT = 4: mapped to EXC_ARITHMETIC/EXC_I386_INTO */ - /* EXC_I386_BOUNDFLT = 5: mapped to EXC_ARITHMETIC/EXC_I386_BOUND */ - /* EXC_I386_INVOPFLT = 6: mapped to EXC_BAD_INSTRUCTION/EXC_I386_INVOP */ - /* EXC_I386_NOEXTFLT = 7: should be handled by the kernel */ - /* EXC_I386_DBLFLT = 8: should be handled (if possible) by the kernel */ - /* EXC_I386_EXTOVRFLT = 9: mapped to EXC_BAD_ACCESS/(PROT_READ|PROT_EXEC) */ - MD_EXCEPTION_CODE_MAC_X86_INVALID_TASK_STATE_SEGMENT = 10, - /* EXC_INVTSSFLT */ - MD_EXCEPTION_CODE_MAC_X86_SEGMENT_NOT_PRESENT = 11, - /* EXC_SEGNPFLT */ - MD_EXCEPTION_CODE_MAC_X86_STACK_FAULT = 12, - /* EXC_STKFLT */ - MD_EXCEPTION_CODE_MAC_X86_GENERAL_PROTECTION_FAULT = 13, - /* EXC_GPFLT */ - /* EXC_I386_PGFLT = 14: should not occur in user space */ - /* EXC_I386_EXTERRFLT = 16: mapped to EXC_ARITHMETIC/EXC_I386_EXTERR */ - MD_EXCEPTION_CODE_MAC_X86_ALIGNMENT_FAULT = 17 - /* EXC_ALIGNFLT (for vector operations) */ - /* EXC_I386_ENOEXTFLT = 32: should be handled by the kernel */ - /* EXC_I386_ENDPERR = 33: should not occur */ -} MDExceptionCodeMac; - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_MAC_OSX_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_exception_solaris.h b/share/google-breakpad/src/google_breakpad/common/minidump_exception_solaris.h deleted file mode 100644 index d48632ac403f074a245f1252cdac14f145614634..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_exception_solaris.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_exception_solaris.h: A definition of exception codes for - * Solaris - * - * (This is C99 source, please don't corrupt it with C++.) - * - * Author: Mark Mentovai - * Split into its own file: Neal Sidhwaney */ - - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ - -#include - -#include "google_breakpad/common/breakpad_types.h" - -/* For (MDException).exception_code. These values come from sys/iso/signal_iso.h - */ -typedef enum { - MD_EXCEPTION_CODE_SOL_SIGHUP = 1, /* Hangup */ - MD_EXCEPTION_CODE_SOL_SIGINT = 2, /* interrupt (rubout) */ - MD_EXCEPTION_CODE_SOL_SIGQUIT = 3, /* quit (ASCII FS) */ - MD_EXCEPTION_CODE_SOL_SIGILL = 4, /* illegal instruction (not reset when caught) */ - MD_EXCEPTION_CODE_SOL_SIGTRAP = 5, /* trace trap (not reset when caught) */ - MD_EXCEPTION_CODE_SOL_SIGIOT = 6, /* IOT instruction */ - MD_EXCEPTION_CODE_SOL_SIGABRT = 6, /* used by abort, replace SIGIOT in the future */ - MD_EXCEPTION_CODE_SOL_SIGEMT = 7, /* EMT instruction */ - MD_EXCEPTION_CODE_SOL_SIGFPE = 8, /* floating point exception */ - MD_EXCEPTION_CODE_SOL_SIGKILL = 9, /* kill (cannot be caught or ignored) */ - MD_EXCEPTION_CODE_SOL_SIGBUS = 10, /* bus error */ - MD_EXCEPTION_CODE_SOL_SIGSEGV = 11, /* segmentation violation */ - MD_EXCEPTION_CODE_SOL_SIGSYS = 12, /* bad argument to system call */ - MD_EXCEPTION_CODE_SOL_SIGPIPE = 13, /* write on a pipe with no one to read it */ - MD_EXCEPTION_CODE_SOL_SIGALRM = 14, /* alarm clock */ - MD_EXCEPTION_CODE_SOL_SIGTERM = 15, /* software termination signal from kill */ - MD_EXCEPTION_CODE_SOL_SIGUSR1 = 16, /* user defined signal 1 */ - MD_EXCEPTION_CODE_SOL_SIGUSR2 = 17, /* user defined signal 2 */ - MD_EXCEPTION_CODE_SOL_SIGCLD = 18, /* child status change */ - MD_EXCEPTION_CODE_SOL_SIGCHLD = 18, /* child status change alias (POSIX) */ - MD_EXCEPTION_CODE_SOL_SIGPWR = 19, /* power-fail restart */ - MD_EXCEPTION_CODE_SOL_SIGWINCH = 20, /* window size change */ - MD_EXCEPTION_CODE_SOL_SIGURG = 21, /* urgent socket condition */ - MD_EXCEPTION_CODE_SOL_SIGPOLL = 22, /* pollable event occured */ - MD_EXCEPTION_CODE_SOL_SIGIO = 22, /* socket I/O possible (SIGPOLL alias) */ - MD_EXCEPTION_CODE_SOL_SIGSTOP = 23, /* stop (cannot be caught or ignored) */ - MD_EXCEPTION_CODE_SOL_SIGTSTP = 24, /* user stop requested from tty */ - MD_EXCEPTION_CODE_SOL_SIGCONT = 25, /* stopped process has been continued */ - MD_EXCEPTION_CODE_SOL_SIGTTIN = 26, /* background tty read attempted */ - MD_EXCEPTION_CODE_SOL_SIGTTOU = 27, /* background tty write attempted */ - MD_EXCEPTION_CODE_SOL_SIGVTALRM = 28, /* virtual timer expired */ - MD_EXCEPTION_CODE_SOL_SIGPROF = 29, /* profiling timer expired */ - MD_EXCEPTION_CODE_SOL_SIGXCPU = 30, /* exceeded cpu limit */ - MD_EXCEPTION_CODE_SOL_SIGXFSZ = 31, /* exceeded file size limit */ - MD_EXCEPTION_CODE_SOL_SIGWAITING = 32, /* reserved signal no longer used by threading code */ - MD_EXCEPTION_CODE_SOL_SIGLWP = 33, /* reserved signal no longer used by threading code */ - MD_EXCEPTION_CODE_SOL_SIGFREEZE = 34, /* special signal used by CPR */ - MD_EXCEPTION_CODE_SOL_SIGTHAW = 35, /* special signal used by CPR */ - MD_EXCEPTION_CODE_SOL_SIGCANCEL = 36, /* reserved signal for thread cancellation */ - MD_EXCEPTION_CODE_SOL_SIGLOST = 37, /* resource lost (eg, record-lock lost) */ - MD_EXCEPTION_CODE_SOL_SIGXRES = 38, /* resource control exceeded */ - MD_EXCEPTION_CODE_SOL_SIGJVM1 = 39, /* reserved signal for Java Virtual Machine */ - MD_EXCEPTION_CODE_SOL_SIGJVM2 = 40 /* reserved signal for Java Virtual Machine */ -} MDExceptionCodeSolaris; - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_SOLARIS_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h b/share/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h deleted file mode 100644 index f052401c383d263c6a08d09d650e2a761baaba1d..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_exception_win32.h +++ /dev/null @@ -1,105 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_exception_win32.h: Definitions of exception codes for - * Win32 platform - * - * (This is C99 source, please don't corrupt it with C++.) - * - * Author: Mark Mentovai - * Split into its own file: Neal Sidhwaney */ - - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ - -#include - -#include "google_breakpad/common/breakpad_types.h" - - -/* For (MDException).exception_code. These values come from WinBase.h - * and WinNT.h (names beginning with EXCEPTION_ are in WinBase.h, - * they are STATUS_ in WinNT.h). */ -typedef enum { - MD_EXCEPTION_CODE_WIN_CONTROL_C = 0x40010005, - /* DBG_CONTROL_C */ - MD_EXCEPTION_CODE_WIN_GUARD_PAGE_VIOLATION = 0x80000001, - /* EXCEPTION_GUARD_PAGE */ - MD_EXCEPTION_CODE_WIN_DATATYPE_MISALIGNMENT = 0x80000002, - /* EXCEPTION_DATATYPE_MISALIGNMENT */ - MD_EXCEPTION_CODE_WIN_BREAKPOINT = 0x80000003, - /* EXCEPTION_BREAKPOINT */ - MD_EXCEPTION_CODE_WIN_SINGLE_STEP = 0x80000004, - /* EXCEPTION_SINGLE_STEP */ - MD_EXCEPTION_CODE_WIN_ACCESS_VIOLATION = 0xc0000005, - /* EXCEPTION_ACCESS_VIOLATION */ - MD_EXCEPTION_CODE_WIN_IN_PAGE_ERROR = 0xc0000006, - /* EXCEPTION_IN_PAGE_ERROR */ - MD_EXCEPTION_CODE_WIN_INVALID_HANDLE = 0xc0000008, - /* EXCEPTION_INVALID_HANDLE */ - MD_EXCEPTION_CODE_WIN_ILLEGAL_INSTRUCTION = 0xc000001d, - /* EXCEPTION_ILLEGAL_INSTRUCTION */ - MD_EXCEPTION_CODE_WIN_NONCONTINUABLE_EXCEPTION = 0xc0000025, - /* EXCEPTION_NONCONTINUABLE_EXCEPTION */ - MD_EXCEPTION_CODE_WIN_INVALID_DISPOSITION = 0xc0000026, - /* EXCEPTION_INVALID_DISPOSITION */ - MD_EXCEPTION_CODE_WIN_ARRAY_BOUNDS_EXCEEDED = 0xc000008c, - /* EXCEPTION_BOUNDS_EXCEEDED */ - MD_EXCEPTION_CODE_WIN_FLOAT_DENORMAL_OPERAND = 0xc000008d, - /* EXCEPTION_FLT_DENORMAL_OPERAND */ - MD_EXCEPTION_CODE_WIN_FLOAT_DIVIDE_BY_ZERO = 0xc000008e, - /* EXCEPTION_FLT_DIVIDE_BY_ZERO */ - MD_EXCEPTION_CODE_WIN_FLOAT_INEXACT_RESULT = 0xc000008f, - /* EXCEPTION_FLT_INEXACT_RESULT */ - MD_EXCEPTION_CODE_WIN_FLOAT_INVALID_OPERATION = 0xc0000090, - /* EXCEPTION_FLT_INVALID_OPERATION */ - MD_EXCEPTION_CODE_WIN_FLOAT_OVERFLOW = 0xc0000091, - /* EXCEPTION_FLT_OVERFLOW */ - MD_EXCEPTION_CODE_WIN_FLOAT_STACK_CHECK = 0xc0000092, - /* EXCEPTION_FLT_STACK_CHECK */ - MD_EXCEPTION_CODE_WIN_FLOAT_UNDERFLOW = 0xc0000093, - /* EXCEPTION_FLT_UNDERFLOW */ - MD_EXCEPTION_CODE_WIN_INTEGER_DIVIDE_BY_ZERO = 0xc0000094, - /* EXCEPTION_INT_DIVIDE_BY_ZERO */ - MD_EXCEPTION_CODE_WIN_INTEGER_OVERFLOW = 0xc0000095, - /* EXCEPTION_INT_OVERFLOW */ - MD_EXCEPTION_CODE_WIN_PRIVILEGED_INSTRUCTION = 0xc0000096, - /* EXCEPTION_PRIV_INSTRUCTION */ - MD_EXCEPTION_CODE_WIN_STACK_OVERFLOW = 0xc00000fd, - /* EXCEPTION_STACK_OVERFLOW */ - MD_EXCEPTION_CODE_WIN_POSSIBLE_DEADLOCK = 0xc0000194, - /* EXCEPTION_POSSIBLE_DEADLOCK */ - MD_EXCEPTION_CODE_WIN_UNHANDLED_CPP_EXCEPTION = 0xe06d7363 - /* Per http://support.microsoft.com/kb/185294, - generated by Visual C++ compiler */ -} MDExceptionCodeWin; - - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_EXCEPTION_WIN32_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_format.h b/share/google-breakpad/src/google_breakpad/common/minidump_format.h deleted file mode 100644 index f3b4a46bdb03a21e4cb9c3855464970de1720eec..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_format.h +++ /dev/null @@ -1,721 +0,0 @@ -/* Copyright (c) 2006, 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. */ - -/* minidump_format.h: A cross-platform reimplementation of minidump-related - * portions of DbgHelp.h from the Windows Platform SDK. - * - * (This is C99 source, please don't corrupt it with C++.) - * - * Structures that are defined by Microsoft to contain a zero-length array - * are instead defined here to contain an array with one element, as - * zero-length arrays are forbidden by standard C and C++. In these cases, - * *_minsize constants are provided to be used in place of sizeof. For a - * cleaner interface to these sizes when using C++, see minidump_size.h. - * - * These structures are also sufficient to populate minidump files. - * - * These definitions may be extended to support handling minidump files - * for other CPUs and other operating systems. - * - * Because precise data type sizes are crucial for this implementation to - * function properly and portably in terms of interoperability with minidumps - * produced by DbgHelp on Windows, a set of primitive types with known sizes - * are used as the basis of each structure defined by this file. DbgHelp - * on Windows is assumed to be the reference implementation; this file - * seeks to provide a cross-platform compatible implementation. To avoid - * collisions with the types and values defined and used by DbgHelp in the - * event that this implementation is used on Windows, each type and value - * defined here is given a new name, beginning with "MD". Names of the - * equivalent types and values in the Windows Platform SDK are given in - * comments. - * - * Author: Mark Mentovai */ - - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ - -#include - -#include "google_breakpad/common/breakpad_types.h" - - -#if defined(_MSC_VER) -/* Disable "zero-sized array in struct/union" warnings when compiling in - * MSVC. DbgHelp.h does this too. */ -#pragma warning(push) -#pragma warning(disable:4200) -#endif /* _MSC_VER */ - - -/* - * guiddef.h - */ - -typedef struct { - u_int32_t data1; - u_int16_t data2; - u_int16_t data3; - u_int8_t data4[8]; -} MDGUID; /* GUID */ - - -/* - * WinNT.h - */ - -/* Non-x86 CPU identifiers found in the high 26 bits of - * (MDRawContext*).context_flags. These aren't used by Breakpad, but are - * defined here for reference, to avoid assigning values that conflict - * (although some values already conflict). */ -#define MD_CONTEXT_IA64 0x00080000 /* CONTEXT_IA64 */ -#define MD_CONTEXT_AMD64 0x00100000 /* CONTEXT_AMD64 */ -/* Additional values from winnt.h in the Windows CE 5.0 SDK: */ -#define MD_CONTEXT_SHX 0x000000c0 /* CONTEXT_SH4 (Super-H, includes SH3) */ -#define MD_CONTEXT_ARM 0x00000040 /* CONTEXT_ARM (0x40 bit set in SHx?) */ -#define MD_CONTEXT_MIPS 0x00010000 /* CONTEXT_R4000 (same value as x86?) */ -#define MD_CONTEXT_ALPHA 0x00020000 /* CONTEXT_ALPHA */ - -#define MD_CONTEXT_CPU_MASK 0xffffffc0 - - -/* This is a base type for MDRawContextX86 and MDRawContextPPC. This - * structure should never be allocated directly. The actual structure type - * can be determined by examining the context_flags field. */ -typedef struct { - u_int32_t context_flags; -} MDRawContextBase; - -#include "minidump_cpu_amd64.h" -#include "minidump_cpu_arm.h" -#include "minidump_cpu_ppc.h" -#include "minidump_cpu_ppc64.h" -#include "minidump_cpu_sparc.h" -#include "minidump_cpu_x86.h" - -/* - * WinVer.h - */ - - -typedef struct { - u_int32_t signature; - u_int32_t struct_version; - u_int32_t file_version_hi; - u_int32_t file_version_lo; - u_int32_t product_version_hi; - u_int32_t product_version_lo; - u_int32_t file_flags_mask; /* Identifies valid bits in fileFlags */ - u_int32_t file_flags; - u_int32_t file_os; - u_int32_t file_type; - u_int32_t file_subtype; - u_int32_t file_date_hi; - u_int32_t file_date_lo; -} MDVSFixedFileInfo; /* VS_FIXEDFILEINFO */ - -/* For (MDVSFixedFileInfo).signature */ -#define MD_VSFIXEDFILEINFO_SIGNATURE 0xfeef04bd - /* VS_FFI_SIGNATURE */ - -/* For (MDVSFixedFileInfo).version */ -#define MD_VSFIXEDFILEINFO_VERSION 0x00010000 - /* VS_FFI_STRUCVERSION */ - -/* For (MDVSFixedFileInfo).file_flags_mask and - * (MDVSFixedFileInfo).file_flags */ -#define MD_VSFIXEDFILEINFO_FILE_FLAGS_DEBUG 0x00000001 - /* VS_FF_DEBUG */ -#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRERELEASE 0x00000002 - /* VS_FF_PRERELEASE */ -#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PATCHED 0x00000004 - /* VS_FF_PATCHED */ -#define MD_VSFIXEDFILEINFO_FILE_FLAGS_PRIVATEBUILD 0x00000008 - /* VS_FF_PRIVATEBUILD */ -#define MD_VSFIXEDFILEINFO_FILE_FLAGS_INFOINFERRED 0x00000010 - /* VS_FF_INFOINFERRED */ -#define MD_VSFIXEDFILEINFO_FILE_FLAGS_SPECIALBUILD 0x00000020 - /* VS_FF_SPECIALBUILD */ - -/* For (MDVSFixedFileInfo).file_os: high 16 bits */ -#define MD_VSFIXEDFILEINFO_FILE_OS_UNKNOWN 0 /* VOS_UNKNOWN */ -#define MD_VSFIXEDFILEINFO_FILE_OS_DOS (1 << 16) /* VOS_DOS */ -#define MD_VSFIXEDFILEINFO_FILE_OS_OS216 (2 << 16) /* VOS_OS216 */ -#define MD_VSFIXEDFILEINFO_FILE_OS_OS232 (3 << 16) /* VOS_OS232 */ -#define MD_VSFIXEDFILEINFO_FILE_OS_NT (4 << 16) /* VOS_NT */ -#define MD_VSFIXEDFILEINFO_FILE_OS_WINCE (5 << 16) /* VOS_WINCE */ -/* Low 16 bits */ -#define MD_VSFIXEDFILEINFO_FILE_OS__BASE 0 /* VOS__BASE */ -#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS16 1 /* VOS__WINDOWS16 */ -#define MD_VSFIXEDFILEINFO_FILE_OS__PM16 2 /* VOS__PM16 */ -#define MD_VSFIXEDFILEINFO_FILE_OS__PM32 3 /* VOS__PM32 */ -#define MD_VSFIXEDFILEINFO_FILE_OS__WINDOWS32 4 /* VOS__WINDOWS32 */ - -/* For (MDVSFixedFileInfo).file_type */ -#define MD_VSFIXEDFILEINFO_FILE_TYPE_UNKNOWN 0 /* VFT_UNKNOWN */ -#define MD_VSFIXEDFILEINFO_FILE_TYPE_APP 1 /* VFT_APP */ -#define MD_VSFIXEDFILEINFO_FILE_TYPE_DLL 2 /* VFT_DLL */ -#define MD_VSFIXEDFILEINFO_FILE_TYPE_DRV 3 /* VFT_DLL */ -#define MD_VSFIXEDFILEINFO_FILE_TYPE_FONT 4 /* VFT_FONT */ -#define MD_VSFIXEDFILEINFO_FILE_TYPE_VXD 5 /* VFT_VXD */ -#define MD_VSFIXEDFILEINFO_FILE_TYPE_STATIC_LIB 7 /* VFT_STATIC_LIB */ - -/* For (MDVSFixedFileInfo).file_subtype */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_UNKNOWN 0 - /* VFT2_UNKNOWN */ -/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_DRV */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_PRINTER 1 - /* VFT2_DRV_PRINTER */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_KEYBOARD 2 - /* VFT2_DRV_KEYBOARD */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_LANGUAGE 3 - /* VFT2_DRV_LANGUAGE */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_DISPLAY 4 - /* VFT2_DRV_DISPLAY */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_MOUSE 5 - /* VFT2_DRV_MOUSE */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_NETWORK 6 - /* VFT2_DRV_NETWORK */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SYSTEM 7 - /* VFT2_DRV_SYSTEM */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INSTALLABLE 8 - /* VFT2_DRV_INSTALLABLE */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_SOUND 9 - /* VFT2_DRV_SOUND */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_COMM 10 - /* VFT2_DRV_COMM */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_INPUTMETHOD 11 - /* VFT2_DRV_INPUTMETHOD */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_DRV_VERSIONED_PRINTER 12 - /* VFT2_DRV_VERSIONED_PRINTER */ -/* with file_type = MD_VSFIXEDFILEINFO_FILETYPE_FONT */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_RASTER 1 - /* VFT2_FONT_RASTER */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_VECTOR 2 - /* VFT2_FONT_VECTOR */ -#define MD_VSFIXEDFILEINFO_FILE_SUBTYPE_FONT_TRUETYPE 3 - /* VFT2_FONT_TRUETYPE */ - - -/* - * DbgHelp.h - */ - - -/* An MDRVA is an offset into the minidump file. The beginning of the - * MDRawHeader is at offset 0. */ -typedef u_int32_t MDRVA; /* RVA */ - -typedef struct { - u_int32_t data_size; - MDRVA rva; -} MDLocationDescriptor; /* MINIDUMP_LOCATION_DESCRIPTOR */ - - -typedef struct { - /* The base address of the memory range on the host that produced the - * minidump. */ - u_int64_t start_of_memory_range; - - MDLocationDescriptor memory; -} MDMemoryDescriptor; /* MINIDUMP_MEMORY_DESCRIPTOR */ - - -typedef struct { - u_int32_t signature; - u_int32_t version; - u_int32_t stream_count; - MDRVA stream_directory_rva; /* A |stream_count|-sized array of - * MDRawDirectory structures. */ - u_int32_t checksum; /* Can be 0. In fact, that's all that's - * been found in minidump files. */ - u_int32_t time_date_stamp; /* time_t */ - u_int64_t flags; -} MDRawHeader; /* MINIDUMP_HEADER */ - -/* For (MDRawHeader).signature and (MDRawHeader).version. Note that only the - * low 16 bits of (MDRawHeader).version are MD_HEADER_VERSION. Per the - * documentation, the high 16 bits are implementation-specific. */ -#define MD_HEADER_SIGNATURE 0x504d444d /* 'PMDM' */ - /* MINIDUMP_SIGNATURE */ -#define MD_HEADER_VERSION 0x0000a793 /* 42899 */ - /* MINIDUMP_VERSION */ - -/* For (MDRawHeader).flags: */ -typedef enum { - /* MD_NORMAL is the standard type of minidump. It includes full - * streams for the thread list, module list, exception, system info, - * and miscellaneous info. A memory list stream is also present, - * pointing to the same stack memory contained in the thread list, - * as well as a 256-byte region around the instruction address that - * was executing when the exception occurred. Stack memory is from - * 4 bytes below a thread's stack pointer up to the top of the - * memory region encompassing the stack. */ - MD_NORMAL = 0x00000000, - MD_WITH_DATA_SEGS = 0x00000001, - MD_WITH_FULL_MEMORY = 0x00000002, - MD_WITH_HANDLE_DATA = 0x00000004, - MD_FILTER_MEMORY = 0x00000008, - MD_SCAN_MEMORY = 0x00000010, - MD_WITH_UNLOADED_MODULES = 0x00000020, - MD_WITH_INDIRECTLY_REFERENCED_MEMORY = 0x00000040, - MD_FILTER_MODULE_PATHS = 0x00000080, - MD_WITH_PROCESS_THREAD_DATA = 0x00000100, - MD_WITH_PRIVATE_READ_WRITE_MEMORY = 0x00000200, - MD_WITHOUT_OPTIONAL_DATA = 0x00000400, - MD_WITH_FULL_MEMORY_INFO = 0x00000800, - MD_WITH_THREAD_INFO = 0x00001000, - MD_WITH_CODE_SEGS = 0x00002000 -} MDType; /* MINIDUMP_TYPE */ - - -typedef struct { - u_int32_t stream_type; - MDLocationDescriptor location; -} MDRawDirectory; /* MINIDUMP_DIRECTORY */ - -/* For (MDRawDirectory).stream_type */ -typedef enum { - MD_UNUSED_STREAM = 0, - MD_RESERVED_STREAM_0 = 1, - MD_RESERVED_STREAM_1 = 2, - MD_THREAD_LIST_STREAM = 3, /* MDRawThreadList */ - MD_MODULE_LIST_STREAM = 4, /* MDRawModuleList */ - MD_MEMORY_LIST_STREAM = 5, /* MDRawMemoryList */ - MD_EXCEPTION_STREAM = 6, /* MDRawExceptionStream */ - MD_SYSTEM_INFO_STREAM = 7, /* MDRawSystemInfo */ - MD_THREAD_EX_LIST_STREAM = 8, - MD_MEMORY_64_LIST_STREAM = 9, - MD_COMMENT_STREAM_A = 10, - MD_COMMENT_STREAM_W = 11, - MD_HANDLE_DATA_STREAM = 12, - MD_FUNCTION_TABLE_STREAM = 13, - MD_UNLOADED_MODULE_LIST_STREAM = 14, - MD_MISC_INFO_STREAM = 15, /* MDRawMiscInfo */ - MD_LAST_RESERVED_STREAM = 0x0000ffff, - - /* Breakpad extension types. 0x4767 = "Gg" */ - MD_BREAKPAD_INFO_STREAM = 0x47670001, /* MDRawBreakpadInfo */ - MD_ASSERTION_INFO_STREAM = 0x47670002 /* MDRawAssertionInfo */ -} MDStreamType; /* MINIDUMP_STREAM_TYPE */ - - -typedef struct { - u_int32_t length; /* Length of buffer in bytes (not characters), - * excluding 0-terminator */ - u_int16_t buffer[1]; /* UTF-16-encoded, 0-terminated */ -} MDString; /* MINIDUMP_STRING */ - -static const size_t MDString_minsize = offsetof(MDString, buffer[0]); - - -typedef struct { - u_int32_t thread_id; - u_int32_t suspend_count; - u_int32_t priority_class; - u_int32_t priority; - u_int64_t teb; /* Thread environment block */ - MDMemoryDescriptor stack; - MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ -} MDRawThread; /* MINIDUMP_THREAD */ - - -typedef struct { - u_int32_t number_of_threads; - MDRawThread threads[1]; -} MDRawThreadList; /* MINIDUMP_THREAD_LIST */ - -static const size_t MDRawThreadList_minsize = offsetof(MDRawThreadList, - threads[0]); - - -typedef struct { - u_int64_t base_of_image; - u_int32_t size_of_image; - u_int32_t checksum; /* 0 if unknown */ - u_int32_t time_date_stamp; /* time_t */ - MDRVA module_name_rva; /* MDString, pathname or filename */ - MDVSFixedFileInfo version_info; - - /* The next field stores a CodeView record and is populated when a module's - * debug information resides in a PDB file. It identifies the PDB file. */ - MDLocationDescriptor cv_record; - - /* The next field is populated when a module's debug information resides - * in a DBG file. It identifies the DBG file. This field is effectively - * obsolete with modules built by recent toolchains. */ - MDLocationDescriptor misc_record; - - /* Alignment problem: reserved0 and reserved1 are defined by the platform - * SDK as 64-bit quantities. However, that results in a structure whose - * alignment is unpredictable on different CPUs and ABIs. If the ABI - * specifies full alignment of 64-bit quantities in structures (as ppc - * does), there will be padding between miscRecord and reserved0. If - * 64-bit quantities can be aligned on 32-bit boundaries (as on x86), - * this padding will not exist. (Note that the structure up to this point - * contains 1 64-bit member followed by 21 32-bit members.) - * As a workaround, reserved0 and reserved1 are instead defined here as - * four 32-bit quantities. This should be harmless, as there are - * currently no known uses for these fields. */ - u_int32_t reserved0[2]; - u_int32_t reserved1[2]; -} MDRawModule; /* MINIDUMP_MODULE */ - -/* The inclusion of a 64-bit type in MINIDUMP_MODULE forces the struct to - * be tail-padded out to a multiple of 64 bits under some ABIs (such as PPC). - * This doesn't occur on systems that don't tail-pad in this manner. Define - * this macro to be the usable size of the MDRawModule struct, and use it in - * place of sizeof(MDRawModule). */ -#define MD_MODULE_SIZE 108 - - -/* (MDRawModule).cv_record can reference MDCVInfoPDB20 or MDCVInfoPDB70. - * Ref.: http://www.debuginfo.com/articles/debuginfomatch.html - * MDCVInfoPDB70 is the expected structure type with recent toolchains. */ - -typedef struct { - u_int32_t signature; - u_int32_t offset; /* Offset to debug data (expect 0 in minidump) */ -} MDCVHeader; - -typedef struct { - MDCVHeader cv_header; - u_int32_t signature; /* time_t debug information created */ - u_int32_t age; /* revision of PDB file */ - u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file */ -} MDCVInfoPDB20; - -static const size_t MDCVInfoPDB20_minsize = offsetof(MDCVInfoPDB20, - pdb_file_name[0]); - -#define MD_CVINFOPDB20_SIGNATURE 0x3031424e /* cvHeader.signature = '01BN' */ - -typedef struct { - u_int32_t cv_signature; - MDGUID signature; /* GUID, identifies PDB file */ - u_int32_t age; /* Identifies incremental changes to PDB file */ - u_int8_t pdb_file_name[1]; /* Pathname or filename of PDB file, - * 0-terminated 8-bit character data (UTF-8?) */ -} MDCVInfoPDB70; - -static const size_t MDCVInfoPDB70_minsize = offsetof(MDCVInfoPDB70, - pdb_file_name[0]); - -#define MD_CVINFOPDB70_SIGNATURE 0x53445352 /* cvSignature = 'SDSR' */ - -typedef struct { - u_int32_t data1[2]; - u_int32_t data2; - u_int32_t data3; - u_int32_t data4; - u_int32_t data5[3]; - u_int8_t extra[2]; -} MDCVInfoELF; - -/* In addition to the two CodeView record formats above, used for linking - * to external pdb files, it is possible for debugging data to be carried - * directly in the CodeView record itself. These signature values will - * be found in the first 4 bytes of the CodeView record. Additional values - * not commonly experienced in the wild are given by "Microsoft Symbol and - * Type Information", http://www.x86.org/ftp/manuals/tools/sym.pdf, section - * 7.2. An in-depth description of the CodeView 4.1 format is given by - * "Undocumented Windows 2000 Secrets", Windows 2000 Debugging Support/ - * Microsoft Symbol File Internals/CodeView Subsections, - * http://www.rawol.com/features/undocumented/sbs-w2k-1-windows-2000-debugging-support.pdf - */ -#define MD_CVINFOCV41_SIGNATURE 0x3930424e /* '90BN', CodeView 4.10. */ -#define MD_CVINFOCV50_SIGNATURE 0x3131424e /* '11BN', CodeView 5.0, - * MS C7-format (/Z7). */ - -#define MD_CVINFOUNKNOWN_SIGNATURE 0xffffffff /* An unlikely value. */ - -/* (MDRawModule).miscRecord can reference MDImageDebugMisc. The Windows - * structure is actually defined in WinNT.h. This structure is effectively - * obsolete with modules built by recent toolchains. */ - -typedef struct { - u_int32_t data_type; /* IMAGE_DEBUG_TYPE_*, not defined here because - * this debug record type is mostly obsolete. */ - u_int32_t length; /* Length of entire MDImageDebugMisc structure */ - u_int8_t unicode; /* True if data is multibyte */ - u_int8_t reserved[3]; - u_int8_t data[1]; -} MDImageDebugMisc; /* IMAGE_DEBUG_MISC */ - -static const size_t MDImageDebugMisc_minsize = offsetof(MDImageDebugMisc, - data[0]); - - -typedef struct { - u_int32_t number_of_modules; - MDRawModule modules[1]; -} MDRawModuleList; /* MINIDUMP_MODULE_LIST */ - -static const size_t MDRawModuleList_minsize = offsetof(MDRawModuleList, - modules[0]); - - -typedef struct { - u_int32_t number_of_memory_ranges; - MDMemoryDescriptor memory_ranges[1]; -} MDRawMemoryList; /* MINIDUMP_MEMORY_LIST */ - -static const size_t MDRawMemoryList_minsize = offsetof(MDRawMemoryList, - memory_ranges[0]); - - -#define MD_EXCEPTION_MAXIMUM_PARAMETERS 15 - -typedef struct { - u_int32_t exception_code; /* Windows: MDExceptionCodeWin, - * Mac OS X: MDExceptionMac, - * Linux: MDExceptionCodeLinux. */ - u_int32_t exception_flags; /* Windows: 1 if noncontinuable, - Mac OS X: MDExceptionCodeMac. */ - u_int64_t exception_record; /* Address (in the minidump-producing host's - * memory) of another MDException, for - * nested exceptions. */ - u_int64_t exception_address; /* The address that caused the exception. - * Mac OS X: exception subcode (which is - * typically the address). */ - u_int32_t number_parameters; /* Number of valid elements in - * exception_information. */ - u_int32_t __align; - u_int64_t exception_information[MD_EXCEPTION_MAXIMUM_PARAMETERS]; -} MDException; /* MINIDUMP_EXCEPTION */ - -#include "minidump_exception_win32.h" -#include "minidump_exception_mac.h" -#include "minidump_exception_linux.h" -#include "minidump_exception_solaris.h" - -typedef struct { - u_int32_t thread_id; /* Thread in which the exception - * occurred. Corresponds to - * (MDRawThread).thread_id. */ - u_int32_t __align; - MDException exception_record; - MDLocationDescriptor thread_context; /* MDRawContext[CPU] */ -} MDRawExceptionStream; /* MINIDUMP_EXCEPTION_STREAM */ - - -typedef union { - struct { - u_int32_t vendor_id[3]; /* cpuid 0: ebx, edx, ecx */ - u_int32_t version_information; /* cpuid 1: eax */ - u_int32_t feature_information; /* cpuid 1: edx */ - u_int32_t amd_extended_cpu_features; /* cpuid 0x80000001, ebx */ - } x86_cpu_info; - struct { - u_int64_t processor_features[2]; - } other_cpu_info; -} MDCPUInformation; /* CPU_INFORMATION */ - - -typedef struct { - /* The next 3 fields and numberOfProcessors are from the SYSTEM_INFO - * structure as returned by GetSystemInfo */ - u_int16_t processor_architecture; - u_int16_t processor_level; /* x86: 5 = 586, 6 = 686, ... */ - u_int16_t processor_revision; /* x86: 0xMMSS, where MM=model, - * SS=stepping */ - - u_int8_t number_of_processors; - u_int8_t product_type; /* Windows: VER_NT_* from WinNT.h */ - - /* The next 5 fields are from the OSVERSIONINFO structure as returned - * by GetVersionEx */ - u_int32_t major_version; - u_int32_t minor_version; - u_int32_t build_number; - u_int32_t platform_id; - MDRVA csd_version_rva; /* MDString further identifying the - * host OS. - * Windows: name of the installed OS - * service pack. - * Mac OS X: the Apple OS build number - * (sw_vers -buildVersion). - * Linux: uname -srvmo */ - - u_int16_t suite_mask; /* Windows: VER_SUITE_* from WinNT.h */ - u_int16_t reserved2; - - MDCPUInformation cpu; -} MDRawSystemInfo; /* MINIDUMP_SYSTEM_INFO */ - -/* For (MDRawSystemInfo).processor_architecture: */ -typedef enum { - MD_CPU_ARCHITECTURE_X86 = 0, /* PROCESSOR_ARCHITECTURE_INTEL */ - MD_CPU_ARCHITECTURE_MIPS = 1, /* PROCESSOR_ARCHITECTURE_MIPS */ - MD_CPU_ARCHITECTURE_ALPHA = 2, /* PROCESSOR_ARCHITECTURE_ALPHA */ - MD_CPU_ARCHITECTURE_PPC = 3, /* PROCESSOR_ARCHITECTURE_PPC */ - MD_CPU_ARCHITECTURE_SHX = 4, /* PROCESSOR_ARCHITECTURE_SHX - * (Super-H) */ - MD_CPU_ARCHITECTURE_ARM = 5, /* PROCESSOR_ARCHITECTURE_ARM */ - MD_CPU_ARCHITECTURE_IA64 = 6, /* PROCESSOR_ARCHITECTURE_IA64 */ - MD_CPU_ARCHITECTURE_ALPHA64 = 7, /* PROCESSOR_ARCHITECTURE_ALPHA64 */ - MD_CPU_ARCHITECTURE_MSIL = 8, /* PROCESSOR_ARCHITECTURE_MSIL - * (Microsoft Intermediate Language) */ - MD_CPU_ARCHITECTURE_AMD64 = 9, /* PROCESSOR_ARCHITECTURE_AMD64 */ - MD_CPU_ARCHITECTURE_X86_WIN64 = 10, - /* PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 (WoW64) */ - MD_CPU_ARCHITECTURE_SPARC = 0x8001, /* Breakpad-defined value for SPARC */ - MD_CPU_ARCHITECTURE_UNKNOWN = 0xffff /* PROCESSOR_ARCHITECTURE_UNKNOWN */ -} MDCPUArchitecture; - -/* For (MDRawSystemInfo).platform_id: */ -typedef enum { - MD_OS_WIN32S = 0, /* VER_PLATFORM_WIN32s (Windows 3.1) */ - MD_OS_WIN32_WINDOWS = 1, /* VER_PLATFORM_WIN32_WINDOWS (Windows 95-98-Me) */ - MD_OS_WIN32_NT = 2, /* VER_PLATFORM_WIN32_NT (Windows NT, 2000+) */ - MD_OS_WIN32_CE = 3, /* VER_PLATFORM_WIN32_CE, VER_PLATFORM_WIN32_HH - * (Windows CE, Windows Mobile, "Handheld") */ - - /* The following values are Breakpad-defined. */ - MD_OS_UNIX = 0x8000, /* Generic Unix-ish */ - MD_OS_MAC_OS_X = 0x8101, /* Mac OS X/Darwin */ - MD_OS_LINUX = 0x8201, /* Linux */ - MD_OS_SOLARIS = 0x8202 /* Solaris */ -} MDOSPlatform; - - -typedef struct { - u_int32_t size_of_info; /* Length of entire MDRawMiscInfo structure. */ - u_int32_t flags1; - - /* The next field is only valid if flags1 contains - * MD_MISCINFO_FLAGS1_PROCESS_ID. */ - u_int32_t process_id; - - /* The next 3 fields are only valid if flags1 contains - * MD_MISCINFO_FLAGS1_PROCESS_TIMES. */ - u_int32_t process_create_time; /* time_t process started */ - u_int32_t process_user_time; /* seconds of user CPU time */ - u_int32_t process_kernel_time; /* seconds of kernel CPU time */ - - /* The following fields are not present in MINIDUMP_MISC_INFO but are - * in MINIDUMP_MISC_INFO_2. When this struct is populated, these values - * may not be set. Use flags1 or sizeOfInfo to determine whether these - * values are present. These are only valid when flags1 contains - * MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO. */ - u_int32_t processor_max_mhz; - u_int32_t processor_current_mhz; - u_int32_t processor_mhz_limit; - u_int32_t processor_max_idle_state; - u_int32_t processor_current_idle_state; -} MDRawMiscInfo; /* MINIDUMP_MISC_INFO, MINIDUMP_MISC_INFO2 */ - -#define MD_MISCINFO_SIZE 24 -#define MD_MISCINFO2_SIZE 44 - -/* For (MDRawMiscInfo).flags1. These values indicate which fields in the - * MDRawMiscInfoStructure are valid. */ -typedef enum { - MD_MISCINFO_FLAGS1_PROCESS_ID = 0x00000001, - /* MINIDUMP_MISC1_PROCESS_ID */ - MD_MISCINFO_FLAGS1_PROCESS_TIMES = 0x00000002, - /* MINIDUMP_MISC1_PROCESS_TIMES */ - MD_MISCINFO_FLAGS1_PROCESSOR_POWER_INFO = 0x00000004 - /* MINIDUMP_MISC1_PROCESSOR_POWER_INFO */ -} MDMiscInfoFlags1; - - -/* - * Breakpad extension types - */ - - -typedef struct { - /* validity is a bitmask with values from MDBreakpadInfoValidity, indicating - * which of the other fields in the structure are valid. */ - u_int32_t validity; - - /* Thread ID of the handler thread. dump_thread_id should correspond to - * the thread_id of an MDRawThread in the minidump's MDRawThreadList if - * a dedicated thread in that list was used to produce the minidump. If - * the MDRawThreadList does not contain a dedicated thread used to produce - * the minidump, this field should be set to 0 and the validity field - * must not contain MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID. */ - u_int32_t dump_thread_id; - - /* Thread ID of the thread that requested the minidump be produced. As - * with dump_thread_id, requesting_thread_id should correspond to the - * thread_id of an MDRawThread in the minidump's MDRawThreadList. For - * minidumps produced as a result of an exception, requesting_thread_id - * will be the same as the MDRawExceptionStream's thread_id field. For - * minidumps produced "manually" at the program's request, - * requesting_thread_id will indicate which thread caused the dump to be - * written. If the minidump was produced at the request of something - * other than a thread in the MDRawThreadList, this field should be set - * to 0 and the validity field must not contain - * MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID. */ - u_int32_t requesting_thread_id; -} MDRawBreakpadInfo; - -/* For (MDRawBreakpadInfo).validity: */ -typedef enum { - /* When set, the dump_thread_id field is valid. */ - MD_BREAKPAD_INFO_VALID_DUMP_THREAD_ID = 1 << 0, - - /* When set, the requesting_thread_id field is valid. */ - MD_BREAKPAD_INFO_VALID_REQUESTING_THREAD_ID = 1 << 1 -} MDBreakpadInfoValidity; - -typedef struct { - /* expression, function, and file are 0-terminated UTF-16 strings. They - * may be truncated if necessary, but should always be 0-terminated when - * written to a file. - * Fixed-length strings are used because MiniDumpWriteDump doesn't offer - * a way for user streams to point to arbitrary RVAs for strings. */ - u_int16_t expression[128]; /* Assertion that failed... */ - u_int16_t function[128]; /* ...within this function... */ - u_int16_t file[128]; /* ...in this file... */ - u_int32_t line; /* ...at this line. */ - u_int32_t type; -} MDRawAssertionInfo; - -/* For (MDRawAssertionInfo).type: */ -typedef enum { - MD_ASSERTION_INFO_TYPE_UNKNOWN = 0, - - /* Used for assertions that would be raised by the MSVC CRT but are - * directed to an invalid parameter handler instead. */ - MD_ASSERTION_INFO_TYPE_INVALID_PARAMETER, - - /* Used for assertions that would be raised by the MSVC CRT but are - * directed to a pure virtual call handler instead. */ - MD_ASSERTION_INFO_TYPE_PURE_VIRTUAL_CALL -} MDAssertionInfoData; - -#if defined(_MSC_VER) -#pragma warning(pop) -#endif /* _MSC_VER */ - - -#endif /* GOOGLE_BREAKPAD_COMMON_MINIDUMP_FORMAT_H__ */ diff --git a/share/google-breakpad/src/google_breakpad/common/minidump_size.h b/share/google-breakpad/src/google_breakpad/common/minidump_size.h deleted file mode 100644 index 918544b66238d5e6e15b60544b98e6ff55bb6a33..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/google_breakpad/common/minidump_size.h +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2007, 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. */ - -// minidump_size.h: Provides a C++ template for programmatic access to -// the sizes of various types defined in minidump_format.h. -// -// Author: Mark Mentovai - -#ifndef GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ -#define GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ - -#include - -#include "google_breakpad/common/minidump_format.h" - -namespace google_breakpad { - -template -class minidump_size { - public: - static size_t size() { return sizeof(T); } -}; - -// Explicit specializations for variable-length types. The size returned -// for these should be the size for an object without its variable-length -// section. - -template<> -class minidump_size { - public: - static size_t size() { return MDString_minsize; } -}; - -template<> -class minidump_size { - public: - static size_t size() { return MDRawThreadList_minsize; } -}; - -template<> -class minidump_size { - public: - static size_t size() { return MDCVInfoPDB20_minsize; } -}; - -template<> -class minidump_size { - public: - static size_t size() { return MDCVInfoPDB70_minsize; } -}; - -template<> -class minidump_size { - public: - static size_t size() { return MDImageDebugMisc_minsize; } -}; - -template<> -class minidump_size { - public: - static size_t size() { return MDRawModuleList_minsize; } -}; - -template<> -class minidump_size { - public: - static size_t size() { return MDRawMemoryList_minsize; } -}; - -// Explicit specialization for MDRawModule, for which sizeof may include -// tail-padding on some architectures but not others. - -template<> -class minidump_size { - public: - static size_t size() { return MD_MODULE_SIZE; } -}; - -} // namespace google_breakpad - -#endif // GOOGLE_BREAKPAD_COMMON_MINIDUMP_SIZE_H__ diff --git a/share/google-breakpad/src/processor/scoped_ptr.h b/share/google-breakpad/src/processor/scoped_ptr.h deleted file mode 100644 index 0d4f7fd38a98791efe823619db7811edb78b03b7..0000000000000000000000000000000000000000 --- a/share/google-breakpad/src/processor/scoped_ptr.h +++ /dev/null @@ -1,335 +0,0 @@ -// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999. -// Copyright (c) 2001, 2002 Peter Dimov -// -// Permission to copy, use, modify, sell and distribute this software -// is granted provided this copyright notice appears in all copies. -// This software is provided "as is" without express or implied -// warranty, and with no claim as to its suitability for any purpose. -// -// See http://www.boost.org/libs/smart_ptr/scoped_ptr.htm for documentation. -// - -// scoped_ptr mimics a built-in pointer except that it guarantees deletion -// of the object pointed to, either on destruction of the scoped_ptr or via -// an explicit reset(). scoped_ptr is a simple solution for simple needs; -// use shared_ptr or std::auto_ptr if your needs are more complex. - -// *** NOTE *** -// If your scoped_ptr is a class member of class FOO pointing to a -// forward declared type BAR (as shown below), then you MUST use a non-inlined -// version of the destructor. The destructor of a scoped_ptr (called from -// FOO's destructor) must have a complete definition of BAR in order to -// destroy it. Example: -// -// -- foo.h -- -// class BAR; -// -// class FOO { -// public: -// FOO(); -// ~FOO(); // Required for sources that instantiate class FOO to compile! -// -// private: -// scoped_ptr bar_; -// }; -// -// -- foo.cc -- -// #include "foo.h" -// FOO::~FOO() {} // Empty, but must be non-inlined to FOO's class definition. - -// scoped_ptr_malloc added by Google -// When one of these goes out of scope, instead of doing a delete or -// delete[], it calls free(). scoped_ptr_malloc is likely to see -// much more use than any other specializations. - -// release() added by Google -// Use this to conditionally transfer ownership of a heap-allocated object -// to the caller, usually on method success. - -#ifndef PROCESSOR_SCOPED_PTR_H__ -#define PROCESSOR_SCOPED_PTR_H__ - -#include // for std::ptrdiff_t -#include // for assert -#include // for free() decl - -namespace google_breakpad { - -template -class scoped_ptr { - private: - - T* ptr; - - scoped_ptr(scoped_ptr const &); - scoped_ptr & operator=(scoped_ptr const &); - - public: - - typedef T element_type; - - explicit scoped_ptr(T* p = 0): ptr(p) {} - - ~scoped_ptr() { - typedef char type_must_be_complete[sizeof(T)]; - delete ptr; - } - - void reset(T* p = 0) { - typedef char type_must_be_complete[sizeof(T)]; - - if (ptr != p) { - delete ptr; - ptr = p; - } - } - - T& operator*() const { - assert(ptr != 0); - return *ptr; - } - - T* operator->() const { - assert(ptr != 0); - return ptr; - } - - bool operator==(T* p) const { - return ptr == p; - } - - bool operator!=(T* p) const { - return ptr != p; - } - - T* get() const { - return ptr; - } - - void swap(scoped_ptr & b) { - T* tmp = b.ptr; - b.ptr = ptr; - ptr = tmp; - } - - T* release() { - T* tmp = ptr; - ptr = 0; - return tmp; - } - - private: - - // no reason to use these: each scoped_ptr should have its own object - template bool operator==(scoped_ptr const& p) const; - template bool operator!=(scoped_ptr const& p) const; -}; - -template inline -void swap(scoped_ptr& a, scoped_ptr& b) { - a.swap(b); -} - -template inline -bool operator==(T* p, const scoped_ptr& b) { - return p == b.get(); -} - -template inline -bool operator!=(T* p, const scoped_ptr& b) { - return p != b.get(); -} - -// scoped_array extends scoped_ptr to arrays. Deletion of the array pointed to -// is guaranteed, either on destruction of the scoped_array or via an explicit -// reset(). Use shared_array or std::vector if your needs are more complex. - -template -class scoped_array { - private: - - T* ptr; - - scoped_array(scoped_array const &); - scoped_array & operator=(scoped_array const &); - - public: - - typedef T element_type; - - explicit scoped_array(T* p = 0) : ptr(p) {} - - ~scoped_array() { - typedef char type_must_be_complete[sizeof(T)]; - delete[] ptr; - } - - void reset(T* p = 0) { - typedef char type_must_be_complete[sizeof(T)]; - - if (ptr != p) { - delete [] ptr; - ptr = p; - } - } - - T& operator[](std::ptrdiff_t i) const { - assert(ptr != 0); - assert(i >= 0); - return ptr[i]; - } - - bool operator==(T* p) const { - return ptr == p; - } - - bool operator!=(T* p) const { - return ptr != p; - } - - T* get() const { - return ptr; - } - - void swap(scoped_array & b) { - T* tmp = b.ptr; - b.ptr = ptr; - ptr = tmp; - } - - T* release() { - T* tmp = ptr; - ptr = 0; - return tmp; - } - - private: - - // no reason to use these: each scoped_array should have its own object - template bool operator==(scoped_array const& p) const; - template bool operator!=(scoped_array const& p) const; -}; - -template inline -void swap(scoped_array& a, scoped_array& b) { - a.swap(b); -} - -template inline -bool operator==(T* p, const scoped_array& b) { - return p == b.get(); -} - -template inline -bool operator!=(T* p, const scoped_array& b) { - return p != b.get(); -} - - -// This class wraps the c library function free() in a class that can be -// passed as a template argument to scoped_ptr_malloc below. -class ScopedPtrMallocFree { - public: - inline void operator()(void* x) const { - free(x); - } -}; - -// scoped_ptr_malloc<> is similar to scoped_ptr<>, but it accepts a -// second template argument, the functor used to free the object. - -template -class scoped_ptr_malloc { - private: - - T* ptr; - - scoped_ptr_malloc(scoped_ptr_malloc const &); - scoped_ptr_malloc & operator=(scoped_ptr_malloc const &); - - public: - - typedef T element_type; - - explicit scoped_ptr_malloc(T* p = 0): ptr(p) {} - - ~scoped_ptr_malloc() { - typedef char type_must_be_complete[sizeof(T)]; - free_((void*) ptr); - } - - void reset(T* p = 0) { - typedef char type_must_be_complete[sizeof(T)]; - - if (ptr != p) { - free_((void*) ptr); - ptr = p; - } - } - - T& operator*() const { - assert(ptr != 0); - return *ptr; - } - - T* operator->() const { - assert(ptr != 0); - return ptr; - } - - bool operator==(T* p) const { - return ptr == p; - } - - bool operator!=(T* p) const { - return ptr != p; - } - - T* get() const { - return ptr; - } - - void swap(scoped_ptr_malloc & b) { - T* tmp = b.ptr; - b.ptr = ptr; - ptr = tmp; - } - - T* release() { - T* tmp = ptr; - ptr = 0; - return tmp; - } - - private: - - // no reason to use these: each scoped_ptr_malloc should have its own object - template - bool operator==(scoped_ptr_malloc const& p) const; - template - bool operator!=(scoped_ptr_malloc const& p) const; - - static FreeProc const free_; -}; - -template -FP const scoped_ptr_malloc::free_ = FP(); - -template inline -void swap(scoped_ptr_malloc& a, scoped_ptr_malloc& b) { - a.swap(b); -} - -template inline -bool operator==(T* p, const scoped_ptr_malloc& b) { - return p == b.get(); -} - -template inline -bool operator!=(T* p, const scoped_ptr_malloc& b) { - return p != b.get(); -} - -} // namespace google_breakpad - -#endif // PROCESSOR_SCOPED_PTR_H__ diff --git a/share/scons-local-1.3.0/SCons/Action.py b/share/scons-local-1.3.0/SCons/Action.py deleted file mode 100644 index 3e766d96ef82b584c579c92f147e46a1fe98a56a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Action.py +++ /dev/null @@ -1,1256 +0,0 @@ -"""SCons.Action - -This encapsulates information about executing any sort of action that -can build one or more target Nodes (typically files) from one or more -source Nodes (also typically files) given a specific Environment. - -The base class here is ActionBase. The base class supplies just a few -OO utility methods and some generic methods for displaying information -about an Action in response to the various commands that control printing. - -A second-level base class is _ActionAction. This extends ActionBase -by providing the methods that can be used to show and perform an -action. True Action objects will subclass _ActionAction; Action -factory class objects will subclass ActionBase. - -The heavy lifting is handled by subclasses for the different types of -actions we might execute: - - CommandAction - CommandGeneratorAction - FunctionAction - ListAction - -The subclasses supply the following public interface methods used by -other modules: - - __call__() - THE public interface, "calling" an Action object executes the - command or Python function. This also takes care of printing - a pre-substitution command for debugging purposes. - - get_contents() - Fetches the "contents" of an Action for signature calculation - plus the varlist. This is what gets MD5 checksummed to decide - if a target needs to be rebuilt because its action changed. - - genstring() - Returns a string representation of the Action *without* - command substitution, but allows a CommandGeneratorAction to - generate the right action based on the specified target, - source and env. This is used by the Signature subsystem - (through the Executor) to obtain an (imprecise) representation - of the Action operation for informative purposes. - - -Subclasses also supply the following methods for internal use within -this module: - - __str__() - Returns a string approximation of the Action; no variable - substitution is performed. - - execute() - The internal method that really, truly, actually handles the - execution of a command or Python function. This is used so - that the __call__() methods can take care of displaying any - pre-substitution representations, and *then* execute an action - without worrying about the specific Actions involved. - - get_presig() - Fetches the "contents" of a subclass for signature calculation. - The varlist is added to this to produce the Action's contents. - - strfunction() - Returns a substituted string representation of the Action. - This is used by the _ActionAction.show() command to display the - command/function that will be executed to generate the target(s). - -There is a related independent ActionCaller class that looks like a -regular Action, and which serves as a wrapper for arbitrary functions -that we want to let the user specify the arguments to now, but actually -execute later (when an out-of-date check determines that it's needed to -be executed, for example). Objects of this class are returned by an -ActionFactory class that provides a __call__() method as a convenient -way for wrapping up the functions. - -""" - -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -__revision__ = "src/engine/SCons/Action.py 4720 2010/03/24 03:14:11 jars" - -import cPickle -import dis -import os -import re -import string -import sys -import subprocess - -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Executor -import SCons.Util -import SCons.Subst - -# we use these a lot, so try to optimize them -is_String = SCons.Util.is_String -is_List = SCons.Util.is_List - -class _null: - pass - -print_actions = 1 -execute_actions = 1 -print_actions_presub = 0 - -def rfile(n): - try: - return n.rfile() - except AttributeError: - return n - -def default_exitstatfunc(s): - return s - -try: - SET_LINENO = dis.SET_LINENO - HAVE_ARGUMENT = dis.HAVE_ARGUMENT -except AttributeError: - remove_set_lineno_codes = lambda x: x -else: - def remove_set_lineno_codes(code): - result = [] - n = len(code) - i = 0 - while i < n: - c = code[i] - op = ord(c) - if op >= HAVE_ARGUMENT: - if op != SET_LINENO: - result.append(code[i:i+3]) - i = i+3 - else: - result.append(c) - i = i+1 - return string.join(result, '') - -strip_quotes = re.compile('^[\'"](.*)[\'"]$') - - -def _callable_contents(obj): - """Return the signature contents of a callable Python object. - """ - try: - # Test if obj is a method. - return _function_contents(obj.im_func) - - except AttributeError: - try: - # Test if obj is a callable object. - return _function_contents(obj.__call__.im_func) - - except AttributeError: - try: - # Test if obj is a code object. - return _code_contents(obj) - - except AttributeError: - # Test if obj is a function object. - return _function_contents(obj) - - -def _object_contents(obj): - """Return the signature contents of any Python object. - - We have to handle the case where object contains a code object - since it can be pickled directly. - """ - try: - # Test if obj is a method. - return _function_contents(obj.im_func) - - except AttributeError: - try: - # Test if obj is a callable object. - return _function_contents(obj.__call__.im_func) - - except AttributeError: - try: - # Test if obj is a code object. - return _code_contents(obj) - - except AttributeError: - try: - # Test if obj is a function object. - return _function_contents(obj) - - except AttributeError: - # Should be a pickable Python object. - try: - return cPickle.dumps(obj) - except (cPickle.PicklingError, TypeError): - # This is weird, but it seems that nested classes - # are unpickable. The Python docs say it should - # always be a PicklingError, but some Python - # versions seem to return TypeError. Just do - # the best we can. - return str(obj) - - -def _code_contents(code): - """Return the signature contents of a code object. - - By providing direct access to the code object of the - function, Python makes this extremely easy. Hooray! - - Unfortunately, older versions of Python include line - number indications in the compiled byte code. Boo! - So we remove the line number byte codes to prevent - recompilations from moving a Python function. - """ - - contents = [] - - # The code contents depends on the number of local variables - # but not their actual names. - contents.append("%s,%s" % (code.co_argcount, len(code.co_varnames))) - try: - contents.append(",%s,%s" % (len(code.co_cellvars), len(code.co_freevars))) - except AttributeError: - # Older versions of Python do not support closures. - contents.append(",0,0") - - # The code contents depends on any constants accessed by the - # function. Note that we have to call _object_contents on each - # constants because the code object of nested functions can - # show-up among the constants. - # - # Note that we also always ignore the first entry of co_consts - # which contains the function doc string. We assume that the - # function does not access its doc string. - contents.append(',(' + string.join(map(_object_contents,code.co_consts[1:]),',') + ')') - - # The code contents depends on the variable names used to - # accessed global variable, as changing the variable name changes - # the variable actually accessed and therefore changes the - # function result. - contents.append(',(' + string.join(map(_object_contents,code.co_names),',') + ')') - - - # The code contents depends on its actual code!!! - contents.append(',(' + str(remove_set_lineno_codes(code.co_code)) + ')') - - return string.join(contents, '') - - -def _function_contents(func): - """Return the signature contents of a function.""" - - contents = [_code_contents(func.func_code)] - - # The function contents depends on the value of defaults arguments - if func.func_defaults: - contents.append(',(' + string.join(map(_object_contents,func.func_defaults),',') + ')') - else: - contents.append(',()') - - # The function contents depends on the closure captured cell values. - try: - closure = func.func_closure or [] - except AttributeError: - # Older versions of Python do not support closures. - closure = [] - - #xxx = [_object_contents(x.cell_contents) for x in closure] - try: - xxx = map(lambda x: _object_contents(x.cell_contents), closure) - except AttributeError: - xxx = [] - contents.append(',(' + string.join(xxx, ',') + ')') - - return string.join(contents, '') - - -def _actionAppend(act1, act2): - # This function knows how to slap two actions together. - # Mainly, it handles ListActions by concatenating into - # a single ListAction. - a1 = Action(act1) - a2 = Action(act2) - if a1 is None or a2 is None: - raise TypeError, "Cannot append %s to %s" % (type(act1), type(act2)) - if isinstance(a1, ListAction): - if isinstance(a2, ListAction): - return ListAction(a1.list + a2.list) - else: - return ListAction(a1.list + [ a2 ]) - else: - if isinstance(a2, ListAction): - return ListAction([ a1 ] + a2.list) - else: - return ListAction([ a1, a2 ]) - -def _do_create_keywords(args, kw): - """This converts any arguments after the action argument into - their equivalent keywords and adds them to the kw argument. - """ - v = kw.get('varlist', ()) - # prevent varlist="FOO" from being interpreted as ['F', 'O', 'O'] - if is_String(v): v = (v,) - kw['varlist'] = tuple(v) - if args: - # turn positional args into equivalent keywords - cmdstrfunc = args[0] - if cmdstrfunc is None or is_String(cmdstrfunc): - kw['cmdstr'] = cmdstrfunc - elif callable(cmdstrfunc): - kw['strfunction'] = cmdstrfunc - else: - raise SCons.Errors.UserError( - 'Invalid command display variable type. ' - 'You must either pass a string or a callback which ' - 'accepts (target, source, env) as parameters.') - if len(args) > 1: - kw['varlist'] = args[1:] + kw['varlist'] - if kw.get('strfunction', _null) is not _null \ - and kw.get('cmdstr', _null) is not _null: - raise SCons.Errors.UserError( - 'Cannot have both strfunction and cmdstr args to Action()') - -def _do_create_action(act, kw): - """This is the actual "implementation" for the - Action factory method, below. This handles the - fact that passing lists to Action() itself has - different semantics than passing lists as elements - of lists. - - The former will create a ListAction, the latter - will create a CommandAction by converting the inner - list elements to strings.""" - - if isinstance(act, ActionBase): - return act - - if is_List(act): - #TODO(1.5) return CommandAction(act, **kw) - return apply(CommandAction, (act,), kw) - - if callable(act): - try: - gen = kw['generator'] - del kw['generator'] - except KeyError: - gen = 0 - if gen: - action_type = CommandGeneratorAction - else: - action_type = FunctionAction - return action_type(act, kw) - - if is_String(act): - var=SCons.Util.get_environment_var(act) - if var: - # This looks like a string that is purely an Environment - # variable reference, like "$FOO" or "${FOO}". We do - # something special here...we lazily evaluate the contents - # of that Environment variable, so a user could put something - # like a function or a CommandGenerator in that variable - # instead of a string. - return LazyAction(var, kw) - commands = string.split(str(act), '\n') - if len(commands) == 1: - #TODO(1.5) return CommandAction(commands[0], **kw) - return apply(CommandAction, (commands[0],), kw) - # The list of string commands may include a LazyAction, so we - # reprocess them via _do_create_list_action. - return _do_create_list_action(commands, kw) - return None - -def _do_create_list_action(act, kw): - """A factory for list actions. Convert the input list into Actions - and then wrap them in a ListAction.""" - acts = [] - for a in act: - aa = _do_create_action(a, kw) - if aa is not None: acts.append(aa) - if not acts: - return ListAction([]) - elif len(acts) == 1: - return acts[0] - else: - return ListAction(acts) - -def Action(act, *args, **kw): - """A factory for action objects.""" - # Really simple: the _do_create_* routines do the heavy lifting. - _do_create_keywords(args, kw) - if is_List(act): - return _do_create_list_action(act, kw) - return _do_create_action(act, kw) - -class ActionBase: - """Base class for all types of action objects that can be held by - other objects (Builders, Executors, etc.) This provides the - common methods for manipulating and combining those actions.""" - - def __cmp__(self, other): - return cmp(self.__dict__, other) - - def no_batch_key(self, env, target, source): - return None - - batch_key = no_batch_key - - def genstring(self, target, source, env): - return str(self) - - def get_contents(self, target, source, env): - result = [ self.get_presig(target, source, env) ] - # This should never happen, as the Action() factory should wrap - # the varlist, but just in case an action is created directly, - # we duplicate this check here. - vl = self.get_varlist(target, source, env) - if is_String(vl): vl = (vl,) - for v in vl: - result.append(env.subst('${'+v+'}')) - return string.join(result, '') - - def __add__(self, other): - return _actionAppend(self, other) - - def __radd__(self, other): - return _actionAppend(other, self) - - def presub_lines(self, env): - # CommandGeneratorAction needs a real environment - # in order to return the proper string here, since - # it may call LazyAction, which looks up a key - # in that env. So we temporarily remember the env here, - # and CommandGeneratorAction will use this env - # when it calls its _generate method. - self.presub_env = env - lines = string.split(str(self), '\n') - self.presub_env = None # don't need this any more - return lines - - def get_varlist(self, target, source, env, executor=None): - return self.varlist - - def get_targets(self, env, executor): - """ - Returns the type of targets ($TARGETS, $CHANGED_TARGETS) used - by this action. - """ - return self.targets - -class _ActionAction(ActionBase): - """Base class for actions that create output objects.""" - def __init__(self, cmdstr=_null, strfunction=_null, varlist=(), - presub=_null, chdir=None, exitstatfunc=None, - batch_key=None, targets='$TARGETS', - **kw): - self.cmdstr = cmdstr - if strfunction is not _null: - if strfunction is None: - self.cmdstr = None - else: - self.strfunction = strfunction - self.varlist = varlist - self.presub = presub - self.chdir = chdir - if not exitstatfunc: - exitstatfunc = default_exitstatfunc - self.exitstatfunc = exitstatfunc - - self.targets = targets - - if batch_key: - if not callable(batch_key): - # They have set batch_key, but not to their own - # callable. The default behavior here will batch - # *all* targets+sources using this action, separated - # for each construction environment. - def default_batch_key(self, env, target, source): - return (id(self), id(env)) - batch_key = default_batch_key - SCons.Util.AddMethod(self, batch_key, 'batch_key') - - def print_cmd_line(self, s, target, source, env): - sys.stdout.write(s + "\n") - - def __call__(self, target, source, env, - exitstatfunc=_null, - presub=_null, - show=_null, - execute=_null, - chdir=_null, - executor=None): - if not is_List(target): - target = [target] - if not is_List(source): - source = [source] - - if presub is _null: - presub = self.presub - if presub is _null: - presub = print_actions_presub - if exitstatfunc is _null: exitstatfunc = self.exitstatfunc - if show is _null: show = print_actions - if execute is _null: execute = execute_actions - if chdir is _null: chdir = self.chdir - save_cwd = None - if chdir: - save_cwd = os.getcwd() - try: - chdir = str(chdir.abspath) - except AttributeError: - if not is_String(chdir): - if executor: - chdir = str(executor.batches[0].targets[0].dir) - else: - chdir = str(target[0].dir) - if presub: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - t = string.join(map(str, target), ' and ') - l = string.join(self.presub_lines(env), '\n ') - out = "Building %s with action:\n %s\n" % (t, l) - sys.stdout.write(out) - cmd = None - if show and self.strfunction: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - try: - cmd = self.strfunction(target, source, env, executor) - except TypeError: - cmd = self.strfunction(target, source, env) - if cmd: - if chdir: - cmd = ('os.chdir(%s)\n' % repr(chdir)) + cmd - try: - get = env.get - except AttributeError: - print_func = self.print_cmd_line - else: - print_func = get('PRINT_CMD_LINE_FUNC') - if not print_func: - print_func = self.print_cmd_line - print_func(cmd, target, source, env) - stat = 0 - if execute: - if chdir: - os.chdir(chdir) - try: - stat = self.execute(target, source, env, executor=executor) - if isinstance(stat, SCons.Errors.BuildError): - s = exitstatfunc(stat.status) - if s: - stat.status = s - else: - stat = s - else: - stat = exitstatfunc(stat) - finally: - if save_cwd: - os.chdir(save_cwd) - if cmd and save_cwd: - print_func('os.chdir(%s)' % repr(save_cwd), target, source, env) - - return stat - - -def _string_from_cmd_list(cmd_list): - """Takes a list of command line arguments and returns a pretty - representation for printing.""" - cl = [] - for arg in map(str, cmd_list): - if ' ' in arg or '\t' in arg: - arg = '"' + arg + '"' - cl.append(arg) - return string.join(cl) - -# A fiddlin' little function that has an 'import SCons.Environment' which -# can't be moved to the top level without creating an import loop. Since -# this import creates a local variable named 'SCons', it blocks access to -# the global variable, so we move it here to prevent complaints about local -# variables being used uninitialized. -default_ENV = None -def get_default_ENV(env): - global default_ENV - try: - return env['ENV'] - except KeyError: - if not default_ENV: - import SCons.Environment - # This is a hideously expensive way to get a default shell - # environment. What it really should do is run the platform - # setup to get the default ENV. Fortunately, it's incredibly - # rare for an Environment not to have a shell environment, so - # we're not going to worry about it overmuch. - default_ENV = SCons.Environment.Environment()['ENV'] - return default_ENV - -# This function is still in draft mode. We're going to need something like -# it in the long run as more and more places use subprocess, but I'm sure -# it'll have to be tweaked to get the full desired functionality. -# one special arg (so far?), 'error', to tell what to do with exceptions. -def _subproc(env, cmd, error = 'ignore', **kw): - """Do common setup for a subprocess.Popen() call""" - # allow std{in,out,err} to be "'devnull'" - io = kw.get('stdin') - if is_String(io) and io == 'devnull': - kw['stdin'] = open(os.devnull) - io = kw.get('stdout') - if is_String(io) and io == 'devnull': - kw['stdout'] = open(os.devnull, 'w') - io = kw.get('stderr') - if is_String(io) and io == 'devnull': - kw['stderr'] = open(os.devnull, 'w') - - # Figure out what shell environment to use - ENV = kw.get('env', None) - if ENV is None: ENV = get_default_ENV(env) - - # Ensure that the ENV values are all strings: - new_env = {} - for key, value in ENV.items(): - if is_List(value): - # If the value is a list, then we assume it is a path list, - # because that's a pretty common list-like value to stick - # in an environment variable: - value = SCons.Util.flatten_sequence(value) - new_env[key] = string.join(map(str, value), os.pathsep) - else: - # It's either a string or something else. If it's a string, - # we still want to call str() because it might be a *Unicode* - # string, which makes subprocess.Popen() gag. If it isn't a - # string or a list, then we just coerce it to a string, which - # is the proper way to handle Dir and File instances and will - # produce something reasonable for just about everything else: - new_env[key] = str(value) - kw['env'] = new_env - - try: - #FUTURE return subprocess.Popen(cmd, **kw) - return apply(subprocess.Popen, (cmd,), kw) - except EnvironmentError, e: - if error == 'raise': raise - # return a dummy Popen instance that only returns error - class dummyPopen: - def __init__(self, e): self.exception = e - def communicate(self): return ('','') - def wait(self): return -self.exception.errno - stdin = None - class f: - def read(self): return '' - def readline(self): return '' - stdout = stderr = f() - return dummyPopen(e) - -class CommandAction(_ActionAction): - """Class for command-execution actions.""" - def __init__(self, cmd, **kw): - # Cmd can actually be a list or a single item; if it's a - # single item it should be the command string to execute; if a - # list then it should be the words of the command string to - # execute. Only a single command should be executed by this - # object; lists of commands should be handled by embedding - # these objects in a ListAction object (which the Action() - # factory above does). cmd will be passed to - # Environment.subst_list() for substituting environment - # variables. - if __debug__: logInstanceCreation(self, 'Action.CommandAction') - - #TODO(1.5) _ActionAction.__init__(self, **kw) - apply(_ActionAction.__init__, (self,), kw) - if is_List(cmd): - if filter(is_List, cmd): - raise TypeError, "CommandAction should be given only " \ - "a single command" - self.cmd_list = cmd - - def __str__(self): - if is_List(self.cmd_list): - return string.join(map(str, self.cmd_list), ' ') - return str(self.cmd_list) - - def process(self, target, source, env, executor=None): - if executor: - result = env.subst_list(self.cmd_list, 0, executor=executor) - else: - result = env.subst_list(self.cmd_list, 0, target, source) - silent = None - ignore = None - while 1: - try: c = result[0][0][0] - except IndexError: c = None - if c == '@': silent = 1 - elif c == '-': ignore = 1 - else: break - result[0][0] = result[0][0][1:] - try: - if not result[0][0]: - result[0] = result[0][1:] - except IndexError: - pass - return result, ignore, silent - - def strfunction(self, target, source, env, executor=None): - if self.cmdstr is None: - return None - if self.cmdstr is not _null: - from SCons.Subst import SUBST_RAW - if executor: - c = env.subst(self.cmdstr, SUBST_RAW, executor=executor) - else: - c = env.subst(self.cmdstr, SUBST_RAW, target, source) - if c: - return c - cmd_list, ignore, silent = self.process(target, source, env, executor) - if silent: - return '' - return _string_from_cmd_list(cmd_list[0]) - - def execute(self, target, source, env, executor=None): - """Execute a command action. - - This will handle lists of commands as well as individual commands, - because construction variable substitution may turn a single - "command" into a list. This means that this class can actually - handle lists of commands, even though that's not how we use it - externally. - """ - escape_list = SCons.Subst.escape_list - flatten_sequence = SCons.Util.flatten_sequence - - try: - shell = env['SHELL'] - except KeyError: - raise SCons.Errors.UserError('Missing SHELL construction variable.') - - try: - spawn = env['SPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing SPAWN construction variable.') - else: - if is_String(spawn): - spawn = env.subst(spawn, raw=1, conv=lambda x: x) - - escape = env.get('ESCAPE', lambda x: x) - - ENV = get_default_ENV(env) - - # Ensure that the ENV values are all strings: - for key, value in ENV.items(): - if not is_String(value): - if is_List(value): - # If the value is a list, then we assume it is a - # path list, because that's a pretty common list-like - # value to stick in an environment variable: - value = flatten_sequence(value) - ENV[key] = string.join(map(str, value), os.pathsep) - else: - # If it isn't a string or a list, then we just coerce - # it to a string, which is the proper way to handle - # Dir and File instances and will produce something - # reasonable for just about everything else: - ENV[key] = str(value) - - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - cmd_list, ignore, silent = self.process(target, map(rfile, source), env, executor) - - # Use len() to filter out any "command" that's zero-length. - for cmd_line in filter(len, cmd_list): - # Escape the command line for the interpreter we are using. - cmd_line = escape_list(cmd_line, escape) - result = spawn(shell, escape, cmd_line[0], cmd_line, ENV) - if not ignore and result: - msg = "Error %s" % result - return SCons.Errors.BuildError(errstr=msg, - status=result, - action=self, - command=cmd_line) - return 0 - - def get_presig(self, target, source, env, executor=None): - """Return the signature contents of this action's command line. - - This strips $(-$) and everything in between the string, - since those parts don't affect signatures. - """ - from SCons.Subst import SUBST_SIG - cmd = self.cmd_list - if is_List(cmd): - cmd = string.join(map(str, cmd)) - else: - cmd = str(cmd) - if executor: - return env.subst_target_source(cmd, SUBST_SIG, executor=executor) - else: - return env.subst_target_source(cmd, SUBST_SIG, target, source) - - def get_implicit_deps(self, target, source, env, executor=None): - icd = env.get('IMPLICIT_COMMAND_DEPENDENCIES', True) - if is_String(icd) and icd[:1] == '$': - icd = env.subst(icd) - if not icd or icd in ('0', 'None'): - return [] - from SCons.Subst import SUBST_SIG - if executor: - cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, executor=executor) - else: - cmd_list = env.subst_list(self.cmd_list, SUBST_SIG, target, source) - res = [] - for cmd_line in cmd_list: - if cmd_line: - d = str(cmd_line[0]) - m = strip_quotes.match(d) - if m: - d = m.group(1) - d = env.WhereIs(d) - if d: - res.append(env.fs.File(d)) - return res - -class CommandGeneratorAction(ActionBase): - """Class for command-generator actions.""" - def __init__(self, generator, kw): - if __debug__: logInstanceCreation(self, 'Action.CommandGeneratorAction') - self.generator = generator - self.gen_kw = kw - self.varlist = kw.get('varlist', ()) - self.targets = kw.get('targets', '$TARGETS') - - def _generate(self, target, source, env, for_signature, executor=None): - # ensure that target is a list, to make it easier to write - # generator functions: - if not is_List(target): - target = [target] - - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - ret = self.generator(target=target, - source=source, - env=env, - for_signature=for_signature) - #TODO(1.5) gen_cmd = Action(ret, **self.gen_kw) - gen_cmd = apply(Action, (ret,), self.gen_kw) - if not gen_cmd: - raise SCons.Errors.UserError("Object returned from command generator: %s cannot be used to create an Action." % repr(ret)) - return gen_cmd - - def __str__(self): - try: - env = self.presub_env - except AttributeError: - env = None - if env is None: - env = SCons.Defaults.DefaultEnvironment() - act = self._generate([], [], env, 1) - return str(act) - - def batch_key(self, env, target, source): - return self._generate(target, source, env, 1).batch_key(env, target, source) - - def genstring(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).genstring(target, source, env) - - def __call__(self, target, source, env, exitstatfunc=_null, presub=_null, - show=_null, execute=_null, chdir=_null, executor=None): - act = self._generate(target, source, env, 0, executor) - if act is None: - raise UserError("While building `%s': Cannot deduce file extension from source files: %s" % (repr(map(str, target)), repr(map(str, source)))) - return act(target, source, env, exitstatfunc, presub, - show, execute, chdir, executor) - - def get_presig(self, target, source, env, executor=None): - """Return the signature contents of this action's command line. - - This strips $(-$) and everything in between the string, - since those parts don't affect signatures. - """ - return self._generate(target, source, env, 1, executor).get_presig(target, source, env) - - def get_implicit_deps(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).get_implicit_deps(target, source, env) - - def get_varlist(self, target, source, env, executor=None): - return self._generate(target, source, env, 1, executor).get_varlist(target, source, env, executor) - - def get_targets(self, env, executor): - return self._generate(None, None, env, 1, executor).get_targets(env, executor) - - - -# A LazyAction is a kind of hybrid generator and command action for -# strings of the form "$VAR". These strings normally expand to other -# strings (think "$CCCOM" to "$CC -c -o $TARGET $SOURCE"), but we also -# want to be able to replace them with functions in the construction -# environment. Consequently, we want lazy evaluation and creation of -# an Action in the case of the function, but that's overkill in the more -# normal case of expansion to other strings. -# -# So we do this with a subclass that's both a generator *and* -# a command action. The overridden methods all do a quick check -# of the construction variable, and if it's a string we just call -# the corresponding CommandAction method to do the heavy lifting. -# If not, then we call the same-named CommandGeneratorAction method. -# The CommandGeneratorAction methods work by using the overridden -# _generate() method, that is, our own way of handling "generation" of -# an action based on what's in the construction variable. - -class LazyAction(CommandGeneratorAction, CommandAction): - - def __init__(self, var, kw): - if __debug__: logInstanceCreation(self, 'Action.LazyAction') - #FUTURE CommandAction.__init__(self, '${'+var+'}', **kw) - apply(CommandAction.__init__, (self, '${'+var+'}'), kw) - self.var = SCons.Util.to_String(var) - self.gen_kw = kw - - def get_parent_class(self, env): - c = env.get(self.var) - if is_String(c) and not '\n' in c: - return CommandAction - return CommandGeneratorAction - - def _generate_cache(self, env): - if env: - c = env.get(self.var, '') - else: - c = '' - #TODO(1.5) gen_cmd = Action(c, **self.gen_kw) - gen_cmd = apply(Action, (c,), self.gen_kw) - if not gen_cmd: - raise SCons.Errors.UserError("$%s value %s cannot be used to create an Action." % (self.var, repr(c))) - return gen_cmd - - def _generate(self, target, source, env, for_signature, executor=None): - return self._generate_cache(env) - - def __call__(self, target, source, env, *args, **kw): - args = (self, target, source, env) + args - c = self.get_parent_class(env) - #TODO(1.5) return c.__call__(*args, **kw) - return apply(c.__call__, args, kw) - - def get_presig(self, target, source, env): - c = self.get_parent_class(env) - return c.get_presig(self, target, source, env) - - def get_varlist(self, target, source, env, executor=None): - c = self.get_parent_class(env) - return c.get_varlist(self, target, source, env, executor) - - -class FunctionAction(_ActionAction): - """Class for Python function actions.""" - - def __init__(self, execfunction, kw): - if __debug__: logInstanceCreation(self, 'Action.FunctionAction') - - self.execfunction = execfunction - try: - self.funccontents = _callable_contents(execfunction) - except AttributeError: - try: - # See if execfunction will do the heavy lifting for us. - self.gc = execfunction.get_contents - except AttributeError: - # This is weird, just do the best we can. - self.funccontents = _object_contents(execfunction) - - #TODO(1.5) _ActionAction.__init__(self, **kw) - apply(_ActionAction.__init__, (self,), kw) - - def function_name(self): - try: - return self.execfunction.__name__ - except AttributeError: - try: - return self.execfunction.__class__.__name__ - except AttributeError: - return "unknown_python_function" - - def strfunction(self, target, source, env, executor=None): - if self.cmdstr is None: - return None - if self.cmdstr is not _null: - from SCons.Subst import SUBST_RAW - if executor: - c = env.subst(self.cmdstr, SUBST_RAW, executor=executor) - else: - c = env.subst(self.cmdstr, SUBST_RAW, target, source) - if c: - return c - def array(a): - def quote(s): - try: - str_for_display = s.str_for_display - except AttributeError: - s = repr(s) - else: - s = str_for_display() - return s - return '[' + string.join(map(quote, a), ", ") + ']' - try: - strfunc = self.execfunction.strfunction - except AttributeError: - pass - else: - if strfunc is None: - return None - if callable(strfunc): - return strfunc(target, source, env) - name = self.function_name() - tstr = array(target) - sstr = array(source) - return "%s(%s, %s)" % (name, tstr, sstr) - - def __str__(self): - name = self.function_name() - if name == 'ActionCaller': - return str(self.execfunction) - return "%s(target, source, env)" % name - - def execute(self, target, source, env, executor=None): - exc_info = (None,None,None) - try: - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - rsources = map(rfile, source) - try: - result = self.execfunction(target=target, source=rsources, env=env) - except KeyboardInterrupt, e: - raise - except SystemExit, e: - raise - except Exception, e: - result = e - exc_info = sys.exc_info() - - if result: - result = SCons.Errors.convert_to_BuildError(result, exc_info) - result.node=target - result.action=self - try: - result.command=self.strfunction(target, source, env, executor) - except TypeError: - result.command=self.strfunction(target, source, env) - - # FIXME: This maintains backward compatibility with respect to - # which type of exceptions were returned by raising an - # exception and which ones were returned by value. It would - # probably be best to always return them by value here, but - # some codes do not check the return value of Actions and I do - # not have the time to modify them at this point. - if (exc_info[1] and - not isinstance(exc_info[1],EnvironmentError)): - raise result - - return result - finally: - # Break the cycle between the traceback object and this - # function stack frame. See the sys.exc_info() doc info for - # more information about this issue. - del exc_info - - - def get_presig(self, target, source, env): - """Return the signature contents of this callable action.""" - try: - return self.gc(target, source, env) - except AttributeError: - return self.funccontents - - def get_implicit_deps(self, target, source, env): - return [] - -class ListAction(ActionBase): - """Class for lists of other actions.""" - def __init__(self, list): - if __debug__: logInstanceCreation(self, 'Action.ListAction') - def list_of_actions(x): - if isinstance(x, ActionBase): - return x - return Action(x) - self.list = map(list_of_actions, list) - # our children will have had any varlist - # applied; we don't need to do it again - self.varlist = () - self.targets = '$TARGETS' - - def genstring(self, target, source, env): - return string.join(map(lambda a, t=target, s=source, e=env: - a.genstring(t, s, e), - self.list), - '\n') - - def __str__(self): - return string.join(map(str, self.list), '\n') - - def presub_lines(self, env): - return SCons.Util.flatten_sequence( - map(lambda a, env=env: a.presub_lines(env), self.list)) - - def get_presig(self, target, source, env): - """Return the signature contents of this action list. - - Simple concatenation of the signatures of the elements. - """ - return string.join(map(lambda x, t=target, s=source, e=env: - x.get_contents(t, s, e), - self.list), - "") - - def __call__(self, target, source, env, exitstatfunc=_null, presub=_null, - show=_null, execute=_null, chdir=_null, executor=None): - if executor: - target = executor.get_all_targets() - source = executor.get_all_sources() - for act in self.list: - stat = act(target, source, env, exitstatfunc, presub, - show, execute, chdir, executor) - if stat: - return stat - return 0 - - def get_implicit_deps(self, target, source, env): - result = [] - for act in self.list: - result.extend(act.get_implicit_deps(target, source, env)) - return result - - def get_varlist(self, target, source, env, executor=None): - result = SCons.Util.OrderedDict() - for act in self.list: - for var in act.get_varlist(target, source, env, executor): - result[var] = True - return result.keys() - -class ActionCaller: - """A class for delaying calling an Action function with specific - (positional and keyword) arguments until the Action is actually - executed. - - This class looks to the rest of the world like a normal Action object, - but what it's really doing is hanging on to the arguments until we - have a target, source and env to use for the expansion. - """ - def __init__(self, parent, args, kw): - self.parent = parent - self.args = args - self.kw = kw - - def get_contents(self, target, source, env): - actfunc = self.parent.actfunc - try: - # "self.actfunc" is a function. - contents = str(actfunc.func_code.co_code) - except AttributeError: - # "self.actfunc" is a callable object. - try: - contents = str(actfunc.__call__.im_func.func_code.co_code) - except AttributeError: - # No __call__() method, so it might be a builtin - # or something like that. Do the best we can. - contents = str(actfunc) - contents = remove_set_lineno_codes(contents) - return contents - - def subst(self, s, target, source, env): - # If s is a list, recursively apply subst() - # to every element in the list - if is_List(s): - result = [] - for elem in s: - result.append(self.subst(elem, target, source, env)) - return self.parent.convert(result) - - # Special-case hack: Let a custom function wrapped in an - # ActionCaller get at the environment through which the action - # was called by using this hard-coded value as a special return. - if s == '$__env__': - return env - elif is_String(s): - return env.subst(s, 1, target, source) - return self.parent.convert(s) - - def subst_args(self, target, source, env): - return map(lambda x, self=self, t=target, s=source, e=env: - self.subst(x, t, s, e), - self.args) - - def subst_kw(self, target, source, env): - kw = {} - for key in self.kw.keys(): - kw[key] = self.subst(self.kw[key], target, source, env) - return kw - - def __call__(self, target, source, env, executor=None): - args = self.subst_args(target, source, env) - kw = self.subst_kw(target, source, env) - #TODO(1.5) return self.parent.actfunc(*args, **kw) - return apply(self.parent.actfunc, args, kw) - - def strfunction(self, target, source, env): - args = self.subst_args(target, source, env) - kw = self.subst_kw(target, source, env) - #TODO(1.5) return self.parent.strfunc(*args, **kw) - return apply(self.parent.strfunc, args, kw) - - def __str__(self): - #TODO(1.5) return self.parent.strfunc(*self.args, **self.kw) - return apply(self.parent.strfunc, self.args, self.kw) - -class ActionFactory: - """A factory class that will wrap up an arbitrary function - as an SCons-executable Action object. - - The real heavy lifting here is done by the ActionCaller class. - We just collect the (positional and keyword) arguments that we're - called with and give them to the ActionCaller object we create, - so it can hang onto them until it needs them. - """ - def __init__(self, actfunc, strfunc, convert=lambda x: x): - self.actfunc = actfunc - self.strfunc = strfunc - self.convert = convert - - def __call__(self, *args, **kw): - ac = ActionCaller(self, args, kw) - action = Action(ac, strfunction=ac.strfunction) - return action - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Builder.py b/share/scons-local-1.3.0/SCons/Builder.py deleted file mode 100644 index 7a9a0285f7eecac30e26fbb5b1aad1d879a27649..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Builder.py +++ /dev/null @@ -1,878 +0,0 @@ -"""SCons.Builder - -Builder object subsystem. - -A Builder object is a callable that encapsulates information about how -to execute actions to create a target Node (file) from source Nodes -(files), and how to create those dependencies for tracking. - -The main entry point here is the Builder() factory method. This provides -a procedural interface that creates the right underlying Builder object -based on the keyword arguments supplied and the types of the arguments. - -The goal is for this external interface to be simple enough that the -vast majority of users can create new Builders as necessary to support -building new types of files in their configurations, without having to -dive any deeper into this subsystem. - -The base class here is BuilderBase. This is a concrete base class which -does, in fact, represent the Builder objects that we (or users) create. - -There is also a proxy that looks like a Builder: - - CompositeBuilder - - This proxies for a Builder with an action that is actually a - dictionary that knows how to map file suffixes to a specific - action. This is so that we can invoke different actions - (compilers, compile options) for different flavors of source - files. - -Builders and their proxies have the following public interface methods -used by other modules: - - __call__() - THE public interface. Calling a Builder object (with the - use of internal helper methods) sets up the target and source - dependencies, appropriate mapping to a specific action, and the - environment manipulation necessary for overridden construction - variable. This also takes care of warning about possible mistakes - in keyword arguments. - - add_emitter() - Adds an emitter for a specific file suffix, used by some Tool - modules to specify that (for example) a yacc invocation on a .y - can create a .h *and* a .c file. - - add_action() - Adds an action for a specific file suffix, heavily used by - Tool modules to add their specific action(s) for turning - a source file into an object file to the global static - and shared object file Builders. - -There are the following methods for internal use within this module: - - _execute() - The internal method that handles the heavily lifting when a - Builder is called. This is used so that the __call__() methods - can set up warning about possible mistakes in keyword-argument - overrides, and *then* execute all of the steps necessary so that - the warnings only occur once. - - get_name() - Returns the Builder's name within a specific Environment, - primarily used to try to return helpful information in error - messages. - - adjust_suffix() - get_prefix() - get_suffix() - get_src_suffix() - set_src_suffix() - Miscellaneous stuff for handling the prefix and suffix - manipulation we use in turning source file names into target - file names. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Builder.py 4720 2010/03/24 03:14:11 jars" - -import UserDict -import UserList - -import SCons.Action -from SCons.Debug import logInstanceCreation -from SCons.Errors import InternalError, UserError -import SCons.Executor -import SCons.Memoize -import SCons.Node -import SCons.Node.FS -import SCons.Util -import SCons.Warnings - -class _Null: - pass - -_null = _Null - -def match_splitext(path, suffixes = []): - if suffixes: - matchsuf = filter(lambda S,path=path: path[-len(S):] == S, - suffixes) - if matchsuf: - suf = max(map(None, map(len, matchsuf), matchsuf))[1] - return [path[:-len(suf)], path[-len(suf):]] - return SCons.Util.splitext(path) - -class DictCmdGenerator(SCons.Util.Selector): - """This is a callable class that can be used as a - command generator function. It holds on to a dictionary - mapping file suffixes to Actions. It uses that dictionary - to return the proper action based on the file suffix of - the source file.""" - - def __init__(self, dict=None, source_ext_match=1): - SCons.Util.Selector.__init__(self, dict) - self.source_ext_match = source_ext_match - - def src_suffixes(self): - return self.keys() - - def add_action(self, suffix, action): - """Add a suffix-action pair to the mapping. - """ - self[suffix] = action - - def __call__(self, target, source, env, for_signature): - if not source: - return [] - - if self.source_ext_match: - suffixes = self.src_suffixes() - ext = None - for src in map(str, source): - my_ext = match_splitext(src, suffixes)[1] - if ext and my_ext != ext: - raise UserError("While building `%s' from `%s': Cannot build multiple sources with different extensions: %s, %s" % (repr(map(str, target)), src, ext, my_ext)) - ext = my_ext - else: - ext = match_splitext(str(source[0]), self.src_suffixes())[1] - - if not ext: - #return ext - raise UserError("While building `%s': Cannot deduce file extension from source files: %s" % (repr(map(str, target)), repr(map(str, source)))) - - try: - ret = SCons.Util.Selector.__call__(self, env, source, ext) - except KeyError, e: - raise UserError("Ambiguous suffixes after environment substitution: %s == %s == %s" % (e[0], e[1], e[2])) - if ret is None: - raise UserError("While building `%s' from `%s': Don't know how to build from a source file with suffix `%s'. Expected a suffix in this list: %s." % \ - (repr(map(str, target)), repr(map(str, source)), ext, repr(self.keys()))) - return ret - -class CallableSelector(SCons.Util.Selector): - """A callable dictionary that will, in turn, call the value it - finds if it can.""" - def __call__(self, env, source): - value = SCons.Util.Selector.__call__(self, env, source) - if callable(value): - value = value(env, source) - return value - -class DictEmitter(SCons.Util.Selector): - """A callable dictionary that maps file suffixes to emitters. - When called, it finds the right emitter in its dictionary for the - suffix of the first source file, and calls that emitter to get the - right lists of targets and sources to return. If there's no emitter - for the suffix in its dictionary, the original target and source are - returned. - """ - def __call__(self, target, source, env): - emitter = SCons.Util.Selector.__call__(self, env, source) - if emitter: - target, source = emitter(target, source, env) - return (target, source) - -class ListEmitter(UserList.UserList): - """A callable list of emitters that calls each in sequence, - returning the result. - """ - def __call__(self, target, source, env): - for e in self.data: - target, source = e(target, source, env) - return (target, source) - -# These are a common errors when calling a Builder; -# they are similar to the 'target' and 'source' keyword args to builders, -# so we issue warnings when we see them. The warnings can, of course, -# be disabled. -misleading_keywords = { - 'targets' : 'target', - 'sources' : 'source', -} - -class OverrideWarner(UserDict.UserDict): - """A class for warning about keyword arguments that we use as - overrides in a Builder call. - - This class exists to handle the fact that a single Builder call - can actually invoke multiple builders. This class only emits the - warnings once, no matter how many Builders are invoked. - """ - def __init__(self, dict): - UserDict.UserDict.__init__(self, dict) - if __debug__: logInstanceCreation(self, 'Builder.OverrideWarner') - self.already_warned = None - def warn(self): - if self.already_warned: - return - for k in self.keys(): - if misleading_keywords.has_key(k): - alt = misleading_keywords[k] - msg = "Did you mean to use `%s' instead of `%s'?" % (alt, k) - SCons.Warnings.warn(SCons.Warnings.MisleadingKeywordsWarning, msg) - self.already_warned = 1 - -def Builder(**kw): - """A factory for builder objects.""" - composite = None - if kw.has_key('generator'): - if kw.has_key('action'): - raise UserError, "You must not specify both an action and a generator." - kw['action'] = SCons.Action.CommandGeneratorAction(kw['generator'], {}) - del kw['generator'] - elif kw.has_key('action'): - source_ext_match = kw.get('source_ext_match', 1) - if kw.has_key('source_ext_match'): - del kw['source_ext_match'] - if SCons.Util.is_Dict(kw['action']): - composite = DictCmdGenerator(kw['action'], source_ext_match) - kw['action'] = SCons.Action.CommandGeneratorAction(composite, {}) - kw['src_suffix'] = composite.src_suffixes() - else: - kw['action'] = SCons.Action.Action(kw['action']) - - if kw.has_key('emitter'): - emitter = kw['emitter'] - if SCons.Util.is_String(emitter): - # This allows users to pass in an Environment - # variable reference (like "$FOO") as an emitter. - # We will look in that Environment variable for - # a callable to use as the actual emitter. - var = SCons.Util.get_environment_var(emitter) - if not var: - raise UserError, "Supplied emitter '%s' does not appear to refer to an Environment variable" % emitter - kw['emitter'] = EmitterProxy(var) - elif SCons.Util.is_Dict(emitter): - kw['emitter'] = DictEmitter(emitter) - elif SCons.Util.is_List(emitter): - kw['emitter'] = ListEmitter(emitter) - - result = apply(BuilderBase, (), kw) - - if not composite is None: - result = CompositeBuilder(result, composite) - - return result - -def _node_errors(builder, env, tlist, slist): - """Validate that the lists of target and source nodes are - legal for this builder and environment. Raise errors or - issue warnings as appropriate. - """ - - # First, figure out if there are any errors in the way the targets - # were specified. - for t in tlist: - if t.side_effect: - raise UserError, "Multiple ways to build the same target were specified for: %s" % t - if t.has_explicit_builder(): - if not t.env is None and not t.env is env: - action = t.builder.action - t_contents = action.get_contents(tlist, slist, t.env) - contents = action.get_contents(tlist, slist, env) - - if t_contents == contents: - msg = "Two different environments were specified for target %s,\n\tbut they appear to have the same action: %s" % (t, action.genstring(tlist, slist, t.env)) - SCons.Warnings.warn(SCons.Warnings.DuplicateEnvironmentWarning, msg) - else: - msg = "Two environments with different actions were specified for the same target: %s" % t - raise UserError, msg - if builder.multi: - if t.builder != builder: - msg = "Two different builders (%s and %s) were specified for the same target: %s" % (t.builder.get_name(env), builder.get_name(env), t) - raise UserError, msg - # TODO(batch): list constructed each time! - if t.get_executor().get_all_targets() != tlist: - msg = "Two different target lists have a target in common: %s (from %s and from %s)" % (t, map(str, t.get_executor().get_all_targets()), map(str, tlist)) - raise UserError, msg - elif t.sources != slist: - msg = "Multiple ways to build the same target were specified for: %s (from %s and from %s)" % (t, map(str, t.sources), map(str, slist)) - raise UserError, msg - - if builder.single_source: - if len(slist) > 1: - raise UserError, "More than one source given for single-source builder: targets=%s sources=%s" % (map(str,tlist), map(str,slist)) - -class EmitterProxy: - """This is a callable class that can act as a - Builder emitter. It holds on to a string that - is a key into an Environment dictionary, and will - look there at actual build time to see if it holds - a callable. If so, we will call that as the actual - emitter.""" - def __init__(self, var): - self.var = SCons.Util.to_String(var) - - def __call__(self, target, source, env): - emitter = self.var - - # Recursively substitute the variable. - # We can't use env.subst() because it deals only - # in strings. Maybe we should change that? - while SCons.Util.is_String(emitter) and env.has_key(emitter): - emitter = env[emitter] - if callable(emitter): - target, source = emitter(target, source, env) - elif SCons.Util.is_List(emitter): - for e in emitter: - target, source = e(target, source, env) - - return (target, source) - - - def __cmp__(self, other): - return cmp(self.var, other.var) - -class BuilderBase: - """Base class for Builders, objects that create output - nodes (files) from input nodes (files). - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self, action = None, - prefix = '', - suffix = '', - src_suffix = '', - target_factory = None, - source_factory = None, - target_scanner = None, - source_scanner = None, - emitter = None, - multi = 0, - env = None, - single_source = 0, - name = None, - chdir = _null, - is_explicit = 1, - src_builder = None, - ensure_suffix = False, - **overrides): - if __debug__: logInstanceCreation(self, 'Builder.BuilderBase') - self._memo = {} - self.action = action - self.multi = multi - if SCons.Util.is_Dict(prefix): - prefix = CallableSelector(prefix) - self.prefix = prefix - if SCons.Util.is_Dict(suffix): - suffix = CallableSelector(suffix) - self.env = env - self.single_source = single_source - if overrides.has_key('overrides'): - SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning, - "The \"overrides\" keyword to Builder() creation has been deprecated;\n" +\ - "\tspecify the items as keyword arguments to the Builder() call instead.") - overrides.update(overrides['overrides']) - del overrides['overrides'] - if overrides.has_key('scanner'): - SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning, - "The \"scanner\" keyword to Builder() creation has been deprecated;\n" - "\tuse: source_scanner or target_scanner as appropriate.") - del overrides['scanner'] - self.overrides = overrides - - self.set_suffix(suffix) - self.set_src_suffix(src_suffix) - self.ensure_suffix = ensure_suffix - - self.target_factory = target_factory - self.source_factory = source_factory - self.target_scanner = target_scanner - self.source_scanner = source_scanner - - self.emitter = emitter - - # Optional Builder name should only be used for Builders - # that don't get attached to construction environments. - if name: - self.name = name - self.executor_kw = {} - if not chdir is _null: - self.executor_kw['chdir'] = chdir - self.is_explicit = is_explicit - - if src_builder is None: - src_builder = [] - elif not SCons.Util.is_List(src_builder): - src_builder = [ src_builder ] - self.src_builder = src_builder - - def __nonzero__(self): - raise InternalError, "Do not test for the Node.builder attribute directly; use Node.has_builder() instead" - - def get_name(self, env): - """Attempts to get the name of the Builder. - - Look at the BUILDERS variable of env, expecting it to be a - dictionary containing this Builder, and return the key of the - dictionary. If there's no key, then return a directly-configured - name (if there is one) or the name of the class (by default).""" - - try: - index = env['BUILDERS'].values().index(self) - return env['BUILDERS'].keys()[index] - except (AttributeError, KeyError, TypeError, ValueError): - try: - return self.name - except AttributeError: - return str(self.__class__) - - def __cmp__(self, other): - return cmp(self.__dict__, other.__dict__) - - def splitext(self, path, env=None): - if not env: - env = self.env - if env: - suffixes = self.src_suffixes(env) - else: - suffixes = [] - return match_splitext(path, suffixes) - - def _adjustixes(self, files, pre, suf, ensure_suffix=False): - if not files: - return [] - result = [] - if not SCons.Util.is_List(files): - files = [files] - - for f in files: - if SCons.Util.is_String(f): - f = SCons.Util.adjustixes(f, pre, suf, ensure_suffix) - result.append(f) - return result - - def _create_nodes(self, env, target = None, source = None): - """Create and return lists of target and source nodes. - """ - src_suf = self.get_src_suffix(env) - - target_factory = env.get_factory(self.target_factory) - source_factory = env.get_factory(self.source_factory) - - source = self._adjustixes(source, None, src_suf) - slist = env.arg2nodes(source, source_factory) - - pre = self.get_prefix(env, slist) - suf = self.get_suffix(env, slist) - - if target is None: - try: - t_from_s = slist[0].target_from_source - except AttributeError: - raise UserError("Do not know how to create a target from source `%s'" % slist[0]) - except IndexError: - tlist = [] - else: - splitext = lambda S,self=self,env=env: self.splitext(S,env) - tlist = [ t_from_s(pre, suf, splitext) ] - else: - target = self._adjustixes(target, pre, suf, self.ensure_suffix) - tlist = env.arg2nodes(target, target_factory, target=target, source=source) - - if self.emitter: - # The emitter is going to do str(node), but because we're - # being called *from* a builder invocation, the new targets - # don't yet have a builder set on them and will look like - # source files. Fool the emitter's str() calls by setting - # up a temporary builder on the new targets. - new_targets = [] - for t in tlist: - if not t.is_derived(): - t.builder_set(self) - new_targets.append(t) - - orig_tlist = tlist[:] - orig_slist = slist[:] - - target, source = self.emitter(target=tlist, source=slist, env=env) - - # Now delete the temporary builders that we attached to any - # new targets, so that _node_errors() doesn't do weird stuff - # to them because it thinks they already have builders. - for t in new_targets: - if t.builder is self: - # Only delete the temporary builder if the emitter - # didn't change it on us. - t.builder_set(None) - - # Have to call arg2nodes yet again, since it is legal for - # emitters to spit out strings as well as Node instances. - tlist = env.arg2nodes(target, target_factory, - target=orig_tlist, source=orig_slist) - slist = env.arg2nodes(source, source_factory, - target=orig_tlist, source=orig_slist) - - return tlist, slist - - def _execute(self, env, target, source, overwarn={}, executor_kw={}): - # We now assume that target and source are lists or None. - if self.src_builder: - source = self.src_builder_sources(env, source, overwarn) - - if self.single_source and len(source) > 1 and target is None: - result = [] - if target is None: target = [None]*len(source) - for tgt, src in zip(target, source): - if not tgt is None: tgt = [tgt] - if not src is None: src = [src] - result.extend(self._execute(env, tgt, src, overwarn)) - return SCons.Node.NodeList(result) - - overwarn.warn() - - tlist, slist = self._create_nodes(env, target, source) - - # Check for errors with the specified target/source lists. - _node_errors(self, env, tlist, slist) - - # The targets are fine, so find or make the appropriate Executor to - # build this particular list of targets from this particular list of - # sources. - - executor = None - key = None - - if self.multi: - try: - executor = tlist[0].get_executor(create = 0) - except (AttributeError, IndexError): - pass - else: - executor.add_sources(slist) - - if executor is None: - if not self.action: - fmt = "Builder %s must have an action to build %s." - raise UserError, fmt % (self.get_name(env or self.env), - map(str,tlist)) - key = self.action.batch_key(env or self.env, tlist, slist) - if key: - try: - executor = SCons.Executor.GetBatchExecutor(key) - except KeyError: - pass - else: - executor.add_batch(tlist, slist) - - if executor is None: - executor = SCons.Executor.Executor(self.action, env, [], - tlist, slist, executor_kw) - if key: - SCons.Executor.AddBatchExecutor(key, executor) - - # Now set up the relevant information in the target Nodes themselves. - for t in tlist: - t.cwd = env.fs.getcwd() - t.builder_set(self) - t.env_set(env) - t.add_source(slist) - t.set_executor(executor) - t.set_explicit(self.is_explicit) - - return SCons.Node.NodeList(tlist) - - def __call__(self, env, target=None, source=None, chdir=_null, **kw): - # We now assume that target and source are lists or None. - # The caller (typically Environment.BuilderWrapper) is - # responsible for converting any scalar values to lists. - if chdir is _null: - ekw = self.executor_kw - else: - ekw = self.executor_kw.copy() - ekw['chdir'] = chdir - if kw: - if kw.has_key('srcdir'): - def prependDirIfRelative(f, srcdir=kw['srcdir']): - import os.path - if SCons.Util.is_String(f) and not os.path.isabs(f): - f = os.path.join(srcdir, f) - return f - if not SCons.Util.is_List(source): - source = [source] - source = map(prependDirIfRelative, source) - del kw['srcdir'] - if self.overrides: - env_kw = self.overrides.copy() - env_kw.update(kw) - else: - env_kw = kw - else: - env_kw = self.overrides - env = env.Override(env_kw) - return self._execute(env, target, source, OverrideWarner(kw), ekw) - - def adjust_suffix(self, suff): - if suff and not suff[0] in [ '.', '_', '$' ]: - return '.' + suff - return suff - - def get_prefix(self, env, sources=[]): - prefix = self.prefix - if callable(prefix): - prefix = prefix(env, sources) - return env.subst(prefix) - - def set_suffix(self, suffix): - if not callable(suffix): - suffix = self.adjust_suffix(suffix) - self.suffix = suffix - - def get_suffix(self, env, sources=[]): - suffix = self.suffix - if callable(suffix): - suffix = suffix(env, sources) - return env.subst(suffix) - - def set_src_suffix(self, src_suffix): - if not src_suffix: - src_suffix = [] - elif not SCons.Util.is_List(src_suffix): - src_suffix = [ src_suffix ] - adjust = lambda suf, s=self: \ - callable(suf) and suf or s.adjust_suffix(suf) - self.src_suffix = map(adjust, src_suffix) - - def get_src_suffix(self, env): - """Get the first src_suffix in the list of src_suffixes.""" - ret = self.src_suffixes(env) - if not ret: - return '' - return ret[0] - - def add_emitter(self, suffix, emitter): - """Add a suffix-emitter mapping to this Builder. - - This assumes that emitter has been initialized with an - appropriate dictionary type, and will throw a TypeError if - not, so the caller is responsible for knowing that this is an - appropriate method to call for the Builder in question. - """ - self.emitter[suffix] = emitter - - def add_src_builder(self, builder): - """ - Add a new Builder to the list of src_builders. - - This requires wiping out cached values so that the computed - lists of source suffixes get re-calculated. - """ - self._memo = {} - self.src_builder.append(builder) - - def _get_sdict(self, env): - """ - Returns a dictionary mapping all of the source suffixes of all - src_builders of this Builder to the underlying Builder that - should be called first. - - This dictionary is used for each target specified, so we save a - lot of extra computation by memoizing it for each construction - environment. - - Note that this is re-computed each time, not cached, because there - might be changes to one of our source Builders (or one of their - source Builders, and so on, and so on...) that we can't "see." - - The underlying methods we call cache their computed values, - though, so we hope repeatedly aggregating them into a dictionary - like this won't be too big a hit. We may need to look for a - better way to do this if performance data show this has turned - into a significant bottleneck. - """ - sdict = {} - for bld in self.get_src_builders(env): - for suf in bld.src_suffixes(env): - sdict[suf] = bld - return sdict - - def src_builder_sources(self, env, source, overwarn={}): - sdict = self._get_sdict(env) - - src_suffixes = self.src_suffixes(env) - - lengths = list(set(map(len, src_suffixes))) - - def match_src_suffix(name, src_suffixes=src_suffixes, lengths=lengths): - node_suffixes = map(lambda l, n=name: n[-l:], lengths) - for suf in src_suffixes: - if suf in node_suffixes: - return suf - return None - - result = [] - for s in SCons.Util.flatten(source): - if SCons.Util.is_String(s): - match_suffix = match_src_suffix(env.subst(s)) - if not match_suffix and not '.' in s: - src_suf = self.get_src_suffix(env) - s = self._adjustixes(s, None, src_suf)[0] - else: - match_suffix = match_src_suffix(s.name) - if match_suffix: - try: - bld = sdict[match_suffix] - except KeyError: - result.append(s) - else: - tlist = bld._execute(env, None, [s], overwarn) - # If the subsidiary Builder returned more than one - # target, then filter out any sources that this - # Builder isn't capable of building. - if len(tlist) > 1: - mss = lambda t, m=match_src_suffix: m(t.name) - tlist = filter(mss, tlist) - result.extend(tlist) - else: - result.append(s) - - source_factory = env.get_factory(self.source_factory) - - return env.arg2nodes(result, source_factory) - - def _get_src_builders_key(self, env): - return id(env) - - memoizer_counters.append(SCons.Memoize.CountDict('get_src_builders', _get_src_builders_key)) - - def get_src_builders(self, env): - """ - Returns the list of source Builders for this Builder. - - This exists mainly to look up Builders referenced as - strings in the 'BUILDER' variable of the construction - environment and cache the result. - """ - memo_key = id(env) - try: - memo_dict = self._memo['get_src_builders'] - except KeyError: - memo_dict = {} - self._memo['get_src_builders'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - builders = [] - for bld in self.src_builder: - if SCons.Util.is_String(bld): - try: - bld = env['BUILDERS'][bld] - except KeyError: - continue - builders.append(bld) - - memo_dict[memo_key] = builders - return builders - - def _subst_src_suffixes_key(self, env): - return id(env) - - memoizer_counters.append(SCons.Memoize.CountDict('subst_src_suffixes', _subst_src_suffixes_key)) - - def subst_src_suffixes(self, env): - """ - The suffix list may contain construction variable expansions, - so we have to evaluate the individual strings. To avoid doing - this over and over, we memoize the results for each construction - environment. - """ - memo_key = id(env) - try: - memo_dict = self._memo['subst_src_suffixes'] - except KeyError: - memo_dict = {} - self._memo['subst_src_suffixes'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - suffixes = map(lambda x, s=self, e=env: e.subst(x), self.src_suffix) - memo_dict[memo_key] = suffixes - return suffixes - - def src_suffixes(self, env): - """ - Returns the list of source suffixes for all src_builders of this - Builder. - - This is essentially a recursive descent of the src_builder "tree." - (This value isn't cached because there may be changes in a - src_builder many levels deep that we can't see.) - """ - sdict = {} - suffixes = self.subst_src_suffixes(env) - for s in suffixes: - sdict[s] = 1 - for builder in self.get_src_builders(env): - for s in builder.src_suffixes(env): - if not sdict.has_key(s): - sdict[s] = 1 - suffixes.append(s) - return suffixes - -class CompositeBuilder(SCons.Util.Proxy): - """A Builder Proxy whose main purpose is to always have - a DictCmdGenerator as its action, and to provide access - to the DictCmdGenerator's add_action() method. - """ - - def __init__(self, builder, cmdgen): - if __debug__: logInstanceCreation(self, 'Builder.CompositeBuilder') - SCons.Util.Proxy.__init__(self, builder) - - # cmdgen should always be an instance of DictCmdGenerator. - self.cmdgen = cmdgen - self.builder = builder - - def add_action(self, suffix, action): - self.cmdgen.add_action(suffix, action) - self.set_src_suffix(self.cmdgen.src_suffixes()) - -def is_a_Builder(obj): - """"Returns True iff the specified obj is one of our Builder classes. - - The test is complicated a bit by the fact that CompositeBuilder - is a proxy, not a subclass of BuilderBase. - """ - return (isinstance(obj, BuilderBase) - or isinstance(obj, CompositeBuilder) - or callable(obj)) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/CacheDir.py b/share/scons-local-1.3.0/SCons/CacheDir.py deleted file mode 100644 index 697762191181a0d06df47bcafca94eac583bb524..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/CacheDir.py +++ /dev/null @@ -1,217 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/CacheDir.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """ -CacheDir support -""" - -import os.path -import stat -import string -import sys - -import SCons.Action - -cache_enabled = True -cache_debug = False -cache_force = False -cache_show = False - -def CacheRetrieveFunc(target, source, env): - t = target[0] - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if not fs.exists(cachefile): - cd.CacheDebug('CacheRetrieve(%s): %s not in cache\n', t, cachefile) - return 1 - cd.CacheDebug('CacheRetrieve(%s): retrieving from %s\n', t, cachefile) - if SCons.Action.execute_actions: - if fs.islink(cachefile): - fs.symlink(fs.readlink(cachefile), t.path) - else: - env.copy_from_cache(cachefile, t.path) - st = fs.stat(cachefile) - fs.chmod(t.path, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - return 0 - -def CacheRetrieveString(target, source, env): - t = target[0] - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if t.fs.exists(cachefile): - return "Retrieved `%s' from cache" % t.path - return None - -CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString) - -CacheRetrieveSilent = SCons.Action.Action(CacheRetrieveFunc, None) - -def CachePushFunc(target, source, env): - t = target[0] - if t.nocache: - return - fs = t.fs - cd = env.get_CacheDir() - cachedir, cachefile = cd.cachepath(t) - if fs.exists(cachefile): - # Don't bother copying it if it's already there. Note that - # usually this "shouldn't happen" because if the file already - # existed in cache, we'd have retrieved the file from there, - # not built it. This can happen, though, in a race, if some - # other person running the same build pushes their copy to - # the cache after we decide we need to build it but before our - # build completes. - cd.CacheDebug('CachePush(%s): %s already exists in cache\n', t, cachefile) - return - - cd.CacheDebug('CachePush(%s): pushing to %s\n', t, cachefile) - - tempfile = cachefile+'.tmp'+str(os.getpid()) - errfmt = "Unable to copy %s to cache. Cache file is %s" - - if not fs.isdir(cachedir): - try: - fs.makedirs(cachedir) - except EnvironmentError: - # We may have received an exception because another process - # has beaten us creating the directory. - if not fs.isdir(cachedir): - msg = errfmt % (str(target), cachefile) - raise SCons.Errors.EnvironmentError, msg - - try: - if fs.islink(t.path): - fs.symlink(fs.readlink(t.path), tempfile) - else: - fs.copy2(t.path, tempfile) - fs.rename(tempfile, cachefile) - st = fs.stat(t.path) - fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - except EnvironmentError: - # It's possible someone else tried writing the file at the - # same time we did, or else that there was some problem like - # the CacheDir being on a separate file system that's full. - # In any case, inability to push a file to cache doesn't affect - # the correctness of the build, so just print a warning. - msg = errfmt % (str(target), cachefile) - SCons.Warnings.warn(SCons.Warnings.CacheWriteErrorWarning, msg) - -CachePush = SCons.Action.Action(CachePushFunc, None) - -class CacheDir: - - def __init__(self, path): - try: - import hashlib - except ImportError: - msg = "No hashlib or MD5 module available, CacheDir() not supported" - SCons.Warnings.warn(SCons.Warnings.NoMD5ModuleWarning, msg) - self.path = None - else: - self.path = path - self.current_cache_debug = None - self.debugFP = None - - def CacheDebug(self, fmt, target, cachefile): - if cache_debug != self.current_cache_debug: - if cache_debug == '-': - self.debugFP = sys.stdout - elif cache_debug: - self.debugFP = open(cache_debug, 'w') - else: - self.debugFP = None - self.current_cache_debug = cache_debug - if self.debugFP: - self.debugFP.write(fmt % (target, os.path.split(cachefile)[1])) - - def is_enabled(self): - return (cache_enabled and not self.path is None) - - def cachepath(self, node): - """ - """ - if not self.is_enabled(): - return None, None - - sig = node.get_cachedir_bsig() - subdir = string.upper(sig[0]) - dir = os.path.join(self.path, subdir) - return dir, os.path.join(dir, sig) - - def retrieve(self, node): - """ - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Note that there's a special trick here with the execute flag - (one that's not normally done for other actions). Basically - if the user requested a no_exec (-n) build, then - SCons.Action.execute_actions is set to 0 and when any action - is called, it does its showing but then just returns zero - instead of actually calling the action execution operation. - The problem for caching is that if the file does NOT exist in - cache then the CacheRetrieveString won't return anything to - show for the task, but the Action.__call__ won't call - CacheRetrieveFunc; instead it just returns zero, which makes - the code below think that the file *was* successfully - retrieved from the cache, therefore it doesn't do any - subsequent building. However, the CacheRetrieveString didn't - print anything because it didn't actually exist in the cache, - and no more build actions will be performed, so the user just - sees nothing. The fix is to tell Action.__call__ to always - execute the CacheRetrieveFunc and then have the latter - explicitly check SCons.Action.execute_actions itself. - """ - if not self.is_enabled(): - return False - - env = node.get_build_env() - if cache_show: - if CacheRetrieveSilent(node, [], env, execute=1) == 0: - node.build(presub=0, execute=0) - return True - else: - if CacheRetrieve(node, [], env, execute=1) == 0: - return True - - return False - - def push(self, node): - if not self.is_enabled(): - return - return CachePush(node, [], node.get_build_env()) - - def push_if_forced(self, node): - if cache_force: - return self.push(node) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Conftest.py b/share/scons-local-1.3.0/SCons/Conftest.py deleted file mode 100644 index e995e77a8678955bf4583ee6067e6b1ab6370dd4..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Conftest.py +++ /dev/null @@ -1,794 +0,0 @@ -"""SCons.Conftest - -Autoconf-like configuration support; low level implementation of tests. -""" - -# -# Copyright (c) 2003 Stichting NLnet Labs -# Copyright (c) 2001, 2002, 2003 Steven Knight -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -# -# The purpose of this module is to define how a check is to be performed. -# Use one of the Check...() functions below. -# - -# -# A context class is used that defines functions for carrying out the tests, -# logging and messages. The following methods and members must be present: -# -# context.Display(msg) Function called to print messages that are normally -# displayed for the user. Newlines are explicitly used. -# The text should also be written to the logfile! -# -# context.Log(msg) Function called to write to a log file. -# -# context.BuildProg(text, ext) -# Function called to build a program, using "ext" for the -# file extention. Must return an empty string for -# success, an error message for failure. -# For reliable test results building should be done just -# like an actual program would be build, using the same -# command and arguments (including configure results so -# far). -# -# context.CompileProg(text, ext) -# Function called to compile a program, using "ext" for -# the file extention. Must return an empty string for -# success, an error message for failure. -# For reliable test results compiling should be done just -# like an actual source file would be compiled, using the -# same command and arguments (including configure results -# so far). -# -# context.AppendLIBS(lib_name_list) -# Append "lib_name_list" to the value of LIBS. -# "lib_namelist" is a list of strings. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later.) -# -# context.PrependLIBS(lib_name_list) -# Prepend "lib_name_list" to the value of LIBS. -# "lib_namelist" is a list of strings. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later.) -# -# context.SetLIBS(value) -# Set LIBS to "value". The type of "value" is what -# AppendLIBS() returned. -# Return the value of LIBS before changing it (any type -# can be used, it is passed to SetLIBS() later.) -# -# context.headerfilename -# Name of file to append configure results to, usually -# "confdefs.h". -# The file must not exist or be empty when starting. -# Empty or None to skip this (some tests will not work!). -# -# context.config_h (may be missing). If present, must be a string, which -# will be filled with the contents of a config_h file. -# -# context.vardict Dictionary holding variables used for the tests and -# stores results from the tests, used for the build -# commands. -# Normally contains "CC", "LIBS", "CPPFLAGS", etc. -# -# context.havedict Dictionary holding results from the tests that are to -# be used inside a program. -# Names often start with "HAVE_". These are zero -# (feature not present) or one (feature present). Other -# variables may have any value, e.g., "PERLVERSION" can -# be a number and "SYSTEMNAME" a string. -# - -import re -import string -from types import IntType - -# -# PUBLIC VARIABLES -# - -LogInputFiles = 1 # Set that to log the input files in case of a failed test -LogErrorMessages = 1 # Set that to log Conftest-generated error messages - -# -# PUBLIC FUNCTIONS -# - -# Generic remarks: -# - When a language is specified which is not supported the test fails. The -# message is a bit different, because not all the arguments for the normal -# message are available yet (chicken-egg problem). - - -def CheckBuilder(context, text = None, language = None): - """ - Configure check to see if the compiler works. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - "text" may be used to specify the code to be build. - Returns an empty string for success, an error message for failure. - """ - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("%s\n" % msg) - return msg - - if not text: - text = """ -int main() { - return 0; -} -""" - - context.Display("Checking if building a %s file works... " % lang) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, None, text) - return ret - -def CheckCC(context): - """ - Configure check for a working C compiler. - - This checks whether the C compiler, as defined in the $CC construction - variable, can compile a C source file. It uses the current $CCCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the C compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'CC', text, 'C') - _YesNoResult(context, ret, None, text) - return ret - -def CheckSHCC(context): - """ - Configure check for a working shared C compiler. - - This checks whether the C compiler, as defined in the $SHCC construction - variable, can compile a C source file. It uses the current $SHCCCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the (shared) C compiler works") - text = """ -int foo() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'SHCC', text, 'C', use_shared = True) - _YesNoResult(context, ret, None, text) - return ret - -def CheckCXX(context): - """ - Configure check for a working CXX compiler. - - This checks whether the CXX compiler, as defined in the $CXX construction - variable, can compile a CXX source file. It uses the current $CXXCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the C++ compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'CXX', text, 'C++') - _YesNoResult(context, ret, None, text) - return ret - -def CheckSHCXX(context): - """ - Configure check for a working shared CXX compiler. - - This checks whether the CXX compiler, as defined in the $SHCXX construction - variable, can compile a CXX source file. It uses the current $SHCXXCOM value - too, so that it can test against non working flags. - - """ - context.Display("Checking whether the (shared) C++ compiler works") - text = """ -int main() -{ - return 0; -} -""" - ret = _check_empty_program(context, 'SHCXX', text, 'C++', use_shared = True) - _YesNoResult(context, ret, None, text) - return ret - -def _check_empty_program(context, comp, text, language, use_shared = False): - """Return 0 on success, 1 otherwise.""" - if not context.env.has_key(comp) or not context.env[comp]: - # The compiler construction variable is not set or empty - return 1 - - lang, suffix, msg = _lang2suffix(language) - if msg: - return 1 - - if use_shared: - return context.CompileSharedObject(text, suffix) - else: - return context.CompileProg(text, suffix) - - -def CheckFunc(context, function_name, header = None, language = None): - """ - Configure check for a function "function_name". - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Optional "header" can be defined to define a function prototype, include a - header file or anything else that comes before main(). - Sets HAVE_function_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - - # Remarks from autoconf: - # - Don't include because on OSF/1 3.0 it includes - # which includes which contains a prototype for select. - # Similarly for bzero. - # - assert.h is included to define __stub macros and hopefully few - # prototypes, which can conflict with char $1(); below. - # - Override any gcc2 internal prototype to avoid an error. - # - We use char for the function declaration because int might match the - # return type of a gcc2 builtin and then its argument prototype would - # still apply. - # - 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 context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = """ -#ifdef __cplusplus -extern "C" -#endif -char %s();""" % function_name - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s(): %s\n" % (function_name, msg)) - return msg - - text = """ -%(include)s -#include -%(hdr)s - -int main() { -#if defined (__stub_%(name)s) || defined (__stub___%(name)s) - fail fail fail -#else - %(name)s(); -#endif - - return 0; -} -""" % { 'name': function_name, - 'include': includetext, - 'hdr': header } - - context.Display("Checking for %s function %s()... " % (lang, function_name)) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + function_name, text, - "Define to 1 if the system has the function `%s'." %\ - function_name) - return ret - - -def CheckHeader(context, header_name, header = None, language = None, - include_quotes = None): - """ - Configure check for a C or C++ header file "header_name". - Optional "header" can be defined to do something before including the - header file (unusual, supported for consistency). - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Sets HAVE_header_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS and $CPPFLAGS are set correctly. - Returns an empty string for success, an error message for failure. - """ - # Why compile the program instead of just running the preprocessor? - # It is possible that the header file exists, but actually using it may - # fail (e.g., because it depends on other header files). Thus this test is - # more strict. It may require using the "header" argument. - # - # Use <> by default, because the check is normally used for system header - # files. SCons passes '""' to overrule this. - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"\n' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for header file %s: %s\n" - % (header_name, msg)) - return msg - - if not include_quotes: - include_quotes = "<>" - - text = "%s%s\n#include %s%s%s\n\n" % (includetext, header, - include_quotes[0], header_name, include_quotes[1]) - - context.Display("Checking for %s header file %s... " % (lang, header_name)) - ret = context.CompileProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + header_name, text, - "Define to 1 if you have the <%s> header file." % header_name) - return ret - - -def CheckType(context, type_name, fallback = None, - header = None, language = None): - """ - Configure check for a C or C++ type "type_name". - Optional "header" can be defined to include a header file. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Sets HAVE_type_name in context.havedict according to the result. - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s type: %s\n" % (type_name, msg)) - return msg - - # Remarks from autoconf about this test: - # - Grepping for the type in include files is not reliable (grep isn't - # portable anyway). - # - Using "TYPE my_var;" doesn't work for const qualified types in C++. - # Adding an initializer is not valid for some C++ classes. - # - Using the type as parameter to a function either fails for K&$ C or for - # C++. - # - Using "TYPE *my_var;" is valid in C for some types that are not - # declared (struct something). - # - Using "sizeof(TYPE)" is valid when TYPE is actually a variable. - # - Using the previous two together works reliably. - text = """ -%(include)s -%(header)s - -int main() { - if ((%(name)s *) 0) - return 0; - if (sizeof (%(name)s)) - return 0; -} -""" % { 'include': includetext, - 'header': header, - 'name': type_name } - - context.Display("Checking for %s type %s... " % (lang, type_name)) - ret = context.BuildProg(text, suffix) - _YesNoResult(context, ret, "HAVE_" + type_name, text, - "Define to 1 if the system has the type `%s'." % type_name) - if ret and fallback and context.headerfilename: - f = open(context.headerfilename, "a") - f.write("typedef %s %s;\n" % (fallback, type_name)) - f.close() - - return ret - -def CheckTypeSize(context, type_name, header = None, language = None, expect = None): - """This check can be used to get the size of a given type, or to check whether - the type is of expected size. - - Arguments: - - type : str - the type to check - - includes : sequence - list of headers to include in the test code before testing the type - - language : str - 'C' or 'C++' - - expect : int - if given, will test wether the type has the given number of bytes. - If not given, will automatically find the size. - - Returns: - status : int - 0 if the check failed, or the found size of the type if the check succeeded.""" - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - - if not header: - header = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for %s type: %s\n" % (type_name, msg)) - return msg - - src = includetext + header - if not expect is None: - # Only check if the given size is the right one - context.Display('Checking %s is %d bytes... ' % (type_name, expect)) - - # test code taken from autoconf: this is a pretty clever hack to find that - # a type is of a given size using only compilation. This speeds things up - # quite a bit compared to straightforward code using TryRun - src = src + r""" -typedef %s scons_check_type; - -int main() -{ - static int test_array[1 - 2 * !(((long int) (sizeof(scons_check_type))) == %d)]; - test_array[0] = 0; - - return 0; -} -""" - - st = context.CompileProg(src % (type_name, expect), suffix) - if not st: - context.Display("yes\n") - _Have(context, "SIZEOF_%s" % type_name, expect, - "The size of `%s', as computed by sizeof." % type_name) - return expect - else: - context.Display("no\n") - _LogFailed(context, src, st) - return 0 - else: - # Only check if the given size is the right one - context.Message('Checking size of %s ... ' % type_name) - - # We have to be careful with the program we wish to test here since - # compilation will be attempted using the current environment's flags. - # So make sure that the program will compile without any warning. For - # example using: 'int main(int argc, char** argv)' will fail with the - # '-Wall -Werror' flags since the variables argc and argv would not be - # used in the program... - # - src = src + """ -#include -#include -int main() { - printf("%d", (int)sizeof(""" + type_name + """)); - return 0; -} - """ - st, out = context.RunProg(src, suffix) - try: - size = int(out) - except ValueError: - # If cannot convert output of test prog to an integer (the size), - # something went wront, so just fail - st = 1 - size = 0 - - if not st: - context.Display("yes\n") - _Have(context, "SIZEOF_%s" % type_name, size, - "The size of `%s', as computed by sizeof." % type_name) - return size - else: - context.Display("no\n") - _LogFailed(context, src, st) - return 0 - - return 0 - -def CheckDeclaration(context, symbol, includes = None, language = None): - """Checks whether symbol is declared. - - Use the same test as autoconf, that is test whether the symbol is defined - as a macro or can be used as an r-value. - - Arguments: - symbol : str - the symbol to check - includes : str - Optional "header" can be defined to include a header file. - language : str - only C and C++ supported. - - Returns: - status : bool - True if the check failed, False if succeeded.""" - - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - - if not includes: - includes = "" - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for declaration %s: %s\n" % (type_name, msg)) - return msg - - src = includetext + includes - context.Display('Checking whether %s is declared... ' % symbol) - - src = src + r""" -int main() -{ -#ifndef %s - (void) %s; -#endif - ; - return 0; -} -""" % (symbol, symbol) - - st = context.CompileProg(src, suffix) - _YesNoResult(context, st, "HAVE_DECL_" + symbol, src, - "Set to 1 if %s is defined." % symbol) - return st - -def CheckLib(context, libs, func_name = None, header = None, - extra_libs = None, call = None, language = None, autoadd = 1, - append = True): - """ - Configure check for a C or C++ libraries "libs". Searches through - the list of libraries, until one is found where the test succeeds. - Tests if "func_name" or "call" exists in the library. Note: if it exists - in another library the test succeeds anyway! - Optional "header" can be defined to include a header file. If not given a - default prototype for "func_name" is added. - Optional "extra_libs" is a list of library names to be added after - "lib_name" in the build command. To be used for libraries that "lib_name" - depends on. - Optional "call" replaces the call to "func_name" in the test code. It must - consist of complete C statements, including a trailing ";". - Both "func_name" and "call" arguments are optional, and in that case, just - linking against the libs is tested. - "language" should be "C" or "C++" and is used to select the compiler. - Default is "C". - Note that this uses the current value of compiler and linker flags, make - sure $CFLAGS, $CPPFLAGS and $LIBS are set correctly. - Returns an empty string for success, an error message for failure. - """ - # Include "confdefs.h" first, so that the header can use HAVE_HEADER_H. - if context.headerfilename: - includetext = '#include "%s"' % context.headerfilename - else: - includetext = '' - if not header: - header = "" - - text = """ -%s -%s""" % (includetext, header) - - # Add a function declaration if needed. - if func_name and func_name != "main": - if not header: - text = text + """ -#ifdef __cplusplus -extern "C" -#endif -char %s(); -""" % func_name - - # The actual test code. - if not call: - call = "%s();" % func_name - - # if no function to test, leave main() blank - text = text + """ -int -main() { - %s -return 0; -} -""" % (call or "") - - if call: - i = string.find(call, "\n") - if i > 0: - calltext = call[:i] + ".." - elif call[-1] == ';': - calltext = call[:-1] - else: - calltext = call - - for lib_name in libs: - - lang, suffix, msg = _lang2suffix(language) - if msg: - context.Display("Cannot check for library %s: %s\n" % (lib_name, msg)) - return msg - - # if a function was specified to run in main(), say it - if call: - context.Display("Checking for %s in %s library %s... " - % (calltext, lang, lib_name)) - # otherwise, just say the name of library and language - else: - context.Display("Checking for %s library %s... " - % (lang, lib_name)) - - if lib_name: - l = [ lib_name ] - if extra_libs: - l.extend(extra_libs) - if append: - oldLIBS = context.AppendLIBS(l) - else: - oldLIBS = context.PrependLIBS(l) - sym = "HAVE_LIB" + lib_name - else: - oldLIBS = -1 - sym = None - - ret = context.BuildProg(text, suffix) - - _YesNoResult(context, ret, sym, text, - "Define to 1 if you have the `%s' library." % lib_name) - if oldLIBS != -1 and (ret or not autoadd): - context.SetLIBS(oldLIBS) - - if not ret: - return ret - - return ret - -# -# END OF PUBLIC FUNCTIONS -# - -def _YesNoResult(context, ret, key, text, comment = None): - """ - Handle the result of a test with a "yes" or "no" result. - "ret" is the return value: empty if OK, error message when not. - "key" is the name of the symbol to be defined (HAVE_foo). - "text" is the source code of the program used for testing. - "comment" is the C comment to add above the line defining the symbol (the - comment is automatically put inside a /* */). If None, no comment is added. - """ - if key: - _Have(context, key, not ret, comment) - if ret: - context.Display("no\n") - _LogFailed(context, text, ret) - else: - context.Display("yes\n") - - -def _Have(context, key, have, comment = None): - """ - Store result of a test in context.havedict and context.headerfilename. - "key" is a "HAVE_abc" name. It is turned into all CAPITALS and non- - alphanumerics are replaced by an underscore. - The value of "have" can be: - 1 - Feature is defined, add "#define key". - 0 - Feature is not defined, add "/* #undef key */". - Adding "undef" is what autoconf does. Not useful for the - compiler, but it shows that the test was done. - number - Feature is defined to this number "#define key have". - Doesn't work for 0 or 1, use a string then. - string - Feature is defined to this string "#define key have". - Give "have" as is should appear in the header file, include quotes - when desired and escape special characters! - """ - key_up = string.upper(key) - key_up = re.sub('[^A-Z0-9_]', '_', key_up) - context.havedict[key_up] = have - if have == 1: - line = "#define %s 1\n" % key_up - elif have == 0: - line = "/* #undef %s */\n" % key_up - elif type(have) == IntType: - line = "#define %s %d\n" % (key_up, have) - else: - line = "#define %s %s\n" % (key_up, str(have)) - - if comment is not None: - lines = "\n/* %s */\n" % comment + line - else: - lines = "\n" + line - - if context.headerfilename: - f = open(context.headerfilename, "a") - f.write(lines) - f.close() - elif hasattr(context,'config_h'): - context.config_h = context.config_h + lines - - -def _LogFailed(context, text, msg): - """ - Write to the log about a failed program. - Add line numbers, so that error messages can be understood. - """ - if LogInputFiles: - context.Log("Failed program was:\n") - lines = string.split(text, '\n') - if len(lines) and lines[-1] == '': - lines = lines[:-1] # remove trailing empty line - n = 1 - for line in lines: - context.Log("%d: %s\n" % (n, line)) - n = n + 1 - if LogErrorMessages: - context.Log("Error message: %s\n" % msg) - - -def _lang2suffix(lang): - """ - Convert a language name to a suffix. - When "lang" is empty or None C is assumed. - Returns a tuple (lang, suffix, None) when it works. - For an unrecognized language returns (None, None, msg). - Where: - lang = the unified language name - suffix = the suffix, including the leading dot - msg = an error message - """ - if not lang or lang in ["C", "c"]: - return ("C", ".c", None) - if lang in ["c++", "C++", "cpp", "CXX", "cxx"]: - return ("C++", ".cpp", None) - - return None, None, "Unsupported language: %s" % lang - - -# vim: set sw=4 et sts=4 tw=79 fo+=l: - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Debug.py b/share/scons-local-1.3.0/SCons/Debug.py deleted file mode 100644 index afff44bfff6b7c1a3ab3f7b1a1f795bdda30f9f8..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Debug.py +++ /dev/null @@ -1,237 +0,0 @@ -"""SCons.Debug - -Code for debugging SCons internal things. Not everything here is -guaranteed to work all the way back to Python 1.5.2, and shouldn't be -needed by most users. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Debug.py 4720 2010/03/24 03:14:11 jars" - -import os -import string -import sys -import time - -# Recipe 14.10 from the Python Cookbook. -try: - import weakref -except ImportError: - def logInstanceCreation(instance, name=None): - pass -else: - def logInstanceCreation(instance, name=None): - if name is None: - name = instance.__class__.__name__ - if not tracked_classes.has_key(name): - tracked_classes[name] = [] - tracked_classes[name].append(weakref.ref(instance)) - - - -tracked_classes = {} - -def string_to_classes(s): - if s == '*': - c = tracked_classes.keys() - c.sort() - return c - else: - return string.split(s) - -def fetchLoggedInstances(classes="*"): - classnames = string_to_classes(classes) - return map(lambda cn: (cn, len(tracked_classes[cn])), classnames) - -def countLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write("%s: %d\n" % (classname, len(tracked_classes[classname]))) - -def listLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write('\n%s:\n' % classname) - for ref in tracked_classes[classname]: - obj = ref() - if obj is not None: - file.write(' %s\n' % repr(obj)) - -def dumpLoggedInstances(classes, file=sys.stdout): - for classname in string_to_classes(classes): - file.write('\n%s:\n' % classname) - for ref in tracked_classes[classname]: - obj = ref() - if obj is not None: - file.write(' %s:\n' % obj) - for key, value in obj.__dict__.items(): - file.write(' %20s : %s\n' % (key, value)) - - - -if sys.platform[:5] == "linux": - # Linux doesn't actually support memory usage stats from getrusage(). - def memory(): - mstr = open('/proc/self/stat').read() - mstr = string.split(mstr)[22] - return int(mstr) -else: - try: - import resource - except ImportError: - try: - import win32process - import win32api - except ImportError: - def memory(): - return 0 - else: - def memory(): - process_handle = win32api.GetCurrentProcess() - memory_info = win32process.GetProcessMemoryInfo( process_handle ) - return memory_info['PeakWorkingSetSize'] - else: - def memory(): - res = resource.getrusage(resource.RUSAGE_SELF) - return res[4] - -# returns caller's stack -def caller_stack(*backlist): - import traceback - if not backlist: - backlist = [0] - result = [] - for back in backlist: - tb = traceback.extract_stack(limit=3+back) - key = tb[0][:3] - result.append('%s:%d(%s)' % func_shorten(key)) - return result - -caller_bases = {} -caller_dicts = {} - -# trace a caller's stack -def caller_trace(back=0): - import traceback - tb = traceback.extract_stack(limit=3+back) - tb.reverse() - callee = tb[1][:3] - caller_bases[callee] = caller_bases.get(callee, 0) + 1 - for caller in tb[2:]: - caller = callee + caller[:3] - try: - entry = caller_dicts[callee] - except KeyError: - caller_dicts[callee] = entry = {} - entry[caller] = entry.get(caller, 0) + 1 - callee = caller - -# print a single caller and its callers, if any -def _dump_one_caller(key, file, level=0): - l = [] - for c,v in caller_dicts[key].items(): - l.append((-v,c)) - l.sort() - leader = ' '*level - for v,c in l: - file.write("%s %6d %s:%d(%s)\n" % ((leader,-v) + func_shorten(c[-3:]))) - if caller_dicts.has_key(c): - _dump_one_caller(c, file, level+1) - -# print each call tree -def dump_caller_counts(file=sys.stdout): - keys = caller_bases.keys() - keys.sort() - for k in keys: - file.write("Callers of %s:%d(%s), %d calls:\n" - % (func_shorten(k) + (caller_bases[k],))) - _dump_one_caller(k, file) - -shorten_list = [ - ( '/scons/SCons/', 1), - ( '/src/engine/SCons/', 1), - ( '/usr/lib/python', 0), -] - -if os.sep != '/': - def platformize(t): - return (string.replace(t[0], '/', os.sep), t[1]) - shorten_list = map(platformize, shorten_list) - del platformize - -def func_shorten(func_tuple): - f = func_tuple[0] - for t in shorten_list: - i = string.find(f, t[0]) - if i >= 0: - if t[1]: - i = i + len(t[0]) - return (f[i:],)+func_tuple[1:] - return func_tuple - - -TraceFP = {} -if sys.platform == 'win32': - TraceDefault = 'con' -else: - TraceDefault = '/dev/tty' - -TimeStampDefault = None -StartTime = time.time() -PreviousTime = StartTime - -def Trace(msg, file=None, mode='w', tstamp=None): - """Write a trace message to a file. Whenever a file is specified, - it becomes the default for the next call to Trace().""" - global TraceDefault - global TimeStampDefault - global PreviousTime - if file is None: - file = TraceDefault - else: - TraceDefault = file - if tstamp is None: - tstamp = TimeStampDefault - else: - TimeStampDefault = tstamp - try: - fp = TraceFP[file] - except KeyError: - try: - fp = TraceFP[file] = open(file, mode) - except TypeError: - # Assume we were passed an open file pointer. - fp = file - if tstamp: - now = time.time() - fp.write('%8.4f %8.4f: ' % (now - StartTime, now - PreviousTime)) - PreviousTime = now - fp.write(msg) - fp.flush() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Defaults.py b/share/scons-local-1.3.0/SCons/Defaults.py deleted file mode 100644 index c35313498db0521804a28969dfbe6d47aedf195c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Defaults.py +++ /dev/null @@ -1,485 +0,0 @@ -"""SCons.Defaults - -Builders and other things for the local site. Here's where we'll -duplicate the functionality of autoconf until we move it into the -installation procedure or use something like qmconf. - -The code that reads the registry to find MSVC components was borrowed -from distutils.msvccompiler. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Defaults.py 4720 2010/03/24 03:14:11 jars" - - - -import os -import os.path -import errno -import shutil -import stat -import string -import time -import types -import sys - -import SCons.Action -import SCons.Builder -import SCons.CacheDir -import SCons.Environment -import SCons.PathList -import SCons.Subst -import SCons.Tool - -# A placeholder for a default Environment (for fetching source files -# from source code management systems and the like). This must be -# initialized later, after the top-level directory is set by the calling -# interface. -_default_env = None - -# Lazily instantiate the default environment so the overhead of creating -# it doesn't apply when it's not needed. -def _fetch_DefaultEnvironment(*args, **kw): - """ - Returns the already-created default construction environment. - """ - global _default_env - return _default_env - -def DefaultEnvironment(*args, **kw): - """ - Initial public entry point for creating the default construction - Environment. - - After creating the environment, we overwrite our name - (DefaultEnvironment) with the _fetch_DefaultEnvironment() function, - which more efficiently returns the initialized default construction - environment without checking for its existence. - - (This function still exists with its _default_check because someone - else (*cough* Script/__init__.py *cough*) may keep a reference - to this function. So we can't use the fully functional idiom of - having the name originally be a something that *only* creates the - construction environment and then overwrites the name.) - """ - global _default_env - if not _default_env: - import SCons.Util - _default_env = apply(SCons.Environment.Environment, args, kw) - if SCons.Util.md5: - _default_env.Decider('MD5') - else: - _default_env.Decider('timestamp-match') - global DefaultEnvironment - DefaultEnvironment = _fetch_DefaultEnvironment - _default_env._CacheDir_path = None - return _default_env - -# Emitters for setting the shared attribute on object files, -# and an action for checking that all of the source files -# going into a shared library are, in fact, shared. -def StaticObjectEmitter(target, source, env): - for tgt in target: - tgt.attributes.shared = None - return (target, source) - -def SharedObjectEmitter(target, source, env): - for tgt in target: - tgt.attributes.shared = 1 - return (target, source) - -def SharedFlagChecker(source, target, env): - same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME') - if same == '0' or same == '' or same == 'False': - for src in source: - try: - shared = src.attributes.shared - except AttributeError: - shared = None - if not shared: - raise SCons.Errors.UserError, "Source file: %s is static and is not compatible with shared target: %s" % (src, target[0]) - -SharedCheck = SCons.Action.Action(SharedFlagChecker, None) - -# Some people were using these variable name before we made -# SourceFileScanner part of the public interface. Don't break their -# SConscript files until we've given them some fair warning and a -# transition period. -CScan = SCons.Tool.CScanner -DScan = SCons.Tool.DScanner -LaTeXScan = SCons.Tool.LaTeXScanner -ObjSourceScan = SCons.Tool.SourceFileScanner -ProgScan = SCons.Tool.ProgramScanner - -# These aren't really tool scanners, so they don't quite belong with -# the rest of those in Tool/__init__.py, but I'm not sure where else -# they should go. Leave them here for now. -import SCons.Scanner.Dir -DirScanner = SCons.Scanner.Dir.DirScanner() -DirEntryScanner = SCons.Scanner.Dir.DirEntryScanner() - -# Actions for common languages. -CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR") -ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR") -CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR") -ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR") - -ASAction = SCons.Action.Action("$ASCOM", "$ASCOMSTR") -ASPPAction = SCons.Action.Action("$ASPPCOM", "$ASPPCOMSTR") - -LinkAction = SCons.Action.Action("$LINKCOM", "$LINKCOMSTR") -ShLinkAction = SCons.Action.Action("$SHLINKCOM", "$SHLINKCOMSTR") - -LdModuleLinkAction = SCons.Action.Action("$LDMODULECOM", "$LDMODULECOMSTR") - -# Common tasks that we allow users to perform in platform-independent -# ways by creating ActionFactory instances. -ActionFactory = SCons.Action.ActionFactory - -def get_paths_str(dest): - # If dest is a list, we need to manually call str() on each element - if SCons.Util.is_List(dest): - elem_strs = [] - for element in dest: - elem_strs.append('"' + str(element) + '"') - return '[' + string.join(elem_strs, ', ') + ']' - else: - return '"' + str(dest) + '"' - -def chmod_func(dest, mode): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for element in dest: - os.chmod(str(element), mode) - -def chmod_strfunc(dest, mode): - return 'Chmod(%s, 0%o)' % (get_paths_str(dest), mode) - -Chmod = ActionFactory(chmod_func, chmod_strfunc) - -def copy_func(dest, src): - SCons.Node.FS.invalidate_node_memos(dest) - if SCons.Util.is_List(src) and os.path.isdir(dest): - for file in src: - shutil.copy2(file, dest) - return 0 - elif os.path.isfile(src): - return shutil.copy2(src, dest) - else: - return shutil.copytree(src, dest, 1) - -Copy = ActionFactory(copy_func, - lambda dest, src: 'Copy("%s", "%s")' % (dest, src), - convert=str) - -def delete_func(dest, must_exist=0): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for entry in dest: - entry = str(entry) - if not must_exist and not os.path.exists(entry): - continue - if not os.path.exists(entry) or os.path.isfile(entry): - os.unlink(entry) - continue - else: - shutil.rmtree(entry, 1) - continue - -def delete_strfunc(dest, must_exist=0): - return 'Delete(%s)' % get_paths_str(dest) - -Delete = ActionFactory(delete_func, delete_strfunc) - -def mkdir_func(dest): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for entry in dest: - try: - os.makedirs(str(entry)) - except os.error, e: - p = str(entry) - if (e[0] == errno.EEXIST or (sys.platform=='win32' and e[0]==183)) \ - and os.path.isdir(str(entry)): - pass # not an error if already exists - else: - raise - -Mkdir = ActionFactory(mkdir_func, - lambda dir: 'Mkdir(%s)' % get_paths_str(dir)) - -def move_func(dest, src): - SCons.Node.FS.invalidate_node_memos(dest) - SCons.Node.FS.invalidate_node_memos(src) - shutil.move(src, dest) - -Move = ActionFactory(move_func, - lambda dest, src: 'Move("%s", "%s")' % (dest, src), - convert=str) - -def touch_func(dest): - SCons.Node.FS.invalidate_node_memos(dest) - if not SCons.Util.is_List(dest): - dest = [dest] - for file in dest: - file = str(file) - mtime = int(time.time()) - if os.path.exists(file): - atime = os.path.getatime(file) - else: - open(file, 'w') - atime = mtime - os.utime(file, (atime, mtime)) - -Touch = ActionFactory(touch_func, - lambda file: 'Touch(%s)' % get_paths_str(file)) - -# Internal utility functions - -def _concat(prefix, list, suffix, env, f=lambda x: x, target=None, source=None): - """ - Creates a new list from 'list' by first interpolating each element - in the list using the 'env' dictionary and then calling f on the - list, and finally calling _concat_ixes to concatenate 'prefix' and - 'suffix' onto each element of the list. - """ - if not list: - return list - - l = f(SCons.PathList.PathList(list).subst_path(env, target, source)) - if l is not None: - list = l - - return _concat_ixes(prefix, list, suffix, env) - -def _concat_ixes(prefix, list, suffix, env): - """ - Creates a new list from 'list' by concatenating the 'prefix' and - 'suffix' arguments onto each element of the list. A trailing space - on 'prefix' or leading space on 'suffix' will cause them to be put - into separate list elements rather than being concatenated. - """ - - result = [] - - # ensure that prefix and suffix are strings - prefix = str(env.subst(prefix, SCons.Subst.SUBST_RAW)) - suffix = str(env.subst(suffix, SCons.Subst.SUBST_RAW)) - - for x in list: - if isinstance(x, SCons.Node.FS.File): - result.append(x) - continue - x = str(x) - if x: - - if prefix: - if prefix[-1] == ' ': - result.append(prefix[:-1]) - elif x[:len(prefix)] != prefix: - x = prefix + x - - result.append(x) - - if suffix: - if suffix[0] == ' ': - result.append(suffix[1:]) - elif x[-len(suffix):] != suffix: - result[-1] = result[-1]+suffix - - return result - -def _stripixes(prefix, list, suffix, stripprefixes, stripsuffixes, env, c=None): - """ - This is a wrapper around _concat()/_concat_ixes() that checks for the - existence of prefixes or suffixes on list elements and strips them - where it finds them. This is used by tools (like the GNU linker) - that need to turn something like 'libfoo.a' into '-lfoo'. - """ - - if not list: - return list - - if not callable(c): - env_c = env['_concat'] - if env_c != _concat and callable(env_c): - # There's a custom _concat() method in the construction - # environment, and we've allowed people to set that in - # the past (see test/custom-concat.py), so preserve the - # backwards compatibility. - c = env_c - else: - c = _concat_ixes - - stripprefixes = map(env.subst, SCons.Util.flatten(stripprefixes)) - stripsuffixes = map(env.subst, SCons.Util.flatten(stripsuffixes)) - - stripped = [] - for l in SCons.PathList.PathList(list).subst_path(env, None, None): - if isinstance(l, SCons.Node.FS.File): - stripped.append(l) - continue - - if not SCons.Util.is_String(l): - l = str(l) - - for stripprefix in stripprefixes: - lsp = len(stripprefix) - if l[:lsp] == stripprefix: - l = l[lsp:] - # Do not strip more than one prefix - break - - for stripsuffix in stripsuffixes: - lss = len(stripsuffix) - if l[-lss:] == stripsuffix: - l = l[:-lss] - # Do not strip more than one suffix - break - - stripped.append(l) - - return c(prefix, stripped, suffix, env) - -def processDefines(defs): - """process defines, resolving strings, lists, dictionaries, into a list of - strings - """ - if SCons.Util.is_List(defs): - l = [] - for d in defs: - if SCons.Util.is_List(d) or type(d) is types.TupleType: - l.append(str(d[0]) + '=' + str(d[1])) - else: - l.append(str(d)) - elif SCons.Util.is_Dict(defs): - # The items in a dictionary are stored in random order, but - # if the order of the command-line options changes from - # invocation to invocation, then the signature of the command - # line will change and we'll get random unnecessary rebuilds. - # Consequently, we have to sort the keys to ensure a - # consistent order... - l = [] - keys = defs.keys() - keys.sort() - for k in keys: - v = defs[k] - if v is None: - l.append(str(k)) - else: - l.append(str(k) + '=' + str(v)) - else: - l = [str(defs)] - return l - -def _defines(prefix, defs, suffix, env, c=_concat_ixes): - """A wrapper around _concat_ixes that turns a list or string - into a list of C preprocessor command-line definitions. - """ - - return c(prefix, env.subst_path(processDefines(defs)), suffix, env) - -class NullCmdGenerator: - """This is a callable class that can be used in place of other - command generators if you don't want them to do anything. - - The __call__ method for this class simply returns the thing - you instantiated it with. - - Example usage: - env["DO_NOTHING"] = NullCmdGenerator - env["LINKCOM"] = "${DO_NOTHING('$LINK $SOURCES $TARGET')}" - """ - - def __init__(self, cmd): - self.cmd = cmd - - def __call__(self, target, source, env, for_signature=None): - return self.cmd - -class Variable_Method_Caller: - """A class for finding a construction variable on the stack and - calling one of its methods. - - We use this to support "construction variables" in our string - eval()s that actually stand in for methods--specifically, use - of "RDirs" in call to _concat that should actually execute the - "TARGET.RDirs" method. (We used to support this by creating a little - "build dictionary" that mapped RDirs to the method, but this got in - the way of Memoizing construction environments, because we had to - create new environment objects to hold the variables.) - """ - def __init__(self, variable, method): - self.variable = variable - self.method = method - def __call__(self, *args, **kw): - try: 1/0 - except ZeroDivisionError: - # Don't start iterating with the current stack-frame to - # prevent creating reference cycles (f_back is safe). - frame = sys.exc_info()[2].tb_frame.f_back - variable = self.variable - while frame: - if frame.f_locals.has_key(variable): - v = frame.f_locals[variable] - if v: - method = getattr(v, self.method) - return apply(method, args, kw) - frame = frame.f_back - return None - -ConstructionEnvironment = { - 'BUILDERS' : {}, - 'SCANNERS' : [], - 'CONFIGUREDIR' : '#/.sconf_temp', - 'CONFIGURELOG' : '#/config.log', - 'CPPSUFFIXES' : SCons.Tool.CSuffixes, - 'DSUFFIXES' : SCons.Tool.DSuffixes, - 'ENV' : {}, - 'IDLSUFFIXES' : SCons.Tool.IDLSuffixes, -# 'LATEXSUFFIXES' : SCons.Tool.LaTeXSuffixes, # moved to the TeX tools generate functions - '_concat' : _concat, - '_defines' : _defines, - '_stripixes' : _stripixes, - '_LIBFLAGS' : '${_concat(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, __env__)}', - '_LIBDIRFLAGS' : '$( ${_concat(LIBDIRPREFIX, LIBPATH, LIBDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)', - '_CPPINCFLAGS' : '$( ${_concat(INCPREFIX, CPPPATH, INCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)', - '_CPPDEFFLAGS' : '${_defines(CPPDEFPREFIX, CPPDEFINES, CPPDEFSUFFIX, __env__)}', - 'TEMPFILE' : NullCmdGenerator, - 'Dir' : Variable_Method_Caller('TARGET', 'Dir'), - 'Dirs' : Variable_Method_Caller('TARGET', 'Dirs'), - 'File' : Variable_Method_Caller('TARGET', 'File'), - 'RDirs' : Variable_Method_Caller('TARGET', 'RDirs'), -} - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Environment.py b/share/scons-local-1.3.0/SCons/Environment.py deleted file mode 100644 index ac6de99c4b212ee5660acfa94aef7f93145b2c76..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Environment.py +++ /dev/null @@ -1,2330 +0,0 @@ -"""SCons.Environment - -Base class for construction Environments. These are -the primary objects used to communicate dependency and -construction information to the build engine. - -Keyword arguments supplied when the construction Environment -is created are construction variables used to initialize the -Environment -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Environment.py 4720 2010/03/24 03:14:11 jars" - - -import copy -import os -import sys -import re -import shlex -import string -from UserDict import UserDict - -import SCons.Action -import SCons.Builder -from SCons.Debug import logInstanceCreation -import SCons.Defaults -import SCons.Errors -import SCons.Memoize -import SCons.Node -import SCons.Node.Alias -import SCons.Node.FS -import SCons.Node.Python -import SCons.Platform -import SCons.SConf -import SCons.SConsign -import SCons.Subst -import SCons.Tool -import SCons.Util -import SCons.Warnings - -class _Null: - pass - -_null = _Null - -_warn_copy_deprecated = True -_warn_source_signatures_deprecated = True -_warn_target_signatures_deprecated = True - -CleanTargets = {} -CalculatorArgs = {} - -semi_deepcopy = SCons.Util.semi_deepcopy - -# Pull UserError into the global name space for the benefit of -# Environment().SourceSignatures(), which has some import statements -# which seem to mess up its ability to reference SCons directly. -UserError = SCons.Errors.UserError - -def alias_builder(env, target, source): - pass - -AliasBuilder = SCons.Builder.Builder(action = alias_builder, - target_factory = SCons.Node.Alias.default_ans.Alias, - source_factory = SCons.Node.FS.Entry, - multi = 1, - is_explicit = None, - name='AliasBuilder') - -def apply_tools(env, tools, toolpath): - # Store the toolpath in the Environment. - if toolpath is not None: - env['toolpath'] = toolpath - - if not tools: - return - # Filter out null tools from the list. - for tool in filter(None, tools): - if SCons.Util.is_List(tool) or type(tool)==type(()): - toolname = tool[0] - toolargs = tool[1] # should be a dict of kw args - tool = apply(env.Tool, [toolname], toolargs) - else: - env.Tool(tool) - -# These names are (or will be) controlled by SCons; users should never -# set or override them. This warning can optionally be turned off, -# but scons will still ignore the illegal variable names even if it's off. -reserved_construction_var_names = [ - 'CHANGED_SOURCES', - 'CHANGED_TARGETS', - 'SOURCE', - 'SOURCES', - 'TARGET', - 'TARGETS', - 'UNCHANGED_SOURCES', - 'UNCHANGED_TARGETS', -] - -future_reserved_construction_var_names = [ - #'HOST_OS', - #'HOST_ARCH', - #'HOST_CPU', - ] - -def copy_non_reserved_keywords(dict): - result = semi_deepcopy(dict) - for k in result.keys(): - if k in reserved_construction_var_names: - msg = "Ignoring attempt to set reserved variable `$%s'" - SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % k) - del result[k] - return result - -def _set_reserved(env, key, value): - msg = "Ignoring attempt to set reserved variable `$%s'" - SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % key) - -def _set_future_reserved(env, key, value): - env._dict[key] = value - msg = "`$%s' will be reserved in a future release and setting it will become ignored" - SCons.Warnings.warn(SCons.Warnings.FutureReservedVariableWarning, msg % key) - -def _set_BUILDERS(env, key, value): - try: - bd = env._dict[key] - for k in bd.keys(): - del bd[k] - except KeyError: - bd = BuilderDict(kwbd, env) - env._dict[key] = bd - for k, v in value.items(): - if not SCons.Builder.is_a_Builder(v): - raise SCons.Errors.UserError('%s is not a Builder.' % repr(v)) - bd.update(value) - -def _del_SCANNERS(env, key): - del env._dict[key] - env.scanner_map_delete() - -def _set_SCANNERS(env, key, value): - env._dict[key] = value - env.scanner_map_delete() - -def _delete_duplicates(l, keep_last): - """Delete duplicates from a sequence, keeping the first or last.""" - seen={} - result=[] - if keep_last: # reverse in & out, then keep first - l.reverse() - for i in l: - try: - if not seen.has_key(i): - result.append(i) - seen[i]=1 - except TypeError: - # probably unhashable. Just keep it. - result.append(i) - if keep_last: - result.reverse() - return result - - - -# The following is partly based on code in a comment added by Peter -# Shannon at the following page (there called the "transplant" class): -# -# ASPN : Python Cookbook : Dynamically added methods to a class -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/81732 -# -# We had independently been using the idiom as BuilderWrapper, but -# factoring out the common parts into this base class, and making -# BuilderWrapper a subclass that overrides __call__() to enforce specific -# Builder calling conventions, simplified some of our higher-layer code. - -class MethodWrapper: - """ - A generic Wrapper class that associates a method (which can - actually be any callable) with an object. As part of creating this - MethodWrapper object an attribute with the specified (by default, - the name of the supplied method) is added to the underlying object. - When that new "method" is called, our __call__() method adds the - object as the first argument, simulating the Python behavior of - supplying "self" on method calls. - - We hang on to the name by which the method was added to the underlying - base class so that we can provide a method to "clone" ourselves onto - a new underlying object being copied (without which we wouldn't need - to save that info). - """ - def __init__(self, object, method, name=None): - if name is None: - name = method.__name__ - self.object = object - self.method = method - self.name = name - setattr(self.object, name, self) - - def __call__(self, *args, **kwargs): - nargs = (self.object,) + args - return apply(self.method, nargs, kwargs) - - def clone(self, new_object): - """ - Returns an object that re-binds the underlying "method" to - the specified new object. - """ - return self.__class__(new_object, self.method, self.name) - -class BuilderWrapper(MethodWrapper): - """ - A MethodWrapper subclass that that associates an environment with - a Builder. - - This mainly exists to wrap the __call__() function so that all calls - to Builders can have their argument lists massaged in the same way - (treat a lone argument as the source, treat two arguments as target - then source, make sure both target and source are lists) without - having to have cut-and-paste code to do it. - - As a bit of obsessive backwards compatibility, we also intercept - attempts to get or set the "env" or "builder" attributes, which were - the names we used before we put the common functionality into the - MethodWrapper base class. We'll keep this around for a while in case - people shipped Tool modules that reached into the wrapper (like the - Tool/qt.py module does, or did). There shouldn't be a lot attribute - fetching or setting on these, so a little extra work shouldn't hurt. - """ - def __call__(self, target=None, source=_null, *args, **kw): - if source is _null: - source = target - target = None - if target is not None and not SCons.Util.is_List(target): - target = [target] - if source is not None and not SCons.Util.is_List(source): - source = [source] - return apply(MethodWrapper.__call__, (self, target, source) + args, kw) - - def __repr__(self): - return '' % repr(self.name) - - def __str__(self): - return self.__repr__() - - def __getattr__(self, name): - if name == 'env': - return self.object - elif name == 'builder': - return self.method - else: - raise AttributeError, name - - def __setattr__(self, name, value): - if name == 'env': - self.object = value - elif name == 'builder': - self.method = value - else: - self.__dict__[name] = value - - # This allows a Builder to be executed directly - # through the Environment to which it's attached. - # In practice, we shouldn't need this, because - # builders actually get executed through a Node. - # But we do have a unit test for this, and can't - # yet rule out that it would be useful in the - # future, so leave it for now. - #def execute(self, **kw): - # kw['env'] = self.env - # apply(self.builder.execute, (), kw) - -class BuilderDict(UserDict): - """This is a dictionary-like class used by an Environment to hold - the Builders. We need to do this because every time someone changes - the Builders in the Environment's BUILDERS dictionary, we must - update the Environment's attributes.""" - def __init__(self, dict, env): - # Set self.env before calling the superclass initialization, - # because it will end up calling our other methods, which will - # need to point the values in this dictionary to self.env. - self.env = env - UserDict.__init__(self, dict) - - def __semi_deepcopy__(self): - return self.__class__(self.data, self.env) - - def __setitem__(self, item, val): - try: - method = getattr(self.env, item).method - except AttributeError: - pass - else: - self.env.RemoveMethod(method) - UserDict.__setitem__(self, item, val) - BuilderWrapper(self.env, val, item) - - def __delitem__(self, item): - UserDict.__delitem__(self, item) - delattr(self.env, item) - - def update(self, dict): - for i, v in dict.items(): - self.__setitem__(i, v) - - - -_is_valid_var = re.compile(r'[_a-zA-Z]\w*$') - -def is_valid_construction_var(varstr): - """Return if the specified string is a legitimate construction - variable. - """ - return _is_valid_var.match(varstr) - - - -class SubstitutionEnvironment: - """Base class for different flavors of construction environments. - - This class contains a minimal set of methods that handle contruction - variable expansion and conversion of strings to Nodes, which may or - may not be actually useful as a stand-alone class. Which methods - ended up in this class is pretty arbitrary right now. They're - basically the ones which we've empirically determined are common to - the different construction environment subclasses, and most of the - others that use or touch the underlying dictionary of construction - variables. - - Eventually, this class should contain all the methods that we - determine are necessary for a "minimal" interface to the build engine. - A full "native Python" SCons environment has gotten pretty heavyweight - with all of the methods and Tools and construction variables we've - jammed in there, so it would be nice to have a lighter weight - alternative for interfaces that don't need all of the bells and - whistles. (At some point, we'll also probably rename this class - "Base," since that more reflects what we want this class to become, - but because we've released comments that tell people to subclass - Environment.Base to create their own flavors of construction - environment, we'll save that for a future refactoring when this - class actually becomes useful.) - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - def __init__(self, **kw): - """Initialization of an underlying SubstitutionEnvironment class. - """ - if __debug__: logInstanceCreation(self, 'Environment.SubstitutionEnvironment') - self.fs = SCons.Node.FS.get_default_fs() - self.ans = SCons.Node.Alias.default_ans - self.lookup_list = SCons.Node.arg2nodes_lookups - self._dict = kw.copy() - self._init_special() - self.added_methods = [] - #self._memo = {} - - def _init_special(self): - """Initial the dispatch tables for special handling of - special construction variables.""" - self._special_del = {} - self._special_del['SCANNERS'] = _del_SCANNERS - - self._special_set = {} - for key in reserved_construction_var_names: - self._special_set[key] = _set_reserved - for key in future_reserved_construction_var_names: - self._special_set[key] = _set_future_reserved - self._special_set['BUILDERS'] = _set_BUILDERS - self._special_set['SCANNERS'] = _set_SCANNERS - - # Freeze the keys of self._special_set in a list for use by - # methods that need to check. (Empirically, list scanning has - # gotten better than dict.has_key() in Python 2.5.) - self._special_set_keys = self._special_set.keys() - - def __cmp__(self, other): - return cmp(self._dict, other._dict) - - def __delitem__(self, key): - special = self._special_del.get(key) - if special: - special(self, key) - else: - del self._dict[key] - - def __getitem__(self, key): - return self._dict[key] - - def __setitem__(self, key, value): - # This is heavily used. This implementation is the best we have - # according to the timings in bench/env.__setitem__.py. - # - # The "key in self._special_set_keys" test here seems to perform - # pretty well for the number of keys we have. A hard-coded - # list works a little better in Python 2.5, but that has the - # disadvantage of maybe getting out of sync if we ever add more - # variable names. Using self._special_set.has_key() works a - # little better in Python 2.4, but is worse then this test. - # So right now it seems like a good trade-off, but feel free to - # revisit this with bench/env.__setitem__.py as needed (and - # as newer versions of Python come out). - if key in self._special_set_keys: - self._special_set[key](self, key, value) - else: - # If we already have the entry, then it's obviously a valid - # key and we don't need to check. If we do check, using a - # global, pre-compiled regular expression directly is more - # efficient than calling another function or a method. - if not self._dict.has_key(key) \ - and not _is_valid_var.match(key): - raise SCons.Errors.UserError, "Illegal construction variable `%s'" % key - self._dict[key] = value - - def get(self, key, default=None): - """Emulates the get() method of dictionaries.""" - return self._dict.get(key, default) - - def has_key(self, key): - return self._dict.has_key(key) - - def __contains__(self, key): - return self._dict.__contains__(key) - - def items(self): - return self._dict.items() - - def arg2nodes(self, args, node_factory=_null, lookup_list=_null, **kw): - if node_factory is _null: - node_factory = self.fs.File - if lookup_list is _null: - lookup_list = self.lookup_list - - if not args: - return [] - - args = SCons.Util.flatten(args) - - nodes = [] - for v in args: - if SCons.Util.is_String(v): - n = None - for l in lookup_list: - n = l(v) - if n is not None: - break - if n is not None: - if SCons.Util.is_String(n): - # n = self.subst(n, raw=1, **kw) - kw['raw'] = 1 - n = apply(self.subst, (n,), kw) - if node_factory: - n = node_factory(n) - if SCons.Util.is_List(n): - nodes.extend(n) - else: - nodes.append(n) - elif node_factory: - # v = node_factory(self.subst(v, raw=1, **kw)) - kw['raw'] = 1 - v = node_factory(apply(self.subst, (v,), kw)) - if SCons.Util.is_List(v): - nodes.extend(v) - else: - nodes.append(v) - else: - nodes.append(v) - - return nodes - - def gvars(self): - return self._dict - - def lvars(self): - return {} - - def subst(self, string, raw=0, target=None, source=None, conv=None, executor=None): - """Recursively interpolates construction variables from the - Environment into the specified string, returning the expanded - result. Construction variables are specified by a $ prefix - in the string and begin with an initial underscore or - alphabetic character followed by any number of underscores - or alphanumeric characters. The construction variable names - may be surrounded by curly braces to separate the name from - trailing characters. - """ - gvars = self.gvars() - lvars = self.lvars() - lvars['__env__'] = self - if executor: - lvars.update(executor.get_lvars()) - return SCons.Subst.scons_subst(string, self, raw, target, source, gvars, lvars, conv) - - def subst_kw(self, kw, raw=0, target=None, source=None): - nkw = {} - for k, v in kw.items(): - k = self.subst(k, raw, target, source) - if SCons.Util.is_String(v): - v = self.subst(v, raw, target, source) - nkw[k] = v - return nkw - - def subst_list(self, string, raw=0, target=None, source=None, conv=None, executor=None): - """Calls through to SCons.Subst.scons_subst_list(). See - the documentation for that function.""" - gvars = self.gvars() - lvars = self.lvars() - lvars['__env__'] = self - if executor: - lvars.update(executor.get_lvars()) - return SCons.Subst.scons_subst_list(string, self, raw, target, source, gvars, lvars, conv) - - def subst_path(self, path, target=None, source=None): - """Substitute a path list, turning EntryProxies into Nodes - and leaving Nodes (and other objects) as-is.""" - - if not SCons.Util.is_List(path): - path = [path] - - def s(obj): - """This is the "string conversion" routine that we have our - substitutions use to return Nodes, not strings. This relies - on the fact that an EntryProxy object has a get() method that - returns the underlying Node that it wraps, which is a bit of - architectural dependence that we might need to break or modify - in the future in response to additional requirements.""" - try: - get = obj.get - except AttributeError: - obj = SCons.Util.to_String_for_subst(obj) - else: - obj = get() - return obj - - r = [] - for p in path: - if SCons.Util.is_String(p): - p = self.subst(p, target=target, source=source, conv=s) - if SCons.Util.is_List(p): - if len(p) == 1: - p = p[0] - else: - # We have an object plus a string, or multiple - # objects that we need to smush together. No choice - # but to make them into a string. - p = string.join(map(SCons.Util.to_String_for_subst, p), '') - else: - p = s(p) - r.append(p) - return r - - subst_target_source = subst - - def backtick(self, command): - import subprocess - # common arguments - kw = { 'stdin' : 'devnull', - 'stdout' : subprocess.PIPE, - 'stderr' : subprocess.PIPE, - 'universal_newlines' : True, - } - # if the command is a list, assume it's been quoted - # othewise force a shell - if not SCons.Util.is_List(command): kw['shell'] = True - # run constructed command - #TODO(1.5) p = SCons.Action._subproc(self, command, **kw) - p = apply(SCons.Action._subproc, (self, command), kw) - out,err = p.communicate() - status = p.wait() - if err: - sys.stderr.write(err) - if status: - raise OSError("'%s' exited %d" % (command, status)) - return out - - def AddMethod(self, function, name=None): - """ - Adds the specified function as a method of this construction - environment with the specified name. If the name is omitted, - the default name is the name of the function itself. - """ - method = MethodWrapper(self, function, name) - self.added_methods.append(method) - - def RemoveMethod(self, function): - """ - Removes the specified function's MethodWrapper from the - added_methods list, so we don't re-bind it when making a clone. - """ - is_not_func = lambda dm, f=function: not dm.method is f - self.added_methods = filter(is_not_func, self.added_methods) - - def Override(self, overrides): - """ - Produce a modified environment whose variables are overriden by - the overrides dictionaries. "overrides" is a dictionary that - will override the variables of this environment. - - This function is much more efficient than Clone() or creating - a new Environment because it doesn't copy the construction - environment dictionary, it just wraps the underlying construction - environment, and doesn't even create a wrapper object if there - are no overrides. - """ - if not overrides: return self - o = copy_non_reserved_keywords(overrides) - if not o: return self - overrides = {} - merges = None - for key, value in o.items(): - if key == 'parse_flags': - merges = value - else: - overrides[key] = SCons.Subst.scons_subst_once(value, self, key) - env = OverrideEnvironment(self, overrides) - if merges: env.MergeFlags(merges) - return env - - def ParseFlags(self, *flags): - """ - Parse the set of flags and return a dict with the flags placed - in the appropriate entry. The flags are treated as a typical - set of command-line flags for a GNU-like toolchain and used to - populate the entries in the dict immediately below. If one of - the flag strings begins with a bang (exclamation mark), it is - assumed to be a command and the rest of the string is executed; - the result of that evaluation is then added to the dict. - """ - dict = { - 'ASFLAGS' : SCons.Util.CLVar(''), - 'CFLAGS' : SCons.Util.CLVar(''), - 'CCFLAGS' : SCons.Util.CLVar(''), - 'CPPDEFINES' : [], - 'CPPFLAGS' : SCons.Util.CLVar(''), - 'CPPPATH' : [], - 'FRAMEWORKPATH' : SCons.Util.CLVar(''), - 'FRAMEWORKS' : SCons.Util.CLVar(''), - 'LIBPATH' : [], - 'LIBS' : [], - 'LINKFLAGS' : SCons.Util.CLVar(''), - 'RPATH' : [], - } - - # The use of the "me" parameter to provide our own name for - # recursion is an egregious hack to support Python 2.1 and before. - def do_parse(arg, me, self = self, dict = dict): - # if arg is a sequence, recurse with each element - if not arg: - return - - if not SCons.Util.is_String(arg): - for t in arg: me(t, me) - return - - # if arg is a command, execute it - if arg[0] == '!': - arg = self.backtick(arg[1:]) - - # utility function to deal with -D option - def append_define(name, dict = dict): - t = string.split(name, '=') - if len(t) == 1: - dict['CPPDEFINES'].append(name) - else: - dict['CPPDEFINES'].append([t[0], string.join(t[1:], '=')]) - - # Loop through the flags and add them to the appropriate option. - # This tries to strike a balance between checking for all possible - # flags and keeping the logic to a finite size, so it doesn't - # check for some that don't occur often. It particular, if the - # flag is not known to occur in a config script and there's a way - # of passing the flag to the right place (by wrapping it in a -W - # flag, for example) we don't check for it. Note that most - # preprocessor options are not handled, since unhandled options - # are placed in CCFLAGS, so unless the preprocessor is invoked - # separately, these flags will still get to the preprocessor. - # Other options not currently handled: - # -iqoutedir (preprocessor search path) - # -u symbol (linker undefined symbol) - # -s (linker strip files) - # -static* (linker static binding) - # -shared* (linker dynamic binding) - # -symbolic (linker global binding) - # -R dir (deprecated linker rpath) - # IBM compilers may also accept -qframeworkdir=foo - - params = shlex.split(arg) - append_next_arg_to = None # for multi-word args - for arg in params: - if append_next_arg_to: - if append_next_arg_to == 'CPPDEFINES': - append_define(arg) - elif append_next_arg_to == '-include': - t = ('-include', self.fs.File(arg)) - dict['CCFLAGS'].append(t) - elif append_next_arg_to == '-isysroot': - t = ('-isysroot', arg) - dict['CCFLAGS'].append(t) - dict['LINKFLAGS'].append(t) - elif append_next_arg_to == '-arch': - t = ('-arch', arg) - dict['CCFLAGS'].append(t) - dict['LINKFLAGS'].append(t) - else: - dict[append_next_arg_to].append(arg) - append_next_arg_to = None - elif not arg[0] in ['-', '+']: - dict['LIBS'].append(self.fs.File(arg)) - elif arg[:2] == '-L': - if arg[2:]: - dict['LIBPATH'].append(arg[2:]) - else: - append_next_arg_to = 'LIBPATH' - elif arg[:2] == '-l': - if arg[2:]: - dict['LIBS'].append(arg[2:]) - else: - append_next_arg_to = 'LIBS' - elif arg[:2] == '-I': - if arg[2:]: - dict['CPPPATH'].append(arg[2:]) - else: - append_next_arg_to = 'CPPPATH' - elif arg[:4] == '-Wa,': - dict['ASFLAGS'].append(arg[4:]) - dict['CCFLAGS'].append(arg) - elif arg[:4] == '-Wl,': - if arg[:11] == '-Wl,-rpath=': - dict['RPATH'].append(arg[11:]) - elif arg[:7] == '-Wl,-R,': - dict['RPATH'].append(arg[7:]) - elif arg[:6] == '-Wl,-R': - dict['RPATH'].append(arg[6:]) - else: - dict['LINKFLAGS'].append(arg) - elif arg[:4] == '-Wp,': - dict['CPPFLAGS'].append(arg) - elif arg[:2] == '-D': - if arg[2:]: - append_define(arg[2:]) - else: - append_next_arg_to = 'CPPDEFINES' - elif arg == '-framework': - append_next_arg_to = 'FRAMEWORKS' - elif arg[:14] == '-frameworkdir=': - dict['FRAMEWORKPATH'].append(arg[14:]) - elif arg[:2] == '-F': - if arg[2:]: - dict['FRAMEWORKPATH'].append(arg[2:]) - else: - append_next_arg_to = 'FRAMEWORKPATH' - elif arg == '-mno-cygwin': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg == '-mwindows': - dict['LINKFLAGS'].append(arg) - elif arg == '-pthread': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg[:5] == '-std=': - dict['CFLAGS'].append(arg) # C only - elif arg[0] == '+': - dict['CCFLAGS'].append(arg) - dict['LINKFLAGS'].append(arg) - elif arg in ['-include', '-isysroot', '-arch']: - append_next_arg_to = arg - else: - dict['CCFLAGS'].append(arg) - - for arg in flags: - do_parse(arg, do_parse) - return dict - - def MergeFlags(self, args, unique=1, dict=None): - """ - Merge the dict in args into the construction variables of this - env, or the passed-in dict. If args is not a dict, it is - converted into a dict using ParseFlags. If unique is not set, - the flags are appended rather than merged. - """ - - if dict is None: - dict = self - if not SCons.Util.is_Dict(args): - args = self.ParseFlags(args) - if not unique: - apply(self.Append, (), args) - return self - for key, value in args.items(): - if not value: - continue - try: - orig = self[key] - except KeyError: - orig = value - else: - if not orig: - orig = value - elif value: - # Add orig and value. The logic here was lifted from - # part of env.Append() (see there for a lot of comments - # about the order in which things are tried) and is - # used mainly to handle coercion of strings to CLVar to - # "do the right thing" given (e.g.) an original CCFLAGS - # string variable like '-pipe -Wall'. - try: - orig = orig + value - except (KeyError, TypeError): - try: - add_to_orig = orig.append - except AttributeError: - value.insert(0, orig) - orig = value - else: - add_to_orig(value) - t = [] - if key[-4:] == 'PATH': - ### keep left-most occurence - for v in orig: - if v not in t: - t.append(v) - else: - ### keep right-most occurence - orig.reverse() - for v in orig: - if v not in t: - t.insert(0, v) - self[key] = t - return self - -# def MergeShellPaths(self, args, prepend=1): -# """ -# Merge the dict in args into the shell environment in env['ENV']. -# Shell path elements are appended or prepended according to prepend. - -# Uses Pre/AppendENVPath, so it always appends or prepends uniquely. - -# Example: env.MergeShellPaths({'LIBPATH': '/usr/local/lib'}) -# prepends /usr/local/lib to env['ENV']['LIBPATH']. -# """ - -# for pathname, pathval in args.items(): -# if not pathval: -# continue -# if prepend: -# apply(self.PrependENVPath, (pathname, pathval)) -# else: -# apply(self.AppendENVPath, (pathname, pathval)) - - -# Used by the FindSourceFiles() method, below. -# Stuck here for support of pre-2.2 Python versions. -def build_source(ss, result): - for s in ss: - if isinstance(s, SCons.Node.FS.Dir): - build_source(s.all_children(), result) - elif s.has_builder(): - build_source(s.sources, result) - elif isinstance(s.disambiguate(), SCons.Node.FS.File): - result.append(s) - -def default_decide_source(dependency, target, prev_ni): - f = SCons.Defaults.DefaultEnvironment().decide_source - return f(dependency, target, prev_ni) - -def default_decide_target(dependency, target, prev_ni): - f = SCons.Defaults.DefaultEnvironment().decide_target - return f(dependency, target, prev_ni) - -def default_copy_from_cache(src, dst): - f = SCons.Defaults.DefaultEnvironment().copy_from_cache - return f(src, dst) - -class Base(SubstitutionEnvironment): - """Base class for "real" construction Environments. These are the - primary objects used to communicate dependency and construction - information to the build engine. - - Keyword arguments supplied when the construction Environment - is created are construction variables used to initialize the - Environment. - """ - - memoizer_counters = [] - - ####################################################################### - # This is THE class for interacting with the SCons build engine, - # and it contains a lot of stuff, so we're going to try to keep this - # a little organized by grouping the methods. - ####################################################################### - - ####################################################################### - # Methods that make an Environment act like a dictionary. These have - # the expected standard names for Python mapping objects. Note that - # we don't actually make an Environment a subclass of UserDict for - # performance reasons. Note also that we only supply methods for - # dictionary functionality that we actually need and use. - ####################################################################### - - def __init__(self, - platform=None, - tools=None, - toolpath=None, - variables=None, - parse_flags = None, - **kw): - """ - Initialization of a basic SCons construction environment, - including setting up special construction variables like BUILDER, - PLATFORM, etc., and searching for and applying available Tools. - - Note that we do *not* call the underlying base class - (SubsitutionEnvironment) initialization, because we need to - initialize things in a very specific order that doesn't work - with the much simpler base class initialization. - """ - if __debug__: logInstanceCreation(self, 'Environment.Base') - self._memo = {} - self.fs = SCons.Node.FS.get_default_fs() - self.ans = SCons.Node.Alias.default_ans - self.lookup_list = SCons.Node.arg2nodes_lookups - self._dict = semi_deepcopy(SCons.Defaults.ConstructionEnvironment) - self._init_special() - self.added_methods = [] - - # We don't use AddMethod, or define these as methods in this - # class, because we *don't* want these functions to be bound - # methods. They need to operate independently so that the - # settings will work properly regardless of whether a given - # target ends up being built with a Base environment or an - # OverrideEnvironment or what have you. - self.decide_target = default_decide_target - self.decide_source = default_decide_source - - self.copy_from_cache = default_copy_from_cache - - self._dict['BUILDERS'] = BuilderDict(self._dict['BUILDERS'], self) - - if platform is None: - platform = self._dict.get('PLATFORM', None) - if platform is None: - platform = SCons.Platform.Platform() - if SCons.Util.is_String(platform): - platform = SCons.Platform.Platform(platform) - self._dict['PLATFORM'] = str(platform) - platform(self) - - self._dict['HOST_OS'] = self._dict.get('HOST_OS',None) - self._dict['HOST_ARCH'] = self._dict.get('HOST_ARCH',None) - - # Now set defaults for TARGET_{OS|ARCH} - self._dict['TARGET_OS'] = self._dict.get('HOST_OS',None) - self._dict['TARGET_ARCH'] = self._dict.get('HOST_ARCH',None) - - - # Apply the passed-in and customizable variables to the - # environment before calling the tools, because they may use - # some of them during initialization. - if kw.has_key('options'): - # Backwards compatibility: they may stll be using the - # old "options" keyword. - variables = kw['options'] - del kw['options'] - apply(self.Replace, (), kw) - keys = kw.keys() - if variables: - keys = keys + variables.keys() - variables.Update(self) - - save = {} - for k in keys: - try: - save[k] = self._dict[k] - except KeyError: - # No value may have been set if they tried to pass in a - # reserved variable name like TARGETS. - pass - - SCons.Tool.Initializers(self) - - if tools is None: - tools = self._dict.get('TOOLS', None) - if tools is None: - tools = ['default'] - apply_tools(self, tools, toolpath) - - # Now restore the passed-in and customized variables - # to the environment, since the values the user set explicitly - # should override any values set by the tools. - for key, val in save.items(): - self._dict[key] = val - - # Finally, apply any flags to be merged in - if parse_flags: self.MergeFlags(parse_flags) - - ####################################################################### - # Utility methods that are primarily for internal use by SCons. - # These begin with lower-case letters. - ####################################################################### - - def get_builder(self, name): - """Fetch the builder with the specified name from the environment. - """ - try: - return self._dict['BUILDERS'][name] - except KeyError: - return None - - def get_CacheDir(self): - try: - path = self._CacheDir_path - except AttributeError: - path = SCons.Defaults.DefaultEnvironment()._CacheDir_path - try: - if path == self._last_CacheDir_path: - return self._last_CacheDir - except AttributeError: - pass - cd = SCons.CacheDir.CacheDir(path) - self._last_CacheDir_path = path - self._last_CacheDir = cd - return cd - - def get_factory(self, factory, default='File'): - """Return a factory function for creating Nodes for this - construction environment. - """ - name = default - try: - is_node = issubclass(factory, SCons.Node.FS.Base) - except TypeError: - # The specified factory isn't a Node itself--it's - # most likely None, or possibly a callable. - pass - else: - if is_node: - # The specified factory is a Node (sub)class. Try to - # return the FS method that corresponds to the Node's - # name--that is, we return self.fs.Dir if they want a Dir, - # self.fs.File for a File, etc. - try: name = factory.__name__ - except AttributeError: pass - else: factory = None - if not factory: - # They passed us None, or we picked up a name from a specified - # class, so return the FS method. (Note that we *don't* - # use our own self.{Dir,File} methods because that would - # cause env.subst() to be called twice on the file name, - # interfering with files that have $$ in them.) - factory = getattr(self.fs, name) - return factory - - memoizer_counters.append(SCons.Memoize.CountValue('_gsm')) - - def _gsm(self): - try: - return self._memo['_gsm'] - except KeyError: - pass - - result = {} - - try: - scanners = self._dict['SCANNERS'] - except KeyError: - pass - else: - # Reverse the scanner list so that, if multiple scanners - # claim they can scan the same suffix, earlier scanners - # in the list will overwrite later scanners, so that - # the result looks like a "first match" to the user. - if not SCons.Util.is_List(scanners): - scanners = [scanners] - else: - scanners = scanners[:] # copy so reverse() doesn't mod original - scanners.reverse() - for scanner in scanners: - for k in scanner.get_skeys(self): - if k and self['PLATFORM'] == 'win32': - k = string.lower(k) - result[k] = scanner - - self._memo['_gsm'] = result - - return result - - def get_scanner(self, skey): - """Find the appropriate scanner given a key (usually a file suffix). - """ - if skey and self['PLATFORM'] == 'win32': - skey = string.lower(skey) - return self._gsm().get(skey) - - def scanner_map_delete(self, kw=None): - """Delete the cached scanner map (if we need to). - """ - try: - del self._memo['_gsm'] - except KeyError: - pass - - def _update(self, dict): - """Update an environment's values directly, bypassing the normal - checks that occur when users try to set items. - """ - self._dict.update(dict) - - def get_src_sig_type(self): - try: - return self.src_sig_type - except AttributeError: - t = SCons.Defaults.DefaultEnvironment().src_sig_type - self.src_sig_type = t - return t - - def get_tgt_sig_type(self): - try: - return self.tgt_sig_type - except AttributeError: - t = SCons.Defaults.DefaultEnvironment().tgt_sig_type - self.tgt_sig_type = t - return t - - ####################################################################### - # Public methods for manipulating an Environment. These begin with - # upper-case letters. The essential characteristic of methods in - # this section is that they do *not* have corresponding same-named - # global functions. For example, a stand-alone Append() function - # makes no sense, because Append() is all about appending values to - # an Environment's construction variables. - ####################################################################### - - def Append(self, **kw): - """Append values to existing construction variables - in an Environment. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - # It would be easier on the eyes to write this using - # "continue" statements whenever we finish processing an item, - # but Python 1.5.2 apparently doesn't let you use "continue" - # within try:-except: blocks, so we have to nest our code. - try: - orig = self._dict[key] - except KeyError: - # No existing variable in the environment, so just set - # it to the new value. - self._dict[key] = val - else: - try: - # Check if the original looks like a dictionary. - # If it is, we can't just try adding the value because - # dictionaries don't have __add__() methods, and - # things like UserList will incorrectly coerce the - # original dict to a list (which we don't want). - update_dict = orig.update - except AttributeError: - try: - # Most straightforward: just try to add them - # together. This will work in most cases, when the - # original and new values are of compatible types. - self._dict[key] = orig + val - except (KeyError, TypeError): - try: - # Check if the original is a list. - add_to_orig = orig.append - except AttributeError: - # The original isn't a list, but the new - # value is (by process of elimination), - # so insert the original in the new value - # (if there's one to insert) and replace - # the variable with it. - if orig: - val.insert(0, orig) - self._dict[key] = val - else: - # The original is a list, so append the new - # value to it (if there's a value to append). - if val: - add_to_orig(val) - else: - # The original looks like a dictionary, so update it - # based on what we think the value looks like. - if SCons.Util.is_List(val): - for v in val: - orig[v] = None - else: - try: - update_dict(val) - except (AttributeError, TypeError, ValueError): - if SCons.Util.is_Dict(val): - for k, v in val.items(): - orig[k] = v - else: - orig[val] = None - self.scanner_map_delete(kw) - - # allow Dirs and strings beginning with # for top-relative - # Note this uses the current env's fs (in self). - def _canonicalize(self, path): - if not SCons.Util.is_String(path): # typically a Dir - path = str(path) - if path and path[0] == '#': - path = str(self.fs.Dir(path)) - return path - - def AppendENVPath(self, name, newpath, envname = 'ENV', - sep = os.pathsep, delete_existing=1): - """Append path elements to the path 'name' in the 'ENV' - dictionary for this environment. Will only add any particular - path once, and will normpath and normcase all paths to help - assure this. This can also handle the case where the env - variable is a list instead of a string. - - If delete_existing is 0, a newpath which is already in the path - will not be moved to the end (it will be left where it is). - """ - - orig = '' - if self._dict.has_key(envname) and self._dict[envname].has_key(name): - orig = self._dict[envname][name] - - nv = SCons.Util.AppendPath(orig, newpath, sep, delete_existing, - canonicalize=self._canonicalize) - - if not self._dict.has_key(envname): - self._dict[envname] = {} - - self._dict[envname][name] = nv - - def AppendUnique(self, delete_existing=0, **kw): - """Append values to existing construction variables - in an Environment, if they're not already there. - If delete_existing is 1, removes existing values first, so - values move to end. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - if SCons.Util.is_List(val): - val = _delete_duplicates(val, delete_existing) - if not self._dict.has_key(key) or self._dict[key] in ('', None): - self._dict[key] = val - elif SCons.Util.is_Dict(self._dict[key]) and \ - SCons.Util.is_Dict(val): - self._dict[key].update(val) - elif SCons.Util.is_List(val): - dk = self._dict[key] - if not SCons.Util.is_List(dk): - dk = [dk] - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - else: - val = filter(lambda x, dk=dk: x not in dk, val) - self._dict[key] = dk + val - else: - dk = self._dict[key] - if SCons.Util.is_List(dk): - # By elimination, val is not a list. Since dk is a - # list, wrap val in a list first. - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = dk + [val] - else: - if not val in dk: - self._dict[key] = dk + [val] - else: - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = dk + val - self.scanner_map_delete(kw) - - def Clone(self, tools=[], toolpath=None, parse_flags = None, **kw): - """Return a copy of a construction Environment. The - copy is like a Python "deep copy"--that is, independent - copies are made recursively of each objects--except that - a reference is copied when an object is not deep-copyable - (like a function). There are no references to any mutable - objects in the original Environment. - """ - clone = copy.copy(self) - clone._dict = semi_deepcopy(self._dict) - - try: - cbd = clone._dict['BUILDERS'] - except KeyError: - pass - else: - clone._dict['BUILDERS'] = BuilderDict(cbd, clone) - - # Check the methods added via AddMethod() and re-bind them to - # the cloned environment. Only do this if the attribute hasn't - # been overwritten by the user explicitly and still points to - # the added method. - clone.added_methods = [] - for mw in self.added_methods: - if mw == getattr(self, mw.name): - clone.added_methods.append(mw.clone(clone)) - - clone._memo = {} - - # Apply passed-in variables before the tools - # so the tools can use the new variables - kw = copy_non_reserved_keywords(kw) - new = {} - for key, value in kw.items(): - new[key] = SCons.Subst.scons_subst_once(value, self, key) - apply(clone.Replace, (), new) - - apply_tools(clone, tools, toolpath) - - # apply them again in case the tools overwrote them - apply(clone.Replace, (), new) - - # Finally, apply any flags to be merged in - if parse_flags: clone.MergeFlags(parse_flags) - - if __debug__: logInstanceCreation(self, 'Environment.EnvironmentClone') - return clone - - def Copy(self, *args, **kw): - global _warn_copy_deprecated - if _warn_copy_deprecated: - msg = "The env.Copy() method is deprecated; use the env.Clone() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedCopyWarning, msg) - _warn_copy_deprecated = False - return apply(self.Clone, args, kw) - - def _changed_build(self, dependency, target, prev_ni): - if dependency.changed_state(target, prev_ni): - return 1 - return self.decide_source(dependency, target, prev_ni) - - def _changed_content(self, dependency, target, prev_ni): - return dependency.changed_content(target, prev_ni) - - def _changed_source(self, dependency, target, prev_ni): - target_env = dependency.get_build_env() - type = target_env.get_tgt_sig_type() - if type == 'source': - return target_env.decide_source(dependency, target, prev_ni) - else: - return target_env.decide_target(dependency, target, prev_ni) - - def _changed_timestamp_then_content(self, dependency, target, prev_ni): - return dependency.changed_timestamp_then_content(target, prev_ni) - - def _changed_timestamp_newer(self, dependency, target, prev_ni): - return dependency.changed_timestamp_newer(target, prev_ni) - - def _changed_timestamp_match(self, dependency, target, prev_ni): - return dependency.changed_timestamp_match(target, prev_ni) - - def _copy_from_cache(self, src, dst): - return self.fs.copy(src, dst) - - def _copy2_from_cache(self, src, dst): - return self.fs.copy2(src, dst) - - def Decider(self, function): - copy_function = self._copy2_from_cache - if function in ('MD5', 'content'): - if not SCons.Util.md5: - raise UserError, "MD5 signatures are not available in this version of Python." - function = self._changed_content - elif function == 'MD5-timestamp': - function = self._changed_timestamp_then_content - elif function in ('timestamp-newer', 'make'): - function = self._changed_timestamp_newer - copy_function = self._copy_from_cache - elif function == 'timestamp-match': - function = self._changed_timestamp_match - elif not callable(function): - raise UserError, "Unknown Decider value %s" % repr(function) - - # We don't use AddMethod because we don't want to turn the - # function, which only expects three arguments, into a bound - # method, which would add self as an initial, fourth argument. - self.decide_target = function - self.decide_source = function - - self.copy_from_cache = copy_function - - def Detect(self, progs): - """Return the first available program in progs. - """ - if not SCons.Util.is_List(progs): - progs = [ progs ] - for prog in progs: - path = self.WhereIs(prog) - if path: return prog - return None - - def Dictionary(self, *args): - if not args: - return self._dict - dlist = map(lambda x, s=self: s._dict[x], args) - if len(dlist) == 1: - dlist = dlist[0] - return dlist - - def Dump(self, key = None): - """ - Using the standard Python pretty printer, dump the contents of the - scons build environment to stdout. - - If the key passed in is anything other than None, then that will - be used as an index into the build environment dictionary and - whatever is found there will be fed into the pretty printer. Note - that this key is case sensitive. - """ - import pprint - pp = pprint.PrettyPrinter(indent=2) - if key: - dict = self.Dictionary(key) - else: - dict = self.Dictionary() - return pp.pformat(dict) - - def FindIxes(self, paths, prefix, suffix): - """ - Search a list of paths for something that matches the prefix and suffix. - - paths - the list of paths or nodes. - prefix - construction variable for the prefix. - suffix - construction variable for the suffix. - """ - - suffix = self.subst('$'+suffix) - prefix = self.subst('$'+prefix) - - for path in paths: - dir,name = os.path.split(str(path)) - if name[:len(prefix)] == prefix and name[-len(suffix):] == suffix: - return path - - def ParseConfig(self, command, function=None, unique=1): - """ - Use the specified function to parse the output of the command - in order to modify the current environment. The 'command' can - be a string or a list of strings representing a command and - its arguments. 'Function' is an optional argument that takes - the environment, the output of the command, and the unique flag. - If no function is specified, MergeFlags, which treats the output - as the result of a typical 'X-config' command (i.e. gtk-config), - will merge the output into the appropriate variables. - """ - if function is None: - def parse_conf(env, cmd, unique=unique): - return env.MergeFlags(cmd, unique) - function = parse_conf - if SCons.Util.is_List(command): - command = string.join(command) - command = self.subst(command) - return function(self, self.backtick(command)) - - def ParseDepends(self, filename, must_exist=None, only_one=0): - """ - Parse a mkdep-style file for explicit dependencies. This is - completely abusable, and should be unnecessary in the "normal" - case of proper SCons configuration, but it may help make - the transition from a Make hierarchy easier for some people - to swallow. It can also be genuinely useful when using a tool - that can write a .d file, but for which writing a scanner would - be too complicated. - """ - filename = self.subst(filename) - try: - fp = open(filename, 'r') - except IOError: - if must_exist: - raise - return - lines = SCons.Util.LogicalLines(fp).readlines() - lines = filter(lambda l: l[0] != '#', lines) - tdlist = [] - for line in lines: - try: - target, depends = string.split(line, ':', 1) - except (AttributeError, TypeError, ValueError): - # Python 1.5.2 throws TypeError if line isn't a string, - # Python 2.x throws AttributeError because it tries - # to call line.split(). Either can throw ValueError - # if the line doesn't split into two or more elements. - pass - else: - tdlist.append((string.split(target), string.split(depends))) - if only_one: - targets = reduce(lambda x, y: x+y, map(lambda p: p[0], tdlist)) - if len(targets) > 1: - raise SCons.Errors.UserError, "More than one dependency target found in `%s': %s" % (filename, targets) - for target, depends in tdlist: - self.Depends(target, depends) - - def Platform(self, platform): - platform = self.subst(platform) - return SCons.Platform.Platform(platform)(self) - - def Prepend(self, **kw): - """Prepend values to existing construction variables - in an Environment. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - # It would be easier on the eyes to write this using - # "continue" statements whenever we finish processing an item, - # but Python 1.5.2 apparently doesn't let you use "continue" - # within try:-except: blocks, so we have to nest our code. - try: - orig = self._dict[key] - except KeyError: - # No existing variable in the environment, so just set - # it to the new value. - self._dict[key] = val - else: - try: - # Check if the original looks like a dictionary. - # If it is, we can't just try adding the value because - # dictionaries don't have __add__() methods, and - # things like UserList will incorrectly coerce the - # original dict to a list (which we don't want). - update_dict = orig.update - except AttributeError: - try: - # Most straightforward: just try to add them - # together. This will work in most cases, when the - # original and new values are of compatible types. - self._dict[key] = val + orig - except (KeyError, TypeError): - try: - # Check if the added value is a list. - add_to_val = val.append - except AttributeError: - # The added value isn't a list, but the - # original is (by process of elimination), - # so insert the the new value in the original - # (if there's one to insert). - if val: - orig.insert(0, val) - else: - # The added value is a list, so append - # the original to it (if there's a value - # to append). - if orig: - add_to_val(orig) - self._dict[key] = val - else: - # The original looks like a dictionary, so update it - # based on what we think the value looks like. - if SCons.Util.is_List(val): - for v in val: - orig[v] = None - else: - try: - update_dict(val) - except (AttributeError, TypeError, ValueError): - if SCons.Util.is_Dict(val): - for k, v in val.items(): - orig[k] = v - else: - orig[val] = None - self.scanner_map_delete(kw) - - def PrependENVPath(self, name, newpath, envname = 'ENV', sep = os.pathsep, - delete_existing=1): - """Prepend path elements to the path 'name' in the 'ENV' - dictionary for this environment. Will only add any particular - path once, and will normpath and normcase all paths to help - assure this. This can also handle the case where the env - variable is a list instead of a string. - - If delete_existing is 0, a newpath which is already in the path - will not be moved to the front (it will be left where it is). - """ - - orig = '' - if self._dict.has_key(envname) and self._dict[envname].has_key(name): - orig = self._dict[envname][name] - - nv = SCons.Util.PrependPath(orig, newpath, sep, delete_existing, - canonicalize=self._canonicalize) - - if not self._dict.has_key(envname): - self._dict[envname] = {} - - self._dict[envname][name] = nv - - def PrependUnique(self, delete_existing=0, **kw): - """Prepend values to existing construction variables - in an Environment, if they're not already there. - If delete_existing is 1, removes existing values first, so - values move to front. - """ - kw = copy_non_reserved_keywords(kw) - for key, val in kw.items(): - if SCons.Util.is_List(val): - val = _delete_duplicates(val, not delete_existing) - if not self._dict.has_key(key) or self._dict[key] in ('', None): - self._dict[key] = val - elif SCons.Util.is_Dict(self._dict[key]) and \ - SCons.Util.is_Dict(val): - self._dict[key].update(val) - elif SCons.Util.is_List(val): - dk = self._dict[key] - if not SCons.Util.is_List(dk): - dk = [dk] - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - else: - val = filter(lambda x, dk=dk: x not in dk, val) - self._dict[key] = val + dk - else: - dk = self._dict[key] - if SCons.Util.is_List(dk): - # By elimination, val is not a list. Since dk is a - # list, wrap val in a list first. - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = [val] + dk - else: - if not val in dk: - self._dict[key] = [val] + dk - else: - if delete_existing: - dk = filter(lambda x, val=val: x not in val, dk) - self._dict[key] = val + dk - self.scanner_map_delete(kw) - - def Replace(self, **kw): - """Replace existing construction variables in an Environment - with new construction variables and/or values. - """ - try: - kwbd = kw['BUILDERS'] - except KeyError: - pass - else: - kwbd = semi_deepcopy(kwbd) - del kw['BUILDERS'] - self.__setitem__('BUILDERS', kwbd) - kw = copy_non_reserved_keywords(kw) - self._update(semi_deepcopy(kw)) - self.scanner_map_delete(kw) - - def ReplaceIxes(self, path, old_prefix, old_suffix, new_prefix, new_suffix): - """ - Replace old_prefix with new_prefix and old_suffix with new_suffix. - - env - Environment used to interpolate variables. - path - the path that will be modified. - old_prefix - construction variable for the old prefix. - old_suffix - construction variable for the old suffix. - new_prefix - construction variable for the new prefix. - new_suffix - construction variable for the new suffix. - """ - old_prefix = self.subst('$'+old_prefix) - old_suffix = self.subst('$'+old_suffix) - - new_prefix = self.subst('$'+new_prefix) - new_suffix = self.subst('$'+new_suffix) - - dir,name = os.path.split(str(path)) - if name[:len(old_prefix)] == old_prefix: - name = name[len(old_prefix):] - if name[-len(old_suffix):] == old_suffix: - name = name[:-len(old_suffix)] - return os.path.join(dir, new_prefix+name+new_suffix) - - def SetDefault(self, **kw): - for k in kw.keys(): - if self._dict.has_key(k): - del kw[k] - apply(self.Replace, (), kw) - - def _find_toolpath_dir(self, tp): - return self.fs.Dir(self.subst(tp)).srcnode().abspath - - def Tool(self, tool, toolpath=None, **kw): - if SCons.Util.is_String(tool): - tool = self.subst(tool) - if toolpath is None: - toolpath = self.get('toolpath', []) - toolpath = map(self._find_toolpath_dir, toolpath) - tool = apply(SCons.Tool.Tool, (tool, toolpath), kw) - tool(self) - - def WhereIs(self, prog, path=None, pathext=None, reject=[]): - """Find prog in the path. - """ - if path is None: - try: - path = self['ENV']['PATH'] - except KeyError: - pass - elif SCons.Util.is_String(path): - path = self.subst(path) - if pathext is None: - try: - pathext = self['ENV']['PATHEXT'] - except KeyError: - pass - elif SCons.Util.is_String(pathext): - pathext = self.subst(pathext) - prog = self.subst(prog) - path = SCons.Util.WhereIs(prog, path, pathext, reject) - if path: return path - return None - - ####################################################################### - # Public methods for doing real "SCons stuff" (manipulating - # dependencies, setting attributes on targets, etc.). These begin - # with upper-case letters. The essential characteristic of methods - # in this section is that they all *should* have corresponding - # same-named global functions. - ####################################################################### - - def Action(self, *args, **kw): - def subst_string(a, self=self): - if SCons.Util.is_String(a): - a = self.subst(a) - return a - nargs = map(subst_string, args) - nkw = self.subst_kw(kw) - return apply(SCons.Action.Action, nargs, nkw) - - def AddPreAction(self, files, action): - nodes = self.arg2nodes(files, self.fs.Entry) - action = SCons.Action.Action(action) - uniq = {} - for executor in map(lambda n: n.get_executor(), nodes): - uniq[executor] = 1 - for executor in uniq.keys(): - executor.add_pre_action(action) - return nodes - - def AddPostAction(self, files, action): - nodes = self.arg2nodes(files, self.fs.Entry) - action = SCons.Action.Action(action) - uniq = {} - for executor in map(lambda n: n.get_executor(), nodes): - uniq[executor] = 1 - for executor in uniq.keys(): - executor.add_post_action(action) - return nodes - - def Alias(self, target, source=[], action=None, **kw): - tlist = self.arg2nodes(target, self.ans.Alias) - if not SCons.Util.is_List(source): - source = [source] - source = filter(None, source) - - if not action: - if not source: - # There are no source files and no action, so just - # return a target list of classic Alias Nodes, without - # any builder. The externally visible effect is that - # this will make the wrapping Script.BuildTask class - # say that there's "Nothing to be done" for this Alias, - # instead of that it's "up to date." - return tlist - - # No action, but there are sources. Re-call all the target - # builders to add the sources to each target. - result = [] - for t in tlist: - bld = t.get_builder(AliasBuilder) - result.extend(bld(self, t, source)) - return result - - nkw = self.subst_kw(kw) - nkw.update({ - 'action' : SCons.Action.Action(action), - 'source_factory' : self.fs.Entry, - 'multi' : 1, - 'is_explicit' : None, - }) - bld = apply(SCons.Builder.Builder, (), nkw) - - # Apply the Builder separately to each target so that the Aliases - # stay separate. If we did one "normal" Builder call with the - # whole target list, then all of the target Aliases would be - # associated under a single Executor. - result = [] - for t in tlist: - # Calling the convert() method will cause a new Executor to be - # created from scratch, so we have to explicitly initialize - # it with the target's existing sources, plus our new ones, - # so nothing gets lost. - b = t.get_builder() - if b is None or b is AliasBuilder: - b = bld - else: - nkw['action'] = b.action + action - b = apply(SCons.Builder.Builder, (), nkw) - t.convert() - result.extend(b(self, t, t.sources + source)) - return result - - def AlwaysBuild(self, *targets): - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_always_build() - return tlist - - def BuildDir(self, *args, **kw): - if kw.has_key('build_dir'): - kw['variant_dir'] = kw['build_dir'] - del kw['build_dir'] - return apply(self.VariantDir, args, kw) - - def Builder(self, **kw): - nkw = self.subst_kw(kw) - return apply(SCons.Builder.Builder, [], nkw) - - def CacheDir(self, path): - import SCons.CacheDir - if path is not None: - path = self.subst(path) - self._CacheDir_path = path - - def Clean(self, targets, files): - global CleanTargets - tlist = self.arg2nodes(targets, self.fs.Entry) - flist = self.arg2nodes(files, self.fs.Entry) - for t in tlist: - try: - CleanTargets[t].extend(flist) - except KeyError: - CleanTargets[t] = flist - - def Configure(self, *args, **kw): - nargs = [self] - if args: - nargs = nargs + self.subst_list(args)[0] - nkw = self.subst_kw(kw) - nkw['_depth'] = kw.get('_depth', 0) + 1 - try: - nkw['custom_tests'] = self.subst_kw(nkw['custom_tests']) - except KeyError: - pass - return apply(SCons.SConf.SConf, nargs, nkw) - - def Command(self, target, source, action, **kw): - """Builds the supplied target files from the supplied - source files using the supplied action. Action may - be any type that the Builder constructor will accept - for an action.""" - bkw = { - 'action' : action, - 'target_factory' : self.fs.Entry, - 'source_factory' : self.fs.Entry, - } - try: bkw['source_scanner'] = kw['source_scanner'] - except KeyError: pass - else: del kw['source_scanner'] - bld = apply(SCons.Builder.Builder, (), bkw) - return apply(bld, (self, target, source), kw) - - def Depends(self, target, dependency): - """Explicity specify that 'target's depend on 'dependency'.""" - tlist = self.arg2nodes(target, self.fs.Entry) - dlist = self.arg2nodes(dependency, self.fs.Entry) - for t in tlist: - t.add_dependency(dlist) - return tlist - - def Dir(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(apply(self.fs.Dir, (e,) + args, kw)) - return result - return apply(self.fs.Dir, (s,) + args, kw) - - def NoClean(self, *targets): - """Tags a target so that it will not be cleaned by -c""" - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_noclean() - return tlist - - def NoCache(self, *targets): - """Tags a target so that it will not be cached""" - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_nocache() - return tlist - - def Entry(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(apply(self.fs.Entry, (e,) + args, kw)) - return result - return apply(self.fs.Entry, (s,) + args, kw) - - def Environment(self, **kw): - return apply(SCons.Environment.Environment, [], self.subst_kw(kw)) - - def Execute(self, action, *args, **kw): - """Directly execute an action through an Environment - """ - action = apply(self.Action, (action,) + args, kw) - result = action([], [], self) - if isinstance(result, SCons.Errors.BuildError): - errstr = result.errstr - if result.filename: - errstr = result.filename + ': ' + errstr - sys.stderr.write("scons: *** %s\n" % errstr) - return result.status - else: - return result - - def File(self, name, *args, **kw): - """ - """ - s = self.subst(name) - if SCons.Util.is_Sequence(s): - result=[] - for e in s: - result.append(apply(self.fs.File, (e,) + args, kw)) - return result - return apply(self.fs.File, (s,) + args, kw) - - def FindFile(self, file, dirs): - file = self.subst(file) - nodes = self.arg2nodes(dirs, self.fs.Dir) - return SCons.Node.FS.find_file(file, tuple(nodes)) - - def Flatten(self, sequence): - return SCons.Util.flatten(sequence) - - def GetBuildPath(self, files): - result = map(str, self.arg2nodes(files, self.fs.Entry)) - if SCons.Util.is_List(files): - return result - else: - return result[0] - - def Glob(self, pattern, ondisk=True, source=False, strings=False): - return self.fs.Glob(self.subst(pattern), ondisk, source, strings) - - def Ignore(self, target, dependency): - """Ignore a dependency.""" - tlist = self.arg2nodes(target, self.fs.Entry) - dlist = self.arg2nodes(dependency, self.fs.Entry) - for t in tlist: - t.add_ignore(dlist) - return tlist - - def Literal(self, string): - return SCons.Subst.Literal(string) - - def Local(self, *targets): - ret = [] - for targ in targets: - if isinstance(targ, SCons.Node.Node): - targ.set_local() - ret.append(targ) - else: - for t in self.arg2nodes(targ, self.fs.Entry): - t.set_local() - ret.append(t) - return ret - - def Precious(self, *targets): - tlist = [] - for t in targets: - tlist.extend(self.arg2nodes(t, self.fs.Entry)) - for t in tlist: - t.set_precious() - return tlist - - def Repository(self, *dirs, **kw): - dirs = self.arg2nodes(list(dirs), self.fs.Dir) - apply(self.fs.Repository, dirs, kw) - - def Requires(self, target, prerequisite): - """Specify that 'prerequisite' must be built before 'target', - (but 'target' does not actually depend on 'prerequisite' - and need not be rebuilt if it changes).""" - tlist = self.arg2nodes(target, self.fs.Entry) - plist = self.arg2nodes(prerequisite, self.fs.Entry) - for t in tlist: - t.add_prerequisite(plist) - return tlist - - def Scanner(self, *args, **kw): - nargs = [] - for arg in args: - if SCons.Util.is_String(arg): - arg = self.subst(arg) - nargs.append(arg) - nkw = self.subst_kw(kw) - return apply(SCons.Scanner.Base, nargs, nkw) - - def SConsignFile(self, name=".sconsign", dbm_module=None): - if name is not None: - name = self.subst(name) - if not os.path.isabs(name): - name = os.path.join(str(self.fs.SConstruct_dir), name) - if name: - name = os.path.normpath(name) - sconsign_dir = os.path.dirname(name) - if sconsign_dir and not os.path.exists(sconsign_dir): - self.Execute(SCons.Defaults.Mkdir(sconsign_dir)) - SCons.SConsign.File(name, dbm_module) - - def SideEffect(self, side_effect, target): - """Tell scons that side_effects are built as side - effects of building targets.""" - side_effects = self.arg2nodes(side_effect, self.fs.Entry) - targets = self.arg2nodes(target, self.fs.Entry) - - for side_effect in side_effects: - if side_effect.multiple_side_effect_has_builder(): - raise SCons.Errors.UserError, "Multiple ways to build the same target were specified for: %s" % str(side_effect) - side_effect.add_source(targets) - side_effect.side_effect = 1 - self.Precious(side_effect) - for target in targets: - target.side_effects.append(side_effect) - return side_effects - - def SourceCode(self, entry, builder): - """Arrange for a source code builder for (part of) a tree.""" - entries = self.arg2nodes(entry, self.fs.Entry) - for entry in entries: - entry.set_src_builder(builder) - return entries - - def SourceSignatures(self, type): - global _warn_source_signatures_deprecated - if _warn_source_signatures_deprecated: - msg = "The env.SourceSignatures() method is deprecated;\n" + \ - "\tconvert your build to use the env.Decider() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedSourceSignaturesWarning, msg) - _warn_source_signatures_deprecated = False - type = self.subst(type) - self.src_sig_type = type - if type == 'MD5': - if not SCons.Util.md5: - raise UserError, "MD5 signatures are not available in this version of Python." - self.decide_source = self._changed_content - elif type == 'timestamp': - self.decide_source = self._changed_timestamp_match - else: - raise UserError, "Unknown source signature type '%s'" % type - - def Split(self, arg): - """This function converts a string or list into a list of strings - or Nodes. This makes things easier for users by allowing files to - be specified as a white-space separated list to be split. - The input rules are: - - A single string containing names separated by spaces. These will be - split apart at the spaces. - - A single Node instance - - A list containing either strings or Node instances. Any strings - in the list are not split at spaces. - In all cases, the function returns a list of Nodes and strings.""" - if SCons.Util.is_List(arg): - return map(self.subst, arg) - elif SCons.Util.is_String(arg): - return string.split(self.subst(arg)) - else: - return [self.subst(arg)] - - def TargetSignatures(self, type): - global _warn_target_signatures_deprecated - if _warn_target_signatures_deprecated: - msg = "The env.TargetSignatures() method is deprecated;\n" + \ - "\tconvert your build to use the env.Decider() method instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedTargetSignaturesWarning, msg) - _warn_target_signatures_deprecated = False - type = self.subst(type) - self.tgt_sig_type = type - if type in ('MD5', 'content'): - if not SCons.Util.md5: - raise UserError, "MD5 signatures are not available in this version of Python." - self.decide_target = self._changed_content - elif type == 'timestamp': - self.decide_target = self._changed_timestamp_match - elif type == 'build': - self.decide_target = self._changed_build - elif type == 'source': - self.decide_target = self._changed_source - else: - raise UserError, "Unknown target signature type '%s'"%type - - def Value(self, value, built_value=None): - """ - """ - return SCons.Node.Python.Value(value, built_value) - - def VariantDir(self, variant_dir, src_dir, duplicate=1): - variant_dir = self.arg2nodes(variant_dir, self.fs.Dir)[0] - src_dir = self.arg2nodes(src_dir, self.fs.Dir)[0] - self.fs.VariantDir(variant_dir, src_dir, duplicate) - - def FindSourceFiles(self, node='.'): - """ returns a list of all source files. - """ - node = self.arg2nodes(node, self.fs.Entry)[0] - - sources = [] - # Uncomment this and get rid of the global definition when we - # drop support for pre-2.2 Python versions. - #def build_source(ss, result): - # for s in ss: - # if isinstance(s, SCons.Node.FS.Dir): - # build_source(s.all_children(), result) - # elif s.has_builder(): - # build_source(s.sources, result) - # elif isinstance(s.disambiguate(), SCons.Node.FS.File): - # result.append(s) - build_source(node.all_children(), sources) - - # THIS CODE APPEARS TO HAVE NO EFFECT - # # get the final srcnode for all nodes, this means stripping any - # # attached build node by calling the srcnode function - # for file in sources: - # srcnode = file.srcnode() - # while srcnode != file.srcnode(): - # srcnode = file.srcnode() - - # remove duplicates - return list(set(sources)) - - def FindInstalledFiles(self): - """ returns the list of all targets of the Install and InstallAs Builder. - """ - from SCons.Tool import install - if install._UNIQUE_INSTALLED_FILES is None: - install._UNIQUE_INSTALLED_FILES = SCons.Util.uniquer_hashables(install._INSTALLED_FILES) - return install._UNIQUE_INSTALLED_FILES - -class OverrideEnvironment(Base): - """A proxy that overrides variables in a wrapped construction - environment by returning values from an overrides dictionary in - preference to values from the underlying subject environment. - - This is a lightweight (I hope) proxy that passes through most use of - attributes to the underlying Environment.Base class, but has just - enough additional methods defined to act like a real construction - environment with overridden values. It can wrap either a Base - construction environment, or another OverrideEnvironment, which - can in turn nest arbitrary OverrideEnvironments... - - Note that we do *not* call the underlying base class - (SubsitutionEnvironment) initialization, because we get most of those - from proxying the attributes of the subject construction environment. - But because we subclass SubstitutionEnvironment, this class also - has inherited arg2nodes() and subst*() methods; those methods can't - be proxied because they need *this* object's methods to fetch the - values from the overrides dictionary. - """ - - def __init__(self, subject, overrides={}): - if __debug__: logInstanceCreation(self, 'Environment.OverrideEnvironment') - self.__dict__['__subject'] = subject - self.__dict__['overrides'] = overrides - - # Methods that make this class act like a proxy. - def __getattr__(self, name): - return getattr(self.__dict__['__subject'], name) - def __setattr__(self, name, value): - setattr(self.__dict__['__subject'], name, value) - - # Methods that make this class act like a dictionary. - def __getitem__(self, key): - try: - return self.__dict__['overrides'][key] - except KeyError: - return self.__dict__['__subject'].__getitem__(key) - def __setitem__(self, key, value): - if not is_valid_construction_var(key): - raise SCons.Errors.UserError, "Illegal construction variable `%s'" % key - self.__dict__['overrides'][key] = value - def __delitem__(self, key): - try: - del self.__dict__['overrides'][key] - except KeyError: - deleted = 0 - else: - deleted = 1 - try: - result = self.__dict__['__subject'].__delitem__(key) - except KeyError: - if not deleted: - raise - result = None - return result - def get(self, key, default=None): - """Emulates the get() method of dictionaries.""" - try: - return self.__dict__['overrides'][key] - except KeyError: - return self.__dict__['__subject'].get(key, default) - def has_key(self, key): - try: - self.__dict__['overrides'][key] - return 1 - except KeyError: - return self.__dict__['__subject'].has_key(key) - def __contains__(self, key): - if self.__dict__['overrides'].__contains__(key): - return 1 - return self.__dict__['__subject'].__contains__(key) - def Dictionary(self): - """Emulates the items() method of dictionaries.""" - d = self.__dict__['__subject'].Dictionary().copy() - d.update(self.__dict__['overrides']) - return d - def items(self): - """Emulates the items() method of dictionaries.""" - return self.Dictionary().items() - - # Overridden private construction environment methods. - def _update(self, dict): - """Update an environment's values directly, bypassing the normal - checks that occur when users try to set items. - """ - self.__dict__['overrides'].update(dict) - - def gvars(self): - return self.__dict__['__subject'].gvars() - - def lvars(self): - lvars = self.__dict__['__subject'].lvars() - lvars.update(self.__dict__['overrides']) - return lvars - - # Overridden public construction environment methods. - def Replace(self, **kw): - kw = copy_non_reserved_keywords(kw) - self.__dict__['overrides'].update(semi_deepcopy(kw)) - -# The entry point that will be used by the external world -# to refer to a construction environment. This allows the wrapper -# interface to extend a construction environment for its own purposes -# by subclassing SCons.Environment.Base and then assigning the -# class to SCons.Environment.Environment. - -Environment = Base - -# An entry point for returning a proxy subclass instance that overrides -# the subst*() methods so they don't actually perform construction -# variable substitution. This is specifically intended to be the shim -# layer in between global function calls (which don't want construction -# variable substitution) and the DefaultEnvironment() (which would -# substitute variables if left to its own devices).""" -# -# We have to wrap this in a function that allows us to delay definition of -# the class until it's necessary, so that when it subclasses Environment -# it will pick up whatever Environment subclass the wrapper interface -# might have assigned to SCons.Environment.Environment. - -def NoSubstitutionProxy(subject): - class _NoSubstitutionProxy(Environment): - def __init__(self, subject): - self.__dict__['__subject'] = subject - def __getattr__(self, name): - return getattr(self.__dict__['__subject'], name) - def __setattr__(self, name, value): - return setattr(self.__dict__['__subject'], name, value) - def raw_to_mode(self, dict): - try: - raw = dict['raw'] - except KeyError: - pass - else: - del dict['raw'] - dict['mode'] = raw - def subst(self, string, *args, **kwargs): - return string - def subst_kw(self, kw, *args, **kwargs): - return kw - def subst_list(self, string, *args, **kwargs): - nargs = (string, self,) + args - nkw = kwargs.copy() - nkw['gvars'] = {} - self.raw_to_mode(nkw) - return apply(SCons.Subst.scons_subst_list, nargs, nkw) - def subst_target_source(self, string, *args, **kwargs): - nargs = (string, self,) + args - nkw = kwargs.copy() - nkw['gvars'] = {} - self.raw_to_mode(nkw) - return apply(SCons.Subst.scons_subst, nargs, nkw) - return _NoSubstitutionProxy(subject) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Errors.py b/share/scons-local-1.3.0/SCons/Errors.py deleted file mode 100644 index 69b389a302b951dde3c7d04cd9a737b96034ff7d..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Errors.py +++ /dev/null @@ -1,207 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -"""SCons.Errors - -This file contains the exception classes used to handle internal -and user errors in SCons. - -""" - -__revision__ = "src/engine/SCons/Errors.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Util - -import exceptions - -class BuildError(Exception): - """ Errors occuring while building. - - BuildError have the following attributes: - - Information about the cause of the build error: - ----------------------------------------------- - - errstr : a description of the error message - - status : the return code of the action that caused the build - error. Must be set to a non-zero value even if the - build error is not due to an action returning a - non-zero returned code. - - exitstatus : SCons exit status due to this build error. - Must be nonzero unless due to an explicit Exit() - call. Not always the same as status, since - actions return a status code that should be - respected, but SCons typically exits with 2 - irrespective of the return value of the failed - action. - - filename : The name of the file or directory that caused the - build error. Set to None if no files are associated with - this error. This might be different from the target - being built. For example, failure to create the - directory in which the target file will appear. It - can be None if the error is not due to a particular - filename. - - exc_info : Info about exception that caused the build - error. Set to (None, None, None) if this build - error is not due to an exception. - - - Information about the cause of the location of the error: - --------------------------------------------------------- - - node : the error occured while building this target node(s) - - executor : the executor that caused the build to fail (might - be None if the build failures is not due to the - executor failing) - - action : the action that caused the build to fail (might be - None if the build failures is not due to the an - action failure) - - command : the command line for the action that caused the - build to fail (might be None if the build failures - is not due to the an action failure) - """ - - def __init__(self, - node=None, errstr="Unknown error", status=2, exitstatus=2, - filename=None, executor=None, action=None, command=None, - exc_info=(None, None, None)): - - self.errstr = errstr - self.status = status - self.exitstatus = exitstatus - self.filename = filename - self.exc_info = exc_info - - self.node = node - self.executor = executor - self.action = action - self.command = command - - Exception.__init__(self, node, errstr, status, exitstatus, filename, - executor, action, command, exc_info) - - def __str__(self): - if self.filename: - return self.filename + ': ' + self.errstr - else: - return self.errstr - -class InternalError(Exception): - pass - -class UserError(Exception): - pass - -class StopError(Exception): - pass - -class EnvironmentError(Exception): - pass - -class MSVCError(IOError): - pass - -class ExplicitExit(Exception): - def __init__(self, node=None, status=None, *args): - self.node = node - self.status = status - self.exitstatus = status - apply(Exception.__init__, (self,) + args) - -def convert_to_BuildError(status, exc_info=None): - """ - Convert any return code a BuildError Exception. - - `status' can either be a return code or an Exception. - The buildError.status we set here will normally be - used as the exit status of the "scons" process. - """ - if not exc_info and isinstance(status, Exception): - exc_info = (status.__class__, status, None) - - if isinstance(status, BuildError): - buildError = status - buildError.exitstatus = 2 # always exit with 2 on build errors - elif isinstance(status, ExplicitExit): - status = status.status - errstr = 'Explicit exit, status %s' % status - buildError = BuildError( - errstr=errstr, - status=status, # might be 0, OK here - exitstatus=status, # might be 0, OK here - exc_info=exc_info) - # TODO(1.5): - #elif isinstance(status, (StopError, UserError)): - elif isinstance(status, StopError) or isinstance(status, UserError): - buildError = BuildError( - errstr=str(status), - status=2, - exitstatus=2, - exc_info=exc_info) - elif isinstance(status, exceptions.EnvironmentError): - # If an IOError/OSError happens, raise a BuildError. - # Report the name of the file or directory that caused the - # error, which might be different from the target being built - # (for example, failure to create the directory in which the - # target file will appear). - try: filename = status.filename - except AttributeError: filename = None - buildError = BuildError( - errstr=status.strerror, - status=status.errno, - exitstatus=2, - filename=filename, - exc_info=exc_info) - elif isinstance(status, Exception): - buildError = BuildError( - errstr='%s : %s' % (status.__class__.__name__, status), - status=2, - exitstatus=2, - exc_info=exc_info) - elif SCons.Util.is_String(status): - buildError = BuildError( - errstr=status, - status=2, - exitstatus=2) - else: - buildError = BuildError( - errstr="Error %s" % status, - status=status, - exitstatus=2) - - #import sys - #sys.stderr.write("convert_to_BuildError: status %s => (errstr %s, status %s)"%(status,buildError.errstr, buildError.status)) - return buildError - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Executor.py b/share/scons-local-1.3.0/SCons/Executor.py deleted file mode 100644 index 44a1b9e5a43b1004356c005290ed59de6d262d73..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Executor.py +++ /dev/null @@ -1,636 +0,0 @@ -"""SCons.Executor - -A module for executing actions with specific lists of target and source -Nodes. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Executor.py 4720 2010/03/24 03:14:11 jars" - -import string -import UserList - -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Memoize - - -class Batch: - """Remembers exact association between targets - and sources of executor.""" - def __init__(self, targets=[], sources=[]): - self.targets = targets - self.sources = sources - - - -class TSList(UserList.UserList): - """A class that implements $TARGETS or $SOURCES expansions by wrapping - an executor Method. This class is used in the Executor.lvars() - to delay creation of NodeList objects until they're needed. - - Note that we subclass UserList.UserList purely so that the - is_Sequence() function will identify an object of this class as - a list during variable expansion. We're not really using any - UserList.UserList methods in practice. - """ - def __init__(self, func): - self.func = func - def __getattr__(self, attr): - nl = self.func() - return getattr(nl, attr) - def __getitem__(self, i): - nl = self.func() - return nl[i] - def __getslice__(self, i, j): - nl = self.func() - i = max(i, 0); j = max(j, 0) - return nl[i:j] - def __str__(self): - nl = self.func() - return str(nl) - def __repr__(self): - nl = self.func() - return repr(nl) - -class TSObject: - """A class that implements $TARGET or $SOURCE expansions by wrapping - an Executor method. - """ - def __init__(self, func): - self.func = func - def __getattr__(self, attr): - n = self.func() - return getattr(n, attr) - def __str__(self): - n = self.func() - if n: - return str(n) - return '' - def __repr__(self): - n = self.func() - if n: - return repr(n) - return '' - -def rfile(node): - """ - A function to return the results of a Node's rfile() method, - if it exists, and the Node itself otherwise (if it's a Value - Node, e.g.). - """ - try: - rfile = node.rfile - except AttributeError: - return node - else: - return rfile() - - -class Executor: - """A class for controlling instances of executing an action. - - This largely exists to hold a single association of an action, - environment, list of environment override dictionaries, targets - and sources for later processing as needed. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self, action, env=None, overridelist=[{}], - targets=[], sources=[], builder_kw={}): - if __debug__: logInstanceCreation(self, 'Executor.Executor') - self.set_action_list(action) - self.pre_actions = [] - self.post_actions = [] - self.env = env - self.overridelist = overridelist - if targets or sources: - self.batches = [Batch(targets[:], sources[:])] - else: - self.batches = [] - self.builder_kw = builder_kw - self._memo = {} - - def get_lvars(self): - try: - return self.lvars - except AttributeError: - self.lvars = { - 'CHANGED_SOURCES' : TSList(self._get_changed_sources), - 'CHANGED_TARGETS' : TSList(self._get_changed_targets), - 'SOURCE' : TSObject(self._get_source), - 'SOURCES' : TSList(self._get_sources), - 'TARGET' : TSObject(self._get_target), - 'TARGETS' : TSList(self._get_targets), - 'UNCHANGED_SOURCES' : TSList(self._get_unchanged_sources), - 'UNCHANGED_TARGETS' : TSList(self._get_unchanged_targets), - } - return self.lvars - - def _get_changes(self): - cs = [] - ct = [] - us = [] - ut = [] - for b in self.batches: - if b.targets[0].is_up_to_date(): - us.extend(map(rfile, b.sources)) - ut.extend(b.targets) - else: - cs.extend(map(rfile, b.sources)) - ct.extend(b.targets) - self._changed_sources_list = SCons.Util.NodeList(cs) - self._changed_targets_list = SCons.Util.NodeList(ct) - self._unchanged_sources_list = SCons.Util.NodeList(us) - self._unchanged_targets_list = SCons.Util.NodeList(ut) - - def _get_changed_sources(self, *args, **kw): - try: - return self._changed_sources_list - except AttributeError: - self._get_changes() - return self._changed_sources_list - - def _get_changed_targets(self, *args, **kw): - try: - return self._changed_targets_list - except AttributeError: - self._get_changes() - return self._changed_targets_list - - def _get_source(self, *args, **kw): - #return SCons.Util.NodeList([rfile(self.batches[0].sources[0]).get_subst_proxy()]) - return rfile(self.batches[0].sources[0]).get_subst_proxy() - - def _get_sources(self, *args, **kw): - return SCons.Util.NodeList(map(lambda n: rfile(n).get_subst_proxy(), self.get_all_sources())) - - def _get_target(self, *args, **kw): - #return SCons.Util.NodeList([self.batches[0].targets[0].get_subst_proxy()]) - return self.batches[0].targets[0].get_subst_proxy() - - def _get_targets(self, *args, **kw): - return SCons.Util.NodeList(map(lambda n: n.get_subst_proxy(), self.get_all_targets())) - - def _get_unchanged_sources(self, *args, **kw): - try: - return self._unchanged_sources_list - except AttributeError: - self._get_changes() - return self._unchanged_sources_list - - def _get_unchanged_targets(self, *args, **kw): - try: - return self._unchanged_targets_list - except AttributeError: - self._get_changes() - return self._unchanged_targets_list - - def get_action_targets(self): - if not self.action_list: - return [] - targets_string = self.action_list[0].get_targets(self.env, self) - if targets_string[0] == '$': - targets_string = targets_string[1:] - return self.get_lvars()[targets_string] - - def set_action_list(self, action): - import SCons.Util - if not SCons.Util.is_List(action): - if not action: - import SCons.Errors - raise SCons.Errors.UserError, "Executor must have an action." - action = [action] - self.action_list = action - - def get_action_list(self): - return self.pre_actions + self.action_list + self.post_actions - - def get_all_targets(self): - """Returns all targets for all batches of this Executor.""" - result = [] - for batch in self.batches: - # TODO(1.5): remove the list() cast - result.extend(list(batch.targets)) - return result - - def get_all_sources(self): - """Returns all sources for all batches of this Executor.""" - result = [] - for batch in self.batches: - # TODO(1.5): remove the list() cast - result.extend(list(batch.sources)) - return result - - def get_all_children(self): - """Returns all unique children (dependencies) for all batches - of this Executor. - - The Taskmaster can recognize when it's already evaluated a - Node, so we don't have to make this list unique for its intended - canonical use case, but we expect there to be a lot of redundancy - (long lists of batched .cc files #including the same .h files - over and over), so removing the duplicates once up front should - save the Taskmaster a lot of work. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_all_targets(): - result.extend(target.children()) - return result - - def get_all_prerequisites(self): - """Returns all unique (order-only) prerequisites for all batches - of this Executor. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_all_targets(): - # TODO(1.5): remove the list() cast - result.extend(list(target.prerequisites)) - return result - - def get_action_side_effects(self): - - """Returns all side effects for all batches of this - Executor used by the underlying Action. - """ - result = SCons.Util.UniqueList([]) - for target in self.get_action_targets(): - result.extend(target.side_effects) - return result - - memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - - def get_build_env(self): - """Fetch or create the appropriate build Environment - for this Executor. - """ - try: - return self._memo['get_build_env'] - except KeyError: - pass - - # Create the build environment instance with appropriate - # overrides. These get evaluated against the current - # environment's construction variables so that users can - # add to existing values by referencing the variable in - # the expansion. - overrides = {} - for odict in self.overridelist: - overrides.update(odict) - - import SCons.Defaults - env = self.env or SCons.Defaults.DefaultEnvironment() - build_env = env.Override(overrides) - - self._memo['get_build_env'] = build_env - - return build_env - - def get_build_scanner_path(self, scanner): - """Fetch the scanner path for this executor's targets and sources. - """ - env = self.get_build_env() - try: - cwd = self.batches[0].targets[0].cwd - except (IndexError, AttributeError): - cwd = None - return scanner.path(env, cwd, - self.get_all_targets(), - self.get_all_sources()) - - def get_kw(self, kw={}): - result = self.builder_kw.copy() - result.update(kw) - result['executor'] = self - return result - - def do_nothing(self, target, kw): - return 0 - - def do_execute(self, target, kw): - """Actually execute the action list.""" - env = self.get_build_env() - kw = self.get_kw(kw) - status = 0 - for act in self.get_action_list(): - #args = (self.get_all_targets(), self.get_all_sources(), env) - args = ([], [], env) - status = apply(act, args, kw) - if isinstance(status, SCons.Errors.BuildError): - status.executor = self - raise status - elif status: - msg = "Error %s" % status - raise SCons.Errors.BuildError( - errstr=msg, - node=self.batches[0].targets, - executor=self, - action=act) - return status - - # use extra indirection because with new-style objects (Python 2.2 - # and above) we can't override special methods, and nullify() needs - # to be able to do this. - - def __call__(self, target, **kw): - return self.do_execute(target, kw) - - def cleanup(self): - self._memo = {} - - def add_sources(self, sources): - """Add source files to this Executor's list. This is necessary - for "multi" Builders that can be called repeatedly to build up - a source file list for a given target.""" - # TODO(batch): extend to multiple batches - assert (len(self.batches) == 1) - # TODO(batch): remove duplicates? - sources = filter(lambda x, s=self.batches[0].sources: x not in s, sources) - self.batches[0].sources.extend(sources) - - def get_sources(self): - return self.batches[0].sources - - def add_batch(self, targets, sources): - """Add pair of associated target and source to this Executor's list. - This is necessary for "batch" Builders that can be called repeatedly - to build up a list of matching target and source files that will be - used in order to update multiple target files at once from multiple - corresponding source files, for tools like MSVC that support it.""" - self.batches.append(Batch(targets, sources)) - - def prepare(self): - """ - Preparatory checks for whether this Executor can go ahead - and (try to) build its targets. - """ - for s in self.get_all_sources(): - if s.missing(): - msg = "Source `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError, msg % (s, self.batches[0].targets[0]) - - def add_pre_action(self, action): - self.pre_actions.append(action) - - def add_post_action(self, action): - self.post_actions.append(action) - - # another extra indirection for new-style objects and nullify... - - def my_str(self): - env = self.get_build_env() - get = lambda action, t=self.get_all_targets(), s=self.get_all_sources(), e=env: \ - action.genstring(t, s, e) - return string.join(map(get, self.get_action_list()), "\n") - - - def __str__(self): - return self.my_str() - - def nullify(self): - self.cleanup() - self.do_execute = self.do_nothing - self.my_str = lambda S=self: '' - - memoizer_counters.append(SCons.Memoize.CountValue('get_contents')) - - def get_contents(self): - """Fetch the signature contents. This is the main reason this - class exists, so we can compute this once and cache it regardless - of how many target or source Nodes there are. - """ - try: - return self._memo['get_contents'] - except KeyError: - pass - env = self.get_build_env() - get = lambda action, t=self.get_all_targets(), s=self.get_all_sources(), e=env: \ - action.get_contents(t, s, e) - result = string.join(map(get, self.get_action_list()), "") - self._memo['get_contents'] = result - return result - - def get_timestamp(self): - """Fetch a time stamp for this Executor. We don't have one, of - course (only files do), but this is the interface used by the - timestamp module. - """ - return 0 - - def scan_targets(self, scanner): - # TODO(batch): scan by batches - self.scan(scanner, self.get_all_targets()) - - def scan_sources(self, scanner): - # TODO(batch): scan by batches - if self.batches[0].sources: - self.scan(scanner, self.get_all_sources()) - - def scan(self, scanner, node_list): - """Scan a list of this Executor's files (targets or sources) for - implicit dependencies and update all of the targets with them. - This essentially short-circuits an N*M scan of the sources for - each individual target, which is a hell of a lot more efficient. - """ - env = self.get_build_env() - - # TODO(batch): scan by batches) - deps = [] - if scanner: - for node in node_list: - node.disambiguate() - s = scanner.select(node) - if not s: - continue - path = self.get_build_scanner_path(s) - deps.extend(node.get_implicit_deps(env, s, path)) - else: - kw = self.get_kw() - for node in node_list: - node.disambiguate() - scanner = node.get_env_scanner(env, kw) - if not scanner: - continue - scanner = scanner.select(node) - if not scanner: - continue - path = self.get_build_scanner_path(scanner) - deps.extend(node.get_implicit_deps(env, scanner, path)) - - deps.extend(self.get_implicit_deps()) - - for tgt in self.get_all_targets(): - tgt.add_to_implicit(deps) - - def _get_unignored_sources_key(self, node, ignore=()): - return (node,) + tuple(ignore) - - memoizer_counters.append(SCons.Memoize.CountDict('get_unignored_sources', _get_unignored_sources_key)) - - def get_unignored_sources(self, node, ignore=()): - key = (node,) + tuple(ignore) - try: - memo_dict = self._memo['get_unignored_sources'] - except KeyError: - memo_dict = {} - self._memo['get_unignored_sources'] = memo_dict - else: - try: - return memo_dict[key] - except KeyError: - pass - - if node: - # TODO: better way to do this (it's a linear search, - # but it may not be critical path)? - sourcelist = [] - for b in self.batches: - if node in b.targets: - sourcelist = b.sources - break - else: - sourcelist = self.get_all_sources() - if ignore: - idict = {} - for i in ignore: - idict[i] = 1 - sourcelist = filter(lambda s, i=idict: not i.has_key(s), sourcelist) - - memo_dict[key] = sourcelist - - return sourcelist - - def get_implicit_deps(self): - """Return the executor's implicit dependencies, i.e. the nodes of - the commands to be executed.""" - result = [] - build_env = self.get_build_env() - for act in self.get_action_list(): - deps = act.get_implicit_deps(self.get_all_targets(), - self.get_all_sources(), - build_env) - result.extend(deps) - return result - - - -_batch_executors = {} - -def GetBatchExecutor(key): - return _batch_executors[key] - -def AddBatchExecutor(key, executor): - assert not _batch_executors.has_key(key) - _batch_executors[key] = executor - -nullenv = None - - -def get_NullEnvironment(): - """Use singleton pattern for Null Environments.""" - global nullenv - - import SCons.Util - class NullEnvironment(SCons.Util.Null): - import SCons.CacheDir - _CacheDir_path = None - _CacheDir = SCons.CacheDir.CacheDir(None) - def get_CacheDir(self): - return self._CacheDir - - if not nullenv: - nullenv = NullEnvironment() - return nullenv - -class Null: - """A null Executor, with a null build Environment, that does - nothing when the rest of the methods call it. - - This might be able to disapper when we refactor things to - disassociate Builders from Nodes entirely, so we're not - going to worry about unit tests for this--at least for now. - """ - def __init__(self, *args, **kw): - if __debug__: logInstanceCreation(self, 'Executor.Null') - self.batches = [Batch(kw['targets'][:], [])] - def get_build_env(self): - return get_NullEnvironment() - def get_build_scanner_path(self): - return None - def cleanup(self): - pass - def prepare(self): - pass - def get_unignored_sources(self, *args, **kw): - return tuple(()) - def get_action_targets(self): - return [] - def get_action_list(self): - return [] - def get_all_targets(self): - return self.batches[0].targets - def get_all_sources(self): - return self.batches[0].targets[0].sources - def get_all_children(self): - return self.get_all_sources() - def get_all_prerequisites(self): - return [] - def get_action_side_effects(self): - return [] - def __call__(self, *args, **kw): - return 0 - def get_contents(self): - return '' - def _morph(self): - """Morph this Null executor to a real Executor object.""" - batches = self.batches - self.__class__ = Executor - self.__init__([]) - self.batches = batches - - # The following methods require morphing this Null Executor to a - # real Executor object. - - def add_pre_action(self, action): - self._morph() - self.add_pre_action(action) - def add_post_action(self, action): - self._morph() - self.add_post_action(action) - def set_action_list(self, action): - self._morph() - self.set_action_list(action) - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Job.py b/share/scons-local-1.3.0/SCons/Job.py deleted file mode 100644 index e3d7f0f4d9e49b9db8401aa589629fa96bf5503b..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Job.py +++ /dev/null @@ -1,435 +0,0 @@ -"""SCons.Job - -This module defines the Serial and Parallel classes that execute tasks to -complete a build. The Jobs class provides a higher level interface to start, -stop, and wait on jobs. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Job.py 4720 2010/03/24 03:14:11 jars" - -import os -import signal - -import SCons.Errors - -# The default stack size (in kilobytes) of the threads used to execute -# jobs in parallel. -# -# We use a stack size of 256 kilobytes. The default on some platforms -# is too large and prevents us from creating enough threads to fully -# parallelized the build. For example, the default stack size on linux -# is 8 MBytes. - -explicit_stack_size = None -default_stack_size = 256 - -interrupt_msg = 'Build interrupted.' - - -class InterruptState: - def __init__(self): - self.interrupted = False - - def set(self): - self.interrupted = True - - def __call__(self): - return self.interrupted - - -class Jobs: - """An instance of this class initializes N jobs, and provides - methods for starting, stopping, and waiting on all N jobs. - """ - - def __init__(self, num, taskmaster): - """ - create 'num' jobs using the given taskmaster. - - If 'num' is 1 or less, then a serial job will be used, - otherwise a parallel job with 'num' worker threads will - be used. - - The 'num_jobs' attribute will be set to the actual number of jobs - allocated. If more than one job is requested but the Parallel - class can't do it, it gets reset to 1. Wrapping interfaces that - care should check the value of 'num_jobs' after initialization. - """ - - self.job = None - if num > 1: - stack_size = explicit_stack_size - if stack_size is None: - stack_size = default_stack_size - - try: - self.job = Parallel(taskmaster, num, stack_size) - self.num_jobs = num - except NameError: - pass - if self.job is None: - self.job = Serial(taskmaster) - self.num_jobs = 1 - - def run(self, postfunc=lambda: None): - """Run the jobs. - - postfunc() will be invoked after the jobs has run. It will be - invoked even if the jobs are interrupted by a keyboard - interrupt (well, in fact by a signal such as either SIGINT, - SIGTERM or SIGHUP). The execution of postfunc() is protected - against keyboard interrupts and is guaranteed to run to - completion.""" - self._setup_sig_handler() - try: - self.job.start() - finally: - postfunc() - self._reset_sig_handler() - - def were_interrupted(self): - """Returns whether the jobs were interrupted by a signal.""" - return self.job.interrupted() - - def _setup_sig_handler(self): - """Setup an interrupt handler so that SCons can shutdown cleanly in - various conditions: - - a) SIGINT: Keyboard interrupt - b) SIGTERM: kill or system shutdown - c) SIGHUP: Controlling shell exiting - - We handle all of these cases by stopping the taskmaster. It - turns out that it very difficult to stop the build process - by throwing asynchronously an exception such as - KeyboardInterrupt. For example, the python Condition - variables (threading.Condition) and Queue's do not seem to - asynchronous-exception-safe. It would require adding a whole - bunch of try/finally block and except KeyboardInterrupt all - over the place. - - Note also that we have to be careful to handle the case when - SCons forks before executing another process. In that case, we - want the child to exit immediately. - """ - def handler(signum, stack, self=self, parentpid=os.getpid()): - if os.getpid() == parentpid: - self.job.taskmaster.stop() - self.job.interrupted.set() - else: - os._exit(2) - - self.old_sigint = signal.signal(signal.SIGINT, handler) - self.old_sigterm = signal.signal(signal.SIGTERM, handler) - try: - self.old_sighup = signal.signal(signal.SIGHUP, handler) - except AttributeError: - pass - - def _reset_sig_handler(self): - """Restore the signal handlers to their previous state (before the - call to _setup_sig_handler().""" - - signal.signal(signal.SIGINT, self.old_sigint) - signal.signal(signal.SIGTERM, self.old_sigterm) - try: - signal.signal(signal.SIGHUP, self.old_sighup) - except AttributeError: - pass - -class Serial: - """This class is used to execute tasks in series, and is more efficient - than Parallel, but is only appropriate for non-parallel builds. Only - one instance of this class should be in existence at a time. - - This class is not thread safe. - """ - - def __init__(self, taskmaster): - """Create a new serial job given a taskmaster. - - The taskmaster's next_task() method should return the next task - that needs to be executed, or None if there are no more tasks. The - taskmaster's executed() method will be called for each task when it - is successfully executed or failed() will be called if it failed to - execute (e.g. execute() raised an exception).""" - - self.taskmaster = taskmaster - self.interrupted = InterruptState() - - def start(self): - """Start the job. This will begin pulling tasks from the taskmaster - and executing them, and return when there are no more tasks. If a task - fails to execute (i.e. execute() raises an exception), then the job will - stop.""" - - while 1: - task = self.taskmaster.next_task() - - if task is None: - break - - try: - task.prepare() - if task.needs_execute(): - task.execute() - except: - if self.interrupted(): - try: - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - except: - task.exception_set() - else: - task.exception_set() - - # Let the failed() callback function arrange for the - # build to stop if that's appropriate. - task.failed() - else: - task.executed() - - task.postprocess() - self.taskmaster.cleanup() - - -# Trap import failure so that everything in the Job module but the -# Parallel class (and its dependent classes) will work if the interpreter -# doesn't support threads. -try: - import Queue - import threading -except ImportError: - pass -else: - class Worker(threading.Thread): - """A worker thread waits on a task to be posted to its request queue, - dequeues the task, executes it, and posts a tuple including the task - and a boolean indicating whether the task executed successfully. """ - - def __init__(self, requestQueue, resultsQueue, interrupted): - threading.Thread.__init__(self) - self.setDaemon(1) - self.requestQueue = requestQueue - self.resultsQueue = resultsQueue - self.interrupted = interrupted - self.start() - - def run(self): - while 1: - task = self.requestQueue.get() - - if task is None: - # The "None" value is used as a sentinel by - # ThreadPool.cleanup(). This indicates that there - # are no more tasks, so we should quit. - break - - try: - if self.interrupted(): - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - task.execute() - except: - task.exception_set() - ok = False - else: - ok = True - - self.resultsQueue.put((task, ok)) - - class ThreadPool: - """This class is responsible for spawning and managing worker threads.""" - - def __init__(self, num, stack_size, interrupted): - """Create the request and reply queues, and 'num' worker threads. - - One must specify the stack size of the worker threads. The - stack size is specified in kilobytes. - """ - self.requestQueue = Queue.Queue(0) - self.resultsQueue = Queue.Queue(0) - - try: - prev_size = threading.stack_size(stack_size*1024) - except AttributeError, e: - # Only print a warning if the stack size has been - # explicitly set. - if not explicit_stack_size is None: - msg = "Setting stack size is unsupported by this version of Python:\n " + \ - e.args[0] - SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg) - except ValueError, e: - msg = "Setting stack size failed:\n " + str(e) - SCons.Warnings.warn(SCons.Warnings.StackSizeWarning, msg) - - # Create worker threads - self.workers = [] - for _ in range(num): - worker = Worker(self.requestQueue, self.resultsQueue, interrupted) - self.workers.append(worker) - - # Once we drop Python 1.5 we can change the following to: - #if 'prev_size' in locals(): - if 'prev_size' in locals().keys(): - threading.stack_size(prev_size) - - def put(self, task): - """Put task into request queue.""" - self.requestQueue.put(task) - - def get(self): - """Remove and return a result tuple from the results queue.""" - return self.resultsQueue.get() - - def preparation_failed(self, task): - self.resultsQueue.put((task, False)) - - def cleanup(self): - """ - Shuts down the thread pool, giving each worker thread a - chance to shut down gracefully. - """ - # For each worker thread, put a sentinel "None" value - # on the requestQueue (indicating that there's no work - # to be done) so that each worker thread will get one and - # terminate gracefully. - for _ in self.workers: - self.requestQueue.put(None) - - # Wait for all of the workers to terminate. - # - # If we don't do this, later Python versions (2.4, 2.5) often - # seem to raise exceptions during shutdown. This happens - # in requestQueue.get(), as an assertion failure that - # requestQueue.not_full is notified while not acquired, - # seemingly because the main thread has shut down (or is - # in the process of doing so) while the workers are still - # trying to pull sentinels off the requestQueue. - # - # Normally these terminations should happen fairly quickly, - # but we'll stick a one-second timeout on here just in case - # someone gets hung. - for worker in self.workers: - worker.join(1.0) - self.workers = [] - - class Parallel: - """This class is used to execute tasks in parallel, and is somewhat - less efficient than Serial, but is appropriate for parallel builds. - - This class is thread safe. - """ - - def __init__(self, taskmaster, num, stack_size): - """Create a new parallel job given a taskmaster. - - The taskmaster's next_task() method should return the next - task that needs to be executed, or None if there are no more - tasks. The taskmaster's executed() method will be called - for each task when it is successfully executed or failed() - will be called if the task failed to execute (i.e. execute() - raised an exception). - - Note: calls to taskmaster are serialized, but calls to - execute() on distinct tasks are not serialized, because - that is the whole point of parallel jobs: they can execute - multiple tasks simultaneously. """ - - self.taskmaster = taskmaster - self.interrupted = InterruptState() - self.tp = ThreadPool(num, stack_size, self.interrupted) - - self.maxjobs = num - - def start(self): - """Start the job. This will begin pulling tasks from the - taskmaster and executing them, and return when there are no - more tasks. If a task fails to execute (i.e. execute() raises - an exception), then the job will stop.""" - - jobs = 0 - - while 1: - # Start up as many available tasks as we're - # allowed to. - while jobs < self.maxjobs: - task = self.taskmaster.next_task() - if task is None: - break - - try: - # prepare task for execution - task.prepare() - except: - task.exception_set() - task.failed() - task.postprocess() - else: - if task.needs_execute(): - # dispatch task - self.tp.put(task) - jobs = jobs + 1 - else: - task.executed() - task.postprocess() - - if not task and not jobs: break - - # Let any/all completed tasks finish up before we go - # back and put the next batch of tasks on the queue. - while 1: - task, ok = self.tp.get() - jobs = jobs - 1 - - if ok: - task.executed() - else: - if self.interrupted(): - try: - raise SCons.Errors.BuildError( - task.targets[0], errstr=interrupt_msg) - except: - task.exception_set() - - # Let the failed() callback function arrange - # for the build to stop if that's appropriate. - task.failed() - - task.postprocess() - - if self.tp.resultsQueue.empty(): - break - - self.tp.cleanup() - self.taskmaster.cleanup() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Memoize.py b/share/scons-local-1.3.0/SCons/Memoize.py deleted file mode 100644 index 5d9f01c1146e6cd312439febeab6dc1e0d2e7722..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Memoize.py +++ /dev/null @@ -1,292 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Memoize.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Memoizer - -A metaclass implementation to count hits and misses of the computed -values that various methods cache in memory. - -Use of this modules assumes that wrapped methods be coded to cache their -values in a consistent way. Here is an example of wrapping a method -that returns a computed value, with no input parameters: - - memoizer_counters = [] # Memoization - - memoizer_counters.append(SCons.Memoize.CountValue('foo')) # Memoization - - def foo(self): - - try: # Memoization - return self._memo['foo'] # Memoization - except KeyError: # Memoization - pass # Memoization - - result = self.compute_foo_value() - - self._memo['foo'] = result # Memoization - - return result - -Here is an example of wrapping a method that will return different values -based on one or more input arguments: - - def _bar_key(self, argument): # Memoization - return argument # Memoization - - memoizer_counters.append(SCons.Memoize.CountDict('bar', _bar_key)) # Memoization - - def bar(self, argument): - - memo_key = argument # Memoization - try: # Memoization - memo_dict = self._memo['bar'] # Memoization - except KeyError: # Memoization - memo_dict = {} # Memoization - self._memo['dict'] = memo_dict # Memoization - else: # Memoization - try: # Memoization - return memo_dict[memo_key] # Memoization - except KeyError: # Memoization - pass # Memoization - - result = self.compute_bar_value(argument) - - memo_dict[memo_key] = result # Memoization - - return result - -At one point we avoided replicating this sort of logic in all the methods -by putting it right into this module, but we've moved away from that at -present (see the "Historical Note," below.). - -Deciding what to cache is tricky, because different configurations -can have radically different performance tradeoffs, and because the -tradeoffs involved are often so non-obvious. Consequently, deciding -whether or not to cache a given method will likely be more of an art than -a science, but should still be based on available data from this module. -Here are some VERY GENERAL guidelines about deciding whether or not to -cache return values from a method that's being called a lot: - - -- The first question to ask is, "Can we change the calling code - so this method isn't called so often?" Sometimes this can be - done by changing the algorithm. Sometimes the *caller* should - be memoized, not the method you're looking at. - - -- The memoized function should be timed with multiple configurations - to make sure it doesn't inadvertently slow down some other - configuration. - - -- When memoizing values based on a dictionary key composed of - input arguments, you don't need to use all of the arguments - if some of them don't affect the return values. - -Historical Note: The initial Memoizer implementation actually handled -the caching of values for the wrapped methods, based on a set of generic -algorithms for computing hashable values based on the method's arguments. -This collected caching logic nicely, but had two drawbacks: - - Running arguments through a generic key-conversion mechanism is slower - (and less flexible) than just coding these things directly. Since the - methods that need memoized values are generally performance-critical, - slowing them down in order to collect the logic isn't the right - tradeoff. - - Use of the memoizer really obscured what was being called, because - all the memoized methods were wrapped with re-used generic methods. - This made it more difficult, for example, to use the Python profiler - to figure out how to optimize the underlying methods. -""" - -import new - -# A flag controlling whether or not we actually use memoization. -use_memoizer = None - -CounterList = [] - -class Counter: - """ - Base class for counting memoization hits and misses. - - We expect that the metaclass initialization will have filled in - the .name attribute that represents the name of the function - being counted. - """ - def __init__(self, method_name): - """ - """ - self.method_name = method_name - self.hit = 0 - self.miss = 0 - CounterList.append(self) - def display(self): - fmt = " %7d hits %7d misses %s()" - print fmt % (self.hit, self.miss, self.name) - def __cmp__(self, other): - try: - return cmp(self.name, other.name) - except AttributeError: - return 0 - -class CountValue(Counter): - """ - A counter class for simple, atomic memoized values. - - A CountValue object should be instantiated in a class for each of - the class's methods that memoizes its return value by simply storing - the return value in its _memo dictionary. - - We expect that the metaclass initialization will fill in the - .underlying_method attribute with the method that we're wrapping. - We then call the underlying_method method after counting whether - its memoized value has already been set (a hit) or not (a miss). - """ - def __call__(self, *args, **kw): - obj = args[0] - if obj._memo.has_key(self.method_name): - self.hit = self.hit + 1 - else: - self.miss = self.miss + 1 - return apply(self.underlying_method, args, kw) - -class CountDict(Counter): - """ - A counter class for memoized values stored in a dictionary, with - keys based on the method's input arguments. - - A CountDict object is instantiated in a class for each of the - class's methods that memoizes its return value in a dictionary, - indexed by some key that can be computed from one or more of - its input arguments. - - We expect that the metaclass initialization will fill in the - .underlying_method attribute with the method that we're wrapping. - We then call the underlying_method method after counting whether the - computed key value is already present in the memoization dictionary - (a hit) or not (a miss). - """ - def __init__(self, method_name, keymaker): - """ - """ - Counter.__init__(self, method_name) - self.keymaker = keymaker - def __call__(self, *args, **kw): - obj = args[0] - try: - memo_dict = obj._memo[self.method_name] - except KeyError: - self.miss = self.miss + 1 - else: - key = apply(self.keymaker, args, kw) - if memo_dict.has_key(key): - self.hit = self.hit + 1 - else: - self.miss = self.miss + 1 - return apply(self.underlying_method, args, kw) - -class Memoizer: - """Object which performs caching of method calls for its 'primary' - instance.""" - - def __init__(self): - pass - -# Find out if we support metaclasses (Python 2.2 and later). - -class M: - def __init__(cls, name, bases, cls_dict): - cls.use_metaclass = 1 - def fake_method(self): - pass - new.instancemethod(fake_method, None, cls) - -try: - class A: - __metaclass__ = M - - use_metaclass = A.use_metaclass -except AttributeError: - use_metaclass = None - reason = 'no metaclasses' -except TypeError: - use_metaclass = None - reason = 'new.instancemethod() bug' -else: - del A - -del M - -if not use_metaclass: - - def Dump(title): - pass - - try: - class Memoized_Metaclass(type): - # Just a place-holder so pre-metaclass Python versions don't - # have to have special code for the Memoized classes. - pass - except TypeError: - class Memoized_Metaclass: - # A place-holder so pre-metaclass Python versions don't - # have to have special code for the Memoized classes. - pass - - def EnableMemoization(): - import SCons.Warnings - msg = 'memoization is not supported in this version of Python (%s)' - raise SCons.Warnings.NoMetaclassSupportWarning, msg % reason - -else: - - def Dump(title=None): - if title: - print title - CounterList.sort() - for counter in CounterList: - counter.display() - - class Memoized_Metaclass(type): - def __init__(cls, name, bases, cls_dict): - super(Memoized_Metaclass, cls).__init__(name, bases, cls_dict) - - for counter in cls_dict.get('memoizer_counters', []): - method_name = counter.method_name - - counter.name = cls.__name__ + '.' + method_name - counter.underlying_method = cls_dict[method_name] - - replacement_method = new.instancemethod(counter, None, cls) - setattr(cls, method_name, replacement_method) - - def EnableMemoization(): - global use_memoizer - use_memoizer = 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Node/Alias.py b/share/scons-local-1.3.0/SCons/Node/Alias.py deleted file mode 100644 index ff4a47e91a8b8301509bde0d99e9fafbf0b063a3..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Node/Alias.py +++ /dev/null @@ -1,153 +0,0 @@ - -"""scons.Node.Alias - -Alias nodes. - -This creates a hash of global Aliases (dummy targets). - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Node/Alias.py 4720 2010/03/24 03:14:11 jars" - -import string -import UserDict - -import SCons.Errors -import SCons.Node -import SCons.Util - -class AliasNameSpace(UserDict.UserDict): - def Alias(self, name, **kw): - if isinstance(name, SCons.Node.Alias.Alias): - return name - try: - a = self[name] - except KeyError: - a = apply(SCons.Node.Alias.Alias, (name,), kw) - self[name] = a - return a - - def lookup(self, name, **kw): - try: - return self[name] - except KeyError: - return None - -class AliasNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - field_list = ['csig'] - def str_to_node(self, s): - return default_ans.Alias(s) - -class AliasBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -class Alias(SCons.Node.Node): - - NodeInfo = AliasNodeInfo - BuildInfo = AliasBuildInfo - - def __init__(self, name): - SCons.Node.Node.__init__(self) - self.name = name - - def str_for_display(self): - return '"' + self.__str__() + '"' - - def __str__(self): - return self.name - - def make_ready(self): - self.get_csig() - - really_build = SCons.Node.Node.build - is_up_to_date = SCons.Node.Node.children_are_up_to_date - - def is_under(self, dir): - # Make Alias nodes get built regardless of - # what directory scons was run from. Alias nodes - # are outside the filesystem: - return 1 - - def get_contents(self): - """The contents of an alias is the concatenation - of the content signatures of all its sources.""" - childsigs = map(lambda n: n.get_csig(), self.children()) - return string.join(childsigs, '') - - def sconsign(self): - """An Alias is not recorded in .sconsign files""" - pass - - # - # - # - - def changed_since_last_build(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def build(self): - """A "builder" for aliases.""" - pass - - def convert(self): - try: del self.builder - except AttributeError: pass - self.reset_executor() - self.build = self.really_build - - def get_csig(self): - """ - Generate a node's content signature, the digested signature - of its content. - - node - the node - cache - alternate node to use for the signature cache - returns - the content signature - """ - try: - return self.ninfo.csig - except AttributeError: - pass - - contents = self.get_contents() - csig = SCons.Util.MD5signature(contents) - self.get_ninfo().csig = csig - return csig - -default_ans = AliasNameSpace() - -SCons.Node.arg2nodes_lookups.append(default_ans.lookup) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Node/FS.py b/share/scons-local-1.3.0/SCons/Node/FS.py deleted file mode 100644 index 10641e938246fcc916b7f4dc3c2c170f451595f0..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Node/FS.py +++ /dev/null @@ -1,3220 +0,0 @@ -"""scons.Node.FS - -File system nodes. - -These Nodes represent the canonical external objects that people think -of when they think of building software: files and directories. - -This holds a "default_fs" variable that should be initialized with an FS -that can be used by scripts or modules looking for the canonical default. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Node/FS.py 4720 2010/03/24 03:14:11 jars" - -from itertools import izip -import cStringIO -import fnmatch -import os -import os.path -import re -import shutil -import stat -import string -import sys -import time - -try: - import codecs -except ImportError: - pass -else: - # TODO(2.2): Remove when 2.3 becomes the minimal supported version. - try: - codecs.BOM_UTF8 - except AttributeError: - codecs.BOM_UTF8 = '\xef\xbb\xbf' - try: - codecs.BOM_UTF16_LE - codecs.BOM_UTF16_BE - except AttributeError: - codecs.BOM_UTF16_LE = '\xff\xfe' - codecs.BOM_UTF16_BE = '\xfe\xff' - - # Provide a wrapper function to handle decoding differences in - # different versions of Python. Normally, we'd try to do this in the - # compat layer (and maybe it still makes sense to move there?) but - # that doesn't provide a way to supply the string class used in - # pre-2.3 Python versions with a .decode() method that all strings - # naturally have. Plus, the 2.[01] encodings behave differently - # enough that we have to settle for a lowest-common-denominator - # wrapper approach. - # - # Note that the 2.[012] implementations below may be inefficient - # because they perform an explicit look up of the encoding for every - # decode, but they're old enough (and we want to stop supporting - # them soon enough) that it's not worth complicating the interface. - # Think of it as additional incentive for people to upgrade... - try: - ''.decode - except AttributeError: - # 2.0 through 2.2: strings have no .decode() method - try: - codecs.lookup('ascii').decode - except AttributeError: - # 2.0 and 2.1: encodings are a tuple of functions, and the - # decode() function returns a (result, length) tuple. - def my_decode(contents, encoding): - return codecs.lookup(encoding)[1](contents)[0] - else: - # 2.2: encodings are an object with methods, and the - # .decode() method returns just the decoded bytes. - def my_decode(contents, encoding): - return codecs.lookup(encoding).decode(contents) - else: - # 2.3 or later: use the .decode() string method - def my_decode(contents, encoding): - return contents.decode(encoding) - -import SCons.Action -from SCons.Debug import logInstanceCreation -import SCons.Errors -import SCons.Memoize -import SCons.Node -import SCons.Node.Alias -import SCons.Subst -import SCons.Util -import SCons.Warnings - -from SCons.Debug import Trace - -do_store_info = True - - -class EntryProxyAttributeError(AttributeError): - """ - An AttributeError subclass for recording and displaying the name - of the underlying Entry involved in an AttributeError exception. - """ - def __init__(self, entry_proxy, attribute): - AttributeError.__init__(self) - self.entry_proxy = entry_proxy - self.attribute = attribute - def __str__(self): - entry = self.entry_proxy.get() - fmt = "%s instance %s has no attribute %s" - return fmt % (entry.__class__.__name__, - repr(entry.name), - repr(self.attribute)) - -# The max_drift value: by default, use a cached signature value for -# any file that's been untouched for more than two days. -default_max_drift = 2*24*60*60 - -# -# We stringify these file system Nodes a lot. Turning a file system Node -# into a string is non-trivial, because the final string representation -# can depend on a lot of factors: whether it's a derived target or not, -# whether it's linked to a repository or source directory, and whether -# there's duplication going on. The normal technique for optimizing -# calculations like this is to memoize (cache) the string value, so you -# only have to do the calculation once. -# -# A number of the above factors, however, can be set after we've already -# been asked to return a string for a Node, because a Repository() or -# VariantDir() call or the like may not occur until later in SConscript -# files. So this variable controls whether we bother trying to save -# string values for Nodes. The wrapper interface can set this whenever -# they're done mucking with Repository and VariantDir and the other stuff, -# to let this module know it can start returning saved string values -# for Nodes. -# -Save_Strings = None - -def save_strings(val): - global Save_Strings - Save_Strings = val - -# -# Avoid unnecessary function calls by recording a Boolean value that -# tells us whether or not os.path.splitdrive() actually does anything -# on this system, and therefore whether we need to bother calling it -# when looking up path names in various methods below. -# - -do_splitdrive = None - -def initialize_do_splitdrive(): - global do_splitdrive - drive, path = os.path.splitdrive('X:/foo') - do_splitdrive = not not drive - -initialize_do_splitdrive() - -# - -needs_normpath_check = None - -def initialize_normpath_check(): - """ - Initialize the normpath_check regular expression. - - This function is used by the unit tests to re-initialize the pattern - when testing for behavior with different values of os.sep. - """ - global needs_normpath_check - if os.sep == '/': - pattern = r'.*/|\.$|\.\.$' - else: - pattern = r'.*[/%s]|\.$|\.\.$' % re.escape(os.sep) - needs_normpath_check = re.compile(pattern) - -initialize_normpath_check() - -# -# SCons.Action objects for interacting with the outside world. -# -# The Node.FS methods in this module should use these actions to -# create and/or remove files and directories; they should *not* use -# os.{link,symlink,unlink,mkdir}(), etc., directly. -# -# Using these SCons.Action objects ensures that descriptions of these -# external activities are properly displayed, that the displays are -# suppressed when the -s (silent) option is used, and (most importantly) -# the actions are disabled when the the -n option is used, in which case -# there should be *no* changes to the external file system(s)... -# - -if hasattr(os, 'link'): - def _hardlink_func(fs, src, dst): - # If the source is a symlink, we can't just hard-link to it - # because a relative symlink may point somewhere completely - # different. We must disambiguate the symlink and then - # hard-link the final destination file. - while fs.islink(src): - link = fs.readlink(src) - if not os.path.isabs(link): - src = link - else: - src = os.path.join(os.path.dirname(src), link) - fs.link(src, dst) -else: - _hardlink_func = None - -if hasattr(os, 'symlink'): - def _softlink_func(fs, src, dst): - fs.symlink(src, dst) -else: - _softlink_func = None - -def _copy_func(fs, src, dest): - shutil.copy2(src, dest) - st = fs.stat(src) - fs.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - - -Valid_Duplicates = ['hard-soft-copy', 'soft-hard-copy', - 'hard-copy', 'soft-copy', 'copy'] - -Link_Funcs = [] # contains the callables of the specified duplication style - -def set_duplicate(duplicate): - # Fill in the Link_Funcs list according to the argument - # (discarding those not available on the platform). - - # Set up the dictionary that maps the argument names to the - # underlying implementations. We do this inside this function, - # not in the top-level module code, so that we can remap os.link - # and os.symlink for testing purposes. - link_dict = { - 'hard' : _hardlink_func, - 'soft' : _softlink_func, - 'copy' : _copy_func - } - - if not duplicate in Valid_Duplicates: - raise SCons.Errors.InternalError, ("The argument of set_duplicate " - "should be in Valid_Duplicates") - global Link_Funcs - Link_Funcs = [] - for func in string.split(duplicate,'-'): - if link_dict[func]: - Link_Funcs.append(link_dict[func]) - -def LinkFunc(target, source, env): - # Relative paths cause problems with symbolic links, so - # we use absolute paths, which may be a problem for people - # who want to move their soft-linked src-trees around. Those - # people should use the 'hard-copy' mode, softlinks cannot be - # used for that; at least I have no idea how ... - src = source[0].abspath - dest = target[0].abspath - dir, file = os.path.split(dest) - if dir and not target[0].fs.isdir(dir): - os.makedirs(dir) - if not Link_Funcs: - # Set a default order of link functions. - set_duplicate('hard-soft-copy') - fs = source[0].fs - # Now link the files with the previously specified order. - for func in Link_Funcs: - try: - func(fs, src, dest) - break - except (IOError, OSError): - # An OSError indicates something happened like a permissions - # problem or an attempt to symlink across file-system - # boundaries. An IOError indicates something like the file - # not existing. In either case, keeping trying additional - # functions in the list and only raise an error if the last - # one failed. - if func == Link_Funcs[-1]: - # exception of the last link method (copy) are fatal - raise - return 0 - -Link = SCons.Action.Action(LinkFunc, None) -def LocalString(target, source, env): - return 'Local copy of %s from %s' % (target[0], source[0]) - -LocalCopy = SCons.Action.Action(LinkFunc, LocalString) - -def UnlinkFunc(target, source, env): - t = target[0] - t.fs.unlink(t.abspath) - return 0 - -Unlink = SCons.Action.Action(UnlinkFunc, None) - -def MkdirFunc(target, source, env): - t = target[0] - if not t.exists(): - t.fs.mkdir(t.abspath) - return 0 - -Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None) - -MkdirBuilder = None - -def get_MkdirBuilder(): - global MkdirBuilder - if MkdirBuilder is None: - import SCons.Builder - import SCons.Defaults - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - MkdirBuilder = SCons.Builder.Builder(action = Mkdir, - env = None, - explain = None, - is_explicit = None, - target_scanner = SCons.Defaults.DirEntryScanner, - name = "MkdirBuilder") - return MkdirBuilder - -class _Null: - pass - -_null = _Null() - -DefaultSCCSBuilder = None -DefaultRCSBuilder = None - -def get_DefaultSCCSBuilder(): - global DefaultSCCSBuilder - if DefaultSCCSBuilder is None: - import SCons.Builder - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR') - DefaultSCCSBuilder = SCons.Builder.Builder(action = act, - env = None, - name = "DefaultSCCSBuilder") - return DefaultSCCSBuilder - -def get_DefaultRCSBuilder(): - global DefaultRCSBuilder - if DefaultRCSBuilder is None: - import SCons.Builder - # "env" will get filled in by Executor.get_build_env() - # calling SCons.Defaults.DefaultEnvironment() when necessary. - act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR') - DefaultRCSBuilder = SCons.Builder.Builder(action = act, - env = None, - name = "DefaultRCSBuilder") - return DefaultRCSBuilder - -# Cygwin's os.path.normcase pretends it's on a case-sensitive filesystem. -_is_cygwin = sys.platform == "cygwin" -if os.path.normcase("TeSt") == os.path.normpath("TeSt") and not _is_cygwin: - def _my_normcase(x): - return x -else: - def _my_normcase(x): - return string.upper(x) - - - -class DiskChecker: - def __init__(self, type, do, ignore): - self.type = type - self.do = do - self.ignore = ignore - self.set_do() - def set_do(self): - self.__call__ = self.do - def set_ignore(self): - self.__call__ = self.ignore - def set(self, list): - if self.type in list: - self.set_do() - else: - self.set_ignore() - -def do_diskcheck_match(node, predicate, errorfmt): - result = predicate() - try: - # If calling the predicate() cached a None value from stat(), - # remove it so it doesn't interfere with later attempts to - # build this Node as we walk the DAG. (This isn't a great way - # to do this, we're reaching into an interface that doesn't - # really belong to us, but it's all about performance, so - # for now we'll just document the dependency...) - if node._memo['stat'] is None: - del node._memo['stat'] - except (AttributeError, KeyError): - pass - if result: - raise TypeError, errorfmt % node.abspath - -def ignore_diskcheck_match(node, predicate, errorfmt): - pass - -def do_diskcheck_rcs(node, name): - try: - rcs_dir = node.rcs_dir - except AttributeError: - if node.entry_exists_on_disk('RCS'): - rcs_dir = node.Dir('RCS') - else: - rcs_dir = None - node.rcs_dir = rcs_dir - if rcs_dir: - return rcs_dir.entry_exists_on_disk(name+',v') - return None - -def ignore_diskcheck_rcs(node, name): - return None - -def do_diskcheck_sccs(node, name): - try: - sccs_dir = node.sccs_dir - except AttributeError: - if node.entry_exists_on_disk('SCCS'): - sccs_dir = node.Dir('SCCS') - else: - sccs_dir = None - node.sccs_dir = sccs_dir - if sccs_dir: - return sccs_dir.entry_exists_on_disk('s.'+name) - return None - -def ignore_diskcheck_sccs(node, name): - return None - -diskcheck_match = DiskChecker('match', do_diskcheck_match, ignore_diskcheck_match) -diskcheck_rcs = DiskChecker('rcs', do_diskcheck_rcs, ignore_diskcheck_rcs) -diskcheck_sccs = DiskChecker('sccs', do_diskcheck_sccs, ignore_diskcheck_sccs) - -diskcheckers = [ - diskcheck_match, - diskcheck_rcs, - diskcheck_sccs, -] - -def set_diskcheck(list): - for dc in diskcheckers: - dc.set(list) - -def diskcheck_types(): - return map(lambda dc: dc.type, diskcheckers) - - - -class EntryProxy(SCons.Util.Proxy): - def __get_abspath(self): - entry = self.get() - return SCons.Subst.SpecialAttrWrapper(entry.get_abspath(), - entry.name + "_abspath") - - def __get_filebase(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[0], - name + "_filebase") - - def __get_suffix(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(name)[1], - name + "_suffix") - - def __get_file(self): - name = self.get().name - return SCons.Subst.SpecialAttrWrapper(name, name + "_file") - - def __get_base_path(self): - """Return the file's directory and file name, with the - suffix stripped.""" - entry = self.get() - return SCons.Subst.SpecialAttrWrapper(SCons.Util.splitext(entry.get_path())[0], - entry.name + "_base") - - def __get_posix_path(self): - """Return the path with / as the path separator, - regardless of platform.""" - if os.sep == '/': - return self - else: - entry = self.get() - r = string.replace(entry.get_path(), os.sep, '/') - return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_posix") - - def __get_windows_path(self): - """Return the path with \ as the path separator, - regardless of platform.""" - if os.sep == '\\': - return self - else: - entry = self.get() - r = string.replace(entry.get_path(), os.sep, '\\') - return SCons.Subst.SpecialAttrWrapper(r, entry.name + "_windows") - - def __get_srcnode(self): - return EntryProxy(self.get().srcnode()) - - def __get_srcdir(self): - """Returns the directory containing the source node linked to this - node via VariantDir(), or the directory of this node if not linked.""" - return EntryProxy(self.get().srcnode().dir) - - def __get_rsrcnode(self): - return EntryProxy(self.get().srcnode().rfile()) - - def __get_rsrcdir(self): - """Returns the directory containing the source node linked to this - node via VariantDir(), or the directory of this node if not linked.""" - return EntryProxy(self.get().srcnode().rfile().dir) - - def __get_dir(self): - return EntryProxy(self.get().dir) - - dictSpecialAttrs = { "base" : __get_base_path, - "posix" : __get_posix_path, - "windows" : __get_windows_path, - "win32" : __get_windows_path, - "srcpath" : __get_srcnode, - "srcdir" : __get_srcdir, - "dir" : __get_dir, - "abspath" : __get_abspath, - "filebase" : __get_filebase, - "suffix" : __get_suffix, - "file" : __get_file, - "rsrcpath" : __get_rsrcnode, - "rsrcdir" : __get_rsrcdir, - } - - def __getattr__(self, name): - # This is how we implement the "special" attributes - # such as base, posix, srcdir, etc. - try: - attr_function = self.dictSpecialAttrs[name] - except KeyError: - try: - attr = SCons.Util.Proxy.__getattr__(self, name) - except AttributeError, e: - # Raise our own AttributeError subclass with an - # overridden __str__() method that identifies the - # name of the entry that caused the exception. - raise EntryProxyAttributeError(self, name) - return attr - else: - return attr_function(self) - -class Base(SCons.Node.Node): - """A generic class for file system entries. This class is for - when we don't know yet whether the entry being looked up is a file - or a directory. Instances of this class can morph into either - Dir or File objects by a later, more precise lookup. - - Note: this class does not define __cmp__ and __hash__ for - efficiency reasons. SCons does a lot of comparing of - Node.FS.{Base,Entry,File,Dir} objects, so those operations must be - as fast as possible, which means we want to use Python's built-in - object identity comparisons. - """ - - memoizer_counters = [] - - def __init__(self, name, directory, fs): - """Initialize a generic Node.FS.Base object. - - Call the superclass initialization, take care of setting up - our relative and absolute paths, identify our parent - directory, and indicate that this node should use - signatures.""" - if __debug__: logInstanceCreation(self, 'Node.FS.Base') - SCons.Node.Node.__init__(self) - - # Filenames and paths are probably reused and are intern'ed to - # save some memory. - self.name = SCons.Util.silent_intern(name) - self.suffix = SCons.Util.silent_intern(SCons.Util.splitext(name)[1]) - self.fs = fs - - assert directory, "A directory must be provided" - - self.abspath = SCons.Util.silent_intern(directory.entry_abspath(name)) - self.labspath = SCons.Util.silent_intern(directory.entry_labspath(name)) - if directory.path == '.': - self.path = SCons.Util.silent_intern(name) - else: - self.path = SCons.Util.silent_intern(directory.entry_path(name)) - if directory.tpath == '.': - self.tpath = SCons.Util.silent_intern(name) - else: - self.tpath = SCons.Util.silent_intern(directory.entry_tpath(name)) - self.path_elements = directory.path_elements + [self] - - self.dir = directory - self.cwd = None # will hold the SConscript directory for target nodes - self.duplicate = directory.duplicate - - def str_for_display(self): - return '"' + self.__str__() + '"' - - def must_be_same(self, klass): - """ - This node, which already existed, is being looked up as the - specified klass. Raise an exception if it isn't. - """ - if isinstance(self, klass) or klass is Entry: - return - raise TypeError, "Tried to lookup %s '%s' as a %s." %\ - (self.__class__.__name__, self.path, klass.__name__) - - def get_dir(self): - return self.dir - - def get_suffix(self): - return self.suffix - - def rfile(self): - return self - - def __str__(self): - """A Node.FS.Base object's string representation is its path - name.""" - global Save_Strings - if Save_Strings: - return self._save_str() - return self._get_str() - - memoizer_counters.append(SCons.Memoize.CountValue('_save_str')) - - def _save_str(self): - try: - return self._memo['_save_str'] - except KeyError: - pass - result = intern(self._get_str()) - self._memo['_save_str'] = result - return result - - def _get_str(self): - global Save_Strings - if self.duplicate or self.is_derived(): - return self.get_path() - srcnode = self.srcnode() - if srcnode.stat() is None and self.stat() is not None: - result = self.get_path() - else: - result = srcnode.get_path() - if not Save_Strings: - # We're not at the point where we're saving the string string - # representations of FS Nodes (because we haven't finished - # reading the SConscript files and need to have str() return - # things relative to them). That also means we can't yet - # cache values returned (or not returned) by stat(), since - # Python code in the SConscript files might still create - # or otherwise affect the on-disk file. So get rid of the - # values that the underlying stat() method saved. - try: del self._memo['stat'] - except KeyError: pass - if self is not srcnode: - try: del srcnode._memo['stat'] - except KeyError: pass - return result - - rstr = __str__ - - memoizer_counters.append(SCons.Memoize.CountValue('stat')) - - def stat(self): - try: return self._memo['stat'] - except KeyError: pass - try: result = self.fs.stat(self.abspath) - except os.error: result = None - self._memo['stat'] = result - return result - - def exists(self): - return self.stat() is not None - - def rexists(self): - return self.rfile().exists() - - def getmtime(self): - st = self.stat() - if st: return st[stat.ST_MTIME] - else: return None - - def getsize(self): - st = self.stat() - if st: return st[stat.ST_SIZE] - else: return None - - def isdir(self): - st = self.stat() - return st is not None and stat.S_ISDIR(st[stat.ST_MODE]) - - def isfile(self): - st = self.stat() - return st is not None and stat.S_ISREG(st[stat.ST_MODE]) - - if hasattr(os, 'symlink'): - def islink(self): - try: st = self.fs.lstat(self.abspath) - except os.error: return 0 - return stat.S_ISLNK(st[stat.ST_MODE]) - else: - def islink(self): - return 0 # no symlinks - - def is_under(self, dir): - if self is dir: - return 1 - else: - return self.dir.is_under(dir) - - def set_local(self): - self._local = 1 - - def srcnode(self): - """If this node is in a build path, return the node - corresponding to its source file. Otherwise, return - ourself. - """ - srcdir_list = self.dir.srcdir_list() - if srcdir_list: - srcnode = srcdir_list[0].Entry(self.name) - srcnode.must_be_same(self.__class__) - return srcnode - return self - - def get_path(self, dir=None): - """Return path relative to the current working directory of the - Node.FS.Base object that owns us.""" - if not dir: - dir = self.fs.getcwd() - if self == dir: - return '.' - path_elems = self.path_elements - try: i = path_elems.index(dir) - except ValueError: pass - else: path_elems = path_elems[i+1:] - path_elems = map(lambda n: n.name, path_elems) - return string.join(path_elems, os.sep) - - def set_src_builder(self, builder): - """Set the source code builder for this node.""" - self.sbuilder = builder - if not self.has_builder(): - self.builder_set(builder) - - def src_builder(self): - """Fetch the source code builder for this node. - - If there isn't one, we cache the source code builder specified - for the directory (which in turn will cache the value from its - parent directory, and so on up to the file system root). - """ - try: - scb = self.sbuilder - except AttributeError: - scb = self.dir.src_builder() - self.sbuilder = scb - return scb - - def get_abspath(self): - """Get the absolute path of the file.""" - return self.abspath - - def for_signature(self): - # Return just our name. Even an absolute path would not work, - # because that can change thanks to symlinks or remapped network - # paths. - return self.name - - def get_subst_proxy(self): - try: - return self._proxy - except AttributeError: - ret = EntryProxy(self) - self._proxy = ret - return ret - - def target_from_source(self, prefix, suffix, splitext=SCons.Util.splitext): - """ - - Generates a target entry that corresponds to this entry (usually - a source file) with the specified prefix and suffix. - - Note that this method can be overridden dynamically for generated - files that need different behavior. See Tool/swig.py for - an example. - """ - return self.dir.Entry(prefix + splitext(self.name)[0] + suffix) - - def _Rfindalldirs_key(self, pathlist): - return pathlist - - memoizer_counters.append(SCons.Memoize.CountDict('Rfindalldirs', _Rfindalldirs_key)) - - def Rfindalldirs(self, pathlist): - """ - Return all of the directories for a given path list, including - corresponding "backing" directories in any repositories. - - The Node lookups are relative to this Node (typically a - directory), so memoizing result saves cycles from looking - up the same path for each target in a given directory. - """ - try: - memo_dict = self._memo['Rfindalldirs'] - except KeyError: - memo_dict = {} - self._memo['Rfindalldirs'] = memo_dict - else: - try: - return memo_dict[pathlist] - except KeyError: - pass - - create_dir_relative_to_self = self.Dir - result = [] - for path in pathlist: - if isinstance(path, SCons.Node.Node): - result.append(path) - else: - dir = create_dir_relative_to_self(path) - result.extend(dir.get_all_rdirs()) - - memo_dict[pathlist] = result - - return result - - def RDirs(self, pathlist): - """Search for a list of directories in the Repository list.""" - cwd = self.cwd or self.fs._cwd - return cwd.Rfindalldirs(pathlist) - - memoizer_counters.append(SCons.Memoize.CountValue('rentry')) - - def rentry(self): - try: - return self._memo['rentry'] - except KeyError: - pass - result = self - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: - node = dir.entries[norm_name] - except KeyError: - if dir.entry_exists_on_disk(self.name): - result = dir.Entry(self.name) - break - self._memo['rentry'] = result - return result - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - return [] - -class Entry(Base): - """This is the class for generic Node.FS entries--that is, things - that could be a File or a Dir, but we're just not sure yet. - Consequently, the methods in this class really exist just to - transform their associated object into the right class when the - time comes, and then call the same-named method in the transformed - class.""" - - def diskcheck_match(self): - pass - - def disambiguate(self, must_exist=None): - """ - """ - if self.isdir(): - self.__class__ = Dir - self._morph() - elif self.isfile(): - self.__class__ = File - self._morph() - self.clear() - else: - # There was nothing on-disk at this location, so look in - # the src directory. - # - # We can't just use self.srcnode() straight away because - # that would create an actual Node for this file in the src - # directory, and there might not be one. Instead, use the - # dir_on_disk() method to see if there's something on-disk - # with that name, in which case we can go ahead and call - # self.srcnode() to create the right type of entry. - srcdir = self.dir.srcnode() - if srcdir != self.dir and \ - srcdir.entry_exists_on_disk(self.name) and \ - self.srcnode().isdir(): - self.__class__ = Dir - self._morph() - elif must_exist: - msg = "No such file or directory: '%s'" % self.abspath - raise SCons.Errors.UserError, msg - else: - self.__class__ = File - self._morph() - self.clear() - return self - - def rfile(self): - """We're a generic Entry, but the caller is actually looking for - a File at this point, so morph into one.""" - self.__class__ = File - self._morph() - self.clear() - return File.rfile(self) - - def scanner_key(self): - return self.get_suffix() - - def get_contents(self): - """Fetch the contents of the entry. Returns the exact binary - contents of the file.""" - try: - self = self.disambiguate(must_exist=1) - except SCons.Errors.UserError: - # There was nothing on disk with which to disambiguate - # this entry. Leave it as an Entry, but return a null - # string so calls to get_contents() in emitters and the - # like (e.g. in qt.py) don't have to disambiguate by hand - # or catch the exception. - return '' - else: - return self.get_contents() - - def get_text_contents(self): - """Fetch the decoded text contents of a Unicode encoded Entry. - - Since this should return the text contents from the file - system, we check to see into what sort of subclass we should - morph this Entry.""" - try: - self = self.disambiguate(must_exist=1) - except SCons.Errors.UserError: - # There was nothing on disk with which to disambiguate - # this entry. Leave it as an Entry, but return a null - # string so calls to get_text_contents() in emitters and - # the like (e.g. in qt.py) don't have to disambiguate by - # hand or catch the exception. - return '' - else: - return self.get_text_contents() - - def must_be_same(self, klass): - """Called to make sure a Node is a Dir. Since we're an - Entry, we can morph into one.""" - if self.__class__ is not klass: - self.__class__ = klass - self._morph() - self.clear() - - # The following methods can get called before the Taskmaster has - # had a chance to call disambiguate() directly to see if this Entry - # should really be a Dir or a File. We therefore use these to call - # disambiguate() transparently (from our caller's point of view). - # - # Right now, this minimal set of methods has been derived by just - # looking at some of the methods that will obviously be called early - # in any of the various Taskmasters' calling sequences, and then - # empirically figuring out which additional methods are necessary - # to make various tests pass. - - def exists(self): - """Return if the Entry exists. Check the file system to see - what we should turn into first. Assume a file if there's no - directory.""" - return self.disambiguate().exists() - - def rel_path(self, other): - d = self.disambiguate() - if d.__class__ is Entry: - raise "rel_path() could not disambiguate File/Dir" - return d.rel_path(other) - - def new_ninfo(self): - return self.disambiguate().new_ninfo() - - def changed_since_last_build(self, target, prev_ni): - return self.disambiguate().changed_since_last_build(target, prev_ni) - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - return self.disambiguate()._glob1(pattern, ondisk, source, strings) - - def get_subst_proxy(self): - return self.disambiguate().get_subst_proxy() - -# This is for later so we can differentiate between Entry the class and Entry -# the method of the FS class. -_classEntry = Entry - - -class LocalFS: - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - # This class implements an abstraction layer for operations involving - # a local file system. Essentially, this wraps any function in - # the os, os.path or shutil modules that we use to actually go do - # anything with or to the local file system. - # - # Note that there's a very good chance we'll refactor this part of - # the architecture in some way as we really implement the interface(s) - # for remote file system Nodes. For example, the right architecture - # might be to have this be a subclass instead of a base class. - # Nevertheless, we're using this as a first step in that direction. - # - # We're not using chdir() yet because the calling subclass method - # needs to use os.chdir() directly to avoid recursion. Will we - # really need this one? - #def chdir(self, path): - # return os.chdir(path) - def chmod(self, path, mode): - return os.chmod(path, mode) - def copy(self, src, dst): - return shutil.copy(src, dst) - def copy2(self, src, dst): - return shutil.copy2(src, dst) - def exists(self, path): - return os.path.exists(path) - def getmtime(self, path): - return os.path.getmtime(path) - def getsize(self, path): - return os.path.getsize(path) - def isdir(self, path): - return os.path.isdir(path) - def isfile(self, path): - return os.path.isfile(path) - def link(self, src, dst): - return os.link(src, dst) - def lstat(self, path): - return os.lstat(path) - def listdir(self, path): - return os.listdir(path) - def makedirs(self, path): - return os.makedirs(path) - def mkdir(self, path): - return os.mkdir(path) - def rename(self, old, new): - return os.rename(old, new) - def stat(self, path): - return os.stat(path) - def symlink(self, src, dst): - return os.symlink(src, dst) - def open(self, path): - return open(path) - def unlink(self, path): - return os.unlink(path) - - if hasattr(os, 'symlink'): - def islink(self, path): - return os.path.islink(path) - else: - def islink(self, path): - return 0 # no symlinks - - if hasattr(os, 'readlink'): - def readlink(self, file): - return os.readlink(file) - else: - def readlink(self, file): - return '' - - -#class RemoteFS: -# # Skeleton for the obvious methods we might need from the -# # abstraction layer for a remote filesystem. -# def upload(self, local_src, remote_dst): -# pass -# def download(self, remote_src, local_dst): -# pass - - -class FS(LocalFS): - - memoizer_counters = [] - - def __init__(self, path = None): - """Initialize the Node.FS subsystem. - - The supplied path is the top of the source tree, where we - expect to find the top-level build file. If no path is - supplied, the current directory is the default. - - The path argument must be a valid absolute path. - """ - if __debug__: logInstanceCreation(self, 'Node.FS') - - self._memo = {} - - self.Root = {} - self.SConstruct_dir = None - self.max_drift = default_max_drift - - self.Top = None - if path is None: - self.pathTop = os.getcwd() - else: - self.pathTop = path - self.defaultDrive = _my_normcase(os.path.splitdrive(self.pathTop)[0]) - - self.Top = self.Dir(self.pathTop) - self.Top.path = '.' - self.Top.tpath = '.' - self._cwd = self.Top - - DirNodeInfo.fs = self - FileNodeInfo.fs = self - - def set_SConstruct_dir(self, dir): - self.SConstruct_dir = dir - - def get_max_drift(self): - return self.max_drift - - def set_max_drift(self, max_drift): - self.max_drift = max_drift - - def getcwd(self): - return self._cwd - - def chdir(self, dir, change_os_dir=0): - """Change the current working directory for lookups. - If change_os_dir is true, we will also change the "real" cwd - to match. - """ - curr=self._cwd - try: - if dir is not None: - self._cwd = dir - if change_os_dir: - os.chdir(dir.abspath) - except OSError: - self._cwd = curr - raise - - def get_root(self, drive): - """ - Returns the root directory for the specified drive, creating - it if necessary. - """ - drive = _my_normcase(drive) - try: - return self.Root[drive] - except KeyError: - root = RootDir(drive, self) - self.Root[drive] = root - if not drive: - self.Root[self.defaultDrive] = root - elif drive == self.defaultDrive: - self.Root[''] = root - return root - - def _lookup(self, p, directory, fsclass, create=1): - """ - The generic entry point for Node lookup with user-supplied data. - - This translates arbitrary input into a canonical Node.FS object - of the specified fsclass. The general approach for strings is - to turn it into a fully normalized absolute path and then call - the root directory's lookup_abs() method for the heavy lifting. - - If the path name begins with '#', it is unconditionally - interpreted relative to the top-level directory of this FS. '#' - is treated as a synonym for the top-level SConstruct directory, - much like '~' is treated as a synonym for the user's home - directory in a UNIX shell. So both '#foo' and '#/foo' refer - to the 'foo' subdirectory underneath the top-level SConstruct - directory. - - If the path name is relative, then the path is looked up relative - to the specified directory, or the current directory (self._cwd, - typically the SConscript directory) if the specified directory - is None. - """ - if isinstance(p, Base): - # It's already a Node.FS object. Make sure it's the right - # class and return. - p.must_be_same(fsclass) - return p - # str(p) in case it's something like a proxy object - p = str(p) - - initial_hash = (p[0:1] == '#') - if initial_hash: - # There was an initial '#', so we strip it and override - # whatever directory they may have specified with the - # top-level SConstruct directory. - p = p[1:] - directory = self.Top - - if directory and not isinstance(directory, Dir): - directory = self.Dir(directory) - - if do_splitdrive: - drive, p = os.path.splitdrive(p) - else: - drive = '' - if drive and not p: - # This causes a naked drive letter to be treated as a synonym - # for the root directory on that drive. - p = os.sep - absolute = os.path.isabs(p) - - needs_normpath = needs_normpath_check.match(p) - - if initial_hash or not absolute: - # This is a relative lookup, either to the top-level - # SConstruct directory (because of the initial '#') or to - # the current directory (the path name is not absolute). - # Add the string to the appropriate directory lookup path, - # after which the whole thing gets normalized. - if not directory: - directory = self._cwd - if p: - p = directory.labspath + '/' + p - else: - p = directory.labspath - - if needs_normpath: - p = os.path.normpath(p) - - if drive or absolute: - root = self.get_root(drive) - else: - if not directory: - directory = self._cwd - root = directory.root - - if os.sep != '/': - p = string.replace(p, os.sep, '/') - return root._lookup_abs(p, fsclass, create) - - def Entry(self, name, directory = None, create = 1): - """Look up or create a generic Entry node with the specified name. - If the name is a relative path (begins with ./, ../, or a file - name), then it is looked up relative to the supplied directory - node, or to the top level directory of the FS (supplied at - construction time) if no directory is supplied. - """ - return self._lookup(name, directory, Entry, create) - - def File(self, name, directory = None, create = 1): - """Look up or create a File node with the specified name. If - the name is a relative path (begins with ./, ../, or a file name), - then it is looked up relative to the supplied directory node, - or to the top level directory of the FS (supplied at construction - time) if no directory is supplied. - - This method will raise TypeError if a directory is found at the - specified path. - """ - return self._lookup(name, directory, File, create) - - def Dir(self, name, directory = None, create = True): - """Look up or create a Dir node with the specified name. If - the name is a relative path (begins with ./, ../, or a file name), - then it is looked up relative to the supplied directory node, - or to the top level directory of the FS (supplied at construction - time) if no directory is supplied. - - This method will raise TypeError if a normal file is found at the - specified path. - """ - return self._lookup(name, directory, Dir, create) - - def VariantDir(self, variant_dir, src_dir, duplicate=1): - """Link the supplied variant directory to the source directory - for purposes of building files.""" - - if not isinstance(src_dir, SCons.Node.Node): - src_dir = self.Dir(src_dir) - if not isinstance(variant_dir, SCons.Node.Node): - variant_dir = self.Dir(variant_dir) - if src_dir.is_under(variant_dir): - raise SCons.Errors.UserError, "Source directory cannot be under variant directory." - if variant_dir.srcdir: - if variant_dir.srcdir == src_dir: - return # We already did this. - raise SCons.Errors.UserError, "'%s' already has a source directory: '%s'."%(variant_dir, variant_dir.srcdir) - variant_dir.link(src_dir, duplicate) - - def Repository(self, *dirs): - """Specify Repository directories to search.""" - for d in dirs: - if not isinstance(d, SCons.Node.Node): - d = self.Dir(d) - self.Top.addRepository(d) - - def variant_dir_target_climb(self, orig, dir, tail): - """Create targets in corresponding variant directories - - Climb the directory tree, and look up path names - relative to any linked variant directories we find. - - Even though this loops and walks up the tree, we don't memoize - the return value because this is really only used to process - the command-line targets. - """ - targets = [] - message = None - fmt = "building associated VariantDir targets: %s" - start_dir = dir - while dir: - for bd in dir.variant_dirs: - if start_dir.is_under(bd): - # If already in the build-dir location, don't reflect - return [orig], fmt % str(orig) - p = apply(os.path.join, [bd.path] + tail) - targets.append(self.Entry(p)) - tail = [dir.name] + tail - dir = dir.up() - if targets: - message = fmt % string.join(map(str, targets)) - return targets, message - - def Glob(self, pathname, ondisk=True, source=True, strings=False, cwd=None): - """ - Globs - - This is mainly a shim layer - """ - if cwd is None: - cwd = self.getcwd() - return cwd.glob(pathname, ondisk, source, strings) - -class DirNodeInfo(SCons.Node.NodeInfoBase): - # This should get reset by the FS initialization. - current_version_id = 1 - - fs = None - - def str_to_node(self, s): - top = self.fs.Top - root = top.root - if do_splitdrive: - drive, s = os.path.splitdrive(s) - if drive: - root = self.fs.get_root(drive) - if not os.path.isabs(s): - s = top.labspath + '/' + s - return root._lookup_abs(s, Entry) - -class DirBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -glob_magic_check = re.compile('[*?[]') - -def has_glob_magic(s): - return glob_magic_check.search(s) is not None - -class Dir(Base): - """A class for directories in a file system. - """ - - memoizer_counters = [] - - NodeInfo = DirNodeInfo - BuildInfo = DirBuildInfo - - def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.Dir') - Base.__init__(self, name, directory, fs) - self._morph() - - def _morph(self): - """Turn a file system Node (either a freshly initialized directory - object or a separate Entry object) into a proper directory object. - - Set up this directory's entries and hook it into the file - system tree. Specify that directories (this Node) don't use - signatures for calculating whether they're current. - """ - - self.repositories = [] - self.srcdir = None - - self.entries = {} - self.entries['.'] = self - self.entries['..'] = self.dir - self.cwd = self - self.searched = 0 - self._sconsign = None - self.variant_dirs = [] - self.root = self.dir.root - - # Don't just reset the executor, replace its action list, - # because it might have some pre-or post-actions that need to - # be preserved. - self.builder = get_MkdirBuilder() - self.get_executor().set_action_list(self.builder.action) - - def diskcheck_match(self): - diskcheck_match(self, self.isfile, - "File %s found where directory expected.") - - def __clearRepositoryCache(self, duplicate=None): - """Called when we change the repository(ies) for a directory. - This clears any cached information that is invalidated by changing - the repository.""" - - for node in self.entries.values(): - if node != self.dir: - if node != self and isinstance(node, Dir): - node.__clearRepositoryCache(duplicate) - else: - node.clear() - try: - del node._srcreps - except AttributeError: - pass - if duplicate is not None: - node.duplicate=duplicate - - def __resetDuplicate(self, node): - if node != self: - node.duplicate = node.get_dir().duplicate - - def Entry(self, name): - """ - Looks up or creates an entry node named 'name' relative to - this directory. - """ - return self.fs.Entry(name, self) - - def Dir(self, name, create=True): - """ - Looks up or creates a directory node named 'name' relative to - this directory. - """ - return self.fs.Dir(name, self, create) - - def File(self, name): - """ - Looks up or creates a file node named 'name' relative to - this directory. - """ - return self.fs.File(name, self) - - def _lookup_rel(self, name, klass, create=1): - """ - Looks up a *normalized* relative path name, relative to this - directory. - - This method is intended for use by internal lookups with - already-normalized path data. For general-purpose lookups, - use the Entry(), Dir() and File() methods above. - - This method does *no* input checking and will die or give - incorrect results if it's passed a non-normalized path name (e.g., - a path containing '..'), an absolute path name, a top-relative - ('#foo') path name, or any kind of object. - """ - name = self.entry_labspath(name) - return self.root._lookup_abs(name, klass, create) - - def link(self, srcdir, duplicate): - """Set this directory as the variant directory for the - supplied source directory.""" - self.srcdir = srcdir - self.duplicate = duplicate - self.__clearRepositoryCache(duplicate) - srcdir.variant_dirs.append(self) - - def getRepositories(self): - """Returns a list of repositories for this directory. - """ - if self.srcdir and not self.duplicate: - return self.srcdir.get_all_rdirs() + self.repositories - return self.repositories - - memoizer_counters.append(SCons.Memoize.CountValue('get_all_rdirs')) - - def get_all_rdirs(self): - try: - return list(self._memo['get_all_rdirs']) - except KeyError: - pass - - result = [self] - fname = '.' - dir = self - while dir: - for rep in dir.getRepositories(): - result.append(rep.Dir(fname)) - if fname == '.': - fname = dir.name - else: - fname = dir.name + os.sep + fname - dir = dir.up() - - self._memo['get_all_rdirs'] = list(result) - - return result - - def addRepository(self, dir): - if dir != self and not dir in self.repositories: - self.repositories.append(dir) - dir.tpath = '.' - self.__clearRepositoryCache() - - def up(self): - return self.entries['..'] - - def _rel_path_key(self, other): - return str(other) - - memoizer_counters.append(SCons.Memoize.CountDict('rel_path', _rel_path_key)) - - def rel_path(self, other): - """Return a path to "other" relative to this directory. - """ - - # This complicated and expensive method, which constructs relative - # paths between arbitrary Node.FS objects, is no longer used - # by SCons itself. It was introduced to store dependency paths - # in .sconsign files relative to the target, but that ended up - # being significantly inefficient. - # - # We're continuing to support the method because some SConstruct - # files out there started using it when it was available, and - # we're all about backwards compatibility.. - - try: - memo_dict = self._memo['rel_path'] - except KeyError: - memo_dict = {} - self._memo['rel_path'] = memo_dict - else: - try: - return memo_dict[other] - except KeyError: - pass - - if self is other: - result = '.' - - elif not other in self.path_elements: - try: - other_dir = other.get_dir() - except AttributeError: - result = str(other) - else: - if other_dir is None: - result = other.name - else: - dir_rel_path = self.rel_path(other_dir) - if dir_rel_path == '.': - result = other.name - else: - result = dir_rel_path + os.sep + other.name - else: - i = self.path_elements.index(other) + 1 - - path_elems = ['..'] * (len(self.path_elements) - i) \ - + map(lambda n: n.name, other.path_elements[i:]) - - result = string.join(path_elems, os.sep) - - memo_dict[other] = result - - return result - - def get_env_scanner(self, env, kw={}): - import SCons.Defaults - return SCons.Defaults.DirEntryScanner - - def get_target_scanner(self): - import SCons.Defaults - return SCons.Defaults.DirEntryScanner - - def get_found_includes(self, env, scanner, path): - """Return this directory's implicit dependencies. - - We don't bother caching the results because the scan typically - shouldn't be requested more than once (as opposed to scanning - .h file contents, which can be requested as many times as the - files is #included by other files). - """ - if not scanner: - return [] - # Clear cached info for this Dir. If we already visited this - # directory on our walk down the tree (because we didn't know at - # that point it was being used as the source for another Node) - # then we may have calculated build signature before realizing - # we had to scan the disk. Now that we have to, though, we need - # to invalidate the old calculated signature so that any node - # dependent on our directory structure gets one that includes - # info about everything on disk. - self.clear() - return scanner(self, env, path) - - # - # Taskmaster interface subsystem - # - - def prepare(self): - pass - - def build(self, **kw): - """A null "builder" for directories.""" - global MkdirBuilder - if self.builder is not MkdirBuilder: - apply(SCons.Node.Node.build, [self,], kw) - - # - # - # - - def _create(self): - """Create this directory, silently and without worrying about - whether the builder is the default or not.""" - listDirs = [] - parent = self - while parent: - if parent.exists(): - break - listDirs.append(parent) - p = parent.up() - if p is None: - # Don't use while: - else: for this condition because - # if so, then parent is None and has no .path attribute. - raise SCons.Errors.StopError, parent.path - parent = p - listDirs.reverse() - for dirnode in listDirs: - try: - # Don't call dirnode.build(), call the base Node method - # directly because we definitely *must* create this - # directory. The dirnode.build() method will suppress - # the build if it's the default builder. - SCons.Node.Node.build(dirnode) - dirnode.get_executor().nullify() - # The build() action may or may not have actually - # created the directory, depending on whether the -n - # option was used or not. Delete the _exists and - # _rexists attributes so they can be reevaluated. - dirnode.clear() - except OSError: - pass - - def multiple_side_effect_has_builder(self): - global MkdirBuilder - return self.builder is not MkdirBuilder and self.has_builder() - - def alter_targets(self): - """Return any corresponding targets in a variant directory. - """ - return self.fs.variant_dir_target_climb(self, self, []) - - def scanner_key(self): - """A directory does not get scanned.""" - return None - - def get_text_contents(self): - """We already emit things in text, so just return the binary - version.""" - return self.get_contents() - - def get_contents(self): - """Return content signatures and names of all our children - separated by new-lines. Ensure that the nodes are sorted.""" - contents = [] - name_cmp = lambda a, b: cmp(a.name, b.name) - sorted_children = self.children()[:] - sorted_children.sort(name_cmp) - for node in sorted_children: - contents.append('%s %s\n' % (node.get_csig(), node.name)) - return string.join(contents, '') - - def get_csig(self): - """Compute the content signature for Directory nodes. In - general, this is not needed and the content signature is not - stored in the DirNodeInfo. However, if get_contents on a Dir - node is called which has a child directory, the child - directory should return the hash of its contents.""" - contents = self.get_contents() - return SCons.Util.MD5signature(contents) - - def do_duplicate(self, src): - pass - - changed_since_last_build = SCons.Node.Node.state_has_changed - - def is_up_to_date(self): - """If any child is not up-to-date, then this directory isn't, - either.""" - if self.builder is not MkdirBuilder and not self.exists(): - return 0 - up_to_date = SCons.Node.up_to_date - for kid in self.children(): - if kid.get_state() > up_to_date: - return 0 - return 1 - - def rdir(self): - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: node = dir.entries[norm_name] - except KeyError: node = dir.dir_on_disk(self.name) - if node and node.exists() and \ - (isinstance(dir, Dir) or isinstance(dir, Entry)): - return node - return self - - def sconsign(self): - """Return the .sconsign file info for this directory, - creating it first if necessary.""" - if not self._sconsign: - import SCons.SConsign - self._sconsign = SCons.SConsign.ForDirectory(self) - return self._sconsign - - def srcnode(self): - """Dir has a special need for srcnode()...if we - have a srcdir attribute set, then that *is* our srcnode.""" - if self.srcdir: - return self.srcdir - return Base.srcnode(self) - - def get_timestamp(self): - """Return the latest timestamp from among our children""" - stamp = 0 - for kid in self.children(): - if kid.get_timestamp() > stamp: - stamp = kid.get_timestamp() - return stamp - - def entry_abspath(self, name): - return self.abspath + os.sep + name - - def entry_labspath(self, name): - return self.labspath + '/' + name - - def entry_path(self, name): - return self.path + os.sep + name - - def entry_tpath(self, name): - return self.tpath + os.sep + name - - def entry_exists_on_disk(self, name): - try: - d = self.on_disk_entries - except AttributeError: - d = {} - try: - entries = os.listdir(self.abspath) - except OSError: - pass - else: - for entry in map(_my_normcase, entries): - d[entry] = True - self.on_disk_entries = d - if sys.platform == 'win32': - name = _my_normcase(name) - result = d.get(name) - if result is None: - # Belt-and-suspenders for Windows: check directly for - # 8.3 file names that don't show up in os.listdir(). - result = os.path.exists(self.abspath + os.sep + name) - d[name] = result - return result - else: - return d.has_key(name) - - memoizer_counters.append(SCons.Memoize.CountValue('srcdir_list')) - - def srcdir_list(self): - try: - return self._memo['srcdir_list'] - except KeyError: - pass - - result = [] - - dirname = '.' - dir = self - while dir: - if dir.srcdir: - result.append(dir.srcdir.Dir(dirname)) - dirname = dir.name + os.sep + dirname - dir = dir.up() - - self._memo['srcdir_list'] = result - - return result - - def srcdir_duplicate(self, name): - for dir in self.srcdir_list(): - if self.is_under(dir): - # We shouldn't source from something in the build path; - # variant_dir is probably under src_dir, in which case - # we are reflecting. - break - if dir.entry_exists_on_disk(name): - srcnode = dir.Entry(name).disambiguate() - if self.duplicate: - node = self.Entry(name).disambiguate() - node.do_duplicate(srcnode) - return node - else: - return srcnode - return None - - def _srcdir_find_file_key(self, filename): - return filename - - memoizer_counters.append(SCons.Memoize.CountDict('srcdir_find_file', _srcdir_find_file_key)) - - def srcdir_find_file(self, filename): - try: - memo_dict = self._memo['srcdir_find_file'] - except KeyError: - memo_dict = {} - self._memo['srcdir_find_file'] = memo_dict - else: - try: - return memo_dict[filename] - except KeyError: - pass - - def func(node): - if (isinstance(node, File) or isinstance(node, Entry)) and \ - (node.is_derived() or node.exists()): - return node - return None - - norm_name = _my_normcase(filename) - - for rdir in self.get_all_rdirs(): - try: node = rdir.entries[norm_name] - except KeyError: node = rdir.file_on_disk(filename) - else: node = func(node) - if node: - result = (node, self) - memo_dict[filename] = result - return result - - for srcdir in self.srcdir_list(): - for rdir in srcdir.get_all_rdirs(): - try: node = rdir.entries[norm_name] - except KeyError: node = rdir.file_on_disk(filename) - else: node = func(node) - if node: - result = (File(filename, self, self.fs), srcdir) - memo_dict[filename] = result - return result - - result = (None, None) - memo_dict[filename] = result - return result - - def dir_on_disk(self, name): - if self.entry_exists_on_disk(name): - try: return self.Dir(name) - except TypeError: pass - node = self.srcdir_duplicate(name) - if isinstance(node, File): - return None - return node - - def file_on_disk(self, name): - if self.entry_exists_on_disk(name) or \ - diskcheck_rcs(self, name) or \ - diskcheck_sccs(self, name): - try: return self.File(name) - except TypeError: pass - node = self.srcdir_duplicate(name) - if isinstance(node, Dir): - return None - return node - - def walk(self, func, arg): - """ - Walk this directory tree by calling the specified function - for each directory in the tree. - - This behaves like the os.path.walk() function, but for in-memory - Node.FS.Dir objects. The function takes the same arguments as - the functions passed to os.path.walk(): - - func(arg, dirname, fnames) - - Except that "dirname" will actually be the directory *Node*, - not the string. The '.' and '..' entries are excluded from - fnames. The fnames list may be modified in-place to filter the - subdirectories visited or otherwise impose a specific order. - The "arg" argument is always passed to func() and may be used - in any way (or ignored, passing None is common). - """ - entries = self.entries - names = entries.keys() - names.remove('.') - names.remove('..') - func(arg, self, names) - select_dirs = lambda n, e=entries: isinstance(e[n], Dir) - for dirname in filter(select_dirs, names): - entries[dirname].walk(func, arg) - - def glob(self, pathname, ondisk=True, source=False, strings=False): - """ - Returns a list of Nodes (or strings) matching a specified - pathname pattern. - - Pathname patterns follow UNIX shell semantics: * matches - any-length strings of any characters, ? matches any character, - and [] can enclose lists or ranges of characters. Matches do - not span directory separators. - - The matches take into account Repositories, returning local - Nodes if a corresponding entry exists in a Repository (either - an in-memory Node or something on disk). - - By defafult, the glob() function matches entries that exist - on-disk, in addition to in-memory Nodes. Setting the "ondisk" - argument to False (or some other non-true value) causes the glob() - function to only match in-memory Nodes. The default behavior is - to return both the on-disk and in-memory Nodes. - - The "source" argument, when true, specifies that corresponding - source Nodes must be returned if you're globbing in a build - directory (initialized with VariantDir()). The default behavior - is to return Nodes local to the VariantDir(). - - The "strings" argument, when true, returns the matches as strings, - not Nodes. The strings are path names relative to this directory. - - The underlying algorithm is adapted from the glob.glob() function - in the Python library (but heavily modified), and uses fnmatch() - under the covers. - """ - dirname, basename = os.path.split(pathname) - if not dirname: - result = self._glob1(basename, ondisk, source, strings) - result.sort(lambda a, b: cmp(str(a), str(b))) - return result - if has_glob_magic(dirname): - list = self.glob(dirname, ondisk, source, strings=False) - else: - list = [self.Dir(dirname, create=True)] - result = [] - for dir in list: - r = dir._glob1(basename, ondisk, source, strings) - if strings: - r = map(lambda x, d=str(dir): os.path.join(d, x), r) - result.extend(r) - result.sort(lambda a, b: cmp(str(a), str(b))) - return result - - def _glob1(self, pattern, ondisk=True, source=False, strings=False): - """ - Globs for and returns a list of entry names matching a single - pattern in this directory. - - This searches any repositories and source directories for - corresponding entries and returns a Node (or string) relative - to the current directory if an entry is found anywhere. - - TODO: handle pattern with no wildcard - """ - search_dir_list = self.get_all_rdirs() - for srcdir in self.srcdir_list(): - search_dir_list.extend(srcdir.get_all_rdirs()) - - selfEntry = self.Entry - names = [] - for dir in search_dir_list: - # We use the .name attribute from the Node because the keys of - # the dir.entries dictionary are normalized (that is, all upper - # case) on case-insensitive systems like Windows. - #node_names = [ v.name for k, v in dir.entries.items() if k not in ('.', '..') ] - entry_names = filter(lambda n: n not in ('.', '..'), dir.entries.keys()) - node_names = map(lambda n, e=dir.entries: e[n].name, entry_names) - names.extend(node_names) - if not strings: - # Make sure the working directory (self) actually has - # entries for all Nodes in repositories or variant dirs. - for name in node_names: selfEntry(name) - if ondisk: - try: - disk_names = os.listdir(dir.abspath) - except os.error: - continue - names.extend(disk_names) - if not strings: - # We're going to return corresponding Nodes in - # the local directory, so we need to make sure - # those Nodes exist. We only want to create - # Nodes for the entries that will match the - # specified pattern, though, which means we - # need to filter the list here, even though - # the overall list will also be filtered later, - # after we exit this loop. - if pattern[0] != '.': - #disk_names = [ d for d in disk_names if d[0] != '.' ] - disk_names = filter(lambda x: x[0] != '.', disk_names) - disk_names = fnmatch.filter(disk_names, pattern) - dirEntry = dir.Entry - for name in disk_names: - # Add './' before disk filename so that '#' at - # beginning of filename isn't interpreted. - name = './' + name - node = dirEntry(name).disambiguate() - n = selfEntry(name) - if n.__class__ != node.__class__: - n.__class__ = node.__class__ - n._morph() - - names = set(names) - if pattern[0] != '.': - #names = [ n for n in names if n[0] != '.' ] - names = filter(lambda x: x[0] != '.', names) - names = fnmatch.filter(names, pattern) - - if strings: - return names - - #return [ self.entries[_my_normcase(n)] for n in names ] - return map(lambda n, e=self.entries: e[_my_normcase(n)], names) - -class RootDir(Dir): - """A class for the root directory of a file system. - - This is the same as a Dir class, except that the path separator - ('/' or '\\') is actually part of the name, so we don't need to - add a separator when creating the path names of entries within - this directory. - """ - def __init__(self, name, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.RootDir') - # We're going to be our own parent directory (".." entry and .dir - # attribute) so we have to set up some values so Base.__init__() - # won't gag won't it calls some of our methods. - self.abspath = '' - self.labspath = '' - self.path = '' - self.tpath = '' - self.path_elements = [] - self.duplicate = 0 - self.root = self - Base.__init__(self, name, self, fs) - - # Now set our paths to what we really want them to be: the - # initial drive letter (the name) plus the directory separator, - # except for the "lookup abspath," which does not have the - # drive letter. - self.abspath = name + os.sep - self.labspath = '' - self.path = name + os.sep - self.tpath = name + os.sep - self._morph() - - self._lookupDict = {} - - # The // and os.sep + os.sep entries are necessary because - # os.path.normpath() seems to preserve double slashes at the - # beginning of a path (presumably for UNC path names), but - # collapses triple slashes to a single slash. - self._lookupDict[''] = self - self._lookupDict['/'] = self - self._lookupDict['//'] = self - self._lookupDict[os.sep] = self - self._lookupDict[os.sep + os.sep] = self - - def must_be_same(self, klass): - if klass is Dir: - return - Base.must_be_same(self, klass) - - def _lookup_abs(self, p, klass, create=1): - """ - Fast (?) lookup of a *normalized* absolute path. - - This method is intended for use by internal lookups with - already-normalized path data. For general-purpose lookups, - use the FS.Entry(), FS.Dir() or FS.File() methods. - - The caller is responsible for making sure we're passed a - normalized absolute path; we merely let Python's dictionary look - up and return the One True Node.FS object for the path. - - If no Node for the specified "p" doesn't already exist, and - "create" is specified, the Node may be created after recursive - invocation to find or create the parent directory or directories. - """ - k = _my_normcase(p) - try: - result = self._lookupDict[k] - except KeyError: - if not create: - msg = "No such file or directory: '%s' in '%s' (and create is False)" % (p, str(self)) - raise SCons.Errors.UserError, msg - # There is no Node for this path name, and we're allowed - # to create it. - dir_name, file_name = os.path.split(p) - dir_node = self._lookup_abs(dir_name, Dir) - result = klass(file_name, dir_node, self.fs) - - # Double-check on disk (as configured) that the Node we - # created matches whatever is out there in the real world. - result.diskcheck_match() - - self._lookupDict[k] = result - dir_node.entries[_my_normcase(file_name)] = result - dir_node.implicit = None - else: - # There is already a Node for this path name. Allow it to - # complain if we were looking for an inappropriate type. - result.must_be_same(klass) - return result - - def __str__(self): - return self.abspath - - def entry_abspath(self, name): - return self.abspath + name - - def entry_labspath(self, name): - return '/' + name - - def entry_path(self, name): - return self.path + name - - def entry_tpath(self, name): - return self.tpath + name - - def is_under(self, dir): - if self is dir: - return 1 - else: - return 0 - - def up(self): - return None - - def get_dir(self): - return None - - def src_builder(self): - return _null - -class FileNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - - field_list = ['csig', 'timestamp', 'size'] - - # This should get reset by the FS initialization. - fs = None - - def str_to_node(self, s): - top = self.fs.Top - root = top.root - if do_splitdrive: - drive, s = os.path.splitdrive(s) - if drive: - root = self.fs.get_root(drive) - if not os.path.isabs(s): - s = top.labspath + '/' + s - return root._lookup_abs(s, Entry) - -class FileBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - - def convert_to_sconsign(self): - """ - Converts this FileBuildInfo object for writing to a .sconsign file - - This replaces each Node in our various dependency lists with its - usual string representation: relative to the top-level SConstruct - directory, or an absolute path if it's outside. - """ - if os.sep == '/': - node_to_str = str - else: - def node_to_str(n): - try: - s = n.path - except AttributeError: - s = str(n) - else: - s = string.replace(s, os.sep, '/') - return s - for attr in ['bsources', 'bdepends', 'bimplicit']: - try: - val = getattr(self, attr) - except AttributeError: - pass - else: - setattr(self, attr, map(node_to_str, val)) - def convert_from_sconsign(self, dir, name): - """ - Converts a newly-read FileBuildInfo object for in-SCons use - - For normal up-to-date checking, we don't have any conversion to - perform--but we're leaving this method here to make that clear. - """ - pass - def prepare_dependencies(self): - """ - Prepares a FileBuildInfo object for explaining what changed - - The bsources, bdepends and bimplicit lists have all been - stored on disk as paths relative to the top-level SConstruct - directory. Convert the strings to actual Nodes (for use by the - --debug=explain code and --implicit-cache). - """ - attrs = [ - ('bsources', 'bsourcesigs'), - ('bdepends', 'bdependsigs'), - ('bimplicit', 'bimplicitsigs'), - ] - for (nattr, sattr) in attrs: - try: - strings = getattr(self, nattr) - nodeinfos = getattr(self, sattr) - except AttributeError: - continue - nodes = [] - for s, ni in izip(strings, nodeinfos): - if not isinstance(s, SCons.Node.Node): - s = ni.str_to_node(s) - nodes.append(s) - setattr(self, nattr, nodes) - def format(self, names=0): - result = [] - bkids = self.bsources + self.bdepends + self.bimplicit - bkidsigs = self.bsourcesigs + self.bdependsigs + self.bimplicitsigs - for bkid, bkidsig in izip(bkids, bkidsigs): - result.append(str(bkid) + ': ' + - string.join(bkidsig.format(names=names), ' ')) - result.append('%s [%s]' % (self.bactsig, self.bact)) - return string.join(result, '\n') - -class File(Base): - """A class for files in a file system. - """ - - memoizer_counters = [] - - NodeInfo = FileNodeInfo - BuildInfo = FileBuildInfo - - md5_chunksize = 64 - - def diskcheck_match(self): - diskcheck_match(self, self.isdir, - "Directory %s found where file expected.") - - def __init__(self, name, directory, fs): - if __debug__: logInstanceCreation(self, 'Node.FS.File') - Base.__init__(self, name, directory, fs) - self._morph() - - def Entry(self, name): - """Create an entry node named 'name' relative to - the directory of this file.""" - return self.dir.Entry(name) - - def Dir(self, name, create=True): - """Create a directory node named 'name' relative to - the directory of this file.""" - return self.dir.Dir(name, create=create) - - def Dirs(self, pathlist): - """Create a list of directories relative to the SConscript - directory of this file.""" - # TODO(1.5) - # return [self.Dir(p) for p in pathlist] - return map(lambda p, s=self: s.Dir(p), pathlist) - - def File(self, name): - """Create a file node named 'name' relative to - the directory of this file.""" - return self.dir.File(name) - - #def generate_build_dict(self): - # """Return an appropriate dictionary of values for building - # this File.""" - # return {'Dir' : self.Dir, - # 'File' : self.File, - # 'RDirs' : self.RDirs} - - def _morph(self): - """Turn a file system node into a File object.""" - self.scanner_paths = {} - if not hasattr(self, '_local'): - self._local = 0 - - # If there was already a Builder set on this entry, then - # we need to make sure we call the target-decider function, - # not the source-decider. Reaching in and doing this by hand - # is a little bogus. We'd prefer to handle this by adding - # an Entry.builder_set() method that disambiguates like the - # other methods, but that starts running into problems with the - # fragile way we initialize Dir Nodes with their Mkdir builders, - # yet still allow them to be overridden by the user. Since it's - # not clear right now how to fix that, stick with what works - # until it becomes clear... - if self.has_builder(): - self.changed_since_last_build = self.decide_target - - def scanner_key(self): - return self.get_suffix() - - def get_contents(self): - if not self.rexists(): - return '' - fname = self.rfile().abspath - try: - contents = open(fname, "rb").read() - except EnvironmentError, e: - if not e.filename: - e.filename = fname - raise - return contents - - try: - import codecs - except ImportError: - get_text_contents = get_contents - else: - # This attempts to figure out what the encoding of the text is - # based upon the BOM bytes, and then decodes the contents so that - # it's a valid python string. - def get_text_contents(self): - contents = self.get_contents() - # The behavior of various decode() methods and functions - # w.r.t. the initial BOM bytes is different for different - # encodings and/or Python versions. ('utf-8' does not strip - # them, but has a 'utf-8-sig' which does; 'utf-16' seems to - # strip them; etc.) Just side step all the complication by - # explicitly stripping the BOM before we decode(). - if contents.startswith(codecs.BOM_UTF8): - contents = contents[len(codecs.BOM_UTF8):] - # TODO(2.2): Remove when 2.3 becomes floor. - #contents = contents.decode('utf-8') - contents = my_decode(contents, 'utf-8') - elif contents.startswith(codecs.BOM_UTF16_LE): - contents = contents[len(codecs.BOM_UTF16_LE):] - # TODO(2.2): Remove when 2.3 becomes floor. - #contents = contents.decode('utf-16-le') - contents = my_decode(contents, 'utf-16-le') - elif contents.startswith(codecs.BOM_UTF16_BE): - contents = contents[len(codecs.BOM_UTF16_BE):] - # TODO(2.2): Remove when 2.3 becomes floor. - #contents = contents.decode('utf-16-be') - contents = my_decode(contents, 'utf-16-be') - return contents - - def get_content_hash(self): - """ - Compute and return the MD5 hash for this file. - """ - if not self.rexists(): - return SCons.Util.MD5signature('') - fname = self.rfile().abspath - try: - cs = SCons.Util.MD5filesignature(fname, - chunksize=SCons.Node.FS.File.md5_chunksize*1024) - except EnvironmentError, e: - if not e.filename: - e.filename = fname - raise - return cs - - - memoizer_counters.append(SCons.Memoize.CountValue('get_size')) - - def get_size(self): - try: - return self._memo['get_size'] - except KeyError: - pass - - if self.rexists(): - size = self.rfile().getsize() - else: - size = 0 - - self._memo['get_size'] = size - - return size - - memoizer_counters.append(SCons.Memoize.CountValue('get_timestamp')) - - def get_timestamp(self): - try: - return self._memo['get_timestamp'] - except KeyError: - pass - - if self.rexists(): - timestamp = self.rfile().getmtime() - else: - timestamp = 0 - - self._memo['get_timestamp'] = timestamp - - return timestamp - - def store_info(self): - # Merge our build information into the already-stored entry. - # This accomodates "chained builds" where a file that's a target - # in one build (SConstruct file) is a source in a different build. - # See test/chained-build.py for the use case. - if do_store_info: - self.dir.sconsign().store_info(self.name, self) - - convert_copy_attrs = [ - 'bsources', - 'bimplicit', - 'bdepends', - 'bact', - 'bactsig', - 'ninfo', - ] - - - convert_sig_attrs = [ - 'bsourcesigs', - 'bimplicitsigs', - 'bdependsigs', - ] - - def convert_old_entry(self, old_entry): - # Convert a .sconsign entry from before the Big Signature - # Refactoring, doing what we can to convert its information - # to the new .sconsign entry format. - # - # The old format looked essentially like this: - # - # BuildInfo - # .ninfo (NodeInfo) - # .bsig - # .csig - # .timestamp - # .size - # .bsources - # .bsourcesigs ("signature" list) - # .bdepends - # .bdependsigs ("signature" list) - # .bimplicit - # .bimplicitsigs ("signature" list) - # .bact - # .bactsig - # - # The new format looks like this: - # - # .ninfo (NodeInfo) - # .bsig - # .csig - # .timestamp - # .size - # .binfo (BuildInfo) - # .bsources - # .bsourcesigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bdepends - # .bdependsigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bimplicit - # .bimplicitsigs (NodeInfo list) - # .bsig - # .csig - # .timestamp - # .size - # .bact - # .bactsig - # - # The basic idea of the new structure is that a NodeInfo always - # holds all available information about the state of a given Node - # at a certain point in time. The various .b*sigs lists can just - # be a list of pointers to the .ninfo attributes of the different - # dependent nodes, without any copying of information until it's - # time to pickle it for writing out to a .sconsign file. - # - # The complicating issue is that the *old* format only stored one - # "signature" per dependency, based on however the *last* build - # was configured. We don't know from just looking at it whether - # it was a build signature, a content signature, or a timestamp - # "signature". Since we no longer use build signatures, the - # best we can do is look at the length and if it's thirty two, - # assume that it was (or might have been) a content signature. - # If it was actually a build signature, then it will cause a - # rebuild anyway when it doesn't match the new content signature, - # but that's probably the best we can do. - import SCons.SConsign - new_entry = SCons.SConsign.SConsignEntry() - new_entry.binfo = self.new_binfo() - binfo = new_entry.binfo - for attr in self.convert_copy_attrs: - try: - value = getattr(old_entry, attr) - except AttributeError: - continue - setattr(binfo, attr, value) - delattr(old_entry, attr) - for attr in self.convert_sig_attrs: - try: - sig_list = getattr(old_entry, attr) - except AttributeError: - continue - value = [] - for sig in sig_list: - ninfo = self.new_ninfo() - if len(sig) == 32: - ninfo.csig = sig - else: - ninfo.timestamp = sig - value.append(ninfo) - setattr(binfo, attr, value) - delattr(old_entry, attr) - return new_entry - - memoizer_counters.append(SCons.Memoize.CountValue('get_stored_info')) - - def get_stored_info(self): - try: - return self._memo['get_stored_info'] - except KeyError: - pass - - try: - sconsign_entry = self.dir.sconsign().get_entry(self.name) - except (KeyError, EnvironmentError): - import SCons.SConsign - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = self.new_binfo() - sconsign_entry.ninfo = self.new_ninfo() - else: - if isinstance(sconsign_entry, FileBuildInfo): - # This is a .sconsign file from before the Big Signature - # Refactoring; convert it as best we can. - sconsign_entry = self.convert_old_entry(sconsign_entry) - try: - delattr(sconsign_entry.ninfo, 'bsig') - except AttributeError: - pass - - self._memo['get_stored_info'] = sconsign_entry - - return sconsign_entry - - def get_stored_implicit(self): - binfo = self.get_stored_info().binfo - binfo.prepare_dependencies() - try: return binfo.bimplicit - except AttributeError: return None - - def rel_path(self, other): - return self.dir.rel_path(other) - - def _get_found_includes_key(self, env, scanner, path): - return (id(env), id(scanner), path) - - memoizer_counters.append(SCons.Memoize.CountDict('get_found_includes', _get_found_includes_key)) - - def get_found_includes(self, env, scanner, path): - """Return the included implicit dependencies in this file. - Cache results so we only scan the file once per path - regardless of how many times this information is requested. - """ - memo_key = (id(env), id(scanner), path) - try: - memo_dict = self._memo['get_found_includes'] - except KeyError: - memo_dict = {} - self._memo['get_found_includes'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - if scanner: - # result = [n.disambiguate() for n in scanner(self, env, path)] - result = scanner(self, env, path) - result = map(lambda N: N.disambiguate(), result) - else: - result = [] - - memo_dict[memo_key] = result - - return result - - def _createDir(self): - # ensure that the directories for this node are - # created. - self.dir._create() - - def push_to_cache(self): - """Try to push the node into a cache - """ - # This should get called before the Nodes' .built() method is - # called, which would clear the build signature if the file has - # a source scanner. - # - # We have to clear the local memoized values *before* we push - # the node to cache so that the memoization of the self.exists() - # return value doesn't interfere. - if self.nocache: - return - self.clear_memoized_values() - if self.exists(): - self.get_build_env().get_CacheDir().push(self) - - def retrieve_from_cache(self): - """Try to retrieve the node's content from a cache - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Returns true iff the node was successfully retrieved. - """ - if self.nocache: - return None - if not self.is_derived(): - return None - return self.get_build_env().get_CacheDir().retrieve(self) - - def visited(self): - if self.exists(): - self.get_build_env().get_CacheDir().push_if_forced(self) - - ninfo = self.get_ninfo() - - csig = self.get_max_drift_csig() - if csig: - ninfo.csig = csig - - ninfo.timestamp = self.get_timestamp() - ninfo.size = self.get_size() - - if not self.has_builder(): - # This is a source file, but it might have been a target file - # in another build that included more of the DAG. Copy - # any build information that's stored in the .sconsign file - # into our binfo object so it doesn't get lost. - old = self.get_stored_info() - self.get_binfo().__dict__.update(old.binfo.__dict__) - - self.store_info() - - def find_src_builder(self): - if self.rexists(): - return None - scb = self.dir.src_builder() - if scb is _null: - if diskcheck_sccs(self.dir, self.name): - scb = get_DefaultSCCSBuilder() - elif diskcheck_rcs(self.dir, self.name): - scb = get_DefaultRCSBuilder() - else: - scb = None - if scb is not None: - try: - b = self.builder - except AttributeError: - b = None - if b is None: - self.builder_set(scb) - return scb - - def has_src_builder(self): - """Return whether this Node has a source builder or not. - - If this Node doesn't have an explicit source code builder, this - is where we figure out, on the fly, if there's a transparent - source code builder for it. - - Note that if we found a source builder, we also set the - self.builder attribute, so that all of the methods that actually - *build* this file don't have to do anything different. - """ - try: - scb = self.sbuilder - except AttributeError: - scb = self.sbuilder = self.find_src_builder() - return scb is not None - - def alter_targets(self): - """Return any corresponding targets in a variant directory. - """ - if self.is_derived(): - return [], None - return self.fs.variant_dir_target_climb(self, self.dir, [self.name]) - - def _rmv_existing(self): - self.clear_memoized_values() - e = Unlink(self, [], None) - if isinstance(e, SCons.Errors.BuildError): - raise e - - # - # Taskmaster interface subsystem - # - - def make_ready(self): - self.has_src_builder() - self.get_binfo() - - def prepare(self): - """Prepare for this file to be created.""" - SCons.Node.Node.prepare(self) - - if self.get_state() != SCons.Node.up_to_date: - if self.exists(): - if self.is_derived() and not self.precious: - self._rmv_existing() - else: - try: - self._createDir() - except SCons.Errors.StopError, drive: - desc = "No drive `%s' for target `%s'." % (drive, self) - raise SCons.Errors.StopError, desc - - # - # - # - - def remove(self): - """Remove this file.""" - if self.exists() or self.islink(): - self.fs.unlink(self.path) - return 1 - return None - - def do_duplicate(self, src): - self._createDir() - Unlink(self, None, None) - e = Link(self, src, None) - if isinstance(e, SCons.Errors.BuildError): - desc = "Cannot duplicate `%s' in `%s': %s." % (src.path, self.dir.path, e.errstr) - raise SCons.Errors.StopError, desc - self.linked = 1 - # The Link() action may or may not have actually - # created the file, depending on whether the -n - # option was used or not. Delete the _exists and - # _rexists attributes so they can be reevaluated. - self.clear() - - memoizer_counters.append(SCons.Memoize.CountValue('exists')) - - def exists(self): - try: - return self._memo['exists'] - except KeyError: - pass - # Duplicate from source path if we are set up to do this. - if self.duplicate and not self.is_derived() and not self.linked: - src = self.srcnode() - if src is not self: - # At this point, src is meant to be copied in a variant directory. - src = src.rfile() - if src.abspath != self.abspath: - if src.exists(): - self.do_duplicate(src) - # Can't return 1 here because the duplication might - # not actually occur if the -n option is being used. - else: - # The source file does not exist. Make sure no old - # copy remains in the variant directory. - if Base.exists(self) or self.islink(): - self.fs.unlink(self.path) - # Return None explicitly because the Base.exists() call - # above will have cached its value if the file existed. - self._memo['exists'] = None - return None - result = Base.exists(self) - self._memo['exists'] = result - return result - - # - # SIGNATURE SUBSYSTEM - # - - def get_max_drift_csig(self): - """ - Returns the content signature currently stored for this node - if it's been unmodified longer than the max_drift value, or the - max_drift value is 0. Returns None otherwise. - """ - old = self.get_stored_info() - mtime = self.get_timestamp() - - max_drift = self.fs.max_drift - if max_drift > 0: - if (time.time() - mtime) > max_drift: - try: - n = old.ninfo - if n.timestamp and n.csig and n.timestamp == mtime: - return n.csig - except AttributeError: - pass - elif max_drift == 0: - try: - return old.ninfo.csig - except AttributeError: - pass - - return None - - def get_csig(self): - """ - Generate a node's content signature, the digested signature - of its content. - - node - the node - cache - alternate node to use for the signature cache - returns - the content signature - """ - ninfo = self.get_ninfo() - try: - return ninfo.csig - except AttributeError: - pass - - csig = self.get_max_drift_csig() - if csig is None: - - try: - if self.get_size() < SCons.Node.FS.File.md5_chunksize: - contents = self.get_contents() - else: - csig = self.get_content_hash() - except IOError: - # This can happen if there's actually a directory on-disk, - # which can be the case if they've disabled disk checks, - # or if an action with a File target actually happens to - # create a same-named directory by mistake. - csig = '' - else: - if not csig: - csig = SCons.Util.MD5signature(contents) - - ninfo.csig = csig - - return csig - - # - # DECISION SUBSYSTEM - # - - def builder_set(self, builder): - SCons.Node.Node.builder_set(self, builder) - self.changed_since_last_build = self.decide_target - - def changed_content(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def changed_state(self, target, prev_ni): - return self.state != SCons.Node.up_to_date - - def changed_timestamp_then_content(self, target, prev_ni): - if not self.changed_timestamp_match(target, prev_ni): - try: - self.get_ninfo().csig = prev_ni.csig - except AttributeError: - pass - return False - return self.changed_content(target, prev_ni) - - def changed_timestamp_newer(self, target, prev_ni): - try: - return self.get_timestamp() > target.get_timestamp() - except AttributeError: - return 1 - - def changed_timestamp_match(self, target, prev_ni): - try: - return self.get_timestamp() != prev_ni.timestamp - except AttributeError: - return 1 - - def decide_source(self, target, prev_ni): - return target.get_build_env().decide_source(self, target, prev_ni) - - def decide_target(self, target, prev_ni): - return target.get_build_env().decide_target(self, target, prev_ni) - - # Initialize this Node's decider function to decide_source() because - # every file is a source file until it has a Builder attached... - changed_since_last_build = decide_source - - def is_up_to_date(self): - T = 0 - if T: Trace('is_up_to_date(%s):' % self) - if not self.exists(): - if T: Trace(' not self.exists():') - # The file doesn't exist locally... - r = self.rfile() - if r != self: - # ...but there is one in a Repository... - if not self.changed(r): - if T: Trace(' changed(%s):' % r) - # ...and it's even up-to-date... - if self._local: - # ...and they'd like a local copy. - e = LocalCopy(self, r, None) - if isinstance(e, SCons.Errors.BuildError): - raise - self.store_info() - if T: Trace(' 1\n') - return 1 - self.changed() - if T: Trace(' None\n') - return None - else: - r = self.changed() - if T: Trace(' self.exists(): %s\n' % r) - return not r - - memoizer_counters.append(SCons.Memoize.CountValue('rfile')) - - def rfile(self): - try: - return self._memo['rfile'] - except KeyError: - pass - result = self - if not self.exists(): - norm_name = _my_normcase(self.name) - for dir in self.dir.get_all_rdirs(): - try: node = dir.entries[norm_name] - except KeyError: node = dir.file_on_disk(self.name) - if node and node.exists() and \ - (isinstance(node, File) or isinstance(node, Entry) \ - or not node.is_derived()): - result = node - # Copy over our local attributes to the repository - # Node so we identify shared object files in the - # repository and don't assume they're static. - # - # This isn't perfect; the attribute would ideally - # be attached to the object in the repository in - # case it was built statically in the repository - # and we changed it to shared locally, but that's - # rarely the case and would only occur if you - # intentionally used the same suffix for both - # shared and static objects anyway. So this - # should work well in practice. - result.attributes = self.attributes - break - self._memo['rfile'] = result - return result - - def rstr(self): - return str(self.rfile()) - - def get_cachedir_csig(self): - """ - Fetch a Node's content signature for purposes of computing - another Node's cachesig. - - This is a wrapper around the normal get_csig() method that handles - the somewhat obscure case of using CacheDir with the -n option. - Any files that don't exist would normally be "built" by fetching - them from the cache, but the normal get_csig() method will try - to open up the local file, which doesn't exist because the -n - option meant we didn't actually pull the file from cachedir. - But since the file *does* actually exist in the cachedir, we - can use its contents for the csig. - """ - try: - return self.cachedir_csig - except AttributeError: - pass - - cachedir, cachefile = self.get_build_env().get_CacheDir().cachepath(self) - if not self.exists() and cachefile and os.path.exists(cachefile): - self.cachedir_csig = SCons.Util.MD5filesignature(cachefile, \ - SCons.Node.FS.File.md5_chunksize * 1024) - else: - self.cachedir_csig = self.get_csig() - return self.cachedir_csig - - def get_cachedir_bsig(self): - try: - return self.cachesig - except AttributeError: - pass - - # Add the path to the cache signature, because multiple - # targets built by the same action will all have the same - # build signature, and we have to differentiate them somehow. - children = self.children() - executor = self.get_executor() - # sigs = [n.get_cachedir_csig() for n in children] - sigs = map(lambda n: n.get_cachedir_csig(), children) - sigs.append(SCons.Util.MD5signature(executor.get_contents())) - sigs.append(self.path) - result = self.cachesig = SCons.Util.MD5collect(sigs) - return result - - -default_fs = None - -def get_default_fs(): - global default_fs - if not default_fs: - default_fs = FS() - return default_fs - -class FileFinder: - """ - """ - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self): - self._memo = {} - - def filedir_lookup(self, p, fd=None): - """ - A helper method for find_file() that looks up a directory for - a file we're trying to find. This only creates the Dir Node if - it exists on-disk, since if the directory doesn't exist we know - we won't find any files in it... :-) - - It would be more compact to just use this as a nested function - with a default keyword argument (see the commented-out version - below), but that doesn't work unless you have nested scopes, - so we define it here just so this work under Python 1.5.2. - """ - if fd is None: - fd = self.default_filedir - dir, name = os.path.split(fd) - drive, d = os.path.splitdrive(dir) - if not name and d[:1] in ('/', os.sep): - #return p.fs.get_root(drive).dir_on_disk(name) - return p.fs.get_root(drive) - if dir: - p = self.filedir_lookup(p, dir) - if not p: - return None - norm_name = _my_normcase(name) - try: - node = p.entries[norm_name] - except KeyError: - return p.dir_on_disk(name) - if isinstance(node, Dir): - return node - if isinstance(node, Entry): - node.must_be_same(Dir) - return node - return None - - def _find_file_key(self, filename, paths, verbose=None): - return (filename, paths) - - memoizer_counters.append(SCons.Memoize.CountDict('find_file', _find_file_key)) - - def find_file(self, filename, paths, verbose=None): - """ - find_file(str, [Dir()]) -> [nodes] - - filename - a filename to find - paths - a list of directory path *nodes* to search in. Can be - represented as a list, a tuple, or a callable that is - called with no arguments and returns the list or tuple. - - returns - the node created from the found file. - - Find a node corresponding to either a derived file or a file - that exists already. - - Only the first file found is returned, and none is returned - if no file is found. - """ - memo_key = self._find_file_key(filename, paths) - try: - memo_dict = self._memo['find_file'] - except KeyError: - memo_dict = {} - self._memo['find_file'] = memo_dict - else: - try: - return memo_dict[memo_key] - except KeyError: - pass - - if verbose and not callable(verbose): - if not SCons.Util.is_String(verbose): - verbose = "find_file" - verbose = ' %s: ' % verbose - verbose = lambda s, v=verbose: sys.stdout.write(v + s) - - filedir, filename = os.path.split(filename) - if filedir: - # More compact code that we can't use until we drop - # support for Python 1.5.2: - # - #def filedir_lookup(p, fd=filedir): - # """ - # A helper function that looks up a directory for a file - # we're trying to find. This only creates the Dir Node - # if it exists on-disk, since if the directory doesn't - # exist we know we won't find any files in it... :-) - # """ - # dir, name = os.path.split(fd) - # if dir: - # p = filedir_lookup(p, dir) - # if not p: - # return None - # norm_name = _my_normcase(name) - # try: - # node = p.entries[norm_name] - # except KeyError: - # return p.dir_on_disk(name) - # if isinstance(node, Dir): - # return node - # if isinstance(node, Entry): - # node.must_be_same(Dir) - # return node - # if isinstance(node, Dir) or isinstance(node, Entry): - # return node - # return None - #paths = filter(None, map(filedir_lookup, paths)) - - self.default_filedir = filedir - paths = filter(None, map(self.filedir_lookup, paths)) - - result = None - for dir in paths: - if verbose: - verbose("looking for '%s' in '%s' ...\n" % (filename, dir)) - node, d = dir.srcdir_find_file(filename) - if node: - if verbose: - verbose("... FOUND '%s' in '%s'\n" % (filename, d)) - result = node - break - - memo_dict[memo_key] = result - - return result - -find_file = FileFinder().find_file - - -def invalidate_node_memos(targets): - """ - Invalidate the memoized values of all Nodes (files or directories) - that are associated with the given entries. Has been added to - clear the cache of nodes affected by a direct execution of an - action (e.g. Delete/Copy/Chmod). Existing Node caches become - inconsistent if the action is run through Execute(). The argument - `targets` can be a single Node object or filename, or a sequence - of Nodes/filenames. - """ - from traceback import extract_stack - - # First check if the cache really needs to be flushed. Only - # actions run in the SConscript with Execute() seem to be - # affected. XXX The way to check if Execute() is in the stacktrace - # is a very dirty hack and should be replaced by a more sensible - # solution. - for f in extract_stack(): - if f[2] == 'Execute' and f[0][-14:] == 'Environment.py': - break - else: - # Dont have to invalidate, so return - return - - if not SCons.Util.is_List(targets): - targets = [targets] - - for entry in targets: - # If the target is a Node object, clear the cache. If it is a - # filename, look up potentially existing Node object first. - try: - entry.clear_memoized_values() - except AttributeError: - # Not a Node object, try to look up Node by filename. XXX - # This creates Node objects even for those filenames which - # do not correspond to an existing Node object. - node = get_default_fs().Entry(entry) - if node: - node.clear_memoized_values() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Node/Python.py b/share/scons-local-1.3.0/SCons/Node/Python.py deleted file mode 100644 index 53c2c801738faf9b1be6c8ed7596da2bbd31c191..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Node/Python.py +++ /dev/null @@ -1,128 +0,0 @@ -"""scons.Node.Python - -Python nodes. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Node/Python.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Node - -class ValueNodeInfo(SCons.Node.NodeInfoBase): - current_version_id = 1 - - field_list = ['csig'] - - def str_to_node(self, s): - return Value(s) - -class ValueBuildInfo(SCons.Node.BuildInfoBase): - current_version_id = 1 - -class Value(SCons.Node.Node): - """A class for Python variables, typically passed on the command line - or generated by a script, but not from a file or some other source. - """ - - NodeInfo = ValueNodeInfo - BuildInfo = ValueBuildInfo - - def __init__(self, value, built_value=None): - SCons.Node.Node.__init__(self) - self.value = value - if built_value is not None: - self.built_value = built_value - - def str_for_display(self): - return repr(self.value) - - def __str__(self): - return str(self.value) - - def make_ready(self): - self.get_csig() - - def build(self, **kw): - if not hasattr(self, 'built_value'): - apply (SCons.Node.Node.build, (self,), kw) - - is_up_to_date = SCons.Node.Node.children_are_up_to_date - - def is_under(self, dir): - # Make Value nodes get built regardless of - # what directory scons was run from. Value nodes - # are outside the filesystem: - return 1 - - def write(self, built_value): - """Set the value of the node.""" - self.built_value = built_value - - def read(self): - """Return the value. If necessary, the value is built.""" - self.build() - if not hasattr(self, 'built_value'): - self.built_value = self.value - return self.built_value - - def get_text_contents(self): - """By the assumption that the node.built_value is a - deterministic product of the sources, the contents of a Value - are the concatenation of all the contents of its sources. As - the value need not be built when get_contents() is called, we - cannot use the actual node.built_value.""" - ###TODO: something reasonable about universal newlines - contents = str(self.value) - for kid in self.children(None): - contents = contents + kid.get_contents() - return contents - - get_contents = get_text_contents ###TODO should return 'bytes' value - - def changed_since_last_build(self, target, prev_ni): - cur_csig = self.get_csig() - try: - return cur_csig != prev_ni.csig - except AttributeError: - return 1 - - def get_csig(self, calc=None): - """Because we're a Python value node and don't have a real - timestamp, we get to ignore the calculator and just use the - value contents.""" - try: - return self.ninfo.csig - except AttributeError: - pass - contents = self.get_contents() - self.get_ninfo().csig = contents - return contents - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Node/__init__.py b/share/scons-local-1.3.0/SCons/Node/__init__.py deleted file mode 100644 index b0570b0406f32bbd3d533a8d8e03b503414a6053..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Node/__init__.py +++ /dev/null @@ -1,1341 +0,0 @@ -"""SCons.Node - -The Node package for the SCons software construction utility. - -This is, in many ways, the heart of SCons. - -A Node is where we encapsulate all of the dependency information about -any thing that SCons can build, or about any thing which SCons can use -to build some other thing. The canonical "thing," of course, is a file, -but a Node can also represent something remote (like a web page) or -something completely abstract (like an Alias). - -Each specific type of "thing" is specifically represented by a subclass -of the Node base class: Node.FS.File for files, Node.Alias for aliases, -etc. Dependency information is kept here in the base class, and -information specific to files/aliases/etc. is in the subclass. The -goal, if we've done this correctly, is that any type of "thing" should -be able to depend on any other type of "thing." - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Node/__init__.py 4720 2010/03/24 03:14:11 jars" - -import copy -from itertools import chain, izip -import string -import UserList - -from SCons.Debug import logInstanceCreation -import SCons.Executor -import SCons.Memoize -import SCons.Util - -from SCons.Debug import Trace - -def classname(obj): - return string.split(str(obj.__class__), '.')[-1] - -# Node states -# -# These are in "priority" order, so that the maximum value for any -# child/dependency of a node represents the state of that node if -# it has no builder of its own. The canonical example is a file -# system directory, which is only up to date if all of its children -# were up to date. -no_state = 0 -pending = 1 -executing = 2 -up_to_date = 3 -executed = 4 -failed = 5 - -StateString = { - 0 : "no_state", - 1 : "pending", - 2 : "executing", - 3 : "up_to_date", - 4 : "executed", - 5 : "failed", -} - -# controls whether implicit dependencies are cached: -implicit_cache = 0 - -# controls whether implicit dep changes are ignored: -implicit_deps_unchanged = 0 - -# controls whether the cached implicit deps are ignored: -implicit_deps_changed = 0 - -# A variable that can be set to an interface-specific function be called -# to annotate a Node with information about its creation. -def do_nothing(node): pass - -Annotate = do_nothing - -# Classes for signature info for Nodes. - -class NodeInfoBase: - """ - The generic base class for signature information for a Node. - - Node subclasses should subclass NodeInfoBase to provide their own - logic for dealing with their own Node-specific signature information. - """ - current_version_id = 1 - def __init__(self, node): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - self._version_id = self.current_version_id - def update(self, node): - try: - field_list = self.field_list - except AttributeError: - return - for f in field_list: - try: - delattr(self, f) - except AttributeError: - pass - try: - func = getattr(node, 'get_' + f) - except AttributeError: - pass - else: - setattr(self, f, func()) - def convert(self, node, val): - pass - def merge(self, other): - self.__dict__.update(other.__dict__) - def format(self, field_list=None, names=0): - if field_list is None: - try: - field_list = self.field_list - except AttributeError: - field_list = self.__dict__.keys() - field_list.sort() - fields = [] - for field in field_list: - try: - f = getattr(self, field) - except AttributeError: - f = None - f = str(f) - if names: - f = field + ': ' + f - fields.append(f) - return fields - -class BuildInfoBase: - """ - The generic base class for build information for a Node. - - This is what gets stored in a .sconsign file for each target file. - It contains a NodeInfo instance for this node (signature information - that's specific to the type of Node) and direct attributes for the - generic build stuff we have to track: sources, explicit dependencies, - implicit dependencies, and action information. - """ - current_version_id = 1 - def __init__(self, node): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - self._version_id = self.current_version_id - self.bsourcesigs = [] - self.bdependsigs = [] - self.bimplicitsigs = [] - self.bactsig = None - def merge(self, other): - self.__dict__.update(other.__dict__) - -class Node: - """The base Node class, for entities that we know how to - build, or use to build other Nodes. - """ - - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - class Attrs: - pass - - def __init__(self): - if __debug__: logInstanceCreation(self, 'Node.Node') - # Note that we no longer explicitly initialize a self.builder - # attribute to None here. That's because the self.builder - # attribute may be created on-the-fly later by a subclass (the - # canonical example being a builder to fetch a file from a - # source code system like CVS or Subversion). - - # Each list of children that we maintain is accompanied by a - # dictionary used to look up quickly whether a node is already - # present in the list. Empirical tests showed that it was - # fastest to maintain them as side-by-side Node attributes in - # this way, instead of wrapping up each list+dictionary pair in - # a class. (Of course, we could always still do that in the - # future if we had a good reason to...). - self.sources = [] # source files used to build node - self.sources_set = set() - self._specific_sources = False - self.depends = [] # explicit dependencies (from Depends) - self.depends_set = set() - self.ignore = [] # dependencies to ignore - self.ignore_set = set() - self.prerequisites = SCons.Util.UniqueList() - self.implicit = None # implicit (scanned) dependencies (None means not scanned yet) - self.waiting_parents = set() - self.waiting_s_e = set() - self.ref_count = 0 - self.wkids = None # Kids yet to walk, when it's an array - - self.env = None - self.state = no_state - self.precious = None - self.noclean = 0 - self.nocache = 0 - self.always_build = None - self.includes = None - self.attributes = self.Attrs() # Generic place to stick information about the Node. - self.side_effect = 0 # true iff this node is a side effect - self.side_effects = [] # the side effects of building this target - self.linked = 0 # is this node linked to the variant directory? - - self.clear_memoized_values() - - # Let the interface in which the build engine is embedded - # annotate this Node with its own info (like a description of - # what line in what file created the node, for example). - Annotate(self) - - def disambiguate(self, must_exist=None): - return self - - def get_suffix(self): - return '' - - memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - - def get_build_env(self): - """Fetch the appropriate Environment to build this node. - """ - try: - return self._memo['get_build_env'] - except KeyError: - pass - result = self.get_executor().get_build_env() - self._memo['get_build_env'] = result - return result - - def get_build_scanner_path(self, scanner): - """Fetch the appropriate scanner path for this node.""" - return self.get_executor().get_build_scanner_path(scanner) - - def set_executor(self, executor): - """Set the action executor for this node.""" - self.executor = executor - - def get_executor(self, create=1): - """Fetch the action executor for this node. Create one if - there isn't already one, and requested to do so.""" - try: - executor = self.executor - except AttributeError: - if not create: - raise - try: - act = self.builder.action - except AttributeError: - executor = SCons.Executor.Null(targets=[self]) - else: - executor = SCons.Executor.Executor(act, - self.env or self.builder.env, - [self.builder.overrides], - [self], - self.sources) - self.executor = executor - return executor - - def executor_cleanup(self): - """Let the executor clean up any cached information.""" - try: - executor = self.get_executor(create=None) - except AttributeError: - pass - else: - executor.cleanup() - - def reset_executor(self): - "Remove cached executor; forces recompute when needed." - try: - delattr(self, 'executor') - except AttributeError: - pass - - def push_to_cache(self): - """Try to push a node into a cache - """ - pass - - def retrieve_from_cache(self): - """Try to retrieve the node's content from a cache - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - built(). - - Returns true iff the node was successfully retrieved. - """ - return 0 - - # - # Taskmaster interface subsystem - # - - def make_ready(self): - """Get a Node ready for evaluation. - - This is called before the Taskmaster decides if the Node is - up-to-date or not. Overriding this method allows for a Node - subclass to be disambiguated if necessary, or for an implicit - source builder to be attached. - """ - pass - - def prepare(self): - """Prepare for this Node to be built. - - This is called after the Taskmaster has decided that the Node - is out-of-date and must be rebuilt, but before actually calling - the method to build the Node. - - This default implementation checks that explicit or implicit - dependencies either exist or are derived, and initializes the - BuildInfo structure that will hold the information about how - this node is, uh, built. - - (The existence of source files is checked separately by the - Executor, which aggregates checks for all of the targets built - by a specific action.) - - Overriding this method allows for for a Node subclass to remove - the underlying file from the file system. Note that subclass - methods should call this base class method to get the child - check and the BuildInfo structure. - """ - for d in self.depends: - if d.missing(): - msg = "Explicit dependency `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError, msg % (d, self) - if self.implicit is not None: - for i in self.implicit: - if i.missing(): - msg = "Implicit dependency `%s' not found, needed by target `%s'." - raise SCons.Errors.StopError, msg % (i, self) - self.binfo = self.get_binfo() - - def build(self, **kw): - """Actually build the node. - - This is called by the Taskmaster after it's decided that the - Node is out-of-date and must be rebuilt, and after the prepare() - method has gotten everything, uh, prepared. - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff - in built(). - - """ - try: - apply(self.get_executor(), (self,), kw) - except SCons.Errors.BuildError, e: - e.node = self - raise - - def built(self): - """Called just after this node is successfully built.""" - - # Clear the implicit dependency caches of any Nodes - # waiting for this Node to be built. - for parent in self.waiting_parents: - parent.implicit = None - - self.clear() - - self.ninfo.update(self) - - def visited(self): - """Called just after this node has been visited (with or - without a build).""" - try: - binfo = self.binfo - except AttributeError: - # Apparently this node doesn't need build info, so - # don't bother calculating or storing it. - pass - else: - self.ninfo.update(self) - self.store_info() - - # - # - # - - def add_to_waiting_s_e(self, node): - self.waiting_s_e.add(node) - - def add_to_waiting_parents(self, node): - """ - Returns the number of nodes added to our waiting parents list: - 1 if we add a unique waiting parent, 0 if not. (Note that the - returned values are intended to be used to increment a reference - count, so don't think you can "clean up" this function by using - True and False instead...) - """ - wp = self.waiting_parents - if node in wp: - return 0 - wp.add(node) - return 1 - - def postprocess(self): - """Clean up anything we don't need to hang onto after we've - been built.""" - self.executor_cleanup() - self.waiting_parents = set() - - def clear(self): - """Completely clear a Node of all its cached state (so that it - can be re-evaluated by interfaces that do continuous integration - builds). - """ - # The del_binfo() call here isn't necessary for normal execution, - # but is for interactive mode, where we might rebuild the same - # target and need to start from scratch. - self.del_binfo() - self.clear_memoized_values() - self.ninfo = self.new_ninfo() - self.executor_cleanup() - try: - delattr(self, '_calculated_sig') - except AttributeError: - pass - self.includes = None - - def clear_memoized_values(self): - self._memo = {} - - def builder_set(self, builder): - self.builder = builder - try: - del self.executor - except AttributeError: - pass - - def has_builder(self): - """Return whether this Node has a builder or not. - - In Boolean tests, this turns out to be a *lot* more efficient - than simply examining the builder attribute directly ("if - node.builder: ..."). When the builder attribute is examined - directly, it ends up calling __getattr__ for both the __len__ - and __nonzero__ attributes on instances of our Builder Proxy - class(es), generating a bazillion extra calls and slowing - things down immensely. - """ - try: - b = self.builder - except AttributeError: - # There was no explicit builder for this Node, so initialize - # the self.builder attribute to None now. - b = self.builder = None - return b is not None - - def set_explicit(self, is_explicit): - self.is_explicit = is_explicit - - def has_explicit_builder(self): - """Return whether this Node has an explicit builder - - This allows an internal Builder created by SCons to be marked - non-explicit, so that it can be overridden by an explicit - builder that the user supplies (the canonical example being - directories).""" - try: - return self.is_explicit - except AttributeError: - self.is_explicit = None - return self.is_explicit - - def get_builder(self, default_builder=None): - """Return the set builder, or a specified default value""" - try: - return self.builder - except AttributeError: - return default_builder - - multiple_side_effect_has_builder = has_builder - - def is_derived(self): - """ - Returns true iff this node is derived (i.e. built). - - This should return true only for nodes whose path should be in - the variant directory when duplicate=0 and should contribute their build - signatures when they are used as source files to other derived files. For - example: source with source builders are not derived in this sense, - and hence should not return true. - """ - return self.has_builder() or self.side_effect - - def alter_targets(self): - """Return a list of alternate targets for this Node. - """ - return [], None - - def get_found_includes(self, env, scanner, path): - """Return the scanned include lines (implicit dependencies) - found in this node. - - The default is no implicit dependencies. We expect this method - to be overridden by any subclass that can be scanned for - implicit dependencies. - """ - return [] - - def get_implicit_deps(self, env, scanner, path): - """Return a list of implicit dependencies for this node. - - This method exists to handle recursive invocation of the scanner - on the implicit dependencies returned by the scanner, if the - scanner's recursive flag says that we should. - """ - if not scanner: - return [] - - # Give the scanner a chance to select a more specific scanner - # for this Node. - #scanner = scanner.select(self) - - nodes = [self] - seen = {} - seen[self] = 1 - deps = [] - while nodes: - n = nodes.pop(0) - d = filter(lambda x, seen=seen: not seen.has_key(x), - n.get_found_includes(env, scanner, path)) - if d: - deps.extend(d) - for n in d: - seen[n] = 1 - nodes.extend(scanner.recurse_nodes(d)) - - return deps - - def get_env_scanner(self, env, kw={}): - return env.get_scanner(self.scanner_key()) - - def get_target_scanner(self): - return self.builder.target_scanner - - def get_source_scanner(self, node): - """Fetch the source scanner for the specified node - - NOTE: "self" is the target being built, "node" is - the source file for which we want to fetch the scanner. - - Implies self.has_builder() is true; again, expect to only be - called from locations where this is already verified. - - This function may be called very often; it attempts to cache - the scanner found to improve performance. - """ - scanner = None - try: - scanner = self.builder.source_scanner - except AttributeError: - pass - if not scanner: - # The builder didn't have an explicit scanner, so go look up - # a scanner from env['SCANNERS'] based on the node's scanner - # key (usually the file extension). - scanner = self.get_env_scanner(self.get_build_env()) - if scanner: - scanner = scanner.select(node) - return scanner - - def add_to_implicit(self, deps): - if not hasattr(self, 'implicit') or self.implicit is None: - self.implicit = [] - self.implicit_set = set() - self._children_reset() - self._add_child(self.implicit, self.implicit_set, deps) - - def scan(self): - """Scan this node's dependents for implicit dependencies.""" - # Don't bother scanning non-derived files, because we don't - # care what their dependencies are. - # Don't scan again, if we already have scanned. - if self.implicit is not None: - return - self.implicit = [] - self.implicit_set = set() - self._children_reset() - if not self.has_builder(): - return - - build_env = self.get_build_env() - executor = self.get_executor() - - # Here's where we implement --implicit-cache. - if implicit_cache and not implicit_deps_changed: - implicit = self.get_stored_implicit() - if implicit is not None: - # We now add the implicit dependencies returned from the - # stored .sconsign entry to have already been converted - # to Nodes for us. (We used to run them through a - # source_factory function here.) - - # Update all of the targets with them. This - # essentially short-circuits an N*M scan of the - # sources for each individual target, which is a hell - # of a lot more efficient. - for tgt in executor.get_all_targets(): - tgt.add_to_implicit(implicit) - - if implicit_deps_unchanged or self.is_up_to_date(): - return - # one of this node's sources has changed, - # so we must recalculate the implicit deps: - self.implicit = [] - self.implicit_set = set() - - # Have the executor scan the sources. - executor.scan_sources(self.builder.source_scanner) - - # If there's a target scanner, have the executor scan the target - # node itself and associated targets that might be built. - scanner = self.get_target_scanner() - if scanner: - executor.scan_targets(scanner) - - def scanner_key(self): - return None - - def select_scanner(self, scanner): - """Selects a scanner for this Node. - - This is a separate method so it can be overridden by Node - subclasses (specifically, Node.FS.Dir) that *must* use their - own Scanner and don't select one the Scanner.Selector that's - configured for the target. - """ - return scanner.select(self) - - def env_set(self, env, safe=0): - if safe and self.env: - return - self.env = env - - # - # SIGNATURE SUBSYSTEM - # - - NodeInfo = NodeInfoBase - BuildInfo = BuildInfoBase - - def new_ninfo(self): - ninfo = self.NodeInfo(self) - return ninfo - - def get_ninfo(self): - try: - return self.ninfo - except AttributeError: - self.ninfo = self.new_ninfo() - return self.ninfo - - def new_binfo(self): - binfo = self.BuildInfo(self) - return binfo - - def get_binfo(self): - """ - Fetch a node's build information. - - node - the node whose sources will be collected - cache - alternate node to use for the signature cache - returns - the build signature - - This no longer handles the recursive descent of the - node's children's signatures. We expect that they're - already built and updated by someone else, if that's - what's wanted. - """ - try: - return self.binfo - except AttributeError: - pass - - binfo = self.new_binfo() - self.binfo = binfo - - executor = self.get_executor() - ignore_set = self.ignore_set - - if self.has_builder(): - binfo.bact = str(executor) - binfo.bactsig = SCons.Util.MD5signature(executor.get_contents()) - - if self._specific_sources: - sources = [] - for s in self.sources: - if s not in ignore_set: - sources.append(s) - else: - sources = executor.get_unignored_sources(self, self.ignore) - seen = set() - bsources = [] - bsourcesigs = [] - for s in sources: - if not s in seen: - seen.add(s) - bsources.append(s) - bsourcesigs.append(s.get_ninfo()) - binfo.bsources = bsources - binfo.bsourcesigs = bsourcesigs - - depends = self.depends - dependsigs = [] - for d in depends: - if d not in ignore_set: - dependsigs.append(d.get_ninfo()) - binfo.bdepends = depends - binfo.bdependsigs = dependsigs - - implicit = self.implicit or [] - implicitsigs = [] - for i in implicit: - if i not in ignore_set: - implicitsigs.append(i.get_ninfo()) - binfo.bimplicit = implicit - binfo.bimplicitsigs = implicitsigs - - return binfo - - def del_binfo(self): - """Delete the build info from this node.""" - try: - delattr(self, 'binfo') - except AttributeError: - pass - - def get_csig(self): - try: - return self.ninfo.csig - except AttributeError: - ninfo = self.get_ninfo() - ninfo.csig = SCons.Util.MD5signature(self.get_contents()) - return self.ninfo.csig - - def get_cachedir_csig(self): - return self.get_csig() - - def store_info(self): - """Make the build signature permanent (that is, store it in the - .sconsign file or equivalent).""" - pass - - def do_not_store_info(self): - pass - - def get_stored_info(self): - return None - - def get_stored_implicit(self): - """Fetch the stored implicit dependencies""" - return None - - # - # - # - - def set_precious(self, precious = 1): - """Set the Node's precious value.""" - self.precious = precious - - def set_noclean(self, noclean = 1): - """Set the Node's noclean value.""" - # Make sure noclean is an integer so the --debug=stree - # output in Util.py can use it as an index. - self.noclean = noclean and 1 or 0 - - def set_nocache(self, nocache = 1): - """Set the Node's nocache value.""" - # Make sure nocache is an integer so the --debug=stree - # output in Util.py can use it as an index. - self.nocache = nocache and 1 or 0 - - def set_always_build(self, always_build = 1): - """Set the Node's always_build value.""" - self.always_build = always_build - - def exists(self): - """Does this node exists?""" - # All node exist by default: - return 1 - - def rexists(self): - """Does this node exist locally or in a repositiory?""" - # There are no repositories by default: - return self.exists() - - def missing(self): - return not self.is_derived() and \ - not self.linked and \ - not self.rexists() - - def remove(self): - """Remove this Node: no-op by default.""" - return None - - def add_dependency(self, depend): - """Adds dependencies.""" - try: - self._add_child(self.depends, self.depends_set, depend) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = map(str, e) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to add a non-Node dependency to %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def add_prerequisite(self, prerequisite): - """Adds prerequisites""" - self.prerequisites.extend(prerequisite) - self._children_reset() - - def add_ignore(self, depend): - """Adds dependencies to ignore.""" - try: - self._add_child(self.ignore, self.ignore_set, depend) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = map(str, e) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to ignore a non-Node dependency of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def add_source(self, source): - """Adds sources.""" - if self._specific_sources: - return - try: - self._add_child(self.sources, self.sources_set, source) - except TypeError, e: - e = e.args[0] - if SCons.Util.is_List(e): - s = map(str, e) - else: - s = str(e) - raise SCons.Errors.UserError("attempted to add a non-Node as source of %s:\n\t%s is a %s, not a Node" % (str(self), s, type(e))) - - def _add_child(self, collection, set, child): - """Adds 'child' to 'collection', first checking 'set' to see if it's - already present.""" - #if type(child) is not type([]): - # child = [child] - #for c in child: - # if not isinstance(c, Node): - # raise TypeError, c - added = None - for c in child: - if c not in set: - set.add(c) - collection.append(c) - added = 1 - if added: - self._children_reset() - - def set_specific_source(self, source): - self.add_source(source) - self._specific_sources = True - - def add_wkid(self, wkid): - """Add a node to the list of kids waiting to be evaluated""" - if self.wkids is not None: - self.wkids.append(wkid) - - def _children_reset(self): - self.clear_memoized_values() - # We need to let the Executor clear out any calculated - # build info that it's cached so we can re-calculate it. - self.executor_cleanup() - - memoizer_counters.append(SCons.Memoize.CountValue('_children_get')) - - def _children_get(self): - try: - return self._memo['children_get'] - except KeyError: - pass - - # The return list may contain duplicate Nodes, especially in - # source trees where there are a lot of repeated #includes - # of a tangle of .h files. Profiling shows, however, that - # eliminating the duplicates with a brute-force approach that - # preserves the order (that is, something like: - # - # u = [] - # for n in list: - # if n not in u: - # u.append(n)" - # - # takes more cycles than just letting the underlying methods - # hand back cached values if a Node's information is requested - # multiple times. (Other methods of removing duplicates, like - # using dictionary keys, lose the order, and the only ordered - # dictionary patterns I found all ended up using "not in" - # internally anyway...) - if self.ignore_set: - if self.implicit is None: - iter = chain(self.sources,self.depends) - else: - iter = chain(self.sources, self.depends, self.implicit) - - children = [] - for i in iter: - if i not in self.ignore_set: - children.append(i) - else: - if self.implicit is None: - children = self.sources + self.depends - else: - children = self.sources + self.depends + self.implicit - - self._memo['children_get'] = children - return children - - def all_children(self, scan=1): - """Return a list of all the node's direct children.""" - if scan: - self.scan() - - # The return list may contain duplicate Nodes, especially in - # source trees where there are a lot of repeated #includes - # of a tangle of .h files. Profiling shows, however, that - # eliminating the duplicates with a brute-force approach that - # preserves the order (that is, something like: - # - # u = [] - # for n in list: - # if n not in u: - # u.append(n)" - # - # takes more cycles than just letting the underlying methods - # hand back cached values if a Node's information is requested - # multiple times. (Other methods of removing duplicates, like - # using dictionary keys, lose the order, and the only ordered - # dictionary patterns I found all ended up using "not in" - # internally anyway...) - if self.implicit is None: - return self.sources + self.depends - else: - return self.sources + self.depends + self.implicit - - def children(self, scan=1): - """Return a list of the node's direct children, minus those - that are ignored by this node.""" - if scan: - self.scan() - return self._children_get() - - def set_state(self, state): - self.state = state - - def get_state(self): - return self.state - - def state_has_changed(self, target, prev_ni): - return (self.state != SCons.Node.up_to_date) - - def get_env(self): - env = self.env - if not env: - import SCons.Defaults - env = SCons.Defaults.DefaultEnvironment() - return env - - def changed_since_last_build(self, target, prev_ni): - """ - - Must be overridden in a specific subclass to return True if this - Node (a dependency) has changed since the last time it was used - to build the specified target. prev_ni is this Node's state (for - example, its file timestamp, length, maybe content signature) - as of the last time the target was built. - - Note that this method is called through the dependency, not the - target, because a dependency Node must be able to use its own - logic to decide if it changed. For example, File Nodes need to - obey if we're configured to use timestamps, but Python Value Nodes - never use timestamps and always use the content. If this method - were called through the target, then each Node's implementation - of this method would have to have more complicated logic to - handle all the different Node types on which it might depend. - """ - raise NotImplementedError - - def Decider(self, function): - SCons.Util.AddMethod(self, function, 'changed_since_last_build') - - def changed(self, node=None): - """ - Returns if the node is up-to-date with respect to the BuildInfo - stored last time it was built. The default behavior is to compare - it against our own previously stored BuildInfo, but the stored - BuildInfo from another Node (typically one in a Repository) - can be used instead. - - Note that we now *always* check every dependency. We used to - short-circuit the check by returning as soon as we detected - any difference, but we now rely on checking every dependency - to make sure that any necessary Node information (for example, - the content signature of an #included .h file) is updated. - """ - t = 0 - if t: Trace('changed(%s [%s], %s)' % (self, classname(self), node)) - if node is None: - node = self - - result = False - - bi = node.get_stored_info().binfo - then = bi.bsourcesigs + bi.bdependsigs + bi.bimplicitsigs - children = self.children() - - diff = len(children) - len(then) - if diff: - # The old and new dependency lists are different lengths. - # This always indicates that the Node must be rebuilt. - # We also extend the old dependency list with enough None - # entries to equal the new dependency list, for the benefit - # of the loop below that updates node information. - then.extend([None] * diff) - if t: Trace(': old %s new %s' % (len(then), len(children))) - result = True - - for child, prev_ni in izip(children, then): - if child.changed_since_last_build(self, prev_ni): - if t: Trace(': %s changed' % child) - result = True - - contents = self.get_executor().get_contents() - if self.has_builder(): - import SCons.Util - newsig = SCons.Util.MD5signature(contents) - if bi.bactsig != newsig: - if t: Trace(': bactsig %s != newsig %s' % (bi.bactsig, newsig)) - result = True - - if not result: - if t: Trace(': up to date') - - if t: Trace('\n') - - return result - - def is_up_to_date(self): - """Default check for whether the Node is current: unknown Node - subtypes are always out of date, so they will always get built.""" - return None - - def children_are_up_to_date(self): - """Alternate check for whether the Node is current: If all of - our children were up-to-date, then this Node was up-to-date, too. - - The SCons.Node.Alias and SCons.Node.Python.Value subclasses - rebind their current() method to this method.""" - # Allow the children to calculate their signatures. - self.binfo = self.get_binfo() - if self.always_build: - return None - state = 0 - for kid in self.children(None): - s = kid.get_state() - if s and (not state or s > state): - state = s - return (state == 0 or state == SCons.Node.up_to_date) - - def is_literal(self): - """Always pass the string representation of a Node to - the command interpreter literally.""" - return 1 - - def render_include_tree(self): - """ - Return a text representation, suitable for displaying to the - user, of the include tree for the sources of this node. - """ - if self.is_derived() and self.env: - env = self.get_build_env() - for s in self.sources: - scanner = self.get_source_scanner(s) - if scanner: - path = self.get_build_scanner_path(scanner) - else: - path = None - def f(node, env=env, scanner=scanner, path=path): - return node.get_found_includes(env, scanner, path) - return SCons.Util.render_tree(s, f, 1) - else: - return None - - def get_abspath(self): - """ - Return an absolute path to the Node. This will return simply - str(Node) by default, but for Node types that have a concept of - relative path, this might return something different. - """ - return str(self) - - def for_signature(self): - """ - Return a string representation of the Node that will always - be the same for this particular Node, no matter what. This - is by contrast to the __str__() method, which might, for - instance, return a relative path for a file Node. The purpose - of this method is to generate a value to be used in signature - calculation for the command line used to build a target, and - we use this method instead of str() to avoid unnecessary - rebuilds. This method does not need to return something that - would actually work in a command line; it can return any kind of - nonsense, so long as it does not change. - """ - return str(self) - - def get_string(self, for_signature): - """This is a convenience function designed primarily to be - used in command generators (i.e., CommandGeneratorActions or - Environment variables that are callable), which are called - with a for_signature argument that is nonzero if the command - generator is being called to generate a signature for the - command line, which determines if we should rebuild or not. - - Such command generators should use this method in preference - to str(Node) when converting a Node to a string, passing - in the for_signature parameter, such that we will call - Node.for_signature() or str(Node) properly, depending on whether - we are calculating a signature or actually constructing a - command line.""" - if for_signature: - return self.for_signature() - return str(self) - - def get_subst_proxy(self): - """ - This method is expected to return an object that will function - exactly like this Node, except that it implements any additional - special features that we would like to be in effect for - Environment variable substitution. The principle use is that - some Nodes would like to implement a __getattr__() method, - but putting that in the Node type itself has a tendency to kill - performance. We instead put it in a proxy and return it from - this method. It is legal for this method to return self - if no new functionality is needed for Environment substitution. - """ - return self - - def explain(self): - if not self.exists(): - return "building `%s' because it doesn't exist\n" % self - - if self.always_build: - return "rebuilding `%s' because AlwaysBuild() is specified\n" % self - - old = self.get_stored_info() - if old is None: - return None - - old = old.binfo - old.prepare_dependencies() - - try: - old_bkids = old.bsources + old.bdepends + old.bimplicit - old_bkidsigs = old.bsourcesigs + old.bdependsigs + old.bimplicitsigs - except AttributeError: - return "Cannot explain why `%s' is being rebuilt: No previous build information found\n" % self - - new = self.get_binfo() - - new_bkids = new.bsources + new.bdepends + new.bimplicit - new_bkidsigs = new.bsourcesigs + new.bdependsigs + new.bimplicitsigs - - osig = dict(izip(old_bkids, old_bkidsigs)) - nsig = dict(izip(new_bkids, new_bkidsigs)) - - # The sources and dependencies we'll want to report are all stored - # as relative paths to this target's directory, but we want to - # report them relative to the top-level SConstruct directory, - # so we only print them after running them through this lambda - # to turn them into the right relative Node and then return - # its string. - def stringify( s, E=self.dir.Entry ) : - if hasattr( s, 'dir' ) : - return str(E(s)) - return str(s) - - lines = [] - - removed = filter(lambda x, nk=new_bkids: not x in nk, old_bkids) - if removed: - removed = map(stringify, removed) - fmt = "`%s' is no longer a dependency\n" - lines.extend(map(lambda s, fmt=fmt: fmt % s, removed)) - - for k in new_bkids: - if not k in old_bkids: - lines.append("`%s' is a new dependency\n" % stringify(k)) - elif k.changed_since_last_build(self, osig[k]): - lines.append("`%s' changed\n" % stringify(k)) - - if len(lines) == 0 and old_bkids != new_bkids: - lines.append("the dependency order changed:\n" + - "%sold: %s\n" % (' '*15, map(stringify, old_bkids)) + - "%snew: %s\n" % (' '*15, map(stringify, new_bkids))) - - if len(lines) == 0: - def fmt_with_title(title, strlines): - lines = string.split(strlines, '\n') - sep = '\n' + ' '*(15 + len(title)) - return ' '*15 + title + string.join(lines, sep) + '\n' - if old.bactsig != new.bactsig: - if old.bact == new.bact: - lines.append("the contents of the build action changed\n" + - fmt_with_title('action: ', new.bact)) - else: - lines.append("the build action changed:\n" + - fmt_with_title('old: ', old.bact) + - fmt_with_title('new: ', new.bact)) - - if len(lines) == 0: - return "rebuilding `%s' for unknown reasons\n" % self - - preamble = "rebuilding `%s' because" % self - if len(lines) == 1: - return "%s %s" % (preamble, lines[0]) - else: - lines = ["%s:\n" % preamble] + lines - return string.join(lines, ' '*11) - -try: - [].extend(UserList.UserList([])) -except TypeError: - # Python 1.5.2 doesn't allow a list to be extended by list-like - # objects (such as UserList instances), so just punt and use - # real lists. - def NodeList(l): - return l -else: - class NodeList(UserList.UserList): - def __str__(self): - return str(map(str, self.data)) - -def get_children(node, parent): return node.children() -def ignore_cycle(node, stack): pass -def do_nothing(node, parent): pass - -class Walker: - """An iterator for walking a Node tree. - - This is depth-first, children are visited before the parent. - The Walker object can be initialized with any node, and - returns the next node on the descent with each next() call. - 'kids_func' is an optional function that will be called to - get the children of a node instead of calling 'children'. - 'cycle_func' is an optional function that will be called - when a cycle is detected. - - This class does not get caught in node cycles caused, for example, - by C header file include loops. - """ - def __init__(self, node, kids_func=get_children, - cycle_func=ignore_cycle, - eval_func=do_nothing): - self.kids_func = kids_func - self.cycle_func = cycle_func - self.eval_func = eval_func - node.wkids = copy.copy(kids_func(node, None)) - self.stack = [node] - self.history = {} # used to efficiently detect and avoid cycles - self.history[node] = None - - def next(self): - """Return the next node for this walk of the tree. - - This function is intentionally iterative, not recursive, - to sidestep any issues of stack size limitations. - """ - - while self.stack: - if self.stack[-1].wkids: - node = self.stack[-1].wkids.pop(0) - if not self.stack[-1].wkids: - self.stack[-1].wkids = None - if self.history.has_key(node): - self.cycle_func(node, self.stack) - else: - node.wkids = copy.copy(self.kids_func(node, self.stack[-1])) - self.stack.append(node) - self.history[node] = None - else: - node = self.stack.pop() - del self.history[node] - if node: - if self.stack: - parent = self.stack[-1] - else: - parent = None - self.eval_func(node, parent) - return node - return None - - def is_done(self): - return not self.stack - - -arg2nodes_lookups = [] - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Options/BoolOption.py b/share/scons-local-1.3.0/SCons/Options/BoolOption.py deleted file mode 100644 index f0db8c97ee71ef7b7e3a94865cce7136dc63aa51..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Options/BoolOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/BoolOption.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def BoolOption(*args, **kw): - global warned - if not warned: - msg = "The BoolOption() function is deprecated; use the BoolVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.BoolVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Options/EnumOption.py b/share/scons-local-1.3.0/SCons/Options/EnumOption.py deleted file mode 100644 index 985cff9fd243d4ba4228f558f17f1005963c7ae7..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Options/EnumOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/EnumOption.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def EnumOption(*args, **kw): - global warned - if not warned: - msg = "The EnumOption() function is deprecated; use the EnumVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.EnumVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Options/ListOption.py b/share/scons-local-1.3.0/SCons/Options/ListOption.py deleted file mode 100644 index 56c319680643b2312260d273343f669691c40937..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Options/ListOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/ListOption.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def ListOption(*args, **kw): - global warned - if not warned: - msg = "The ListOption() function is deprecated; use the ListVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.ListVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Options/PackageOption.py b/share/scons-local-1.3.0/SCons/Options/PackageOption.py deleted file mode 100644 index 597865bc477dd69ba36520d5c80f8d1beb3a8c56..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Options/PackageOption.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/PackageOption.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -def PackageOption(*args, **kw): - global warned - if not warned: - msg = "The PackageOption() function is deprecated; use the PackageVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - return apply(SCons.Variables.PackageVariable, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Options/PathOption.py b/share/scons-local-1.3.0/SCons/Options/PathOption.py deleted file mode 100644 index 04d56c268dfa819c7f65eec2c9585a6d4751a073..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Options/PathOption.py +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/PathOption.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -warned = False - -class _PathOptionClass: - def warn(self): - global warned - if not warned: - msg = "The PathOption() function is deprecated; use the PathVariable() function instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - - def __call__(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable, args, kw) - - def PathAccept(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathAccept, args, kw) - - def PathIsDir(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathIsDir, args, kw) - - def PathIsDirCreate(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathIsDirCreate, args, kw) - - def PathIsFile(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathIsFile, args, kw) - - def PathExists(self, *args, **kw): - self.warn() - return apply(SCons.Variables.PathVariable.PathExists, args, kw) - -PathOption = _PathOptionClass() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Options/__init__.py b/share/scons-local-1.3.0/SCons/Options/__init__.py deleted file mode 100644 index b4960b1d142a92d0fb3986fccfda1001d789c8f1..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Options/__init__.py +++ /dev/null @@ -1,74 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Options/__init__.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Place-holder for the old SCons.Options module hierarchy - -This is for backwards compatibility. The new equivalent is the Variables/ -class hierarchy. These will have deprecation warnings added (some day), -and will then be removed entirely (some day). -""" - -import SCons.Variables -import SCons.Warnings - -from BoolOption import BoolOption # okay -from EnumOption import EnumOption # okay -from ListOption import ListOption # naja -from PackageOption import PackageOption # naja -from PathOption import PathOption # okay - -warned = False - -class Options(SCons.Variables.Variables): - def __init__(self, *args, **kw): - global warned - if not warned: - msg = "The Options class is deprecated; use the Variables class instead." - SCons.Warnings.warn(SCons.Warnings.DeprecatedOptionsWarning, msg) - warned = True - apply(SCons.Variables.Variables.__init__, - (self,) + args, - kw) - - def AddOptions(self, *args, **kw): - return apply(SCons.Variables.Variables.AddVariables, - (self,) + args, - kw) - - def UnknownOptions(self, *args, **kw): - return apply(SCons.Variables.Variables.UnknownVariables, - (self,) + args, - kw) - - def FormatOptionHelpText(self, *args, **kw): - return apply(SCons.Variables.Variables.FormatVariableHelpText, - (self,) + args, - kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/PathList.py b/share/scons-local-1.3.0/SCons/PathList.py deleted file mode 100644 index 307edd89b568ab84bb2e36e96a4470c98f9b7278..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/PathList.py +++ /dev/null @@ -1,232 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/PathList.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """SCons.PathList - -A module for handling lists of directory paths (the sort of things -that get set as CPPPATH, LIBPATH, etc.) with as much caching of data and -efficiency as we can while still keeping the evaluation delayed so that we -Do the Right Thing (almost) regardless of how the variable is specified. - -""" - -import os -import string - -import SCons.Memoize -import SCons.Node -import SCons.Util - -# -# Variables to specify the different types of entries in a PathList object: -# - -TYPE_STRING_NO_SUBST = 0 # string with no '$' -TYPE_STRING_SUBST = 1 # string containing '$' -TYPE_OBJECT = 2 # other object - -def node_conv(obj): - """ - This is the "string conversion" routine that we have our substitutions - use to return Nodes, not strings. This relies on the fact that an - EntryProxy object has a get() method that returns the underlying - Node that it wraps, which is a bit of architectural dependence - that we might need to break or modify in the future in response to - additional requirements. - """ - try: - get = obj.get - except AttributeError: - if isinstance(obj, SCons.Node.Node) or SCons.Util.is_Sequence( obj ): - result = obj - else: - result = str(obj) - else: - result = get() - return result - -class _PathList: - """ - An actual PathList object. - """ - def __init__(self, pathlist): - """ - Initializes a PathList object, canonicalizing the input and - pre-processing it for quicker substitution later. - - The stored representation of the PathList is a list of tuples - containing (type, value), where the "type" is one of the TYPE_* - variables defined above. We distinguish between: - - strings that contain no '$' and therefore need no - delayed-evaluation string substitution (we expect that there - will be many of these and that we therefore get a pretty - big win from avoiding string substitution) - - strings that contain '$' and therefore need substitution - (the hard case is things like '${TARGET.dir}/include', - which require re-evaluation for every target + source) - - other objects (which may be something like an EntryProxy - that needs a method called to return a Node) - - Pre-identifying the type of each element in the PathList up-front - and storing the type in the list of tuples is intended to reduce - the amount of calculation when we actually do the substitution - over and over for each target. - """ - if SCons.Util.is_String(pathlist): - pathlist = string.split(pathlist, os.pathsep) - elif not SCons.Util.is_Sequence(pathlist): - pathlist = [pathlist] - - pl = [] - for p in pathlist: - try: - index = string.find(p, '$') - except (AttributeError, TypeError): - type = TYPE_OBJECT - else: - if index == -1: - type = TYPE_STRING_NO_SUBST - else: - type = TYPE_STRING_SUBST - pl.append((type, p)) - - self.pathlist = tuple(pl) - - def __len__(self): return len(self.pathlist) - - def __getitem__(self, i): return self.pathlist[i] - - def subst_path(self, env, target, source): - """ - Performs construction variable substitution on a pre-digested - PathList for a specific target and source. - """ - result = [] - for type, value in self.pathlist: - if type == TYPE_STRING_SUBST: - value = env.subst(value, target=target, source=source, - conv=node_conv) - if SCons.Util.is_Sequence(value): - result.extend(value) - continue - - elif type == TYPE_OBJECT: - value = node_conv(value) - if value: - result.append(value) - return tuple(result) - - -class PathListCache: - """ - A class to handle caching of PathList lookups. - - This class gets instantiated once and then deleted from the namespace, - so it's used as a Singleton (although we don't enforce that in the - usual Pythonic ways). We could have just made the cache a dictionary - in the module namespace, but putting it in this class allows us to - use the same Memoizer pattern that we use elsewhere to count cache - hits and misses, which is very valuable. - - Lookup keys in the cache are computed by the _PathList_key() method. - Cache lookup should be quick, so we don't spend cycles canonicalizing - all forms of the same lookup key. For example, 'x:y' and ['x', - 'y'] logically represent the same list, but we don't bother to - split string representations and treat those two equivalently. - (Note, however, that we do, treat lists and tuples the same.) - - The main type of duplication we're trying to catch will come from - looking up the same path list from two different clones of the - same construction environment. That is, given - - env2 = env1.Clone() - - both env1 and env2 will have the same CPPPATH value, and we can - cheaply avoid re-parsing both values of CPPPATH by using the - common value from this cache. - """ - if SCons.Memoize.use_memoizer: - __metaclass__ = SCons.Memoize.Memoized_Metaclass - - memoizer_counters = [] - - def __init__(self): - self._memo = {} - - def _PathList_key(self, pathlist): - """ - Returns the key for memoization of PathLists. - - Note that we want this to be pretty quick, so we don't completely - canonicalize all forms of the same list. For example, - 'dir1:$ROOT/dir2' and ['$ROOT/dir1', 'dir'] may logically - represent the same list if you're executing from $ROOT, but - we're not going to bother splitting strings into path elements, - or massaging strings into Nodes, to identify that equivalence. - We just want to eliminate obvious redundancy from the normal - case of re-using exactly the same cloned value for a path. - """ - if SCons.Util.is_Sequence(pathlist): - pathlist = tuple(SCons.Util.flatten(pathlist)) - return pathlist - - memoizer_counters.append(SCons.Memoize.CountDict('PathList', _PathList_key)) - - def PathList(self, pathlist): - """ - Returns the cached _PathList object for the specified pathlist, - creating and caching a new object as necessary. - """ - pathlist = self._PathList_key(pathlist) - try: - memo_dict = self._memo['PathList'] - except KeyError: - memo_dict = {} - self._memo['PathList'] = memo_dict - else: - try: - return memo_dict[pathlist] - except KeyError: - pass - - result = _PathList(pathlist) - - memo_dict[pathlist] = result - - return result - -PathList = PathListCache().PathList - - -del PathListCache - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/__init__.py b/share/scons-local-1.3.0/SCons/Platform/__init__.py deleted file mode 100644 index 33cad250ab2eb921f58442c1b9f414a162bb7649..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/__init__.py +++ /dev/null @@ -1,236 +0,0 @@ -"""SCons.Platform - -SCons platform selection. - -This looks for modules that define a callable object that can modify a -construction environment as appropriate for a given platform. - -Note that we take a more simplistic view of "platform" than Python does. -We're looking for a single string that determines a set of -tool-independent variables with which to initialize a construction -environment. Consequently, we'll examine both sys.platform and os.name -(and anything else that might come in to play) in order to return some -specification which is unique enough for our purposes. - -Note that because this subsysem just *selects* a callable that can -modify a construction environment, it's possible for people to define -their own "platform specification" in an arbitrary callable function. -No one needs to use or tie in to this subsystem in order to roll -their own platform definition. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/__init__.py 4720 2010/03/24 03:14:11 jars" - -import SCons.compat - -import imp -import os -import string -import sys -import tempfile - -import SCons.Errors -import SCons.Subst -import SCons.Tool - -def platform_default(): - """Return the platform string for our execution environment. - - The returned value should map to one of the SCons/Platform/*.py - files. Since we're architecture independent, though, we don't - care about the machine architecture. - """ - osname = os.name - if osname == 'java': - osname = os._osType - if osname == 'posix': - if sys.platform == 'cygwin': - return 'cygwin' - elif string.find(sys.platform, 'irix') != -1: - return 'irix' - elif string.find(sys.platform, 'sunos') != -1: - return 'sunos' - elif string.find(sys.platform, 'hp-ux') != -1: - return 'hpux' - elif string.find(sys.platform, 'aix') != -1: - return 'aix' - elif string.find(sys.platform, 'darwin') != -1: - return 'darwin' - else: - return 'posix' - elif os.name == 'os2': - return 'os2' - else: - return sys.platform - -def platform_module(name = platform_default()): - """Return the imported module for the platform. - - This looks for a module name that matches the specified argument. - If the name is unspecified, we fetch the appropriate default for - our execution environment. - """ - full_name = 'SCons.Platform.' + name - if not sys.modules.has_key(full_name): - if os.name == 'java': - eval(full_name) - else: - try: - file, path, desc = imp.find_module(name, - sys.modules['SCons.Platform'].__path__) - try: - mod = imp.load_module(full_name, file, path, desc) - finally: - if file: - file.close() - except ImportError: - try: - import zipimport - importer = zipimport.zipimporter( sys.modules['SCons.Platform'].__path__[0] ) - mod = importer.load_module(full_name) - except ImportError: - raise SCons.Errors.UserError, "No platform named '%s'" % name - setattr(SCons.Platform, name, mod) - return sys.modules[full_name] - -def DefaultToolList(platform, env): - """Select a default tool list for the specified platform. - """ - return SCons.Tool.tool_list(platform, env) - -class PlatformSpec: - def __init__(self, name): - self.name = name - - def __str__(self): - return self.name - -class TempFileMunge: - """A callable class. You can set an Environment variable to this, - then call it with a string argument, then it will perform temporary - file substitution on it. This is used to circumvent the long command - line limitation. - - Example usage: - env["TEMPFILE"] = TempFileMunge - env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}" - - By default, the name of the temporary file used begins with a - prefix of '@'. This may be configred for other tool chains by - setting '$TEMPFILEPREFIX'. - - env["TEMPFILEPREFIX"] = '-@' # diab compiler - env["TEMPFILEPREFIX"] = '-via' # arm tool chain - """ - def __init__(self, cmd): - self.cmd = cmd - - def __call__(self, target, source, env, for_signature): - if for_signature: - # If we're being called for signature calculation, it's - # because we're being called by the string expansion in - # Subst.py, which has the logic to strip any $( $) that - # may be in the command line we squirreled away. So we - # just return the raw command line and let the upper - # string substitution layers do their thing. - return self.cmd - - # Now we're actually being called because someone is actually - # going to try to execute the command, so we have to do our - # own expansion. - cmd = env.subst_list(self.cmd, SCons.Subst.SUBST_CMD, target, source)[0] - try: - maxline = int(env.subst('$MAXLINELENGTH')) - except ValueError: - maxline = 2048 - - if (reduce(lambda x, y: x + len(y), cmd, 0) + len(cmd)) <= maxline: - return self.cmd - - # We do a normpath because mktemp() has what appears to be - # a bug in Windows that will use a forward slash as a path - # delimiter. Windows's link mistakes that for a command line - # switch and barfs. - # - # We use the .lnk suffix for the benefit of the Phar Lap - # linkloc linker, which likes to append an .lnk suffix if - # none is given. - (fd, tmp) = tempfile.mkstemp('.lnk', text=True) - native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp)) - - if env['SHELL'] and env['SHELL'] == 'sh': - # The sh shell will try to escape the backslashes in the - # path, so unescape them. - native_tmp = string.replace(native_tmp, '\\', r'\\\\') - # In Cygwin, we want to use rm to delete the temporary - # file, because del does not exist in the sh shell. - rm = env.Detect('rm') or 'del' - else: - # Don't use 'rm' if the shell is not sh, because rm won't - # work with the Windows shells (cmd.exe or command.com) or - # Windows path names. - rm = 'del' - - prefix = env.subst('$TEMPFILEPREFIX') - if not prefix: - prefix = '@' - - args = map(SCons.Subst.quote_spaces, cmd[1:]) - os.write(fd, string.join(args, " ") + "\n") - os.close(fd) - # XXX Using the SCons.Action.print_actions value directly - # like this is bogus, but expedient. This class should - # really be rewritten as an Action that defines the - # __call__() and strfunction() methods and lets the - # normal action-execution logic handle whether or not to - # print/execute the action. The problem, though, is all - # of that is decided before we execute this method as - # part of expanding the $TEMPFILE construction variable. - # Consequently, refactoring this will have to wait until - # we get more flexible with allowing Actions to exist - # independently and get strung together arbitrarily like - # Ant tasks. In the meantime, it's going to be more - # user-friendly to not let obsession with architectural - # purity get in the way of just being helpful, so we'll - # reach into SCons.Action directly. - if SCons.Action.print_actions: - print("Using tempfile "+native_tmp+" for command line:\n"+ - str(cmd[0]) + " " + string.join(args," ")) - return [ cmd[0], prefix + native_tmp + '\n' + rm, native_tmp ] - -def Platform(name = platform_default()): - """Select a canned Platform specification. - """ - module = platform_module(name) - spec = PlatformSpec(name) - spec.__call__ = module.generate - return spec - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/aix.py b/share/scons-local-1.3.0/SCons/Platform/aix.py deleted file mode 100644 index 039d3d46dc52b302bfa9fe1f43639000294717a6..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/aix.py +++ /dev/null @@ -1,70 +0,0 @@ -"""engine.SCons.Platform.aix - -Platform-specific initialization for IBM AIX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/aix.py 4720 2010/03/24 03:14:11 jars" - -import os -import string - -import posix - -def get_xlc(env, xlc=None, xlc_r=None, packages=[]): - # Use the AIX package installer tool lslpp to figure out where a - # given xl* compiler is installed and what version it is. - xlcPath = None - xlcVersion = None - - if xlc is None: - xlc = env.get('CC', 'xlc') - if xlc_r is None: - xlc_r = xlc + '_r' - for package in packages: - cmd = "lslpp -fc " + package + " 2>/dev/null | egrep '" + xlc + "([^-_a-zA-Z0-9].*)?$'" - line = os.popen(cmd).readline() - if line: - v, p = string.split(line, ':')[1:3] - xlcVersion = string.split(v)[1] - xlcPath = string.split(p)[0] - xlcPath = xlcPath[:xlcPath.rindex('/')] - break - return (xlcPath, xlc, xlc_r, xlcVersion) - -def generate(env): - posix.generate(env) - #Based on AIX 5.2: ARG_MAX=24576 - 3000 for environment expansion - env['MAXLINELENGTH'] = 21576 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/cygwin.py b/share/scons-local-1.3.0/SCons/Platform/cygwin.py deleted file mode 100644 index 0105ae9c8cab3f24c68a4ce2e23e413d999d3849..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/cygwin.py +++ /dev/null @@ -1,55 +0,0 @@ -"""SCons.Platform.cygwin - -Platform-specific initialization for Cygwin systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/cygwin.py 4720 2010/03/24 03:14:11 jars" - -import posix -from SCons.Platform import TempFileMunge - -def generate(env): - posix.generate(env) - - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = [ '$LIBPREFIX', '$SHLIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - env['MAXLINELENGTH'] = 2048 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/darwin.py b/share/scons-local-1.3.0/SCons/Platform/darwin.py deleted file mode 100644 index 18c58f236146032fca20f9c5dcb4983461ae2945..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/darwin.py +++ /dev/null @@ -1,46 +0,0 @@ -"""engine.SCons.Platform.darwin - -Platform-specific initialization for Mac OS X systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/darwin.py 4720 2010/03/24 03:14:11 jars" - -import posix - -def generate(env): - posix.generate(env) - env['SHLIBSUFFIX'] = '.dylib' - env['ENV']['PATH'] = env['ENV']['PATH'] + ':/sw/bin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/hpux.py b/share/scons-local-1.3.0/SCons/Platform/hpux.py deleted file mode 100644 index d5ce3bb7d5018ab24a3511f30648ce7b3f76ebdd..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/hpux.py +++ /dev/null @@ -1,46 +0,0 @@ -"""engine.SCons.Platform.hpux - -Platform-specific initialization for HP-UX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/hpux.py 4720 2010/03/24 03:14:11 jars" - -import posix - -def generate(env): - posix.generate(env) - #Based on HP-UX11i: ARG_MAX=2048000 - 3000 for environment expansion - env['MAXLINELENGTH'] = 2045000 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/irix.py b/share/scons-local-1.3.0/SCons/Platform/irix.py deleted file mode 100644 index 95df7ebb53afd6fdea49c2690354918b381cbf75..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/irix.py +++ /dev/null @@ -1,44 +0,0 @@ -"""SCons.Platform.irix - -Platform-specific initialization for SGI IRIX systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/irix.py 4720 2010/03/24 03:14:11 jars" - -import posix - -def generate(env): - posix.generate(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/os2.py b/share/scons-local-1.3.0/SCons/Platform/os2.py deleted file mode 100644 index 973ac6b0656cbbec73a7d9585d5857ccc41ef2d4..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/os2.py +++ /dev/null @@ -1,58 +0,0 @@ -"""SCons.Platform.os2 - -Platform-specific initialization for OS/2 systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/os2.py 4720 2010/03/24 03:14:11 jars" -import win32 - -def generate(env): - if not env.has_key('ENV'): - env['ENV'] = {} - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = '$LIBPREFIX' - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['HOST_OS'] = 'os2' - env['HOST_ARCH'] = win32.get_architecture().arch - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/posix.py b/share/scons-local-1.3.0/SCons/Platform/posix.py deleted file mode 100644 index 67aef3e962f01ba9e52dd5f8c0a2afdd36866a5a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/posix.py +++ /dev/null @@ -1,264 +0,0 @@ -"""SCons.Platform.posix - -Platform-specific initialization for POSIX (Linux, UNIX, etc.) systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/posix.py 4720 2010/03/24 03:14:11 jars" - -import errno -import os -import os.path -import string -import subprocess -import sys -import select - -import SCons.Util -from SCons.Platform import TempFileMunge - -exitvalmap = { - 2 : 127, - 13 : 126, -} - -def escape(arg): - "escape shell special characters" - slash = '\\' - special = '"$()' - - arg = string.replace(arg, slash, slash+slash) - for c in special: - arg = string.replace(arg, c, slash+c) - - return '"' + arg + '"' - -def exec_system(l, env): - stat = os.system(string.join(l)) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_spawnvpe(l, env): - stat = os.spawnvpe(os.P_WAIT, l[0], l, env) - # os.spawnvpe() returns the actual exit code, not the encoding - # returned by os.waitpid() or os.system(). - return stat - -def exec_fork(l, env): - pid = os.fork() - if not pid: - # Child process. - exitval = 127 - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process. - pid, stat = os.waitpid(pid, 0) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def _get_env_command(sh, escape, cmd, args, env): - s = string.join(args) - if env: - l = ['env', '-'] + \ - map(lambda t, e=escape: e(t[0])+'='+e(t[1]), env.items()) + \ - [sh, '-c', escape(s)] - s = string.join(l) - return s - -def env_spawn(sh, escape, cmd, args, env): - return exec_system([_get_env_command( sh, escape, cmd, args, env)], env) - -def spawnvpe_spawn(sh, escape, cmd, args, env): - return exec_spawnvpe([sh, '-c', string.join(args)], env) - -def fork_spawn(sh, escape, cmd, args, env): - return exec_fork([sh, '-c', string.join(args)], env) - -def process_cmd_output(cmd_stdout, cmd_stderr, stdout, stderr): - stdout_eof = stderr_eof = 0 - while not (stdout_eof and stderr_eof): - try: - (i,o,e) = select.select([cmd_stdout, cmd_stderr], [], []) - if cmd_stdout in i: - str = cmd_stdout.read() - if len(str) == 0: - stdout_eof = 1 - elif stdout is not None: - stdout.write(str) - if cmd_stderr in i: - str = cmd_stderr.read() - if len(str) == 0: - #sys.__stderr__.write( "stderr_eof=1\n" ) - stderr_eof = 1 - else: - #sys.__stderr__.write( "str(stderr) = %s\n" % str ) - stderr.write(str) - except select.error, (_errno, _strerror): - if _errno != errno.EINTR: - raise - -def exec_popen3(l, env, stdout, stderr): - proc = subprocess.Popen(string.join(l), - stdout=stdout, - stderr=stderr, - shell=True) - stat = proc.wait() - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def exec_piped_fork(l, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - if stdout != stderr: - (rFdOut, wFdOut) = os.pipe() - (rFdErr, wFdErr) = os.pipe() - else: - (rFdOut, wFdOut) = os.pipe() - rFdErr = rFdOut - wFdErr = wFdOut - # do the fork - pid = os.fork() - if not pid: - # Child process - os.close( rFdOut ) - if rFdOut != rFdErr: - os.close( rFdErr ) - os.dup2( wFdOut, 1 ) # is there some symbolic way to do that ? - os.dup2( wFdErr, 2 ) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - exitval = 127 - try: - os.execvpe(l[0], l, env) - except OSError, e: - exitval = exitvalmap.get(e[0], e[0]) - stderr.write("scons: %s: %s\n" % (l[0], e[1])) - os._exit(exitval) - else: - # Parent process - pid, stat = os.waitpid(pid, 0) - os.close( wFdOut ) - if stdout != stderr: - os.close( wFdErr ) - childOut = os.fdopen( rFdOut ) - if stdout != stderr: - childErr = os.fdopen( rFdErr ) - else: - childErr = childOut - process_cmd_output(childOut, childErr, stdout, stderr) - os.close( rFdOut ) - if stdout != stderr: - os.close( rFdErr ) - if stat & 0xff: - return stat | 0x80 - return stat >> 8 - -def piped_env_spawn(sh, escape, cmd, args, env, stdout, stderr): - # spawn using Popen3 combined with the env command - # the command name and the command's stdout is written to stdout - # the command's stderr is written to stderr - return exec_popen3([_get_env_command(sh, escape, cmd, args, env)], - env, stdout, stderr) - -def piped_fork_spawn(sh, escape, cmd, args, env, stdout, stderr): - # spawn using fork / exec and providing a pipe for the command's - # stdout / stderr stream - return exec_piped_fork([sh, '-c', string.join(args)], - env, stdout, stderr) - - - -def generate(env): - # If os.spawnvpe() exists, we use it to spawn commands. Otherwise - # if the env utility exists, we use os.system() to spawn commands, - # finally we fall back on os.fork()/os.exec(). - # - # os.spawnvpe() is prefered because it is the most efficient. But - # for Python versions without it, os.system() is prefered because it - # is claimed that it works better with threads (i.e. -j) and is more - # efficient than forking Python. - # - # NB: Other people on the scons-users mailing list have claimed that - # os.fork()/os.exec() works better than os.system(). There may just - # not be a default that works best for all users. - - if os.__dict__.has_key('spawnvpe'): - spawn = spawnvpe_spawn - elif env.Detect('env'): - spawn = env_spawn - else: - spawn = fork_spawn - - if env.Detect('env'): - pspawn = piped_env_spawn - else: - pspawn = piped_fork_spawn - - if not env.has_key('ENV'): - env['ENV'] = {} - env['ENV']['PATH'] = '/usr/local/bin:/opt/bin:/bin:/usr/bin' - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.o' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - env['SHLIBPREFIX'] = '$LIBPREFIX' - env['SHLIBSUFFIX'] = '.so' - env['LIBPREFIXES'] = [ '$LIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX', '$SHLIBSUFFIX' ] - env['PSPAWN'] = pspawn - env['SPAWN'] = spawn - env['SHELL'] = 'sh' - env['ESCAPE'] = escape - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - #Based on LINUX: ARG_MAX=ARG_MAX=131072 - 3000 for environment expansion - #Note: specific platforms might rise or lower this value - env['MAXLINELENGTH'] = 128072 - - # This platform supports RPATH specifications. - env['__RPATH'] = '$_RPATH' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/sunos.py b/share/scons-local-1.3.0/SCons/Platform/sunos.py deleted file mode 100644 index 0a816db54e373564c4e7072e4226f85d82b5cd00..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/sunos.py +++ /dev/null @@ -1,50 +0,0 @@ -"""engine.SCons.Platform.sunos - -Platform-specific initialization for Sun systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/sunos.py 4720 2010/03/24 03:14:11 jars" - -import posix - -def generate(env): - posix.generate(env) - # Based on sunSparc 8:32bit - # ARG_MAX=1048320 - 3000 for environment expansion - env['MAXLINELENGTH'] = 1045320 - env['PKGINFO'] = 'pkginfo' - env['PKGCHK'] = '/usr/sbin/pkgchk' - env['ENV']['PATH'] = env['ENV']['PATH'] + ':/opt/SUNWspro/bin:/usr/ccs/bin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Platform/win32.py b/share/scons-local-1.3.0/SCons/Platform/win32.py deleted file mode 100644 index 14430998aeb4af6fb33585ee00dd64f53e757110..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Platform/win32.py +++ /dev/null @@ -1,386 +0,0 @@ -"""SCons.Platform.win32 - -Platform-specific initialization for Win32 systems. - -There normally shouldn't be any need to import this module directly. It -will usually be imported through the generic SCons.Platform.Platform() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Platform/win32.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path -import string -import sys -import tempfile - -from SCons.Platform.posix import exitvalmap -from SCons.Platform import TempFileMunge -import SCons.Util - -try: - import msvcrt - import win32api - import win32con - - msvcrt.get_osfhandle - win32api.SetHandleInformation - win32con.HANDLE_FLAG_INHERIT -except ImportError: - parallel_msg = \ - "you do not seem to have the pywin32 extensions installed;\n" + \ - "\tparallel (-j) builds may not work reliably with open Python files." -except AttributeError: - parallel_msg = \ - "your pywin32 extensions do not support file handle operations;\n" + \ - "\tparallel (-j) builds may not work reliably with open Python files." -else: - parallel_msg = None - - import __builtin__ - - _builtin_file = __builtin__.file - _builtin_open = __builtin__.open - - def _scons_file(*args, **kw): - fp = apply(_builtin_file, args, kw) - win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), - win32con.HANDLE_FLAG_INHERIT, - 0) - return fp - - def _scons_open(*args, **kw): - fp = apply(_builtin_open, args, kw) - win32api.SetHandleInformation(msvcrt.get_osfhandle(fp.fileno()), - win32con.HANDLE_FLAG_INHERIT, - 0) - return fp - - __builtin__.file = _scons_file - __builtin__.open = _scons_open - - - -# The upshot of all this is that, if you are using Python 1.5.2, -# you had better have cmd or command.com in your PATH when you run -# scons. - -def piped_spawn(sh, escape, cmd, args, env, stdout, stderr): - # There is no direct way to do that in python. What we do - # here should work for most cases: - # In case stdout (stderr) is not redirected to a file, - # we redirect it into a temporary file tmpFileStdout - # (tmpFileStderr) and copy the contents of this file - # to stdout (stderr) given in the argument - if not sh: - sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") - return 127 - else: - # one temporary file for stdout and stderr - tmpFileStdout = os.path.normpath(tempfile.mktemp()) - tmpFileStderr = os.path.normpath(tempfile.mktemp()) - - # check if output is redirected - stdoutRedirected = 0 - stderrRedirected = 0 - for arg in args: - # are there more possibilities to redirect stdout ? - if (string.find( arg, ">", 0, 1 ) != -1 or - string.find( arg, "1>", 0, 2 ) != -1): - stdoutRedirected = 1 - # are there more possibilities to redirect stderr ? - if string.find( arg, "2>", 0, 2 ) != -1: - stderrRedirected = 1 - - # redirect output of non-redirected streams to our tempfiles - if stdoutRedirected == 0: - args.append(">" + str(tmpFileStdout)) - if stderrRedirected == 0: - args.append("2>" + str(tmpFileStderr)) - - # actually do the spawn - try: - args = [sh, '/C', escape(string.join(args)) ] - ret = os.spawnve(os.P_WAIT, sh, args, env) - except OSError, e: - # catch any error - try: - ret = exitvalmap[e[0]] - except KeyError: - sys.stderr.write("scons: unknown OSError exception code %d - %s: %s\n" % (e[0], cmd, e[1])) - if stderr is not None: - stderr.write("scons: %s: %s\n" % (cmd, e[1])) - # copy child output from tempfiles to our streams - # and do clean up stuff - if stdout is not None and stdoutRedirected == 0: - try: - stdout.write(open( tmpFileStdout, "r" ).read()) - os.remove( tmpFileStdout ) - except (IOError, OSError): - pass - - if stderr is not None and stderrRedirected == 0: - try: - stderr.write(open( tmpFileStderr, "r" ).read()) - os.remove( tmpFileStderr ) - except (IOError, OSError): - pass - return ret - -def exec_spawn(l, env): - try: - result = os.spawnve(os.P_WAIT, l[0], l, env) - except OSError, e: - try: - result = exitvalmap[e[0]] - sys.stderr.write("scons: %s: %s\n" % (l[0], e[1])) - except KeyError: - result = 127 - if len(l) > 2: - if len(l[2]) < 1000: - command = string.join(l[0:3]) - else: - command = l[0] - else: - command = l[0] - sys.stderr.write("scons: unknown OSError exception code %d - '%s': %s\n" % (e[0], command, e[1])) - return result - -def spawn(sh, escape, cmd, args, env): - if not sh: - sys.stderr.write("scons: Could not find command interpreter, is it in your PATH?\n") - return 127 - return exec_spawn([sh, '/C', escape(string.join(args))], env) - -# Windows does not allow special characters in file names anyway, so no -# need for a complex escape function, we will just quote the arg, except -# that "cmd /c" requires that if an argument ends with a backslash it -# needs to be escaped so as not to interfere with closing double quote -# that we add. -def escape(x): - if x[-1] == '\\': - x = x + '\\' - return '"' + x + '"' - -# Get the windows system directory name -_system_root = None - -def get_system_root(): - global _system_root - if _system_root is not None: - return _system_root - - # A resonable default if we can't read the registry - val = os.environ.get('SystemRoot', "C:\\WINDOWS") - - if SCons.Util.can_read_reg: - try: - # Look for Windows NT system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows NT\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - except SCons.Util.RegError: - try: - # Okay, try the Windows 9x system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - except KeyboardInterrupt: - raise - except: - pass - _system_root = val - return val - -# Get the location of the program files directory -def get_program_files_dir(): - # Now see if we can look in the registry... - val = '' - if SCons.Util.can_read_reg: - try: - # Look for Windows Program Files directory - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'ProgramFilesDir') - except SCons.Util.RegError: - val = '' - pass - - if val == '': - # A reasonable default if we can't read the registry - # (Actually, it's pretty reasonable even if we can :-) - val = os.path.join(os.path.dirname(get_system_root()),"Program Files") - - return val - - - -# Determine which windows CPU were running on. -class ArchDefinition: - """ - A class for defining architecture-specific settings and logic. - """ - def __init__(self, arch, synonyms=[]): - self.arch = arch - self.synonyms = synonyms - -SupportedArchitectureList = [ - ArchDefinition( - 'x86', - ['i386', 'i486', 'i586', 'i686'], - ), - - ArchDefinition( - 'x86_64', - ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'], - ), - - ArchDefinition( - 'ia64', - ['IA64'], - ), -] - -SupportedArchitectureMap = {} -for a in SupportedArchitectureList: - SupportedArchitectureMap[a.arch] = a - for s in a.synonyms: - SupportedArchitectureMap[s] = a - -def get_architecture(arch=None): - """Returns the definition for the specified architecture string. - - If no string is specified, the system default is returned (as defined - by the PROCESSOR_ARCHITEW6432 or PROCESSOR_ARCHITECTURE environment - variables). - """ - if arch is None: - arch = os.environ.get('PROCESSOR_ARCHITEW6432') - if not arch: - arch = os.environ.get('PROCESSOR_ARCHITECTURE') - return SupportedArchitectureMap.get(arch, ArchDefinition('', [''])) - -def generate(env): - # Attempt to find cmd.exe (for WinNT/2k/XP) or - # command.com for Win9x - cmd_interp = '' - # First see if we can look in the registry... - if SCons.Util.can_read_reg: - try: - # Look for Windows NT system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows NT\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - cmd_interp = os.path.join(val, 'System32\\cmd.exe') - except SCons.Util.RegError: - try: - # Okay, try the Windows 9x system root - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Microsoft\\Windows\\CurrentVersion') - val, tok = SCons.Util.RegQueryValueEx(k, 'SystemRoot') - cmd_interp = os.path.join(val, 'command.com') - except KeyboardInterrupt: - raise - except: - pass - - # For the special case of not having access to the registry, we - # use a temporary path and pathext to attempt to find the command - # interpreter. If we fail, we try to find the interpreter through - # the env's PATH. The problem with that is that it might not - # contain an ENV and a PATH. - if not cmd_interp: - systemroot = get_system_root() - tmp_path = systemroot + os.pathsep + \ - os.path.join(systemroot,'System32') - tmp_pathext = '.com;.exe;.bat;.cmd' - if os.environ.has_key('PATHEXT'): - tmp_pathext = os.environ['PATHEXT'] - cmd_interp = SCons.Util.WhereIs('cmd', tmp_path, tmp_pathext) - if not cmd_interp: - cmd_interp = SCons.Util.WhereIs('command', tmp_path, tmp_pathext) - - if not cmd_interp: - cmd_interp = env.Detect('cmd') - if not cmd_interp: - cmd_interp = env.Detect('command') - - - if not env.has_key('ENV'): - env['ENV'] = {} - - # Import things from the external environment to the construction - # environment's ENV. This is a potential slippery slope, because we - # *don't* want to make builds dependent on the user's environment by - # default. We're doing this for SystemRoot, though, because it's - # needed for anything that uses sockets, and seldom changes, and - # for SystemDrive because it's related. - # - # Weigh the impact carefully before adding other variables to this list. - import_env = [ 'SystemDrive', 'SystemRoot', 'TEMP', 'TMP' ] - for var in import_env: - v = os.environ.get(var) - if v: - env['ENV'][var] = v - - if not env['ENV'].has_key('COMSPEC'): - v = os.environ.get("COMSPEC") - if v: - env['ENV']['COMSPEC'] = v - - env.AppendENVPath('PATH', get_system_root() + '\System32') - - env['ENV']['PATHEXT'] = '.COM;.EXE;.BAT;.CMD' - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - env['PROGPREFIX'] = '' - env['PROGSUFFIX'] = '.exe' - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - env['SHLIBPREFIX'] = '' - env['SHLIBSUFFIX'] = '.dll' - env['LIBPREFIXES'] = [ '$LIBPREFIX' ] - env['LIBSUFFIXES'] = [ '$LIBSUFFIX' ] - env['PSPAWN'] = piped_spawn - env['SPAWN'] = spawn - env['SHELL'] = cmd_interp - env['TEMPFILE'] = TempFileMunge - env['TEMPFILEPREFIX'] = '@' - env['MAXLINELENGTH'] = 2048 - env['ESCAPE'] = escape - - env['HOST_OS'] = 'win32' - env['HOST_ARCH'] = get_architecture().arch - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/SConf.py b/share/scons-local-1.3.0/SCons/SConf.py deleted file mode 100644 index 57ec0ca24703aba079261d6848842c6cf301cbce..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/SConf.py +++ /dev/null @@ -1,1038 +0,0 @@ -"""SCons.SConf - -Autoconf-like configuration support. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/SConf.py 4720 2010/03/24 03:14:11 jars" - -import os -import re -import string -import StringIO -import sys -import traceback -import types - -import SCons.Action -import SCons.Builder -import SCons.Errors -import SCons.Job -import SCons.Node.FS -import SCons.Taskmaster -import SCons.Util -import SCons.Warnings -import SCons.Conftest - -from SCons.Debug import Trace - -# Turn off the Conftest error logging -SCons.Conftest.LogInputFiles = 0 -SCons.Conftest.LogErrorMessages = 0 - -# Set -build_type = None -build_types = ['clean', 'help'] - -def SetBuildType(type): - global build_type - build_type = type - -# to be set, if we are in dry-run mode -dryrun = 0 - -AUTO=0 # use SCons dependency scanning for up-to-date checks -FORCE=1 # force all tests to be rebuilt -CACHE=2 # force all tests to be taken from cache (raise an error, if necessary) -cache_mode = AUTO - -def SetCacheMode(mode): - """Set the Configure cache mode. mode must be one of "auto", "force", - or "cache".""" - global cache_mode - if mode == "auto": - cache_mode = AUTO - elif mode == "force": - cache_mode = FORCE - elif mode == "cache": - cache_mode = CACHE - else: - raise ValueError, "SCons.SConf.SetCacheMode: Unknown mode " + mode - -progress_display = SCons.Util.display # will be overwritten by SCons.Script -def SetProgressDisplay(display): - """Set the progress display to use (called from SCons.Script)""" - global progress_display - progress_display = display - -SConfFS = None - -_ac_build_counter = 0 # incremented, whenever TryBuild is called -_ac_config_logs = {} # all config.log files created in this build -_ac_config_hs = {} # all config.h files created in this build -sconf_global = None # current sconf object - -def _createConfigH(target, source, env): - t = open(str(target[0]), "w") - defname = re.sub('[^A-Za-z0-9_]', '_', string.upper(str(target[0]))) - t.write("""#ifndef %(DEFNAME)s_SEEN -#define %(DEFNAME)s_SEEN - -""" % {'DEFNAME' : defname}) - t.write(source[0].get_contents()) - t.write(""" -#endif /* %(DEFNAME)s_SEEN */ -""" % {'DEFNAME' : defname}) - t.close() - -def _stringConfigH(target, source, env): - return "scons: Configure: creating " + str(target[0]) - -def CreateConfigHBuilder(env): - """Called just before the building targets phase begins.""" - if len(_ac_config_hs) == 0: - return - action = SCons.Action.Action(_createConfigH, - _stringConfigH) - sconfigHBld = SCons.Builder.Builder(action=action) - env.Append( BUILDERS={'SConfigHBuilder':sconfigHBld} ) - for k in _ac_config_hs.keys(): - env.SConfigHBuilder(k, env.Value(_ac_config_hs[k])) - -class SConfWarning(SCons.Warnings.Warning): - pass -SCons.Warnings.enableWarningClass(SConfWarning) - -# some error definitions -class SConfError(SCons.Errors.UserError): - def __init__(self,msg): - SCons.Errors.UserError.__init__(self,msg) - -class ConfigureDryRunError(SConfError): - """Raised when a file or directory needs to be updated during a Configure - process, but the user requested a dry-run""" - def __init__(self,target): - if not isinstance(target, SCons.Node.FS.File): - msg = 'Cannot create configure directory "%s" within a dry-run.' % str(target) - else: - msg = 'Cannot update configure test "%s" within a dry-run.' % str(target) - SConfError.__init__(self,msg) - -class ConfigureCacheError(SConfError): - """Raised when a use explicitely requested the cache feature, but the test - is run the first time.""" - def __init__(self,target): - SConfError.__init__(self, '"%s" is not yet built and cache is forced.' % str(target)) - -# define actions for building text files -def _createSource( target, source, env ): - fd = open(str(target[0]), "w") - fd.write(source[0].get_contents()) - fd.close() -def _stringSource( target, source, env ): - return (str(target[0]) + ' <-\n |' + - string.replace( source[0].get_contents(), - '\n', "\n |" ) ) - -# python 2.2 introduces types.BooleanType -BooleanTypes = [types.IntType] -if hasattr(types, 'BooleanType'): BooleanTypes.append(types.BooleanType) - -class SConfBuildInfo(SCons.Node.FS.FileBuildInfo): - """ - Special build info for targets of configure tests. Additional members - are result (did the builder succeed last time?) and string, which - contains messages of the original build phase. - """ - result = None # -> 0/None -> no error, != 0 error - string = None # the stdout / stderr output when building the target - - def set_build_result(self, result, string): - self.result = result - self.string = string - - -class Streamer: - """ - 'Sniffer' for a file-like writable object. Similar to the unix tool tee. - """ - def __init__(self, orig): - self.orig = orig - self.s = StringIO.StringIO() - - def write(self, str): - if self.orig: - self.orig.write(str) - self.s.write(str) - - def writelines(self, lines): - for l in lines: - self.write(l + '\n') - - def getvalue(self): - """ - Return everything written to orig since the Streamer was created. - """ - return self.s.getvalue() - - def flush(self): - if self.orig: - self.orig.flush() - self.s.flush() - - -class SConfBuildTask(SCons.Taskmaster.AlwaysTask): - """ - This is almost the same as SCons.Script.BuildTask. Handles SConfErrors - correctly and knows about the current cache_mode. - """ - def display(self, message): - if sconf_global.logstream: - sconf_global.logstream.write("scons: Configure: " + message + "\n") - - def display_cached_string(self, bi): - """ - Logs the original builder messages, given the SConfBuildInfo instance - bi. - """ - if not isinstance(bi, SConfBuildInfo): - SCons.Warnings.warn(SConfWarning, - "The stored build information has an unexpected class: %s" % bi.__class__) - else: - self.display("The original builder output was:\n" + - string.replace(" |" + str(bi.string), - "\n", "\n |")) - - def failed(self): - # check, if the reason was a ConfigureDryRunError or a - # ConfigureCacheError and if yes, reraise the exception - exc_type = self.exc_info()[0] - if issubclass(exc_type, SConfError): - raise - elif issubclass(exc_type, SCons.Errors.BuildError): - # we ignore Build Errors (occurs, when a test doesn't pass) - # Clear the exception to prevent the contained traceback - # to build a reference cycle. - self.exc_clear() - else: - self.display('Caught exception while building "%s":\n' % - self.targets[0]) - try: - excepthook = sys.excepthook - except AttributeError: - # Earlier versions of Python don't have sys.excepthook... - def excepthook(type, value, tb): - traceback.print_tb(tb) - print type, value - apply(excepthook, self.exc_info()) - return SCons.Taskmaster.Task.failed(self) - - def collect_node_states(self): - # returns (is_up_to_date, cached_error, cachable) - # where is_up_to_date is 1, if the node(s) are up_to_date - # cached_error is 1, if the node(s) are up_to_date, but the - # build will fail - # cachable is 0, if some nodes are not in our cache - T = 0 - changed = False - cached_error = False - cachable = True - for t in self.targets: - if T: Trace('%s' % (t)) - bi = t.get_stored_info().binfo - if isinstance(bi, SConfBuildInfo): - if T: Trace(': SConfBuildInfo') - if cache_mode == CACHE: - t.set_state(SCons.Node.up_to_date) - if T: Trace(': set_state(up_to-date)') - else: - if T: Trace(': get_state() %s' % t.get_state()) - if T: Trace(': changed() %s' % t.changed()) - if (t.get_state() != SCons.Node.up_to_date and t.changed()): - changed = True - if T: Trace(': changed %s' % changed) - cached_error = cached_error or bi.result - else: - if T: Trace(': else') - # the node hasn't been built in a SConf context or doesn't - # exist - cachable = False - changed = ( t.get_state() != SCons.Node.up_to_date ) - if T: Trace(': changed %s' % changed) - if T: Trace('\n') - return (not changed, cached_error, cachable) - - def execute(self): - if not self.targets[0].has_builder(): - return - - sconf = sconf_global - - is_up_to_date, cached_error, cachable = self.collect_node_states() - - if cache_mode == CACHE and not cachable: - raise ConfigureCacheError(self.targets[0]) - elif cache_mode == FORCE: - is_up_to_date = 0 - - if cached_error and is_up_to_date: - self.display("Building \"%s\" failed in a previous run and all " - "its sources are up to date." % str(self.targets[0])) - binfo = self.targets[0].get_stored_info().binfo - self.display_cached_string(binfo) - raise SCons.Errors.BuildError # will be 'caught' in self.failed - elif is_up_to_date: - self.display("\"%s\" is up to date." % str(self.targets[0])) - binfo = self.targets[0].get_stored_info().binfo - self.display_cached_string(binfo) - elif dryrun: - raise ConfigureDryRunError(self.targets[0]) - else: - # note stdout and stderr are the same here - s = sys.stdout = sys.stderr = Streamer(sys.stdout) - try: - env = self.targets[0].get_build_env() - if cache_mode == FORCE: - # Set up the Decider() to force rebuilds by saying - # that every source has changed. Note that we still - # call the environment's underlying source decider so - # that the correct .sconsign info will get calculated - # and keep the build state consistent. - def force_build(dependency, target, prev_ni, - env_decider=env.decide_source): - env_decider(dependency, target, prev_ni) - return True - if env.decide_source.func_code is not force_build.func_code: - env.Decider(force_build) - env['PSTDOUT'] = env['PSTDERR'] = s - try: - sconf.cached = 0 - self.targets[0].build() - finally: - sys.stdout = sys.stderr = env['PSTDOUT'] = \ - env['PSTDERR'] = sconf.logstream - except KeyboardInterrupt: - raise - except SystemExit: - exc_value = sys.exc_info()[1] - raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code) - except Exception, e: - for t in self.targets: - binfo = t.get_binfo() - binfo.__class__ = SConfBuildInfo - binfo.set_build_result(1, s.getvalue()) - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = binfo - #sconsign_entry.ninfo = self.get_ninfo() - # We'd like to do this as follows: - # t.store_info(binfo) - # However, we need to store it as an SConfBuildInfo - # object, and store_info() will turn it into a - # regular FileNodeInfo if the target is itself a - # regular File. - sconsign = t.dir.sconsign() - sconsign.set_entry(t.name, sconsign_entry) - sconsign.merge() - raise e - else: - for t in self.targets: - binfo = t.get_binfo() - binfo.__class__ = SConfBuildInfo - binfo.set_build_result(0, s.getvalue()) - sconsign_entry = SCons.SConsign.SConsignEntry() - sconsign_entry.binfo = binfo - #sconsign_entry.ninfo = self.get_ninfo() - # We'd like to do this as follows: - # t.store_info(binfo) - # However, we need to store it as an SConfBuildInfo - # object, and store_info() will turn it into a - # regular FileNodeInfo if the target is itself a - # regular File. - sconsign = t.dir.sconsign() - sconsign.set_entry(t.name, sconsign_entry) - sconsign.merge() - -class SConfBase: - """This is simply a class to represent a configure context. After - creating a SConf object, you can call any tests. After finished with your - tests, be sure to call the Finish() method, which returns the modified - environment. - Some words about caching: In most cases, it is not necessary to cache - Test results explicitely. Instead, we use the scons dependency checking - mechanism. For example, if one wants to compile a test program - (SConf.TryLink), the compiler is only called, if the program dependencies - have changed. However, if the program could not be compiled in a former - SConf run, we need to explicitely cache this error. - """ - - def __init__(self, env, custom_tests = {}, conf_dir='$CONFIGUREDIR', - log_file='$CONFIGURELOG', config_h = None, _depth = 0): - """Constructor. Pass additional tests in the custom_tests-dictinary, - e.g. custom_tests={'CheckPrivate':MyPrivateTest}, where MyPrivateTest - defines a custom test. - Note also the conf_dir and log_file arguments (you may want to - build tests in the VariantDir, not in the SourceDir) - """ - global SConfFS - if not SConfFS: - SConfFS = SCons.Node.FS.default_fs or \ - SCons.Node.FS.FS(env.fs.pathTop) - if sconf_global is not None: - raise (SCons.Errors.UserError, - "Only one SConf object may be active at one time") - self.env = env - if log_file is not None: - log_file = SConfFS.File(env.subst(log_file)) - self.logfile = log_file - self.logstream = None - self.lastTarget = None - self.depth = _depth - self.cached = 0 # will be set, if all test results are cached - - # add default tests - default_tests = { - 'CheckCC' : CheckCC, - 'CheckCXX' : CheckCXX, - 'CheckSHCC' : CheckSHCC, - 'CheckSHCXX' : CheckSHCXX, - 'CheckFunc' : CheckFunc, - 'CheckType' : CheckType, - 'CheckTypeSize' : CheckTypeSize, - 'CheckDeclaration' : CheckDeclaration, - 'CheckHeader' : CheckHeader, - 'CheckCHeader' : CheckCHeader, - 'CheckCXXHeader' : CheckCXXHeader, - 'CheckLib' : CheckLib, - 'CheckLibWithHeader' : CheckLibWithHeader, - } - self.AddTests(default_tests) - self.AddTests(custom_tests) - self.confdir = SConfFS.Dir(env.subst(conf_dir)) - if config_h is not None: - config_h = SConfFS.File(config_h) - self.config_h = config_h - self._startup() - - def Finish(self): - """Call this method after finished with your tests: - env = sconf.Finish() - """ - self._shutdown() - return self.env - - def Define(self, name, value = None, comment = None): - """ - Define a pre processor symbol name, with the optional given value in the - current config header. - - If value is None (default), then #define name is written. If value is not - none, then #define name value is written. - - comment is a string which will be put as a C comment in the - header, to explain the meaning of the value (appropriate C comments /* and - */ will be put automatically.""" - lines = [] - if comment: - comment_str = "/* %s */" % comment - lines.append(comment_str) - - if value is not None: - define_str = "#define %s %s" % (name, value) - else: - define_str = "#define %s" % name - lines.append(define_str) - lines.append('') - - self.config_h_text = self.config_h_text + string.join(lines, '\n') - - def BuildNodes(self, nodes): - """ - Tries to build the given nodes immediately. Returns 1 on success, - 0 on error. - """ - if self.logstream is not None: - # override stdout / stderr to write in log file - oldStdout = sys.stdout - sys.stdout = self.logstream - oldStderr = sys.stderr - sys.stderr = self.logstream - - # the engine assumes the current path is the SConstruct directory ... - old_fs_dir = SConfFS.getcwd() - old_os_dir = os.getcwd() - SConfFS.chdir(SConfFS.Top, change_os_dir=1) - - # Because we take responsibility here for writing out our - # own .sconsign info (see SConfBuildTask.execute(), above), - # we override the store_info() method with a null place-holder - # so we really control how it gets written. - for n in nodes: - n.store_info = n.do_not_store_info - - ret = 1 - - try: - # ToDo: use user options for calc - save_max_drift = SConfFS.get_max_drift() - SConfFS.set_max_drift(0) - tm = SCons.Taskmaster.Taskmaster(nodes, SConfBuildTask) - # we don't want to build tests in parallel - jobs = SCons.Job.Jobs(1, tm ) - jobs.run() - for n in nodes: - state = n.get_state() - if (state != SCons.Node.executed and - state != SCons.Node.up_to_date): - # the node could not be built. we return 0 in this case - ret = 0 - finally: - SConfFS.set_max_drift(save_max_drift) - os.chdir(old_os_dir) - SConfFS.chdir(old_fs_dir, change_os_dir=0) - if self.logstream is not None: - # restore stdout / stderr - sys.stdout = oldStdout - sys.stderr = oldStderr - return ret - - def pspawn_wrapper(self, sh, escape, cmd, args, env): - """Wrapper function for handling piped spawns. - - This looks to the calling interface (in Action.py) like a "normal" - spawn, but associates the call with the PSPAWN variable from - the construction environment and with the streams to which we - want the output logged. This gets slid into the construction - environment as the SPAWN variable so Action.py doesn't have to - know or care whether it's spawning a piped command or not. - """ - return self.pspawn(sh, escape, cmd, args, env, self.logstream, self.logstream) - - - def TryBuild(self, builder, text = None, extension = ""): - """Low level TryBuild implementation. Normally you don't need to - call that - you can use TryCompile / TryLink / TryRun instead - """ - global _ac_build_counter - - # Make sure we have a PSPAWN value, and save the current - # SPAWN value. - try: - self.pspawn = self.env['PSPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing PSPAWN construction variable.') - try: - save_spawn = self.env['SPAWN'] - except KeyError: - raise SCons.Errors.UserError('Missing SPAWN construction variable.') - - nodesToBeBuilt = [] - - f = "conftest_" + str(_ac_build_counter) - pref = self.env.subst( builder.builder.prefix ) - suff = self.env.subst( builder.builder.suffix ) - target = self.confdir.File(pref + f + suff) - - try: - # Slide our wrapper into the construction environment as - # the SPAWN function. - self.env['SPAWN'] = self.pspawn_wrapper - sourcetext = self.env.Value(text) - - if text is not None: - textFile = self.confdir.File(f + extension) - textFileNode = self.env.SConfSourceBuilder(target=textFile, - source=sourcetext) - nodesToBeBuilt.extend(textFileNode) - source = textFileNode - else: - source = None - - nodes = builder(target = target, source = source) - if not SCons.Util.is_List(nodes): - nodes = [nodes] - nodesToBeBuilt.extend(nodes) - result = self.BuildNodes(nodesToBeBuilt) - - finally: - self.env['SPAWN'] = save_spawn - - _ac_build_counter = _ac_build_counter + 1 - if result: - self.lastTarget = nodes[0] - else: - self.lastTarget = None - - return result - - def TryAction(self, action, text = None, extension = ""): - """Tries to execute the given action with optional source file - contents and optional source file extension , - Returns the status (0 : failed, 1 : ok) and the contents of the - output file. - """ - builder = SCons.Builder.Builder(action=action) - self.env.Append( BUILDERS = {'SConfActionBuilder' : builder} ) - ok = self.TryBuild(self.env.SConfActionBuilder, text, extension) - del self.env['BUILDERS']['SConfActionBuilder'] - if ok: - outputStr = self.lastTarget.get_contents() - return (1, outputStr) - return (0, "") - - def TryCompile( self, text, extension): - """Compiles the program given in text to an env.Object, using extension - as file extension (e.g. '.c'). Returns 1, if compilation was - successful, 0 otherwise. The target is saved in self.lastTarget (for - further processing). - """ - return self.TryBuild(self.env.Object, text, extension) - - def TryLink( self, text, extension ): - """Compiles the program given in text to an executable env.Program, - using extension as file extension (e.g. '.c'). Returns 1, if - compilation was successful, 0 otherwise. The target is saved in - self.lastTarget (for further processing). - """ - return self.TryBuild(self.env.Program, text, extension ) - - def TryRun(self, text, extension ): - """Compiles and runs the program given in text, using extension - as file extension (e.g. '.c'). Returns (1, outputStr) on success, - (0, '') otherwise. The target (a file containing the program's stdout) - is saved in self.lastTarget (for further processing). - """ - ok = self.TryLink(text, extension) - if( ok ): - prog = self.lastTarget - pname = prog.path - output = self.confdir.File(os.path.basename(pname)+'.out') - node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ]) - ok = self.BuildNodes(node) - if ok: - outputStr = output.get_contents() - return( 1, outputStr) - return (0, "") - - class TestWrapper: - """A wrapper around Tests (to ensure sanity)""" - def __init__(self, test, sconf): - self.test = test - self.sconf = sconf - def __call__(self, *args, **kw): - if not self.sconf.active: - raise (SCons.Errors.UserError, - "Test called after sconf.Finish()") - context = CheckContext(self.sconf) - ret = apply(self.test, (context,) + args, kw) - if self.sconf.config_h is not None: - self.sconf.config_h_text = self.sconf.config_h_text + context.config_h - context.Result("error: no result") - return ret - - def AddTest(self, test_name, test_instance): - """Adds test_class to this SConf instance. It can be called with - self.test_name(...)""" - setattr(self, test_name, SConfBase.TestWrapper(test_instance, self)) - - def AddTests(self, tests): - """Adds all the tests given in the tests dictionary to this SConf - instance - """ - for name in tests.keys(): - self.AddTest(name, tests[name]) - - def _createDir( self, node ): - dirName = str(node) - if dryrun: - if not os.path.isdir( dirName ): - raise ConfigureDryRunError(dirName) - else: - if not os.path.isdir( dirName ): - os.makedirs( dirName ) - node._exists = 1 - - def _startup(self): - """Private method. Set up logstream, and set the environment - variables necessary for a piped build - """ - global _ac_config_logs - global sconf_global - global SConfFS - - self.lastEnvFs = self.env.fs - self.env.fs = SConfFS - self._createDir(self.confdir) - self.confdir.up().add_ignore( [self.confdir] ) - - if self.logfile is not None and not dryrun: - # truncate logfile, if SConf.Configure is called for the first time - # in a build - if _ac_config_logs.has_key(self.logfile): - log_mode = "a" - else: - _ac_config_logs[self.logfile] = None - log_mode = "w" - fp = open(str(self.logfile), log_mode) - self.logstream = SCons.Util.Unbuffered(fp) - # logfile may stay in a build directory, so we tell - # the build system not to override it with a eventually - # existing file with the same name in the source directory - self.logfile.dir.add_ignore( [self.logfile] ) - - tb = traceback.extract_stack()[-3-self.depth] - old_fs_dir = SConfFS.getcwd() - SConfFS.chdir(SConfFS.Top, change_os_dir=0) - self.logstream.write('file %s,line %d:\n\tConfigure(confdir = %s)\n' % - (tb[0], tb[1], str(self.confdir)) ) - SConfFS.chdir(old_fs_dir) - else: - self.logstream = None - # we use a special builder to create source files from TEXT - action = SCons.Action.Action(_createSource, - _stringSource) - sconfSrcBld = SCons.Builder.Builder(action=action) - self.env.Append( BUILDERS={'SConfSourceBuilder':sconfSrcBld} ) - self.config_h_text = _ac_config_hs.get(self.config_h, "") - self.active = 1 - # only one SConf instance should be active at a time ... - sconf_global = self - - def _shutdown(self): - """Private method. Reset to non-piped spawn""" - global sconf_global, _ac_config_hs - - if not self.active: - raise SCons.Errors.UserError, "Finish may be called only once!" - if self.logstream is not None and not dryrun: - self.logstream.write("\n") - self.logstream.close() - self.logstream = None - # remove the SConfSourceBuilder from the environment - blds = self.env['BUILDERS'] - del blds['SConfSourceBuilder'] - self.env.Replace( BUILDERS=blds ) - self.active = 0 - sconf_global = None - if not self.config_h is None: - _ac_config_hs[self.config_h] = self.config_h_text - self.env.fs = self.lastEnvFs - -class CheckContext: - """Provides a context for configure tests. Defines how a test writes to the - screen and log file. - - A typical test is just a callable with an instance of CheckContext as - first argument: - - def CheckCustom(context, ...) - context.Message('Checking my weird test ... ') - ret = myWeirdTestFunction(...) - context.Result(ret) - - Often, myWeirdTestFunction will be one of - context.TryCompile/context.TryLink/context.TryRun. The results of - those are cached, for they are only rebuild, if the dependencies have - changed. - """ - - def __init__(self, sconf): - """Constructor. Pass the corresponding SConf instance.""" - self.sconf = sconf - self.did_show_result = 0 - - # for Conftest.py: - self.vardict = {} - self.havedict = {} - self.headerfilename = None - self.config_h = "" # config_h text will be stored here - # we don't regenerate the config.h file after each test. That means, - # that tests won't be able to include the config.h file, and so - # they can't do an #ifdef HAVE_XXX_H. This shouldn't be a major - # issue, though. If it turns out, that we need to include config.h - # in tests, we must ensure, that the dependencies are worked out - # correctly. Note that we can't use Conftest.py's support for config.h, - # cause we will need to specify a builder for the config.h file ... - - def Message(self, text): - """Inform about what we are doing right now, e.g. - 'Checking for SOMETHING ... ' - """ - self.Display(text) - self.sconf.cached = 1 - self.did_show_result = 0 - - def Result(self, res): - """Inform about the result of the test. res may be an integer or a - string. In case of an integer, the written text will be 'yes' or 'no'. - The result is only displayed when self.did_show_result is not set. - """ - if type(res) in BooleanTypes: - if res: - text = "yes" - else: - text = "no" - elif type(res) == types.StringType: - text = res - else: - raise TypeError, "Expected string, int or bool, got " + str(type(res)) - - if self.did_show_result == 0: - # Didn't show result yet, do it now. - self.Display(text + "\n") - self.did_show_result = 1 - - def TryBuild(self, *args, **kw): - return apply(self.sconf.TryBuild, args, kw) - - def TryAction(self, *args, **kw): - return apply(self.sconf.TryAction, args, kw) - - def TryCompile(self, *args, **kw): - return apply(self.sconf.TryCompile, args, kw) - - def TryLink(self, *args, **kw): - return apply(self.sconf.TryLink, args, kw) - - def TryRun(self, *args, **kw): - return apply(self.sconf.TryRun, args, kw) - - def __getattr__( self, attr ): - if( attr == 'env' ): - return self.sconf.env - elif( attr == 'lastTarget' ): - return self.sconf.lastTarget - else: - raise AttributeError, "CheckContext instance has no attribute '%s'" % attr - - #### Stuff used by Conftest.py (look there for explanations). - - def BuildProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.Program, text, ext) - - def CompileProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.Object, text, ext) - - def CompileSharedObject(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $SHCC, $CPPFLAGS, etc. - return not self.TryBuild(self.env.SharedObject, text, ext) - - def RunProg(self, text, ext): - self.sconf.cached = 1 - # TODO: should use self.vardict for $CC, $CPPFLAGS, etc. - st, out = self.TryRun(text, ext) - return not st, out - - def AppendLIBS(self, lib_name_list): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Append(LIBS = lib_name_list) - return oldLIBS - - def PrependLIBS(self, lib_name_list): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Prepend(LIBS = lib_name_list) - return oldLIBS - - def SetLIBS(self, val): - oldLIBS = self.env.get( 'LIBS', [] ) - self.env.Replace(LIBS = val) - return oldLIBS - - def Display(self, msg): - if self.sconf.cached: - # We assume that Display is called twice for each test here - # once for the Checking for ... message and once for the result. - # The self.sconf.cached flag can only be set between those calls - msg = "(cached) " + msg - self.sconf.cached = 0 - progress_display(msg, append_newline=0) - self.Log("scons: Configure: " + msg + "\n") - - def Log(self, msg): - if self.sconf.logstream is not None: - self.sconf.logstream.write(msg) - - #### End of stuff used by Conftest.py. - - -def SConf(*args, **kw): - if kw.get(build_type, True): - kw['_depth'] = kw.get('_depth', 0) + 1 - for bt in build_types: - try: - del kw[bt] - except KeyError: - pass - return apply(SConfBase, args, kw) - else: - return SCons.Util.Null() - - -def CheckFunc(context, function_name, header = None, language = None): - res = SCons.Conftest.CheckFunc(context, function_name, header = header, language = language) - context.did_show_result = 1 - return not res - -def CheckType(context, type_name, includes = "", language = None): - res = SCons.Conftest.CheckType(context, type_name, - header = includes, language = language) - context.did_show_result = 1 - return not res - -def CheckTypeSize(context, type_name, includes = "", language = None, expect = None): - res = SCons.Conftest.CheckTypeSize(context, type_name, - header = includes, language = language, - expect = expect) - context.did_show_result = 1 - return res - -def CheckDeclaration(context, declaration, includes = "", language = None): - res = SCons.Conftest.CheckDeclaration(context, declaration, - includes = includes, - language = language) - context.did_show_result = 1 - return not res - -def createIncludesFromHeaders(headers, leaveLast, include_quotes = '""'): - # used by CheckHeader and CheckLibWithHeader to produce C - #include - # statements from the specified header (list) - if not SCons.Util.is_List(headers): - headers = [headers] - l = [] - if leaveLast: - lastHeader = headers[-1] - headers = headers[:-1] - else: - lastHeader = None - for s in headers: - l.append("#include %s%s%s\n" - % (include_quotes[0], s, include_quotes[1])) - return string.join(l, ''), lastHeader - -def CheckHeader(context, header, include_quotes = '<>', language = None): - """ - A test for a C or C++ header file. - """ - prog_prefix, hdr_to_check = \ - createIncludesFromHeaders(header, 1, include_quotes) - res = SCons.Conftest.CheckHeader(context, hdr_to_check, prog_prefix, - language = language, - include_quotes = include_quotes) - context.did_show_result = 1 - return not res - -def CheckCC(context): - res = SCons.Conftest.CheckCC(context) - context.did_show_result = 1 - return not res - -def CheckCXX(context): - res = SCons.Conftest.CheckCXX(context) - context.did_show_result = 1 - return not res - -def CheckSHCC(context): - res = SCons.Conftest.CheckSHCC(context) - context.did_show_result = 1 - return not res - -def CheckSHCXX(context): - res = SCons.Conftest.CheckSHCXX(context) - context.did_show_result = 1 - return not res - -# Bram: Make this function obsolete? CheckHeader() is more generic. - -def CheckCHeader(context, header, include_quotes = '""'): - """ - A test for a C header file. - """ - return CheckHeader(context, header, include_quotes, language = "C") - - -# Bram: Make this function obsolete? CheckHeader() is more generic. - -def CheckCXXHeader(context, header, include_quotes = '""'): - """ - A test for a C++ header file. - """ - return CheckHeader(context, header, include_quotes, language = "C++") - - -def CheckLib(context, library = None, symbol = "main", - header = None, language = None, autoadd = 1): - """ - A test for a library. See also CheckLibWithHeader. - Note that library may also be None to test whether the given symbol - compiles without flags. - """ - - if library == []: - library = [None] - - if not SCons.Util.is_List(library): - library = [library] - - # ToDo: accept path for the library - res = SCons.Conftest.CheckLib(context, library, symbol, header = header, - language = language, autoadd = autoadd) - context.did_show_result = 1 - return not res - -# XXX -# Bram: Can only include one header and can't use #ifdef HAVE_HEADER_H. - -def CheckLibWithHeader(context, libs, header, language, - call = None, autoadd = 1): - # ToDo: accept path for library. Support system header files. - """ - Another (more sophisticated) test for a library. - Checks, if library and header is available for language (may be 'C' - or 'CXX'). Call maybe be a valid expression _with_ a trailing ';'. - As in CheckLib, we support library=None, to test if the call compiles - without extra link flags. - """ - prog_prefix, dummy = \ - createIncludesFromHeaders(header, 0) - if libs == []: - libs = [None] - - if not SCons.Util.is_List(libs): - libs = [libs] - - res = SCons.Conftest.CheckLib(context, libs, None, prog_prefix, - call = call, language = language, autoadd = autoadd) - context.did_show_result = 1 - return not res - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/SConsign.py b/share/scons-local-1.3.0/SCons/SConsign.py deleted file mode 100644 index 8865c3db1f431789d2a6b9cd34a8da31db193149..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/SConsign.py +++ /dev/null @@ -1,381 +0,0 @@ -"""SCons.SConsign - -Writing and reading information to the .sconsign file or files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/SConsign.py 4720 2010/03/24 03:14:11 jars" - -import cPickle -import os -import os.path - -import SCons.dblite -import SCons.Warnings - -def corrupt_dblite_warning(filename): - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt .sconsign file: %s"%filename) - -SCons.dblite.ignore_corrupt_dbfiles = 1 -SCons.dblite.corruption_warning = corrupt_dblite_warning - -#XXX Get rid of the global array so this becomes re-entrant. -sig_files = [] - -# Info for the database SConsign implementation (now the default): -# "DataBase" is a dictionary that maps top-level SConstruct directories -# to open database handles. -# "DB_Module" is the Python database module to create the handles. -# "DB_Name" is the base name of the database file (minus any -# extension the underlying DB module will add). -DataBase = {} -DB_Module = SCons.dblite -DB_Name = ".sconsign" -DB_sync_list = [] - -def Get_DataBase(dir): - global DataBase, DB_Module, DB_Name - top = dir.fs.Top - if not os.path.isabs(DB_Name) and top.repositories: - mode = "c" - for d in [top] + top.repositories: - if dir.is_under(d): - try: - return DataBase[d], mode - except KeyError: - path = d.entry_abspath(DB_Name) - try: db = DataBase[d] = DB_Module.open(path, mode) - except (IOError, OSError): pass - else: - if mode != "r": - DB_sync_list.append(db) - return db, mode - mode = "r" - try: - return DataBase[top], "c" - except KeyError: - db = DataBase[top] = DB_Module.open(DB_Name, "c") - DB_sync_list.append(db) - return db, "c" - except TypeError: - print "DataBase =", DataBase - raise - -def Reset(): - """Reset global state. Used by unit tests that end up using - SConsign multiple times to get a clean slate for each test.""" - global sig_files, DB_sync_list - sig_files = [] - DB_sync_list = [] - -normcase = os.path.normcase - -def write(): - global sig_files - for sig_file in sig_files: - sig_file.write(sync=0) - for db in DB_sync_list: - try: - syncmethod = db.sync - except AttributeError: - pass # Not all anydbm modules have sync() methods. - else: - syncmethod() - -class SConsignEntry: - """ - Wrapper class for the generic entry in a .sconsign file. - The Node subclass populates it with attributes as it pleases. - - XXX As coded below, we do expect a '.binfo' attribute to be added, - but we'll probably generalize this in the next refactorings. - """ - current_version_id = 1 - def __init__(self): - # Create an object attribute from the class attribute so it ends up - # in the pickled data in the .sconsign file. - _version_id = self.current_version_id - def convert_to_sconsign(self): - self.binfo.convert_to_sconsign() - def convert_from_sconsign(self, dir, name): - self.binfo.convert_from_sconsign(dir, name) - -class Base: - """ - This is the controlling class for the signatures for the collection of - entries associated with a specific directory. The actual directory - association will be maintained by a subclass that is specific to - the underlying storage method. This class provides a common set of - methods for fetching and storing the individual bits of information - that make up signature entry. - """ - def __init__(self): - self.entries = {} - self.dirty = False - self.to_be_merged = {} - - def get_entry(self, filename): - """ - Fetch the specified entry attribute. - """ - return self.entries[filename] - - def set_entry(self, filename, obj): - """ - Set the entry. - """ - self.entries[filename] = obj - self.dirty = True - - def do_not_set_entry(self, filename, obj): - pass - - def store_info(self, filename, node): - entry = node.get_stored_info() - entry.binfo.merge(node.get_binfo()) - self.to_be_merged[filename] = node - self.dirty = True - - def do_not_store_info(self, filename, node): - pass - - def merge(self): - for key, node in self.to_be_merged.items(): - entry = node.get_stored_info() - try: - ninfo = entry.ninfo - except AttributeError: - # This happens with SConf Nodes, because the configuration - # subsystem takes direct control over how the build decision - # is made and its information stored. - pass - else: - ninfo.merge(node.get_ninfo()) - self.entries[key] = entry - self.to_be_merged = {} - -class DB(Base): - """ - A Base subclass that reads and writes signature information - from a global .sconsign.db* file--the actual file suffix is - determined by the database module. - """ - def __init__(self, dir): - Base.__init__(self) - - self.dir = dir - - db, mode = Get_DataBase(dir) - - # Read using the path relative to the top of the Repository - # (self.dir.tpath) from which we're fetching the signature - # information. - path = normcase(dir.tpath) - try: - rawentries = db[path] - except KeyError: - pass - else: - try: - self.entries = cPickle.loads(rawentries) - if type(self.entries) is not type({}): - self.entries = {} - raise TypeError - except KeyboardInterrupt: - raise - except Exception, e: - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.tpath, e)) - for key, entry in self.entries.items(): - entry.convert_from_sconsign(dir, key) - - if mode == "r": - # This directory is actually under a repository, which means - # likely they're reaching in directly for a dependency on - # a file there. Don't actually set any entry info, so we - # won't try to write to that .sconsign.dblite file. - self.set_entry = self.do_not_set_entry - self.store_info = self.do_not_store_info - - global sig_files - sig_files.append(self) - - def write(self, sync=1): - if not self.dirty: - return - - self.merge() - - db, mode = Get_DataBase(self.dir) - - # Write using the path relative to the top of the SConstruct - # directory (self.dir.path), not relative to the top of - # the Repository; we only write to our own .sconsign file, - # not to .sconsign files in Repositories. - path = normcase(self.dir.path) - for key, entry in self.entries.items(): - entry.convert_to_sconsign() - db[path] = cPickle.dumps(self.entries, 1) - - if sync: - try: - syncmethod = db.sync - except AttributeError: - # Not all anydbm modules have sync() methods. - pass - else: - syncmethod() - -class Dir(Base): - def __init__(self, fp=None, dir=None): - """ - fp - file pointer to read entries from - """ - Base.__init__(self) - - if not fp: - return - - self.entries = cPickle.load(fp) - if type(self.entries) is not type({}): - self.entries = {} - raise TypeError - - if dir: - for key, entry in self.entries.items(): - entry.convert_from_sconsign(dir, key) - -class DirFile(Dir): - """ - Encapsulates reading and writing a per-directory .sconsign file. - """ - def __init__(self, dir): - """ - dir - the directory for the file - """ - - self.dir = dir - self.sconsign = os.path.join(dir.path, '.sconsign') - - try: - fp = open(self.sconsign, 'rb') - except IOError: - fp = None - - try: - Dir.__init__(self, fp, dir) - except KeyboardInterrupt: - raise - except: - SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, - "Ignoring corrupt .sconsign file: %s"%self.sconsign) - - global sig_files - sig_files.append(self) - - def write(self, sync=1): - """ - Write the .sconsign file to disk. - - Try to write to a temporary file first, and rename it if we - succeed. If we can't write to the temporary file, it's - probably because the directory isn't writable (and if so, - how did we build anything in this directory, anyway?), so - try to write directly to the .sconsign file as a backup. - If we can't rename, try to copy the temporary contents back - to the .sconsign file. Either way, always try to remove - the temporary file at the end. - """ - if not self.dirty: - return - - self.merge() - - temp = os.path.join(self.dir.path, '.scons%d' % os.getpid()) - try: - file = open(temp, 'wb') - fname = temp - except IOError: - try: - file = open(self.sconsign, 'wb') - fname = self.sconsign - except IOError: - return - for key, entry in self.entries.items(): - entry.convert_to_sconsign() - cPickle.dump(self.entries, file, 1) - file.close() - if fname != self.sconsign: - try: - mode = os.stat(self.sconsign)[0] - os.chmod(self.sconsign, 0666) - os.unlink(self.sconsign) - except (IOError, OSError): - # Try to carry on in the face of either OSError - # (things like permission issues) or IOError (disk - # or network issues). If there's a really dangerous - # issue, it should get re-raised by the calls below. - pass - try: - os.rename(fname, self.sconsign) - except OSError: - # An OSError failure to rename may indicate something - # like the directory has no write permission, but - # the .sconsign file itself might still be writable, - # so try writing on top of it directly. An IOError - # here, or in any of the following calls, would get - # raised, indicating something like a potentially - # serious disk or network issue. - open(self.sconsign, 'wb').write(open(fname, 'rb').read()) - os.chmod(self.sconsign, mode) - try: - os.unlink(temp) - except (IOError, OSError): - pass - -ForDirectory = DB - -def File(name, dbm_module=None): - """ - Arrange for all signatures to be stored in a global .sconsign.db* - file. - """ - global ForDirectory, DB_Name, DB_Module - if name is None: - ForDirectory = DirFile - DB_Module = None - else: - ForDirectory = DB - DB_Name = name - if not dbm_module is None: - DB_Module = dbm_module - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/C.py b/share/scons-local-1.3.0/SCons/Scanner/C.py deleted file mode 100644 index a8f4be90ebac8ff8a1422c11fe133f314604531e..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/C.py +++ /dev/null @@ -1,132 +0,0 @@ -"""SCons.Scanner.C - -This module implements the depenency scanner for C/C++ code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/C.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Node.FS -import SCons.Scanner -import SCons.Util - -import SCons.cpp - -class SConsCPPScanner(SCons.cpp.PreProcessor): - """ - SCons-specific subclass of the cpp.py module's processing. - - We subclass this so that: 1) we can deal with files represented - by Nodes, not strings; 2) we can keep track of the files that are - missing. - """ - def __init__(self, *args, **kw): - apply(SCons.cpp.PreProcessor.__init__, (self,)+args, kw) - self.missing = [] - def initialize_result(self, fname): - self.result = SCons.Util.UniqueList([fname]) - def finalize_result(self, fname): - return self.result[1:] - def find_include_file(self, t): - keyword, quote, fname = t - result = SCons.Node.FS.find_file(fname, self.searchpath[quote]) - if not result: - self.missing.append((fname, self.current_file)) - return result - def read_file(self, file): - try: - fp = open(str(file.rfile())) - except EnvironmentError, e: - self.missing.append((file, self.current_file)) - return '' - else: - return fp.read() - -def dictify_CPPDEFINES(env): - cppdefines = env.get('CPPDEFINES', {}) - if cppdefines is None: - return {} - if SCons.Util.is_Sequence(cppdefines): - result = {} - for c in cppdefines: - if SCons.Util.is_Sequence(c): - result[c[0]] = c[1] - else: - result[c] = None - return result - if not SCons.Util.is_Dict(cppdefines): - return {cppdefines : None} - return cppdefines - -class SConsCPPScannerWrapper: - """ - The SCons wrapper around a cpp.py scanner. - - This is the actual glue between the calling conventions of generic - SCons scanners, and the (subclass of) cpp.py class that knows how - to look for #include lines with reasonably real C-preprocessor-like - evaluation of #if/#ifdef/#else/#elif lines. - """ - def __init__(self, name, variable): - self.name = name - self.path = SCons.Scanner.FindPathDirs(variable) - def __call__(self, node, env, path = ()): - cpp = SConsCPPScanner(current = node.get_dir(), - cpppath = path, - dict = dictify_CPPDEFINES(env)) - result = cpp(node) - for included, includer in cpp.missing: - fmt = "No dependency generated for file: %s (included from: %s) -- file not found" - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - fmt % (included, includer)) - return result - - def recurse_nodes(self, nodes): - return nodes - def select(self, node): - return self - -def CScanner(): - """Return a prototype Scanner instance for scanning source files - that use the C pre-processor""" - - # Here's how we would (or might) use the CPP scanner code above that - # knows how to evaluate #if/#ifdef/#else/#elif lines when searching - # for #includes. This is commented out for now until we add the - # right configurability to let users pick between the scanners. - #return SConsCPPScannerWrapper("CScanner", "CPPPATH") - - cs = SCons.Scanner.ClassicCPP("CScanner", - "$CPPSUFFIXES", - "CPPPATH", - '^[ \t]*#[ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")') - return cs - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/D.py b/share/scons-local-1.3.0/SCons/Scanner/D.py deleted file mode 100644 index f657eeb8881d727b668407e3677f8565678251c2..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/D.py +++ /dev/null @@ -1,74 +0,0 @@ -"""SCons.Scanner.D - -Scanner for the Digital Mars "D" programming language. - -Coded by Andy Friesen -17 Nov 2003 - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/D.py 4720 2010/03/24 03:14:11 jars" - -import re -import string - -import SCons.Scanner - -def DScanner(): - """Return a prototype Scanner instance for scanning D source files""" - ds = D() - return ds - -class D(SCons.Scanner.Classic): - def __init__ (self): - SCons.Scanner.Classic.__init__ (self, - name = "DScanner", - suffixes = '$DSUFFIXES', - path_variable = 'DPATH', - regex = 'import\s+(?:[a-zA-Z0-9_.]+)\s*(?:,\s*(?:[a-zA-Z0-9_.]+)\s*)*;') - - self.cre2 = re.compile ('(?:import\s)?\s*([a-zA-Z0-9_.]+)\s*(?:,|;)', re.M) - - def find_include(self, include, source_dir, path): - # translate dots (package separators) to slashes - inc = string.replace(include, '.', '/') - - i = SCons.Node.FS.find_file(inc + '.d', (source_dir,) + path) - if i is None: - i = SCons.Node.FS.find_file (inc + '.di', (source_dir,) + path) - return i, include - - def find_include_names(self, node): - includes = [] - for i in self.cre.findall(node.get_text_contents()): - includes = includes + self.cre2.findall(i) - return includes - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/Dir.py b/share/scons-local-1.3.0/SCons/Scanner/Dir.py deleted file mode 100644 index bb253243753d2d8628c372e3739f27746594ea1a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/Dir.py +++ /dev/null @@ -1,111 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/Dir.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Node.FS -import SCons.Scanner - -def only_dirs(nodes): - is_Dir = lambda n: isinstance(n.disambiguate(), SCons.Node.FS.Dir) - return filter(is_Dir, nodes) - -def DirScanner(**kw): - """Return a prototype Scanner instance for scanning - directories for on-disk files""" - kw['node_factory'] = SCons.Node.FS.Entry - kw['recursive'] = only_dirs - return apply(SCons.Scanner.Base, (scan_on_disk, "DirScanner"), kw) - -def DirEntryScanner(**kw): - """Return a prototype Scanner instance for "scanning" - directory Nodes for their in-memory entries""" - kw['node_factory'] = SCons.Node.FS.Entry - kw['recursive'] = None - return apply(SCons.Scanner.Base, (scan_in_memory, "DirEntryScanner"), kw) - -skip_entry = {} - -skip_entry_list = [ - '.', - '..', - '.sconsign', - # Used by the native dblite.py module. - '.sconsign.dblite', - # Used by dbm and dumbdbm. - '.sconsign.dir', - # Used by dbm. - '.sconsign.pag', - # Used by dumbdbm. - '.sconsign.dat', - '.sconsign.bak', - # Used by some dbm emulations using Berkeley DB. - '.sconsign.db', -] - -for skip in skip_entry_list: - skip_entry[skip] = 1 - skip_entry[SCons.Node.FS._my_normcase(skip)] = 1 - -do_not_scan = lambda k: not skip_entry.has_key(k) - -def scan_on_disk(node, env, path=()): - """ - Scans a directory for on-disk files and directories therein. - - Looking up the entries will add these to the in-memory Node tree - representation of the file system, so all we have to do is just - that and then call the in-memory scanning function. - """ - try: - flist = node.fs.listdir(node.abspath) - except (IOError, OSError): - return [] - e = node.Entry - for f in filter(do_not_scan, flist): - # Add ./ to the beginning of the file name so if it begins with a - # '#' we don't look it up relative to the top-level directory. - e('./' + f) - return scan_in_memory(node, env, path) - -def scan_in_memory(node, env, path=()): - """ - "Scans" a Node.FS.Dir for its in-memory entries. - """ - try: - entries = node.entries - except AttributeError: - # It's not a Node.FS.Dir (or doesn't look enough like one for - # our purposes), which can happen if a target list containing - # mixed Node types (Dirs and Files, for example) has a Dir as - # the first entry. - return [] - entry_list = filter(do_not_scan, entries.keys()) - entry_list.sort() - return map(lambda n, e=entries: e[n], entry_list) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/Fortran.py b/share/scons-local-1.3.0/SCons/Scanner/Fortran.py deleted file mode 100644 index 158736879b6f1171c105195b9de25bcb5f47ea82..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/Fortran.py +++ /dev/null @@ -1,320 +0,0 @@ -"""SCons.Scanner.Fortran - -This module implements the dependency scanner for Fortran code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/Fortran.py 4720 2010/03/24 03:14:11 jars" - -import re -import string - -import SCons.Node -import SCons.Node.FS -import SCons.Scanner -import SCons.Util -import SCons.Warnings - -class F90Scanner(SCons.Scanner.Classic): - """ - A Classic Scanner subclass for Fortran source files which takes - into account both USE and INCLUDE statements. This scanner will - work for both F77 and F90 (and beyond) compilers. - - Currently, this scanner assumes that the include files do not contain - USE statements. To enable the ability to deal with USE statements - in include files, add logic right after the module names are found - to loop over each include file, search for and locate each USE - statement, and append each module name to the list of dependencies. - Caching the search results in a common dictionary somewhere so that - the same include file is not searched multiple times would be a - smart thing to do. - """ - - def __init__(self, name, suffixes, path_variable, - use_regex, incl_regex, def_regex, *args, **kw): - - self.cre_use = re.compile(use_regex, re.M) - self.cre_incl = re.compile(incl_regex, re.M) - self.cre_def = re.compile(def_regex, re.M) - - def _scan(node, env, path, self=self): - node = node.rfile() - - if not node.exists(): - return [] - - return self.scan(node, env, path) - - kw['function'] = _scan - kw['path_function'] = SCons.Scanner.FindPathDirs(path_variable) - kw['recursive'] = 1 - kw['skeys'] = suffixes - kw['name'] = name - - apply(SCons.Scanner.Current.__init__, (self,) + args, kw) - - def scan(self, node, env, path=()): - - # cache the includes list in node so we only scan it once: - if node.includes != None: - mods_and_includes = node.includes - else: - # retrieve all included filenames - includes = self.cre_incl.findall(node.get_text_contents()) - # retrieve all USE'd module names - modules = self.cre_use.findall(node.get_text_contents()) - # retrieve all defined module names - defmodules = self.cre_def.findall(node.get_text_contents()) - - # Remove all USE'd module names that are defined in the same file - d = {} - for m in defmodules: - d[m] = 1 - modules = filter(lambda m, d=d: not d.has_key(m), modules) - #modules = self.undefinedModules(modules, defmodules) - - # Convert module name to a .mod filename - suffix = env.subst('$FORTRANMODSUFFIX') - modules = map(lambda x, s=suffix: string.lower(x) + s, modules) - # Remove unique items from the list - mods_and_includes = SCons.Util.unique(includes+modules) - node.includes = mods_and_includes - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the USE or INCLUDE line, which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally. - nodes = [] - source_dir = node.get_dir() - if callable(path): - path = path() - for dep in mods_and_includes: - n, i = self.find_include(dep, source_dir, path) - - if n is None: - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (referenced by: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(dep) - nodes.append((sortkey, n)) - - nodes.sort() - nodes = map(lambda pair: pair[1], nodes) - return nodes - -def FortranScan(path_variable="FORTRANPATH"): - """Return a prototype Scanner instance for scanning source files - for Fortran USE & INCLUDE statements""" - -# The USE statement regex matches the following: -# -# USE module_name -# USE :: module_name -# USE, INTRINSIC :: module_name -# USE, NON_INTRINSIC :: module_name -# -# Limitations -# -# -- While the regex can handle multiple USE statements on one line, -# it cannot properly handle them if they are commented out. -# In either of the following cases: -# -# ! USE mod_a ; USE mod_b [entire line is commented out] -# USE mod_a ! ; USE mod_b [in-line comment of second USE statement] -# -# the second module name (mod_b) will be picked up as a dependency -# even though it should be ignored. The only way I can see -# to rectify this would be to modify the scanner to eliminate -# the call to re.findall, read in the contents of the file, -# treating the comment character as an end-of-line character -# in addition to the normal linefeed, loop over each line, -# weeding out the comments, and looking for the USE statements. -# One advantage to this is that the regex passed to the scanner -# would no longer need to match a semicolon. -# -# -- I question whether or not we need to detect dependencies to -# INTRINSIC modules because these are built-in to the compiler. -# If we consider them a dependency, will SCons look for them, not -# find them, and kill the build? Or will we there be standard -# compiler-specific directories we will need to point to so the -# compiler and SCons can locate the proper object and mod files? - -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# ^ : start of line -# (?: : group a collection of regex symbols without saving the match as a "group" -# ^|; : matches either the start of the line or a semicolon - semicolon -# ) : end the unsaved grouping -# \s* : any amount of white space -# USE : match the string USE, case insensitive -# (?: : group a collection of regex symbols without saving the match as a "group" -# \s+| : match one or more whitespace OR .... (the next entire grouped set of regex symbols) -# (?: : group a collection of regex symbols without saving the match as a "group" -# (?: : establish another unsaved grouping of regex symbols -# \s* : any amount of white space -# , : match a comma -# \s* : any amount of white space -# (?:NON_)? : optionally match the prefix NON_, case insensitive -# INTRINSIC : match the string INTRINSIC, case insensitive -# )? : optionally match the ", INTRINSIC/NON_INTRINSIC" grouped expression -# \s* : any amount of white space -# :: : match a double colon that must appear after the INTRINSIC/NON_INTRINSIC attribute -# ) : end the unsaved grouping -# ) : end the unsaved grouping -# \s* : match any amount of white space -# (\w+) : match the module name that is being USE'd -# -# - use_regex = "(?i)(?:^|;)\s*USE(?:\s+|(?:(?:\s*,\s*(?:NON_)?INTRINSIC)?\s*::))\s*(\w+)" - - -# The INCLUDE statement regex matches the following: -# -# INCLUDE 'some_Text' -# INCLUDE "some_Text" -# INCLUDE "some_Text" ; INCLUDE "some_Text" -# INCLUDE kind_"some_Text" -# INCLUDE kind_'some_Text" -# -# where some_Text can include any alphanumeric and/or special character -# as defined by the Fortran 2003 standard. -# -# Limitations: -# -# -- The Fortran standard dictates that a " or ' in the INCLUDE'd -# string must be represented as a "" or '', if the quotes that wrap -# the entire string are either a ' or ", respectively. While the -# regular expression below can detect the ' or " characters just fine, -# the scanning logic, presently is unable to detect them and reduce -# them to a single instance. This probably isn't an issue since, -# in practice, ' or " are not generally used in filenames. -# -# -- This regex will not properly deal with multiple INCLUDE statements -# when the entire line has been commented out, ala -# -# ! INCLUDE 'some_file' ; INCLUDE 'some_file' -# -# In such cases, it will properly ignore the first INCLUDE file, -# but will actually still pick up the second. Interestingly enough, -# the regex will properly deal with these cases: -# -# INCLUDE 'some_file' -# INCLUDE 'some_file' !; INCLUDE 'some_file' -# -# To get around the above limitation, the FORTRAN programmer could -# simply comment each INCLUDE statement separately, like this -# -# ! INCLUDE 'some_file' !; INCLUDE 'some_file' -# -# The way I see it, the only way to get around this limitation would -# be to modify the scanning logic to replace the calls to re.findall -# with a custom loop that processes each line separately, throwing -# away fully commented out lines before attempting to match against -# the INCLUDE syntax. -# -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# (?: : begin a non-saving group that matches the following: -# ^ : either the start of the line -# | : or -# ['">]\s*; : a semicolon that follows a single quote, -# double quote or greater than symbol (with any -# amount of whitespace in between). This will -# allow the regex to match multiple INCLUDE -# statements per line (although it also requires -# the positive lookahead assertion that is -# used below). It will even properly deal with -# (i.e. ignore) cases in which the additional -# INCLUDES are part of an in-line comment, ala -# " INCLUDE 'someFile' ! ; INCLUDE 'someFile2' " -# ) : end of non-saving group -# \s* : any amount of white space -# INCLUDE : match the string INCLUDE, case insensitive -# \s+ : match one or more white space characters -# (?\w+_)? : match the optional "kind-param _" prefix allowed by the standard -# [<"'] : match the include delimiter - an apostrophe, double quote, or less than symbol -# (.+?) : match one or more characters that make up -# the included path and file name and save it -# in a group. The Fortran standard allows for -# any non-control character to be used. The dot -# operator will pick up any character, including -# control codes, but I can't conceive of anyone -# putting control codes in their file names. -# The question mark indicates it is non-greedy so -# that regex will match only up to the next quote, -# double quote, or greater than symbol -# (?=["'>]) : positive lookahead assertion to match the include -# delimiter - an apostrophe, double quote, or -# greater than symbol. This level of complexity -# is required so that the include delimiter is -# not consumed by the match, thus allowing the -# sub-regex discussed above to uniquely match a -# set of semicolon-separated INCLUDE statements -# (as allowed by the F2003 standard) - - include_regex = """(?i)(?:^|['">]\s*;)\s*INCLUDE\s+(?:\w+_)?[<"'](.+?)(?=["'>])""" - -# The MODULE statement regex finds module definitions by matching -# the following: -# -# MODULE module_name -# -# but *not* the following: -# -# MODULE PROCEDURE procedure_name -# -# Here is a breakdown of the regex: -# -# (?i) : regex is case insensitive -# ^\s* : any amount of white space -# MODULE : match the string MODULE, case insensitive -# \s+ : match one or more white space characters -# (?!PROCEDURE) : but *don't* match if the next word matches -# PROCEDURE (negative lookahead assertion), -# case insensitive -# (\w+) : match one or more alphanumeric characters -# that make up the defined module name and -# save it in a group - - def_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)""" - - scanner = F90Scanner("FortranScan", - "$FORTRANSUFFIXES", - path_variable, - use_regex, - include_regex, - def_regex) - return scanner - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/IDL.py b/share/scons-local-1.3.0/SCons/Scanner/IDL.py deleted file mode 100644 index f2169f812cf673f8ae182f1643bd695ffa124471..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/IDL.py +++ /dev/null @@ -1,48 +0,0 @@ -"""SCons.Scanner.IDL - -This module implements the depenency scanner for IDL (Interface -Definition Language) files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/IDL.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Node.FS -import SCons.Scanner - -def IDLScan(): - """Return a prototype Scanner instance for scanning IDL source files""" - cs = SCons.Scanner.ClassicCPP("IDLScan", - "$IDLSUFFIXES", - "CPPPATH", - '^[ \t]*(?:#[ \t]*include|[ \t]*import)[ \t]+(<|")([^>"]+)(>|")') - return cs - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/LaTeX.py b/share/scons-local-1.3.0/SCons/Scanner/LaTeX.py deleted file mode 100644 index 01755f4b58f9df651425a60455bae97792297b39..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/LaTeX.py +++ /dev/null @@ -1,378 +0,0 @@ -"""SCons.Scanner.LaTeX - -This module implements the dependency scanner for LaTeX code. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/LaTeX.py 4720 2010/03/24 03:14:11 jars" - -import os.path -import string -import re - -import SCons.Scanner -import SCons.Util - -# list of graphics file extensions for TeX and LaTeX -TexGraphics = ['.eps', '.ps'] -LatexGraphics = ['.pdf', '.png', '.jpg', '.gif', '.tif'] - -# Used as a return value of modify_env_var if the variable is not set. -class _Null: - pass -_null = _Null - -# The user specifies the paths in env[variable], similar to other builders. -# They may be relative and must be converted to absolute, as expected -# by LaTeX and Co. The environment may already have some paths in -# env['ENV'][var]. These paths are honored, but the env[var] paths have -# higher precedence. All changes are un-done on exit. -def modify_env_var(env, var, abspath): - try: - save = env['ENV'][var] - except KeyError: - save = _null - env.PrependENVPath(var, abspath) - try: - if SCons.Util.is_List(env[var]): - #TODO(1.5) - #env.PrependENVPath(var, [os.path.abspath(str(p)) for p in env[var]]) - env.PrependENVPath(var, map(lambda p: os.path.abspath(str(p)), env[var])) - else: - # Split at os.pathsep to convert into absolute path - #TODO(1.5) env.PrependENVPath(var, [os.path.abspath(p) for p in str(env[var]).split(os.pathsep)]) - env.PrependENVPath(var, map(lambda p: os.path.abspath(p), string.split(str(env[var]), os.pathsep))) - except KeyError: - pass - - # Convert into a string explicitly to append ":" (without which it won't search system - # paths as well). The problem is that env.AppendENVPath(var, ":") - # does not work, refuses to append ":" (os.pathsep). - - if SCons.Util.is_List(env['ENV'][var]): - # TODO(1.5) - #env['ENV'][var] = os.pathsep.join(env['ENV'][var]) - env['ENV'][var] = string.join(env['ENV'][var], os.pathsep) - # Append the trailing os.pathsep character here to catch the case with no env[var] - env['ENV'][var] = env['ENV'][var] + os.pathsep - - return save - -class FindENVPathDirs: - """A class to bind a specific *PATH variable name to a function that - will return all of the *path directories.""" - def __init__(self, variable): - self.variable = variable - def __call__(self, env, dir=None, target=None, source=None, argument=None): - import SCons.PathList - try: - path = env['ENV'][self.variable] - except KeyError: - return () - - dir = dir or env.fs._cwd - path = SCons.PathList.PathList(path).subst_path(env, target, source) - return tuple(dir.Rfindalldirs(path)) - - - -def LaTeXScanner(): - """Return a prototype Scanner instance for scanning LaTeX source files - when built with latex. - """ - ds = LaTeX(name = "LaTeXScanner", - suffixes = '$LATEXSUFFIXES', - # in the search order, see below in LaTeX class docstring - graphics_extensions = TexGraphics, - recursive = 0) - return ds - -def PDFLaTeXScanner(): - """Return a prototype Scanner instance for scanning LaTeX source files - when built with pdflatex. - """ - ds = LaTeX(name = "PDFLaTeXScanner", - suffixes = '$LATEXSUFFIXES', - # in the search order, see below in LaTeX class docstring - graphics_extensions = LatexGraphics, - recursive = 0) - return ds - -class LaTeX(SCons.Scanner.Base): - """Class for scanning LaTeX files for included files. - - Unlike most scanners, which use regular expressions that just - return the included file name, this returns a tuple consisting - of the keyword for the inclusion ("include", "includegraphics", - "input", or "bibliography"), and then the file name itself. - Based on a quick look at LaTeX documentation, it seems that we - should append .tex suffix for the "include" keywords, append .tex if - there is no extension for the "input" keyword, and need to add .bib - for the "bibliography" keyword that does not accept extensions by itself. - - Finally, if there is no extension for an "includegraphics" keyword - latex will append .ps or .eps to find the file, while pdftex may use .pdf, - .jpg, .tif, .mps, or .png. - - The actual subset and search order may be altered by - DeclareGraphicsExtensions command. This complication is ignored. - The default order corresponds to experimentation with teTeX - $ latex --version - pdfeTeX 3.141592-1.21a-2.2 (Web2C 7.5.4) - kpathsea version 3.5.4 - The order is: - ['.eps', '.ps'] for latex - ['.png', '.pdf', '.jpg', '.tif']. - - Another difference is that the search path is determined by the type - of the file being searched: - env['TEXINPUTS'] for "input" and "include" keywords - env['TEXINPUTS'] for "includegraphics" keyword - env['TEXINPUTS'] for "lstinputlisting" keyword - env['BIBINPUTS'] for "bibliography" keyword - env['BSTINPUTS'] for "bibliographystyle" keyword - - FIXME: also look for the class or style in document[class|style]{} - FIXME: also look for the argument of bibliographystyle{} - """ - keyword_paths = {'include': 'TEXINPUTS', - 'input': 'TEXINPUTS', - 'includegraphics': 'TEXINPUTS', - 'bibliography': 'BIBINPUTS', - 'bibliographystyle': 'BSTINPUTS', - 'usepackage': 'TEXINPUTS', - 'lstinputlisting': 'TEXINPUTS'} - env_variables = SCons.Util.unique(keyword_paths.values()) - - def __init__(self, name, suffixes, graphics_extensions, *args, **kw): - - # We have to include \n with the % we exclude from the first part - # part of the regex because the expression is compiled with re.M. - # Without the \n, the ^ could match the beginning of a *previous* - # line followed by one or more newline characters (i.e. blank - # lines), interfering with a match on the next line. - regex = r'^[^%\n]*\\(include|includegraphics(?:\[[^\]]+\])?|lstinputlisting(?:\[[^\]]+\])?|input|bibliography|usepackage){([^}]*)}' - self.cre = re.compile(regex, re.M) - self.graphics_extensions = graphics_extensions - - def _scan(node, env, path=(), self=self): - node = node.rfile() - if not node.exists(): - return [] - return self.scan_recurse(node, path) - - class FindMultiPathDirs: - """The stock FindPathDirs function has the wrong granularity: - it is called once per target, while we need the path that depends - on what kind of included files is being searched. This wrapper - hides multiple instances of FindPathDirs, one per the LaTeX path - variable in the environment. When invoked, the function calculates - and returns all the required paths as a dictionary (converted into - a tuple to become hashable). Then the scan function converts it - back and uses a dictionary of tuples rather than a single tuple - of paths. - """ - def __init__(self, dictionary): - self.dictionary = {} - for k,n in dictionary.items(): - self.dictionary[k] = ( SCons.Scanner.FindPathDirs(n), - FindENVPathDirs(n) ) - - def __call__(self, env, dir=None, target=None, source=None, - argument=None): - di = {} - for k,(c,cENV) in self.dictionary.items(): - di[k] = ( c(env, dir=None, target=None, source=None, - argument=None) , - cENV(env, dir=None, target=None, source=None, - argument=None) ) - # To prevent "dict is not hashable error" - return tuple(di.items()) - - class LaTeXScanCheck: - """Skip all but LaTeX source files, i.e., do not scan *.eps, - *.pdf, *.jpg, etc. - """ - def __init__(self, suffixes): - self.suffixes = suffixes - def __call__(self, node, env): - current = not node.has_builder() or node.is_up_to_date() - scannable = node.get_suffix() in env.subst_list(self.suffixes)[0] - # Returning false means that the file is not scanned. - return scannable and current - - kw['function'] = _scan - kw['path_function'] = FindMultiPathDirs(LaTeX.keyword_paths) - kw['recursive'] = 0 - kw['skeys'] = suffixes - kw['scan_check'] = LaTeXScanCheck(suffixes) - kw['name'] = name - - apply(SCons.Scanner.Base.__init__, (self,) + args, kw) - - def _latex_names(self, include): - filename = include[1] - if include[0] == 'input': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.tex'] - if (include[0] == 'include'): - return [filename + '.tex'] - if include[0] == 'bibliography': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.bib'] - if include[0] == 'usepackage': - base, ext = os.path.splitext( filename ) - if ext == "": - return [filename + '.sty'] - if include[0] == 'includegraphics': - base, ext = os.path.splitext( filename ) - if ext == "": - #TODO(1.5) return [filename + e for e in self.graphics_extensions] - #return map(lambda e, f=filename: f+e, self.graphics_extensions + TexGraphics) - # use the line above to find dependency for PDF builder when only .eps figure is present - # Since it will be found if the user tell scons how to make the pdf figure leave it out for now. - return map(lambda e, f=filename: f+e, self.graphics_extensions) - return [filename] - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(str(include)) - - def find_include(self, include, source_dir, path): - try: - sub_path = path[include[0]] - except (IndexError, KeyError): - sub_path = () - try_names = self._latex_names(include) - for n in try_names: - # see if we find it using the path in env[var] - i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[0]) - if i: - return i, include - # see if we find it using the path in env['ENV'][var] - i = SCons.Node.FS.find_file(n, (source_dir,) + sub_path[1]) - if i: - return i, include - return i, include - - def scan(self, node): - # Modify the default scan function to allow for the regular - # expression to return a comma separated list of file names - # as can be the case with the bibliography keyword. - - # Cache the includes list in node so we only scan it once: - # path_dict = dict(list(path)) - noopt_cre = re.compile('\[.*$') - if node.includes != None: - includes = node.includes - else: - includes = self.cre.findall(node.get_text_contents()) - # 1. Split comma-separated lines, e.g. - # ('bibliography', 'phys,comp') - # should become two entries - # ('bibliography', 'phys') - # ('bibliography', 'comp') - # 2. Remove the options, e.g., such as - # ('includegraphics[clip,width=0.7\\linewidth]', 'picture.eps') - # should become - # ('includegraphics', 'picture.eps') - split_includes = [] - for include in includes: - inc_type = noopt_cre.sub('', include[0]) - inc_list = string.split(include[1],',') - for j in range(len(inc_list)): - split_includes.append( (inc_type, inc_list[j]) ) - # - includes = split_includes - node.includes = includes - - return includes - - def scan_recurse(self, node, path=()): - """ do a recursive scan of the top level target file - This lets us search for included files based on the - directory of the main file just as latex does""" - - path_dict = dict(list(path)) - - queue = [] - queue.extend( self.scan(node) ) - seen = {} - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the \include, \input, etc. line. - # TODO: what about the comment in the original Classic scanner: - # """which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally.""" - nodes = [] - source_dir = node.get_dir() - #for include in includes: - while queue: - - include = queue.pop() - # TODO(1.5): more compact: - #try: - # if seen[include[1]] == 1: - # continue - #except KeyError: - # seen[include[1]] = 1 - try: - already_seen = seen[include[1]] - except KeyError: - seen[include[1]] = 1 - already_seen = False - if already_seen: - continue - - # - # Handle multiple filenames in include[1] - # - n, i = self.find_include(include, source_dir, path_dict) - if n is None: - # Do not bother with 'usepackage' warnings, as they most - # likely refer to system-level files - if include[0] != 'usepackage': - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(n) - nodes.append((sortkey, n)) - # recurse down - queue.extend( self.scan(n) ) - - # - nodes.sort() - nodes = map(lambda pair: pair[1], nodes) - return nodes - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/Prog.py b/share/scons-local-1.3.0/SCons/Scanner/Prog.py deleted file mode 100644 index 395d39f67211ca248a0cb5fa1979d3073d37af75..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/Prog.py +++ /dev/null @@ -1,103 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/Prog.py 4720 2010/03/24 03:14:11 jars" - -import string - -import SCons.Node -import SCons.Node.FS -import SCons.Scanner -import SCons.Util - -# global, set by --debug=findlibs -print_find_libs = None - -def ProgramScanner(**kw): - """Return a prototype Scanner instance for scanning executable - files for static-lib dependencies""" - kw['path_function'] = SCons.Scanner.FindPathDirs('LIBPATH') - ps = apply(SCons.Scanner.Base, [scan, "ProgramScanner"], kw) - return ps - -def scan(node, env, libpath = ()): - """ - This scanner scans program files for static-library - dependencies. It will search the LIBPATH environment variable - for libraries specified in the LIBS variable, returning any - files it finds as dependencies. - """ - try: - libs = env['LIBS'] - except KeyError: - # There are no LIBS in this environment, so just return a null list: - return [] - if SCons.Util.is_String(libs): - libs = string.split(libs) - else: - libs = SCons.Util.flatten(libs) - - try: - prefix = env['LIBPREFIXES'] - if not SCons.Util.is_List(prefix): - prefix = [ prefix ] - except KeyError: - prefix = [ '' ] - - try: - suffix = env['LIBSUFFIXES'] - if not SCons.Util.is_List(suffix): - suffix = [ suffix ] - except KeyError: - suffix = [ '' ] - - pairs = [] - for suf in map(env.subst, suffix): - for pref in map(env.subst, prefix): - pairs.append((pref, suf)) - - result = [] - - if callable(libpath): - libpath = libpath() - - find_file = SCons.Node.FS.find_file - adjustixes = SCons.Util.adjustixes - for lib in libs: - if SCons.Util.is_String(lib): - lib = env.subst(lib) - for pref, suf in pairs: - l = adjustixes(lib, pref, suf) - l = find_file(l, libpath, verbose=print_find_libs) - if l: - result.append(l) - else: - result.append(lib) - - return result - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/RC.py b/share/scons-local-1.3.0/SCons/Scanner/RC.py deleted file mode 100644 index 23de58ba993f46393f81e11fa152956e4b16c5a5..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/RC.py +++ /dev/null @@ -1,55 +0,0 @@ -"""SCons.Scanner.RC - -This module implements the depenency scanner for RC (Interface -Definition Language) files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/RC.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Node.FS -import SCons.Scanner -import re - -def RCScan(): - """Return a prototype Scanner instance for scanning RC source files""" - - res_re= r'^(?:\s*#\s*(?:include)|' \ - '.*?\s+(?:ICON|BITMAP|CURSOR|HTML|FONT|MESSAGETABLE|TYPELIB|REGISTRY|D3DFX)' \ - '\s*.*?)' \ - '\s*(<|"| )([^>"\s]+)(?:[>" ])*$' - resScanner = SCons.Scanner.ClassicCPP( "ResourceScanner", - "$RCSUFFIXES", - "CPPPATH", - res_re ) - - return resScanner - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Scanner/__init__.py b/share/scons-local-1.3.0/SCons/Scanner/__init__.py deleted file mode 100644 index 987df51e020d35f7e3187e9b5fe04314041f8057..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Scanner/__init__.py +++ /dev/null @@ -1,417 +0,0 @@ -"""SCons.Scanner - -The Scanner package for the SCons software construction utility. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Scanner/__init__.py 4720 2010/03/24 03:14:11 jars" - -import re -import string - -import SCons.Node.FS -import SCons.Util - - -class _Null: - pass - -# This is used instead of None as a default argument value so None can be -# used as an actual argument value. -_null = _Null - -def Scanner(function, *args, **kw): - """ - Public interface factory function for creating different types - of Scanners based on the different types of "functions" that may - be supplied. - - TODO: Deprecate this some day. We've moved the functionality - inside the Base class and really don't need this factory function - any more. It was, however, used by some of our Tool modules, so - the call probably ended up in various people's custom modules - patterned on SCons code. - """ - if SCons.Util.is_Dict(function): - return apply(Selector, (function,) + args, kw) - else: - return apply(Base, (function,) + args, kw) - - - -class FindPathDirs: - """A class to bind a specific *PATH variable name to a function that - will return all of the *path directories.""" - def __init__(self, variable): - self.variable = variable - def __call__(self, env, dir=None, target=None, source=None, argument=None): - import SCons.PathList - try: - path = env[self.variable] - except KeyError: - return () - - dir = dir or env.fs._cwd - path = SCons.PathList.PathList(path).subst_path(env, target, source) - return tuple(dir.Rfindalldirs(path)) - - - -class Base: - """ - The base class for dependency scanners. This implements - straightforward, single-pass scanning of a single file. - """ - - def __init__(self, - function, - name = "NONE", - argument = _null, - skeys = _null, - path_function = None, - # Node.FS.Base so that, by default, it's okay for a - # scanner to return a Dir, File or Entry. - node_class = SCons.Node.FS.Base, - node_factory = None, - scan_check = None, - recursive = None): - """ - Construct a new scanner object given a scanner function. - - 'function' - a scanner function taking two or three - arguments and returning a list of strings. - - 'name' - a name for identifying this scanner object. - - 'argument' - an optional argument that, if specified, will be - passed to both the scanner function and the path_function. - - 'skeys' - an optional list argument that can be used to determine - which scanner should be used for a given Node. In the case of File - nodes, for example, the 'skeys' would be file suffixes. - - 'path_function' - a function that takes four or five arguments - (a construction environment, Node for the directory containing - the SConscript file that defined the primary target, list of - target nodes, list of source nodes, and optional argument for - this instance) and returns a tuple of the directories that can - be searched for implicit dependency files. May also return a - callable() which is called with no args and returns the tuple - (supporting Bindable class). - - 'node_class' - the class of Nodes which this scan will return. - If node_class is None, then this scanner will not enforce any - Node conversion and will return the raw results from the - underlying scanner function. - - 'node_factory' - the factory function to be called to translate - the raw results returned by the scanner function into the - expected node_class objects. - - 'scan_check' - a function to be called to first check whether - this node really needs to be scanned. - - 'recursive' - specifies that this scanner should be invoked - recursively on all of the implicit dependencies it returns - (the canonical example being #include lines in C source files). - May be a callable, which will be called to filter the list - of nodes found to select a subset for recursive scanning - (the canonical example being only recursively scanning - subdirectories within a directory). - - The scanner function's first argument will be a Node that should - be scanned for dependencies, the second argument will be an - Environment object, the third argument will be the tuple of paths - returned by the path_function, and the fourth argument will be - the value passed into 'argument', and the returned list should - contain the Nodes for all the direct dependencies of the file. - - Examples: - - s = Scanner(my_scanner_function) - - s = Scanner(function = my_scanner_function) - - s = Scanner(function = my_scanner_function, argument = 'foo') - - """ - - # Note: this class could easily work with scanner functions that take - # something other than a filename as an argument (e.g. a database - # node) and a dependencies list that aren't file names. All that - # would need to be changed is the documentation. - - self.function = function - self.path_function = path_function - self.name = name - self.argument = argument - - if skeys is _null: - if SCons.Util.is_Dict(function): - skeys = function.keys() - else: - skeys = [] - self.skeys = skeys - - self.node_class = node_class - self.node_factory = node_factory - self.scan_check = scan_check - if callable(recursive): - self.recurse_nodes = recursive - elif recursive: - self.recurse_nodes = self._recurse_all_nodes - else: - self.recurse_nodes = self._recurse_no_nodes - - def path(self, env, dir=None, target=None, source=None): - if not self.path_function: - return () - if not self.argument is _null: - return self.path_function(env, dir, target, source, self.argument) - else: - return self.path_function(env, dir, target, source) - - def __call__(self, node, env, path = ()): - """ - This method scans a single object. 'node' is the node - that will be passed to the scanner function, and 'env' is the - environment that will be passed to the scanner function. A list of - direct dependency nodes for the specified node will be returned. - """ - if self.scan_check and not self.scan_check(node, env): - return [] - - self = self.select(node) - - if not self.argument is _null: - list = self.function(node, env, path, self.argument) - else: - list = self.function(node, env, path) - - kw = {} - if hasattr(node, 'dir'): - kw['directory'] = node.dir - node_factory = env.get_factory(self.node_factory) - nodes = [] - for l in list: - if self.node_class and not isinstance(l, self.node_class): - l = apply(node_factory, (l,), kw) - nodes.append(l) - return nodes - - def __cmp__(self, other): - try: - return cmp(self.__dict__, other.__dict__) - except AttributeError: - # other probably doesn't have a __dict__ - return cmp(self.__dict__, other) - - def __hash__(self): - return id(self) - - def __str__(self): - return self.name - - def add_skey(self, skey): - """Add a skey to the list of skeys""" - self.skeys.append(skey) - - def get_skeys(self, env=None): - if env and SCons.Util.is_String(self.skeys): - return env.subst_list(self.skeys)[0] - return self.skeys - - def select(self, node): - if SCons.Util.is_Dict(self.function): - key = node.scanner_key() - try: - return self.function[key] - except KeyError: - return None - else: - return self - - def _recurse_all_nodes(self, nodes): - return nodes - - def _recurse_no_nodes(self, nodes): - return [] - - recurse_nodes = _recurse_no_nodes - - def add_scanner(self, skey, scanner): - self.function[skey] = scanner - self.add_skey(skey) - - -class Selector(Base): - """ - A class for selecting a more specific scanner based on the - scanner_key() (suffix) for a specific Node. - - TODO: This functionality has been moved into the inner workings of - the Base class, and this class will be deprecated at some point. - (It was never exposed directly as part of the public interface, - although it is used by the Scanner() factory function that was - used by various Tool modules and therefore was likely a template - for custom modules that may be out there.) - """ - def __init__(self, dict, *args, **kw): - apply(Base.__init__, (self, None,)+args, kw) - self.dict = dict - self.skeys = dict.keys() - - def __call__(self, node, env, path = ()): - return self.select(node)(node, env, path) - - def select(self, node): - try: - return self.dict[node.scanner_key()] - except KeyError: - return None - - def add_scanner(self, skey, scanner): - self.dict[skey] = scanner - self.add_skey(skey) - - -class Current(Base): - """ - A class for scanning files that are source files (have no builder) - or are derived files and are current (which implies that they exist, - either locally or in a repository). - """ - - def __init__(self, *args, **kw): - def current_check(node, env): - return not node.has_builder() or node.is_up_to_date() - kw['scan_check'] = current_check - apply(Base.__init__, (self,) + args, kw) - -class Classic(Current): - """ - A Scanner subclass to contain the common logic for classic CPP-style - include scanning, but which can be customized to use different - regular expressions to find the includes. - - Note that in order for this to work "out of the box" (without - overriding the find_include() and sort_key() methods), the regular - expression passed to the constructor must return the name of the - include file in group 0. - """ - - def __init__(self, name, suffixes, path_variable, regex, *args, **kw): - - self.cre = re.compile(regex, re.M) - - def _scan(node, env, path=(), self=self): - node = node.rfile() - if not node.exists(): - return [] - return self.scan(node, path) - - kw['function'] = _scan - kw['path_function'] = FindPathDirs(path_variable) - kw['recursive'] = 1 - kw['skeys'] = suffixes - kw['name'] = name - - apply(Current.__init__, (self,) + args, kw) - - def find_include(self, include, source_dir, path): - n = SCons.Node.FS.find_file(include, (source_dir,) + tuple(path)) - return n, include - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(include) - - def find_include_names(self, node): - return self.cre.findall(node.get_text_contents()) - - def scan(self, node, path=()): - - # cache the includes list in node so we only scan it once: - if node.includes is not None: - includes = node.includes - else: - includes = self.find_include_names (node) - # Intern the names of the include files. Saves some memory - # if the same header is included many times. - node.includes = map(SCons.Util.silent_intern, includes) - - # This is a hand-coded DSU (decorate-sort-undecorate, or - # Schwartzian transform) pattern. The sort key is the raw name - # of the file as specifed on the #include line (including the - # " or <, since that may affect what file is found), which lets - # us keep the sort order constant regardless of whether the file - # is actually found in a Repository or locally. - nodes = [] - source_dir = node.get_dir() - if callable(path): - path = path() - for include in includes: - n, i = self.find_include(include, source_dir, path) - - if n is None: - SCons.Warnings.warn(SCons.Warnings.DependencyWarning, - "No dependency generated for file: %s (included from: %s) -- file not found" % (i, node)) - else: - sortkey = self.sort_key(include) - nodes.append((sortkey, n)) - - nodes.sort() - nodes = map(lambda pair: pair[1], nodes) - return nodes - -class ClassicCPP(Classic): - """ - A Classic Scanner subclass which takes into account the type of - bracketing used to include the file, and uses classic CPP rules - for searching for the files based on the bracketing. - - Note that in order for this to work, the regular expression passed - to the constructor must return the leading bracket in group 0, and - the contained filename in group 1. - """ - def find_include(self, include, source_dir, path): - if include[0] == '"': - paths = (source_dir,) + tuple(path) - else: - paths = tuple(path) + (source_dir,) - - n = SCons.Node.FS.find_file(include[1], paths) - - i = SCons.Util.silent_intern(include[1]) - return n, i - - def sort_key(self, include): - return SCons.Node.FS._my_normcase(string.join(include)) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Script/Interactive.py b/share/scons-local-1.3.0/SCons/Script/Interactive.py deleted file mode 100644 index 6218021afd97013cb00186e5609c9afa386b7683..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Script/Interactive.py +++ /dev/null @@ -1,386 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Script/Interactive.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """ -SCons interactive mode -""" - -# TODO: -# -# This has the potential to grow into something with a really big life -# of its own, which might or might not be a good thing. Nevertheless, -# here are some enhancements that will probably be requested some day -# and are worth keeping in mind (assuming this takes off): -# -# - A command to re-read / re-load the SConscript files. This may -# involve allowing people to specify command-line options (e.g. -f, -# -I, --no-site-dir) that affect how the SConscript files are read. -# -# - Additional command-line options on the "build" command. -# -# Of the supported options that seemed to make sense (after a quick -# pass through the list), the ones that seemed likely enough to be -# used are listed in the man page and have explicit test scripts. -# -# These had code changed in Script/Main.py to support them, but didn't -# seem likely to be used regularly, so had no test scripts added: -# -# build --diskcheck=* -# build --implicit-cache=* -# build --implicit-deps-changed=* -# build --implicit-deps-unchanged=* -# -# These look like they should "just work" with no changes to the -# existing code, but like those above, look unlikely to be used and -# therefore had no test scripts added: -# -# build --random -# -# These I'm not sure about. They might be useful for individual -# "build" commands, and may even work, but they seem unlikely enough -# that we'll wait until they're requested before spending any time on -# writing test scripts for them, or investigating whether they work. -# -# build -q [??? is there a useful analog to the exit status?] -# build --duplicate= -# build --profile= -# build --max-drift= -# build --warn=* -# build --Y -# -# - Most of the SCons command-line options that the "build" command -# supports should be settable as default options that apply to all -# subsequent "build" commands. Maybe a "set {option}" command that -# maps to "SetOption('{option}')". -# -# - Need something in the 'help' command that prints the -h output. -# -# - A command to run the configure subsystem separately (must see how -# this interacts with the new automake model). -# -# - Command-line completion of target names; maybe even of SCons options? -# Completion is something that's supported by the Python cmd module, -# so this should be doable without too much trouble. -# - -import cmd -import copy -import os -import re -import shlex -import string -import sys - -try: - import readline -except ImportError: - pass - -class SConsInteractiveCmd(cmd.Cmd): - """\ - build [TARGETS] Build the specified TARGETS and their dependencies. - 'b' is a synonym. - clean [TARGETS] Clean (remove) the specified TARGETS and their - dependencies. 'c' is a synonym. - exit Exit SCons interactive mode. - help [COMMAND] Prints help for the specified COMMAND. 'h' and - '?' are synonyms. - shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and '!' - are synonyms. - version Prints SCons version information. - """ - - synonyms = { - 'b' : 'build', - 'c' : 'clean', - 'h' : 'help', - 'scons' : 'build', - 'sh' : 'shell', - } - - def __init__(self, **kw): - cmd.Cmd.__init__(self) - for key, val in kw.items(): - setattr(self, key, val) - - if sys.platform == 'win32': - self.shell_variable = 'COMSPEC' - else: - self.shell_variable = 'SHELL' - - def default(self, argv): - print "*** Unknown command: %s" % argv[0] - - def onecmd(self, line): - line = string.strip(line) - if not line: - print self.lastcmd - return self.emptyline() - self.lastcmd = line - if line[0] == '!': - line = 'shell ' + line[1:] - elif line[0] == '?': - line = 'help ' + line[1:] - if os.sep == '\\': - line = string.replace(line, '\\', '\\\\') - argv = shlex.split(line) - argv[0] = self.synonyms.get(argv[0], argv[0]) - if not argv[0]: - return self.default(line) - else: - try: - func = getattr(self, 'do_' + argv[0]) - except AttributeError: - return self.default(argv) - return func(argv) - - def do_build(self, argv): - """\ - build [TARGETS] Build the specified TARGETS and their - dependencies. 'b' is a synonym. - """ - import SCons.Node - import SCons.SConsign - import SCons.Script.Main - - options = copy.deepcopy(self.options) - - options, targets = self.parser.parse_args(argv[1:], values=options) - - SCons.Script.COMMAND_LINE_TARGETS = targets - - if targets: - SCons.Script.BUILD_TARGETS = targets - else: - # If the user didn't specify any targets on the command line, - # use the list of default targets. - SCons.Script.BUILD_TARGETS = SCons.Script._build_plus_default - - nodes = SCons.Script.Main._build_targets(self.fs, - options, - targets, - self.target_top) - - if not nodes: - return - - # Call each of the Node's alter_targets() methods, which may - # provide additional targets that ended up as part of the build - # (the canonical example being a VariantDir() when we're building - # from a source directory) and which we therefore need their - # state cleared, too. - x = [] - for n in nodes: - x.extend(n.alter_targets()[0]) - nodes.extend(x) - - # Clean up so that we can perform the next build correctly. - # - # We do this by walking over all the children of the targets, - # and clearing their state. - # - # We currently have to re-scan each node to find their - # children, because built nodes have already been partially - # cleared and don't remember their children. (In scons - # 0.96.1 and earlier, this wasn't the case, and we didn't - # have to re-scan the nodes.) - # - # Because we have to re-scan each node, we can't clear the - # nodes as we walk over them, because we may end up rescanning - # a cleared node as we scan a later node. Therefore, only - # store the list of nodes that need to be cleared as we walk - # the tree, and clear them in a separate pass. - # - # XXX: Someone more familiar with the inner workings of scons - # may be able to point out a more efficient way to do this. - - SCons.Script.Main.progress_display("scons: Clearing cached node information ...") - - seen_nodes = {} - - def get_unseen_children(node, parent, seen_nodes=seen_nodes): - def is_unseen(node, seen_nodes=seen_nodes): - return not seen_nodes.has_key(node) - return filter(is_unseen, node.children(scan=1)) - - def add_to_seen_nodes(node, parent, seen_nodes=seen_nodes): - seen_nodes[node] = 1 - - # If this file is in a VariantDir and has a - # corresponding source file in the source tree, remember the - # node in the source tree, too. This is needed in - # particular to clear cached implicit dependencies on the - # source file, since the scanner will scan it if the - # VariantDir was created with duplicate=0. - try: - rfile_method = node.rfile - except AttributeError: - return - else: - rfile = rfile_method() - if rfile != node: - seen_nodes[rfile] = 1 - - for node in nodes: - walker = SCons.Node.Walker(node, - kids_func=get_unseen_children, - eval_func=add_to_seen_nodes) - n = walker.next() - while n: - n = walker.next() - - for node in seen_nodes.keys(): - # Call node.clear() to clear most of the state - node.clear() - # node.clear() doesn't reset node.state, so call - # node.set_state() to reset it manually - node.set_state(SCons.Node.no_state) - node.implicit = None - - # Debug: Uncomment to verify that all Taskmaster reference - # counts have been reset to zero. - #if node.ref_count != 0: - # from SCons.Debug import Trace - # Trace('node %s, ref_count %s !!!\n' % (node, node.ref_count)) - - SCons.SConsign.Reset() - SCons.Script.Main.progress_display("scons: done clearing node information.") - - def do_clean(self, argv): - """\ - clean [TARGETS] Clean (remove) the specified TARGETS - and their dependencies. 'c' is a synonym. - """ - return self.do_build(['build', '--clean'] + argv[1:]) - - def do_EOF(self, argv): - print - self.do_exit(argv) - - def _do_one_help(self, arg): - try: - # If help_() exists, then call it. - func = getattr(self, 'help_' + arg) - except AttributeError: - try: - func = getattr(self, 'do_' + arg) - except AttributeError: - doc = None - else: - doc = self._doc_to_help(func) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - else: - doc = self.strip_initial_spaces(func()) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - - def _doc_to_help(self, obj): - doc = obj.__doc__ - if doc is None: - return '' - return self._strip_initial_spaces(doc) - - def _strip_initial_spaces(self, s): - #lines = s.split('\n') - lines = string.split(s, '\n') - spaces = re.match(' *', lines[0]).group(0) - #def strip_spaces(l): - # if l.startswith(spaces): - # l = l[len(spaces):] - # return l - #return '\n'.join([ strip_spaces(l) for l in lines ]) - def strip_spaces(l, spaces=spaces): - if l[:len(spaces)] == spaces: - l = l[len(spaces):] - return l - lines = map(strip_spaces, lines) - return string.join(lines, '\n') - - def do_exit(self, argv): - """\ - exit Exit SCons interactive mode. - """ - sys.exit(0) - - def do_help(self, argv): - """\ - help [COMMAND] Prints help for the specified COMMAND. 'h' - and '?' are synonyms. - """ - if argv[1:]: - for arg in argv[1:]: - if self._do_one_help(arg): - break - else: - # If bare 'help' is called, print this class's doc - # string (if it has one). - doc = self._doc_to_help(self.__class__) - if doc: - sys.stdout.write(doc + '\n') - sys.stdout.flush() - - def do_shell(self, argv): - """\ - shell [COMMANDLINE] Execute COMMANDLINE in a subshell. 'sh' and - '!' are synonyms. - """ - import subprocess - argv = argv[1:] - if not argv: - argv = os.environ[self.shell_variable] - try: - # Per "[Python-Dev] subprocess insufficiently platform-independent?" - # http://mail.python.org/pipermail/python-dev/2008-August/081979.html "+ - # Doing the right thing with an argument list currently - # requires different shell= values on Windows and Linux. - p = subprocess.Popen(argv, shell=(sys.platform=='win32')) - except EnvironmentError, e: - sys.stderr.write('scons: %s: %s\n' % (argv[0], e.strerror)) - else: - p.wait() - - def do_version(self, argv): - """\ - version Prints SCons version information. - """ - sys.stdout.write(self.parser.version + '\n') - -def interact(fs, parser, options, targets, target_top): - c = SConsInteractiveCmd(prompt = 'scons>>> ', - fs = fs, - parser = parser, - options = options, - targets = targets, - target_top = target_top) - c.cmdloop() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Script/Main.py b/share/scons-local-1.3.0/SCons/Script/Main.py deleted file mode 100644 index 74a28f2e7573401bb6fdb0c2eb61edf44a8cbea0..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Script/Main.py +++ /dev/null @@ -1,1360 +0,0 @@ -"""SCons.Script - -This file implements the main() function used by the scons script. - -Architecturally, this *is* the scons script, and will likely only be -called from the external "scons" wrapper. Consequently, anything here -should not be, or be considered, part of the build engine. If it's -something that we expect other software to want to use, it should go in -some other module. If it's specific to the "scons" script invocation, -it goes here. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Script/Main.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path -import string -import sys -import time -import traceback - -# Strip the script directory from sys.path() so on case-insensitive -# (Windows) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own version directory so, if -# if they're there, we pick up the right version of the build engine -# modules. -#sys.path = [os.path.join(sys.prefix, -# 'lib', -# 'scons-%d' % SCons.__version__)] + sys.path[1:] - -import SCons.CacheDir -import SCons.Debug -import SCons.Defaults -import SCons.Environment -import SCons.Errors -import SCons.Job -import SCons.Node -import SCons.Node.FS -import SCons.SConf -import SCons.Script -import SCons.Taskmaster -import SCons.Util -import SCons.Warnings - -import SCons.Script.Interactive - -def fetch_win32_parallel_msg(): - # A subsidiary function that exists solely to isolate this import - # so we don't have to pull it in on all platforms, and so that an - # in-line "import" statement in the _main() function below doesn't - # cause warnings about local names shadowing use of the 'SCons' - # globl in nest scopes and UnboundLocalErrors and the like in some - # versions (2.1) of Python. - import SCons.Platform.win32 - return SCons.Platform.win32.parallel_msg - -# - -class SConsPrintHelpException(Exception): - pass - -display = SCons.Util.display -progress_display = SCons.Util.DisplayEngine() - -first_command_start = None -last_command_end = None - -class Progressor: - prev = '' - count = 0 - target_string = '$TARGET' - - def __init__(self, obj, interval=1, file=None, overwrite=False): - if file is None: - file = sys.stdout - - self.obj = obj - self.file = file - self.interval = interval - self.overwrite = overwrite - - if callable(obj): - self.func = obj - elif SCons.Util.is_List(obj): - self.func = self.spinner - elif string.find(obj, self.target_string) != -1: - self.func = self.replace_string - else: - self.func = self.string - - def write(self, s): - self.file.write(s) - self.file.flush() - self.prev = s - - def erase_previous(self): - if self.prev: - length = len(self.prev) - if self.prev[-1] in ('\n', '\r'): - length = length - 1 - self.write(' ' * length + '\r') - self.prev = '' - - def spinner(self, node): - self.write(self.obj[self.count % len(self.obj)]) - - def string(self, node): - self.write(self.obj) - - def replace_string(self, node): - self.write(string.replace(self.obj, self.target_string, str(node))) - - def __call__(self, node): - self.count = self.count + 1 - if (self.count % self.interval) == 0: - if self.overwrite: - self.erase_previous() - self.func(node) - -ProgressObject = SCons.Util.Null() - -def Progress(*args, **kw): - global ProgressObject - ProgressObject = apply(Progressor, args, kw) - -# Task control. -# - -_BuildFailures = [] - -def GetBuildFailures(): - return _BuildFailures - -class BuildTask(SCons.Taskmaster.OutOfDateTask): - """An SCons build task.""" - progress = ProgressObject - - def display(self, message): - display('scons: ' + message) - - def prepare(self): - self.progress(self.targets[0]) - return SCons.Taskmaster.OutOfDateTask.prepare(self) - - def needs_execute(self): - if SCons.Taskmaster.OutOfDateTask.needs_execute(self): - return True - if self.top and self.targets[0].has_builder(): - display("scons: `%s' is up to date." % str(self.node)) - return False - - def execute(self): - if print_time: - start_time = time.time() - global first_command_start - if first_command_start is None: - first_command_start = start_time - SCons.Taskmaster.OutOfDateTask.execute(self) - if print_time: - global cumulative_command_time - global last_command_end - finish_time = time.time() - last_command_end = finish_time - cumulative_command_time = cumulative_command_time+finish_time-start_time - sys.stdout.write("Command execution time: %f seconds\n"%(finish_time-start_time)) - - def do_failed(self, status=2): - _BuildFailures.append(self.exception[1]) - global exit_status - global this_build_status - if self.options.ignore_errors: - SCons.Taskmaster.OutOfDateTask.executed(self) - elif self.options.keep_going: - SCons.Taskmaster.OutOfDateTask.fail_continue(self) - exit_status = status - this_build_status = status - else: - SCons.Taskmaster.OutOfDateTask.fail_stop(self) - exit_status = status - this_build_status = status - - def executed(self): - t = self.targets[0] - if self.top and not t.has_builder() and not t.side_effect: - if not t.exists(): - def classname(obj): - return string.split(str(obj.__class__), '.')[-1] - if classname(t) in ('File', 'Dir', 'Entry'): - errstr="Do not know how to make %s target `%s' (%s)." % (classname(t), t, t.abspath) - else: # Alias or Python or ... - errstr="Do not know how to make %s target `%s'." % (classname(t), t) - sys.stderr.write("scons: *** " + errstr) - if not self.options.keep_going: - sys.stderr.write(" Stop.") - sys.stderr.write("\n") - try: - raise SCons.Errors.BuildError(t, errstr) - except KeyboardInterrupt: - raise - except: - self.exception_set() - self.do_failed() - else: - print "scons: Nothing to be done for `%s'." % t - SCons.Taskmaster.OutOfDateTask.executed(self) - else: - SCons.Taskmaster.OutOfDateTask.executed(self) - - def failed(self): - # Handle the failure of a build task. The primary purpose here - # is to display the various types of Errors and Exceptions - # appropriately. - exc_info = self.exc_info() - try: - t, e, tb = exc_info - except ValueError: - t, e = exc_info - tb = None - - if t is None: - # The Taskmaster didn't record an exception for this Task; - # see if the sys module has one. - try: - t, e, tb = sys.exc_info()[:] - except ValueError: - t, e = exc_info - tb = None - - # Deprecated string exceptions will have their string stored - # in the first entry of the tuple. - if e is None: - e = t - - buildError = SCons.Errors.convert_to_BuildError(e) - if not buildError.node: - buildError.node = self.node - - node = buildError.node - if not SCons.Util.is_List(node): - node = [ node ] - nodename = string.join(map(str, node), ', ') - - errfmt = "scons: *** [%s] %s\n" - sys.stderr.write(errfmt % (nodename, buildError)) - - if (buildError.exc_info[2] and buildError.exc_info[1] and - # TODO(1.5) - #not isinstance( - # buildError.exc_info[1], - # (EnvironmentError, SCons.Errors.StopError, SCons.Errors.UserError))): - not isinstance(buildError.exc_info[1], EnvironmentError) and - not isinstance(buildError.exc_info[1], SCons.Errors.StopError) and - not isinstance(buildError.exc_info[1], SCons.Errors.UserError)): - type, value, trace = buildError.exc_info - traceback.print_exception(type, value, trace) - elif tb and print_stacktrace: - sys.stderr.write("scons: internal stack trace:\n") - traceback.print_tb(tb, file=sys.stderr) - - self.exception = (e, buildError, tb) # type, value, traceback - self.do_failed(buildError.exitstatus) - - self.exc_clear() - - def postprocess(self): - if self.top: - t = self.targets[0] - for tp in self.options.tree_printers: - tp.display(t) - if self.options.debug_includes: - tree = t.render_include_tree() - if tree: - print - print tree - SCons.Taskmaster.OutOfDateTask.postprocess(self) - - def make_ready(self): - """Make a task ready for execution""" - SCons.Taskmaster.OutOfDateTask.make_ready(self) - if self.out_of_date and self.options.debug_explain: - explanation = self.out_of_date[0].explain() - if explanation: - sys.stdout.write("scons: " + explanation) - -class CleanTask(SCons.Taskmaster.AlwaysTask): - """An SCons clean task.""" - def fs_delete(self, path, pathstr, remove=1): - try: - if os.path.lexists(path): - if os.path.isfile(path) or os.path.islink(path): - if remove: os.unlink(path) - display("Removed " + pathstr) - elif os.path.isdir(path) and not os.path.islink(path): - # delete everything in the dir - entries = os.listdir(path) - # Sort for deterministic output (os.listdir() Can - # return entries in a random order). - entries.sort() - for e in entries: - p = os.path.join(path, e) - s = os.path.join(pathstr, e) - if os.path.isfile(p): - if remove: os.unlink(p) - display("Removed " + s) - else: - self.fs_delete(p, s, remove) - # then delete dir itself - if remove: os.rmdir(path) - display("Removed directory " + pathstr) - else: - errstr = "Path '%s' exists but isn't a file or directory." - raise SCons.Errors.UserError(errstr % (pathstr)) - except SCons.Errors.UserError, e: - print e - except (IOError, OSError), e: - print "scons: Could not remove '%s':" % pathstr, e.strerror - - def show(self): - target = self.targets[0] - if (target.has_builder() or target.side_effect) and not target.noclean: - for t in self.targets: - if not t.isdir(): - display("Removed " + str(t)) - if SCons.Environment.CleanTargets.has_key(target): - files = SCons.Environment.CleanTargets[target] - for f in files: - self.fs_delete(f.abspath, str(f), 0) - - def remove(self): - target = self.targets[0] - if (target.has_builder() or target.side_effect) and not target.noclean: - for t in self.targets: - try: - removed = t.remove() - except OSError, e: - # An OSError may indicate something like a permissions - # issue, an IOError would indicate something like - # the file not existing. In either case, print a - # message and keep going to try to remove as many - # targets aa possible. - print "scons: Could not remove '%s':" % str(t), e.strerror - else: - if removed: - display("Removed " + str(t)) - if SCons.Environment.CleanTargets.has_key(target): - files = SCons.Environment.CleanTargets[target] - for f in files: - self.fs_delete(f.abspath, str(f)) - - execute = remove - - # We want the Taskmaster to update the Node states (and therefore - # handle reference counts, etc.), but we don't want to call - # back to the Node's post-build methods, which would do things - # we don't want, like store .sconsign information. - executed = SCons.Taskmaster.Task.executed_without_callbacks - - # Have the taskmaster arrange to "execute" all of the targets, because - # we'll figure out ourselves (in remove() or show() above) whether - # anything really needs to be done. - make_ready = SCons.Taskmaster.Task.make_ready_all - - def prepare(self): - pass - -class QuestionTask(SCons.Taskmaster.AlwaysTask): - """An SCons task for the -q (question) option.""" - def prepare(self): - pass - - def execute(self): - if self.targets[0].get_state() != SCons.Node.up_to_date or \ - (self.top and not self.targets[0].exists()): - global exit_status - global this_build_status - exit_status = 1 - this_build_status = 1 - self.tm.stop() - - def executed(self): - pass - - -class TreePrinter: - def __init__(self, derived=False, prune=False, status=False): - self.derived = derived - self.prune = prune - self.status = status - def get_all_children(self, node): - return node.all_children() - def get_derived_children(self, node): - children = node.all_children(None) - return filter(lambda x: x.has_builder(), children) - def display(self, t): - if self.derived: - func = self.get_derived_children - else: - func = self.get_all_children - s = self.status and 2 or 0 - SCons.Util.print_tree(t, func, prune=self.prune, showtags=s) - - -def python_version_string(): - return string.split(sys.version)[0] - -def python_version_unsupported(version=sys.version_info): - return version < (1, 5, 2) - -def python_version_deprecated(version=sys.version_info): - return version < (2, 4, 0) - - -# Global variables - -print_objects = 0 -print_memoizer = 0 -print_stacktrace = 0 -print_time = 0 -sconscript_time = 0 -cumulative_command_time = 0 -exit_status = 0 # final exit status, assume success by default -this_build_status = 0 # "exit status" of an individual build -num_jobs = None -delayed_warnings = [] - -class FakeOptionParser: - """ - A do-nothing option parser, used for the initial OptionsParser variable. - - During normal SCons operation, the OptionsParser is created right - away by the main() function. Certain tests scripts however, can - introspect on different Tool modules, the initialization of which - can try to add a new, local option to an otherwise uninitialized - OptionsParser object. This allows that introspection to happen - without blowing up. - - """ - class FakeOptionValues: - def __getattr__(self, attr): - return None - values = FakeOptionValues() - def add_local_option(self, *args, **kw): - pass - -OptionsParser = FakeOptionParser() - -def AddOption(*args, **kw): - if not kw.has_key('default'): - kw['default'] = None - result = apply(OptionsParser.add_local_option, args, kw) - return result - -def GetOption(name): - return getattr(OptionsParser.values, name) - -def SetOption(name, value): - return OptionsParser.values.set_option(name, value) - -# -class Stats: - def __init__(self): - self.stats = [] - self.labels = [] - self.append = self.do_nothing - self.print_stats = self.do_nothing - def enable(self, outfp): - self.outfp = outfp - self.append = self.do_append - self.print_stats = self.do_print - def do_nothing(self, *args, **kw): - pass - -class CountStats(Stats): - def do_append(self, label): - self.labels.append(label) - self.stats.append(SCons.Debug.fetchLoggedInstances()) - def do_print(self): - stats_table = {} - for s in self.stats: - for n in map(lambda t: t[0], s): - stats_table[n] = [0, 0, 0, 0] - i = 0 - for s in self.stats: - for n, c in s: - stats_table[n][i] = c - i = i + 1 - keys = stats_table.keys() - keys.sort() - self.outfp.write("Object counts:\n") - pre = [" "] - post = [" %s\n"] - l = len(self.stats) - fmt1 = string.join(pre + [' %7s']*l + post, '') - fmt2 = string.join(pre + [' %7d']*l + post, '') - labels = self.labels[:l] - labels.append(("", "Class")) - self.outfp.write(fmt1 % tuple(map(lambda x: x[0], labels))) - self.outfp.write(fmt1 % tuple(map(lambda x: x[1], labels))) - for k in keys: - r = stats_table[k][:l] + [k] - self.outfp.write(fmt2 % tuple(r)) - -count_stats = CountStats() - -class MemStats(Stats): - def do_append(self, label): - self.labels.append(label) - self.stats.append(SCons.Debug.memory()) - def do_print(self): - fmt = 'Memory %-32s %12d\n' - for label, stats in map(None, self.labels, self.stats): - self.outfp.write(fmt % (label, stats)) - -memory_stats = MemStats() - -# utility functions - -def _scons_syntax_error(e): - """Handle syntax errors. Print out a message and show where the error - occurred. - """ - etype, value, tb = sys.exc_info() - lines = traceback.format_exception_only(etype, value) - for line in lines: - sys.stderr.write(line+'\n') - sys.exit(2) - -def find_deepest_user_frame(tb): - """ - Find the deepest stack frame that is not part of SCons. - - Input is a "pre-processed" stack trace in the form - returned by traceback.extract_tb() or traceback.extract_stack() - """ - - tb.reverse() - - # find the deepest traceback frame that is not part - # of SCons: - for frame in tb: - filename = frame[0] - if string.find(filename, os.sep+'SCons'+os.sep) == -1: - return frame - return tb[0] - -def _scons_user_error(e): - """Handle user errors. Print out a message and a description of the - error, along with the line number and routine where it occured. - The file and line number will be the deepest stack frame that is - not part of SCons itself. - """ - global print_stacktrace - etype, value, tb = sys.exc_info() - if print_stacktrace: - traceback.print_exception(etype, value, tb) - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb)) - sys.stderr.write("\nscons: *** %s\n" % value) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - sys.exit(2) - -def _scons_user_warning(e): - """Handle user warnings. Print out a message and a description of - the warning, along with the line number and routine where it occured. - The file and line number will be the deepest stack frame that is - not part of SCons itself. - """ - etype, value, tb = sys.exc_info() - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_tb(tb)) - sys.stderr.write("\nscons: warning: %s\n" % e) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - -def _scons_internal_warning(e): - """Slightly different from _scons_user_warning in that we use the - *current call stack* rather than sys.exc_info() to get our stack trace. - This is used by the warnings framework to print warnings.""" - filename, lineno, routine, dummy = find_deepest_user_frame(traceback.extract_stack()) - sys.stderr.write("\nscons: warning: %s\n" % e[0]) - sys.stderr.write('File "%s", line %d, in %s\n' % (filename, lineno, routine)) - -def _scons_internal_error(): - """Handle all errors but user errors. Print out a message telling - the user what to do in this case and print a normal trace. - """ - print 'internal error' - traceback.print_exc() - sys.exit(2) - -def _SConstruct_exists(dirname='', repositories=[], filelist=None): - """This function checks that an SConstruct file exists in a directory. - If so, it returns the path of the file. By default, it checks the - current directory. - """ - if not filelist: - filelist = ['SConstruct', 'Sconstruct', 'sconstruct'] - for file in filelist: - sfile = os.path.join(dirname, file) - if os.path.isfile(sfile): - return sfile - if not os.path.isabs(sfile): - for rep in repositories: - if os.path.isfile(os.path.join(rep, sfile)): - return sfile - return None - -def _set_debug_values(options): - global print_memoizer, print_objects, print_stacktrace, print_time - - debug_values = options.debug - - if "count" in debug_values: - # All of the object counts are within "if __debug__:" blocks, - # which get stripped when running optimized (with python -O or - # from compiled *.pyo files). Provide a warning if __debug__ is - # stripped, so it doesn't just look like --debug=count is broken. - enable_count = False - if __debug__: enable_count = True - if enable_count: - count_stats.enable(sys.stdout) - else: - msg = "--debug=count is not supported when running SCons\n" + \ - "\twith the python -O option or optimized (.pyo) modules." - SCons.Warnings.warn(SCons.Warnings.NoObjectCountWarning, msg) - if "dtree" in debug_values: - options.tree_printers.append(TreePrinter(derived=True)) - options.debug_explain = ("explain" in debug_values) - if "findlibs" in debug_values: - SCons.Scanner.Prog.print_find_libs = "findlibs" - options.debug_includes = ("includes" in debug_values) - print_memoizer = ("memoizer" in debug_values) - if "memory" in debug_values: - memory_stats.enable(sys.stdout) - print_objects = ("objects" in debug_values) - if "presub" in debug_values: - SCons.Action.print_actions_presub = 1 - if "stacktrace" in debug_values: - print_stacktrace = 1 - if "stree" in debug_values: - options.tree_printers.append(TreePrinter(status=True)) - if "time" in debug_values: - print_time = 1 - if "tree" in debug_values: - options.tree_printers.append(TreePrinter()) - -def _create_path(plist): - path = '.' - for d in plist: - if os.path.isabs(d): - path = d - else: - path = path + '/' + d - return path - -def _load_site_scons_dir(topdir, site_dir_name=None): - """Load the site_scons dir under topdir. - Adds site_scons to sys.path, imports site_scons/site_init.py, - and adds site_scons/site_tools to default toolpath.""" - if site_dir_name: - err_if_not_found = True # user specified: err if missing - else: - site_dir_name = "site_scons" - err_if_not_found = False - - site_dir = os.path.join(topdir.path, site_dir_name) - if not os.path.exists(site_dir): - if err_if_not_found: - raise SCons.Errors.UserError, "site dir %s not found."%site_dir - return - - site_init_filename = "site_init.py" - site_init_modname = "site_init" - site_tools_dirname = "site_tools" - sys.path = [os.path.abspath(site_dir)] + sys.path - site_init_file = os.path.join(site_dir, site_init_filename) - site_tools_dir = os.path.join(site_dir, site_tools_dirname) - if os.path.exists(site_init_file): - import imp - # TODO(2.4): turn this into try:-except:-finally: - try: - try: - fp, pathname, description = imp.find_module(site_init_modname, - [site_dir]) - # Load the file into SCons.Script namespace. This is - # opaque and clever; m is the module object for the - # SCons.Script module, and the exec ... in call executes a - # file (or string containing code) in the context of the - # module's dictionary, so anything that code defines ends - # up adding to that module. This is really short, but all - # the error checking makes it longer. - try: - m = sys.modules['SCons.Script'] - except Exception, e: - fmt = 'cannot import site_init.py: missing SCons.Script module %s' - raise SCons.Errors.InternalError, fmt % repr(e) - try: - # This is the magic. - exec fp in m.__dict__ - except KeyboardInterrupt: - raise - except Exception, e: - fmt = '*** Error loading site_init file %s:\n' - sys.stderr.write(fmt % repr(site_init_file)) - raise - except KeyboardInterrupt: - raise - except ImportError, e: - fmt = '*** cannot import site init file %s:\n' - sys.stderr.write(fmt % repr(site_init_file)) - raise - finally: - if fp: - fp.close() - if os.path.exists(site_tools_dir): - SCons.Tool.DefaultToolpath.append(os.path.abspath(site_tools_dir)) - -def version_string(label, module): - version = module.__version__ - build = module.__build__ - if build: - if build[0] != '.': - build = '.' + build - version = version + build - fmt = "\t%s: v%s, %s, by %s on %s\n" - return fmt % (label, - version, - module.__date__, - module.__developer__, - module.__buildsys__) - -def _main(parser): - global exit_status - global this_build_status - - options = parser.values - - # Here's where everything really happens. - - # First order of business: set up default warnings and then - # handle the user's warning options, so that we can issue (or - # suppress) appropriate warnings about anything that might happen, - # as configured by the user. - - default_warnings = [ SCons.Warnings.CorruptSConsignWarning, - SCons.Warnings.DeprecatedWarning, - SCons.Warnings.DuplicateEnvironmentWarning, - SCons.Warnings.FutureReservedVariableWarning, - SCons.Warnings.LinkWarning, - SCons.Warnings.MissingSConscriptWarning, - SCons.Warnings.NoMD5ModuleWarning, - SCons.Warnings.NoMetaclassSupportWarning, - SCons.Warnings.NoObjectCountWarning, - SCons.Warnings.NoParallelSupportWarning, - SCons.Warnings.MisleadingKeywordsWarning, - SCons.Warnings.ReservedVariableWarning, - SCons.Warnings.StackSizeWarning, - SCons.Warnings.VisualVersionMismatch, - SCons.Warnings.VisualCMissingWarning, - ] - - for warning in default_warnings: - SCons.Warnings.enableWarningClass(warning) - SCons.Warnings._warningOut = _scons_internal_warning - SCons.Warnings.process_warn_strings(options.warn) - - # Now that we have the warnings configuration set up, we can actually - # issue (or suppress) any warnings about warning-worthy things that - # occurred while the command-line options were getting parsed. - try: - dw = options.delayed_warnings - except AttributeError: - pass - else: - delayed_warnings.extend(dw) - for warning_type, message in delayed_warnings: - SCons.Warnings.warn(warning_type, message) - - if options.diskcheck: - SCons.Node.FS.set_diskcheck(options.diskcheck) - - # Next, we want to create the FS object that represents the outside - # world's file system, as that's central to a lot of initialization. - # To do this, however, we need to be in the directory from which we - # want to start everything, which means first handling any relevant - # options that might cause us to chdir somewhere (-C, -D, -U, -u). - if options.directory: - script_dir = os.path.abspath(_create_path(options.directory)) - else: - script_dir = os.getcwd() - - target_top = None - if options.climb_up: - target_top = '.' # directory to prepend to targets - while script_dir and not _SConstruct_exists(script_dir, - options.repository, - options.file): - script_dir, last_part = os.path.split(script_dir) - if last_part: - target_top = os.path.join(last_part, target_top) - else: - script_dir = '' - - if script_dir and script_dir != os.getcwd(): - display("scons: Entering directory `%s'" % script_dir) - try: - os.chdir(script_dir) - except OSError: - sys.stderr.write("Could not change directory to %s\n" % script_dir) - - # Now that we're in the top-level SConstruct directory, go ahead - # and initialize the FS object that represents the file system, - # and make it the build engine default. - fs = SCons.Node.FS.get_default_fs() - - for rep in options.repository: - fs.Repository(rep) - - # Now that we have the FS object, the next order of business is to - # check for an SConstruct file (or other specified config file). - # If there isn't one, we can bail before doing any more work. - scripts = [] - if options.file: - scripts.extend(options.file) - if not scripts: - sfile = _SConstruct_exists(repositories=options.repository, - filelist=options.file) - if sfile: - scripts.append(sfile) - - if not scripts: - if options.help: - # There's no SConstruct, but they specified -h. - # Give them the options usage now, before we fail - # trying to read a non-existent SConstruct file. - raise SConsPrintHelpException - raise SCons.Errors.UserError, "No SConstruct file found." - - if scripts[0] == "-": - d = fs.getcwd() - else: - d = fs.File(scripts[0]).dir - fs.set_SConstruct_dir(d) - - _set_debug_values(options) - SCons.Node.implicit_cache = options.implicit_cache - SCons.Node.implicit_deps_changed = options.implicit_deps_changed - SCons.Node.implicit_deps_unchanged = options.implicit_deps_unchanged - - if options.no_exec: - SCons.SConf.dryrun = 1 - SCons.Action.execute_actions = None - if options.question: - SCons.SConf.dryrun = 1 - if options.clean: - SCons.SConf.SetBuildType('clean') - if options.help: - SCons.SConf.SetBuildType('help') - SCons.SConf.SetCacheMode(options.config) - SCons.SConf.SetProgressDisplay(progress_display) - - if options.no_progress or options.silent: - progress_display.set_mode(0) - - if options.site_dir: - _load_site_scons_dir(d, options.site_dir) - elif not options.no_site_dir: - _load_site_scons_dir(d) - - if options.include_dir: - sys.path = options.include_dir + sys.path - - # That should cover (most of) the options. Next, set up the variables - # that hold command-line arguments, so the SConscript files that we - # read and execute have access to them. - targets = [] - xmit_args = [] - for a in parser.largs: - if a[:1] == '-': - continue - if '=' in a: - xmit_args.append(a) - else: - targets.append(a) - SCons.Script._Add_Targets(targets + parser.rargs) - SCons.Script._Add_Arguments(xmit_args) - - # If stdout is not a tty, replace it with a wrapper object to call flush - # after every write. - # - # Tty devices automatically flush after every newline, so the replacement - # isn't necessary. Furthermore, if we replace sys.stdout, the readline - # module will no longer work. This affects the behavior during - # --interactive mode. --interactive should only be used when stdin and - # stdout refer to a tty. - if not hasattr(sys.stdout, 'isatty') or not sys.stdout.isatty(): - sys.stdout = SCons.Util.Unbuffered(sys.stdout) - if not hasattr(sys.stderr, 'isatty') or not sys.stderr.isatty(): - sys.stderr = SCons.Util.Unbuffered(sys.stderr) - - memory_stats.append('before reading SConscript files:') - count_stats.append(('pre-', 'read')) - - # And here's where we (finally) read the SConscript files. - - progress_display("scons: Reading SConscript files ...") - - start_time = time.time() - try: - for script in scripts: - SCons.Script._SConscript._SConscript(fs, script) - except SCons.Errors.StopError, e: - # We had problems reading an SConscript file, such as it - # couldn't be copied in to the VariantDir. Since we're just - # reading SConscript files and haven't started building - # things yet, stop regardless of whether they used -i or -k - # or anything else. - sys.stderr.write("scons: *** %s Stop.\n" % e) - exit_status = 2 - sys.exit(exit_status) - global sconscript_time - sconscript_time = time.time() - start_time - - progress_display("scons: done reading SConscript files.") - - memory_stats.append('after reading SConscript files:') - count_stats.append(('post-', 'read')) - - # Re-{enable,disable} warnings in case they disabled some in - # the SConscript file. - # - # We delay enabling the PythonVersionWarning class until here so that, - # if they explicity disabled it in either in the command line or in - # $SCONSFLAGS, or in the SConscript file, then the search through - # the list of deprecated warning classes will find that disabling - # first and not issue the warning. - SCons.Warnings.enableWarningClass(SCons.Warnings.PythonVersionWarning) - SCons.Warnings.process_warn_strings(options.warn) - - # Now that we've read the SConscript files, we can check for the - # warning about deprecated Python versions--delayed until here - # in case they disabled the warning in the SConscript files. - if python_version_deprecated(): - msg = "Support for pre-2.4 Python (%s) is deprecated.\n" + \ - " If this will cause hardship, contact dev@scons.tigris.org." - SCons.Warnings.warn(SCons.Warnings.PythonVersionWarning, - msg % python_version_string()) - - if not options.help: - SCons.SConf.CreateConfigHBuilder(SCons.Defaults.DefaultEnvironment()) - - # Now re-parse the command-line options (any to the left of a '--' - # argument, that is) with any user-defined command-line options that - # the SConscript files may have added to the parser object. This will - # emit the appropriate error message and exit if any unknown option - # was specified on the command line. - - parser.preserve_unknown_options = False - parser.parse_args(parser.largs, options) - - if options.help: - help_text = SCons.Script.help_text - if help_text is None: - # They specified -h, but there was no Help() inside the - # SConscript files. Give them the options usage. - raise SConsPrintHelpException - else: - print help_text - print "Use scons -H for help about command-line options." - exit_status = 0 - return - - # Change directory to the top-level SConstruct directory, then tell - # the Node.FS subsystem that we're all done reading the SConscript - # files and calling Repository() and VariantDir() and changing - # directories and the like, so it can go ahead and start memoizing - # the string values of file system nodes. - - fs.chdir(fs.Top) - - SCons.Node.FS.save_strings(1) - - # Now that we've read the SConscripts we can set the options - # that are SConscript settable: - SCons.Node.implicit_cache = options.implicit_cache - SCons.Node.FS.set_duplicate(options.duplicate) - fs.set_max_drift(options.max_drift) - - SCons.Job.explicit_stack_size = options.stack_size - - if options.md5_chunksize: - SCons.Node.FS.File.md5_chunksize = options.md5_chunksize - - platform = SCons.Platform.platform_module() - - if options.interactive: - SCons.Script.Interactive.interact(fs, OptionsParser, options, - targets, target_top) - - else: - - # Build the targets - nodes = _build_targets(fs, options, targets, target_top) - if not nodes: - exit_status = 2 - -def _build_targets(fs, options, targets, target_top): - - global this_build_status - this_build_status = 0 - - progress_display.set_mode(not (options.no_progress or options.silent)) - display.set_mode(not options.silent) - SCons.Action.print_actions = not options.silent - SCons.Action.execute_actions = not options.no_exec - SCons.Node.FS.do_store_info = not options.no_exec - SCons.SConf.dryrun = options.no_exec - - if options.diskcheck: - SCons.Node.FS.set_diskcheck(options.diskcheck) - - SCons.CacheDir.cache_enabled = not options.cache_disable - SCons.CacheDir.cache_debug = options.cache_debug - SCons.CacheDir.cache_force = options.cache_force - SCons.CacheDir.cache_show = options.cache_show - - if options.no_exec: - CleanTask.execute = CleanTask.show - else: - CleanTask.execute = CleanTask.remove - - lookup_top = None - if targets or SCons.Script.BUILD_TARGETS != SCons.Script._build_plus_default: - # They specified targets on the command line or modified - # BUILD_TARGETS in the SConscript file(s), so if they used -u, - # -U or -D, we have to look up targets relative to the top, - # but we build whatever they specified. - if target_top: - lookup_top = fs.Dir(target_top) - target_top = None - - targets = SCons.Script.BUILD_TARGETS - else: - # There are no targets specified on the command line, - # so if they used -u, -U or -D, we may have to restrict - # what actually gets built. - d = None - if target_top: - if options.climb_up == 1: - # -u, local directory and below - target_top = fs.Dir(target_top) - lookup_top = target_top - elif options.climb_up == 2: - # -D, all Default() targets - target_top = None - lookup_top = None - elif options.climb_up == 3: - # -U, local SConscript Default() targets - target_top = fs.Dir(target_top) - def check_dir(x, target_top=target_top): - if hasattr(x, 'cwd') and not x.cwd is None: - cwd = x.cwd.srcnode() - return cwd == target_top - else: - # x doesn't have a cwd, so it's either not a target, - # or not a file, so go ahead and keep it as a default - # target and let the engine sort it out: - return 1 - d = filter(check_dir, SCons.Script.DEFAULT_TARGETS) - SCons.Script.DEFAULT_TARGETS[:] = d - target_top = None - lookup_top = None - - targets = SCons.Script._Get_Default_Targets(d, fs) - - if not targets: - sys.stderr.write("scons: *** No targets specified and no Default() targets found. Stop.\n") - return None - - def Entry(x, ltop=lookup_top, ttop=target_top, fs=fs): - if isinstance(x, SCons.Node.Node): - node = x - else: - node = None - # Why would ltop be None? Unfortunately this happens. - if ltop is None: ltop = '' - # Curdir becomes important when SCons is called with -u, -C, - # or similar option that changes directory, and so the paths - # of targets given on the command line need to be adjusted. - curdir = os.path.join(os.getcwd(), str(ltop)) - for lookup in SCons.Node.arg2nodes_lookups: - node = lookup(x, curdir=curdir) - if node is not None: - break - if node is None: - node = fs.Entry(x, directory=ltop, create=1) - if ttop and not node.is_under(ttop): - if isinstance(node, SCons.Node.FS.Dir) and ttop.is_under(node): - node = ttop - else: - node = None - return node - - nodes = filter(None, map(Entry, targets)) - - task_class = BuildTask # default action is to build targets - opening_message = "Building targets ..." - closing_message = "done building targets." - if options.keep_going: - failure_message = "done building targets (errors occurred during build)." - else: - failure_message = "building terminated because of errors." - if options.question: - task_class = QuestionTask - try: - if options.clean: - task_class = CleanTask - opening_message = "Cleaning targets ..." - closing_message = "done cleaning targets." - if options.keep_going: - failure_message = "done cleaning targets (errors occurred during clean)." - else: - failure_message = "cleaning terminated because of errors." - except AttributeError: - pass - - task_class.progress = ProgressObject - - if options.random: - def order(dependencies): - """Randomize the dependencies.""" - import random - # This is cribbed from the implementation of - # random.shuffle() in Python 2.X. - d = dependencies - for i in xrange(len(d)-1, 0, -1): - j = int(random.random() * (i+1)) - d[i], d[j] = d[j], d[i] - return d - else: - def order(dependencies): - """Leave the order of dependencies alone.""" - return dependencies - - if options.taskmastertrace_file == '-': - tmtrace = sys.stdout - elif options.taskmastertrace_file: - tmtrace = open(options.taskmastertrace_file, 'wb') - else: - tmtrace = None - taskmaster = SCons.Taskmaster.Taskmaster(nodes, task_class, order, tmtrace) - - # Let the BuildTask objects get at the options to respond to the - # various print_* settings, tree_printer list, etc. - BuildTask.options = options - - global num_jobs - num_jobs = options.num_jobs - jobs = SCons.Job.Jobs(num_jobs, taskmaster) - if num_jobs > 1: - msg = None - if jobs.num_jobs == 1: - msg = "parallel builds are unsupported by this version of Python;\n" + \ - "\tignoring -j or num_jobs option.\n" - elif sys.platform == 'win32': - msg = fetch_win32_parallel_msg() - if msg: - SCons.Warnings.warn(SCons.Warnings.NoParallelSupportWarning, msg) - - memory_stats.append('before building targets:') - count_stats.append(('pre-', 'build')) - - def jobs_postfunc( - jobs=jobs, - options=options, - closing_message=closing_message, - failure_message=failure_message - ): - if jobs.were_interrupted(): - if not options.no_progress and not options.silent: - sys.stderr.write("scons: Build interrupted.\n") - global exit_status - global this_build_status - exit_status = 2 - this_build_status = 2 - - if this_build_status: - progress_display("scons: " + failure_message) - else: - progress_display("scons: " + closing_message) - if not options.no_exec: - if jobs.were_interrupted(): - progress_display("scons: writing .sconsign file.") - SCons.SConsign.write() - - progress_display("scons: " + opening_message) - jobs.run(postfunc = jobs_postfunc) - - memory_stats.append('after building targets:') - count_stats.append(('post-', 'build')) - - return nodes - -def _exec_main(parser, values): - sconsflags = os.environ.get('SCONSFLAGS', '') - all_args = string.split(sconsflags) + sys.argv[1:] - - options, args = parser.parse_args(all_args, values) - - if type(options.debug) == type([]) and "pdb" in options.debug: - import pdb - pdb.Pdb().runcall(_main, parser) - elif options.profile_file: - try: - from cProfile import Profile - except ImportError, e: - from profile import Profile - - # Some versions of Python 2.4 shipped a profiler that had the - # wrong 'c_exception' entry in its dispatch table. Make sure - # we have the right one. (This may put an unnecessary entry - # in the table in earlier versions of Python, but its presence - # shouldn't hurt anything). - try: - dispatch = Profile.dispatch - except AttributeError: - pass - else: - dispatch['c_exception'] = Profile.trace_dispatch_return - - prof = Profile() - try: - prof.runcall(_main, parser) - except SConsPrintHelpException, e: - prof.dump_stats(options.profile_file) - raise e - except SystemExit: - pass - prof.dump_stats(options.profile_file) - else: - _main(parser) - -def main(): - global OptionsParser - global exit_status - global first_command_start - - # Check up front for a Python version we do not support. We - # delay the check for deprecated Python versions until later, - # after the SConscript files have been read, in case they - # disable that warning. - if python_version_unsupported(): - msg = "scons: *** SCons version %s does not run under Python version %s.\n" - sys.stderr.write(msg % (SCons.__version__, python_version_string())) - sys.exit(1) - - parts = ["SCons by Steven Knight et al.:\n"] - try: - import __main__ - parts.append(version_string("script", __main__)) - except (ImportError, AttributeError): - # On Windows there is no scons.py, so there is no - # __main__.__version__, hence there is no script version. - pass - parts.append(version_string("engine", SCons)) - parts.append("Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation") - version = string.join(parts, '') - - import SConsOptions - parser = SConsOptions.Parser(version) - values = SConsOptions.SConsValues(parser.get_default_values()) - - OptionsParser = parser - - try: - _exec_main(parser, values) - except SystemExit, s: - if s: - exit_status = s - except KeyboardInterrupt: - print("scons: Build interrupted.") - sys.exit(2) - except SyntaxError, e: - _scons_syntax_error(e) - except SCons.Errors.InternalError: - _scons_internal_error() - except SCons.Errors.UserError, e: - _scons_user_error(e) - except SConsPrintHelpException: - parser.print_help() - exit_status = 0 - except SCons.Errors.BuildError, e: - exit_status = e.exitstatus - except: - # An exception here is likely a builtin Python exception Python - # code in an SConscript file. Show them precisely what the - # problem was and where it happened. - SCons.Script._SConscript.SConscript_exception() - sys.exit(2) - - memory_stats.print_stats() - count_stats.print_stats() - - if print_objects: - SCons.Debug.listLoggedInstances('*') - #SCons.Debug.dumpLoggedInstances('*') - - if print_memoizer: - SCons.Memoize.Dump("Memoizer (memory cache) hits and misses:") - - # Dump any development debug info that may have been enabled. - # These are purely for internal debugging during development, so - # there's no need to control them with --debug= options; they're - # controlled by changing the source code. - SCons.Debug.dump_caller_counts() - SCons.Taskmaster.dump_stats() - - if print_time: - total_time = time.time() - SCons.Script.start_time - if num_jobs == 1: - ct = cumulative_command_time - else: - if last_command_end is None or first_command_start is None: - ct = 0.0 - else: - ct = last_command_end - first_command_start - scons_time = total_time - sconscript_time - ct - print "Total build time: %f seconds"%total_time - print "Total SConscript file execution time: %f seconds"%sconscript_time - print "Total SCons execution time: %f seconds"%scons_time - print "Total command execution time: %f seconds"%ct - - sys.exit(exit_status) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Script/SConsOptions.py b/share/scons-local-1.3.0/SCons/Script/SConsOptions.py deleted file mode 100644 index 545162b891b8e75ce252cc10392cbe8597170cd4..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Script/SConsOptions.py +++ /dev/null @@ -1,944 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Script/SConsOptions.py 4720 2010/03/24 03:14:11 jars" - -import optparse -import re -import string -import sys -import textwrap - -try: - no_hyphen_re = re.compile(r'(\s+|(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') -except re.error: - # Pre-2.0 Python versions don't have the (?<= negative - # look-behind assertion. - no_hyphen_re = re.compile(r'(\s+|-*\w{2,}-(?=\w{2,}))') - -try: - from gettext import gettext -except ImportError: - def gettext(message): - return message -_ = gettext - -import SCons.Node.FS -import SCons.Warnings - -OptionValueError = optparse.OptionValueError -SUPPRESS_HELP = optparse.SUPPRESS_HELP - -diskcheck_all = SCons.Node.FS.diskcheck_types() - -def diskcheck_convert(value): - if value is None: - return [] - if not SCons.Util.is_List(value): - value = string.split(value, ',') - result = [] - for v in map(string.lower, value): - if v == 'all': - result = diskcheck_all - elif v == 'none': - result = [] - elif v in diskcheck_all: - result.append(v) - else: - raise ValueError, v - return result - -class SConsValues(optparse.Values): - """ - Holder class for uniform access to SCons options, regardless - of whether or not they can be set on the command line or in the - SConscript files (using the SetOption() function). - - A SCons option value can originate three different ways: - - 1) set on the command line; - 2) set in an SConscript file; - 3) the default setting (from the the op.add_option() - calls in the Parser() function, below). - - The command line always overrides a value set in a SConscript file, - which in turn always overrides default settings. Because we want - to support user-specified options in the SConscript file itself, - though, we may not know about all of the options when the command - line is first parsed, so we can't make all the necessary precedence - decisions at the time the option is configured. - - The solution implemented in this class is to keep these different sets - of settings separate (command line, SConscript file, and default) - and to override the __getattr__() method to check them in turn. - This should allow the rest of the code to just fetch values as - attributes of an instance of this class, without having to worry - about where they came from. - - Note that not all command line options are settable from SConscript - files, and the ones that are must be explicitly added to the - "settable" list in this class, and optionally validated and coerced - in the set_option() method. - """ - - def __init__(self, defaults): - self.__dict__['__defaults__'] = defaults - self.__dict__['__SConscript_settings__'] = {} - - def __getattr__(self, attr): - """ - Fetches an options value, checking first for explicit settings - from the command line (which are direct attributes), then the - SConscript file settings, then the default values. - """ - try: - return self.__dict__[attr] - except KeyError: - try: - return self.__dict__['__SConscript_settings__'][attr] - except KeyError: - return getattr(self.__dict__['__defaults__'], attr) - - settable = [ - 'clean', - 'diskcheck', - 'duplicate', - 'help', - 'implicit_cache', - 'max_drift', - 'md5_chunksize', - 'no_exec', - 'num_jobs', - 'random', - 'stack_size', - 'warn', - ] - - def set_option(self, name, value): - """ - Sets an option from an SConscript file. - """ - if not name in self.settable: - raise SCons.Errors.UserError, "This option is not settable from a SConscript file: %s"%name - - if name == 'num_jobs': - try: - value = int(value) - if value < 1: - raise ValueError - except ValueError: - raise SCons.Errors.UserError, "A positive integer is required: %s"%repr(value) - elif name == 'max_drift': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError, "An integer is required: %s"%repr(value) - elif name == 'duplicate': - try: - value = str(value) - except ValueError: - raise SCons.Errors.UserError, "A string is required: %s"%repr(value) - if not value in SCons.Node.FS.Valid_Duplicates: - raise SCons.Errors.UserError, "Not a valid duplication style: %s" % value - # Set the duplicate style right away so it can affect linking - # of SConscript files. - SCons.Node.FS.set_duplicate(value) - elif name == 'diskcheck': - try: - value = diskcheck_convert(value) - except ValueError, v: - raise SCons.Errors.UserError, "Not a valid diskcheck value: %s"%v - if not self.__dict__.has_key('diskcheck'): - # No --diskcheck= option was specified on the command line. - # Set this right away so it can affect the rest of the - # file/Node lookups while processing the SConscript files. - SCons.Node.FS.set_diskcheck(value) - elif name == 'stack_size': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError, "An integer is required: %s"%repr(value) - elif name == 'md5_chunksize': - try: - value = int(value) - except ValueError: - raise SCons.Errors.UserError, "An integer is required: %s"%repr(value) - elif name == 'warn': - if SCons.Util.is_String(value): - value = [value] - value = self.__SConscript_settings__.get(name, []) + value - SCons.Warnings.process_warn_strings(value) - - self.__SConscript_settings__[name] = value - -class SConsOption(optparse.Option): - def convert_value(self, opt, value): - if value is not None: - if self.nargs in (1, '?'): - return self.check_value(opt, value) - else: - return tuple(map(lambda v, o=opt, s=self: s.check_value(o, v), value)) - - def process(self, opt, value, values, parser): - - # First, convert the value(s) to the right type. Howl if any - # value(s) are bogus. - value = self.convert_value(opt, value) - - # And then take whatever action is expected of us. - # This is a separate method to make life easier for - # subclasses to add new actions. - return self.take_action( - self.action, self.dest, opt, value, values, parser) - - def _check_nargs_optional(self): - if self.nargs == '?' and self._short_opts: - fmt = "option %s: nargs='?' is incompatible with short options" - raise SCons.Errors.UserError, fmt % self._short_opts[0] - - try: - _orig_CONST_ACTIONS = optparse.Option.CONST_ACTIONS - - _orig_CHECK_METHODS = optparse.Option.CHECK_METHODS - - except AttributeError: - # optparse.Option had no CONST_ACTIONS before Python 2.5. - - _orig_CONST_ACTIONS = ("store_const",) - - def _check_const(self): - if self.action not in self.CONST_ACTIONS and self.const is not None: - raise OptionError( - "'const' must not be supplied for action %r" % self.action, - self) - - # optparse.Option collects its list of unbound check functions - # up front. This sucks because it means we can't just override - # the _check_const() function like a normal method, we have to - # actually replace it in the list. This seems to be the most - # straightforward way to do that. - - _orig_CHECK_METHODS = [optparse.Option._check_action, - optparse.Option._check_type, - optparse.Option._check_choice, - optparse.Option._check_dest, - _check_const, - optparse.Option._check_nargs, - optparse.Option._check_callback] - - CHECK_METHODS = _orig_CHECK_METHODS + [_check_nargs_optional] - - CONST_ACTIONS = _orig_CONST_ACTIONS + optparse.Option.TYPED_ACTIONS - -class SConsOptionGroup(optparse.OptionGroup): - """ - A subclass for SCons-specific option groups. - - The only difference between this and the base class is that we print - the group's help text flush left, underneath their own title but - lined up with the normal "SCons Options". - """ - def format_help(self, formatter): - """ - Format an option group's help text, outdenting the title so it's - flush with the "SCons Options" title we print at the top. - """ - formatter.dedent() - result = formatter.format_heading(self.title) - formatter.indent() - result = result + optparse.OptionContainer.format_help(self, formatter) - return result - -class SConsOptionParser(optparse.OptionParser): - preserve_unknown_options = False - - def error(self, msg): - self.print_usage(sys.stderr) - sys.stderr.write("SCons error: %s\n" % msg) - sys.exit(2) - - def _process_long_opt(self, rargs, values): - """ - SCons-specific processing of long options. - - This is copied directly from the normal - optparse._process_long_opt() method, except that, if configured - to do so, we catch the exception thrown when an unknown option - is encountered and just stick it back on the "leftover" arguments - for later (re-)processing. - """ - arg = rargs.pop(0) - - # Value explicitly attached to arg? Pretend it's the next - # argument. - if "=" in arg: - (opt, next_arg) = string.split(arg, "=", 1) - rargs.insert(0, next_arg) - had_explicit_value = True - else: - opt = arg - had_explicit_value = False - - try: - opt = self._match_long_opt(opt) - except optparse.BadOptionError: - if self.preserve_unknown_options: - # SCons-specific: if requested, add unknown options to - # the "leftover arguments" list for later processing. - self.largs.append(arg) - if had_explicit_value: - # The unknown option will be re-processed later, - # so undo the insertion of the explicit value. - rargs.pop(0) - return - raise - - option = self._long_opt[opt] - if option.takes_value(): - nargs = option.nargs - if nargs == '?': - if had_explicit_value: - value = rargs.pop(0) - else: - value = option.const - elif len(rargs) < nargs: - if nargs == 1: - self.error(_("%s option requires an argument") % opt) - else: - self.error(_("%s option requires %d arguments") - % (opt, nargs)) - elif nargs == 1: - value = rargs.pop(0) - else: - value = tuple(rargs[0:nargs]) - del rargs[0:nargs] - - elif had_explicit_value: - self.error(_("%s option does not take a value") % opt) - - else: - value = None - - option.process(opt, value, values, self) - - def add_local_option(self, *args, **kw): - """ - Adds a local option to the parser. - - This is initiated by a SetOption() call to add a user-defined - command-line option. We add the option to a separate option - group for the local options, creating the group if necessary. - """ - try: - group = self.local_option_group - except AttributeError: - group = SConsOptionGroup(self, 'Local Options') - group = self.add_option_group(group) - self.local_option_group = group - - result = apply(group.add_option, args, kw) - - if result: - # The option was added succesfully. We now have to add the - # default value to our object that holds the default values - # (so that an attempt to fetch the option's attribute will - # yield the default value when not overridden) and then - # we re-parse the leftover command-line options, so that - # any value overridden on the command line is immediately - # available if the user turns around and does a GetOption() - # right away. - setattr(self.values.__defaults__, result.dest, result.default) - self.parse_args(self.largs, self.values) - - return result - -class SConsIndentedHelpFormatter(optparse.IndentedHelpFormatter): - def format_usage(self, usage): - return "usage: %s\n" % usage - - def format_heading(self, heading): - """ - This translates any heading of "options" or "Options" into - "SCons Options." Unfortunately, we have to do this here, - because those titles are hard-coded in the optparse calls. - """ - if heading == 'options': - # The versions of optparse.py shipped with Pythons 2.3 and - # 2.4 pass this in uncapitalized; override that so we get - # consistent output on all versions. - heading = "Options" - if heading == 'Options': - heading = "SCons Options" - return optparse.IndentedHelpFormatter.format_heading(self, heading) - - def format_option(self, option): - """ - A copy of the normal optparse.IndentedHelpFormatter.format_option() - method. This has been snarfed so we can modify text wrapping to - out liking: - - -- add our own regular expression that doesn't break on hyphens - (so things like --no-print-directory don't get broken); - - -- wrap the list of options themselves when it's too long - (the wrapper.fill(opts) call below); - - -- set the subsequent_indent when wrapping the help_text. - """ - # The help for each option consists of two parts: - # * the opt strings and metavars - # eg. ("-x", or "-fFILENAME, --file=FILENAME") - # * the user-supplied help string - # eg. ("turn on expert mode", "read data from FILENAME") - # - # If possible, we write both of these on the same line: - # -x turn on expert mode - # - # But if the opt string list is too long, we put the help - # string on a second line, indented to the same column it would - # start in if it fit on the first line. - # -fFILENAME, --file=FILENAME - # read data from FILENAME - result = [] - - try: - opts = self.option_strings[option] - except AttributeError: - # The Python 2.3 version of optparse attaches this to - # to the option argument, not to this object. - opts = option.option_strings - - opt_width = self.help_position - self.current_indent - 2 - if len(opts) > opt_width: - wrapper = textwrap.TextWrapper(width=self.width, - initial_indent = ' ', - subsequent_indent = ' ') - wrapper.wordsep_re = no_hyphen_re - opts = wrapper.fill(opts) + '\n' - indent_first = self.help_position - else: # start help on same line as opts - opts = "%*s%-*s " % (self.current_indent, "", opt_width, opts) - indent_first = 0 - result.append(opts) - if option.help: - - try: - expand_default = self.expand_default - except AttributeError: - # The HelpFormatter base class in the Python 2.3 version - # of optparse has no expand_default() method. - help_text = option.help - else: - help_text = expand_default(option) - - # SCons: indent every line of the help text but the first. - wrapper = textwrap.TextWrapper(width=self.help_width, - subsequent_indent = ' ') - wrapper.wordsep_re = no_hyphen_re - help_lines = wrapper.wrap(help_text) - result.append("%*s%s\n" % (indent_first, "", help_lines[0])) - for line in help_lines[1:]: - result.append("%*s%s\n" % (self.help_position, "", line)) - elif opts[-1] != "\n": - result.append("\n") - return string.join(result, "") - - # For consistent help output across Python versions, we provide a - # subclass copy of format_option_strings() and these two variables. - # This is necessary (?) for Python2.3, which otherwise concatenates - # a short option with its metavar. - _short_opt_fmt = "%s %s" - _long_opt_fmt = "%s=%s" - - def format_option_strings(self, option): - """Return a comma-separated list of option strings & metavariables.""" - if option.takes_value(): - metavar = option.metavar or string.upper(option.dest) - short_opts = [] - for sopt in option._short_opts: - short_opts.append(self._short_opt_fmt % (sopt, metavar)) - long_opts = [] - for lopt in option._long_opts: - long_opts.append(self._long_opt_fmt % (lopt, metavar)) - else: - short_opts = option._short_opts - long_opts = option._long_opts - - if self.short_first: - opts = short_opts + long_opts - else: - opts = long_opts + short_opts - - return string.join(opts, ", ") - -def Parser(version): - """ - Returns an options parser object initialized with the standard - SCons options. - """ - - formatter = SConsIndentedHelpFormatter(max_help_position=30) - - op = SConsOptionParser(option_class=SConsOption, - add_help_option=False, - formatter=formatter, - usage="usage: scons [OPTION] [TARGET] ...",) - - op.preserve_unknown_options = True - op.version = version - - # Add the options to the parser we just created. - # - # These are in the order we want them to show up in the -H help - # text, basically alphabetical. Each op.add_option() call below - # should have a consistent format: - # - # op.add_option("-L", "--long-option-name", - # nargs=1, type="string", - # dest="long_option_name", default='foo', - # action="callback", callback=opt_long_option, - # help="help text goes here", - # metavar="VAR") - # - # Even though the optparse module constructs reasonable default - # destination names from the long option names, we're going to be - # explicit about each one for easier readability and so this code - # will at least show up when grepping the source for option attribute - # names, or otherwise browsing the source code. - - # options ignored for compatibility - def opt_ignore(option, opt, value, parser): - sys.stderr.write("Warning: ignoring %s option\n" % opt) - op.add_option("-b", "-d", "-e", "-m", "-S", "-t", "-w", - "--environment-overrides", - "--no-keep-going", - "--no-print-directory", - "--print-directory", - "--stop", - "--touch", - action="callback", callback=opt_ignore, - help="Ignored for compatibility.") - - op.add_option('-c', '--clean', '--remove', - dest="clean", default=False, - action="store_true", - help="Remove specified targets and dependencies.") - - op.add_option('-C', '--directory', - nargs=1, type="string", - dest="directory", default=[], - action="append", - help="Change to DIR before doing anything.", - metavar="DIR") - - op.add_option('--cache-debug', - nargs=1, - dest="cache_debug", default=None, - action="store", - help="Print CacheDir debug info to FILE.", - metavar="FILE") - - op.add_option('--cache-disable', '--no-cache', - dest='cache_disable', default=False, - action="store_true", - help="Do not retrieve built targets from CacheDir.") - - op.add_option('--cache-force', '--cache-populate', - dest='cache_force', default=False, - action="store_true", - help="Copy already-built targets into the CacheDir.") - - op.add_option('--cache-show', - dest='cache_show', default=False, - action="store_true", - help="Print build actions for files from CacheDir.") - - config_options = ["auto", "force" ,"cache"] - - def opt_config(option, opt, value, parser, c_options=config_options): - if not value in c_options: - raise OptionValueError("Warning: %s is not a valid config type" % value) - setattr(parser.values, option.dest, value) - opt_config_help = "Controls Configure subsystem: %s." \ - % string.join(config_options, ", ") - op.add_option('--config', - nargs=1, type="string", - dest="config", default="auto", - action="callback", callback=opt_config, - help = opt_config_help, - metavar="MODE") - - op.add_option('-D', - dest="climb_up", default=None, - action="store_const", const=2, - help="Search up directory tree for SConstruct, " - "build all Default() targets.") - - deprecated_debug_options = { - "dtree" : '; please use --tree=derived instead', - "nomemoizer" : ' and has no effect', - "stree" : '; please use --tree=all,status instead', - "tree" : '; please use --tree=all instead', - } - - debug_options = ["count", "explain", "findlibs", - "includes", "memoizer", "memory", "objects", - "pdb", "presub", "stacktrace", - "time"] + deprecated_debug_options.keys() - - def opt_debug(option, opt, value, parser, - debug_options=debug_options, - deprecated_debug_options=deprecated_debug_options): - if value in debug_options: - parser.values.debug.append(value) - if value in deprecated_debug_options.keys(): - try: - parser.values.delayed_warnings - except AttributeError: - parser.values.delayed_warnings = [] - msg = deprecated_debug_options[value] - w = "The --debug=%s option is deprecated%s." % (value, msg) - t = (SCons.Warnings.DeprecatedWarning, w) - parser.values.delayed_warnings.append(t) - else: - raise OptionValueError("Warning: %s is not a valid debug type" % value) - opt_debug_help = "Print various types of debugging information: %s." \ - % string.join(debug_options, ", ") - op.add_option('--debug', - nargs=1, type="string", - dest="debug", default=[], - action="callback", callback=opt_debug, - help=opt_debug_help, - metavar="TYPE") - - def opt_diskcheck(option, opt, value, parser): - try: - diskcheck_value = diskcheck_convert(value) - except ValueError, e: - raise OptionValueError("Warning: `%s' is not a valid diskcheck type" % e) - setattr(parser.values, option.dest, diskcheck_value) - - op.add_option('--diskcheck', - nargs=1, type="string", - dest='diskcheck', default=None, - action="callback", callback=opt_diskcheck, - help="Enable specific on-disk checks.", - metavar="TYPE") - - def opt_duplicate(option, opt, value, parser): - if not value in SCons.Node.FS.Valid_Duplicates: - raise OptionValueError("`%s' is not a valid duplication style." % value) - setattr(parser.values, option.dest, value) - # Set the duplicate style right away so it can affect linking - # of SConscript files. - SCons.Node.FS.set_duplicate(value) - - opt_duplicate_help = "Set the preferred duplication methods. Must be one of " \ - + string.join(SCons.Node.FS.Valid_Duplicates, ", ") - - op.add_option('--duplicate', - nargs=1, type="string", - dest="duplicate", default='hard-soft-copy', - action="callback", callback=opt_duplicate, - help=opt_duplicate_help) - - op.add_option('-f', '--file', '--makefile', '--sconstruct', - nargs=1, type="string", - dest="file", default=[], - action="append", - help="Read FILE as the top-level SConstruct file.") - - op.add_option('-h', '--help', - dest="help", default=False, - action="store_true", - help="Print defined help message, or this one.") - - op.add_option("-H", "--help-options", - action="help", - help="Print this message and exit.") - - op.add_option('-i', '--ignore-errors', - dest='ignore_errors', default=False, - action="store_true", - help="Ignore errors from build actions.") - - op.add_option('-I', '--include-dir', - nargs=1, - dest='include_dir', default=[], - action="append", - help="Search DIR for imported Python modules.", - metavar="DIR") - - op.add_option('--implicit-cache', - dest='implicit_cache', default=False, - action="store_true", - help="Cache implicit dependencies") - - def opt_implicit_deps(option, opt, value, parser): - setattr(parser.values, 'implicit_cache', True) - setattr(parser.values, option.dest, True) - - op.add_option('--implicit-deps-changed', - dest="implicit_deps_changed", default=False, - action="callback", callback=opt_implicit_deps, - help="Ignore cached implicit dependencies.") - - op.add_option('--implicit-deps-unchanged', - dest="implicit_deps_unchanged", default=False, - action="callback", callback=opt_implicit_deps, - help="Ignore changes in implicit dependencies.") - - op.add_option('--interact', '--interactive', - dest='interactive', default=False, - action="store_true", - help="Run in interactive mode.") - - op.add_option('-j', '--jobs', - nargs=1, type="int", - dest="num_jobs", default=1, - action="store", - help="Allow N jobs at once.", - metavar="N") - - op.add_option('-k', '--keep-going', - dest='keep_going', default=False, - action="store_true", - help="Keep going when a target can't be made.") - - op.add_option('--max-drift', - nargs=1, type="int", - dest='max_drift', default=SCons.Node.FS.default_max_drift, - action="store", - help="Set maximum system clock drift to N seconds.", - metavar="N") - - op.add_option('--md5-chunksize', - nargs=1, type="int", - dest='md5_chunksize', default=SCons.Node.FS.File.md5_chunksize, - action="store", - help="Set chunk-size for MD5 signature computation to N kilobytes.", - metavar="N") - - op.add_option('-n', '--no-exec', '--just-print', '--dry-run', '--recon', - dest='no_exec', default=False, - action="store_true", - help="Don't build; just print commands.") - - op.add_option('--no-site-dir', - dest='no_site_dir', default=False, - action="store_true", - help="Don't search or use the usual site_scons dir.") - - op.add_option('--profile', - nargs=1, - dest="profile_file", default=None, - action="store", - help="Profile SCons and put results in FILE.", - metavar="FILE") - - op.add_option('-q', '--question', - dest="question", default=False, - action="store_true", - help="Don't build; exit status says if up to date.") - - op.add_option('-Q', - dest='no_progress', default=False, - action="store_true", - help="Suppress \"Reading/Building\" progress messages.") - - op.add_option('--random', - dest="random", default=False, - action="store_true", - help="Build dependencies in random order.") - - op.add_option('-s', '--silent', '--quiet', - dest="silent", default=False, - action="store_true", - help="Don't print commands.") - - op.add_option('--site-dir', - nargs=1, - dest='site_dir', default=None, - action="store", - help="Use DIR instead of the usual site_scons dir.", - metavar="DIR") - - op.add_option('--stack-size', - nargs=1, type="int", - dest='stack_size', - action="store", - help="Set the stack size of the threads used to run jobs to N kilobytes.", - metavar="N") - - op.add_option('--taskmastertrace', - nargs=1, - dest="taskmastertrace_file", default=None, - action="store", - help="Trace Node evaluation to FILE.", - metavar="FILE") - - tree_options = ["all", "derived", "prune", "status"] - - def opt_tree(option, opt, value, parser, tree_options=tree_options): - import Main - tp = Main.TreePrinter() - for o in string.split(value, ','): - if o == 'all': - tp.derived = False - elif o == 'derived': - tp.derived = True - elif o == 'prune': - tp.prune = True - elif o == 'status': - tp.status = True - else: - raise OptionValueError("Warning: %s is not a valid --tree option" % o) - parser.values.tree_printers.append(tp) - - opt_tree_help = "Print a dependency tree in various formats: %s." \ - % string.join(tree_options, ", ") - - op.add_option('--tree', - nargs=1, type="string", - dest="tree_printers", default=[], - action="callback", callback=opt_tree, - help=opt_tree_help, - metavar="OPTIONS") - - op.add_option('-u', '--up', '--search-up', - dest="climb_up", default=0, - action="store_const", const=1, - help="Search up directory tree for SConstruct, " - "build targets at or below current directory.") - - op.add_option('-U', - dest="climb_up", default=0, - action="store_const", const=3, - help="Search up directory tree for SConstruct, " - "build Default() targets from local SConscript.") - - def opt_version(option, opt, value, parser): - sys.stdout.write(parser.version + '\n') - sys.exit(0) - op.add_option("-v", "--version", - action="callback", callback=opt_version, - help="Print the SCons version number and exit.") - - def opt_warn(option, opt, value, parser, tree_options=tree_options): - if SCons.Util.is_String(value): - value = string.split(value, ',') - parser.values.warn.extend(value) - - op.add_option('--warn', '--warning', - nargs=1, type="string", - dest="warn", default=[], - action="callback", callback=opt_warn, - help="Enable or disable warnings.", - metavar="WARNING-SPEC") - - op.add_option('-Y', '--repository', '--srcdir', - nargs=1, - dest="repository", default=[], - action="append", - help="Search REPOSITORY for source and target files.") - - # Options from Make and Cons classic that we do not yet support, - # but which we may support someday and whose (potential) meanings - # we don't want to change. These all get a "the -X option is not - # yet implemented" message and don't show up in the help output. - - def opt_not_yet(option, opt, value, parser): - msg = "Warning: the %s option is not yet implemented\n" % opt - sys.stderr.write(msg) - - op.add_option('-l', '--load-average', '--max-load', - nargs=1, type="int", - dest="load_average", default=0, - action="callback", callback=opt_not_yet, - # action="store", - # help="Don't start multiple jobs unless load is below " - # "LOAD-AVERAGE." - help=SUPPRESS_HELP) - op.add_option('--list-actions', - dest="list_actions", - action="callback", callback=opt_not_yet, - # help="Don't build; list files and build actions." - help=SUPPRESS_HELP) - op.add_option('--list-derived', - dest="list_derived", - action="callback", callback=opt_not_yet, - # help="Don't build; list files that would be built." - help=SUPPRESS_HELP) - op.add_option('--list-where', - dest="list_where", - action="callback", callback=opt_not_yet, - # help="Don't build; list files and where defined." - help=SUPPRESS_HELP) - op.add_option('-o', '--old-file', '--assume-old', - nargs=1, type="string", - dest="old_file", default=[], - action="callback", callback=opt_not_yet, - # action="append", - # help = "Consider FILE to be old; don't rebuild it." - help=SUPPRESS_HELP) - op.add_option('--override', - nargs=1, type="string", - action="callback", callback=opt_not_yet, - dest="override", - # help="Override variables as specified in FILE." - help=SUPPRESS_HELP) - op.add_option('-p', - action="callback", callback=opt_not_yet, - dest="p", - # help="Print internal environments/objects." - help=SUPPRESS_HELP) - op.add_option('-r', '-R', '--no-builtin-rules', '--no-builtin-variables', - action="callback", callback=opt_not_yet, - dest="no_builtin_rules", - # help="Clear default environments and variables." - help=SUPPRESS_HELP) - op.add_option('--write-filenames', - nargs=1, type="string", - dest="write_filenames", - action="callback", callback=opt_not_yet, - # help="Write all filenames examined into FILE." - help=SUPPRESS_HELP) - op.add_option('-W', '--new-file', '--assume-new', '--what-if', - nargs=1, type="string", - dest="new_file", - action="callback", callback=opt_not_yet, - # help="Consider FILE to be changed." - help=SUPPRESS_HELP) - op.add_option('--warn-undefined-variables', - dest="warn_undefined_variables", - action="callback", callback=opt_not_yet, - # help="Warn when an undefined variable is referenced." - help=SUPPRESS_HELP) - - return op - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Script/SConscript.py b/share/scons-local-1.3.0/SCons/Script/SConscript.py deleted file mode 100644 index 98a3126e73f9ffbdfb5e5fd9af77eb5694ddce2c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Script/SConscript.py +++ /dev/null @@ -1,642 +0,0 @@ -"""SCons.Script.SConscript - -This module defines the Python API provided to SConscript and SConstruct -files. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Script/SConscript.py 4720 2010/03/24 03:14:11 jars" - -import SCons -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Environment -import SCons.Errors -import SCons.Node -import SCons.Node.Alias -import SCons.Node.FS -import SCons.Platform -import SCons.SConf -import SCons.Script.Main -import SCons.Tool -import SCons.Util - -import os -import os.path -import re -import string -import sys -import traceback -import types -import UserList - -# The following variables used to live in this module. Some -# SConscript files out there may have referred to them directly as -# SCons.Script.SConscript.*. This is now supported by some special -# handling towards the bottom of the SConscript.__init__.py module. -#Arguments = {} -#ArgList = [] -#BuildTargets = TargetList() -#CommandLineTargets = [] -#DefaultTargets = [] - -class SConscriptReturn(Exception): - pass - -launch_dir = os.path.abspath(os.curdir) - -GlobalDict = None - -# global exports set by Export(): -global_exports = {} - -# chdir flag -sconscript_chdir = 1 - -def get_calling_namespaces(): - """Return the locals and globals for the function that called - into this module in the current call stack.""" - try: 1/0 - except ZeroDivisionError: - # Don't start iterating with the current stack-frame to - # prevent creating reference cycles (f_back is safe). - frame = sys.exc_info()[2].tb_frame.f_back - - # Find the first frame that *isn't* from this file. This means - # that we expect all of the SCons frames that implement an Export() - # or SConscript() call to be in this file, so that we can identify - # the first non-Script.SConscript frame as the user's local calling - # environment, and the locals and globals dictionaries from that - # frame as the calling namespaces. See the comment below preceding - # the DefaultEnvironmentCall block for even more explanation. - while frame.f_globals.get("__name__") == __name__: - frame = frame.f_back - - return frame.f_locals, frame.f_globals - - -def compute_exports(exports): - """Compute a dictionary of exports given one of the parameters - to the Export() function or the exports argument to SConscript().""" - - loc, glob = get_calling_namespaces() - - retval = {} - try: - for export in exports: - if SCons.Util.is_Dict(export): - retval.update(export) - else: - try: - retval[export] = loc[export] - except KeyError: - retval[export] = glob[export] - except KeyError, x: - raise SCons.Errors.UserError, "Export of non-existent variable '%s'"%x - - return retval - -class Frame: - """A frame on the SConstruct/SConscript call stack""" - def __init__(self, fs, exports, sconscript): - self.globals = BuildDefaultGlobals() - self.retval = None - self.prev_dir = fs.getcwd() - self.exports = compute_exports(exports) # exports from the calling SConscript - # make sure the sconscript attr is a Node. - if isinstance(sconscript, SCons.Node.Node): - self.sconscript = sconscript - elif sconscript == '-': - self.sconscript = None - else: - self.sconscript = fs.File(str(sconscript)) - -# the SConstruct/SConscript call stack: -call_stack = [] - -# For documentation on the methods in this file, see the scons man-page - -def Return(*vars, **kw): - retval = [] - try: - fvars = SCons.Util.flatten(vars) - for var in fvars: - for v in string.split(var): - retval.append(call_stack[-1].globals[v]) - except KeyError, x: - raise SCons.Errors.UserError, "Return of non-existent variable '%s'"%x - - if len(retval) == 1: - call_stack[-1].retval = retval[0] - else: - call_stack[-1].retval = tuple(retval) - - stop = kw.get('stop', True) - - if stop: - raise SConscriptReturn - - -stack_bottom = '% Stack boTTom %' # hard to define a variable w/this name :) - -def _SConscript(fs, *files, **kw): - top = fs.Top - sd = fs.SConstruct_dir.rdir() - exports = kw.get('exports', []) - - # evaluate each SConscript file - results = [] - for fn in files: - call_stack.append(Frame(fs, exports, fn)) - old_sys_path = sys.path - try: - SCons.Script.sconscript_reading = SCons.Script.sconscript_reading + 1 - if fn == "-": - exec sys.stdin in call_stack[-1].globals - else: - if isinstance(fn, SCons.Node.Node): - f = fn - else: - f = fs.File(str(fn)) - _file_ = None - - # Change directory to the top of the source - # tree to make sure the os's cwd and the cwd of - # fs match so we can open the SConscript. - fs.chdir(top, change_os_dir=1) - if f.rexists(): - actual = f.rfile() - _file_ = open(actual.get_abspath(), "r") - elif f.srcnode().rexists(): - actual = f.srcnode().rfile() - _file_ = open(actual.get_abspath(), "r") - elif f.has_src_builder(): - # The SConscript file apparently exists in a source - # code management system. Build it, but then clear - # the builder so that it doesn't get built *again* - # during the actual build phase. - f.build() - f.built() - f.builder_set(None) - if f.exists(): - _file_ = open(f.get_abspath(), "r") - if _file_: - # Chdir to the SConscript directory. Use a path - # name relative to the SConstruct file so that if - # we're using the -f option, we're essentially - # creating a parallel SConscript directory structure - # in our local directory tree. - # - # XXX This is broken for multiple-repository cases - # where the SConstruct and SConscript files might be - # in different Repositories. For now, cross that - # bridge when someone comes to it. - try: - src_dir = kw['src_dir'] - except KeyError: - ldir = fs.Dir(f.dir.get_path(sd)) - else: - ldir = fs.Dir(src_dir) - if not ldir.is_under(f.dir): - # They specified a source directory, but - # it's above the SConscript directory. - # Do the sensible thing and just use the - # SConcript directory. - ldir = fs.Dir(f.dir.get_path(sd)) - try: - fs.chdir(ldir, change_os_dir=sconscript_chdir) - except OSError: - # There was no local directory, so we should be - # able to chdir to the Repository directory. - # Note that we do this directly, not through - # fs.chdir(), because we still need to - # interpret the stuff within the SConscript file - # relative to where we are logically. - fs.chdir(ldir, change_os_dir=0) - os.chdir(actual.dir.get_abspath()) - - # Append the SConscript directory to the beginning - # of sys.path so Python modules in the SConscript - # directory can be easily imported. - sys.path = [ f.dir.get_abspath() ] + sys.path - - # This is the magic line that actually reads up - # and executes the stuff in the SConscript file. - # The locals for this frame contain the special - # bottom-of-the-stack marker so that any - # exceptions that occur when processing this - # SConscript can base the printed frames at this - # level and not show SCons internals as well. - call_stack[-1].globals.update({stack_bottom:1}) - old_file = call_stack[-1].globals.get('__file__') - try: - del call_stack[-1].globals['__file__'] - except KeyError: - pass - try: - try: - exec _file_ in call_stack[-1].globals - except SConscriptReturn: - pass - finally: - if old_file is not None: - call_stack[-1].globals.update({__file__:old_file}) - else: - SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning, - "Ignoring missing SConscript '%s'" % f.path) - - finally: - SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1 - sys.path = old_sys_path - frame = call_stack.pop() - try: - fs.chdir(frame.prev_dir, change_os_dir=sconscript_chdir) - except OSError: - # There was no local directory, so chdir to the - # Repository directory. Like above, we do this - # directly. - fs.chdir(frame.prev_dir, change_os_dir=0) - rdir = frame.prev_dir.rdir() - rdir._create() # Make sure there's a directory there. - try: - os.chdir(rdir.get_abspath()) - except OSError, e: - # We still couldn't chdir there, so raise the error, - # but only if actions are being executed. - # - # If the -n option was used, the directory would *not* - # have been created and we should just carry on and - # let things muddle through. This isn't guaranteed - # to work if the SConscript files are reading things - # from disk (for example), but it should work well - # enough for most configurations. - if SCons.Action.execute_actions: - raise e - - results.append(frame.retval) - - # if we only have one script, don't return a tuple - if len(results) == 1: - return results[0] - else: - return tuple(results) - -def SConscript_exception(file=sys.stderr): - """Print an exception stack trace just for the SConscript file(s). - This will show users who have Python errors where the problem is, - without cluttering the output with all of the internal calls leading - up to where we exec the SConscript.""" - exc_type, exc_value, exc_tb = sys.exc_info() - tb = exc_tb - while tb and not tb.tb_frame.f_locals.has_key(stack_bottom): - tb = tb.tb_next - if not tb: - # We did not find our exec statement, so this was actually a bug - # in SCons itself. Show the whole stack. - tb = exc_tb - stack = traceback.extract_tb(tb) - try: - type = exc_type.__name__ - except AttributeError: - type = str(exc_type) - if type[:11] == "exceptions.": - type = type[11:] - file.write('%s: %s:\n' % (type, exc_value)) - for fname, line, func, text in stack: - file.write(' File "%s", line %d:\n' % (fname, line)) - file.write(' %s\n' % text) - -def annotate(node): - """Annotate a node with the stack frame describing the - SConscript file and line number that created it.""" - tb = sys.exc_info()[2] - while tb and not tb.tb_frame.f_locals.has_key(stack_bottom): - tb = tb.tb_next - if not tb: - # We did not find any exec of an SConscript file: what?! - raise SCons.Errors.InternalError, "could not find SConscript stack frame" - node.creator = traceback.extract_stack(tb)[0] - -# The following line would cause each Node to be annotated using the -# above function. Unfortunately, this is a *huge* performance hit, so -# leave this disabled until we find a more efficient mechanism. -#SCons.Node.Annotate = annotate - -class SConsEnvironment(SCons.Environment.Base): - """An Environment subclass that contains all of the methods that - are particular to the wrapper SCons interface and which aren't - (or shouldn't be) part of the build engine itself. - - Note that not all of the methods of this class have corresponding - global functions, there are some private methods. - """ - - # - # Private methods of an SConsEnvironment. - # - def _exceeds_version(self, major, minor, v_major, v_minor): - """Return 1 if 'major' and 'minor' are greater than the version - in 'v_major' and 'v_minor', and 0 otherwise.""" - return (major > v_major or (major == v_major and minor > v_minor)) - - def _get_major_minor_revision(self, version_string): - """Split a version string into major, minor and (optionally) - revision parts. - - This is complicated by the fact that a version string can be - something like 3.2b1.""" - version = string.split(string.split(version_string, ' ')[0], '.') - v_major = int(version[0]) - v_minor = int(re.match('\d+', version[1]).group()) - if len(version) >= 3: - v_revision = int(re.match('\d+', version[2]).group()) - else: - v_revision = 0 - return v_major, v_minor, v_revision - - def _get_SConscript_filenames(self, ls, kw): - """ - Convert the parameters passed to # SConscript() calls into a list - of files and export variables. If the parameters are invalid, - throws SCons.Errors.UserError. Returns a tuple (l, e) where l - is a list of SConscript filenames and e is a list of exports. - """ - exports = [] - - if len(ls) == 0: - try: - dirs = kw["dirs"] - except KeyError: - raise SCons.Errors.UserError, \ - "Invalid SConscript usage - no parameters" - - if not SCons.Util.is_List(dirs): - dirs = [ dirs ] - dirs = map(str, dirs) - - name = kw.get('name', 'SConscript') - - files = map(lambda n, name = name: os.path.join(n, name), dirs) - - elif len(ls) == 1: - - files = ls[0] - - elif len(ls) == 2: - - files = ls[0] - exports = self.Split(ls[1]) - - else: - - raise SCons.Errors.UserError, \ - "Invalid SConscript() usage - too many arguments" - - if not SCons.Util.is_List(files): - files = [ files ] - - if kw.get('exports'): - exports.extend(self.Split(kw['exports'])) - - variant_dir = kw.get('variant_dir') or kw.get('build_dir') - if variant_dir: - if len(files) != 1: - raise SCons.Errors.UserError, \ - "Invalid SConscript() usage - can only specify one SConscript with a variant_dir" - duplicate = kw.get('duplicate', 1) - src_dir = kw.get('src_dir') - if not src_dir: - src_dir, fname = os.path.split(str(files[0])) - files = [os.path.join(str(variant_dir), fname)] - else: - if not isinstance(src_dir, SCons.Node.Node): - src_dir = self.fs.Dir(src_dir) - fn = files[0] - if not isinstance(fn, SCons.Node.Node): - fn = self.fs.File(fn) - if fn.is_under(src_dir): - # Get path relative to the source directory. - fname = fn.get_path(src_dir) - files = [os.path.join(str(variant_dir), fname)] - else: - files = [fn.abspath] - kw['src_dir'] = variant_dir - self.fs.VariantDir(variant_dir, src_dir, duplicate) - - return (files, exports) - - # - # Public methods of an SConsEnvironment. These get - # entry points in the global name space so they can be called - # as global functions. - # - - def Configure(self, *args, **kw): - if not SCons.Script.sconscript_reading: - raise SCons.Errors.UserError, "Calling Configure from Builders is not supported." - kw['_depth'] = kw.get('_depth', 0) + 1 - return apply(SCons.Environment.Base.Configure, (self,)+args, kw) - - def Default(self, *targets): - SCons.Script._Set_Default_Targets(self, targets) - - def EnsureSConsVersion(self, major, minor, revision=0): - """Exit abnormally if the SCons version is not late enough.""" - scons_ver = self._get_major_minor_revision(SCons.__version__) - if scons_ver < (major, minor, revision): - if revision: - scons_ver_string = '%d.%d.%d' % (major, minor, revision) - else: - scons_ver_string = '%d.%d' % (major, minor) - print "SCons %s or greater required, but you have SCons %s" % \ - (scons_ver_string, SCons.__version__) - sys.exit(2) - - def EnsurePythonVersion(self, major, minor): - """Exit abnormally if the Python version is not late enough.""" - try: - v_major, v_minor, v_micro, release, serial = sys.version_info - python_ver = (v_major, v_minor) - except AttributeError: - python_ver = self._get_major_minor_revision(sys.version)[:2] - if python_ver < (major, minor): - v = string.split(sys.version, " ", 1)[0] - print "Python %d.%d or greater required, but you have Python %s" %(major,minor,v) - sys.exit(2) - - def Exit(self, value=0): - sys.exit(value) - - def Export(self, *vars, **kw): - for var in vars: - global_exports.update(compute_exports(self.Split(var))) - global_exports.update(kw) - - def GetLaunchDir(self): - global launch_dir - return launch_dir - - def GetOption(self, name): - name = self.subst(name) - return SCons.Script.Main.GetOption(name) - - def Help(self, text): - text = self.subst(text, raw=1) - SCons.Script.HelpFunction(text) - - def Import(self, *vars): - try: - frame = call_stack[-1] - globals = frame.globals - exports = frame.exports - for var in vars: - var = self.Split(var) - for v in var: - if v == '*': - globals.update(global_exports) - globals.update(exports) - else: - if exports.has_key(v): - globals[v] = exports[v] - else: - globals[v] = global_exports[v] - except KeyError,x: - raise SCons.Errors.UserError, "Import of non-existent variable '%s'"%x - - def SConscript(self, *ls, **kw): - def subst_element(x, subst=self.subst): - if SCons.Util.is_List(x): - x = map(subst, x) - else: - x = subst(x) - return x - ls = map(subst_element, ls) - subst_kw = {} - for key, val in kw.items(): - if SCons.Util.is_String(val): - val = self.subst(val) - elif SCons.Util.is_List(val): - result = [] - for v in val: - if SCons.Util.is_String(v): - v = self.subst(v) - result.append(v) - val = result - subst_kw[key] = val - - files, exports = self._get_SConscript_filenames(ls, subst_kw) - subst_kw['exports'] = exports - return apply(_SConscript, [self.fs,] + files, subst_kw) - - def SConscriptChdir(self, flag): - global sconscript_chdir - sconscript_chdir = flag - - def SetOption(self, name, value): - name = self.subst(name) - SCons.Script.Main.SetOption(name, value) - -# -# -# -SCons.Environment.Environment = SConsEnvironment - -def Configure(*args, **kw): - if not SCons.Script.sconscript_reading: - raise SCons.Errors.UserError, "Calling Configure from Builders is not supported." - kw['_depth'] = 1 - return apply(SCons.SConf.SConf, args, kw) - -# It's very important that the DefaultEnvironmentCall() class stay in this -# file, with the get_calling_namespaces() function, the compute_exports() -# function, the Frame class and the SConsEnvironment.Export() method. -# These things make up the calling stack leading up to the actual global -# Export() or SConscript() call that the user issued. We want to allow -# users to export local variables that they define, like so: -# -# def func(): -# x = 1 -# Export('x') -# -# To support this, the get_calling_namespaces() function assumes that -# the *first* stack frame that's not from this file is the local frame -# for the Export() or SConscript() call. - -_DefaultEnvironmentProxy = None - -def get_DefaultEnvironmentProxy(): - global _DefaultEnvironmentProxy - if not _DefaultEnvironmentProxy: - default_env = SCons.Defaults.DefaultEnvironment() - _DefaultEnvironmentProxy = SCons.Environment.NoSubstitutionProxy(default_env) - return _DefaultEnvironmentProxy - -class DefaultEnvironmentCall: - """A class that implements "global function" calls of - Environment methods by fetching the specified method from the - DefaultEnvironment's class. Note that this uses an intermediate - proxy class instead of calling the DefaultEnvironment method - directly so that the proxy can override the subst() method and - thereby prevent expansion of construction variables (since from - the user's point of view this was called as a global function, - with no associated construction environment).""" - def __init__(self, method_name, subst=0): - self.method_name = method_name - if subst: - self.factory = SCons.Defaults.DefaultEnvironment - else: - self.factory = get_DefaultEnvironmentProxy - def __call__(self, *args, **kw): - env = self.factory() - method = getattr(env, self.method_name) - return apply(method, args, kw) - - -def BuildDefaultGlobals(): - """ - Create a dictionary containing all the default globals for - SConstruct and SConscript files. - """ - - global GlobalDict - if GlobalDict is None: - GlobalDict = {} - - import SCons.Script - d = SCons.Script.__dict__ - def not_a_module(m, d=d, mtype=type(SCons.Script)): - return type(d[m]) != mtype - for m in filter(not_a_module, dir(SCons.Script)): - GlobalDict[m] = d[m] - - return GlobalDict.copy() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Script/__init__.py b/share/scons-local-1.3.0/SCons/Script/__init__.py deleted file mode 100644 index 97af6da474e5dc94cf39fbdaf007a09a7d072629..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Script/__init__.py +++ /dev/null @@ -1,414 +0,0 @@ -"""SCons.Script - -This file implements the main() function used by the scons script. - -Architecturally, this *is* the scons script, and will likely only be -called from the external "scons" wrapper. Consequently, anything here -should not be, or be considered, part of the build engine. If it's -something that we expect other software to want to use, it should go in -some other module. If it's specific to the "scons" script invocation, -it goes here. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Script/__init__.py 4720 2010/03/24 03:14:11 jars" - -import time -start_time = time.time() - -import os -import string -import sys -import UserList - -# Special chicken-and-egg handling of the "--debug=memoizer" flag: -# -# SCons.Memoize contains a metaclass implementation that affects how -# the other classes are instantiated. The Memoizer may add shim methods -# to classes that have methods that cache computed values in order to -# count and report the hits and misses. -# -# If we wait to enable the Memoization until after we've parsed the -# command line options normally, it will be too late, because the Memoizer -# will have already analyzed the classes that it's Memoizing and decided -# to not add the shims. So we use a special-case, up-front check for -# the "--debug=memoizer" flag and enable Memoizer before we import any -# of the other modules that use it. - -_args = sys.argv + string.split(os.environ.get('SCONSFLAGS', '')) -if "--debug=memoizer" in _args: - import SCons.Memoize - import SCons.Warnings - try: - SCons.Memoize.EnableMemoization() - except SCons.Warnings.Warning: - # Some warning was thrown (inability to --debug=memoizer on - # Python 1.5.2 because it doesn't have metaclasses). Arrange - # for it to be displayed or not after warnings are configured. - import Main - exc_type, exc_value, tb = sys.exc_info() - Main.delayed_warnings.append((exc_type, exc_value)) -del _args - -import SCons.Action -import SCons.Builder -import SCons.Environment -import SCons.Node.FS -import SCons.Options -import SCons.Platform -import SCons.Scanner -import SCons.SConf -import SCons.Subst -import SCons.Tool -import SCons.Util -import SCons.Variables -import SCons.Defaults - -import Main - -main = Main.main - -# The following are global class definitions and variables that used to -# live directly in this module back before 0.96.90, when it contained -# a lot of code. Some SConscript files in widely-distributed packages -# (Blender is the specific example) actually reached into SCons.Script -# directly to use some of these. Rather than break those SConscript -# files, we're going to propagate these names into the SCons.Script -# namespace here. -# -# Some of these are commented out because it's *really* unlikely anyone -# used them, but we're going to leave the comment here to try to make -# it obvious what to do if the situation arises. -BuildTask = Main.BuildTask -CleanTask = Main.CleanTask -QuestionTask = Main.QuestionTask -#PrintHelp = Main.PrintHelp -#SConscriptSettableOptions = Main.SConscriptSettableOptions - -AddOption = Main.AddOption -GetOption = Main.GetOption -SetOption = Main.SetOption -Progress = Main.Progress -GetBuildFailures = Main.GetBuildFailures - -#keep_going_on_error = Main.keep_going_on_error -#print_dtree = Main.print_dtree -#print_explanations = Main.print_explanations -#print_includes = Main.print_includes -#print_objects = Main.print_objects -#print_time = Main.print_time -#print_tree = Main.print_tree -#memory_stats = Main.memory_stats -#ignore_errors = Main.ignore_errors -#sconscript_time = Main.sconscript_time -#command_time = Main.command_time -#exit_status = Main.exit_status -#profiling = Main.profiling -#repositories = Main.repositories - -# -import SConscript -_SConscript = SConscript - -call_stack = _SConscript.call_stack - -# -Action = SCons.Action.Action -AddMethod = SCons.Util.AddMethod -AllowSubstExceptions = SCons.Subst.SetAllowableExceptions -Builder = SCons.Builder.Builder -Configure = _SConscript.Configure -Environment = SCons.Environment.Environment -#OptParser = SCons.SConsOptions.OptParser -FindPathDirs = SCons.Scanner.FindPathDirs -Platform = SCons.Platform.Platform -Return = _SConscript.Return -Scanner = SCons.Scanner.Base -Tool = SCons.Tool.Tool -WhereIs = SCons.Util.WhereIs - -# -BoolVariable = SCons.Variables.BoolVariable -EnumVariable = SCons.Variables.EnumVariable -ListVariable = SCons.Variables.ListVariable -PackageVariable = SCons.Variables.PackageVariable -PathVariable = SCons.Variables.PathVariable - -# Deprecated names that will go away some day. -BoolOption = SCons.Options.BoolOption -EnumOption = SCons.Options.EnumOption -ListOption = SCons.Options.ListOption -PackageOption = SCons.Options.PackageOption -PathOption = SCons.Options.PathOption - -# Action factories. -Chmod = SCons.Defaults.Chmod -Copy = SCons.Defaults.Copy -Delete = SCons.Defaults.Delete -Mkdir = SCons.Defaults.Mkdir -Move = SCons.Defaults.Move -Touch = SCons.Defaults.Touch - -# Pre-made, public scanners. -CScanner = SCons.Tool.CScanner -DScanner = SCons.Tool.DScanner -DirScanner = SCons.Defaults.DirScanner -ProgramScanner = SCons.Tool.ProgramScanner -SourceFileScanner = SCons.Tool.SourceFileScanner - -# Functions we might still convert to Environment methods. -CScan = SCons.Defaults.CScan -DefaultEnvironment = SCons.Defaults.DefaultEnvironment - -# Other variables we provide. -class TargetList(UserList.UserList): - def _do_nothing(self, *args, **kw): - pass - def _add_Default(self, list): - self.extend(list) - def _clear(self): - del self[:] - -ARGUMENTS = {} -ARGLIST = [] -BUILD_TARGETS = TargetList() -COMMAND_LINE_TARGETS = [] -DEFAULT_TARGETS = [] - -# BUILD_TARGETS can be modified in the SConscript files. If so, we -# want to treat the modified BUILD_TARGETS list as if they specified -# targets on the command line. To do that, though, we need to know if -# BUILD_TARGETS was modified through "official" APIs or by hand. We do -# this by updating two lists in parallel, the documented BUILD_TARGETS -# list, above, and this internal _build_plus_default targets list which -# should only have "official" API changes. Then Script/Main.py can -# compare these two afterwards to figure out if the user added their -# own targets to BUILD_TARGETS. -_build_plus_default = TargetList() - -def _Add_Arguments(alist): - for arg in alist: - a, b = string.split(arg, '=', 1) - ARGUMENTS[a] = b - ARGLIST.append((a, b)) - -def _Add_Targets(tlist): - if tlist: - COMMAND_LINE_TARGETS.extend(tlist) - BUILD_TARGETS.extend(tlist) - BUILD_TARGETS._add_Default = BUILD_TARGETS._do_nothing - BUILD_TARGETS._clear = BUILD_TARGETS._do_nothing - _build_plus_default.extend(tlist) - _build_plus_default._add_Default = _build_plus_default._do_nothing - _build_plus_default._clear = _build_plus_default._do_nothing - -def _Set_Default_Targets_Has_Been_Called(d, fs): - return DEFAULT_TARGETS - -def _Set_Default_Targets_Has_Not_Been_Called(d, fs): - if d is None: - d = [fs.Dir('.')] - return d - -_Get_Default_Targets = _Set_Default_Targets_Has_Not_Been_Called - -def _Set_Default_Targets(env, tlist): - global DEFAULT_TARGETS - global _Get_Default_Targets - _Get_Default_Targets = _Set_Default_Targets_Has_Been_Called - for t in tlist: - if t is None: - # Delete the elements from the list in-place, don't - # reassign an empty list to DEFAULT_TARGETS, so that the - # variables will still point to the same object we point to. - del DEFAULT_TARGETS[:] - BUILD_TARGETS._clear() - _build_plus_default._clear() - elif isinstance(t, SCons.Node.Node): - DEFAULT_TARGETS.append(t) - BUILD_TARGETS._add_Default([t]) - _build_plus_default._add_Default([t]) - else: - nodes = env.arg2nodes(t, env.fs.Entry) - DEFAULT_TARGETS.extend(nodes) - BUILD_TARGETS._add_Default(nodes) - _build_plus_default._add_Default(nodes) - -# -help_text = None - -def HelpFunction(text): - global help_text - if SCons.Script.help_text is None: - SCons.Script.help_text = text - else: - help_text = help_text + text - -# -# Will be non-zero if we are reading an SConscript file. -sconscript_reading = 0 - -# -def Variables(files=[], args=ARGUMENTS): - return SCons.Variables.Variables(files, args) - -def Options(files=[], args=ARGUMENTS): - return SCons.Options.Options(files, args) - -# The list of global functions to add to the SConscript name space -# that end up calling corresponding methods or Builders in the -# DefaultEnvironment(). -GlobalDefaultEnvironmentFunctions = [ - # Methods from the SConsEnvironment class, above. - 'Default', - 'EnsurePythonVersion', - 'EnsureSConsVersion', - 'Exit', - 'Export', - 'GetLaunchDir', - 'Help', - 'Import', - #'SConscript', is handled separately, below. - 'SConscriptChdir', - - # Methods from the Environment.Base class. - 'AddPostAction', - 'AddPreAction', - 'Alias', - 'AlwaysBuild', - 'BuildDir', - 'CacheDir', - 'Clean', - #The Command() method is handled separately, below. - 'Decider', - 'Depends', - 'Dir', - 'NoClean', - 'NoCache', - 'Entry', - 'Execute', - 'File', - 'FindFile', - 'FindInstalledFiles', - 'FindSourceFiles', - 'Flatten', - 'GetBuildPath', - 'Glob', - 'Ignore', - 'Install', - 'InstallAs', - 'Literal', - 'Local', - 'ParseDepends', - 'Precious', - 'Repository', - 'Requires', - 'SConsignFile', - 'SideEffect', - 'SourceCode', - 'SourceSignatures', - 'Split', - 'Tag', - 'TargetSignatures', - 'Value', - 'VariantDir', -] - -GlobalDefaultBuilders = [ - # Supported builders. - 'CFile', - 'CXXFile', - 'DVI', - 'Jar', - 'Java', - 'JavaH', - 'Library', - 'M4', - 'MSVSProject', - 'Object', - 'PCH', - 'PDF', - 'PostScript', - 'Program', - 'RES', - 'RMIC', - 'SharedLibrary', - 'SharedObject', - 'StaticLibrary', - 'StaticObject', - 'Tar', - 'TypeLibrary', - 'Zip', - 'Package', -] - -for name in GlobalDefaultEnvironmentFunctions + GlobalDefaultBuilders: - exec "%s = _SConscript.DefaultEnvironmentCall(%s)" % (name, repr(name)) -del name - -# There are a handful of variables that used to live in the -# Script/SConscript.py module that some SConscript files out there were -# accessing directly as SCons.Script.SConscript.*. The problem is that -# "SConscript" in this namespace is no longer a module, it's a global -# function call--or more precisely, an object that implements a global -# function call through the default Environment. Nevertheless, we can -# maintain backwards compatibility for SConscripts that were reaching in -# this way by hanging some attributes off the "SConscript" object here. -SConscript = _SConscript.DefaultEnvironmentCall('SConscript') - -# Make SConscript look enough like the module it used to be so -# that pychecker doesn't barf. -SConscript.__name__ = 'SConscript' - -SConscript.Arguments = ARGUMENTS -SConscript.ArgList = ARGLIST -SConscript.BuildTargets = BUILD_TARGETS -SConscript.CommandLineTargets = COMMAND_LINE_TARGETS -SConscript.DefaultTargets = DEFAULT_TARGETS - -# The global Command() function must be handled differently than the -# global functions for other construction environment methods because -# we want people to be able to use Actions that must expand $TARGET -# and $SOURCE later, when (and if) the Action is invoked to build -# the target(s). We do this with the subst=1 argument, which creates -# a DefaultEnvironmentCall instance that wraps up a normal default -# construction environment that performs variable substitution, not a -# proxy that doesn't. -# -# There's a flaw here, though, because any other $-variables on a command -# line will *also* be expanded, each to a null string, but that should -# only be a problem in the unusual case where someone was passing a '$' -# on a command line and *expected* the $ to get through to the shell -# because they were calling Command() and not env.Command()... This is -# unlikely enough that we're going to leave this as is and cross that -# bridge if someone actually comes to it. -Command = _SConscript.DefaultEnvironmentCall('Command', subst=1) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Sig.py b/share/scons-local-1.3.0/SCons/Sig.py deleted file mode 100644 index 1da6ccb4ed0d2aa4be09104d3af8c963043094fe..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Sig.py +++ /dev/null @@ -1,63 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Sig.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Place-holder for the old SCons.Sig module hierarchy - -This is no longer used, but code out there (such as the NSIS module on -the SCons wiki) may try to import SCons.Sig. If so, we generate a warning -that points them to the line that caused the import, and don't die. - -If someone actually tried to use the sub-modules or functions within -the package (for example, SCons.Sig.MD5.signature()), then they'll still -get an AttributeError, but at least they'll know where to start looking. -""" - -import SCons.Util -import SCons.Warnings - -msg = 'The SCons.Sig module no longer exists.\n' \ - ' Remove the following "import SCons.Sig" line to eliminate this warning:' - -SCons.Warnings.warn(SCons.Warnings.DeprecatedWarning, msg) - -default_calc = None -default_module = None - -class MD5Null(SCons.Util.Null): - def __repr__(self): - return "MD5Null()" - -class TimeStampNull(SCons.Util.Null): - def __repr__(self): - return "TimeStampNull()" - -MD5 = MD5Null() -TimeStamp = TimeStampNull() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Subst.py b/share/scons-local-1.3.0/SCons/Subst.py deleted file mode 100644 index fe18f08fd8e53d66ff01565187d852b4be16c98e..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Subst.py +++ /dev/null @@ -1,911 +0,0 @@ -"""SCons.Subst - -SCons string substitution. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Subst.py 4720 2010/03/24 03:14:11 jars" - -import re -import string -import types -import UserList -import UserString - -import SCons.Errors - -from SCons.Util import is_String, is_Sequence - -# Indexed by the SUBST_* constants below. -_strconv = [SCons.Util.to_String_for_subst, - SCons.Util.to_String_for_subst, - SCons.Util.to_String_for_signature] - - - -AllowableExceptions = (IndexError, NameError) - -def SetAllowableExceptions(*excepts): - global AllowableExceptions - AllowableExceptions = filter(None, excepts) - -def raise_exception(exception, target, s): - name = exception.__class__.__name__ - msg = "%s `%s' trying to evaluate `%s'" % (name, exception, s) - if target: - raise SCons.Errors.BuildError, (target[0], msg) - else: - raise SCons.Errors.UserError, msg - - - -class Literal: - """A wrapper for a string. If you use this object wrapped - around a string, then it will be interpreted as literal. - When passed to the command interpreter, all special - characters will be escaped.""" - def __init__(self, lstr): - self.lstr = lstr - - def __str__(self): - return self.lstr - - def escape(self, escape_func): - return escape_func(self.lstr) - - def for_signature(self): - return self.lstr - - def is_literal(self): - return 1 - -class SpecialAttrWrapper: - """This is a wrapper for what we call a 'Node special attribute.' - This is any of the attributes of a Node that we can reference from - Environment variable substitution, such as $TARGET.abspath or - $SOURCES[1].filebase. We implement the same methods as Literal - so we can handle special characters, plus a for_signature method, - such that we can return some canonical string during signature - calculation to avoid unnecessary rebuilds.""" - - def __init__(self, lstr, for_signature=None): - """The for_signature parameter, if supplied, will be the - canonical string we return from for_signature(). Else - we will simply return lstr.""" - self.lstr = lstr - if for_signature: - self.forsig = for_signature - else: - self.forsig = lstr - - def __str__(self): - return self.lstr - - def escape(self, escape_func): - return escape_func(self.lstr) - - def for_signature(self): - return self.forsig - - def is_literal(self): - return 1 - -def quote_spaces(arg): - """Generic function for putting double quotes around any string that - has white space in it.""" - if ' ' in arg or '\t' in arg: - return '"%s"' % arg - else: - return str(arg) - -class CmdStringHolder(UserString.UserString): - """This is a special class used to hold strings generated by - scons_subst() and scons_subst_list(). It defines a special method - escape(). When passed a function with an escape algorithm for a - particular platform, it will return the contained string with the - proper escape sequences inserted. - """ - def __init__(self, cmd, literal=None): - UserString.UserString.__init__(self, cmd) - self.literal = literal - - def is_literal(self): - return self.literal - - def escape(self, escape_func, quote_func=quote_spaces): - """Escape the string with the supplied function. The - function is expected to take an arbitrary string, then - return it with all special characters escaped and ready - for passing to the command interpreter. - - After calling this function, the next call to str() will - return the escaped string. - """ - - if self.is_literal(): - return escape_func(self.data) - elif ' ' in self.data or '\t' in self.data: - return quote_func(self.data) - else: - return self.data - -def escape_list(list, escape_func): - """Escape a list of arguments by running the specified escape_func - on every object in the list that has an escape() method.""" - def escape(obj, escape_func=escape_func): - try: - e = obj.escape - except AttributeError: - return obj - else: - return e(escape_func) - return map(escape, list) - -class NLWrapper: - """A wrapper class that delays turning a list of sources or targets - into a NodeList until it's needed. The specified function supplied - when the object is initialized is responsible for turning raw nodes - into proxies that implement the special attributes like .abspath, - .source, etc. This way, we avoid creating those proxies just - "in case" someone is going to use $TARGET or the like, and only - go through the trouble if we really have to. - - In practice, this might be a wash performance-wise, but it's a little - cleaner conceptually... - """ - - def __init__(self, list, func): - self.list = list - self.func = func - def _return_nodelist(self): - return self.nodelist - def _gen_nodelist(self): - list = self.list - if list is None: - list = [] - elif not is_Sequence(list): - list = [list] - # The map(self.func) call is what actually turns - # a list into appropriate proxies. - self.nodelist = SCons.Util.NodeList(map(self.func, list)) - self._create_nodelist = self._return_nodelist - return self.nodelist - _create_nodelist = _gen_nodelist - - -class Targets_or_Sources(UserList.UserList): - """A class that implements $TARGETS or $SOURCES expansions by in turn - wrapping a NLWrapper. This class handles the different methods used - to access the list, calling the NLWrapper to create proxies on demand. - - Note that we subclass UserList.UserList purely so that the - is_Sequence() function will identify an object of this class as - a list during variable expansion. We're not really using any - UserList.UserList methods in practice. - """ - def __init__(self, nl): - self.nl = nl - def __getattr__(self, attr): - nl = self.nl._create_nodelist() - return getattr(nl, attr) - def __getitem__(self, i): - nl = self.nl._create_nodelist() - return nl[i] - def __getslice__(self, i, j): - nl = self.nl._create_nodelist() - i = max(i, 0); j = max(j, 0) - return nl[i:j] - def __str__(self): - nl = self.nl._create_nodelist() - return str(nl) - def __repr__(self): - nl = self.nl._create_nodelist() - return repr(nl) - -class Target_or_Source: - """A class that implements $TARGET or $SOURCE expansions by in turn - wrapping a NLWrapper. This class handles the different methods used - to access an individual proxy Node, calling the NLWrapper to create - a proxy on demand. - """ - def __init__(self, nl): - self.nl = nl - def __getattr__(self, attr): - nl = self.nl._create_nodelist() - try: - nl0 = nl[0] - except IndexError: - # If there is nothing in the list, then we have no attributes to - # pass through, so raise AttributeError for everything. - raise AttributeError, "NodeList has no attribute: %s" % attr - return getattr(nl0, attr) - def __str__(self): - nl = self.nl._create_nodelist() - if nl: - return str(nl[0]) - return '' - def __repr__(self): - nl = self.nl._create_nodelist() - if nl: - return repr(nl[0]) - return '' - -class NullNodeList(SCons.Util.NullSeq): - def __call__(self, *args, **kwargs): return '' - def __str__(self): return '' - # TODO(1.5): unneeded after new-style classes introduce iterators - def __getitem__(self, i): - raise IndexError - -NullNodesList = NullNodeList() - -def subst_dict(target, source): - """Create a dictionary for substitution of special - construction variables. - - This translates the following special arguments: - - target - the target (object or array of objects), - used to generate the TARGET and TARGETS - construction variables - - source - the source (object or array of objects), - used to generate the SOURCES and SOURCE - construction variables - """ - dict = {} - - if target: - def get_tgt_subst_proxy(thing): - try: - subst_proxy = thing.get_subst_proxy() - except AttributeError: - subst_proxy = thing # probably a string, just return it - return subst_proxy - tnl = NLWrapper(target, get_tgt_subst_proxy) - dict['TARGETS'] = Targets_or_Sources(tnl) - dict['TARGET'] = Target_or_Source(tnl) - - # This is a total cheat, but hopefully this dictionary goes - # away soon anyway. We just let these expand to $TARGETS - # because that's "good enough" for the use of ToolSurrogates - # (see test/ToolSurrogate.py) to generate documentation. - dict['CHANGED_TARGETS'] = '$TARGETS' - dict['UNCHANGED_TARGETS'] = '$TARGETS' - else: - dict['TARGETS'] = NullNodesList - dict['TARGET'] = NullNodesList - - if source: - def get_src_subst_proxy(node): - try: - rfile = node.rfile - except AttributeError: - pass - else: - node = rfile() - try: - return node.get_subst_proxy() - except AttributeError: - return node # probably a String, just return it - snl = NLWrapper(source, get_src_subst_proxy) - dict['SOURCES'] = Targets_or_Sources(snl) - dict['SOURCE'] = Target_or_Source(snl) - - # This is a total cheat, but hopefully this dictionary goes - # away soon anyway. We just let these expand to $TARGETS - # because that's "good enough" for the use of ToolSurrogates - # (see test/ToolSurrogate.py) to generate documentation. - dict['CHANGED_SOURCES'] = '$SOURCES' - dict['UNCHANGED_SOURCES'] = '$SOURCES' - else: - dict['SOURCES'] = NullNodesList - dict['SOURCE'] = NullNodesList - - return dict - -# Constants for the "mode" parameter to scons_subst_list() and -# scons_subst(). SUBST_RAW gives the raw command line. SUBST_CMD -# gives a command line suitable for passing to a shell. SUBST_SIG -# gives a command line appropriate for calculating the signature -# of a command line...if this changes, we should rebuild. -SUBST_CMD = 0 -SUBST_RAW = 1 -SUBST_SIG = 2 - -_rm = re.compile(r'\$[()]') -_remove = re.compile(r'\$\([^\$]*(\$[^\)][^\$]*)*\$\)') - -# Indexed by the SUBST_* constants above. -_regex_remove = [ _rm, None, _remove ] - -def _rm_list(list): - #return [ l for l in list if not l in ('$(', '$)') ] - return filter(lambda l: not l in ('$(', '$)'), list) - -def _remove_list(list): - result = [] - do_append = result.append - for l in list: - if l == '$(': - do_append = lambda x: None - elif l == '$)': - do_append = result.append - else: - do_append(l) - return result - -# Indexed by the SUBST_* constants above. -_list_remove = [ _rm_list, None, _remove_list ] - -# Regular expressions for splitting strings and handling substitutions, -# for use by the scons_subst() and scons_subst_list() functions: -# -# The first expression compiled matches all of the $-introduced tokens -# that we need to process in some way, and is used for substitutions. -# The expressions it matches are: -# -# "$$" -# "$(" -# "$)" -# "$variable" [must begin with alphabetic or underscore] -# "${any stuff}" -# -# The second expression compiled is used for splitting strings into tokens -# to be processed, and it matches all of the tokens listed above, plus -# the following that affect how arguments do or don't get joined together: -# -# " " [white space] -# "non-white-space" [without any dollar signs] -# "$" [single dollar sign] -# -_dollar_exps_str = r'\$[\$\(\)]|\$[_a-zA-Z][\.\w]*|\${[^}]*}' -_dollar_exps = re.compile(r'(%s)' % _dollar_exps_str) -_separate_args = re.compile(r'(%s|\s+|[^\s\$]+|\$)' % _dollar_exps_str) - -# This regular expression is used to replace strings of multiple white -# space characters in the string result from the scons_subst() function. -_space_sep = re.compile(r'[\t ]+(?![^{]*})') - -def scons_subst(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None): - """Expand a string or list containing construction variable - substitutions. - - This is the work-horse function for substitutions in file names - and the like. The companion scons_subst_list() function (below) - handles separating command lines into lists of arguments, so see - that function if that's what you're looking for. - """ - if type(strSubst) == types.StringType and string.find(strSubst, '$') < 0: - return strSubst - - class StringSubber: - """A class to construct the results of a scons_subst() call. - - This binds a specific construction environment, mode, target and - source with two methods (substitute() and expand()) that handle - the expansion. - """ - def __init__(self, env, mode, conv, gvars): - self.env = env - self.mode = mode - self.conv = conv - self.gvars = gvars - - def expand(self, s, lvars): - """Expand a single "token" as necessary, returning an - appropriate string containing the expansion. - - This handles expanding different types of things (strings, - lists, callables) appropriately. It calls the wrapper - substitute() method to re-expand things as necessary, so that - the results of expansions of side-by-side strings still get - re-evaluated separately, not smushed together. - """ - if is_String(s): - try: - s0, s1 = s[:2] - except (IndexError, ValueError): - return s - if s0 != '$': - return s - if s1 == '$': - return '$' - elif s1 in '()': - return s - else: - key = s[1:] - if key[0] == '{' or string.find(key, '.') >= 0: - if key[0] == '{': - key = key[1:-1] - try: - s = eval(key, self.gvars, lvars) - except KeyboardInterrupt: - raise - except Exception, e: - if e.__class__ in AllowableExceptions: - return '' - raise_exception(e, lvars['TARGETS'], s) - else: - if lvars.has_key(key): - s = lvars[key] - elif self.gvars.has_key(key): - s = self.gvars[key] - elif not NameError in AllowableExceptions: - raise_exception(NameError(key), lvars['TARGETS'], s) - else: - return '' - - # Before re-expanding the result, handle - # recursive expansion by copying the local - # variable dictionary and overwriting a null - # string for the value of the variable name - # we just expanded. - # - # This could potentially be optimized by only - # copying lvars when s contains more expansions, - # but lvars is usually supposed to be pretty - # small, and deeply nested variable expansions - # are probably more the exception than the norm, - # so it should be tolerable for now. - lv = lvars.copy() - var = string.split(key, '.')[0] - lv[var] = '' - return self.substitute(s, lv) - elif is_Sequence(s): - def func(l, conv=self.conv, substitute=self.substitute, lvars=lvars): - return conv(substitute(l, lvars)) - return map(func, s) - elif callable(s): - try: - s = s(target=lvars['TARGETS'], - source=lvars['SOURCES'], - env=self.env, - for_signature=(self.mode != SUBST_CMD)) - except TypeError: - # This probably indicates that it's a callable - # object that doesn't match our calling arguments - # (like an Action). - if self.mode == SUBST_RAW: - return s - s = self.conv(s) - return self.substitute(s, lvars) - elif s is None: - return '' - else: - return s - - def substitute(self, args, lvars): - """Substitute expansions in an argument or list of arguments. - - This serves as a wrapper for splitting up a string into - separate tokens. - """ - if is_String(args) and not isinstance(args, CmdStringHolder): - args = str(args) # In case it's a UserString. - try: - def sub_match(match, conv=self.conv, expand=self.expand, lvars=lvars): - return conv(expand(match.group(1), lvars)) - result = _dollar_exps.sub(sub_match, args) - except TypeError: - # If the internal conversion routine doesn't return - # strings (it could be overridden to return Nodes, for - # example), then the 1.5.2 re module will throw this - # exception. Back off to a slower, general-purpose - # algorithm that works for all data types. - args = _separate_args.findall(args) - result = [] - for a in args: - result.append(self.conv(self.expand(a, lvars))) - if len(result) == 1: - result = result[0] - else: - result = string.join(map(str, result), '') - return result - else: - return self.expand(args, lvars) - - if conv is None: - conv = _strconv[mode] - - # Doing this every time is a bit of a waste, since the Executor - # has typically already populated the OverrideEnvironment with - # $TARGET/$SOURCE variables. We're keeping this (for now), though, - # because it supports existing behavior that allows us to call - # an Action directly with an arbitrary target+source pair, which - # we use in Tool/tex.py to handle calling $BIBTEX when necessary. - # If we dropped that behavior (or found another way to cover it), - # we could get rid of this call completely and just rely on the - # Executor setting the variables. - if not lvars.has_key('TARGET'): - d = subst_dict(target, source) - if d: - lvars = lvars.copy() - lvars.update(d) - - # We're (most likely) going to eval() things. If Python doesn't - # find a __builtins__ value in the global dictionary used for eval(), - # it copies the current global values for you. Avoid this by - # setting it explicitly and then deleting, so we don't pollute the - # construction environment Dictionary(ies) that are typically used - # for expansion. - gvars['__builtins__'] = __builtins__ - - ss = StringSubber(env, mode, conv, gvars) - result = ss.substitute(strSubst, lvars) - - try: - del gvars['__builtins__'] - except KeyError: - pass - - if is_String(result): - # Remove $(-$) pairs and any stuff in between, - # if that's appropriate. - remove = _regex_remove[mode] - if remove: - result = remove.sub('', result) - if mode != SUBST_RAW: - # Compress strings of white space characters into - # a single space. - result = string.strip(_space_sep.sub(' ', result)) - elif is_Sequence(result): - remove = _list_remove[mode] - if remove: - result = remove(result) - - return result - -#Subst_List_Strings = {} - -def scons_subst_list(strSubst, env, mode=SUBST_RAW, target=None, source=None, gvars={}, lvars={}, conv=None): - """Substitute construction variables in a string (or list or other - object) and separate the arguments into a command list. - - The companion scons_subst() function (above) handles basic - substitutions within strings, so see that function instead - if that's what you're looking for. - """ -# try: -# Subst_List_Strings[strSubst] = Subst_List_Strings[strSubst] + 1 -# except KeyError: -# Subst_List_Strings[strSubst] = 1 -# import SCons.Debug -# SCons.Debug.caller_trace(1) - class ListSubber(UserList.UserList): - """A class to construct the results of a scons_subst_list() call. - - Like StringSubber, this class binds a specific construction - environment, mode, target and source with two methods - (substitute() and expand()) that handle the expansion. - - In addition, however, this class is used to track the state of - the result(s) we're gathering so we can do the appropriate thing - whenever we have to append another word to the result--start a new - line, start a new word, append to the current word, etc. We do - this by setting the "append" attribute to the right method so - that our wrapper methods only need ever call ListSubber.append(), - and the rest of the object takes care of doing the right thing - internally. - """ - def __init__(self, env, mode, conv, gvars): - UserList.UserList.__init__(self, []) - self.env = env - self.mode = mode - self.conv = conv - self.gvars = gvars - - if self.mode == SUBST_RAW: - self.add_strip = lambda x, s=self: s.append(x) - else: - self.add_strip = lambda x, s=self: None - self.in_strip = None - self.next_line() - - def expand(self, s, lvars, within_list): - """Expand a single "token" as necessary, appending the - expansion to the current result. - - This handles expanding different types of things (strings, - lists, callables) appropriately. It calls the wrapper - substitute() method to re-expand things as necessary, so that - the results of expansions of side-by-side strings still get - re-evaluated separately, not smushed together. - """ - - if is_String(s): - try: - s0, s1 = s[:2] - except (IndexError, ValueError): - self.append(s) - return - if s0 != '$': - self.append(s) - return - if s1 == '$': - self.append('$') - elif s1 == '(': - self.open_strip('$(') - elif s1 == ')': - self.close_strip('$)') - else: - key = s[1:] - if key[0] == '{' or string.find(key, '.') >= 0: - if key[0] == '{': - key = key[1:-1] - try: - s = eval(key, self.gvars, lvars) - except KeyboardInterrupt: - raise - except Exception, e: - if e.__class__ in AllowableExceptions: - return - raise_exception(e, lvars['TARGETS'], s) - else: - if lvars.has_key(key): - s = lvars[key] - elif self.gvars.has_key(key): - s = self.gvars[key] - elif not NameError in AllowableExceptions: - raise_exception(NameError(), lvars['TARGETS'], s) - else: - return - - # Before re-expanding the result, handle - # recursive expansion by copying the local - # variable dictionary and overwriting a null - # string for the value of the variable name - # we just expanded. - lv = lvars.copy() - var = string.split(key, '.')[0] - lv[var] = '' - self.substitute(s, lv, 0) - self.this_word() - elif is_Sequence(s): - for a in s: - self.substitute(a, lvars, 1) - self.next_word() - elif callable(s): - try: - s = s(target=lvars['TARGETS'], - source=lvars['SOURCES'], - env=self.env, - for_signature=(self.mode != SUBST_CMD)) - except TypeError: - # This probably indicates that it's a callable - # object that doesn't match our calling arguments - # (like an Action). - if self.mode == SUBST_RAW: - self.append(s) - return - s = self.conv(s) - self.substitute(s, lvars, within_list) - elif s is None: - self.this_word() - else: - self.append(s) - - def substitute(self, args, lvars, within_list): - """Substitute expansions in an argument or list of arguments. - - This serves as a wrapper for splitting up a string into - separate tokens. - """ - - if is_String(args) and not isinstance(args, CmdStringHolder): - args = str(args) # In case it's a UserString. - args = _separate_args.findall(args) - for a in args: - if a[0] in ' \t\n\r\f\v': - if '\n' in a: - self.next_line() - elif within_list: - self.append(a) - else: - self.next_word() - else: - self.expand(a, lvars, within_list) - else: - self.expand(args, lvars, within_list) - - def next_line(self): - """Arrange for the next word to start a new line. This - is like starting a new word, except that we have to append - another line to the result.""" - UserList.UserList.append(self, []) - self.next_word() - - def this_word(self): - """Arrange for the next word to append to the end of the - current last word in the result.""" - self.append = self.add_to_current_word - - def next_word(self): - """Arrange for the next word to start a new word.""" - self.append = self.add_new_word - - def add_to_current_word(self, x): - """Append the string x to the end of the current last word - in the result. If that is not possible, then just add - it as a new word. Make sure the entire concatenated string - inherits the object attributes of x (in particular, the - escape function) by wrapping it as CmdStringHolder.""" - - if not self.in_strip or self.mode != SUBST_SIG: - try: - current_word = self[-1][-1] - except IndexError: - self.add_new_word(x) - else: - # All right, this is a hack and it should probably - # be refactored out of existence in the future. - # The issue is that we want to smoosh words together - # and make one file name that gets escaped if - # we're expanding something like foo$EXTENSION, - # but we don't want to smoosh them together if - # it's something like >$TARGET, because then we'll - # treat the '>' like it's part of the file name. - # So for now, just hard-code looking for the special - # command-line redirection characters... - try: - last_char = str(current_word)[-1] - except IndexError: - last_char = '\0' - if last_char in '<>|': - self.add_new_word(x) - else: - y = current_word + x - - # We used to treat a word appended to a literal - # as a literal itself, but this caused problems - # with interpreting quotes around space-separated - # targets on command lines. Removing this makes - # none of the "substantive" end-to-end tests fail, - # so we'll take this out but leave it commented - # for now in case there's a problem not covered - # by the test cases and we need to resurrect this. - #literal1 = self.literal(self[-1][-1]) - #literal2 = self.literal(x) - y = self.conv(y) - if is_String(y): - #y = CmdStringHolder(y, literal1 or literal2) - y = CmdStringHolder(y, None) - self[-1][-1] = y - - def add_new_word(self, x): - if not self.in_strip or self.mode != SUBST_SIG: - literal = self.literal(x) - x = self.conv(x) - if is_String(x): - x = CmdStringHolder(x, literal) - self[-1].append(x) - self.append = self.add_to_current_word - - def literal(self, x): - try: - l = x.is_literal - except AttributeError: - return None - else: - return l() - - def open_strip(self, x): - """Handle the "open strip" $( token.""" - self.add_strip(x) - self.in_strip = 1 - - def close_strip(self, x): - """Handle the "close strip" $) token.""" - self.add_strip(x) - self.in_strip = None - - if conv is None: - conv = _strconv[mode] - - # Doing this every time is a bit of a waste, since the Executor - # has typically already populated the OverrideEnvironment with - # $TARGET/$SOURCE variables. We're keeping this (for now), though, - # because it supports existing behavior that allows us to call - # an Action directly with an arbitrary target+source pair, which - # we use in Tool/tex.py to handle calling $BIBTEX when necessary. - # If we dropped that behavior (or found another way to cover it), - # we could get rid of this call completely and just rely on the - # Executor setting the variables. - if not lvars.has_key('TARGET'): - d = subst_dict(target, source) - if d: - lvars = lvars.copy() - lvars.update(d) - - # We're (most likely) going to eval() things. If Python doesn't - # find a __builtins__ value in the global dictionary used for eval(), - # it copies the current global values for you. Avoid this by - # setting it explicitly and then deleting, so we don't pollute the - # construction environment Dictionary(ies) that are typically used - # for expansion. - gvars['__builtins__'] = __builtins__ - - ls = ListSubber(env, mode, conv, gvars) - ls.substitute(strSubst, lvars, 0) - - try: - del gvars['__builtins__'] - except KeyError: - pass - - return ls.data - -def scons_subst_once(strSubst, env, key): - """Perform single (non-recursive) substitution of a single - construction variable keyword. - - This is used when setting a variable when copying or overriding values - in an Environment. We want to capture (expand) the old value before - we override it, so people can do things like: - - env2 = env.Clone(CCFLAGS = '$CCFLAGS -g') - - We do this with some straightforward, brute-force code here... - """ - if type(strSubst) == types.StringType and string.find(strSubst, '$') < 0: - return strSubst - - matchlist = ['$' + key, '${' + key + '}'] - val = env.get(key, '') - def sub_match(match, val=val, matchlist=matchlist): - a = match.group(1) - if a in matchlist: - a = val - if is_Sequence(a): - return string.join(map(str, a)) - else: - return str(a) - - if is_Sequence(strSubst): - result = [] - for arg in strSubst: - if is_String(arg): - if arg in matchlist: - arg = val - if is_Sequence(arg): - result.extend(arg) - else: - result.append(arg) - else: - result.append(_dollar_exps.sub(sub_match, arg)) - else: - result.append(arg) - return result - elif is_String(strSubst): - return _dollar_exps.sub(sub_match, strSubst) - else: - return strSubst - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Taskmaster.py b/share/scons-local-1.3.0/SCons/Taskmaster.py deleted file mode 100644 index ec81af2fc39a03da497669c3c2657bf25da6df96..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Taskmaster.py +++ /dev/null @@ -1,1032 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__doc__ = """ -Generic Taskmaster module for the SCons build engine. - -This module contains the primary interface(s) between a wrapping user -interface and the SCons build engine. There are two key classes here: - - Taskmaster - This is the main engine for walking the dependency graph and - calling things to decide what does or doesn't need to be built. - - Task - This is the base class for allowing a wrapping interface to - decide what does or doesn't actually need to be done. The - intention is for a wrapping interface to subclass this as - appropriate for different types of behavior it may need. - - The canonical example is the SCons native Python interface, - which has Task subclasses that handle its specific behavior, - like printing "`foo' is up to date" when a top-level target - doesn't need to be built, and handling the -c option by removing - targets as its "build" action. There is also a separate subclass - for suppressing this output when the -q option is used. - - The Taskmaster instantiates a Task object for each (set of) - target(s) that it decides need to be evaluated and/or built. -""" - -__revision__ = "src/engine/SCons/Taskmaster.py 4720 2010/03/24 03:14:11 jars" - -from itertools import chain -import operator -import string -import sys -import traceback - -import SCons.Errors -import SCons.Node -import SCons.Warnings - -StateString = SCons.Node.StateString -NODE_NO_STATE = SCons.Node.no_state -NODE_PENDING = SCons.Node.pending -NODE_EXECUTING = SCons.Node.executing -NODE_UP_TO_DATE = SCons.Node.up_to_date -NODE_EXECUTED = SCons.Node.executed -NODE_FAILED = SCons.Node.failed - - -# A subsystem for recording stats about how different Nodes are handled by -# the main Taskmaster loop. There's no external control here (no need for -# a --debug= option); enable it by changing the value of CollectStats. - -CollectStats = None - -class Stats: - """ - A simple class for holding statistics about the disposition of a - Node by the Taskmaster. If we're collecting statistics, each Node - processed by the Taskmaster gets one of these attached, in which case - the Taskmaster records its decision each time it processes the Node. - (Ideally, that's just once per Node.) - """ - def __init__(self): - """ - Instantiates a Taskmaster.Stats object, initializing all - appropriate counters to zero. - """ - self.considered = 0 - self.already_handled = 0 - self.problem = 0 - self.child_failed = 0 - self.not_built = 0 - self.side_effects = 0 - self.build = 0 - -StatsNodes = [] - -fmt = "%(considered)3d "\ - "%(already_handled)3d " \ - "%(problem)3d " \ - "%(child_failed)3d " \ - "%(not_built)3d " \ - "%(side_effects)3d " \ - "%(build)3d " - -def dump_stats(): - StatsNodes.sort(lambda a, b: cmp(str(a), str(b))) - for n in StatsNodes: - print (fmt % n.stats.__dict__) + str(n) - - - -class Task: - """ - Default SCons build engine task. - - This controls the interaction of the actual building of node - and the rest of the engine. - - This is expected to handle all of the normally-customizable - aspects of controlling a build, so any given application - *should* be able to do what it wants by sub-classing this - class and overriding methods as appropriate. If an application - needs to customze something by sub-classing Taskmaster (or - some other build engine class), we should first try to migrate - that functionality into this class. - - Note that it's generally a good idea for sub-classes to call - these methods explicitly to update state, etc., rather than - roll their own interaction with Taskmaster from scratch. - """ - def __init__(self, tm, targets, top, node): - self.tm = tm - self.targets = targets - self.top = top - self.node = node - self.exc_clear() - - def trace_message(self, method, node, description='node'): - fmt = '%-20s %s %s\n' - return fmt % (method + ':', description, self.tm.trace_node(node)) - - def display(self, message): - """ - Hook to allow the calling interface to display a message. - - This hook gets called as part of preparing a task for execution - (that is, a Node to be built). As part of figuring out what Node - should be built next, the actually target list may be altered, - along with a message describing the alteration. The calling - interface can subclass Task and provide a concrete implementation - of this method to see those messages. - """ - pass - - def prepare(self): - """ - Called just before the task is executed. - - This is mainly intended to give the target Nodes a chance to - unlink underlying files and make all necessary directories before - the Action is actually called to build the targets. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.prepare()', self.node)) - - # Now that it's the appropriate time, give the TaskMaster a - # chance to raise any exceptions it encountered while preparing - # this task. - self.exception_raise() - - if self.tm.message: - self.display(self.tm.message) - self.tm.message = None - - # Let the targets take care of any necessary preparations. - # This includes verifying that all of the necessary sources - # and dependencies exist, removing the target file(s), etc. - # - # As of April 2008, the get_executor().prepare() method makes - # sure that all of the aggregate sources necessary to build this - # Task's target(s) exist in one up-front check. The individual - # target t.prepare() methods check that each target's explicit - # or implicit dependencies exists, and also initialize the - # .sconsign info. - executor = self.targets[0].get_executor() - executor.prepare() - for t in executor.get_action_targets(): - t.prepare() - for s in t.side_effects: - s.prepare() - - def get_target(self): - """Fetch the target being built or updated by this task. - """ - return self.node - - def needs_execute(self): - # TODO(deprecate): "return True" is the old default behavior; - # change it to NotImplementedError (after running through the - # Deprecation Cycle) so the desired behavior is explicitly - # determined by which concrete subclass is used. - #raise NotImplementedError - msg = ('Direct use of the Taskmaster.Task class will be deprecated\n' - + '\tin a future release.') - SCons.Warnings.warn(SCons.Warnings.TaskmasterNeedsExecuteWarning, msg) - return True - - def execute(self): - """ - Called to execute the task. - - This method is called from multiple threads in a parallel build, - so only do thread safe stuff here. Do thread unsafe stuff in - prepare(), executed() or failed(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.execute()', self.node)) - - try: - everything_was_cached = 1 - for t in self.targets: - if t.retrieve_from_cache(): - # Call the .built() method without calling the - # .push_to_cache() method, since we just got the - # target from the cache and don't need to push - # it back there. - t.set_state(NODE_EXECUTED) - t.built() - else: - everything_was_cached = 0 - break - if not everything_was_cached: - self.targets[0].build() - except SystemExit: - exc_value = sys.exc_info()[1] - raise SCons.Errors.ExplicitExit(self.targets[0], exc_value.code) - except SCons.Errors.UserError: - raise - except SCons.Errors.BuildError: - raise - except Exception, e: - buildError = SCons.Errors.convert_to_BuildError(e) - buildError.node = self.targets[0] - buildError.exc_info = sys.exc_info() - raise buildError - - def executed_without_callbacks(self): - """ - Called when the task has been successfully executed - and the Taskmaster instance doesn't want to call - the Node's callback methods. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.executed_without_callbacks()', - self.node)) - - for t in self.targets: - if t.get_state() == NODE_EXECUTING: - for side_effect in t.side_effects: - side_effect.set_state(NODE_NO_STATE) - t.set_state(NODE_EXECUTED) - - def executed_with_callbacks(self): - """ - Called when the task has been successfully executed and - the Taskmaster instance wants to call the Node's callback - methods. - - This may have been a do-nothing operation (to preserve build - order), so we must check the node's state before deciding whether - it was "built", in which case we call the appropriate Node method. - In any event, we always call "visited()", which will handle any - post-visit actions that must take place regardless of whether - or not the target was an actual built target or a source Node. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.executed_with_callbacks()', - self.node)) - - for t in self.targets: - if t.get_state() == NODE_EXECUTING: - for side_effect in t.side_effects: - side_effect.set_state(NODE_NO_STATE) - t.set_state(NODE_EXECUTED) - t.push_to_cache() - t.built() - t.visited() - - executed = executed_with_callbacks - - def failed(self): - """ - Default action when a task fails: stop the build. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - self.fail_stop() - - def fail_stop(self): - """ - Explicit stop-the-build failure. - - This sets failure status on the target nodes and all of - their dependent parent nodes. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.failed_stop()', self.node)) - - # Invoke will_not_build() to clean-up the pending children - # list. - self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED)) - - # Tell the taskmaster to not start any new tasks - self.tm.stop() - - # We're stopping because of a build failure, but give the - # calling Task class a chance to postprocess() the top-level - # target under which the build failure occurred. - self.targets = [self.tm.current_top] - self.top = 1 - - def fail_continue(self): - """ - Explicit continue-the-build failure. - - This sets failure status on the target nodes and all of - their dependent parent nodes. - - Note: Although this function is normally invoked on nodes in - the executing state, it might also be invoked on up-to-date - nodes when using Configure(). - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.failed_continue()', self.node)) - - self.tm.will_not_build(self.targets, lambda n: n.set_state(NODE_FAILED)) - - def make_ready_all(self): - """ - Marks all targets in a task ready for execution. - - This is used when the interface needs every target Node to be - visited--the canonical example being the "scons -c" option. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.make_ready_all()', self.node)) - - self.out_of_date = self.targets[:] - for t in self.targets: - t.disambiguate().set_state(NODE_EXECUTING) - for s in t.side_effects: - # add disambiguate here to mirror the call on targets above - s.disambiguate().set_state(NODE_EXECUTING) - - def make_ready_current(self): - """ - Marks all targets in a task ready for execution if any target - is not current. - - This is the default behavior for building only what's necessary. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.make_ready_current()', - self.node)) - - self.out_of_date = [] - needs_executing = False - for t in self.targets: - try: - t.disambiguate().make_ready() - is_up_to_date = not t.has_builder() or \ - (not t.always_build and t.is_up_to_date()) - except EnvironmentError, e: - raise SCons.Errors.BuildError(node=t, errstr=e.strerror, filename=e.filename) - - if not is_up_to_date: - self.out_of_date.append(t) - needs_executing = True - - if needs_executing: - for t in self.targets: - t.set_state(NODE_EXECUTING) - for s in t.side_effects: - # add disambiguate here to mirror the call on targets in first loop above - s.disambiguate().set_state(NODE_EXECUTING) - else: - for t in self.targets: - # We must invoke visited() to ensure that the node - # information has been computed before allowing the - # parent nodes to execute. (That could occur in a - # parallel build...) - t.visited() - t.set_state(NODE_UP_TO_DATE) - - make_ready = make_ready_current - - def postprocess(self): - """ - Post-processes a task after it's been executed. - - This examines all the targets just built (or not, we don't care - if the build was successful, or even if there was no build - because everything was up-to-date) to see if they have any - waiting parent Nodes, or Nodes waiting on a common side effect, - that can be put back on the candidates list. - """ - T = self.tm.trace - if T: T.write(self.trace_message('Task.postprocess()', self.node)) - - # We may have built multiple targets, some of which may have - # common parents waiting for this build. Count up how many - # targets each parent was waiting for so we can subtract the - # values later, and so we *don't* put waiting side-effect Nodes - # back on the candidates list if the Node is also a waiting - # parent. - - targets = set(self.targets) - - pending_children = self.tm.pending_children - parents = {} - for t in targets: - # A node can only be in the pending_children set if it has - # some waiting_parents. - if t.waiting_parents: - if T: T.write(self.trace_message('Task.postprocess()', - t, - 'removing')) - pending_children.discard(t) - for p in t.waiting_parents: - parents[p] = parents.get(p, 0) + 1 - - for t in targets: - for s in t.side_effects: - if s.get_state() == NODE_EXECUTING: - s.set_state(NODE_NO_STATE) - for p in s.waiting_parents: - parents[p] = parents.get(p, 0) + 1 - for p in s.waiting_s_e: - if p.ref_count == 0: - self.tm.candidates.append(p) - - for p, subtract in parents.items(): - p.ref_count = p.ref_count - subtract - if T: T.write(self.trace_message('Task.postprocess()', - p, - 'adjusted parent ref count')) - if p.ref_count == 0: - self.tm.candidates.append(p) - - for t in targets: - t.postprocess() - - # Exception handling subsystem. - # - # Exceptions that occur while walking the DAG or examining Nodes - # must be raised, but must be raised at an appropriate time and in - # a controlled manner so we can, if necessary, recover gracefully, - # possibly write out signature information for Nodes we've updated, - # etc. This is done by having the Taskmaster tell us about the - # exception, and letting - - def exc_info(self): - """ - Returns info about a recorded exception. - """ - return self.exception - - def exc_clear(self): - """ - Clears any recorded exception. - - This also changes the "exception_raise" attribute to point - to the appropriate do-nothing method. - """ - self.exception = (None, None, None) - self.exception_raise = self._no_exception_to_raise - - def exception_set(self, exception=None): - """ - Records an exception to be raised at the appropriate time. - - This also changes the "exception_raise" attribute to point - to the method that will, in fact - """ - if not exception: - exception = sys.exc_info() - self.exception = exception - self.exception_raise = self._exception_raise - - def _no_exception_to_raise(self): - pass - - def _exception_raise(self): - """ - Raises a pending exception that was recorded while getting a - Task ready for execution. - """ - exc = self.exc_info()[:] - try: - exc_type, exc_value, exc_traceback = exc - except ValueError: - exc_type, exc_value = exc - exc_traceback = None - raise exc_type, exc_value, exc_traceback - -class AlwaysTask(Task): - def needs_execute(self): - """ - Always returns True (indicating this Task should always - be executed). - - Subclasses that need this behavior (as opposed to the default - of only executing Nodes that are out of date w.r.t. their - dependencies) can use this as follows: - - class MyTaskSubclass(SCons.Taskmaster.Task): - needs_execute = SCons.Taskmaster.Task.execute_always - """ - return True - -class OutOfDateTask(Task): - def needs_execute(self): - """ - Returns True (indicating this Task should be executed) if this - Task's target state indicates it needs executing, which has - already been determined by an earlier up-to-date check. - """ - return self.targets[0].get_state() == SCons.Node.executing - - -def find_cycle(stack, visited): - if stack[-1] in visited: - return None - visited.add(stack[-1]) - for n in stack[-1].waiting_parents: - stack.append(n) - if stack[0] == stack[-1]: - return stack - if find_cycle(stack, visited): - return stack - stack.pop() - return None - - -class Taskmaster: - """ - The Taskmaster for walking the dependency DAG. - """ - - def __init__(self, targets=[], tasker=None, order=None, trace=None): - self.original_top = targets - self.top_targets_left = targets[:] - self.top_targets_left.reverse() - self.candidates = [] - if tasker is None: - tasker = OutOfDateTask - self.tasker = tasker - if not order: - order = lambda l: l - self.order = order - self.message = None - self.trace = trace - self.next_candidate = self.find_next_candidate - self.pending_children = set() - - def find_next_candidate(self): - """ - Returns the next candidate Node for (potential) evaluation. - - The candidate list (really a stack) initially consists of all of - the top-level (command line) targets provided when the Taskmaster - was initialized. While we walk the DAG, visiting Nodes, all the - children that haven't finished processing get pushed on to the - candidate list. Each child can then be popped and examined in - turn for whether *their* children are all up-to-date, in which - case a Task will be created for their actual evaluation and - potential building. - - Here is where we also allow candidate Nodes to alter the list of - Nodes that should be examined. This is used, for example, when - invoking SCons in a source directory. A source directory Node can - return its corresponding build directory Node, essentially saying, - "Hey, you really need to build this thing over here instead." - """ - try: - return self.candidates.pop() - except IndexError: - pass - try: - node = self.top_targets_left.pop() - except IndexError: - return None - self.current_top = node - alt, message = node.alter_targets() - if alt: - self.message = message - self.candidates.append(node) - self.candidates.extend(self.order(alt)) - node = self.candidates.pop() - return node - - def no_next_candidate(self): - """ - Stops Taskmaster processing by not returning a next candidate. - - Note that we have to clean-up the Taskmaster candidate list - because the cycle detection depends on the fact all nodes have - been processed somehow. - """ - while self.candidates: - candidates = self.candidates - self.candidates = [] - self.will_not_build(candidates) - return None - - def _validate_pending_children(self): - """ - Validate the content of the pending_children set. Assert if an - internal error is found. - - This function is used strictly for debugging the taskmaster by - checking that no invariants are violated. It is not used in - normal operation. - - The pending_children set is used to detect cycles in the - dependency graph. We call a "pending child" a child that is - found in the "pending" state when checking the dependencies of - its parent node. - - A pending child can occur when the Taskmaster completes a loop - through a cycle. For example, lets imagine a graph made of - three node (A, B and C) making a cycle. The evaluation starts - at node A. The taskmaster first consider whether node A's - child B is up-to-date. Then, recursively, node B needs to - check whether node C is up-to-date. This leaves us with a - dependency graph looking like: - - Next candidate \ - \ - Node A (Pending) --> Node B(Pending) --> Node C (NoState) - ^ | - | | - +-------------------------------------+ - - Now, when the Taskmaster examines the Node C's child Node A, - it finds that Node A is in the "pending" state. Therefore, - Node A is a pending child of node C. - - Pending children indicate that the Taskmaster has potentially - loop back through a cycle. We say potentially because it could - also occur when a DAG is evaluated in parallel. For example, - consider the following graph: - - - Node A (Pending) --> Node B(Pending) --> Node C (Pending) --> ... - | ^ - | | - +----------> Node D (NoState) --------+ - / - Next candidate / - - The Taskmaster first evaluates the nodes A, B, and C and - starts building some children of node C. Assuming, that the - maximum parallel level has not been reached, the Taskmaster - will examine Node D. It will find that Node C is a pending - child of Node D. - - In summary, evaluating a graph with a cycle will always - involve a pending child at one point. A pending child might - indicate either a cycle or a diamond-shaped DAG. Only a - fraction of the nodes ends-up being a "pending child" of - another node. This keeps the pending_children set small in - practice. - - We can differentiate between the two cases if we wait until - the end of the build. At this point, all the pending children - nodes due to a diamond-shaped DAG will have been properly - built (or will have failed to build). But, the pending - children involved in a cycle will still be in the pending - state. - - The taskmaster removes nodes from the pending_children set as - soon as a pending_children node moves out of the pending - state. This also helps to keep the pending_children set small. - """ - - for n in self.pending_children: - assert n.state in (NODE_PENDING, NODE_EXECUTING), \ - (str(n), StateString[n.state]) - assert len(n.waiting_parents) != 0, (str(n), len(n.waiting_parents)) - for p in n.waiting_parents: - assert p.ref_count > 0, (str(n), str(p), p.ref_count) - - - def trace_message(self, message): - return 'Taskmaster: %s\n' % message - - def trace_node(self, node): - return '<%-10s %-3s %s>' % (StateString[node.get_state()], - node.ref_count, - repr(str(node))) - - def _find_next_ready_node(self): - """ - Finds the next node that is ready to be built. - - This is *the* main guts of the DAG walk. We loop through the - list of candidates, looking for something that has no un-built - children (i.e., that is a leaf Node or has dependencies that are - all leaf Nodes or up-to-date). Candidate Nodes are re-scanned - (both the target Node itself and its sources, which are always - scanned in the context of a given target) to discover implicit - dependencies. A Node that must wait for some children to be - built will be put back on the candidates list after the children - have finished building. A Node that has been put back on the - candidates list in this way may have itself (or its sources) - re-scanned, in order to handle generated header files (e.g.) and - the implicit dependencies therein. - - Note that this method does not do any signature calculation or - up-to-date check itself. All of that is handled by the Task - class. This is purely concerned with the dependency graph walk. - """ - - self.ready_exc = None - - T = self.trace - if T: T.write('\n' + self.trace_message('Looking for a node to evaluate')) - - while 1: - node = self.next_candidate() - if node is None: - if T: T.write(self.trace_message('No candidate anymore.') + '\n') - return None - - node = node.disambiguate() - state = node.get_state() - - # For debugging only: - # - # try: - # self._validate_pending_children() - # except: - # self.ready_exc = sys.exc_info() - # return node - - if CollectStats: - if not hasattr(node, 'stats'): - node.stats = Stats() - StatsNodes.append(node) - S = node.stats - S.considered = S.considered + 1 - else: - S = None - - if T: T.write(self.trace_message(' Considering node %s and its children:' % self.trace_node(node))) - - if state == NODE_NO_STATE: - # Mark this node as being on the execution stack: - node.set_state(NODE_PENDING) - elif state > NODE_PENDING: - # Skip this node if it has already been evaluated: - if S: S.already_handled = S.already_handled + 1 - if T: T.write(self.trace_message(' already handled (executed)')) - continue - - executor = node.get_executor() - - try: - children = executor.get_all_children() - except SystemExit: - exc_value = sys.exc_info()[1] - e = SCons.Errors.ExplicitExit(node, exc_value.code) - self.ready_exc = (SCons.Errors.ExplicitExit, e) - if T: T.write(self.trace_message(' SystemExit')) - return node - except Exception, e: - # We had a problem just trying to figure out the - # children (like a child couldn't be linked in to a - # VariantDir, or a Scanner threw something). Arrange to - # raise the exception when the Task is "executed." - self.ready_exc = sys.exc_info() - if S: S.problem = S.problem + 1 - if T: T.write(self.trace_message(' exception %s while scanning children.\n' % e)) - return node - - children_not_visited = [] - children_pending = set() - children_not_ready = [] - children_failed = False - - for child in chain(executor.get_all_prerequisites(), children): - childstate = child.get_state() - - if T: T.write(self.trace_message(' ' + self.trace_node(child))) - - if childstate == NODE_NO_STATE: - children_not_visited.append(child) - elif childstate == NODE_PENDING: - children_pending.add(child) - elif childstate == NODE_FAILED: - children_failed = True - - if childstate <= NODE_EXECUTING: - children_not_ready.append(child) - - - # These nodes have not even been visited yet. Add - # them to the list so that on some next pass we can - # take a stab at evaluating them (or their children). - children_not_visited.reverse() - self.candidates.extend(self.order(children_not_visited)) - #if T and children_not_visited: - # T.write(self.trace_message(' adding to candidates: %s' % map(str, children_not_visited))) - # T.write(self.trace_message(' candidates now: %s\n' % map(str, self.candidates))) - - # Skip this node if any of its children have failed. - # - # This catches the case where we're descending a top-level - # target and one of our children failed while trying to be - # built by a *previous* descent of an earlier top-level - # target. - # - # It can also occur if a node is reused in multiple - # targets. One first descends though the one of the - # target, the next time occurs through the other target. - # - # Note that we can only have failed_children if the - # --keep-going flag was used, because without it the build - # will stop before diving in the other branch. - # - # Note that even if one of the children fails, we still - # added the other children to the list of candidate nodes - # to keep on building (--keep-going). - if children_failed: - for n in executor.get_action_targets(): - n.set_state(NODE_FAILED) - - if S: S.child_failed = S.child_failed + 1 - if T: T.write(self.trace_message('****** %s\n' % self.trace_node(node))) - continue - - if children_not_ready: - for child in children_not_ready: - # We're waiting on one or more derived targets - # that have not yet finished building. - if S: S.not_built = S.not_built + 1 - - # Add this node to the waiting parents lists of - # anything we're waiting on, with a reference - # count so we can be put back on the list for - # re-evaluation when they've all finished. - node.ref_count = node.ref_count + child.add_to_waiting_parents(node) - if T: T.write(self.trace_message(' adjusted ref count: %s, child %s' % - (self.trace_node(node), repr(str(child))))) - - if T: - for pc in children_pending: - T.write(self.trace_message(' adding %s to the pending children set\n' % - self.trace_node(pc))) - self.pending_children = self.pending_children | children_pending - - continue - - # Skip this node if it has side-effects that are - # currently being built: - wait_side_effects = False - for se in executor.get_action_side_effects(): - if se.get_state() == NODE_EXECUTING: - se.add_to_waiting_s_e(node) - wait_side_effects = True - - if wait_side_effects: - if S: S.side_effects = S.side_effects + 1 - continue - - # The default when we've gotten through all of the checks above: - # this node is ready to be built. - if S: S.build = S.build + 1 - if T: T.write(self.trace_message('Evaluating %s\n' % - self.trace_node(node))) - - # For debugging only: - # - # try: - # self._validate_pending_children() - # except: - # self.ready_exc = sys.exc_info() - # return node - - return node - - return None - - def next_task(self): - """ - Returns the next task to be executed. - - This simply asks for the next Node to be evaluated, and then wraps - it in the specific Task subclass with which we were initialized. - """ - node = self._find_next_ready_node() - - if node is None: - return None - - tlist = node.get_executor().get_all_targets() - - task = self.tasker(self, tlist, node in self.original_top, node) - try: - task.make_ready() - except: - # We had a problem just trying to get this task ready (like - # a child couldn't be linked in to a VariantDir when deciding - # whether this node is current). Arrange to raise the - # exception when the Task is "executed." - self.ready_exc = sys.exc_info() - - if self.ready_exc: - task.exception_set(self.ready_exc) - - self.ready_exc = None - - return task - - def will_not_build(self, nodes, node_func=lambda n: None): - """ - Perform clean-up about nodes that will never be built. Invokes - a user defined function on all of these nodes (including all - of their parents). - """ - - T = self.trace - - pending_children = self.pending_children - - to_visit = set(nodes) - pending_children = pending_children - to_visit - - if T: - for n in nodes: - T.write(self.trace_message(' removing node %s from the pending children set\n' % - self.trace_node(n))) - try: - while 1: - try: - node = to_visit.pop() - except AttributeError: - # Python 1.5.2 - if len(to_visit): - node = to_visit[0] - to_visit.remove(node) - else: - break - - node_func(node) - - # Prune recursion by flushing the waiting children - # list immediately. - parents = node.waiting_parents - node.waiting_parents = set() - - to_visit = to_visit | parents - pending_children = pending_children - parents - - for p in parents: - p.ref_count = p.ref_count - 1 - if T: T.write(self.trace_message(' removing parent %s from the pending children set\n' % - self.trace_node(p))) - except KeyError: - # The container to_visit has been emptied. - pass - - # We have the stick back the pending_children list into the - # task master because the python 1.5.2 compatibility does not - # allow us to use in-place updates - self.pending_children = pending_children - - def stop(self): - """ - Stops the current build completely. - """ - self.next_candidate = self.no_next_candidate - - def cleanup(self): - """ - Check for dependency cycles. - """ - if not self.pending_children: - return - - # TODO(1.5) - #nclist = [ (n, find_cycle([n], set())) for n in self.pending_children ] - nclist = map(lambda n: (n, find_cycle([n], set())), self.pending_children) - - # TODO(1.5) - #genuine_cycles = [ - # node for node, cycle in nclist - # if cycle or node.get_state() != NODE_EXECUTED - #] - genuine_cycles = filter(lambda t: t[1] or t[0].get_state() != NODE_EXECUTED, nclist) - if not genuine_cycles: - # All of the "cycles" found were single nodes in EXECUTED state, - # which is to say, they really weren't cycles. Just return. - return - - desc = 'Found dependency cycle(s):\n' - for node, cycle in nclist: - if cycle: - desc = desc + " " + string.join(map(str, cycle), " -> ") + "\n" - else: - desc = desc + \ - " Internal Error: no cycle found for node %s (%s) in state %s\n" % \ - (node, repr(node), StateString[node.get_state()]) - - raise SCons.Errors.UserError, desc - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/386asm.py b/share/scons-local-1.3.0/SCons/Tool/386asm.py deleted file mode 100644 index 0891e967e7480bc3baf14d997f2edeb5aa5cc327..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/386asm.py +++ /dev/null @@ -1,61 +0,0 @@ -"""SCons.Tool.386asm - -Tool specification for the 386ASM assembler for the Phar Lap ETS embedded -operating system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/386asm.py 4720 2010/03/24 03:14:11 jars" - -from SCons.Tool.PharLapCommon import addPharLapPaths -import SCons.Util - -as_module = __import__('as', globals(), locals(), []) - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - as_module.generate(env) - - env['AS'] = '386asm' - env['ASFLAGS'] = SCons.Util.CLVar('') - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASCOM'] = '$AS $ASFLAGS $SOURCES -o $TARGET' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $SOURCES -o $TARGET' - - addPharLapPaths(env) - -def exists(env): - return env.Detect('386asm') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/BitKeeper.py b/share/scons-local-1.3.0/SCons/Tool/BitKeeper.py deleted file mode 100644 index 121f5794a1287ac4737718782999019ef0565845..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/BitKeeper.py +++ /dev/null @@ -1,65 +0,0 @@ -"""SCons.Tool.BitKeeper.py - -Tool-specific initialization for the BitKeeper source code control -system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/BitKeeper.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - BitKeeper to an Environment.""" - - def BitKeeperFactory(env=env): - """ """ - act = SCons.Action.Action("$BITKEEPERCOM", "$BITKEEPERCOMSTR") - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'BitKeeper', BitKeeperFactory) - env.BitKeeper = BitKeeperFactory - - env['BITKEEPER'] = 'bk' - env['BITKEEPERGET'] = '$BITKEEPER get' - env['BITKEEPERGETFLAGS'] = SCons.Util.CLVar('') - env['BITKEEPERCOM'] = '$BITKEEPERGET $BITKEEPERGETFLAGS $TARGET' - -def exists(env): - return env.Detect('bk') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/CVS.py b/share/scons-local-1.3.0/SCons/Tool/CVS.py deleted file mode 100644 index b30c319d345bf671f8e21bcc414c30341bae9570..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/CVS.py +++ /dev/null @@ -1,73 +0,0 @@ -"""SCons.Tool.CVS.py - -Tool-specific initialization for CVS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/CVS.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - CVS to an Environment.""" - - def CVSFactory(repos, module='', env=env): - """ """ - # fail if repos is not an absolute path name? - if module != '': - # Don't use os.path.join() because the name we fetch might - # be across a network and must use POSIX slashes as separators. - module = module + '/' - env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS -d ${TARGET.dir} $CVSMODULE${TARGET.posix}' - act = SCons.Action.Action('$CVSCOM', '$CVSCOMSTR') - return SCons.Builder.Builder(action = act, - env = env, - CVSREPOSITORY = repos, - CVSMODULE = module) - - #setattr(env, 'CVS', CVSFactory) - env.CVS = CVSFactory - - env['CVS'] = 'cvs' - env['CVSFLAGS'] = SCons.Util.CLVar('-d $CVSREPOSITORY') - env['CVSCOFLAGS'] = SCons.Util.CLVar('') - env['CVSCOM'] = '$CVS $CVSFLAGS co $CVSCOFLAGS ${TARGET.posix}' - -def exists(env): - return env.Detect('cvs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/FortranCommon.py b/share/scons-local-1.3.0/SCons/Tool/FortranCommon.py deleted file mode 100644 index 53c48e4570377a214bcc36d4b8ca0a0ea5d42b21..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/FortranCommon.py +++ /dev/null @@ -1,247 +0,0 @@ -"""SCons.Tool.FortranCommon - -Stuff for processing Fortran, common to all fortran dialects. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/FortranCommon.py 4720 2010/03/24 03:14:11 jars" - -import re -import string -import os.path - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util - -def isfortran(env, source): - """Return 1 if any of code in source has fortran files in it, 0 - otherwise.""" - try: - fsuffixes = env['FORTRANSUFFIXES'] - except KeyError: - # If no FORTRANSUFFIXES, no fortran tool, so there is no need to look - # for fortran sources. - return 0 - - if not source: - # Source might be None for unusual cases like SConf. - return 0 - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext in fsuffixes: - return 1 - return 0 - -def _fortranEmitter(target, source, env): - node = source[0].rfile() - if not node.exists() and not node.is_derived(): - print "Could not locate " + str(node.name) - return ([], []) - mod_regex = """(?i)^\s*MODULE\s+(?!PROCEDURE)(\w+)""" - cre = re.compile(mod_regex,re.M) - # Retrieve all USE'd module names - modules = cre.findall(node.get_text_contents()) - # Remove unique items from the list - modules = SCons.Util.unique(modules) - # Convert module name to a .mod filename - suffix = env.subst('$FORTRANMODSUFFIX', target=target, source=source) - moddir = env.subst('$FORTRANMODDIR', target=target, source=source) - modules = map(lambda x, s=suffix: string.lower(x) + s, modules) - for m in modules: - target.append(env.fs.File(m, moddir)) - return (target, source) - -def FortranEmitter(target, source, env): - target, source = _fortranEmitter(target, source, env) - return SCons.Defaults.StaticObjectEmitter(target, source, env) - -def ShFortranEmitter(target, source, env): - target, source = _fortranEmitter(target, source, env) - return SCons.Defaults.SharedObjectEmitter(target, source, env) - -def ComputeFortranSuffixes(suffixes, ppsuffixes): - """suffixes are fortran source files, and ppsuffixes the ones to be - pre-processed. Both should be sequences, not strings.""" - assert len(suffixes) > 0 - s = suffixes[0] - sup = string.upper(s) - upper_suffixes = map(string.upper, suffixes) - if SCons.Util.case_sensitive_suffixes(s, sup): - ppsuffixes.extend(upper_suffixes) - else: - suffixes.extend(upper_suffixes) - -def CreateDialectActions(dialect): - """Create dialect specific actions.""" - CompAction = SCons.Action.Action('$%sCOM ' % dialect, '$%sCOMSTR' % dialect) - CompPPAction = SCons.Action.Action('$%sPPCOM ' % dialect, '$%sPPCOMSTR' % dialect) - ShCompAction = SCons.Action.Action('$SH%sCOM ' % dialect, '$SH%sCOMSTR' % dialect) - ShCompPPAction = SCons.Action.Action('$SH%sPPCOM ' % dialect, '$SH%sPPCOMSTR' % dialect) - - return CompAction, CompPPAction, ShCompAction, ShCompPPAction - -def DialectAddToEnv(env, dialect, suffixes, ppsuffixes, support_module = 0): - """Add dialect specific construction variables.""" - ComputeFortranSuffixes(suffixes, ppsuffixes) - - fscan = SCons.Scanner.Fortran.FortranScan("%sPATH" % dialect) - - for suffix in suffixes + ppsuffixes: - SCons.Tool.SourceFileScanner.add_scanner(suffix, fscan) - - env.AppendUnique(FORTRANSUFFIXES = suffixes + ppsuffixes) - - compaction, compppaction, shcompaction, shcompppaction = \ - CreateDialectActions(dialect) - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in suffixes: - static_obj.add_action(suffix, compaction) - shared_obj.add_action(suffix, shcompaction) - static_obj.add_emitter(suffix, FortranEmitter) - shared_obj.add_emitter(suffix, ShFortranEmitter) - - for suffix in ppsuffixes: - static_obj.add_action(suffix, compppaction) - shared_obj.add_action(suffix, shcompppaction) - static_obj.add_emitter(suffix, FortranEmitter) - shared_obj.add_emitter(suffix, ShFortranEmitter) - - if not env.has_key('%sFLAGS' % dialect): - env['%sFLAGS' % dialect] = SCons.Util.CLVar('') - - if not env.has_key('SH%sFLAGS' % dialect): - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect) - - # If a tool does not define fortran prefix/suffix for include path, use C ones - if not env.has_key('INC%sPREFIX' % dialect): - env['INC%sPREFIX' % dialect] = '$INCPREFIX' - - if not env.has_key('INC%sSUFFIX' % dialect): - env['INC%sSUFFIX' % dialect] = '$INCSUFFIX' - - env['_%sINCFLAGS' % dialect] = '$( ${_concat(INC%sPREFIX, %sPATH, INC%sSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' % (dialect, dialect, dialect) - - if support_module == 1: - env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $_FORTRANMODFLAG $SOURCES' % (dialect, dialect, dialect) - else: - env['%sCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['%sPPCOM' % dialect] = '$%s -o $TARGET -c $%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['SH%sCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - env['SH%sPPCOM' % dialect] = '$SH%s -o $TARGET -c $SH%sFLAGS $CPPFLAGS $_CPPDEFFLAGS $_%sINCFLAGS $SOURCES' % (dialect, dialect, dialect) - -def add_fortran_to_env(env): - """Add Builders and construction variables for Fortran to an Environment.""" - try: - FortranSuffixes = env['FORTRANFILESUFFIXES'] - except KeyError: - FortranSuffixes = ['.f', '.for', '.ftn'] - - #print "Adding %s to fortran suffixes" % FortranSuffixes - try: - FortranPPSuffixes = env['FORTRANPPFILESUFFIXES'] - except KeyError: - FortranPPSuffixes = ['.fpp', '.FPP'] - - DialectAddToEnv(env, "FORTRAN", FortranSuffixes, - FortranPPSuffixes, support_module = 1) - - env['FORTRANMODPREFIX'] = '' # like $LIBPREFIX - env['FORTRANMODSUFFIX'] = '.mod' # like $LIBSUFFIX - - env['FORTRANMODDIR'] = '' # where the compiler should place .mod files - env['FORTRANMODDIRPREFIX'] = '' # some prefix to $FORTRANMODDIR - similar to $INCPREFIX - env['FORTRANMODDIRSUFFIX'] = '' # some suffix to $FORTRANMODDIR - similar to $INCSUFFIX - env['_FORTRANMODFLAG'] = '$( ${_concat(FORTRANMODDIRPREFIX, FORTRANMODDIR, FORTRANMODDIRSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - -def add_f77_to_env(env): - """Add Builders and construction variables for f77 to an Environment.""" - try: - F77Suffixes = env['F77FILESUFFIXES'] - except KeyError: - F77Suffixes = ['.f77'] - - #print "Adding %s to f77 suffixes" % F77Suffixes - try: - F77PPSuffixes = env['F77PPFILESUFFIXES'] - except KeyError: - F77PPSuffixes = [] - - DialectAddToEnv(env, "F77", F77Suffixes, F77PPSuffixes) - -def add_f90_to_env(env): - """Add Builders and construction variables for f90 to an Environment.""" - try: - F90Suffixes = env['F90FILESUFFIXES'] - except KeyError: - F90Suffixes = ['.f90'] - - #print "Adding %s to f90 suffixes" % F90Suffixes - try: - F90PPSuffixes = env['F90PPFILESUFFIXES'] - except KeyError: - F90PPSuffixes = [] - - DialectAddToEnv(env, "F90", F90Suffixes, F90PPSuffixes, - support_module = 1) - -def add_f95_to_env(env): - """Add Builders and construction variables for f95 to an Environment.""" - try: - F95Suffixes = env['F95FILESUFFIXES'] - except KeyError: - F95Suffixes = ['.f95'] - - #print "Adding %s to f95 suffixes" % F95Suffixes - try: - F95PPSuffixes = env['F95PPFILESUFFIXES'] - except KeyError: - F95PPSuffixes = [] - - DialectAddToEnv(env, "F95", F95Suffixes, F95PPSuffixes, - support_module = 1) - -def add_all_to_env(env): - """Add builders and construction variables for all supported fortran - dialects.""" - add_fortran_to_env(env) - add_f77_to_env(env) - add_f90_to_env(env) - add_f95_to_env(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/JavaCommon.py b/share/scons-local-1.3.0/SCons/Tool/JavaCommon.py deleted file mode 100644 index 635659acba918935b67f36fcf1c7462eed72d0b0..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/JavaCommon.py +++ /dev/null @@ -1,324 +0,0 @@ -"""SCons.Tool.JavaCommon - -Stuff for processing Java. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/JavaCommon.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path -import re -import string - -java_parsing = 1 - -default_java_version = '1.4' - -if java_parsing: - # Parse Java files for class names. - # - # This is a really cool parser from Charles Crain - # that finds appropriate class names in Java source. - - # A regular expression that will find, in a java file: - # newlines; - # double-backslashes; - # a single-line comment "//"; - # single or double quotes preceeded by a backslash; - # single quotes, double quotes, open or close braces, semi-colons, - # periods, open or close parentheses; - # floating-point numbers; - # any alphanumeric token (keyword, class name, specifier); - # any alphanumeric token surrounded by angle brackets (generics); - # the multi-line comment begin and end tokens /* and */; - # array declarations "[]". - _reToken = re.compile(r'(\n|\\\\|//|\\[\'"]|[\'"\{\}\;\.\(\)]|' + - r'\d*\.\d*|[A-Za-z_][\w\$\.]*|<[A-Za-z_]\w+>|' + - r'/\*|\*/|\[\])') - - class OuterState: - """The initial state for parsing a Java file for classes, - interfaces, and anonymous inner classes.""" - def __init__(self, version=default_java_version): - - if not version in ('1.1', '1.2', '1.3','1.4', '1.5', '1.6', - '5', '6'): - msg = "Java version %s not supported" % version - raise NotImplementedError, msg - - self.version = version - self.listClasses = [] - self.listOutputs = [] - self.stackBrackets = [] - self.brackets = 0 - self.nextAnon = 1 - self.localClasses = [] - self.stackAnonClassBrackets = [] - self.anonStacksStack = [[0]] - self.package = None - - def trace(self): - pass - - def __getClassState(self): - try: - return self.classState - except AttributeError: - ret = ClassState(self) - self.classState = ret - return ret - - def __getPackageState(self): - try: - return self.packageState - except AttributeError: - ret = PackageState(self) - self.packageState = ret - return ret - - def __getAnonClassState(self): - try: - return self.anonState - except AttributeError: - self.outer_state = self - ret = SkipState(1, AnonClassState(self)) - self.anonState = ret - return ret - - def __getSkipState(self): - try: - return self.skipState - except AttributeError: - ret = SkipState(1, self) - self.skipState = ret - return ret - - def __getAnonStack(self): - return self.anonStacksStack[-1] - - def openBracket(self): - self.brackets = self.brackets + 1 - - def closeBracket(self): - self.brackets = self.brackets - 1 - if len(self.stackBrackets) and \ - self.brackets == self.stackBrackets[-1]: - self.listOutputs.append(string.join(self.listClasses, '$')) - self.localClasses.pop() - self.listClasses.pop() - self.anonStacksStack.pop() - self.stackBrackets.pop() - if len(self.stackAnonClassBrackets) and \ - self.brackets == self.stackAnonClassBrackets[-1]: - self.__getAnonStack().pop() - self.stackAnonClassBrackets.pop() - - def parseToken(self, token): - if token[:2] == '//': - return IgnoreState('\n', self) - elif token == '/*': - return IgnoreState('*/', self) - elif token == '{': - self.openBracket() - elif token == '}': - self.closeBracket() - elif token in [ '"', "'" ]: - return IgnoreState(token, self) - elif token == "new": - # anonymous inner class - if len(self.listClasses) > 0: - return self.__getAnonClassState() - return self.__getSkipState() # Skip the class name - elif token in ['class', 'interface', 'enum']: - if len(self.listClasses) == 0: - self.nextAnon = 1 - self.stackBrackets.append(self.brackets) - return self.__getClassState() - elif token == 'package': - return self.__getPackageState() - elif token == '.': - # Skip the attribute, it might be named "class", in which - # case we don't want to treat the following token as - # an inner class name... - return self.__getSkipState() - return self - - def addAnonClass(self): - """Add an anonymous inner class""" - if self.version in ('1.1', '1.2', '1.3', '1.4'): - clazz = self.listClasses[0] - self.listOutputs.append('%s$%d' % (clazz, self.nextAnon)) - elif self.version in ('1.5', '1.6', '5', '6'): - self.stackAnonClassBrackets.append(self.brackets) - className = [] - className.extend(self.listClasses) - self.__getAnonStack()[-1] = self.__getAnonStack()[-1] + 1 - for anon in self.__getAnonStack(): - className.append(str(anon)) - self.listOutputs.append(string.join(className, '$')) - - self.nextAnon = self.nextAnon + 1 - self.__getAnonStack().append(0) - - def setPackage(self, package): - self.package = package - - class AnonClassState: - """A state that looks for anonymous inner classes.""" - def __init__(self, old_state): - # outer_state is always an instance of OuterState - self.outer_state = old_state.outer_state - self.old_state = old_state - self.brace_level = 0 - def parseToken(self, token): - # This is an anonymous class if and only if the next - # non-whitespace token is a bracket. Everything between - # braces should be parsed as normal java code. - if token[:2] == '//': - return IgnoreState('\n', self) - elif token == '/*': - return IgnoreState('*/', self) - elif token == '\n': - return self - elif token[0] == '<' and token[-1] == '>': - return self - elif token == '(': - self.brace_level = self.brace_level + 1 - return self - if self.brace_level > 0: - if token == 'new': - # look further for anonymous inner class - return SkipState(1, AnonClassState(self)) - elif token in [ '"', "'" ]: - return IgnoreState(token, self) - elif token == ')': - self.brace_level = self.brace_level - 1 - return self - if token == '{': - self.outer_state.addAnonClass() - return self.old_state.parseToken(token) - - class SkipState: - """A state that will skip a specified number of tokens before - reverting to the previous state.""" - def __init__(self, tokens_to_skip, old_state): - self.tokens_to_skip = tokens_to_skip - self.old_state = old_state - def parseToken(self, token): - self.tokens_to_skip = self.tokens_to_skip - 1 - if self.tokens_to_skip < 1: - return self.old_state - return self - - class ClassState: - """A state we go into when we hit a class or interface keyword.""" - def __init__(self, outer_state): - # outer_state is always an instance of OuterState - self.outer_state = outer_state - def parseToken(self, token): - # the next non-whitespace token should be the name of the class - if token == '\n': - return self - # If that's an inner class which is declared in a method, it - # requires an index prepended to the class-name, e.g. - # 'Foo$1Inner' (Tigris Issue 2087) - if self.outer_state.localClasses and \ - self.outer_state.stackBrackets[-1] > \ - self.outer_state.stackBrackets[-2]+1: - locals = self.outer_state.localClasses[-1] - try: - idx = locals[token] - locals[token] = locals[token]+1 - except KeyError: - locals[token] = 1 - token = str(locals[token]) + token - self.outer_state.localClasses.append({}) - self.outer_state.listClasses.append(token) - self.outer_state.anonStacksStack.append([0]) - return self.outer_state - - class IgnoreState: - """A state that will ignore all tokens until it gets to a - specified token.""" - def __init__(self, ignore_until, old_state): - self.ignore_until = ignore_until - self.old_state = old_state - def parseToken(self, token): - if self.ignore_until == token: - return self.old_state - return self - - class PackageState: - """The state we enter when we encounter the package keyword. - We assume the next token will be the package name.""" - def __init__(self, outer_state): - # outer_state is always an instance of OuterState - self.outer_state = outer_state - def parseToken(self, token): - self.outer_state.setPackage(token) - return self.outer_state - - def parse_java_file(fn, version=default_java_version): - return parse_java(open(fn, 'r').read(), version) - - def parse_java(contents, version=default_java_version, trace=None): - """Parse a .java file and return a double of package directory, - plus a list of .class files that compiling that .java file will - produce""" - package = None - initial = OuterState(version) - currstate = initial - for token in _reToken.findall(contents): - # The regex produces a bunch of groups, but only one will - # have anything in it. - currstate = currstate.parseToken(token) - if trace: trace(token, currstate) - if initial.package: - package = string.replace(initial.package, '.', os.sep) - return (package, initial.listOutputs) - -else: - # Don't actually parse Java files for class names. - # - # We might make this a configurable option in the future if - # Java-file parsing takes too long (although it shouldn't relative - # to how long the Java compiler itself seems to take...). - - def parse_java_file(fn): - """ "Parse" a .java file. - - This actually just splits the file name, so the assumption here - is that the file name matches the public class name, and that - the path to the file is the same as the package name. - """ - return os.path.split(file) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/MSCommon/__init__.py b/share/scons-local-1.3.0/SCons/Tool/MSCommon/__init__.py deleted file mode 100644 index a612d9b7022f543358414effc6d0cd97c734644a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/MSCommon/__init__.py +++ /dev/null @@ -1,56 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """ -Common functions for Microsoft Visual Studio and Visual C/C++. -""" - -import copy -import os -import re -import subprocess - -import SCons.Errors -import SCons.Platform.win32 -import SCons.Util - -from SCons.Tool.MSCommon.sdk import mssdk_exists, \ - mssdk_setup_env - -from SCons.Tool.MSCommon.vc import msvc_exists, \ - msvc_setup_env, \ - msvc_setup_env_once - -from SCons.Tool.MSCommon.vs import get_default_version, \ - get_vs_by_version, \ - merge_default_version, \ - msvs_exists, \ - query_versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/MSCommon/arch.py b/share/scons-local-1.3.0/SCons/Tool/MSCommon/arch.py deleted file mode 100644 index 34de46ccbc1f39201cac6c6509f0fa4c187a8670..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/MSCommon/arch.py +++ /dev/null @@ -1,61 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Module to define supported Windows chip architectures. -""" - -import os - -class ArchDefinition: - """ - A class for defining architecture-specific settings and logic. - """ - def __init__(self, arch, synonyms=[]): - self.arch = arch - self.synonyms = synonyms - -SupportedArchitectureList = [ - ArchitectureDefinition( - 'x86', - ['i386', 'i486', 'i586', 'i686'], - ), - - ArchitectureDefinition( - 'x86_64', - ['AMD64', 'amd64', 'em64t', 'EM64T', 'x86_64'], - ), - - ArchitectureDefinition( - 'ia64', - ['IA64'], - ), -] - -SupportedArchitectureMap = {} -for a in SupportedArchitectureList: - SupportedArchitectureMap[a.arch] = a - for s in a.synonyms: - SupportedArchitectureMap[s] = a - diff --git a/share/scons-local-1.3.0/SCons/Tool/MSCommon/common.py b/share/scons-local-1.3.0/SCons/Tool/MSCommon/common.py deleted file mode 100644 index 2303d2bfee140990ba06cc26f1992178dea50a5c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/MSCommon/common.py +++ /dev/null @@ -1,210 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/common.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """ -Common helper functions for working with the Microsoft tool chain. -""" - -import copy -import os -import subprocess -import re - -import SCons.Util - - -logfile = os.environ.get('SCONS_MSCOMMON_DEBUG') -if logfile == '-': - def debug(x): - print x -elif logfile: - try: - import logging - except ImportError: - debug = lambda x: open(logfile, 'a').write(x + '\n') - else: - logging.basicConfig(filename=logfile, level=logging.DEBUG) - debug = logging.debug -else: - debug = lambda x: None - - -_is_win64 = None - -def is_win64(): - """Return true if running on windows 64 bits. - - Works whether python itself runs in 64 bits or 32 bits.""" - # Unfortunately, python does not provide a useful way to determine - # if the underlying Windows OS is 32-bit or 64-bit. Worse, whether - # the Python itself is 32-bit or 64-bit affects what it returns, - # so nothing in sys.* or os.* help. - - # Apparently the best solution is to use env vars that Windows - # sets. If PROCESSOR_ARCHITECTURE is not x86, then the python - # process is running in 64 bit mode (on a 64-bit OS, 64-bit - # hardware, obviously). - # If this python is 32-bit but the OS is 64, Windows will set - # ProgramW6432 and PROCESSOR_ARCHITEW6432 to non-null. - # (Checking for HKLM\Software\Wow6432Node in the registry doesn't - # work, because some 32-bit installers create it.) - global _is_win64 - if _is_win64 is None: - # I structured these tests to make it easy to add new ones or - # add exceptions in the future, because this is a bit fragile. - _is_win64 = False - if os.environ.get('PROCESSOR_ARCHITECTURE','x86') != 'x86': - _is_win64 = True - if os.environ.get('PROCESSOR_ARCHITEW6432'): - _is_win64 = True - if os.environ.get('ProgramW6432'): - _is_win64 = True - return _is_win64 - - -def read_reg(value): - return SCons.Util.RegGetValue(SCons.Util.HKEY_LOCAL_MACHINE, value)[0] - -def has_reg(value): - """Return True if the given key exists in HKEY_LOCAL_MACHINE, False - otherwise.""" - try: - SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, value) - ret = True - except WindowsError: - ret = False - return ret - -# Functions for fetching environment variable settings from batch files. - -def normalize_env(env, keys): - """Given a dictionary representing a shell environment, add the variables - from os.environ needed for the processing of .bat files; the keys are - controlled by the keys argument. - - It also makes sure the environment values are correctly encoded. - - Note: the environment is copied""" - normenv = {} - if env: - for k in env.keys(): - normenv[k] = copy.deepcopy(env[k]).encode('mbcs') - - for k in keys: - if os.environ.has_key(k): - normenv[k] = os.environ[k].encode('mbcs') - - return normenv - -def get_output(vcbat, args = None, env = None): - """Parse the output of given bat file, with given args.""" - if args: - debug("Calling '%s %s'" % (vcbat, args)) - popen = subprocess.Popen('"%s" %s & set' % (vcbat, args), - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=env) - else: - debug("Calling '%s'" % vcbat) - popen = subprocess.Popen('"%s" & set' % vcbat, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=env) - - # Use the .stdout and .stderr attributes directly because the - # .communicate() method uses the threading module on Windows - # and won't work under Pythons not built with threading. - stdout = popen.stdout.read() - if popen.wait() != 0: - raise IOError(popen.stderr.read().decode("mbcs")) - - output = stdout.decode("mbcs") - return output - -def parse_output(output, keep = ("INCLUDE", "LIB", "LIBPATH", "PATH")): - # dkeep is a dict associating key: path_list, where key is one item from - # keep, and pat_list the associated list of paths - - # TODO(1.5): replace with the following list comprehension: - #dkeep = dict([(i, []) for i in keep]) - dkeep = dict(map(lambda i: (i, []), keep)) - - # rdk will keep the regex to match the .bat file output line starts - rdk = {} - for i in keep: - rdk[i] = re.compile('%s=(.*)' % i, re.I) - - def add_env(rmatch, key, dkeep=dkeep): - plist = rmatch.group(1).split(os.pathsep) - for p in plist: - # Do not add empty paths (when a var ends with ;) - if p: - p = p.encode('mbcs') - # XXX: For some reason, VC98 .bat file adds "" around the PATH - # values, and it screws up the environment later, so we strip - # it. - p = p.strip('"') - dkeep[key].append(p) - - for line in output.splitlines(): - for k,v in rdk.items(): - m = v.match(line) - if m: - add_env(m, k) - - return dkeep - -# TODO(sgk): unused -def output_to_dict(output): - """Given an output string, parse it to find env variables. - - Return a dict where keys are variables names, and values their content""" - envlinem = re.compile(r'^([a-zA-z0-9]+)=([\S\s]*)$') - parsedenv = {} - for line in output.splitlines(): - m = envlinem.match(line) - if m: - parsedenv[m.group(1)] = m.group(2) - return parsedenv - -# TODO(sgk): unused -def get_new(l1, l2): - """Given two list l1 and l2, return the items in l2 which are not in l1. - Order is maintained.""" - - # We don't try to be smart: lists are small, and this is not the bottleneck - # is any case - new = [] - for i in l2: - if i not in l1: - new.append(i) - - return new - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/MSCommon/netframework.py b/share/scons-local-1.3.0/SCons/Tool/MSCommon/netframework.py deleted file mode 100644 index bd123dc8107612280c26f32df634ef3bdd77b585..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/MSCommon/netframework.py +++ /dev/null @@ -1,84 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """ -""" - -import os -import re -import string - -from common import read_reg, debug - -# Original value recorded by dcournapeau -_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\.NETFramework\InstallRoot' -# On SGK's system -_FRAMEWORKDIR_HKEY_ROOT = r'Software\Microsoft\Microsoft SDKs\.NETFramework\v2.0\InstallationFolder' - -def find_framework_root(): - # XXX: find it from environment (FrameworkDir) - try: - froot = read_reg(_FRAMEWORKDIR_HKEY_ROOT) - debug("Found framework install root in registry: %s" % froot) - except WindowsError, e: - debug("Could not read reg key %s" % _FRAMEWORKDIR_HKEY_ROOT) - return None - - if not os.path.exists(froot): - debug("%s not found on fs" % froot) - return None - - return froot - -def query_versions(): - froot = find_framework_root() - if froot: - contents = os.listdir(froot) - - l = re.compile('v[0-9]+.*') - versions = filter(lambda e, l=l: l.match(e), contents) - - def versrt(a,b): - # since version numbers aren't really floats... - aa = a[1:] - bb = b[1:] - aal = string.split(aa, '.') - bbl = string.split(bb, '.') - # sequence comparison in python is lexicographical - # which is exactly what we want. - # Note we sort backwards so the highest version is first. - return cmp(bbl,aal) - - versions.sort(versrt) - else: - versions = [] - - return versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/MSCommon/sdk.py b/share/scons-local-1.3.0/SCons/Tool/MSCommon/sdk.py deleted file mode 100644 index 54be8ca6a196c65931741612dd7cb2575765cea8..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/MSCommon/sdk.py +++ /dev/null @@ -1,391 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Module to detect the Platform/Windows SDK - -PSDK 2003 R1 is the earliest version detected. -""" - -import os - -import SCons.Errors -import SCons.Util - -import common - -debug = common.debug - -# SDK Checks. This is of course a mess as everything else on MS platforms. Here -# is what we do to detect the SDK: -# -# For Windows SDK >= 6.0: just look into the registry entries: -# HKLM\Software\Microsoft\Microsoft SDKs\Windows -# All the keys in there are the available versions. -# -# For Platform SDK before 6.0 (2003 server R1 and R2, etc...), there does not -# seem to be any sane registry key, so the precise location is hardcoded. -# -# For versions below 2003R1, it seems the PSDK is included with Visual Studio? -# -# Also, per the following: -# http://benjamin.smedbergs.us/blog/tag/atl/ -# VC++ Professional comes with the SDK, VC++ Express does not. - -# Location of the SDK (checked for 6.1 only) -_CURINSTALLED_SDK_HKEY_ROOT = \ - r"Software\Microsoft\Microsoft SDKs\Windows\CurrentInstallFolder" - - -class SDKDefinition: - """ - An abstract base class for trying to find installed SDK directories. - """ - def __init__(self, version, **kw): - self.version = version - self.__dict__.update(kw) - - def find_sdk_dir(self): - """Try to find the MS SDK from the registry. - - Return None if failed or the directory does not exist. - """ - if not SCons.Util.can_read_reg: - debug('find_sdk_dir(): can not read registry') - return None - - hkey = self.HKEY_FMT % self.hkey_data - debug('find_sdk_dir(): checking registry:%s'%hkey) - - try: - sdk_dir = common.read_reg(hkey) - except WindowsError, e: - debug('find_sdk_dir(): no SDK registry key %s' % repr(hkey)) - return None - - debug('find_sdk_dir(): Trying SDK Dir: %s'%sdk_dir) - - if not os.path.exists(sdk_dir): - debug('find_sdk_dir(): %s not on file system' % sdk_dir) - return None - - ftc = os.path.join(sdk_dir, self.sanity_check_file) - if not os.path.exists(ftc): - debug("find_sdk_dir(): sanity check %s not found" % ftc) - return None - - return sdk_dir - - def get_sdk_dir(self): - """Return the MSSSDK given the version string.""" - try: - return self._sdk_dir - except AttributeError: - sdk_dir = self.find_sdk_dir() - self._sdk_dir = sdk_dir - return sdk_dir - - def get_sdk_vc_script(self,host_arch, target_arch): - """ Return the script to initialize the VC compiler installed by SDK - """ - - if (host_arch == 'amd64' and target_arch == 'x86'): - # No cross tools needed compiling 32 bits on 64 bit machine - host_arch=target_arch - - arch_string=target_arch - if (host_arch != target_arch): - arch_string='%s_%s'%(host_arch,target_arch) - - debug("sdk.py: get_sdk_vc_script():arch_string:%s host_arch:%s target_arch:%s"%(arch_string, - host_arch, - target_arch)) - file=self.vc_setup_scripts.get(arch_string,None) - debug("sdk.py: get_sdk_vc_script():file:%s"%file) - return file - -class WindowsSDK(SDKDefinition): - """ - A subclass for trying to find installed Windows SDK directories. - """ - HKEY_FMT = r'Software\Microsoft\Microsoft SDKs\Windows\v%s\InstallationFolder' - def __init__(self, *args, **kw): - apply(SDKDefinition.__init__, (self,)+args, kw) - self.hkey_data = self.version - -class PlatformSDK(SDKDefinition): - """ - A subclass for trying to find installed Platform SDK directories. - """ - HKEY_FMT = r'Software\Microsoft\MicrosoftSDK\InstalledSDKS\%s\Install Dir' - def __init__(self, *args, **kw): - apply(SDKDefinition.__init__, (self,)+args, kw) - self.hkey_data = self.uuid - -# -# The list of VC initialization scripts installed by the SDK -# These should be tried if the vcvarsall.bat TARGET_ARCH fails -preSDK61VCSetupScripts = { 'x86' : r'bin\vcvars32.bat', - 'amd64' : r'bin\vcvarsamd64.bat', - 'x86_amd64': r'bin\vcvarsx86_amd64.bat', - 'x86_ia64' : r'bin\vcvarsx86_ia64.bat', - 'ia64' : r'bin\vcvarsia64.bat'} - -SDK61VCSetupScripts = {'x86' : r'bin\vcvars32.bat', - 'amd64' : r'bin\amd64\vcvarsamd64.bat', - 'x86_amd64': r'bin\x86_amd64\vcvarsx86_amd64.bat', - 'x86_ia64' : r'bin\x86_ia64\vcvarsx86_ia64.bat', - 'ia64' : r'bin\ia64\vcvarsia64.bat'} - -SDK70VCSetupScripts = { 'x86' : r'bin\vcvars32.bat', - 'amd64' : r'bin\vcvars64.bat', - 'x86_amd64': r'bin\vcvarsx86_amd64.bat', - 'x86_ia64' : r'bin\vcvarsx86_ia64.bat', - 'ia64' : r'bin\vcvarsia64.bat'} - -# The list of support SDKs which we know how to detect. -# -# The first SDK found in the list is the one used by default if there -# are multiple SDKs installed. Barring good reasons to the contrary, -# this means we should list SDKs with from most recent to oldest. -# -# If you update this list, update the documentation in Tool/mssdk.xml. -SupportedSDKList = [ - WindowsSDK('7.0', - sanity_check_file=r'bin\SetEnv.Cmd', - include_subdir='include', - lib_subdir={ - 'x86' : ['lib'], - 'x86_64' : [r'lib\x64'], - 'ia64' : [r'lib\ia64'], - }, - vc_setup_scripts = SDK70VCSetupScripts, - ), - WindowsSDK('6.1', - sanity_check_file=r'bin\SetEnv.Cmd', - include_subdir='include', - lib_subdir={ - 'x86' : ['lib'], - 'x86_64' : [r'lib\x64'], - 'ia64' : [r'lib\ia64'], - }, - vc_setup_scripts = SDK61VCSetupScripts, - ), - - WindowsSDK('6.0A', - sanity_check_file=r'include\windows.h', - include_subdir='include', - lib_subdir={ - 'x86' : ['lib'], - 'x86_64' : [r'lib\x64'], - 'ia64' : [r'lib\ia64'], - }, - vc_setup_scripts = preSDK61VCSetupScripts, - ), - - WindowsSDK('6.0', - sanity_check_file=r'bin\gacutil.exe', - include_subdir='include', - lib_subdir='lib', - vc_setup_scripts = preSDK61VCSetupScripts, - ), - - PlatformSDK('2003R2', - sanity_check_file=r'SetEnv.Cmd', - uuid="D2FF9F89-8AA2-4373-8A31-C838BF4DBBE1", - vc_setup_scripts = preSDK61VCSetupScripts, - ), - - PlatformSDK('2003R1', - sanity_check_file=r'SetEnv.Cmd', - uuid="8F9E5EF3-A9A5-491B-A889-C58EFFECE8B3", - vc_setup_scripts = preSDK61VCSetupScripts, - ), -] - -SupportedSDKMap = {} -for sdk in SupportedSDKList: - SupportedSDKMap[sdk.version] = sdk - - -# Finding installed SDKs isn't cheap, because it goes not only to the -# registry but also to the disk to sanity-check that there is, in fact, -# an SDK installed there and that the registry entry isn't just stale. -# Find this information once, when requested, and cache it. - -InstalledSDKList = None -InstalledSDKMap = None - -def get_installed_sdks(): - global InstalledSDKList - global InstalledSDKMap - debug('sdk.py:get_installed_sdks()') - if InstalledSDKList is None: - InstalledSDKList = [] - InstalledSDKMap = {} - for sdk in SupportedSDKList: - debug('MSCommon/sdk.py: trying to find SDK %s' % sdk.version) - if sdk.get_sdk_dir(): - debug('MSCommon/sdk.py:found SDK %s' % sdk.version) - InstalledSDKList.append(sdk) - InstalledSDKMap[sdk.version] = sdk - return InstalledSDKList - - -# We may be asked to update multiple construction environments with -# SDK information. When doing this, we check on-disk for whether -# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk -# is expensive, cache results by directory. - -SDKEnvironmentUpdates = {} - -def set_sdk_by_directory(env, sdk_dir): - global SDKEnvironmentUpdates - debug('set_sdk_by_directory: Using dir:%s'%sdk_dir) - try: - env_tuple_list = SDKEnvironmentUpdates[sdk_dir] - except KeyError: - env_tuple_list = [] - SDKEnvironmentUpdates[sdk_dir] = env_tuple_list - - include_path = os.path.join(sdk_dir, 'include') - mfc_path = os.path.join(include_path, 'mfc') - atl_path = os.path.join(include_path, 'atl') - - if os.path.exists(mfc_path): - env_tuple_list.append(('INCLUDE', mfc_path)) - if os.path.exists(atl_path): - env_tuple_list.append(('INCLUDE', atl_path)) - env_tuple_list.append(('INCLUDE', include_path)) - - env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib'))) - env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib'))) - env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin'))) - - for variable, directory in env_tuple_list: - env.PrependENVPath(variable, directory) - - -# TODO(sgk): currently unused; remove? -def get_cur_sdk_dir_from_reg(): - """Try to find the platform sdk directory from the registry. - - Return None if failed or the directory does not exist""" - if not SCons.Util.can_read_reg: - debug('SCons cannot read registry') - return None - - try: - val = common.read_reg(_CURINSTALLED_SDK_HKEY_ROOT) - debug("Found current sdk dir in registry: %s" % val) - except WindowsError, e: - debug("Did not find current sdk in registry") - return None - - if not os.path.exists(val): - debug("Current sdk dir %s not on fs" % val) - return None - - return val - -def get_sdk_by_version(mssdk): - if not SupportedSDKMap.has_key(mssdk): - msg = "SDK version %s is not supported" % repr(mssdk) - raise SCons.Errors.UserError, msg - get_installed_sdks() - return InstalledSDKMap.get(mssdk) - -def get_default_sdk(): - """Set up the default Platform/Windows SDK.""" - get_installed_sdks() - if not InstalledSDKList: - return None - return InstalledSDKList[0] - - - - -def mssdk_setup_env(env): - debug('sdk.py:mssdk_setup_env()') - if env.has_key('MSSDK_DIR'): - sdk_dir = env['MSSDK_DIR'] - if sdk_dir is None: - return - sdk_dir = env.subst(sdk_dir) - debug('sdk.py:mssdk_setup_env: Using MSSDK_DIR:%s'%sdk_dir) - elif env.has_key('MSSDK_VERSION'): - sdk_version = env['MSSDK_VERSION'] - if sdk_version is None: - msg = "SDK version %s is not installed" % repr(mssdk) - raise SCons.Errors.UserError, msg - sdk_version = env.subst(sdk_version) - mssdk = get_sdk_by_version(sdk_version) - sdk_dir = mssdk.get_sdk_dir() - debug('sdk.py:mssdk_setup_env: Using MSSDK_VERSION:%s'%sdk_dir) - elif env.has_key('MSVS_VERSION'): - msvs_version = env['MSVS_VERSION'] - debug('sdk.py:mssdk_setup_env:Getting MSVS_VERSION from env:%s'%msvs_version) - if msvs_version is None: - debug('sdk.py:mssdk_setup_env thinks msvs_version is None') - return - msvs_version = env.subst(msvs_version) - import vs - msvs = vs.get_vs_by_version(msvs_version) - debug('sdk.py:mssdk_setup_env:msvs is :%s'%msvs) - if not msvs: - debug('sdk.py:mssdk_setup_env: no VS version detected, bailingout:%s'%msvs) - return - sdk_version = msvs.sdk_version - debug('sdk.py:msvs.sdk_version is %s'%sdk_version) - if not sdk_version: - return - mssdk = get_sdk_by_version(sdk_version) - if not mssdk: - mssdk = get_default_sdk() - if not mssdk: - return - sdk_dir = mssdk.get_sdk_dir() - debug('sdk.py:mssdk_setup_env: Using MSVS_VERSION:%s'%sdk_dir) - else: - mssdk = get_default_sdk() - if not mssdk: - return - sdk_dir = mssdk.get_sdk_dir() - debug('sdk.py:mssdk_setup_env: not using any env values. sdk_dir:%s'%sdk_dir) - - set_sdk_by_directory(env, sdk_dir) - - #print "No MSVS_VERSION: this is likely to be a bug" - -def mssdk_exists(version=None): - sdks = get_installed_sdks() - if version is None: - return len(sdks) > 0 - return sdks.has_key(version) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/MSCommon/vc.py b/share/scons-local-1.3.0/SCons/Tool/MSCommon/vc.py deleted file mode 100644 index 5ea5a53a4612dc74f63d7cd1e75774674d0fcc89..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/MSCommon/vc.py +++ /dev/null @@ -1,410 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -# TODO: -# * supported arch for versions: for old versions of batch file without -# argument, giving bogus argument cannot be detected, so we have to hardcode -# this here -# * print warning when msvc version specified but not found -# * find out why warning do not print -# * test on 64 bits XP + VS 2005 (and VS 6 if possible) -# * SDK -# * Assembly -__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Module for Visual C/C++ detection and configuration. -""" -import SCons.compat - -import string -import os -import platform - -import SCons.Warnings - -import common - -debug = common.debug - -import sdk - -get_installed_sdks = sdk.get_installed_sdks - - -class VisualCException(Exception): - pass - -class UnsupportedVersion(VisualCException): - pass - -class UnsupportedArch(VisualCException): - pass - -class MissingConfiguration(VisualCException): - pass - -class NoVersionFound(VisualCException): - pass - -class BatchFileExecutionError(VisualCException): - pass - -# Dict to 'canonalize' the arch -_ARCH_TO_CANONICAL = { - "x86": "x86", - "amd64": "amd64", - "i386": "x86", - "emt64": "amd64", - "x86_64": "amd64", - "itanium": "ia64", - "ia64": "ia64", -} - -# Given a (host, target) tuple, return the argument for the bat file. Both host -# and targets should be canonalized. -_HOST_TARGET_ARCH_TO_BAT_ARCH = { - ("x86", "x86"): "x86", - ("x86", "amd64"): "x86_amd64", - ("amd64", "amd64"): "amd64", - ("amd64", "x86"): "x86", - ("x86", "ia64"): "x86_ia64" -} - -def get_host_target(env): - host_platform = env.get('HOST_ARCH') - if not host_platform: - host_platform = platform.machine() - # TODO(2.5): the native Python platform.machine() function returns - # '' on all Python versions before 2.6, after which it also uses - # PROCESSOR_ARCHITECTURE. - if not host_platform: - host_platform = os.environ.get('PROCESSOR_ARCHITECTURE', '') - target_platform = env.get('TARGET_ARCH') - if not target_platform: - target_platform = host_platform - - try: - host = _ARCH_TO_CANONICAL[host_platform] - except KeyError, e: - msg = "Unrecognized host architecture %s" - raise ValueError(msg % repr(host_platform)) - - try: - target = _ARCH_TO_CANONICAL[target_platform] - except KeyError, e: - raise ValueError("Unrecognized target architecture %s" % target_platform) - - return (host, target) - -_VCVER = ["10.0", "9.0", "9.0Exp","8.0", "8.0Exp","7.1", "7.0", "6.0"] - -_VCVER_TO_PRODUCT_DIR = { - '10.0': [ - r'Microsoft\VisualStudio\10.0\Setup\VC\ProductDir'], - '9.0': [ - r'Microsoft\VisualStudio\9.0\Setup\VC\ProductDir'], - '9.0Exp' : [ - r'Microsoft\VCExpress\9.0\Setup\VC\ProductDir'], - '8.0': [ - r'Microsoft\VisualStudio\8.0\Setup\VC\ProductDir'], - '8.0Exp': [ - r'Microsoft\VCExpress\8.0\Setup\VC\ProductDir'], - '7.1': [ - r'Microsoft\VisualStudio\7.1\Setup\VC\ProductDir'], - '7.0': [ - r'Microsoft\VisualStudio\7.0\Setup\VC\ProductDir'], - '6.0': [ - r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual C++\ProductDir'] -} - -def msvc_version_to_maj_min(msvc_version): - t = msvc_version.split(".") - if not len(t) == 2: - raise ValueError("Unrecognized version %s" % msvc_version) - try: - maj = int(t[0]) - min = int(t[1]) - return maj, min - except ValueError, e: - raise ValueError("Unrecognized version %s" % msvc_version) - -def is_host_target_supported(host_target, msvc_version): - """Return True if the given (host, target) tuple is supported given the - msvc version. - - Parameters - ---------- - host_target: tuple - tuple of (canonalized) host-target, e.g. ("x86", "amd64") for cross - compilation from 32 bits windows to 64 bits. - msvc_version: str - msvc version (major.minor, e.g. 10.0) - - Note - ---- - This only check whether a given version *may* support the given (host, - target), not that the toolchain is actually present on the machine. - """ - # We assume that any Visual Studio version supports x86 as a target - if host_target[1] != "x86": - maj, min = msvc_version_to_maj_min(msvc_version) - if maj < 8: - return False - - return True - -def find_vc_pdir(msvc_version): - """Try to find the product directory for the given - version. - - Note - ---- - If for some reason the requested version could not be found, an - exception which inherits from VisualCException will be raised.""" - root = 'Software\\' - if common.is_win64(): - root = root + 'Wow6432Node\\' - try: - hkeys = _VCVER_TO_PRODUCT_DIR[msvc_version] - except KeyError: - debug("Unknown version of MSVC: %s" % msvc_version) - raise UnsupportedVersion("Unknown version %s" % msvc_version) - - for key in hkeys: - key = root + key - try: - comps = common.read_reg(key) - except WindowsError, e: - debug('find_vc_dir(): no VC registry key %s' % repr(key)) - else: - debug('find_vc_dir(): found VC in registry: %s' % comps) - if os.path.exists(comps): - return comps - else: - debug('find_vc_dir(): reg says dir is %s, but it does not exist. (ignoring)'\ - % comps) - raise MissingConfiguration("registry dir %s not found on the filesystem" % comps) - return None - -def find_batch_file(env,msvc_version): - """ - Find the location of the batch script which should set up the compiler - for any TARGET_ARCH whose compilers were installed by Visual Studio/VCExpress - """ - pdir = find_vc_pdir(msvc_version) - if pdir is None: - raise NoVersionFound("No version of Visual Studio found") - - debug('vc.py: find_batch_file() pdir:%s'%pdir) - - # filter out e.g. "Exp" from the version name - msvc_ver_numeric = string.join(filter(lambda x: x in string.digits + ".", msvc_version), '') - vernum = float(msvc_ver_numeric) - if 7 <= vernum < 8: - pdir = os.path.join(pdir, os.pardir, "Common7", "Tools") - batfilename = os.path.join(pdir, "vsvars32.bat") - elif vernum < 7: - pdir = os.path.join(pdir, "Bin") - batfilename = os.path.join(pdir, "vcvars32.bat") - else: # >= 8 - batfilename = os.path.join(pdir, "vcvarsall.bat") - - if not os.path.exists(batfilename): - debug("Not found: %s" % batfilename) - batfilename = None - - installed_sdks=get_installed_sdks() - (host_arch,target_arch)=get_host_target(env) - for _sdk in installed_sdks: - sdk_bat_file=_sdk.get_sdk_vc_script(host_arch,target_arch) - sdk_bat_file_path=os.path.join(pdir,sdk_bat_file) - debug('vc.py:find_batch_file() sdk_bat_file_path:%s'%sdk_bat_file_path) - if os.path.exists(sdk_bat_file_path): - return (batfilename,sdk_bat_file_path) - else: - debug("vc.py:find_batch_file() not found:%s"%sdk_bat_file_path) - else: - return (batfilename,None) - -__INSTALLED_VCS_RUN = None - -def cached_get_installed_vcs(): - global __INSTALLED_VCS_RUN - - if __INSTALLED_VCS_RUN is None: - ret = get_installed_vcs() - __INSTALLED_VCS_RUN = ret - - return __INSTALLED_VCS_RUN - -def get_installed_vcs(): - installed_versions = [] - for ver in _VCVER: - debug('trying to find VC %s' % ver) - try: - if find_vc_pdir(ver): - debug('found VC %s' % ver) - installed_versions.append(ver) - else: - debug('find_vc_pdir return None for ver %s' % ver) - except VisualCException, e: - debug('did not find VC %s: caught exception %s' % (ver, str(e))) - return installed_versions - -def reset_installed_vcs(): - """Make it try again to find VC. This is just for the tests.""" - __INSTALLED_VCS_RUN = None - -def script_env(script, args=None): - stdout = common.get_output(script, args) - # Stupid batch files do not set return code: we take a look at the - # beginning of the output for an error message instead - olines = stdout.splitlines() - if olines[0].startswith("The specified configuration type is missing"): - raise BatchFileExecutionError("\n".join(olines[:2])) - - return common.parse_output(stdout) - -def get_default_version(env): - debug('get_default_version()') - - msvc_version = env.get('MSVC_VERSION') - msvs_version = env.get('MSVS_VERSION') - - debug('get_default_version(): msvc_version:%s msvs_version:%s'%(msvc_version,msvs_version)) - - if msvs_version and not msvc_version: - SCons.Warnings.warn( - SCons.Warnings.DeprecatedWarning, - "MSVS_VERSION is deprecated: please use MSVC_VERSION instead ") - return msvs_version - elif msvc_version and msvs_version: - if not msvc_version == msvs_version: - SCons.Warnings.warn( - SCons.Warnings.VisualVersionMismatch, - "Requested msvc version (%s) and msvs version (%s) do " \ - "not match: please use MSVC_VERSION only to request a " \ - "visual studio version, MSVS_VERSION is deprecated" \ - % (msvc_version, msvs_version)) - return msvs_version - if not msvc_version: - installed_vcs = cached_get_installed_vcs() - debug('installed_vcs:%s' % installed_vcs) - if not installed_vcs: - msg = 'No installed VCs' - debug('msv %s\n' % repr(msg)) - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, msg) - return None - msvc_version = installed_vcs[0] - debug('msvc_setup_env: using default installed MSVC version %s\n' % repr(msvc_version)) - - return msvc_version - -def msvc_setup_env_once(env): - try: - has_run = env["MSVC_SETUP_RUN"] - except KeyError: - has_run = False - - if not has_run: - msvc_setup_env(env) - env["MSVC_SETUP_RUN"] = True - -def msvc_setup_env(env): - debug('msvc_setup_env()') - - version = get_default_version(env) - if version is None: - warn_msg = "No version of Visual Studio compiler found - C/C++ " \ - "compilers most likely not set correctly" - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - return None - debug('msvc_setup_env: using specified MSVC version %s\n' % repr(version)) - - # XXX: we set-up both MSVS version for backward - # compatibility with the msvs tool - env['MSVC_VERSION'] = version - env['MSVS_VERSION'] = version - env['MSVS'] = {} - - try: - (vc_script,sdk_script) = find_batch_file(env,version) - debug('vc.py:msvc_setup_env() vc_script:%s sdk_script:%s'%(vc_script,sdk_script)) - except VisualCException, e: - msg = str(e) - debug('Caught exception while looking for batch file (%s)' % msg) - warn_msg = "VC version %s not installed. " + \ - "C/C++ compilers are most likely not set correctly.\n" + \ - " Installed versions are: %s" - warn_msg = warn_msg % (version, cached_get_installed_vcs()) - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - return None - - debug('vc.py:msvc_setup_env() vc_script:%s sdk_script:%s'%(vc_script,sdk_script)) - use_script = env.get('MSVC_USE_SCRIPT', True) - if SCons.Util.is_String(use_script): - debug('use_script 1 %s\n' % repr(use_script)) - d = script_env(use_script) - elif use_script: - host_platform, target_platform = get_host_target(env) - host_target = (host_platform, target_platform) - if not is_host_target_supported(host_target, version): - warn_msg = "host, target = %s not supported for MSVC version %s" % \ - (host_target, version) - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - arg = _HOST_TARGET_ARCH_TO_BAT_ARCH[host_target] - debug('use_script 2 %s, args:%s\n' % (repr(vc_script), arg)) - if vc_script: - try: - d = script_env(vc_script, args=arg) - except BatchFileExecutionError, e: - debug('use_script 3: failed running VC script %s: %s: Error:%s'%(repr(vc_script),arg,e)) - vc_script=None - if not vc_script and sdk_script: - debug('use_script 4: trying sdk script: %s'%(sdk_script)) - try: - d = script_env(sdk_script,args=[]) - except BatchFileExecutionError,e: - debug('use_script 5: failed running SDK script %s: Error:%s'%(repr(sdk_script),e)) - return None - elif not vc_script and not sdk_script: - debug('use_script 6: Neither VC script nor SDK script found') - return None - - else: - debug('MSVC_USE_SCRIPT set to False') - warn_msg = "MSVC_USE_SCRIPT set to False, assuming environment " \ - "set correctly." - SCons.Warnings.warn(SCons.Warnings.VisualCMissingWarning, warn_msg) - return None - - for k, v in d.items(): - debug('vc.py:msvc_setup_env() env:%s -> %s'%(k,v)) - env.PrependENVPath(k, v, delete_existing=True) - -def msvc_exists(version=None): - vcs = cached_get_installed_vcs() - if version is None: - return len(vcs) > 0 - return version in vcs - diff --git a/share/scons-local-1.3.0/SCons/Tool/MSCommon/vs.py b/share/scons-local-1.3.0/SCons/Tool/MSCommon/vs.py deleted file mode 100644 index e634a1805efe7afb9764b4132f2b2840882de321..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/MSCommon/vs.py +++ /dev/null @@ -1,499 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """Module to detect Visual Studio and/or Visual C/C++ -""" - -import os - -import SCons.Errors -import SCons.Util - -from common import debug, \ - get_output, \ - is_win64, \ - normalize_env, \ - parse_output, \ - read_reg - -import SCons.Tool.MSCommon.vc - -class VisualStudio: - """ - An abstract base class for trying to find installed versions of - Visual Studio. - """ - def __init__(self, version, **kw): - self.version = version - kw['vc_version'] = kw.get('vc_version', version) - kw['sdk_version'] = kw.get('sdk_version', version) - self.__dict__.update(kw) - self._cache = {} - - # - - def find_batch_file(self): - vs_dir = self.get_vs_dir() - if not vs_dir: - debug('find_executable(): no vs_dir') - return None - batch_file = os.path.join(vs_dir, self.batch_file_path) - batch_file = os.path.normpath(batch_file) - if not os.path.isfile(batch_file): - debug('find_batch_file(): %s not on file system' % batch_file) - return None - return batch_file - - def find_vs_dir_by_vc(self): - SCons.Tool.MSCommon.vc.get_installed_vcs() - dir = SCons.Tool.MSCommon.vc.find_vc_pdir(self.vc_version) - if not dir: - debug('find_vs_dir(): no installed VC %s' % self.vc_version) - return None - return dir - - def find_vs_dir_by_reg(self): - root = 'Software\\' - - if is_win64(): - root = root + 'Wow6432Node\\' - for key in self.hkeys: - if key=='use_dir': - return self.find_vs_dir_by_vc() - key = root + key - try: - comps = read_reg(key) - except WindowsError, e: - debug('find_vs_dir_by_reg(): no VS registry key %s' % repr(key)) - else: - debug('find_vs_dir_by_reg(): found VS in registry: %s' % comps) - return comps - return None - - def find_vs_dir(self): - """ Can use registry or location of VC to find vs dir - First try to find by registry, and if that fails find via VC dir - """ - - - if True: - vs_dir=self.find_vs_dir_by_reg() - return vs_dir - else: - return self.find_vs_dir_by_vc() - - def find_executable(self): - vs_dir = self.get_vs_dir() - if not vs_dir: - debug('find_executable(): no vs_dir (%s)'%vs_dir) - return None - executable = os.path.join(vs_dir, self.executable_path) - executable = os.path.normpath(executable) - if not os.path.isfile(executable): - debug('find_executable(): %s not on file system' % executable) - return None - return executable - - # - - def get_batch_file(self): - try: - return self._cache['batch_file'] - except KeyError: - batch_file = self.find_batch_file() - self._cache['batch_file'] = batch_file - return batch_file - - def get_executable(self): - try: - debug('get_executable using cache:%s'%self._cache['executable']) - return self._cache['executable'] - except KeyError: - executable = self.find_executable() - self._cache['executable'] = executable - debug('get_executable not in cache:%s'%executable) - return executable - - def get_vs_dir(self): - try: - return self._cache['vs_dir'] - except KeyError: - vs_dir = self.find_vs_dir() - self._cache['vs_dir'] = vs_dir - return vs_dir - - def get_supported_arch(self): - try: - return self._cache['supported_arch'] - except KeyError: - # RDEVE: for the time being use hardcoded lists - # supported_arch = self.find_supported_arch() - self._cache['supported_arch'] = self.supported_arch - return self.supported_arch - - def reset(self): - self._cache = {} - -# The list of supported Visual Studio versions we know how to detect. -# -# How to look for .bat file ? -# - VS 2008 Express (x86): -# * from registry key productdir, gives the full path to vsvarsall.bat. In -# HKEY_LOCAL_MACHINE): -# Software\Microsoft\VCEpress\9.0\Setup\VC\productdir -# * from environmnent variable VS90COMNTOOLS: the path is then ..\..\VC -# relatively to the path given by the variable. -# -# - VS 2008 Express (WoW6432: 32 bits on windows x64): -# Software\Wow6432Node\Microsoft\VCEpress\9.0\Setup\VC\productdir -# -# - VS 2005 Express (x86): -# * from registry key productdir, gives the full path to vsvarsall.bat. In -# HKEY_LOCAL_MACHINE): -# Software\Microsoft\VCEpress\8.0\Setup\VC\productdir -# * from environmnent variable VS80COMNTOOLS: the path is then ..\..\VC -# relatively to the path given by the variable. -# -# - VS 2005 Express (WoW6432: 32 bits on windows x64): does not seem to have a -# productdir ? -# -# - VS 2003 .Net (pro edition ? x86): -# * from registry key productdir. The path is then ..\Common7\Tools\ -# relatively to the key. The key is in HKEY_LOCAL_MACHINE): -# Software\Microsoft\VisualStudio\7.1\Setup\VC\productdir -# * from environmnent variable VS71COMNTOOLS: the path is the full path to -# vsvars32.bat -# -# - VS 98 (VS 6): -# * from registry key productdir. The path is then Bin -# relatively to the key. The key is in HKEY_LOCAL_MACHINE): -# Software\Microsoft\VisualStudio\6.0\Setup\VC98\productdir -# -# The first version found in the list is the one used by default if -# there are multiple versions installed. Barring good reasons to -# the contrary, this means we should list versions from most recent -# to oldest. Pro versions get listed before Express versions on the -# assumption that, by default, you'd rather use the version you paid -# good money for in preference to whatever Microsoft makes available -# for free. -# -# If you update this list, update the documentation in Tool/msvs.xml. - -SupportedVSList = [ - # Visual Studio 2010 - # TODO: find the settings, perhaps from someone with a CTP copy? - #VisualStudio('TBD', - # hkey_root=r'TBD', - # common_tools_var='TBD', - # executable_path=r'TBD', - # default_dirname='TBD', - #), - - # Visual Studio 2008 - # The batch file we look for is in the VC directory, - # so the devenv.com executable is up in ..\..\Common7\IDE. - VisualStudio('9.0', - sdk_version='6.1', - hkeys=[r'Microsoft\VisualStudio\9.0\Setup\VS\ProductDir'], - common_tools_var='VS90COMNTOOLS', - executable_path=r'Common7\IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 9', - supported_arch=['x86', 'amd64'], - ), - - # Visual C++ 2008 Express Edition - # The batch file we look for is in the VC directory, - # so the VCExpress.exe executable is up in ..\..\Common7\IDE. - VisualStudio('9.0Exp', - vc_version='9.0', - sdk_version='6.1', - hkeys=[r'Microsoft\VCExpress\9.0\Setup\VS\ProductDir'], - common_tools_var='VS90COMNTOOLS', - executable_path=r'Common7\IDE\VCExpress.exe', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 9', - supported_arch=['x86'], - ), - - # Visual Studio 2005 - # The batch file we look for is in the VC directory, - # so the devenv.com executable is up in ..\..\Common7\IDE. - VisualStudio('8.0', - sdk_version='6.0A', - hkeys=[r'Microsoft\VisualStudio\8.0\Setup\VS\ProductDir'], - common_tools_var='VS80COMNTOOLS', - executable_path=r'Common7\IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 8', - supported_arch=['x86', 'amd64'], - ), - - # Visual C++ 2005 Express Edition - # The batch file we look for is in the VC directory, - # so the VCExpress.exe executable is up in ..\..\Common7\IDE. - VisualStudio('8.0Exp', - vc_version='8.0Exp', - sdk_version='6.0A', - hkeys=[r'Microsoft\VCExpress\8.0\Setup\VS\ProductDir'], - common_tools_var='VS80COMNTOOLS', - executable_path=r'Common7\IDE\VCExpress.exe', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio 8', - supported_arch=['x86'], - ), - - # Visual Studio .NET 2003 - # The batch file we look for is in the Common7\Tools directory, - # so the devenv.com executable is next door in ..\IDE. - VisualStudio('7.1', - sdk_version='6.0', - hkeys=[r'Microsoft\VisualStudio\7.1\Setup\VS\ProductDir'], - common_tools_var='VS71COMNTOOLS', - executable_path=r'Common7\IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio .NET 2003', - supported_arch=['x86'], - ), - - # Visual Studio .NET - # The batch file we look for is in the Common7\Tools directory, - # so the devenv.com executable is next door in ..\IDE. - VisualStudio('7.0', - sdk_version='2003R2', - hkeys=[r'Microsoft\VisualStudio\7.0\Setup\VS\ProductDir'], - common_tools_var='VS70COMNTOOLS', - executable_path=r'IDE\devenv.com', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio .NET', - supported_arch=['x86'], - ), - - # Visual Studio 6.0 - VisualStudio('6.0', - sdk_version='2003R1', - hkeys=[r'Microsoft\VisualStudio\6.0\Setup\Microsoft Visual Studio\ProductDir', - 'use_dir'], - common_tools_var='VS60COMNTOOLS', - executable_path=r'Common\MSDev98\Bin\MSDEV.COM', - batch_file_path=r'Common7\Tools\vsvars32.bat', - default_dirname='Microsoft Visual Studio', - supported_arch=['x86'], - ), -] - -SupportedVSMap = {} -for vs in SupportedVSList: - SupportedVSMap[vs.version] = vs - - -# Finding installed versions of Visual Studio isn't cheap, because it -# goes not only to the registry but also to the disk to sanity-check -# that there is, in fact, a Visual Studio directory there and that the -# registry entry isn't just stale. Find this information once, when -# requested, and cache it. - -InstalledVSList = None -InstalledVSMap = None - -def get_installed_visual_studios(): - global InstalledVSList - global InstalledVSMap - if InstalledVSList is None: - InstalledVSList = [] - InstalledVSMap = {} - for vs in SupportedVSList: - debug('trying to find VS %s' % vs.version) - if vs.get_executable(): - debug('found VS %s' % vs.version) - InstalledVSList.append(vs) - InstalledVSMap[vs.version] = vs - return InstalledVSList - -def reset_installed_visual_studios(): - global InstalledVSList - global InstalledVSMap - InstalledVSList = None - InstalledVSMap = None - for vs in SupportedVSList: - vs.reset() - - # Need to clear installed VC's as well as they are used in finding - # installed VS's - SCons.Tool.MSCommon.vc.reset_installed_vcs() - - -# We may be asked to update multiple construction environments with -# SDK information. When doing this, we check on-disk for whether -# the SDK has 'mfc' and 'atl' subdirectories. Since going to disk -# is expensive, cache results by directory. - -#SDKEnvironmentUpdates = {} -# -#def set_sdk_by_directory(env, sdk_dir): -# global SDKEnvironmentUpdates -# try: -# env_tuple_list = SDKEnvironmentUpdates[sdk_dir] -# except KeyError: -# env_tuple_list = [] -# SDKEnvironmentUpdates[sdk_dir] = env_tuple_list -# -# include_path = os.path.join(sdk_dir, 'include') -# mfc_path = os.path.join(include_path, 'mfc') -# atl_path = os.path.join(include_path, 'atl') -# -# if os.path.exists(mfc_path): -# env_tuple_list.append(('INCLUDE', mfc_path)) -# if os.path.exists(atl_path): -# env_tuple_list.append(('INCLUDE', atl_path)) -# env_tuple_list.append(('INCLUDE', include_path)) -# -# env_tuple_list.append(('LIB', os.path.join(sdk_dir, 'lib'))) -# env_tuple_list.append(('LIBPATH', os.path.join(sdk_dir, 'lib'))) -# env_tuple_list.append(('PATH', os.path.join(sdk_dir, 'bin'))) -# -# for variable, directory in env_tuple_list: -# env.PrependENVPath(variable, directory) - -def msvs_exists(): - return (len(get_installed_visual_studios()) > 0) - -def get_vs_by_version(msvs): - global InstalledVSMap - global SupportedVSMap - - debug('vs.py:get_vs_by_version()') - if not SupportedVSMap.has_key(msvs): - msg = "Visual Studio version %s is not supported" % repr(msvs) - raise SCons.Errors.UserError, msg - get_installed_visual_studios() - vs = InstalledVSMap.get(msvs) - debug('InstalledVSMap:%s'%InstalledVSMap) - debug('vs.py:get_vs_by_version: found vs:%s'%vs) - # Some check like this would let us provide a useful error message - # if they try to set a Visual Studio version that's not installed. - # However, we also want to be able to run tests (like the unit - # tests) on systems that don't, or won't ever, have it installed. - # It might be worth resurrecting this, with some configurable - # setting that the tests can use to bypass the check. - #if not vs: - # msg = "Visual Studio version %s is not installed" % repr(msvs) - # raise SCons.Errors.UserError, msg - return vs - -def get_default_version(env): - """Returns the default version string to use for MSVS. - - If no version was requested by the user through the MSVS environment - variable, query all the available the visual studios through - query_versions, and take the highest one. - - Return - ------ - version: str - the default version. - """ - if not env.has_key('MSVS') or not SCons.Util.is_Dict(env['MSVS']): - # TODO(1.5): - #versions = [vs.version for vs in get_installed_visual_studios()] - versions = map(lambda vs: vs.version, get_installed_visual_studios()) - env['MSVS'] = {'VERSIONS' : versions} - else: - versions = env['MSVS'].get('VERSIONS', []) - - if not env.has_key('MSVS_VERSION'): - if versions: - env['MSVS_VERSION'] = versions[0] #use highest version by default - else: - env['MSVS_VERSION'] = SupportedVSList[0].version - - env['MSVS']['VERSION'] = env['MSVS_VERSION'] - - return env['MSVS_VERSION'] - -def get_default_arch(env): - """Return the default arch to use for MSVS - - if no version was requested by the user through the MSVS_ARCH environment - variable, select x86 - - Return - ------ - arch: str - """ - arch = env.get('MSVS_ARCH', 'x86') - - msvs = InstalledVSMap.get(env['MSVS_VERSION']) - - if not msvs: - arch = 'x86' - elif not arch in msvs.get_supported_arch(): - fmt = "Visual Studio version %s does not support architecture %s" - raise SCons.Errors.UserError, fmt % (env['MSVS_VERSION'], arch) - - return arch - -def merge_default_version(env): - version = get_default_version(env) - arch = get_default_arch(env) - -def msvs_setup_env(env): - batfilename = msvs.get_batch_file() - msvs = get_vs_by_version(version) - if msvs is None: - return - - # XXX: I think this is broken. This will silently set a bogus tool instead - # of failing, but there is no other way with the current scons tool - # framework - if batfilename is not None: - - vars = ('LIB', 'LIBPATH', 'PATH', 'INCLUDE') - - msvs_list = get_installed_visual_studios() - # TODO(1.5): - #vscommonvarnames = [ vs.common_tools_var for vs in msvs_list ] - vscommonvarnames = map(lambda vs: vs.common_tools_var, msvs_list) - nenv = normalize_env(env['ENV'], vscommonvarnames + ['COMSPEC']) - output = get_output(batfilename, arch, env=nenv) - vars = parse_output(output, vars) - - for k, v in vars.items(): - env.PrependENVPath(k, v, delete_existing=1) - -def query_versions(): - """Query the system to get available versions of VS. A version is - considered when a batfile is found.""" - msvs_list = get_installed_visual_studios() - # TODO(1.5) - #versions = [ msvs.version for msvs in msvs_list ] - versions = map(lambda msvs: msvs.version, msvs_list) - return versions - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/Perforce.py b/share/scons-local-1.3.0/SCons/Tool/Perforce.py deleted file mode 100644 index 08da75b2e1ca7bd8cf0fadba98a28e87ba08e184..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/Perforce.py +++ /dev/null @@ -1,104 +0,0 @@ -"""SCons.Tool.Perforce.py - -Tool-specific initialization for Perforce Source Code Management system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/Perforce.py 4720 2010/03/24 03:14:11 jars" - -import os - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Util - -# This function should maybe be moved to SCons.Util? -from SCons.Tool.PharLapCommon import addPathIfNotExists - - - -# Variables that we want to import from the base OS environment. -_import_env = [ 'P4PORT', 'P4CLIENT', 'P4USER', 'USER', 'USERNAME', 'P4PASSWD', - 'P4CHARSET', 'P4LANGUAGE', 'SystemRoot' ] - -PerforceAction = SCons.Action.Action('$P4COM', '$P4COMSTR') - -def generate(env): - """Add a Builder factory function and construction variables for - Perforce to an Environment.""" - - def PerforceFactory(env=env): - """ """ - return SCons.Builder.Builder(action = PerforceAction, env = env) - - #setattr(env, 'Perforce', PerforceFactory) - env.Perforce = PerforceFactory - - env['P4'] = 'p4' - env['P4FLAGS'] = SCons.Util.CLVar('') - env['P4COM'] = '$P4 $P4FLAGS sync $TARGET' - try: - environ = env['ENV'] - except KeyError: - environ = {} - env['ENV'] = environ - - # Perforce seems to use the PWD environment variable rather than - # calling getcwd() for itself, which is odd. If no PWD variable - # is present, p4 WILL call getcwd, but this seems to cause problems - # with good ol' Windows's tilde-mangling for long file names. - environ['PWD'] = env.Dir('#').get_abspath() - - for var in _import_env: - v = os.environ.get(var) - if v: - environ[var] = v - - if SCons.Util.can_read_reg: - # If we can read the registry, add the path to Perforce to our environment. - try: - k=SCons.Util.RegOpenKeyEx(SCons.Util.hkey_mod.HKEY_LOCAL_MACHINE, - 'Software\\Perforce\\environment') - val, tok = SCons.Util.RegQueryValueEx(k, 'P4INSTROOT') - addPathIfNotExists(environ, 'PATH', val) - except SCons.Util.RegError: - # Can't detect where Perforce is, hope the user has it set in the - # PATH. - pass - -def exists(env): - return env.Detect('p4') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/PharLapCommon.py b/share/scons-local-1.3.0/SCons/Tool/PharLapCommon.py deleted file mode 100644 index 2cfb02a2ebd1fbf58ba7bf36e285f534b276eddc..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/PharLapCommon.py +++ /dev/null @@ -1,138 +0,0 @@ -"""SCons.Tool.PharLapCommon - -This module contains common code used by all Tools for the -Phar Lap ETS tool chain. Right now, this is linkloc and -386asm. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/PharLapCommon.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path -import SCons.Errors -import SCons.Util -import re -import string - -def getPharLapPath(): - """Reads the registry to find the installed path of the Phar Lap ETS - development kit. - - Raises UserError if no installed version of Phar Lap can - be found.""" - - if not SCons.Util.can_read_reg: - raise SCons.Errors.InternalError, "No Windows registry module was found" - try: - k=SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, - 'SOFTWARE\\Pharlap\\ETS') - val, type = SCons.Util.RegQueryValueEx(k, 'BaseDir') - - # The following is a hack...there is (not surprisingly) - # an odd issue in the Phar Lap plug in that inserts - # a bunch of junk data after the phar lap path in the - # registry. We must trim it. - idx=val.find('\0') - if idx >= 0: - val = val[:idx] - - return os.path.normpath(val) - except SCons.Util.RegError: - raise SCons.Errors.UserError, "Cannot find Phar Lap ETS path in the registry. Is it installed properly?" - -REGEX_ETS_VER = re.compile(r'#define\s+ETS_VER\s+([0-9]+)') - -def getPharLapVersion(): - """Returns the version of the installed ETS Tool Suite as a - decimal number. This version comes from the ETS_VER #define in - the embkern.h header. For example, '#define ETS_VER 1010' (which - is what Phar Lap 10.1 defines) would cause this method to return - 1010. Phar Lap 9.1 does not have such a #define, but this method - will return 910 as a default. - - Raises UserError if no installed version of Phar Lap can - be found.""" - - include_path = os.path.join(getPharLapPath(), os.path.normpath("include/embkern.h")) - if not os.path.exists(include_path): - raise SCons.Errors.UserError, "Cannot find embkern.h in ETS include directory.\nIs Phar Lap ETS installed properly?" - mo = REGEX_ETS_VER.search(open(include_path, 'r').read()) - if mo: - return int(mo.group(1)) - # Default return for Phar Lap 9.1 - return 910 - -def addPathIfNotExists(env_dict, key, path, sep=os.pathsep): - """This function will take 'key' out of the dictionary - 'env_dict', then add the path 'path' to that key if it is not - already there. This treats the value of env_dict[key] as if it - has a similar format to the PATH variable...a list of paths - separated by tokens. The 'path' will get added to the list if it - is not already there.""" - try: - is_list = 1 - paths = env_dict[key] - if not SCons.Util.is_List(env_dict[key]): - paths = string.split(paths, sep) - is_list = 0 - if not os.path.normcase(path) in map(os.path.normcase, paths): - paths = [ path ] + paths - if is_list: - env_dict[key] = paths - else: - env_dict[key] = string.join(paths, sep) - except KeyError: - env_dict[key] = path - -def addPharLapPaths(env): - """This function adds the path to the Phar Lap binaries, includes, - and libraries, if they are not already there.""" - ph_path = getPharLapPath() - - try: - env_dict = env['ENV'] - except KeyError: - env_dict = {} - env['ENV'] = env_dict - addPathIfNotExists(env_dict, 'PATH', - os.path.join(ph_path, 'bin')) - addPathIfNotExists(env_dict, 'INCLUDE', - os.path.join(ph_path, 'include')) - addPathIfNotExists(env_dict, 'LIB', - os.path.join(ph_path, 'lib')) - addPathIfNotExists(env_dict, 'LIB', - os.path.join(ph_path, os.path.normpath('lib/vclib'))) - - env['PHARLAP_PATH'] = getPharLapPath() - env['PHARLAP_VERSION'] = str(getPharLapVersion()) - - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/RCS.py b/share/scons-local-1.3.0/SCons/Tool/RCS.py deleted file mode 100644 index 4d14af7eb1f45f1aa2e9457898aaf65c8bb607d5..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/RCS.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.RCS.py - -Tool-specific initialization for RCS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/RCS.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - RCS to an Environment.""" - - def RCSFactory(env=env): - """ """ - act = SCons.Action.Action('$RCS_COCOM', '$RCS_COCOMSTR') - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'RCS', RCSFactory) - env.RCS = RCSFactory - - env['RCS'] = 'rcs' - env['RCS_CO'] = 'co' - env['RCS_COFLAGS'] = SCons.Util.CLVar('') - env['RCS_COCOM'] = '$RCS_CO $RCS_COFLAGS $TARGET' - -def exists(env): - return env.Detect('rcs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/SCCS.py b/share/scons-local-1.3.0/SCons/Tool/SCCS.py deleted file mode 100644 index 2893291aea2f7151e70d934a552442481efd29a6..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/SCCS.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.SCCS.py - -Tool-specific initialization for SCCS. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/SCCS.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - SCCS to an Environment.""" - - def SCCSFactory(env=env): - """ """ - act = SCons.Action.Action('$SCCSCOM', '$SCCSCOMSTR') - return SCons.Builder.Builder(action = act, env = env) - - #setattr(env, 'SCCS', SCCSFactory) - env.SCCS = SCCSFactory - - env['SCCS'] = 'sccs' - env['SCCSFLAGS'] = SCons.Util.CLVar('') - env['SCCSGETFLAGS'] = SCons.Util.CLVar('') - env['SCCSCOM'] = '$SCCS $SCCSFLAGS get $SCCSGETFLAGS $TARGET' - -def exists(env): - return env.Detect('sccs') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/Subversion.py b/share/scons-local-1.3.0/SCons/Tool/Subversion.py deleted file mode 100644 index 51a670a13f3beeb43b326a32f8b16cf4cbb2b409..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/Subversion.py +++ /dev/null @@ -1,71 +0,0 @@ -"""SCons.Tool.Subversion.py - -Tool-specific initialization for Subversion. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/Subversion.py 4720 2010/03/24 03:14:11 jars" - -import os.path - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add a Builder factory function and construction variables for - Subversion to an Environment.""" - - def SubversionFactory(repos, module='', env=env): - """ """ - # fail if repos is not an absolute path name? - if module != '': - module = os.path.join(module, '') - act = SCons.Action.Action('$SVNCOM', '$SVNCOMSTR') - return SCons.Builder.Builder(action = act, - env = env, - SVNREPOSITORY = repos, - SVNMODULE = module) - - #setattr(env, 'Subversion', SubversionFactory) - env.Subversion = SubversionFactory - - env['SVN'] = 'svn' - env['SVNFLAGS'] = SCons.Util.CLVar('') - env['SVNCOM'] = '$SVN $SVNFLAGS cat $SVNREPOSITORY/$SVNMODULE$TARGET > $TARGET' - -def exists(env): - return env.Detect('svn') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/__init__.py b/share/scons-local-1.3.0/SCons/Tool/__init__.py deleted file mode 100644 index 4a41a8c3a14252f1d8c855fd951a56181611cea5..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/__init__.py +++ /dev/null @@ -1,675 +0,0 @@ -"""SCons.Tool - -SCons tool selection. - -This looks for modules that define a callable object that can modify -a construction environment as appropriate for a given tool (or tool -chain). - -Note that because this subsystem just *selects* a callable that can -modify a construction environment, it's possible for people to define -their own "tool specification" in an arbitrary callable function. No -one needs to use or tie in to this subsystem in order to roll their own -tool definition. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/__init__.py 4720 2010/03/24 03:14:11 jars" - -import imp -import sys - -import SCons.Builder -import SCons.Errors -import SCons.Node.FS -import SCons.Scanner -import SCons.Scanner.C -import SCons.Scanner.D -import SCons.Scanner.LaTeX -import SCons.Scanner.Prog - -DefaultToolpath=[] - -CScanner = SCons.Scanner.C.CScanner() -DScanner = SCons.Scanner.D.DScanner() -LaTeXScanner = SCons.Scanner.LaTeX.LaTeXScanner() -PDFLaTeXScanner = SCons.Scanner.LaTeX.PDFLaTeXScanner() -ProgramScanner = SCons.Scanner.Prog.ProgramScanner() -SourceFileScanner = SCons.Scanner.Base({}, name='SourceFileScanner') - -CSuffixes = [".c", ".C", ".cxx", ".cpp", ".c++", ".cc", - ".h", ".H", ".hxx", ".hpp", ".hh", - ".F", ".fpp", ".FPP", - ".m", ".mm", - ".S", ".spp", ".SPP"] - -DSuffixes = ['.d'] - -IDLSuffixes = [".idl", ".IDL"] - -LaTeXSuffixes = [".tex", ".ltx", ".latex"] - -for suffix in CSuffixes: - SourceFileScanner.add_scanner(suffix, CScanner) - -for suffix in DSuffixes: - SourceFileScanner.add_scanner(suffix, DScanner) - -# FIXME: what should be done here? Two scanners scan the same extensions, -# but look for different files, e.g., "picture.eps" vs. "picture.pdf". -# The builders for DVI and PDF explicitly reference their scanners -# I think that means this is not needed??? -for suffix in LaTeXSuffixes: - SourceFileScanner.add_scanner(suffix, LaTeXScanner) - SourceFileScanner.add_scanner(suffix, PDFLaTeXScanner) - -class Tool: - def __init__(self, name, toolpath=[], **kw): - self.name = name - self.toolpath = toolpath + DefaultToolpath - # remember these so we can merge them into the call - self.init_kw = kw - - module = self._tool_module() - self.generate = module.generate - self.exists = module.exists - if hasattr(module, 'options'): - self.options = module.options - - def _tool_module(self): - # TODO: Interchange zipimport with normal initilization for better error reporting - oldpythonpath = sys.path - sys.path = self.toolpath + sys.path - - try: - try: - file, path, desc = imp.find_module(self.name, self.toolpath) - try: - return imp.load_module(self.name, file, path, desc) - finally: - if file: - file.close() - except ImportError, e: - if str(e)!="No module named %s"%self.name: - raise SCons.Errors.EnvironmentError, e - try: - import zipimport - except ImportError: - pass - else: - for aPath in self.toolpath: - try: - importer = zipimport.zipimporter(aPath) - return importer.load_module(self.name) - except ImportError, e: - pass - finally: - sys.path = oldpythonpath - - full_name = 'SCons.Tool.' + self.name - try: - return sys.modules[full_name] - except KeyError: - try: - smpath = sys.modules['SCons.Tool'].__path__ - try: - file, path, desc = imp.find_module(self.name, smpath) - module = imp.load_module(full_name, file, path, desc) - setattr(SCons.Tool, self.name, module) - if file: - file.close() - return module - except ImportError, e: - if str(e)!="No module named %s"%self.name: - raise SCons.Errors.EnvironmentError, e - try: - import zipimport - importer = zipimport.zipimporter( sys.modules['SCons.Tool'].__path__[0] ) - module = importer.load_module(full_name) - setattr(SCons.Tool, self.name, module) - return module - except ImportError, e: - m = "No tool named '%s': %s" % (self.name, e) - raise SCons.Errors.EnvironmentError, m - except ImportError, e: - m = "No tool named '%s': %s" % (self.name, e) - raise SCons.Errors.EnvironmentError, m - - def __call__(self, env, *args, **kw): - if self.init_kw is not None: - # Merge call kws into init kws; - # but don't bash self.init_kw. - if kw is not None: - call_kw = kw - kw = self.init_kw.copy() - kw.update(call_kw) - else: - kw = self.init_kw - env.Append(TOOLS = [ self.name ]) - if hasattr(self, 'options'): - import SCons.Variables - if not env.has_key('options'): - from SCons.Script import ARGUMENTS - env['options']=SCons.Variables.Variables(args=ARGUMENTS) - opts=env['options'] - - self.options(opts) - opts.Update(env) - - apply(self.generate, ( env, ) + args, kw) - - def __str__(self): - return self.name - -########################################################################## -# Create common executable program / library / object builders - -def createProgBuilder(env): - """This is a utility function that creates the Program - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - program = env['BUILDERS']['Program'] - except KeyError: - import SCons.Defaults - program = SCons.Builder.Builder(action = SCons.Defaults.LinkAction, - emitter = '$PROGEMITTER', - prefix = '$PROGPREFIX', - suffix = '$PROGSUFFIX', - src_suffix = '$OBJSUFFIX', - src_builder = 'Object', - target_scanner = ProgramScanner) - env['BUILDERS']['Program'] = program - - return program - -def createStaticLibBuilder(env): - """This is a utility function that creates the StaticLibrary - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - static_lib = env['BUILDERS']['StaticLibrary'] - except KeyError: - action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ] - if env.Detect('ranlib'): - ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR") - action_list.append(ranlib_action) - - static_lib = SCons.Builder.Builder(action = action_list, - emitter = '$LIBEMITTER', - prefix = '$LIBPREFIX', - suffix = '$LIBSUFFIX', - src_suffix = '$OBJSUFFIX', - src_builder = 'StaticObject') - env['BUILDERS']['StaticLibrary'] = static_lib - env['BUILDERS']['Library'] = static_lib - - return static_lib - -def createSharedLibBuilder(env): - """This is a utility function that creates the SharedLibrary - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - shared_lib = env['BUILDERS']['SharedLibrary'] - except KeyError: - import SCons.Defaults - action_list = [ SCons.Defaults.SharedCheck, - SCons.Defaults.ShLinkAction ] - shared_lib = SCons.Builder.Builder(action = action_list, - emitter = "$SHLIBEMITTER", - prefix = '$SHLIBPREFIX', - suffix = '$SHLIBSUFFIX', - target_scanner = ProgramScanner, - src_suffix = '$SHOBJSUFFIX', - src_builder = 'SharedObject') - env['BUILDERS']['SharedLibrary'] = shared_lib - - return shared_lib - -def createLoadableModuleBuilder(env): - """This is a utility function that creates the LoadableModule - Builder in an Environment if it is not there already. - - If it is already there, we return the existing one. - """ - - try: - ld_module = env['BUILDERS']['LoadableModule'] - except KeyError: - import SCons.Defaults - action_list = [ SCons.Defaults.SharedCheck, - SCons.Defaults.LdModuleLinkAction ] - ld_module = SCons.Builder.Builder(action = action_list, - emitter = "$LDMODULEEMITTER", - prefix = '$LDMODULEPREFIX', - suffix = '$LDMODULESUFFIX', - target_scanner = ProgramScanner, - src_suffix = '$SHOBJSUFFIX', - src_builder = 'SharedObject') - env['BUILDERS']['LoadableModule'] = ld_module - - return ld_module - -def createObjBuilders(env): - """This is a utility function that creates the StaticObject - and SharedObject Builders in an Environment if they - are not there already. - - If they are there already, we return the existing ones. - - This is a separate function because soooo many Tools - use this functionality. - - The return is a 2-tuple of (StaticObject, SharedObject) - """ - - - try: - static_obj = env['BUILDERS']['StaticObject'] - except KeyError: - static_obj = SCons.Builder.Builder(action = {}, - emitter = {}, - prefix = '$OBJPREFIX', - suffix = '$OBJSUFFIX', - src_builder = ['CFile', 'CXXFile'], - source_scanner = SourceFileScanner, - single_source = 1) - env['BUILDERS']['StaticObject'] = static_obj - env['BUILDERS']['Object'] = static_obj - - try: - shared_obj = env['BUILDERS']['SharedObject'] - except KeyError: - shared_obj = SCons.Builder.Builder(action = {}, - emitter = {}, - prefix = '$SHOBJPREFIX', - suffix = '$SHOBJSUFFIX', - src_builder = ['CFile', 'CXXFile'], - source_scanner = SourceFileScanner, - single_source = 1) - env['BUILDERS']['SharedObject'] = shared_obj - - return (static_obj, shared_obj) - -def createCFileBuilders(env): - """This is a utility function that creates the CFile/CXXFile - Builders in an Environment if they - are not there already. - - If they are there already, we return the existing ones. - - This is a separate function because soooo many Tools - use this functionality. - - The return is a 2-tuple of (CFile, CXXFile) - """ - - try: - c_file = env['BUILDERS']['CFile'] - except KeyError: - c_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$CFILESUFFIX'}) - env['BUILDERS']['CFile'] = c_file - - env.SetDefault(CFILESUFFIX = '.c') - - try: - cxx_file = env['BUILDERS']['CXXFile'] - except KeyError: - cxx_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$CXXFILESUFFIX'}) - env['BUILDERS']['CXXFile'] = cxx_file - env.SetDefault(CXXFILESUFFIX = '.cc') - - return (c_file, cxx_file) - -########################################################################## -# Create common Java builders - -def CreateJarBuilder(env): - try: - java_jar = env['BUILDERS']['Jar'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - jar_com = SCons.Action.Action('$JARCOM', '$JARCOMSTR') - java_jar = SCons.Builder.Builder(action = jar_com, - suffix = '$JARSUFFIX', - src_suffix = '$JAVACLASSSUFIX', - src_builder = 'JavaClassFile', - source_factory = fs.Entry) - env['BUILDERS']['Jar'] = java_jar - return java_jar - -def CreateJavaHBuilder(env): - try: - java_javah = env['BUILDERS']['JavaH'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - java_javah_com = SCons.Action.Action('$JAVAHCOM', '$JAVAHCOMSTR') - java_javah = SCons.Builder.Builder(action = java_javah_com, - src_suffix = '$JAVACLASSSUFFIX', - target_factory = fs.Entry, - source_factory = fs.File, - src_builder = 'JavaClassFile') - env['BUILDERS']['JavaH'] = java_javah - return java_javah - -def CreateJavaClassFileBuilder(env): - try: - java_class_file = env['BUILDERS']['JavaClassFile'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - java_class_file = SCons.Builder.Builder(action = javac_com, - emitter = {}, - #suffix = '$JAVACLASSSUFFIX', - src_suffix = '$JAVASUFFIX', - src_builder = ['JavaFile'], - target_factory = fs.Entry, - source_factory = fs.File) - env['BUILDERS']['JavaClassFile'] = java_class_file - return java_class_file - -def CreateJavaClassDirBuilder(env): - try: - java_class_dir = env['BUILDERS']['JavaClassDir'] - except KeyError: - fs = SCons.Node.FS.get_default_fs() - javac_com = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - java_class_dir = SCons.Builder.Builder(action = javac_com, - emitter = {}, - target_factory = fs.Dir, - source_factory = fs.Dir) - env['BUILDERS']['JavaClassDir'] = java_class_dir - return java_class_dir - -def CreateJavaFileBuilder(env): - try: - java_file = env['BUILDERS']['JavaFile'] - except KeyError: - java_file = SCons.Builder.Builder(action = {}, - emitter = {}, - suffix = {None:'$JAVASUFFIX'}) - env['BUILDERS']['JavaFile'] = java_file - env['JAVASUFFIX'] = '.java' - return java_file - -class ToolInitializerMethod: - """ - This is added to a construction environment in place of a - method(s) normally called for a Builder (env.Object, env.StaticObject, - etc.). When called, it has its associated ToolInitializer - object search the specified list of tools and apply the first - one that exists to the construction environment. It then calls - whatever builder was (presumably) added to the construction - environment in place of this particular instance. - """ - def __init__(self, name, initializer): - """ - Note: we store the tool name as __name__ so it can be used by - the class that attaches this to a construction environment. - """ - self.__name__ = name - self.initializer = initializer - - def get_builder(self, env): - """ - Returns the appropriate real Builder for this method name - after having the associated ToolInitializer object apply - the appropriate Tool module. - """ - builder = getattr(env, self.__name__) - - self.initializer.apply_tools(env) - - builder = getattr(env, self.__name__) - if builder is self: - # There was no Builder added, which means no valid Tool - # for this name was found (or possibly there's a mismatch - # between the name we were called by and the Builder name - # added by the Tool module). - return None - - self.initializer.remove_methods(env) - - return builder - - def __call__(self, env, *args, **kw): - """ - """ - builder = self.get_builder(env) - if builder is None: - return [], [] - return apply(builder, args, kw) - -class ToolInitializer: - """ - A class for delayed initialization of Tools modules. - - Instances of this class associate a list of Tool modules with - a list of Builder method names that will be added by those Tool - modules. As part of instantiating this object for a particular - construction environment, we also add the appropriate - ToolInitializerMethod objects for the various Builder methods - that we want to use to delay Tool searches until necessary. - """ - def __init__(self, env, tools, names): - if not SCons.Util.is_List(tools): - tools = [tools] - if not SCons.Util.is_List(names): - names = [names] - self.env = env - self.tools = tools - self.names = names - self.methods = {} - for name in names: - method = ToolInitializerMethod(name, self) - self.methods[name] = method - env.AddMethod(method) - - def remove_methods(self, env): - """ - Removes the methods that were added by the tool initialization - so we no longer copy and re-bind them when the construction - environment gets cloned. - """ - for method in self.methods.values(): - env.RemoveMethod(method) - - def apply_tools(self, env): - """ - Searches the list of associated Tool modules for one that - exists, and applies that to the construction environment. - """ - for t in self.tools: - tool = SCons.Tool.Tool(t) - if tool.exists(env): - env.Tool(tool) - return - - # If we fall through here, there was no tool module found. - # This is where we can put an informative error message - # about the inability to find the tool. We'll start doing - # this as we cut over more pre-defined Builder+Tools to use - # the ToolInitializer class. - -def Initializers(env): - ToolInitializer(env, ['install'], ['_InternalInstall', '_InternalInstallAs']) - def Install(self, *args, **kw): - return apply(self._InternalInstall, args, kw) - def InstallAs(self, *args, **kw): - return apply(self._InternalInstallAs, args, kw) - env.AddMethod(Install) - env.AddMethod(InstallAs) - -def FindTool(tools, env): - for tool in tools: - t = Tool(tool) - if t.exists(env): - return tool - return None - -def FindAllTools(tools, env): - def ToolExists(tool, env=env): - return Tool(tool).exists(env) - return filter (ToolExists, tools) - -def tool_list(platform, env): - - other_plat_tools=[] - # XXX this logic about what tool to prefer on which platform - # should be moved into either the platform files or - # the tool files themselves. - # The search orders here are described in the man page. If you - # change these search orders, update the man page as well. - if str(platform) == 'win32': - "prefer Microsoft tools on Windows" - linkers = ['mslink', 'gnulink', 'ilink', 'linkloc', 'ilink32' ] - c_compilers = ['msvc', 'mingw', 'gcc', 'intelc', 'icl', 'icc', 'cc', 'bcc32' ] - cxx_compilers = ['msvc', 'intelc', 'icc', 'g++', 'c++', 'bcc32' ] - assemblers = ['masm', 'nasm', 'gas', '386asm' ] - fortran_compilers = ['gfortran', 'g77', 'ifl', 'cvf', 'f95', 'f90', 'fortran'] - ars = ['mslib', 'ar', 'tlib'] - other_plat_tools=['msvs','midl'] - elif str(platform) == 'os2': - "prefer IBM tools on OS/2" - linkers = ['ilink', 'gnulink', ]#'mslink'] - c_compilers = ['icc', 'gcc',]# 'msvc', 'cc'] - cxx_compilers = ['icc', 'g++',]# 'msvc', 'c++'] - assemblers = ['nasm',]# 'masm', 'gas'] - fortran_compilers = ['ifl', 'g77'] - ars = ['ar',]# 'mslib'] - elif str(platform) == 'irix': - "prefer MIPSPro on IRIX" - linkers = ['sgilink', 'gnulink'] - c_compilers = ['sgicc', 'gcc', 'cc'] - cxx_compilers = ['sgic++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran'] - ars = ['sgiar'] - elif str(platform) == 'sunos': - "prefer Forte tools on SunOS" - linkers = ['sunlink', 'gnulink'] - c_compilers = ['suncc', 'gcc', 'cc'] - cxx_compilers = ['sunc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['sunf95', 'sunf90', 'sunf77', 'f95', 'f90', 'f77', - 'gfortran', 'g77', 'fortran'] - ars = ['sunar'] - elif str(platform) == 'hpux': - "prefer aCC tools on HP-UX" - linkers = ['hplink', 'gnulink'] - c_compilers = ['hpcc', 'gcc', 'cc'] - cxx_compilers = ['hpc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'f77', 'g77', 'fortran'] - ars = ['ar'] - elif str(platform) == 'aix': - "prefer AIX Visual Age tools on AIX" - linkers = ['aixlink', 'gnulink'] - c_compilers = ['aixcc', 'gcc', 'cc'] - cxx_compilers = ['aixc++', 'g++', 'c++'] - assemblers = ['as', 'gas'] - fortran_compilers = ['f95', 'f90', 'aixf77', 'g77', 'fortran'] - ars = ['ar'] - elif str(platform) == 'darwin': - "prefer GNU tools on Mac OS X, except for some linkers and IBM tools" - linkers = ['applelink', 'gnulink'] - c_compilers = ['gcc', 'cc'] - cxx_compilers = ['g++', 'c++'] - assemblers = ['as'] - fortran_compilers = ['gfortran', 'f95', 'f90', 'g77'] - ars = ['ar'] - else: - "prefer GNU tools on all other platforms" - linkers = ['gnulink', 'mslink', 'ilink'] - c_compilers = ['gcc', 'msvc', 'intelc', 'icc', 'cc'] - cxx_compilers = ['g++', 'msvc', 'intelc', 'icc', 'c++'] - assemblers = ['gas', 'nasm', 'masm'] - fortran_compilers = ['gfortran', 'g77', 'ifort', 'ifl', 'f95', 'f90', 'f77'] - ars = ['ar', 'mslib'] - - c_compiler = FindTool(c_compilers, env) or c_compilers[0] - - # XXX this logic about what tool provides what should somehow be - # moved into the tool files themselves. - if c_compiler and c_compiler == 'mingw': - # MinGW contains a linker, C compiler, C++ compiler, - # Fortran compiler, archiver and assembler: - cxx_compiler = None - linker = None - assembler = None - fortran_compiler = None - ar = None - else: - # Don't use g++ if the C compiler has built-in C++ support: - if c_compiler in ('msvc', 'intelc', 'icc'): - cxx_compiler = None - else: - cxx_compiler = FindTool(cxx_compilers, env) or cxx_compilers[0] - linker = FindTool(linkers, env) or linkers[0] - assembler = FindTool(assemblers, env) or assemblers[0] - fortran_compiler = FindTool(fortran_compilers, env) or fortran_compilers[0] - ar = FindTool(ars, env) or ars[0] - - other_tools = FindAllTools(['BitKeeper', 'CVS', - 'dmd', - 'filesystem', - 'dvipdf', 'dvips', 'gs', - 'jar', 'javac', 'javah', - 'latex', 'lex', - 'm4', #'midl', 'msvs', - 'pdflatex', 'pdftex', 'Perforce', - 'RCS', 'rmic', 'rpcgen', - 'SCCS', - # 'Subversion', - 'swig', - 'tar', 'tex', - 'yacc', 'zip', 'rpm', 'wix']+other_plat_tools, - env) - - tools = ([linker, c_compiler, cxx_compiler, - fortran_compiler, assembler, ar] - + other_tools) - - return filter(lambda x: x, tools) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/aixc++.py b/share/scons-local-1.3.0/SCons/Tool/aixc++.py deleted file mode 100644 index 035ece465aaeb6c34cc85f594398764b2b7e1cee..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/aixc++.py +++ /dev/null @@ -1,82 +0,0 @@ -"""SCons.Tool.aixc++ - -Tool-specific initialization for IBM xlC / Visual Age C++ compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixc++.py 4720 2010/03/24 03:14:11 jars" - -import os.path - -import SCons.Platform.aix - -cplusplus = __import__('c++', globals(), locals(), []) - -packages = ['vacpp.cmp.core', 'vacpp.cmp.batch', 'vacpp.cmp.C', 'ibmcxx.cmp'] - -def get_xlc(env): - xlc = env.get('CXX', 'xlC') - xlc_r = env.get('SHCXX', 'xlC_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) - -def smart_cxxflags(source, target, env, for_signature): - build_dir = env.GetBuildPath() - if build_dir: - return '-qtempinc=' + os.path.join(build_dir, 'tempinc') - return '' - -def generate(env): - """Add Builders and construction variables for xlC / Visual Age - suite to an Environment.""" - path, _cxx, _shcxx, version = get_xlc(env) - if path: - _cxx = os.path.join(path, _cxx) - _shcxx = os.path.join(path, _shcxx) - - cplusplus.generate(env) - - env['CXX'] = _cxx - env['SHCXX'] = _shcxx - env['CXXVERSION'] = version - env['SHOBJSUFFIX'] = '.pic.o' - -def exists(env): - path, _cxx, _shcxx, version = get_xlc(env) - if path and _cxx: - xlc = os.path.join(path, _cxx) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/aixcc.py b/share/scons-local-1.3.0/SCons/Tool/aixcc.py deleted file mode 100644 index 1c6ae14d6b842ba4c286614a430e3ee1ce9fc8ce..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/aixcc.py +++ /dev/null @@ -1,74 +0,0 @@ -"""SCons.Tool.aixcc - -Tool-specific initialization for IBM xlc / Visual Age C compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixcc.py 4720 2010/03/24 03:14:11 jars" - -import os.path - -import SCons.Platform.aix - -import cc - -packages = ['vac.C', 'ibmcxx.cmp'] - -def get_xlc(env): - xlc = env.get('CC', 'xlc') - xlc_r = env.get('SHCC', 'xlc_r') - return SCons.Platform.aix.get_xlc(env, xlc, xlc_r, packages) - -def generate(env): - """Add Builders and construction variables for xlc / Visual Age - suite to an Environment.""" - path, _cc, _shcc, version = get_xlc(env) - if path: - _cc = os.path.join(path, _cc) - _shcc = os.path.join(path, _shcc) - - cc.generate(env) - - env['CC'] = _cc - env['SHCC'] = _shcc - env['CCVERSION'] = version - -def exists(env): - path, _cc, _shcc, version = get_xlc(env) - if path and _cc: - xlc = os.path.join(path, _cc) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/aixf77.py b/share/scons-local-1.3.0/SCons/Tool/aixf77.py deleted file mode 100644 index a5a9d8c56141761675a9c63607373e15d4a43db9..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/aixf77.py +++ /dev/null @@ -1,80 +0,0 @@ -"""engine.SCons.Tool.aixf77 - -Tool-specific initialization for IBM Visual Age f77 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixf77.py 4720 2010/03/24 03:14:11 jars" - -import os.path - -#import SCons.Platform.aix - -import f77 - -# It would be good to look for the AIX F77 package the same way we're now -# looking for the C and C++ packages. This should be as easy as supplying -# the correct package names in the following list and uncommenting the -# SCons.Platform.aix_get_xlc() call the in the function below. -packages = [] - -def get_xlf77(env): - xlf77 = env.get('F77', 'xlf77') - xlf77_r = env.get('SHF77', 'xlf77_r') - #return SCons.Platform.aix.get_xlc(env, xlf77, xlf77_r, packages) - return (None, xlf77, xlf77_r, None) - -def generate(env): - """ - Add Builders and construction variables for the Visual Age FORTRAN - compiler to an Environment. - """ - path, _f77, _shf77, version = get_xlf77(env) - if path: - _f77 = os.path.join(path, _f77) - _shf77 = os.path.join(path, _shf77) - - f77.generate(env) - - env['F77'] = _f77 - env['SHF77'] = _shf77 - -def exists(env): - path, _f77, _shf77, version = get_xlf77(env) - if path and _f77: - xlf77 = os.path.join(path, _f77) - if os.path.exists(xlf77): - return xlf77 - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/aixlink.py b/share/scons-local-1.3.0/SCons/Tool/aixlink.py deleted file mode 100644 index 0e1b974185c1c9a3b6d6cf5541bf8b0a6037e89a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/aixlink.py +++ /dev/null @@ -1,76 +0,0 @@ -"""SCons.Tool.aixlink - -Tool-specific initialization for the IBM Visual Age linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/aixlink.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path - -import SCons.Util - -import aixcc -import link - -cplusplus = __import__('c++', globals(), locals(), []) - -def smart_linkflags(source, target, env, for_signature): - if cplusplus.iscplusplus(source): - build_dir = env.subst('$BUILDDIR', target=target, source=source) - if build_dir: - return '-qtempinc=' + os.path.join(build_dir, 'tempinc') - return '' - -def generate(env): - """ - Add Builders and construction variables for Visual Age linker to - an Environment. - """ - link.generate(env) - - env['SMARTLINKFLAGS'] = smart_linkflags - env['LINKFLAGS'] = SCons.Util.CLVar('$SMARTLINKFLAGS') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -qmkshrobj -qsuppress=1501-218') - env['SHLIBSUFFIX'] = '.a' - -def exists(env): - path, _cc, _shcc, version = aixcc.get_xlc(env) - if path and _cc: - xlc = os.path.join(path, _cc) - if os.path.exists(xlc): - return xlc - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/applelink.py b/share/scons-local-1.3.0/SCons/Tool/applelink.py deleted file mode 100644 index a56462d28536a9d11df851adaf7021f23ca57fd5..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/applelink.py +++ /dev/null @@ -1,71 +0,0 @@ -"""SCons.Tool.applelink - -Tool-specific initialization for the Apple gnu-like linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/applelink.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Util - -# Even though the Mac is based on the GNU toolchain, it doesn't understand -# the -rpath option, so we use the "link" tool instead of "gnulink". -import link - -def generate(env): - """Add Builders and construction variables for applelink to an - Environment.""" - link.generate(env) - - env['FRAMEWORKPATHPREFIX'] = '-F' - env['_FRAMEWORKPATH'] = '${_concat(FRAMEWORKPATHPREFIX, FRAMEWORKPATH, "", __env__)}' - env['_FRAMEWORKS'] = '${_concat("-framework ", FRAMEWORKS, "", __env__)}' - env['LINKCOM'] = env['LINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -dynamiclib') - env['SHLINKCOM'] = env['SHLINKCOM'] + ' $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - - # override the default for loadable modules, which are different - # on OS X than dynamic shared libs. echoing what XCode does for - # pre/suffixes: - env['LDMODULEPREFIX'] = '' - env['LDMODULESUFFIX'] = '' - env['LDMODULEFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -bundle') - env['LDMODULECOM'] = '$LDMODULE -o ${TARGET} $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS $_FRAMEWORKPATH $_FRAMEWORKS $FRAMEWORKSFLAGS' - - - -def exists(env): - return env['PLATFORM'] == 'darwin' - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/ar.py b/share/scons-local-1.3.0/SCons/Tool/ar.py deleted file mode 100644 index b0ae76be6a66acb67951948d3d1611ee812c4085..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/ar.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.ar - -Tool-specific initialization for ar (library archive). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ar.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - env['AR'] = 'ar' - env['ARFLAGS'] = SCons.Util.CLVar('rc') - env['ARCOM'] = '$AR $ARFLAGS $TARGET $SOURCES' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - - if env.Detect('ranlib'): - env['RANLIB'] = 'ranlib' - env['RANLIBFLAGS'] = SCons.Util.CLVar('') - env['RANLIBCOM'] = '$RANLIB $RANLIBFLAGS $TARGET' - -def exists(env): - return env.Detect('ar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/as.py b/share/scons-local-1.3.0/SCons/Tool/as.py deleted file mode 100644 index bdd00db1b62fa3e8ba82139f2dbd2e74306e3442..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/as.py +++ /dev/null @@ -1,78 +0,0 @@ -"""SCons.Tool.as - -Tool-specific initialization for as, the generic Posix assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/as.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -assemblers = ['as'] - -ASSuffixes = ['.s', '.asm', '.ASM'] -ASPPSuffixes = ['.spp', '.SPP', '.sx'] -if SCons.Util.case_sensitive_suffixes('.s', '.S'): - ASPPSuffixes.extend(['.S']) -else: - ASSuffixes.extend(['.S']) - -def generate(env): - """Add Builders and construction variables for as to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in ASSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASAction) - shared_obj.add_action(suffix, SCons.Defaults.ASAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - for suffix in ASPPSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASPPAction) - shared_obj.add_action(suffix, SCons.Defaults.ASPPAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['AS'] = env.Detect(assemblers) or 'as' - env['ASFLAGS'] = SCons.Util.CLVar('') - env['ASCOM'] = '$AS $ASFLAGS -o $TARGET $SOURCES' - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o $TARGET $SOURCES' - -def exists(env): - return env.Detect(assemblers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/bcc32.py b/share/scons-local-1.3.0/SCons/Tool/bcc32.py deleted file mode 100644 index 67325d049b72ba661b4845bc2d89070fcf32fbfb..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/bcc32.py +++ /dev/null @@ -1,82 +0,0 @@ -"""SCons.Tool.bcc32 - -XXX - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/bcc32.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path -import string - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def findIt(program, env): - # First search in the SCons path and then the OS path: - borwin = env.WhereIs(program) or SCons.Util.WhereIs(program) - if borwin: - dir = os.path.dirname(borwin) - env.PrependENVPath('PATH', dir) - return borwin - -def generate(env): - findIt('bcc32', env) - """Add Builders and construction variables for bcc to an - Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - for suffix in ['.c', '.cpp']: - static_obj.add_action(suffix, SCons.Defaults.CAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['CC'] = 'bcc32' - env['CCFLAGS'] = SCons.Util.CLVar('') - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC -q $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES' - env['SHCC'] = '$CC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC -WD $SHCFLAGS $SHCCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -c -o$TARGET $SOURCES' - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.dll' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - env['CFILESUFFIX'] = '.cpp' - -def exists(env): - return findIt('bcc32', env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/c++.py b/share/scons-local-1.3.0/SCons/Tool/c++.py deleted file mode 100644 index d74cd969457a3b7cb939689619f4b8bbff00a7e5..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/c++.py +++ /dev/null @@ -1,99 +0,0 @@ -"""SCons.Tool.c++ - -Tool-specific initialization for generic Posix C++ compilers. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/c++.py 4720 2010/03/24 03:14:11 jars" - -import os.path - -import SCons.Tool -import SCons.Defaults -import SCons.Util - -compilers = ['CC', 'c++'] - -CXXSuffixes = ['.cpp', '.cc', '.cxx', '.c++', '.C++', '.mm'] -if SCons.Util.case_sensitive_suffixes('.c', '.C'): - CXXSuffixes.append('.C') - -def iscplusplus(source): - if not source: - # Source might be None for unusual cases like SConf. - return 0 - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext in CXXSuffixes: - return 1 - return 0 - -def generate(env): - """ - Add Builders and construction variables for Visual Age C++ compilers - to an Environment. - """ - import SCons.Tool - import SCons.Tool.cc - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in CXXSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CXXAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCXXAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - SCons.Tool.cc.add_common_cc_variables(env) - - env['CXX'] = 'c++' - env['CXXFLAGS'] = SCons.Util.CLVar('') - env['CXXCOM'] = '$CXX -o $TARGET -c $CXXFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' - env['SHCXX'] = '$CXX' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHCXXCOM'] = '$SHCXX -o $TARGET -c $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' - - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.os' - env['OBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - - env['CXXFILESUFFIX'] = '.cc' - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/cc.py b/share/scons-local-1.3.0/SCons/Tool/cc.py deleted file mode 100644 index c5652254d8ac9a78dfc681cad24c79901823b61c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/cc.py +++ /dev/null @@ -1,114 +0,0 @@ -"""SCons.Tool.cc - -Tool-specific initialization for generic Posix C compilers. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/cc.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Tool -import SCons.Defaults -import SCons.Util - -CSuffixes = ['.c', '.m'] -if not SCons.Util.case_sensitive_suffixes('.c', '.C'): - CSuffixes.append('.C') - -def add_common_cc_variables(env): - """ - Add underlying common "C compiler" variables that - are used by multiple tools (specifically, c++). - """ - if not env.has_key('_CCCOMCOM'): - env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' - # It's a hack to test for darwin here, but the alternative - # of creating an applecc.py to contain this seems overkill. - # Maybe someday the Apple platform will require more setup and - # this logic will be moved. - env['FRAMEWORKS'] = SCons.Util.CLVar('') - env['FRAMEWORKPATH'] = SCons.Util.CLVar('') - if env['PLATFORM'] == 'darwin': - env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH' - - if not env.has_key('CCFLAGS'): - env['CCFLAGS'] = SCons.Util.CLVar('') - - if not env.has_key('SHCCFLAGS'): - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - -def generate(env): - """ - Add Builders and construction variables for C compilers to an Environment. - """ - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in CSuffixes: - static_obj.add_action(suffix, SCons.Defaults.CAction) - shared_obj.add_action(suffix, SCons.Defaults.ShCAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) -#<<<<<<< .working -# -# env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS' -# # It's a hack to test for darwin here, but the alternative of creating -# # an applecc.py to contain this seems overkill. Maybe someday the Apple -# # platform will require more setup and this logic will be moved. -# env['FRAMEWORKS'] = SCons.Util.CLVar('') -# env['FRAMEWORKPATH'] = SCons.Util.CLVar('') -# if env['PLATFORM'] == 'darwin': -# env['_CCCOMCOM'] = env['_CCCOMCOM'] + ' $_FRAMEWORKPATH' -#======= -#>>>>>>> .merge-right.r1907 - - add_common_cc_variables(env) - - env['CC'] = 'cc' - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC -o $TARGET -c $CFLAGS $CCFLAGS $_CCCOMCOM $SOURCES' - env['SHCC'] = '$CC' - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC -o $TARGET -c $SHCFLAGS $SHCCFLAGS $_CCCOMCOM $SOURCES' - - env['CPPDEFPREFIX'] = '-D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '-I' - env['INCSUFFIX'] = '' - env['SHOBJSUFFIX'] = '.os' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 0 - - env['CFILESUFFIX'] = '.c' - -def exists(env): - return env.Detect('cc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/cvf.py b/share/scons-local-1.3.0/SCons/Tool/cvf.py deleted file mode 100644 index 7930a3855130da129df09492527ef56ff04baf73..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/cvf.py +++ /dev/null @@ -1,58 +0,0 @@ -"""engine.SCons.Tool.cvf - -Tool-specific initialization for the Compaq Visual Fortran compiler. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/cvf.py 4720 2010/03/24 03:14:11 jars" - -import fortran - -compilers = ['f90'] - -def generate(env): - """Add Builders and construction variables for compaq visual fortran to an Environment.""" - - fortran.generate(env) - - env['FORTRAN'] = 'f90' - env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANMODFLAG $_FORTRANINCFLAGS /compile_only ${SOURCES.windows} /object:${TARGET.windows}' - env['OBJSUFFIX'] = '.obj' - env['FORTRANMODDIR'] = '${TARGET.dir}' - env['FORTRANMODDIRPREFIX'] = '/module:' - env['FORTRANMODDIRSUFFIX'] = '' - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/default.py b/share/scons-local-1.3.0/SCons/Tool/default.py deleted file mode 100644 index b477c7b3673de2bae40023eb56b598c4586a7696..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/default.py +++ /dev/null @@ -1,50 +0,0 @@ -"""SCons.Tool.default - -Initialization with a default tool list. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/default.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Tool - -def generate(env): - """Add default tools.""" - for t in SCons.Tool.tool_list(env['PLATFORM'], env): - SCons.Tool.Tool(t)(env) - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/dmd.py b/share/scons-local-1.3.0/SCons/Tool/dmd.py deleted file mode 100644 index d5dc5c179e9621e7c37576f9e3d7713aafa3a99a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/dmd.py +++ /dev/null @@ -1,224 +0,0 @@ -"""SCons.Tool.dmd - -Tool-specific initialization for the Digital Mars D compiler. -(http://digitalmars.com/d) - -Coded by Andy Friesen (andy@ikagames.com) -15 November 2003 - -There are a number of problems with this script at this point in time. -The one that irritates me the most is the Windows linker setup. The D -linker doesn't have a way to add lib paths on the commandline, as far -as I can see. You have to specify paths relative to the SConscript or -use absolute paths. To hack around it, add '#/blah'. This will link -blah.lib from the directory where SConstruct resides. - -Compiler variables: - DC - The name of the D compiler to use. Defaults to dmd or gdmd, - whichever is found. - DPATH - List of paths to search for import modules. - DVERSIONS - List of version tags to enable when compiling. - DDEBUG - List of debug tags to enable when compiling. - -Linker related variables: - LIBS - List of library files to link in. - DLINK - Name of the linker to use. Defaults to dmd or gdmd. - DLINKFLAGS - List of linker flags. - -Lib tool variables: - DLIB - Name of the lib tool to use. Defaults to lib. - DLIBFLAGS - List of flags to pass to the lib tool. - LIBS - Same as for the linker. (libraries to pull into the .lib) -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/dmd.py 4720 2010/03/24 03:14:11 jars" - -import os -import string - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Scanner.D -import SCons.Tool - -# Adapted from c++.py -def isD(source): - if not source: - return 0 - - for s in source: - if s.sources: - ext = os.path.splitext(str(s.sources[0]))[1] - if ext == '.d': - return 1 - return 0 - -smart_link = {} - -smart_lib = {} - -def generate(env): - global smart_link - global smart_lib - - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - DAction = SCons.Action.Action('$DCOM', '$DCOMSTR') - - static_obj.add_action('.d', DAction) - shared_obj.add_action('.d', DAction) - static_obj.add_emitter('.d', SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter('.d', SCons.Defaults.SharedObjectEmitter) - - dc = env.Detect(['dmd', 'gdmd']) - env['DC'] = dc - env['DCOM'] = '$DC $_DINCFLAGS $_DVERFLAGS $_DDEBUGFLAGS $_DFLAGS -c -of$TARGET $SOURCES' - env['_DINCFLAGS'] = '$( ${_concat(DINCPREFIX, DPATH, DINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['_DVERFLAGS'] = '$( ${_concat(DVERPREFIX, DVERSIONS, DVERSUFFIX, __env__)} $)' - env['_DDEBUGFLAGS'] = '$( ${_concat(DDEBUGPREFIX, DDEBUG, DDEBUGSUFFIX, __env__)} $)' - env['_DFLAGS'] = '$( ${_concat(DFLAGPREFIX, DFLAGS, DFLAGSUFFIX, __env__)} $)' - - env['DPATH'] = ['#/'] - env['DFLAGS'] = [] - env['DVERSIONS'] = [] - env['DDEBUG'] = [] - - if dc: - # Add the path to the standard library. - # This is merely for the convenience of the dependency scanner. - dmd_path = env.WhereIs(dc) - if dmd_path: - x = string.rindex(dmd_path, dc) - phobosDir = dmd_path[:x] + '/../src/phobos' - if os.path.isdir(phobosDir): - env.Append(DPATH = [phobosDir]) - - env['DINCPREFIX'] = '-I' - env['DINCSUFFIX'] = '' - env['DVERPREFIX'] = '-version=' - env['DVERSUFFIX'] = '' - env['DDEBUGPREFIX'] = '-debug=' - env['DDEBUGSUFFIX'] = '' - env['DFLAGPREFIX'] = '-' - env['DFLAGSUFFIX'] = '' - env['DFILESUFFIX'] = '.d' - - # Need to use the Digital Mars linker/lib on windows. - # *nix can just use GNU link. - if env['PLATFORM'] == 'win32': - env['DLINK'] = '$DC' - env['DLINKCOM'] = '$DLINK -of$TARGET $SOURCES $DFLAGS $DLINKFLAGS $_DLINKLIBFLAGS' - env['DLIB'] = 'lib' - env['DLIBCOM'] = '$DLIB $_DLIBFLAGS -c $TARGET $SOURCES $_DLINKLIBFLAGS' - - env['_DLINKLIBFLAGS'] = '$( ${_concat(DLIBLINKPREFIX, LIBS, DLIBLINKSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['_DLIBFLAGS'] = '$( ${_concat(DLIBFLAGPREFIX, DLIBFLAGS, DLIBFLAGSUFFIX, __env__)} $)' - env['DLINKFLAGS'] = [] - env['DLIBLINKPREFIX'] = '' - env['DLIBLINKSUFFIX'] = '.lib' - env['DLIBFLAGPREFIX'] = '-' - env['DLIBFLAGSUFFIX'] = '' - env['DLINKFLAGPREFIX'] = '-' - env['DLINKFLAGSUFFIX'] = '' - - SCons.Tool.createStaticLibBuilder(env) - - # Basically, we hijack the link and ar builders with our own. - # these builders check for the presence of D source, and swap out - # the system's defaults for the Digital Mars tools. If there's no D - # source, then we silently return the previous settings. - linkcom = env.get('LINKCOM') - try: - env['SMART_LINKCOM'] = smart_link[linkcom] - except KeyError: - def _smartLink(source, target, env, for_signature, - defaultLinker=linkcom): - if isD(source): - # XXX I'm not sure how to add a $DLINKCOMSTR variable - # so that it works with this _smartLink() logic, - # and I don't have a D compiler/linker to try it out, - # so we'll leave it alone for now. - return '$DLINKCOM' - else: - return defaultLinker - env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink - - arcom = env.get('ARCOM') - try: - env['SMART_ARCOM'] = smart_lib[arcom] - except KeyError: - def _smartLib(source, target, env, for_signature, - defaultLib=arcom): - if isD(source): - # XXX I'm not sure how to add a $DLIBCOMSTR variable - # so that it works with this _smartLib() logic, and - # I don't have a D compiler/archiver to try it out, - # so we'll leave it alone for now. - return '$DLIBCOM' - else: - return defaultLib - env['SMART_ARCOM'] = smart_lib[arcom] = _smartLib - - # It is worth noting that the final space in these strings is - # absolutely pivotal. SCons sees these as actions and not generators - # if it is not there. (very bad) - env['ARCOM'] = '$SMART_ARCOM ' - env['LINKCOM'] = '$SMART_LINKCOM ' - else: # assuming linux - linkcom = env.get('LINKCOM') - try: - env['SMART_LINKCOM'] = smart_link[linkcom] - except KeyError: - def _smartLink(source, target, env, for_signature, - defaultLinker=linkcom, dc=dc): - if isD(source): - try: - libs = env['LIBS'] - except KeyError: - libs = [] - if 'phobos' not in libs and 'gphobos' not in libs: - if dc is 'dmd': - env.Append(LIBS = ['phobos']) - elif dc is 'gdmd': - env.Append(LIBS = ['gphobos']) - if 'pthread' not in libs: - env.Append(LIBS = ['pthread']) - if 'm' not in libs: - env.Append(LIBS = ['m']) - return defaultLinker - env['SMART_LINKCOM'] = smart_link[linkcom] = _smartLink - - env['LINKCOM'] = '$SMART_LINKCOM ' - -def exists(env): - return env.Detect(['dmd', 'gdmd']) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/dvi.py b/share/scons-local-1.3.0/SCons/Tool/dvi.py deleted file mode 100644 index ce91cca7feb44494d3eded4d82bcce8c1826f619..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/dvi.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.dvi - -Common DVI Builder definition for various other Tool modules that use it. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/dvi.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Builder -import SCons.Tool - -DVIBuilder = None - -def generate(env): - try: - env['BUILDERS']['DVI'] - except KeyError: - global DVIBuilder - - if DVIBuilder is None: - # The suffix is hard-coded to '.dvi', not configurable via a - # construction variable like $DVISUFFIX, because the output - # file name is hard-coded within TeX. - DVIBuilder = SCons.Builder.Builder(action = {}, - source_scanner = SCons.Tool.LaTeXScanner, - suffix = '.dvi', - emitter = {}, - source_ext_match = None) - - env['BUILDERS']['DVI'] = DVIBuilder - -def exists(env): - # This only puts a skeleton Builder in place, so if someone - # references this Tool directly, it's always "available." - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/dvipdf.py b/share/scons-local-1.3.0/SCons/Tool/dvipdf.py deleted file mode 100644 index cf6909d54b0d428c32671ca61da9823fc91ec676..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/dvipdf.py +++ /dev/null @@ -1,125 +0,0 @@ -"""SCons.Tool.dvipdf - -Tool-specific initialization for dvipdf. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/dvipdf.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Defaults -import SCons.Tool.pdf -import SCons.Tool.tex -import SCons.Util - -_null = SCons.Scanner.LaTeX._null - -def DviPdfPsFunction(XXXDviAction, target = None, source= None, env=None): - """A builder for DVI files that sets the TEXPICTS environment - variable before running dvi2ps or dvipdf.""" - - try: - abspath = source[0].attributes.path - except AttributeError : - abspath = '' - - saved_env = SCons.Scanner.LaTeX.modify_env_var(env, 'TEXPICTS', abspath) - - result = XXXDviAction(target, source, env) - - if saved_env is _null: - try: - del env['ENV']['TEXPICTS'] - except KeyError: - pass # was never set - else: - env['ENV']['TEXPICTS'] = saved_env - - return result - -def DviPdfFunction(target = None, source= None, env=None): - result = DviPdfPsFunction(PDFAction,target,source,env) - return result - -def DviPdfStrFunction(target = None, source= None, env=None): - """A strfunction for dvipdf that returns the appropriate - command string for the no_exec options.""" - if env.GetOption("no_exec"): - result = env.subst('$DVIPDFCOM',0,target,source) - else: - result = '' - return result - -PDFAction = None -DVIPDFAction = None - -def PDFEmitter(target, source, env): - """Strips any .aux or .log files from the input source list. - These are created by the TeX Builder that in all likelihood was - used to generate the .dvi file we're using as input, and we only - care about the .dvi file. - """ - def strip_suffixes(n): - return not SCons.Util.splitext(str(n))[1] in ['.aux', '.log'] - source = filter(strip_suffixes, source) - return (target, source) - -def generate(env): - """Add Builders and construction variables for dvipdf to an Environment.""" - global PDFAction - if PDFAction is None: - PDFAction = SCons.Action.Action('$DVIPDFCOM', '$DVIPDFCOMSTR') - - global DVIPDFAction - if DVIPDFAction is None: - DVIPDFAction = SCons.Action.Action(DviPdfFunction, strfunction = DviPdfStrFunction) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.dvi', DVIPDFAction) - bld.add_emitter('.dvi', PDFEmitter) - - env['DVIPDF'] = 'dvipdf' - env['DVIPDFFLAGS'] = SCons.Util.CLVar('') - env['DVIPDFCOM'] = 'cd ${TARGET.dir} && $DVIPDF $DVIPDFFLAGS ${SOURCE.file} ${TARGET.file}' - - # Deprecated synonym. - env['PDFCOM'] = ['$DVIPDFCOM'] - -def exists(env): - return env.Detect('dvipdf') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/dvips.py b/share/scons-local-1.3.0/SCons/Tool/dvips.py deleted file mode 100644 index be8a5fedb5cd5a3e6afcacc461d97e7c39e874e7..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/dvips.py +++ /dev/null @@ -1,94 +0,0 @@ -"""SCons.Tool.dvips - -Tool-specific initialization for dvips. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/dvips.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Builder -import SCons.Tool.dvipdf -import SCons.Util - -def DviPsFunction(target = None, source= None, env=None): - result = SCons.Tool.dvipdf.DviPdfPsFunction(PSAction,target,source,env) - return result - -def DviPsStrFunction(target = None, source= None, env=None): - """A strfunction for dvipdf that returns the appropriate - command string for the no_exec options.""" - if env.GetOption("no_exec"): - result = env.subst('$PSCOM',0,target,source) - else: - result = '' - return result - -PSAction = None -DVIPSAction = None -PSBuilder = None - -def generate(env): - """Add Builders and construction variables for dvips to an Environment.""" - global PSAction - if PSAction is None: - PSAction = SCons.Action.Action('$PSCOM', '$PSCOMSTR') - - global DVIPSAction - if DVIPSAction is None: - DVIPSAction = SCons.Action.Action(DviPsFunction, strfunction = DviPsStrFunction) - - global PSBuilder - if PSBuilder is None: - PSBuilder = SCons.Builder.Builder(action = PSAction, - prefix = '$PSPREFIX', - suffix = '$PSSUFFIX', - src_suffix = '.dvi', - src_builder = 'DVI', - single_source=True) - - env['BUILDERS']['PostScript'] = PSBuilder - - env['DVIPS'] = 'dvips' - env['DVIPSFLAGS'] = SCons.Util.CLVar('') - # I'm not quite sure I got the directories and filenames right for variant_dir - # We need to be in the correct directory for the sake of latex \includegraphics eps included files. - env['PSCOM'] = 'cd ${TARGET.dir} && $DVIPS $DVIPSFLAGS -o ${TARGET.file} ${SOURCE.file}' - env['PSPREFIX'] = '' - env['PSSUFFIX'] = '.ps' - -def exists(env): - return env.Detect('dvips') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/f77.py b/share/scons-local-1.3.0/SCons/Tool/f77.py deleted file mode 100644 index 17e7b6ec7d4007c5bc65a53189623f7aeb9b3f42..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/f77.py +++ /dev/null @@ -1,62 +0,0 @@ -"""engine.SCons.Tool.f77 - -Tool-specific initialization for the generic Posix f77 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/f77.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env - -compilers = ['f77'] - -def generate(env): - add_all_to_env(env) - add_f77_to_env(env) - - fcomp = env.Detect(compilers) or 'f77' - env['F77'] = fcomp - env['SHF77'] = fcomp - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = fcomp - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/f90.py b/share/scons-local-1.3.0/SCons/Tool/f90.py deleted file mode 100644 index 8db58249ff9025769a2a2e85dae6ecad804db3b5..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/f90.py +++ /dev/null @@ -1,62 +0,0 @@ -"""engine.SCons.Tool.f90 - -Tool-specific initialization for the generic Posix f90 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/f90.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f90_to_env - -compilers = ['f90'] - -def generate(env): - add_all_to_env(env) - add_f90_to_env(env) - - fc = env.Detect(compilers) or 'f90' - env['F90'] = fc - env['SHF90'] = fc - - env['FORTRAN'] = fc - env['SHFORTRAN'] = fc - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/f95.py b/share/scons-local-1.3.0/SCons/Tool/f95.py deleted file mode 100644 index fc00566bd1247419a8125caf2dff3d7b2d07e54c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/f95.py +++ /dev/null @@ -1,63 +0,0 @@ -"""engine.SCons.Tool.f95 - -Tool-specific initialization for the generic Posix f95 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/f95.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Tool -import SCons.Util -import fortran -from SCons.Tool.FortranCommon import add_all_to_env, add_f95_to_env - -compilers = ['f95'] - -def generate(env): - add_all_to_env(env) - add_f95_to_env(env) - - fcomp = env.Detect(compilers) or 'f95' - env['F95'] = fcomp - env['SHF95'] = fcomp - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = fcomp - - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/filesystem.py b/share/scons-local-1.3.0/SCons/Tool/filesystem.py deleted file mode 100644 index c01539059c2f1284ef31e12cf7bc456dd44eb733..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/filesystem.py +++ /dev/null @@ -1,98 +0,0 @@ -"""SCons.Tool.filesystem - -Tool-specific initialization for the filesystem tools. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/filesystem.py 4720 2010/03/24 03:14:11 jars" - -import SCons -from SCons.Tool.install import copyFunc - -copyToBuilder, copyAsBuilder = None, None - -def copyto_emitter(target, source, env): - """ changes the path of the source to be under the target (which - are assumed to be directories. - """ - n_target = [] - - for t in target: - n_target = n_target + map( lambda s, t=t: t.File( str( s ) ), source ) - - return (n_target, source) - -def copy_action_func(target, source, env): - assert( len(target) == len(source) ), "\ntarget: %s\nsource: %s" %(map(str, target),map(str, source)) - - for t, s in zip(target, source): - if copyFunc(t.get_path(), s.get_path(), env): - return 1 - - return 0 - -def copy_action_str(target, source, env): - return env.subst_target_source(env['COPYSTR'], 0, target, source) - -copy_action = SCons.Action.Action( copy_action_func, copy_action_str ) - -def generate(env): - try: - env['BUILDERS']['CopyTo'] - env['BUILDERS']['CopyAs'] - except KeyError, e: - global copyToBuilder - if copyToBuilder is None: - copyToBuilder = SCons.Builder.Builder( - action = copy_action, - target_factory = env.fs.Dir, - source_factory = env.fs.Entry, - multi = 1, - emitter = [ copyto_emitter, ] ) - - global copyAsBuilder - if copyAsBuilder is None: - copyAsBuilder = SCons.Builder.Builder( - action = copy_action, - target_factory = env.fs.Entry, - source_factory = env.fs.Entry ) - - env['BUILDERS']['CopyTo'] = copyToBuilder - env['BUILDERS']['CopyAs'] = copyAsBuilder - - env['COPYSTR'] = 'Copy file(s): "$SOURCES" to "$TARGETS"' - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/fortran.py b/share/scons-local-1.3.0/SCons/Tool/fortran.py deleted file mode 100644 index fea2660a09ea4aa19d882f1cea9bba54dea52f86..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/fortran.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.fortran - -Tool-specific initialization for a generic Posix f77/f90 Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/fortran.py 4720 2010/03/24 03:14:11 jars" - -import re -import string - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.Fortran -import SCons.Tool -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_fortran_to_env - -compilers = ['f95', 'f90', 'f77'] - -def generate(env): - add_all_to_env(env) - add_fortran_to_env(env) - - fc = env.Detect(compilers) or 'f77' - env['SHFORTRAN'] = fc - env['FORTRAN'] = fc - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/g++.py b/share/scons-local-1.3.0/SCons/Tool/g++.py deleted file mode 100644 index 019939a2e45b7cbcb2d229f3e648a1e35d030b48..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/g++.py +++ /dev/null @@ -1,90 +0,0 @@ -"""SCons.Tool.g++ - -Tool-specific initialization for g++. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/g++.py 4720 2010/03/24 03:14:11 jars" - -import os.path -import re -import subprocess - -import SCons.Tool -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -compilers = ['g++'] - -def generate(env): - """Add Builders and construction variables for g++ to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - cplusplus.generate(env) - - env['CXX'] = env.Detect(compilers) - - # platform specific settings - if env['PLATFORM'] == 'aix': - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS -mminimal-toc') - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - elif env['PLATFORM'] == 'hpux': - env['SHOBJSUFFIX'] = '.pic.o' - elif env['PLATFORM'] == 'sunos': - env['SHOBJSUFFIX'] = '.pic.o' - # determine compiler version - if env['CXX']: - #pipe = SCons.Action._subproc(env, [env['CXX'], '-dumpversion'], - pipe = SCons.Action._subproc(env, [env['CXX'], '--version'], - stdin = 'devnull', - stderr = 'devnull', - stdout = subprocess.PIPE) - if pipe.wait() != 0: return - # -dumpversion was added in GCC 3.0. As long as we're supporting - # GCC versions older than that, we should use --version and a - # regular expression. - #line = pipe.stdout.read().strip() - #if line: - # env['CXXVERSION'] = line - line = pipe.stdout.readline() - match = re.search(r'[0-9]+(\.[0-9]+)+', line) - if match: - env['CXXVERSION'] = match.group(0) - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/g77.py b/share/scons-local-1.3.0/SCons/Tool/g77.py deleted file mode 100644 index 3b50b6d558133f18dfb924f3fb28d321308af93c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/g77.py +++ /dev/null @@ -1,73 +0,0 @@ -"""engine.SCons.Tool.g77 - -Tool-specific initialization for g77. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/g77.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Util -from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env - -compilers = ['g77', 'f77'] - -def generate(env): - """Add Builders and construction variables for g77 to an Environment.""" - add_all_to_env(env) - add_f77_to_env(env) - - fcomp = env.Detect(compilers) or 'g77' - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS') - env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS') - else: - env['SHFORTRANFLAGS'] = SCons.Util.CLVar('$FORTRANFLAGS -fPIC') - env['SHF77FLAGS'] = SCons.Util.CLVar('$F77FLAGS -fPIC') - - env['FORTRAN'] = fcomp - env['SHFORTRAN'] = '$FORTRAN' - - env['F77'] = fcomp - env['SHF77'] = '$F77' - - env['INCFORTRANPREFIX'] = "-I" - env['INCFORTRANSUFFIX'] = "" - - env['INCF77PREFIX'] = "-I" - env['INCF77SUFFIX'] = "" - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/gas.py b/share/scons-local-1.3.0/SCons/Tool/gas.py deleted file mode 100644 index 52255ab55e83b163683eddfe6400d4b124c3878d..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/gas.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.gas - -Tool-specific initialization for as, the Gnu assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gas.py 4720 2010/03/24 03:14:11 jars" - -as_module = __import__('as', globals(), locals(), []) - -assemblers = ['as', 'gas'] - -def generate(env): - """Add Builders and construction variables for as to an Environment.""" - as_module.generate(env) - - env['AS'] = env.Detect(assemblers) or 'as' - -def exists(env): - return env.Detect(assemblers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/gcc.py b/share/scons-local-1.3.0/SCons/Tool/gcc.py deleted file mode 100644 index 59948548b60fca6b69c630d434a04a112f6646b3..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/gcc.py +++ /dev/null @@ -1,80 +0,0 @@ -"""SCons.Tool.gcc - -Tool-specific initialization for gcc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gcc.py 4720 2010/03/24 03:14:11 jars" - -import cc -import os -import re -import subprocess - -import SCons.Util - -compilers = ['gcc', 'cc'] - -def generate(env): - """Add Builders and construction variables for gcc to an Environment.""" - cc.generate(env) - - env['CC'] = env.Detect(compilers) or 'gcc' - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - else: - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS -fPIC') - # determine compiler version - if env['CC']: - #pipe = SCons.Action._subproc(env, [env['CC'], '-dumpversion'], - pipe = SCons.Action._subproc(env, [env['CC'], '--version'], - stdin = 'devnull', - stderr = 'devnull', - stdout = subprocess.PIPE) - if pipe.wait() != 0: return - # -dumpversion was added in GCC 3.0. As long as we're supporting - # GCC versions older than that, we should use --version and a - # regular expression. - #line = pipe.stdout.read().strip() - #if line: - # env['CCVERSION'] = line - line = pipe.stdout.readline() - match = re.search(r'[0-9]+(\.[0-9]+)+', line) - if match: - env['CCVERSION'] = match.group(0) - -def exists(env): - return env.Detect(compilers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/gfortran.py b/share/scons-local-1.3.0/SCons/Tool/gfortran.py deleted file mode 100644 index 863e82a7d9158fdd2ad89a246d0a852132ac455c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/gfortran.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.gfortran - -Tool-specific initialization for gfortran, the GNU Fortran 95/Fortran -2003 compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gfortran.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Util - -import fortran - -def generate(env): - """Add Builders and construction variables for gfortran to an - Environment.""" - fortran.generate(env) - - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - env['%s' % dialect] = 'gfortran' - env['SH%s' % dialect] = '$%s' % dialect - if env['PLATFORM'] in ['cygwin', 'win32']: - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS' % dialect) - else: - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect) - - env['INC%sPREFIX' % dialect] = "-I" - env['INC%sSUFFIX' % dialect] = "" - -def exists(env): - return env.Detect('gfortran') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/gnulink.py b/share/scons-local-1.3.0/SCons/Tool/gnulink.py deleted file mode 100644 index 71071f1c1ac332cea6fb7322665b1901401e425b..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/gnulink.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.gnulink - -Tool-specific initialization for the gnu linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gnulink.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Util - -import link - -linkers = ['g++', 'gcc'] - -def generate(env): - """Add Builders and construction variables for gnulink to an Environment.""" - link.generate(env) - - if env['PLATFORM'] == 'hpux': - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC') - - # __RPATH is set to $_RPATH in the platform specification if that - # platform supports it. - env.Append(LINKFLAGS=['$__RPATH']) - env['RPATHPREFIX'] = '-Wl,-rpath=' - env['RPATHSUFFIX'] = '' - env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}' - -def exists(env): - return env.Detect(linkers) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/gs.py b/share/scons-local-1.3.0/SCons/Tool/gs.py deleted file mode 100644 index 0e6deefa49e62f36ca03521509ca6b0ec6a2b211..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/gs.py +++ /dev/null @@ -1,81 +0,0 @@ -"""SCons.Tool.gs - -Tool-specific initialization for Ghostscript. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/gs.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Platform -import SCons.Util - -# Ghostscript goes by different names on different platforms... -platform = SCons.Platform.platform_default() - -if platform == 'os2': - gs = 'gsos2' -elif platform == 'win32': - gs = 'gswin32c' -else: - gs = 'gs' - -GhostscriptAction = None - -def generate(env): - """Add Builders and construction variables for Ghostscript to an - Environment.""" - - global GhostscriptAction - if GhostscriptAction is None: - GhostscriptAction = SCons.Action.Action('$GSCOM', '$GSCOMSTR') - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['PDF'] - bld.add_action('.ps', GhostscriptAction) - - env['GS'] = gs - env['GSFLAGS'] = SCons.Util.CLVar('-dNOPAUSE -dBATCH -sDEVICE=pdfwrite') - env['GSCOM'] = '$GS $GSFLAGS -sOutputFile=$TARGET $SOURCES' - - -def exists(env): - if env.has_key('PS2PDF'): - return env.Detect(env['PS2PDF']) - else: - return env.Detect(gs) or SCons.Util.WhereIs(gs) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/hpc++.py b/share/scons-local-1.3.0/SCons/Tool/hpc++.py deleted file mode 100644 index 28d766faba313ea0617da9f1a63106e390afd02c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/hpc++.py +++ /dev/null @@ -1,85 +0,0 @@ -"""SCons.Tool.hpc++ - -Tool-specific initialization for c++ on HP/UX. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/hpc++.py 4720 2010/03/24 03:14:11 jars" - -import os.path -import string - -import SCons.Util - -cplusplus = __import__('c++', globals(), locals(), []) - -acc = None - -# search for the acc compiler and linker front end - -try: - dirs = os.listdir('/opt') -except (IOError, OSError): - # Not being able to read the directory because it doesn't exist - # (IOError) or isn't readable (OSError) is okay. - dirs = [] - -for dir in dirs: - cc = '/opt/' + dir + '/bin/aCC' - if os.path.exists(cc): - acc = cc - break - - -def generate(env): - """Add Builders and construction variables for g++ to an Environment.""" - cplusplus.generate(env) - - if acc: - env['CXX'] = acc or 'aCC' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') - # determine version of aCC - line = os.popen(acc + ' -V 2>&1').readline().rstrip() - if string.find(line, 'aCC: HP ANSI C++') == 0: - env['CXXVERSION'] = string.split(line)[-1] - - if env['PLATFORM'] == 'cygwin': - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - else: - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS +Z') - -def exists(env): - return acc - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/hpcc.py b/share/scons-local-1.3.0/SCons/Tool/hpcc.py deleted file mode 100644 index f2ab04f37d275014a59abbd4e39bfe049cd09d2c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/hpcc.py +++ /dev/null @@ -1,53 +0,0 @@ -"""SCons.Tool.hpcc - -Tool-specific initialization for HP aCC and cc. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/hpcc.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Util - -import cc - -def generate(env): - """Add Builders and construction variables for aCC & cc to an Environment.""" - cc.generate(env) - - env['CXX'] = 'aCC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS +Z') - -def exists(env): - return env.Detect('aCC') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/hplink.py b/share/scons-local-1.3.0/SCons/Tool/hplink.py deleted file mode 100644 index f6eff451d44b755ae69224d35ceab16e3da90b2d..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/hplink.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.Tool.hplink - -Tool-specific initialization for the HP linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/hplink.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path - -import SCons.Util - -import link - -ccLinker = None - -# search for the acc compiler and linker front end - -try: - dirs = os.listdir('/opt') -except (IOError, OSError): - # Not being able to read the directory because it doesn't exist - # (IOError) or isn't readable (OSError) is okay. - dirs = [] - -for dir in dirs: - linker = '/opt/' + dir + '/bin/aCC' - if os.path.exists(linker): - ccLinker = linker - break - -def generate(env): - """ - Add Builders and construction variables for Visual Age linker to - an Environment. - """ - link.generate(env) - - env['LINKFLAGS'] = SCons.Util.CLVar('-Wl,+s -Wl,+vnocompatwarnings') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -b') - env['SHLIBSUFFIX'] = '.sl' - -def exists(env): - return ccLinker - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/icc.py b/share/scons-local-1.3.0/SCons/Tool/icc.py deleted file mode 100644 index 0d4e617b13b8ecfab092da7adf7cb9f6fd03b766..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/icc.py +++ /dev/null @@ -1,59 +0,0 @@ -"""engine.SCons.Tool.icc - -Tool-specific initialization for the OS/2 icc compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/icc.py 4720 2010/03/24 03:14:11 jars" - -import cc - -def generate(env): - """Add Builders and construction variables for the OS/2 to an Environment.""" - cc.generate(env) - - env['CC'] = 'icc' - env['CCCOM'] = '$CC $CFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET' - env['CXXCOM'] = '$CXX $CXXFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Fo$TARGET' - env['CPPDEFPREFIX'] = '/D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '/I' - env['INCSUFFIX'] = '' - env['CFILESUFFIX'] = '.c' - env['CXXFILESUFFIX'] = '.cc' - -def exists(env): - return env.Detect('icc') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/icl.py b/share/scons-local-1.3.0/SCons/Tool/icl.py deleted file mode 100644 index ce9815651dd836d8d940bfde17f0253cca7c7001..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/icl.py +++ /dev/null @@ -1,52 +0,0 @@ -"""engine.SCons.Tool.icl - -Tool-specific initialization for the Intel C/C++ compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/icl.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Tool.intelc - -# This has been completely superceded by intelc.py, which can -# handle both Windows and Linux versions. - -def generate(*args, **kw): - """Add Builders and construction variables for icl to an Environment.""" - return apply(SCons.Tool.intelc.generate, args, kw) - -def exists(*args, **kw): - return apply(SCons.Tool.intelc.exists, args, kw) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/ifl.py b/share/scons-local-1.3.0/SCons/Tool/ifl.py deleted file mode 100644 index 93dc977cb0bc9eb8967b8c0cc7c3b662930a058f..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/ifl.py +++ /dev/null @@ -1,72 +0,0 @@ -"""SCons.Tool.ifl - -Tool-specific initialization for the Intel Fortran compiler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ifl.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env - -def generate(env): - """Add Builders and construction variables for ifl to an Environment.""" - fscan = FortranScan("FORTRANPATH") - SCons.Tool.SourceFileScanner.add_scanner('.i', fscan) - SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan) - - if not env.has_key('FORTRANFILESUFFIXES'): - env['FORTRANFILESUFFIXES'] = ['.i'] - else: - env['FORTRANFILESUFFIXES'].append('.i') - - if not env.has_key('F90FILESUFFIXES'): - env['F90FILESUFFIXES'] = ['.i90'] - else: - env['F90FILESUFFIXES'].append('.i90') - - add_all_to_env(env) - - env['FORTRAN'] = 'ifl' - env['SHFORTRAN'] = '$FORTRAN' - env['FORTRANCOM'] = '$FORTRAN $FORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['FORTRANPPCOM'] = '$FORTRAN $FORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['SHFORTRANCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - env['SHFORTRANPPCOM'] = '$SHFORTRAN $SHFORTRANFLAGS $CPPFLAGS $_CPPDEFFLAGS $_FORTRANINCFLAGS /c $SOURCES /Fo$TARGET' - -def exists(env): - return env.Detect('ifl') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/ifort.py b/share/scons-local-1.3.0/SCons/Tool/ifort.py deleted file mode 100644 index 047afba9ae1edefd579730dc556596787dfc6d5d..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/ifort.py +++ /dev/null @@ -1,90 +0,0 @@ -"""SCons.Tool.ifort - -Tool-specific initialization for newer versions of the Intel Fortran Compiler -for Linux/Windows (and possibly Mac OS X). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ifort.py 4720 2010/03/24 03:14:11 jars" - -import string - -import SCons.Defaults -from SCons.Scanner.Fortran import FortranScan -from FortranCommon import add_all_to_env - -def generate(env): - """Add Builders and construction variables for ifort to an Environment.""" - # ifort supports Fortran 90 and Fortran 95 - # Additionally, ifort recognizes more file extensions. - fscan = FortranScan("FORTRANPATH") - SCons.Tool.SourceFileScanner.add_scanner('.i', fscan) - SCons.Tool.SourceFileScanner.add_scanner('.i90', fscan) - - if not env.has_key('FORTRANFILESUFFIXES'): - env['FORTRANFILESUFFIXES'] = ['.i'] - else: - env['FORTRANFILESUFFIXES'].append('.i') - - if not env.has_key('F90FILESUFFIXES'): - env['F90FILESUFFIXES'] = ['.i90'] - else: - env['F90FILESUFFIXES'].append('.i90') - - add_all_to_env(env) - - fc = 'ifort' - - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - env['%s' % dialect] = fc - env['SH%s' % dialect] = '$%s' % dialect - if env['PLATFORM'] == 'posix': - env['SH%sFLAGS' % dialect] = SCons.Util.CLVar('$%sFLAGS -fPIC' % dialect) - - if env['PLATFORM'] == 'win32': - # On Windows, the ifort compiler specifies the object on the - # command line with -object:, not -o. Massage the necessary - # command-line construction variables. - for dialect in ['F77', 'F90', 'FORTRAN', 'F95']: - for var in ['%sCOM' % dialect, '%sPPCOM' % dialect, - 'SH%sCOM' % dialect, 'SH%sPPCOM' % dialect]: - env[var] = string.replace(env[var], '-o $TARGET', '-object:$TARGET') - env['FORTRANMODDIRPREFIX'] = "/module:" - else: - env['FORTRANMODDIRPREFIX'] = "-module " - -def exists(env): - return env.Detect('ifort') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/ilink.py b/share/scons-local-1.3.0/SCons/Tool/ilink.py deleted file mode 100644 index 4d8395f8c4d76f8cc88c1f1d33d995d22ebc5c8b..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/ilink.py +++ /dev/null @@ -1,59 +0,0 @@ -"""SCons.Tool.ilink - -Tool-specific initialization for the OS/2 ilink linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ilink.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -def generate(env): - """Add Builders and construction variables for ilink to an Environment.""" - SCons.Tool.createProgBuilder(env) - - env['LINK'] = 'ilink' - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK $LINKFLAGS /O:$TARGET $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBDIRPREFIX']='/LIBPATH:' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - -def exists(env): - return env.Detect('ilink') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/ilink32.py b/share/scons-local-1.3.0/SCons/Tool/ilink32.py deleted file mode 100644 index 17651932ae0ed7318689b437576e1d1f175e9f0f..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/ilink32.py +++ /dev/null @@ -1,60 +0,0 @@ -"""SCons.Tool.ilink32 - -XXX - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ilink32.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Tool -import SCons.Tool.bcc32 -import SCons.Util - -def generate(env): - """Add Builders and construction variables for Borland ilink to an - Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['LINK'] = '$CC' - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK -q $LINKFLAGS -e$TARGET $SOURCES $LIBS' - env['LIBDIRPREFIX']='' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - -def exists(env): - # Uses bcc32 to do linking as it generally knows where the standard - # LIBS are and set up the linking correctly - return SCons.Tool.bcc32.findIt('bcc32', env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/install.py b/share/scons-local-1.3.0/SCons/Tool/install.py deleted file mode 100644 index 0d7b9d5ff356cc74f746d987926a09616c239117..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/install.py +++ /dev/null @@ -1,229 +0,0 @@ -"""SCons.Tool.install - -Tool-specific initialization for the install tool. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/install.py 4720 2010/03/24 03:14:11 jars" - -import os -import shutil -import stat - -import SCons.Action -from SCons.Util import make_path_relative - -# -# We keep track of *all* installed files. -_INSTALLED_FILES = [] -_UNIQUE_INSTALLED_FILES = None - -# -# Functions doing the actual work of the Install Builder. -# -def copyFunc(dest, source, env): - """Install a source file or directory into a destination by copying, - (including copying permission/mode bits).""" - - if os.path.isdir(source): - if os.path.exists(dest): - if not os.path.isdir(dest): - raise SCons.Errors.UserError, "cannot overwrite non-directory `%s' with a directory `%s'" % (str(dest), str(source)) - else: - parent = os.path.split(dest)[0] - if not os.path.exists(parent): - os.makedirs(parent) - shutil.copytree(source, dest) - else: - shutil.copy2(source, dest) - st = os.stat(source) - os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) - - return 0 - -def installFunc(target, source, env): - """Install a source file into a target using the function specified - as the INSTALL construction variable.""" - try: - install = env['INSTALL'] - except KeyError: - raise SCons.Errors.UserError('Missing INSTALL construction variable.') - - assert len(target)==len(source), \ - "Installing source %s into target %s: target and source lists must have same length."%(map(str, source), map(str, target)) - for t,s in zip(target,source): - if install(t.get_path(),s.get_path(),env): - return 1 - - return 0 - -def stringFunc(target, source, env): - installstr = env.get('INSTALLSTR') - if installstr: - return env.subst_target_source(installstr, 0, target, source) - target = str(target[0]) - source = str(source[0]) - if os.path.isdir(source): - type = 'directory' - else: - type = 'file' - return 'Install %s: "%s" as "%s"' % (type, source, target) - -# -# Emitter functions -# -def add_targets_to_INSTALLED_FILES(target, source, env): - """ an emitter that adds all target files to the list stored in the - _INSTALLED_FILES global variable. This way all installed files of one - scons call will be collected. - """ - global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES - _INSTALLED_FILES.extend(target) - _UNIQUE_INSTALLED_FILES = None - return (target, source) - -class DESTDIR_factory: - """ a node factory, where all files will be relative to the dir supplied - in the constructor. - """ - def __init__(self, env, dir): - self.env = env - self.dir = env.arg2nodes( dir, env.fs.Dir )[0] - - def Entry(self, name): - name = make_path_relative(name) - return self.dir.Entry(name) - - def Dir(self, name): - name = make_path_relative(name) - return self.dir.Dir(name) - -# -# The Builder Definition -# -install_action = SCons.Action.Action(installFunc, stringFunc) -installas_action = SCons.Action.Action(installFunc, stringFunc) - -BaseInstallBuilder = None - -def InstallBuilderWrapper(env, target=None, source=None, dir=None, **kw): - if target and dir: - import SCons.Errors - raise SCons.Errors.UserError, "Both target and dir defined for Install(), only one may be defined." - if not dir: - dir=target - - import SCons.Script - install_sandbox = SCons.Script.GetOption('install_sandbox') - if install_sandbox: - target_factory = DESTDIR_factory(env, install_sandbox) - else: - target_factory = env.fs - - try: - dnodes = env.arg2nodes(dir, target_factory.Dir) - except TypeError: - raise SCons.Errors.UserError, "Target `%s' of Install() is a file, but should be a directory. Perhaps you have the Install() arguments backwards?" % str(dir) - sources = env.arg2nodes(source, env.fs.Entry) - tgt = [] - for dnode in dnodes: - for src in sources: - # Prepend './' so the lookup doesn't interpret an initial - # '#' on the file name portion as meaning the Node should - # be relative to the top-level SConstruct directory. - target = env.fs.Entry('.'+os.sep+src.name, dnode) - #tgt.extend(BaseInstallBuilder(env, target, src, **kw)) - tgt.extend(apply(BaseInstallBuilder, (env, target, src), kw)) - return tgt - -def InstallAsBuilderWrapper(env, target=None, source=None, **kw): - result = [] - for src, tgt in map(lambda x, y: (x, y), source, target): - #result.extend(BaseInstallBuilder(env, tgt, src, **kw)) - result.extend(apply(BaseInstallBuilder, (env, tgt, src), kw)) - return result - -added = None - -def generate(env): - - from SCons.Script import AddOption, GetOption - global added - if not added: - added = 1 - AddOption('--install-sandbox', - dest='install_sandbox', - type="string", - action="store", - help='A directory under which all installed files will be placed.') - - global BaseInstallBuilder - if BaseInstallBuilder is None: - install_sandbox = GetOption('install_sandbox') - if install_sandbox: - target_factory = DESTDIR_factory(env, install_sandbox) - else: - target_factory = env.fs - - BaseInstallBuilder = SCons.Builder.Builder( - action = install_action, - target_factory = target_factory.Entry, - source_factory = env.fs.Entry, - multi = 1, - emitter = [ add_targets_to_INSTALLED_FILES, ], - name = 'InstallBuilder') - - env['BUILDERS']['_InternalInstall'] = InstallBuilderWrapper - env['BUILDERS']['_InternalInstallAs'] = InstallAsBuilderWrapper - - # We'd like to initialize this doing something like the following, - # but there isn't yet support for a ${SOURCE.type} expansion that - # will print "file" or "directory" depending on what's being - # installed. For now we punt by not initializing it, and letting - # the stringFunc() that we put in the action fall back to the - # hand-crafted default string if it's not set. - # - #try: - # env['INSTALLSTR'] - #except KeyError: - # env['INSTALLSTR'] = 'Install ${SOURCE.type}: "$SOURCES" as "$TARGETS"' - - try: - env['INSTALL'] - except KeyError: - env['INSTALL'] = copyFunc - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/intelc.py b/share/scons-local-1.3.0/SCons/Tool/intelc.py deleted file mode 100644 index a9b23d37087d4ccfa6e2307970c2ff7dade92357..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/intelc.py +++ /dev/null @@ -1,490 +0,0 @@ -"""SCons.Tool.icl - -Tool-specific initialization for the Intel C/C++ compiler. -Supports Linux and Windows compilers, v7 and up. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/intelc.py 4720 2010/03/24 03:14:11 jars" - -import math, sys, os.path, glob, string, re - -is_windows = sys.platform == 'win32' -is_win64 = is_windows and (os.environ['PROCESSOR_ARCHITECTURE'] == 'AMD64' or - (os.environ.has_key('PROCESSOR_ARCHITEW6432') and - os.environ['PROCESSOR_ARCHITEW6432'] == 'AMD64')) -is_linux = sys.platform == 'linux2' -is_mac = sys.platform == 'darwin' - -if is_windows: - import SCons.Tool.msvc -elif is_linux: - import SCons.Tool.gcc -elif is_mac: - import SCons.Tool.gcc -import SCons.Util -import SCons.Warnings - -# Exceptions for this tool -class IntelCError(SCons.Errors.InternalError): - pass -class MissingRegistryError(IntelCError): # missing registry entry - pass -class MissingDirError(IntelCError): # dir not found - pass -class NoRegistryModuleError(IntelCError): # can't read registry at all - pass - -def uniquify(s): - """Return a sequence containing only one copy of each unique element from input sequence s. - Does not preserve order. - Input sequence must be hashable (i.e. must be usable as a dictionary key).""" - u = {} - for x in s: - u[x] = 1 - return u.keys() - -def linux_ver_normalize(vstr): - """Normalize a Linux compiler version number. - Intel changed from "80" to "9.0" in 2005, so we assume if the number - is greater than 60 it's an old-style number and otherwise new-style. - Always returns an old-style float like 80 or 90 for compatibility with Windows. - Shades of Y2K!""" - # Check for version number like 9.1.026: return 91.026 - m = re.match(r'([0-9]+)\.([0-9]+)\.([0-9]+)', vstr) - if m: - vmaj,vmin,build = m.groups() - return float(vmaj) * 10 + float(vmin) + float(build) / 1000.; - else: - f = float(vstr) - if is_windows: - return f - else: - if f < 60: return f * 10.0 - else: return f - -def check_abi(abi): - """Check for valid ABI (application binary interface) name, - and map into canonical one""" - if not abi: - return None - abi = abi.lower() - # valid_abis maps input name to canonical name - if is_windows: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'ia64' : 'ia64', - 'em64t' : 'em64t', - 'amd64' : 'em64t'} - if is_linux: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'x86_64' : 'x86_64', - 'em64t' : 'x86_64', - 'amd64' : 'x86_64'} - if is_mac: - valid_abis = {'ia32' : 'ia32', - 'x86' : 'ia32', - 'x86_64' : 'x86_64', - 'em64t' : 'x86_64'} - try: - abi = valid_abis[abi] - except KeyError: - raise SCons.Errors.UserError, \ - "Intel compiler: Invalid ABI %s, valid values are %s"% \ - (abi, valid_abis.keys()) - return abi - -def vercmp(a, b): - """Compare strings as floats, - but Intel changed Linux naming convention at 9.0""" - return cmp(linux_ver_normalize(b), linux_ver_normalize(a)) - -def get_version_from_list(v, vlist): - """See if we can match v (string) in vlist (list of strings) - Linux has to match in a fuzzy way.""" - if is_windows: - # Simple case, just find it in the list - if v in vlist: return v - else: return None - else: - # Fuzzy match: normalize version number first, but still return - # original non-normalized form. - fuzz = 0.001 - for vi in vlist: - if math.fabs(linux_ver_normalize(vi) - linux_ver_normalize(v)) < fuzz: - return vi - # Not found - return None - -def get_intel_registry_value(valuename, version=None, abi=None): - """ - Return a value from the Intel compiler registry tree. (Windows only) - """ - # Open the key: - if is_win64: - K = 'Software\\Wow6432Node\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper() - else: - K = 'Software\\Intel\\Compilers\\C++\\' + version + '\\'+abi.upper() - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K) - except SCons.Util.RegError: - raise MissingRegistryError, \ - "%s was not found in the registry, for Intel compiler version %s, abi='%s'"%(K, version,abi) - - # Get the value: - try: - v = SCons.Util.RegQueryValueEx(k, valuename)[0] - return v # or v.encode('iso-8859-1', 'replace') to remove unicode? - except SCons.Util.RegError: - raise MissingRegistryError, \ - "%s\\%s was not found in the registry."%(K, valuename) - - -def get_all_compiler_versions(): - """Returns a sorted list of strings, like "70" or "80" or "9.0" - with most recent compiler version first. - """ - versions=[] - if is_windows: - if is_win64: - keyname = 'Software\\WoW6432Node\\Intel\\Compilers\\C++' - else: - keyname = 'Software\\Intel\\Compilers\\C++' - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, - keyname) - except WindowsError: - return [] - i = 0 - versions = [] - try: - while i < 100: - subkey = SCons.Util.RegEnumKey(k, i) # raises EnvironmentError - # Check that this refers to an existing dir. - # This is not 100% perfect but should catch common - # installation issues like when the compiler was installed - # and then the install directory deleted or moved (rather - # than uninstalling properly), so the registry values - # are still there. - ok = False - for try_abi in ('IA32', 'IA32e', 'IA64', 'EM64T'): - try: - d = get_intel_registry_value('ProductDir', subkey, try_abi) - except MissingRegistryError: - continue # not found in reg, keep going - if os.path.exists(d): ok = True - if ok: - versions.append(subkey) - else: - try: - # Registry points to nonexistent dir. Ignore this - # version. - value = get_intel_registry_value('ProductDir', subkey, 'IA32') - except MissingRegistryError, e: - - # Registry key is left dangling (potentially - # after uninstalling). - - print \ - "scons: *** Ignoring the registry key for the Intel compiler version %s.\n" \ - "scons: *** It seems that the compiler was uninstalled and that the registry\n" \ - "scons: *** was not cleaned up properly.\n" % subkey - else: - print "scons: *** Ignoring "+str(value) - - i = i + 1 - except EnvironmentError: - # no more subkeys - pass - elif is_linux: - for d in glob.glob('/opt/intel_cc_*'): - # Typical dir here is /opt/intel_cc_80. - m = re.search(r'cc_(.*)$', d) - if m: - versions.append(m.group(1)) - for d in glob.glob('/opt/intel/cc*/*'): - # Typical dir here is /opt/intel/cc/9.0 for IA32, - # /opt/intel/cce/9.0 for EMT64 (AMD64) - m = re.search(r'([0-9.]+)$', d) - if m: - versions.append(m.group(1)) - elif is_mac: - for d in glob.glob('/opt/intel/cc*/*'): - # Typical dir here is /opt/intel/cc/9.0 for IA32, - # /opt/intel/cce/9.0 for EMT64 (AMD64) - m = re.search(r'([0-9.]+)$', d) - if m: - versions.append(m.group(1)) - versions = uniquify(versions) # remove dups - versions.sort(vercmp) - return versions - -def get_intel_compiler_top(version, abi): - """ - Return the main path to the top-level dir of the Intel compiler, - using the given version. - The compiler will be in /bin/icl.exe (icc on linux), - the include dir is /include, etc. - """ - - if is_windows: - if not SCons.Util.can_read_reg: - raise NoRegistryModuleError, "No Windows registry module was found" - top = get_intel_registry_value('ProductDir', version, abi) - # pre-11, icl was in Bin. 11 and later, it's in Bin/ apparently. - if not os.path.exists(os.path.join(top, "Bin", "icl.exe")) \ - and not os.path.exists(os.path.join(top, "Bin", abi, "icl.exe")): - raise MissingDirError, \ - "Can't find Intel compiler in %s"%(top) - elif is_mac or is_linux: - # first dir is new (>=9.0) style, second is old (8.0) style. - dirs=('/opt/intel/cc/%s', '/opt/intel_cc_%s') - if abi == 'x86_64': - dirs=('/opt/intel/cce/%s',) # 'e' stands for 'em64t', aka x86_64 aka amd64 - top=None - for d in dirs: - if os.path.exists(os.path.join(d%version, "bin", "icc")): - top = d%version - break - if not top: - raise MissingDirError, \ - "Can't find version %s Intel compiler in %s (abi='%s')"%(version,top, abi) - return top - - -def generate(env, version=None, abi=None, topdir=None, verbose=0): - """Add Builders and construction variables for Intel C/C++ compiler - to an Environment. - args: - version: (string) compiler version to use, like "80" - abi: (string) 'win32' or whatever Itanium version wants - topdir: (string) compiler top dir, like - "c:\Program Files\Intel\Compiler70" - If topdir is used, version and abi are ignored. - verbose: (int) if >0, prints compiler version used. - """ - if not (is_mac or is_linux or is_windows): - # can't handle this platform - return - - if is_windows: - SCons.Tool.msvc.generate(env) - elif is_linux: - SCons.Tool.gcc.generate(env) - elif is_mac: - SCons.Tool.gcc.generate(env) - - # if version is unspecified, use latest - vlist = get_all_compiler_versions() - if not version: - if vlist: - version = vlist[0] - else: - # User may have specified '90' but we need to get actual dirname '9.0'. - # get_version_from_list does that mapping. - v = get_version_from_list(version, vlist) - if not v: - raise SCons.Errors.UserError, \ - "Invalid Intel compiler version %s: "%version + \ - "installed versions are %s"%(', '.join(vlist)) - version = v - - # if abi is unspecified, use ia32 - # alternatives are ia64 for Itanium, or amd64 or em64t or x86_64 (all synonyms here) - abi = check_abi(abi) - if abi is None: - if is_mac or is_linux: - # Check if we are on 64-bit linux, default to 64 then. - uname_m = os.uname()[4] - if uname_m == 'x86_64': - abi = 'x86_64' - else: - abi = 'ia32' - else: - if is_win64: - abi = 'em64t' - else: - abi = 'ia32' - - if version and not topdir: - try: - topdir = get_intel_compiler_top(version, abi) - except (SCons.Util.RegError, IntelCError): - topdir = None - - if not topdir: - # Normally this is an error, but it might not be if the compiler is - # on $PATH and the user is importing their env. - class ICLTopDirWarning(SCons.Warnings.Warning): - pass - if (is_mac or is_linux) and not env.Detect('icc') or \ - is_windows and not env.Detect('icl'): - - SCons.Warnings.enableWarningClass(ICLTopDirWarning) - SCons.Warnings.warn(ICLTopDirWarning, - "Failed to find Intel compiler for version='%s', abi='%s'"% - (str(version), str(abi))) - else: - # should be cleaned up to say what this other version is - # since in this case we have some other Intel compiler installed - SCons.Warnings.enableWarningClass(ICLTopDirWarning) - SCons.Warnings.warn(ICLTopDirWarning, - "Can't find Intel compiler top dir for version='%s', abi='%s'"% - (str(version), str(abi))) - - if topdir: - if verbose: - print "Intel C compiler: using version %s (%g), abi %s, in '%s'"%\ - (repr(version), linux_ver_normalize(version),abi,topdir) - if is_linux: - # Show the actual compiler version by running the compiler. - os.system('%s/bin/icc --version'%topdir) - if is_mac: - # Show the actual compiler version by running the compiler. - os.system('%s/bin/icc --version'%topdir) - - env['INTEL_C_COMPILER_TOP'] = topdir - if is_linux: - paths={'INCLUDE' : 'include', - 'LIB' : 'lib', - 'PATH' : 'bin', - 'LD_LIBRARY_PATH' : 'lib'} - for p in paths.keys(): - env.PrependENVPath(p, os.path.join(topdir, paths[p])) - if is_mac: - paths={'INCLUDE' : 'include', - 'LIB' : 'lib', - 'PATH' : 'bin', - 'LD_LIBRARY_PATH' : 'lib'} - for p in paths.keys(): - env.PrependENVPath(p, os.path.join(topdir, paths[p])) - if is_windows: - # env key reg valname default subdir of top - paths=(('INCLUDE', 'IncludeDir', 'Include'), - ('LIB' , 'LibDir', 'Lib'), - ('PATH' , 'BinDir', 'Bin')) - # We are supposed to ignore version if topdir is set, so set - # it to the emptry string if it's not already set. - if version is None: - version = '' - # Each path has a registry entry, use that or default to subdir - for p in paths: - try: - path=get_intel_registry_value(p[1], version, abi) - # These paths may have $(ICInstallDir) - # which needs to be substituted with the topdir. - path=path.replace('$(ICInstallDir)', topdir + os.sep) - except IntelCError: - # Couldn't get it from registry: use default subdir of topdir - env.PrependENVPath(p[0], os.path.join(topdir, p[2])) - else: - env.PrependENVPath(p[0], string.split(path, os.pathsep)) - # print "ICL %s: %s, final=%s"%(p[0], path, str(env['ENV'][p[0]])) - - if is_windows: - env['CC'] = 'icl' - env['CXX'] = 'icl' - env['LINK'] = 'xilink' - else: - env['CC'] = 'icc' - env['CXX'] = 'icpc' - # Don't reset LINK here; - # use smart_link which should already be here from link.py. - #env['LINK'] = '$CC' - env['AR'] = 'xiar' - env['LD'] = 'xild' # not used by default - - # This is not the exact (detailed) compiler version, - # just the major version as determined above or specified - # by the user. It is a float like 80 or 90, in normalized form for Linux - # (i.e. even for Linux 9.0 compiler, still returns 90 rather than 9.0) - if version: - env['INTEL_C_COMPILER_VERSION']=linux_ver_normalize(version) - - if is_windows: - # Look for license file dir - # in system environment, registry, and default location. - envlicdir = os.environ.get("INTEL_LICENSE_FILE", '') - K = ('SOFTWARE\Intel\Licenses') - try: - k = SCons.Util.RegOpenKeyEx(SCons.Util.HKEY_LOCAL_MACHINE, K) - reglicdir = SCons.Util.RegQueryValueEx(k, "w_cpp")[0] - except (AttributeError, SCons.Util.RegError): - reglicdir = "" - defaultlicdir = r'C:\Program Files\Common Files\Intel\Licenses' - - licdir = None - for ld in [envlicdir, reglicdir]: - # If the string contains an '@', then assume it's a network - # license (port@system) and good by definition. - if ld and (string.find(ld, '@') != -1 or os.path.exists(ld)): - licdir = ld - break - if not licdir: - licdir = defaultlicdir - if not os.path.exists(licdir): - class ICLLicenseDirWarning(SCons.Warnings.Warning): - pass - SCons.Warnings.enableWarningClass(ICLLicenseDirWarning) - SCons.Warnings.warn(ICLLicenseDirWarning, - "Intel license dir was not found." - " Tried using the INTEL_LICENSE_FILE environment variable (%s), the registry (%s) and the default path (%s)." - " Using the default path as a last resort." - % (envlicdir, reglicdir, defaultlicdir)) - env['ENV']['INTEL_LICENSE_FILE'] = licdir - -def exists(env): - if not (is_mac or is_linux or is_windows): - # can't handle this platform - return 0 - - try: - versions = get_all_compiler_versions() - except (SCons.Util.RegError, IntelCError): - versions = None - detected = versions is not None and len(versions) > 0 - if not detected: - # try env.Detect, maybe that will work - if is_windows: - return env.Detect('icl') - elif is_linux: - return env.Detect('icc') - elif is_mac: - return env.Detect('icc') - return detected - -# end of file - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/ipkg.py b/share/scons-local-1.3.0/SCons/Tool/ipkg.py deleted file mode 100644 index 3e8d223536e41248ada3bf335b2b441e1c1f206a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/ipkg.py +++ /dev/null @@ -1,71 +0,0 @@ -"""SCons.Tool.ipkg - -Tool-specific initialization for ipkg. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -The ipkg tool calls the ipkg-build. Its only argument should be the -packages fake_root. -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/ipkg.py 4720 2010/03/24 03:14:11 jars" - -import os -import string - -import SCons.Builder - -def generate(env): - """Add Builders and construction variables for ipkg to an Environment.""" - try: - bld = env['BUILDERS']['Ipkg'] - except KeyError: - bld = SCons.Builder.Builder( action = '$IPKGCOM', - suffix = '$IPKGSUFFIX', - source_scanner = None, - target_scanner = None) - env['BUILDERS']['Ipkg'] = bld - - env['IPKG'] = 'ipkg-build' - env['IPKGCOM'] = '$IPKG $IPKGFLAGS ${SOURCE}' - # TODO(1.5) - #env['IPKGUSER'] = os.popen('id -un').read().strip() - #env['IPKGGROUP'] = os.popen('id -gn').read().strip() - env['IPKGUSER'] = string.strip(os.popen('id -un').read()) - env['IPKGGROUP'] = string.strip(os.popen('id -gn').read()) - env['IPKGFLAGS'] = SCons.Util.CLVar('-o $IPKGUSER -g $IPKGGROUP') - env['IPKGSUFFIX'] = '.ipk' - -def exists(env): - return env.Detect('ipkg-build') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/jar.py b/share/scons-local-1.3.0/SCons/Tool/jar.py deleted file mode 100644 index 2aaab963ee21a971401bd4e925b397599be15ad2..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/jar.py +++ /dev/null @@ -1,110 +0,0 @@ -"""SCons.Tool.jar - -Tool-specific initialization for jar. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/jar.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Subst -import SCons.Util - -def jarSources(target, source, env, for_signature): - """Only include sources that are not a manifest file.""" - try: - env['JARCHDIR'] - except KeyError: - jarchdir_set = False - else: - jarchdir_set = True - jarchdir = env.subst('$JARCHDIR', target=target, source=source) - if jarchdir: - jarchdir = env.fs.Dir(jarchdir) - result = [] - for src in source: - contents = src.get_text_contents() - if contents[:16] != "Manifest-Version": - if jarchdir_set: - _chdir = jarchdir - else: - try: - _chdir = src.attributes.java_classdir - except AttributeError: - _chdir = None - if _chdir: - # If we are changing the dir with -C, then sources should - # be relative to that directory. - src = SCons.Subst.Literal(src.get_path(_chdir)) - result.append('-C') - result.append(_chdir) - result.append(src) - return result - -def jarManifest(target, source, env, for_signature): - """Look in sources for a manifest file, if any.""" - for src in source: - contents = src.get_text_contents() - if contents[:16] == "Manifest-Version": - return src - return '' - -def jarFlags(target, source, env, for_signature): - """If we have a manifest, make sure that the 'm' - flag is specified.""" - jarflags = env.subst('$JARFLAGS', target=target, source=source) - for src in source: - contents = src.get_text_contents() - if contents[:16] == "Manifest-Version": - if not 'm' in jarflags: - return jarflags + 'm' - break - return jarflags - -def generate(env): - """Add Builders and construction variables for jar to an Environment.""" - SCons.Tool.CreateJarBuilder(env) - - env['JAR'] = 'jar' - env['JARFLAGS'] = SCons.Util.CLVar('cf') - env['_JARFLAGS'] = jarFlags - env['_JARMANIFEST'] = jarManifest - env['_JARSOURCES'] = jarSources - env['_JARCOM'] = '$JAR $_JARFLAGS $TARGET $_JARMANIFEST $_JARSOURCES' - env['JARCOM'] = "${TEMPFILE('$_JARCOM')}" - env['JARSUFFIX'] = '.jar' - -def exists(env): - return env.Detect('jar') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/javac.py b/share/scons-local-1.3.0/SCons/Tool/javac.py deleted file mode 100644 index df237a83d92043fb8910467064c87b5915d9f906..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/javac.py +++ /dev/null @@ -1,234 +0,0 @@ -"""SCons.Tool.javac - -Tool-specific initialization for javac. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/javac.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path -import string - -import SCons.Action -import SCons.Builder -from SCons.Node.FS import _my_normcase -from SCons.Tool.JavaCommon import parse_java_file -import SCons.Util - -def classname(path): - """Turn a string (path name) into a Java class name.""" - return string.replace(os.path.normpath(path), os.sep, '.') - -def emit_java_classes(target, source, env): - """Create and return lists of source java files - and their corresponding target class files. - """ - java_suffix = env.get('JAVASUFFIX', '.java') - class_suffix = env.get('JAVACLASSSUFFIX', '.class') - - target[0].must_be_same(SCons.Node.FS.Dir) - classdir = target[0] - - s = source[0].rentry().disambiguate() - if isinstance(s, SCons.Node.FS.File): - sourcedir = s.dir.rdir() - elif isinstance(s, SCons.Node.FS.Dir): - sourcedir = s.rdir() - else: - raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % s.__class__) - - slist = [] - js = _my_normcase(java_suffix) - find_java = lambda n, js=js, ljs=len(js): _my_normcase(n[-ljs:]) == js - for entry in source: - entry = entry.rentry().disambiguate() - if isinstance(entry, SCons.Node.FS.File): - slist.append(entry) - elif isinstance(entry, SCons.Node.FS.Dir): - result = SCons.Util.OrderedDict() - def visit(arg, dirname, names, fj=find_java, dirnode=entry.rdir()): - java_files = filter(fj, names) - # The on-disk entries come back in arbitrary order. Sort - # them so our target and source lists are determinate. - java_files.sort() - mydir = dirnode.Dir(dirname) - java_paths = map(lambda f, d=mydir: d.File(f), java_files) - for jp in java_paths: - arg[jp] = True - - os.path.walk(entry.rdir().get_abspath(), visit, result) - entry.walk(visit, result) - - slist.extend(result.keys()) - else: - raise SCons.Errors.UserError("Java source must be File or Dir, not '%s'" % entry.__class__) - - version = env.get('JAVAVERSION', '1.4') - full_tlist = [] - for f in slist: - tlist = [] - source_file_based = True - pkg_dir = None - if not f.is_derived(): - pkg_dir, classes = parse_java_file(f.rfile().get_abspath(), version) - if classes: - source_file_based = False - if pkg_dir: - d = target[0].Dir(pkg_dir) - p = pkg_dir + os.sep - else: - d = target[0] - p = '' - for c in classes: - t = d.File(c + class_suffix) - t.attributes.java_classdir = classdir - t.attributes.java_sourcedir = sourcedir - t.attributes.java_classname = classname(p + c) - tlist.append(t) - - if source_file_based: - base = f.name[:-len(java_suffix)] - if pkg_dir: - t = target[0].Dir(pkg_dir).File(base + class_suffix) - else: - t = target[0].File(base + class_suffix) - t.attributes.java_classdir = classdir - t.attributes.java_sourcedir = f.dir - t.attributes.java_classname = classname(base) - tlist.append(t) - - for t in tlist: - t.set_specific_source([f]) - - full_tlist.extend(tlist) - - return full_tlist, slist - -JavaAction = SCons.Action.Action('$JAVACCOM', '$JAVACCOMSTR') - -JavaBuilder = SCons.Builder.Builder(action = JavaAction, - emitter = emit_java_classes, - target_factory = SCons.Node.FS.Entry, - source_factory = SCons.Node.FS.Entry) - -class pathopt: - """ - Callable object for generating javac-style path options from - a construction variable (e.g. -classpath, -sourcepath). - """ - def __init__(self, opt, var, default=None): - self.opt = opt - self.var = var - self.default = default - - def __call__(self, target, source, env, for_signature): - path = env[self.var] - if path and not SCons.Util.is_List(path): - path = [path] - if self.default: - path = path + [ env[self.default] ] - if path: - return [self.opt, string.join(path, os.pathsep)] - #return self.opt + " " + string.join(path, os.pathsep) - else: - return [] - #return "" - -def Java(env, target, source, *args, **kw): - """ - A pseudo-Builder wrapper around the separate JavaClass{File,Dir} - Builders. - """ - if not SCons.Util.is_List(target): - target = [target] - if not SCons.Util.is_List(source): - source = [source] - - # Pad the target list with repetitions of the last element in the - # list so we have a target for every source element. - target = target + ([target[-1]] * (len(source) - len(target))) - - java_suffix = env.subst('$JAVASUFFIX') - result = [] - - for t, s in zip(target, source): - if isinstance(s, SCons.Node.FS.Base): - if isinstance(s, SCons.Node.FS.File): - b = env.JavaClassFile - else: - b = env.JavaClassDir - else: - if os.path.isfile(s): - b = env.JavaClassFile - elif os.path.isdir(s): - b = env.JavaClassDir - elif s[-len(java_suffix):] == java_suffix: - b = env.JavaClassFile - else: - b = env.JavaClassDir - result.extend(apply(b, (t, s) + args, kw)) - - return result - -def generate(env): - """Add Builders and construction variables for javac to an Environment.""" - java_file = SCons.Tool.CreateJavaFileBuilder(env) - java_class = SCons.Tool.CreateJavaClassFileBuilder(env) - java_class_dir = SCons.Tool.CreateJavaClassDirBuilder(env) - java_class.add_emitter(None, emit_java_classes) - java_class.add_emitter(env.subst('$JAVASUFFIX'), emit_java_classes) - java_class_dir.emitter = emit_java_classes - - env.AddMethod(Java) - - env['JAVAC'] = 'javac' - env['JAVACFLAGS'] = SCons.Util.CLVar('') - env['JAVABOOTCLASSPATH'] = [] - env['JAVACLASSPATH'] = [] - env['JAVASOURCEPATH'] = [] - env['_javapathopt'] = pathopt - env['_JAVABOOTCLASSPATH'] = '${_javapathopt("-bootclasspath", "JAVABOOTCLASSPATH")} ' - env['_JAVACLASSPATH'] = '${_javapathopt("-classpath", "JAVACLASSPATH")} ' - env['_JAVASOURCEPATH'] = '${_javapathopt("-sourcepath", "JAVASOURCEPATH", "_JAVASOURCEPATHDEFAULT")} ' - env['_JAVASOURCEPATHDEFAULT'] = '${TARGET.attributes.java_sourcedir}' - env['_JAVACCOM'] = '$JAVAC $JAVACFLAGS $_JAVABOOTCLASSPATH $_JAVACLASSPATH -d ${TARGET.attributes.java_classdir} $_JAVASOURCEPATH $SOURCES' - env['JAVACCOM'] = "${TEMPFILE('$_JAVACCOM')}" - env['JAVACLASSSUFFIX'] = '.class' - env['JAVASUFFIX'] = '.java' - -def exists(env): - return 1 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/javah.py b/share/scons-local-1.3.0/SCons/Tool/javah.py deleted file mode 100644 index 6a4314c7558f15f45c6e3f9451d4ca5f3964bb24..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/javah.py +++ /dev/null @@ -1,138 +0,0 @@ -"""SCons.Tool.javah - -Tool-specific initialization for javah. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/javah.py 4720 2010/03/24 03:14:11 jars" - -import os.path -import string - -import SCons.Action -import SCons.Builder -import SCons.Node.FS -import SCons.Tool.javac -import SCons.Util - -def emit_java_headers(target, source, env): - """Create and return lists of Java stub header files that will - be created from a set of class files. - """ - class_suffix = env.get('JAVACLASSSUFFIX', '.class') - classdir = env.get('JAVACLASSDIR') - - if not classdir: - try: - s = source[0] - except IndexError: - classdir = '.' - else: - try: - classdir = s.attributes.java_classdir - except AttributeError: - classdir = '.' - classdir = env.Dir(classdir).rdir() - - if str(classdir) == '.': - c_ = None - else: - c_ = str(classdir) + os.sep - - slist = [] - for src in source: - try: - classname = src.attributes.java_classname - except AttributeError: - classname = str(src) - if c_ and classname[:len(c_)] == c_: - classname = classname[len(c_):] - if class_suffix and classname[-len(class_suffix):] == class_suffix: - classname = classname[:-len(class_suffix)] - classname = SCons.Tool.javac.classname(classname) - s = src.rfile() - s.attributes.java_classname = classname - slist.append(s) - - s = source[0].rfile() - if not hasattr(s.attributes, 'java_classdir'): - s.attributes.java_classdir = classdir - - if target[0].__class__ is SCons.Node.FS.File: - tlist = target - else: - if not isinstance(target[0], SCons.Node.FS.Dir): - target[0].__class__ = SCons.Node.FS.Dir - target[0]._morph() - tlist = [] - for s in source: - fname = string.replace(s.attributes.java_classname, '.', '_') + '.h' - t = target[0].File(fname) - t.attributes.java_lookupdir = target[0] - tlist.append(t) - - return tlist, source - -def JavaHOutFlagGenerator(target, source, env, for_signature): - try: - t = target[0] - except (AttributeError, IndexError, TypeError): - t = target - try: - return '-d ' + str(t.attributes.java_lookupdir) - except AttributeError: - return '-o ' + str(t) - -def getJavaHClassPath(env,target, source, for_signature): - path = "${SOURCE.attributes.java_classdir}" - if env.has_key('JAVACLASSPATH') and env['JAVACLASSPATH']: - path = SCons.Util.AppendPath(path, env['JAVACLASSPATH']) - return "-classpath %s" % (path) - -def generate(env): - """Add Builders and construction variables for javah to an Environment.""" - java_javah = SCons.Tool.CreateJavaHBuilder(env) - java_javah.emitter = emit_java_headers - - env['_JAVAHOUTFLAG'] = JavaHOutFlagGenerator - env['JAVAH'] = 'javah' - env['JAVAHFLAGS'] = SCons.Util.CLVar('') - env['_JAVAHCLASSPATH'] = getJavaHClassPath - env['JAVAHCOM'] = '$JAVAH $JAVAHFLAGS $_JAVAHOUTFLAG $_JAVAHCLASSPATH ${SOURCES.attributes.java_classname}' - env['JAVACLASSSUFFIX'] = '.class' - -def exists(env): - return env.Detect('javah') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/latex.py b/share/scons-local-1.3.0/SCons/Tool/latex.py deleted file mode 100644 index 56db43f7cd0f55ca7563ca79743471e77c9a996b..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/latex.py +++ /dev/null @@ -1,79 +0,0 @@ -"""SCons.Tool.latex - -Tool-specific initialization for LaTeX. -Generates .dvi files from .latex or .ltx files - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/latex.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Defaults -import SCons.Scanner.LaTeX -import SCons.Util -import SCons.Tool -import SCons.Tool.tex - -def LaTeXAuxFunction(target = None, source= None, env=None): - result = SCons.Tool.tex.InternalLaTeXAuxAction( SCons.Tool.tex.LaTeXAction, target, source, env ) - if result != 0: - print env['LATEX']," returned an error, check the log file" - return result - -LaTeXAuxAction = SCons.Action.Action(LaTeXAuxFunction, - strfunction=SCons.Tool.tex.TeXLaTeXStrFunction) - -def generate(env): - """Add Builders and construction variables for LaTeX to an Environment.""" - - env.AppendUnique(LATEXSUFFIXES=SCons.Tool.LaTeXSuffixes) - - import dvi - dvi.generate(env) - - import pdf - pdf.generate(env) - - bld = env['BUILDERS']['DVI'] - bld.add_action('.ltx', LaTeXAuxAction) - bld.add_action('.latex', LaTeXAuxAction) - bld.add_emitter('.ltx', SCons.Tool.tex.tex_eps_emitter) - bld.add_emitter('.latex', SCons.Tool.tex.tex_eps_emitter) - - SCons.Tool.tex.generate_common(env) - -def exists(env): - return env.Detect('latex') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/lex.py b/share/scons-local-1.3.0/SCons/Tool/lex.py deleted file mode 100644 index 920ff5fad775894d6ca901bb6741f753d8915f21..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/lex.py +++ /dev/null @@ -1,99 +0,0 @@ -"""SCons.Tool.lex - -Tool-specific initialization for lex. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/lex.py 4720 2010/03/24 03:14:11 jars" - -import os.path - -import string - -import SCons.Action -import SCons.Tool -import SCons.Util - -LexAction = SCons.Action.Action("$LEXCOM", "$LEXCOMSTR") - -def lexEmitter(target, source, env): - sourceBase, sourceExt = os.path.splitext(SCons.Util.to_String(source[0])) - - if sourceExt == ".lm": # If using Objective-C - target = [sourceBase + ".m"] # the extension is ".m". - - # This emitter essentially tries to add to the target all extra - # files generated by flex. - - # Different options that are used to trigger the creation of extra files. - fileGenOptions = ["--header-file=", "--tables-file="] - - lexflags = env.subst("$LEXFLAGS", target=target, source=source) - for option in SCons.Util.CLVar(lexflags): - for fileGenOption in fileGenOptions: - l = len(fileGenOption) - if option[:l] == fileGenOption: - # A file generating option is present, so add the - # file name to the target list. - fileName = string.strip(option[l:]) - target.append(fileName) - return (target, source) - -def generate(env): - """Add Builders and construction variables for lex to an Environment.""" - c_file, cxx_file = SCons.Tool.createCFileBuilders(env) - - # C - c_file.add_action(".l", LexAction) - c_file.add_emitter(".l", lexEmitter) - - c_file.add_action(".lex", LexAction) - c_file.add_emitter(".lex", lexEmitter) - - # Objective-C - cxx_file.add_action(".lm", LexAction) - cxx_file.add_emitter(".lm", lexEmitter) - - # C++ - cxx_file.add_action(".ll", LexAction) - cxx_file.add_emitter(".ll", lexEmitter) - - env["LEX"] = env.Detect("flex") or "lex" - env["LEXFLAGS"] = SCons.Util.CLVar("") - env["LEXCOM"] = "$LEX $LEXFLAGS -t $SOURCES > $TARGET" - -def exists(env): - return env.Detect(["flex", "lex"]) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/link.py b/share/scons-local-1.3.0/SCons/Tool/link.py deleted file mode 100644 index 2b6ccec96db1d193ec8407b07c48457a6c73d524..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/link.py +++ /dev/null @@ -1,121 +0,0 @@ -"""SCons.Tool.link - -Tool-specific initialization for the generic Posix linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/link.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Tool -import SCons.Util -import SCons.Warnings - -from SCons.Tool.FortranCommon import isfortran - -cplusplus = __import__('c++', globals(), locals(), []) - -issued_mixed_link_warning = False - -def smart_link(source, target, env, for_signature): - has_cplusplus = cplusplus.iscplusplus(source) - has_fortran = isfortran(env, source) - if has_cplusplus and has_fortran: - global issued_mixed_link_warning - if not issued_mixed_link_warning: - msg = "Using $CXX to link Fortran and C++ code together.\n\t" + \ - "This may generate a buggy executable if the '%s'\n\t" + \ - "compiler does not know how to deal with Fortran runtimes." - SCons.Warnings.warn(SCons.Warnings.FortranCxxMixWarning, - msg % env.subst('$CXX')) - issued_mixed_link_warning = True - return '$CXX' - elif has_fortran: - return '$FORTRAN' - elif has_cplusplus: - return '$CXX' - return '$CC' - -def shlib_emitter(target, source, env): - for tgt in target: - tgt.attributes.shared = 1 - return (target, source) - -def generate(env): - """Add Builders and construction variables for gnulink to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - env['SHLINKCOM'] = '$SHLINK -o $TARGET $SHLINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - # don't set up the emitter, cause AppendUnique will generate a list - # starting with None :-( - env.Append(SHLIBEMITTER = [shlib_emitter]) - env['SMARTLINK'] = smart_link - env['LINK'] = "$SMARTLINK" - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '$LINK -o $TARGET $LINKFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - env['LIBDIRPREFIX']='-L' - env['LIBDIRSUFFIX']='' - env['_LIBFLAGS']='${_stripixes(LIBLINKPREFIX, LIBS, LIBLINKSUFFIX, LIBPREFIXES, LIBSUFFIXES, __env__)}' - env['LIBLINKPREFIX']='-l' - env['LIBLINKSUFFIX']='' - - if env['PLATFORM'] == 'hpux': - env['SHLIBSUFFIX'] = '.sl' - elif env['PLATFORM'] == 'aix': - env['SHLIBSUFFIX'] = '.a' - - # For most platforms, a loadable module is the same as a shared - # library. Platforms which are different can override these, but - # setting them the same means that LoadableModule works everywhere. - SCons.Tool.createLoadableModuleBuilder(env) - env['LDMODULE'] = '$SHLINK' - # don't set up the emitter, cause AppendUnique will generate a list - # starting with None :-( - env.Append(LDMODULEEMITTER='$SHLIBEMITTER') - env['LDMODULEPREFIX'] = '$SHLIBPREFIX' - env['LDMODULESUFFIX'] = '$SHLIBSUFFIX' - env['LDMODULEFLAGS'] = '$SHLINKFLAGS' - env['LDMODULECOM'] = '$LDMODULE -o $TARGET $LDMODULEFLAGS $SOURCES $_LIBDIRFLAGS $_LIBFLAGS' - - - -def exists(env): - # This module isn't really a Tool on its own, it's common logic for - # other linkers. - return None - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/linkloc.py b/share/scons-local-1.3.0/SCons/Tool/linkloc.py deleted file mode 100644 index abf29f48d93707386b08a353dbb2cb115c024602..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/linkloc.py +++ /dev/null @@ -1,112 +0,0 @@ -"""SCons.Tool.linkloc - -Tool specification for the LinkLoc linker for the Phar Lap ETS embedded -operating system. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/linkloc.py 4720 2010/03/24 03:14:11 jars" - -import os.path -import re - -import SCons.Action -import SCons.Defaults -import SCons.Errors -import SCons.Tool -import SCons.Util - -from SCons.Tool.MSCommon import msvs_exists, merge_default_version -from SCons.Tool.PharLapCommon import addPharLapPaths - -_re_linker_command = re.compile(r'(\s)@\s*([^\s]+)') - -def repl_linker_command(m): - # Replaces any linker command file directives (e.g. "@foo.lnk") with - # the actual contents of the file. - try: - f=open(m.group(2), "r") - return m.group(1) + f.read() - except IOError: - # the linker should return an error if it can't - # find the linker command file so we will remain quiet. - # However, we will replace the @ with a # so we will not continue - # to find it with recursive substitution - return m.group(1) + '#' + m.group(2) - -class LinklocGenerator: - def __init__(self, cmdline): - self.cmdline = cmdline - - def __call__(self, env, target, source, for_signature): - if for_signature: - # Expand the contents of any linker command files recursively - subs = 1 - strsub = env.subst(self.cmdline, target=target, source=source) - while subs: - strsub, subs = _re_linker_command.subn(repl_linker_command, strsub) - return strsub - else: - return "${TEMPFILE('" + self.cmdline + "')}" - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SUBST_CMD_FILE'] = LinklocGenerator - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS') - env['SHLINKCOM'] = '${SUBST_CMD_FILE("$SHLINK $SHLINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -dll $TARGET $SOURCES")}' - env['SHLIBEMITTER']= None - env['LINK'] = "linkloc" - env['LINKFLAGS'] = SCons.Util.CLVar('') - env['LINKCOM'] = '${SUBST_CMD_FILE("$LINK $LINKFLAGS $_LIBDIRFLAGS $_LIBFLAGS -exe $TARGET $SOURCES")}' - env['LIBDIRPREFIX']='-libpath ' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='-lib ' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - # Set-up ms tools paths for default version - merge_default_version(env) - - addPharLapPaths(env) - -def exists(env): - if msvs_exists(): - return env.Detect('linkloc') - else: - return 0 - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/m4.py b/share/scons-local-1.3.0/SCons/Tool/m4.py deleted file mode 100644 index 48935cf8037508b8029cf38dbac312e6f53b1b2b..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/m4.py +++ /dev/null @@ -1,63 +0,0 @@ -"""SCons.Tool.m4 - -Tool-specific initialization for m4. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/m4.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Action -import SCons.Builder -import SCons.Util - -def generate(env): - """Add Builders and construction variables for m4 to an Environment.""" - M4Action = SCons.Action.Action('$M4COM', '$M4COMSTR') - bld = SCons.Builder.Builder(action = M4Action, src_suffix = '.m4') - - env['BUILDERS']['M4'] = bld - - # .m4 files might include other files, and it would be pretty hard - # to write a scanner for it, so let's just cd to the dir of the m4 - # file and run from there. - # The src_suffix setup is like so: file.c.m4 -> file.c, - # file.cpp.m4 -> file.cpp etc. - env['M4'] = 'm4' - env['M4FLAGS'] = SCons.Util.CLVar('-E') - env['M4COM'] = 'cd ${SOURCE.rsrcdir} && $M4 $M4FLAGS < ${SOURCE.file} > ${TARGET.abspath}' - -def exists(env): - return env.Detect('m4') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/masm.py b/share/scons-local-1.3.0/SCons/Tool/masm.py deleted file mode 100644 index a4e91fc4296aadfdd0547ccf1482d4a197ca5285..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/masm.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.Tool.masm - -Tool-specific initialization for the Microsoft Assembler. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/masm.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Tool -import SCons.Util - -ASSuffixes = ['.s', '.asm', '.ASM'] -ASPPSuffixes = ['.spp', '.SPP', '.sx'] -if SCons.Util.case_sensitive_suffixes('.s', '.S'): - ASPPSuffixes.extend(['.S']) -else: - ASSuffixes.extend(['.S']) - -def generate(env): - """Add Builders and construction variables for masm to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - for suffix in ASSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASAction) - shared_obj.add_action(suffix, SCons.Defaults.ASAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - for suffix in ASPPSuffixes: - static_obj.add_action(suffix, SCons.Defaults.ASPPAction) - shared_obj.add_action(suffix, SCons.Defaults.ASPPAction) - static_obj.add_emitter(suffix, SCons.Defaults.StaticObjectEmitter) - shared_obj.add_emitter(suffix, SCons.Defaults.SharedObjectEmitter) - - env['AS'] = 'ml' - env['ASFLAGS'] = SCons.Util.CLVar('/nologo') - env['ASPPFLAGS'] = '$ASFLAGS' - env['ASCOM'] = '$AS $ASFLAGS /c /Fo$TARGET $SOURCES' - env['ASPPCOM'] = '$CC $ASPPFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c /Fo$TARGET $SOURCES' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - -def exists(env): - return env.Detect('ml') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/midl.py b/share/scons-local-1.3.0/SCons/Tool/midl.py deleted file mode 100644 index f1f4375ca9a5ec73bf868252828c610df85a371f..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/midl.py +++ /dev/null @@ -1,90 +0,0 @@ -"""SCons.Tool.midl - -Tool-specific initialization for midl (Microsoft IDL compiler). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/midl.py 4720 2010/03/24 03:14:11 jars" - -import string - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Scanner.IDL -import SCons.Util - -from MSCommon import msvc_exists - -def midl_emitter(target, source, env): - """Produces a list of outputs from the MIDL compiler""" - base, ext = SCons.Util.splitext(str(target[0])) - tlb = target[0] - incl = base + '.h' - interface = base + '_i.c' - t = [tlb, incl, interface] - - midlcom = env['MIDLCOM'] - - if string.find(midlcom, '/proxy') != -1: - proxy = base + '_p.c' - t.append(proxy) - if string.find(midlcom, '/dlldata') != -1: - dlldata = base + '_data.c' - t.append(dlldata) - - return (t,source) - -idl_scanner = SCons.Scanner.IDL.IDLScan() - -midl_action = SCons.Action.Action('$MIDLCOM', '$MIDLCOMSTR') - -midl_builder = SCons.Builder.Builder(action = midl_action, - src_suffix = '.idl', - suffix='.tlb', - emitter = midl_emitter, - source_scanner = idl_scanner) - -def generate(env): - """Add Builders and construction variables for midl to an Environment.""" - - env['MIDL'] = 'MIDL.EXE' - env['MIDLFLAGS'] = SCons.Util.CLVar('/nologo') - env['MIDLCOM'] = '$MIDL $MIDLFLAGS /tlb ${TARGETS[0]} /h ${TARGETS[1]} /iid ${TARGETS[2]} /proxy ${TARGETS[3]} /dlldata ${TARGETS[4]} $SOURCE 2> NUL' - env['BUILDERS']['TypeLibrary'] = midl_builder - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/mingw.py b/share/scons-local-1.3.0/SCons/Tool/mingw.py deleted file mode 100644 index e93f1adc6e9927db7947320e62f35a99b25f95ad..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/mingw.py +++ /dev/null @@ -1,159 +0,0 @@ -"""SCons.Tool.gcc - -Tool-specific initialization for MinGW (http://www.mingw.org/) - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mingw.py 4720 2010/03/24 03:14:11 jars" - -import os -import os.path -import string - -import SCons.Action -import SCons.Builder -import SCons.Defaults -import SCons.Tool -import SCons.Util - -# This is what we search for to find mingw: -key_program = 'mingw32-gcc' - -def find(env): - # First search in the SCons path and then the OS path: - return env.WhereIs(key_program) or SCons.Util.WhereIs(key_program) - -def shlib_generator(target, source, env, for_signature): - cmd = SCons.Util.CLVar(['$SHLINK', '$SHLINKFLAGS']) - - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - if dll: cmd.extend(['-o', dll]) - - cmd.extend(['$SOURCES', '$_LIBDIRFLAGS', '$_LIBFLAGS']) - - implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') - if implib: cmd.append('-Wl,--out-implib,'+implib.get_string(for_signature)) - - def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - insert_def = env.subst("$WINDOWS_INSERT_DEF") - if not insert_def in ['', '0', 0] and def_target: \ - cmd.append('-Wl,--output-def,'+def_target.get_string(for_signature)) - - return [cmd] - -def shlib_emitter(target, source, env): - dll = env.FindIxes(target, 'SHLIBPREFIX', 'SHLIBSUFFIX') - no_import_lib = env.get('no_import_lib', 0) - - if not dll: - raise SCons.Errors.UserError, "A shared library should have exactly one target with the suffix: %s" % env.subst("$SHLIBSUFFIX") - - if not no_import_lib and \ - not env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX'): - - # Append an import library to the list of targets. - target.append(env.ReplaceIxes(dll, - 'SHLIBPREFIX', 'SHLIBSUFFIX', - 'LIBPREFIX', 'LIBSUFFIX')) - - # Append a def file target if there isn't already a def file target - # or a def file source. There is no option to disable def file - # target emitting, because I can't figure out why someone would ever - # want to turn it off. - def_source = env.FindIxes(source, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - def_target = env.FindIxes(target, 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX') - if not def_source and not def_target: - target.append(env.ReplaceIxes(dll, - 'SHLIBPREFIX', 'SHLIBSUFFIX', - 'WINDOWSDEFPREFIX', 'WINDOWSDEFSUFFIX')) - - return (target, source) - - -shlib_action = SCons.Action.Action(shlib_generator, generator=1) - -res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR') - -res_builder = SCons.Builder.Builder(action=res_action, suffix='.o', - source_scanner=SCons.Tool.SourceFileScanner) -SCons.Tool.SourceFileScanner.add_scanner('.rc', SCons.Defaults.CScan) - -def generate(env): - mingw = find(env) - if mingw: - dir = os.path.dirname(mingw) - env.PrependENVPath('PATH', dir ) - - - # Most of mingw is the same as gcc and friends... - gnu_tools = ['gcc', 'g++', 'gnulink', 'ar', 'gas', 'm4'] - for tool in gnu_tools: - SCons.Tool.Tool(tool)(env) - - #... but a few things differ: - env['CC'] = 'gcc' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['CXX'] = 'g++' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared') - env['SHLINKCOM'] = shlib_action - env['LDMODULECOM'] = shlib_action - env.Append(SHLIBEMITTER = [shlib_emitter]) - env['AS'] = 'as' - - env['WIN32DEFPREFIX'] = '' - env['WIN32DEFSUFFIX'] = '.def' - env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}' - env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}' - - env['SHOBJSUFFIX'] = '.o' - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - - env['RC'] = 'windres' - env['RCFLAGS'] = SCons.Util.CLVar('') - env['RCINCFLAGS'] = '$( ${_concat(RCINCPREFIX, CPPPATH, RCINCSUFFIX, __env__, RDirs, TARGET, SOURCE)} $)' - env['RCINCPREFIX'] = '--include-dir ' - env['RCINCSUFFIX'] = '' - env['RCCOM'] = '$RC $_CPPDEFFLAGS $RCINCFLAGS ${RCINCPREFIX} ${SOURCE.dir} $RCFLAGS -i $SOURCE -o $TARGET' - env['BUILDERS']['RES'] = res_builder - - # Some setting from the platform also have to be overridden: - env['OBJSUFFIX'] = '.o' - env['LIBPREFIX'] = 'lib' - env['LIBSUFFIX'] = '.a' - -def exists(env): - return find(env) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/mslib.py b/share/scons-local-1.3.0/SCons/Tool/mslib.py deleted file mode 100644 index c568abd9a5144c376ee9a521d2878cb1c8ec12bd..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/mslib.py +++ /dev/null @@ -1,64 +0,0 @@ -"""SCons.Tool.mslib - -Tool-specific initialization for lib (MicroSoft library archiver). - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mslib.py 4720 2010/03/24 03:14:11 jars" - -import SCons.Defaults -import SCons.Tool -import SCons.Tool.msvs -import SCons.Tool.msvc -import SCons.Util - -from MSCommon import msvc_exists, msvc_setup_env_once - -def generate(env): - """Add Builders and construction variables for lib to an Environment.""" - SCons.Tool.createStaticLibBuilder(env) - - # Set-up ms tools paths - msvc_setup_env_once(env) - - env['AR'] = 'lib' - env['ARFLAGS'] = SCons.Util.CLVar('/nologo') - env['ARCOM'] = "${TEMPFILE('$AR $ARFLAGS /OUT:$TARGET $SOURCES')}" - env['LIBPREFIX'] = '' - env['LIBSUFFIX'] = '.lib' - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/mslink.py b/share/scons-local-1.3.0/SCons/Tool/mslink.py deleted file mode 100644 index 36ad2fe48470d57943cd4617425bcaa8c7394964..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/mslink.py +++ /dev/null @@ -1,266 +0,0 @@ -"""SCons.Tool.mslink - -Tool-specific initialization for the Microsoft linker. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mslink.py 4720 2010/03/24 03:14:11 jars" - -import os.path - -import SCons.Action -import SCons.Defaults -import SCons.Errors -import SCons.Platform.win32 -import SCons.Tool -import SCons.Tool.msvc -import SCons.Tool.msvs -import SCons.Util - -from MSCommon import msvc_setup_env_once, msvc_exists - -def pdbGenerator(env, target, source, for_signature): - try: - return ['/PDB:%s' % target[0].attributes.pdb, '/DEBUG'] - except (AttributeError, IndexError): - return None - -def _dllTargets(target, source, env, for_signature, paramtp): - listCmd = [] - dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp) - if dll: listCmd.append("/out:%s"%dll.get_string(for_signature)) - - implib = env.FindIxes(target, 'LIBPREFIX', 'LIBSUFFIX') - if implib: listCmd.append("/implib:%s"%implib.get_string(for_signature)) - - return listCmd - -def _dllSources(target, source, env, for_signature, paramtp): - listCmd = [] - - deffile = env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX") - for src in source: - # Check explicitly for a non-None deffile so that the __cmp__ - # method of the base SCons.Util.Proxy class used for some Node - # proxies doesn't try to use a non-existent __dict__ attribute. - if deffile and src == deffile: - # Treat this source as a .def file. - listCmd.append("/def:%s" % src.get_string(for_signature)) - else: - # Just treat it as a generic source file. - listCmd.append(src) - return listCmd - -def windowsShlinkTargets(target, source, env, for_signature): - return _dllTargets(target, source, env, for_signature, 'SHLIB') - -def windowsShlinkSources(target, source, env, for_signature): - return _dllSources(target, source, env, for_signature, 'SHLIB') - -def _windowsLdmodTargets(target, source, env, for_signature): - """Get targets for loadable modules.""" - return _dllTargets(target, source, env, for_signature, 'LDMODULE') - -def _windowsLdmodSources(target, source, env, for_signature): - """Get sources for loadable modules.""" - return _dllSources(target, source, env, for_signature, 'LDMODULE') - -def _dllEmitter(target, source, env, paramtp): - """Common implementation of dll emitter.""" - SCons.Tool.msvc.validate_vars(env) - - extratargets = [] - extrasources = [] - - dll = env.FindIxes(target, '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp) - no_import_lib = env.get('no_import_lib', 0) - - if not dll: - raise SCons.Errors.UserError, 'A shared library should have exactly one target with the suffix: %s' % env.subst('$%sSUFFIX' % paramtp) - - insert_def = env.subst("$WINDOWS_INSERT_DEF") - if not insert_def in ['', '0', 0] and \ - not env.FindIxes(source, "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX"): - - # append a def file to the list of sources - extrasources.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSDEFPREFIX", "WINDOWSDEFSUFFIX")) - - version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0')) - if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0): - # MSVC 8 automatically generates .manifest files that must be installed - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSSHLIBMANIFESTPREFIX", "WINDOWSSHLIBMANIFESTSUFFIX")) - - if env.has_key('PDB') and env['PDB']: - pdb = env.arg2nodes('$PDB', target=target, source=source)[0] - extratargets.append(pdb) - target[0].attributes.pdb = pdb - - if not no_import_lib and \ - not env.FindIxes(target, "LIBPREFIX", "LIBSUFFIX"): - # Append an import library to the list of targets. - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "LIBPREFIX", "LIBSUFFIX")) - # and .exp file is created if there are exports from a DLL - extratargets.append( - env.ReplaceIxes(dll, - '%sPREFIX' % paramtp, '%sSUFFIX' % paramtp, - "WINDOWSEXPPREFIX", "WINDOWSEXPSUFFIX")) - - return (target+extratargets, source+extrasources) - -def windowsLibEmitter(target, source, env): - return _dllEmitter(target, source, env, 'SHLIB') - -def ldmodEmitter(target, source, env): - """Emitter for loadable modules. - - Loadable modules are identical to shared libraries on Windows, but building - them is subject to different parameters (LDMODULE*). - """ - return _dllEmitter(target, source, env, 'LDMODULE') - -def prog_emitter(target, source, env): - SCons.Tool.msvc.validate_vars(env) - - extratargets = [] - - exe = env.FindIxes(target, "PROGPREFIX", "PROGSUFFIX") - if not exe: - raise SCons.Errors.UserError, "An executable should have exactly one target with the suffix: %s" % env.subst("$PROGSUFFIX") - - version_num, suite = SCons.Tool.msvs.msvs_parse_version(env.get('MSVS_VERSION', '6.0')) - if version_num >= 8.0 and env.get('WINDOWS_INSERT_MANIFEST', 0): - # MSVC 8 automatically generates .manifest files that have to be installed - extratargets.append( - env.ReplaceIxes(exe, - "PROGPREFIX", "PROGSUFFIX", - "WINDOWSPROGMANIFESTPREFIX", "WINDOWSPROGMANIFESTSUFFIX")) - - if env.has_key('PDB') and env['PDB']: - pdb = env.arg2nodes('$PDB', target=target, source=source)[0] - extratargets.append(pdb) - target[0].attributes.pdb = pdb - - return (target+extratargets,source) - -def RegServerFunc(target, source, env): - if env.has_key('register') and env['register']: - ret = regServerAction([target[0]], [source[0]], env) - if ret: - raise SCons.Errors.UserError, "Unable to register %s" % target[0] - else: - print "Registered %s sucessfully" % target[0] - return ret - return 0 - -regServerAction = SCons.Action.Action("$REGSVRCOM", "$REGSVRCOMSTR") -regServerCheck = SCons.Action.Action(RegServerFunc, None) -shlibLinkAction = SCons.Action.Action('${TEMPFILE("$SHLINK $SHLINKFLAGS $_SHLINK_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_SHLINK_SOURCES")}') -compositeShLinkAction = shlibLinkAction + regServerCheck -ldmodLinkAction = SCons.Action.Action('${TEMPFILE("$LDMODULE $LDMODULEFLAGS $_LDMODULE_TARGETS $_LIBDIRFLAGS $_LIBFLAGS $_PDB $_LDMODULE_SOURCES")}') -compositeLdmodAction = ldmodLinkAction + regServerCheck - -def generate(env): - """Add Builders and construction variables for ar to an Environment.""" - SCons.Tool.createSharedLibBuilder(env) - SCons.Tool.createProgBuilder(env) - - env['SHLINK'] = '$LINK' - env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS /dll') - env['_SHLINK_TARGETS'] = windowsShlinkTargets - env['_SHLINK_SOURCES'] = windowsShlinkSources - env['SHLINKCOM'] = compositeShLinkAction - env.Append(SHLIBEMITTER = [windowsLibEmitter]) - env['LINK'] = 'link' - env['LINKFLAGS'] = SCons.Util.CLVar('/nologo') - env['_PDB'] = pdbGenerator - env['LINKCOM'] = '${TEMPFILE("$LINK $LINKFLAGS /OUT:$TARGET.windows $_LIBDIRFLAGS $_LIBFLAGS $_PDB $SOURCES.windows")}' - env.Append(PROGEMITTER = [prog_emitter]) - env['LIBDIRPREFIX']='/LIBPATH:' - env['LIBDIRSUFFIX']='' - env['LIBLINKPREFIX']='' - env['LIBLINKSUFFIX']='$LIBSUFFIX' - - env['WIN32DEFPREFIX'] = '' - env['WIN32DEFSUFFIX'] = '.def' - env['WIN32_INSERT_DEF'] = 0 - env['WINDOWSDEFPREFIX'] = '${WIN32DEFPREFIX}' - env['WINDOWSDEFSUFFIX'] = '${WIN32DEFSUFFIX}' - env['WINDOWS_INSERT_DEF'] = '${WIN32_INSERT_DEF}' - - env['WIN32EXPPREFIX'] = '' - env['WIN32EXPSUFFIX'] = '.exp' - env['WINDOWSEXPPREFIX'] = '${WIN32EXPPREFIX}' - env['WINDOWSEXPSUFFIX'] = '${WIN32EXPSUFFIX}' - - env['WINDOWSSHLIBMANIFESTPREFIX'] = '' - env['WINDOWSSHLIBMANIFESTSUFFIX'] = '${SHLIBSUFFIX}.manifest' - env['WINDOWSPROGMANIFESTPREFIX'] = '' - env['WINDOWSPROGMANIFESTSUFFIX'] = '${PROGSUFFIX}.manifest' - - env['REGSVRACTION'] = regServerCheck - env['REGSVR'] = os.path.join(SCons.Platform.win32.get_system_root(),'System32','regsvr32') - env['REGSVRFLAGS'] = '/s ' - env['REGSVRCOM'] = '$REGSVR $REGSVRFLAGS ${TARGET.windows}' - - # Set-up ms tools paths - msvc_setup_env_once(env) - - - # Loadable modules are on Windows the same as shared libraries, but they - # are subject to different build parameters (LDMODULE* variables). - # Therefore LDMODULE* variables correspond as much as possible to - # SHLINK*/SHLIB* ones. - SCons.Tool.createLoadableModuleBuilder(env) - env['LDMODULE'] = '$SHLINK' - env['LDMODULEPREFIX'] = '$SHLIBPREFIX' - env['LDMODULESUFFIX'] = '$SHLIBSUFFIX' - env['LDMODULEFLAGS'] = '$SHLINKFLAGS' - env['_LDMODULE_TARGETS'] = _windowsLdmodTargets - env['_LDMODULE_SOURCES'] = _windowsLdmodSources - env['LDMODULEEMITTER'] = [ldmodEmitter] - env['LDMODULECOM'] = compositeLdmodAction - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/mssdk.py b/share/scons-local-1.3.0/SCons/Tool/mssdk.py deleted file mode 100644 index ed5bd5cb953b60e27699b633fc26ddc3517b826a..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/mssdk.py +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/mssdk.py 4720 2010/03/24 03:14:11 jars" - -"""engine.SCons.Tool.mssdk - -Tool-specific initialization for Microsoft SDKs, both Platform -SDKs and Windows SDKs. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. -""" - -from MSCommon import mssdk_exists, \ - mssdk_setup_env - -def generate(env): - """Add construction variables for an MS SDK to an Environment.""" - mssdk_setup_env(env) - -def exists(env): - return mssdk_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/msvc.py b/share/scons-local-1.3.0/SCons/Tool/msvc.py deleted file mode 100644 index f1458166784a705a28804843a2ade407d1b21d83..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/msvc.py +++ /dev/null @@ -1,269 +0,0 @@ -"""engine.SCons.Tool.msvc - -Tool-specific initialization for Microsoft Visual C/C++. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/msvc.py 4720 2010/03/24 03:14:11 jars" - -import os.path -import re -import string -import sys - -import SCons.Action -import SCons.Builder -import SCons.Errors -import SCons.Platform.win32 -import SCons.Tool -import SCons.Tool.msvs -import SCons.Util -import SCons.Warnings -import SCons.Scanner.RC - -from MSCommon import msvc_exists, msvc_setup_env_once - -CSuffixes = ['.c', '.C'] -CXXSuffixes = ['.cc', '.cpp', '.cxx', '.c++', '.C++'] - -def validate_vars(env): - """Validate the PCH and PCHSTOP construction variables.""" - if env.has_key('PCH') and env['PCH']: - if not env.has_key('PCHSTOP'): - raise SCons.Errors.UserError, "The PCHSTOP construction must be defined if PCH is defined." - if not SCons.Util.is_String(env['PCHSTOP']): - raise SCons.Errors.UserError, "The PCHSTOP construction variable must be a string: %r"%env['PCHSTOP'] - -def pch_emitter(target, source, env): - """Adds the object file target.""" - - validate_vars(env) - - pch = None - obj = None - - for t in target: - if SCons.Util.splitext(str(t))[1] == '.pch': - pch = t - if SCons.Util.splitext(str(t))[1] == '.obj': - obj = t - - if not obj: - obj = SCons.Util.splitext(str(pch))[0]+'.obj' - - target = [pch, obj] # pch must be first, and obj second for the PCHCOM to work - - return (target, source) - -def object_emitter(target, source, env, parent_emitter): - """Sets up the PCH dependencies for an object file.""" - - validate_vars(env) - - parent_emitter(target, source, env) - - # Add a dependency, but only if the target (e.g. 'Source1.obj') - # doesn't correspond to the pre-compiled header ('Source1.pch'). - # If the basenames match, then this was most likely caused by - # someone adding the source file to both the env.PCH() and the - # env.Program() calls, and adding the explicit dependency would - # cause a cycle on the .pch file itself. - # - # See issue #2505 for a discussion of what to do if it turns - # out this assumption causes trouble in the wild: - # http://scons.tigris.org/issues/show_bug.cgi?id=2505 - if env.has_key('PCH'): - pch = env['PCH'] - if str(target[0]) != SCons.Util.splitext(str(pch))[0] + '.obj': - env.Depends(target, pch) - - return (target, source) - -def static_object_emitter(target, source, env): - return object_emitter(target, source, env, - SCons.Defaults.StaticObjectEmitter) - -def shared_object_emitter(target, source, env): - return object_emitter(target, source, env, - SCons.Defaults.SharedObjectEmitter) - -pch_action = SCons.Action.Action('$PCHCOM', '$PCHCOMSTR') -pch_builder = SCons.Builder.Builder(action=pch_action, suffix='.pch', - emitter=pch_emitter, - source_scanner=SCons.Tool.SourceFileScanner) - - -# Logic to build .rc files into .res files (resource files) -res_scanner = SCons.Scanner.RC.RCScan() -res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR') -res_builder = SCons.Builder.Builder(action=res_action, - src_suffix='.rc', - suffix='.res', - src_builder=[], - source_scanner=res_scanner) - -def msvc_batch_key(action, env, target, source): - """ - Returns a key to identify unique batches of sources for compilation. - - If batching is enabled (via the $MSVC_BATCH setting), then all - target+source pairs that use the same action, defined by the same - environment, and have the same target and source directories, will - be batched. - - Returning None specifies that the specified target+source should not - be batched with other compilations. - """ - b = env.subst('$MSVC_BATCH') - if b in (None, '', '0'): - # We're not using batching; return no key. - return None - t = target[0] - s = source[0] - if os.path.splitext(t.name)[0] != os.path.splitext(s.name)[0]: - # The base names are different, so this *must* be compiled - # separately; return no key. - return None - return (id(action), id(env), t.dir, s.dir) - -def msvc_output_flag(target, source, env, for_signature): - """ - Returns the correct /Fo flag for batching. - - If batching is disabled or there's only one source file, then we - return an /Fo string that specifies the target explicitly. Otherwise, - we return an /Fo string that just specifies the first target's - directory (where the Visual C/C++ compiler will put the .obj files). - """ - b = env.subst('$MSVC_BATCH') - if b in (None, '', '0') or len(source) == 1: - return '/Fo$TARGET' - else: - # The Visual C/C++ compiler requires a \ at the end of the /Fo - # option to indicate an output directory. We use os.sep here so - # that the test(s) for this can be run on non-Windows systems - # without having a hard-coded backslash mess up command-line - # argument parsing. - return '/Fo${TARGET.dir}' + os.sep - -CAction = SCons.Action.Action("$CCCOM", "$CCCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -ShCAction = SCons.Action.Action("$SHCCCOM", "$SHCCCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -CXXAction = SCons.Action.Action("$CXXCOM", "$CXXCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') -ShCXXAction = SCons.Action.Action("$SHCXXCOM", "$SHCXXCOMSTR", - batch_key=msvc_batch_key, - targets='$CHANGED_TARGETS') - -def generate(env): - """Add Builders and construction variables for MSVC++ to an Environment.""" - static_obj, shared_obj = SCons.Tool.createObjBuilders(env) - - # TODO(batch): shouldn't reach in to cmdgen this way; necessary - # for now to bypass the checks in Builder.DictCmdGenerator.__call__() - # and allow .cc and .cpp to be compiled in the same command line. - static_obj.cmdgen.source_ext_match = False - shared_obj.cmdgen.source_ext_match = False - - for suffix in CSuffixes: - static_obj.add_action(suffix, CAction) - shared_obj.add_action(suffix, ShCAction) - static_obj.add_emitter(suffix, static_object_emitter) - shared_obj.add_emitter(suffix, shared_object_emitter) - - for suffix in CXXSuffixes: - static_obj.add_action(suffix, CXXAction) - shared_obj.add_action(suffix, ShCXXAction) - static_obj.add_emitter(suffix, static_object_emitter) - shared_obj.add_emitter(suffix, shared_object_emitter) - - env['CCPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Z7") or ""}']) - env['CCPCHFLAGS'] = SCons.Util.CLVar(['${(PCH and "/Yu%s /Fp%s"%(PCHSTOP or "",File(PCH))) or ""}']) - env['_MSVC_OUTPUT_FLAG'] = msvc_output_flag - env['_CCCOMCOM'] = '$CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS $CCPCHFLAGS $CCPDBFLAGS' - env['CC'] = 'cl' - env['CCFLAGS'] = SCons.Util.CLVar('/nologo') - env['CFLAGS'] = SCons.Util.CLVar('') - env['CCCOM'] = '$CC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CFLAGS $CCFLAGS $_CCCOMCOM' - env['SHCC'] = '$CC' - env['SHCCFLAGS'] = SCons.Util.CLVar('$CCFLAGS') - env['SHCFLAGS'] = SCons.Util.CLVar('$CFLAGS') - env['SHCCCOM'] = '$SHCC $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCFLAGS $SHCCFLAGS $_CCCOMCOM' - env['CXX'] = '$CC' - env['CXXFLAGS'] = SCons.Util.CLVar('$( /TP $)') - env['CXXCOM'] = '$CXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $CXXFLAGS $CCFLAGS $_CCCOMCOM' - env['SHCXX'] = '$CXX' - env['SHCXXFLAGS'] = SCons.Util.CLVar('$CXXFLAGS') - env['SHCXXCOM'] = '$SHCXX $_MSVC_OUTPUT_FLAG /c $CHANGED_SOURCES $SHCXXFLAGS $SHCCFLAGS $_CCCOMCOM' - env['CPPDEFPREFIX'] = '/D' - env['CPPDEFSUFFIX'] = '' - env['INCPREFIX'] = '/I' - env['INCSUFFIX'] = '' -# env.Append(OBJEMITTER = [static_object_emitter]) -# env.Append(SHOBJEMITTER = [shared_object_emitter]) - env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME'] = 1 - - env['RC'] = 'rc' - env['RCFLAGS'] = SCons.Util.CLVar('') - env['RCSUFFIXES']=['.rc','.rc2'] - env['RCCOM'] = '$RC $_CPPDEFFLAGS $_CPPINCFLAGS $RCFLAGS /fo$TARGET $SOURCES' - env['BUILDERS']['RES'] = res_builder - env['OBJPREFIX'] = '' - env['OBJSUFFIX'] = '.obj' - env['SHOBJPREFIX'] = '$OBJPREFIX' - env['SHOBJSUFFIX'] = '$OBJSUFFIX' - - # Set-up ms tools paths - msvc_setup_env_once(env) - - env['CFILESUFFIX'] = '.c' - env['CXXFILESUFFIX'] = '.cc' - - env['PCHPDBFLAGS'] = SCons.Util.CLVar(['${(PDB and "/Yd") or ""}']) - env['PCHCOM'] = '$CXX /Fo${TARGETS[1]} $CXXFLAGS $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS /c $SOURCES /Yc$PCHSTOP /Fp${TARGETS[0]} $CCPDBFLAGS $PCHPDBFLAGS' - env['BUILDERS']['PCH'] = pch_builder - - if not env.has_key('ENV'): - env['ENV'] = {} - if not env['ENV'].has_key('SystemRoot'): # required for dlls in the winsxs folders - env['ENV']['SystemRoot'] = SCons.Platform.win32.get_system_root() - -def exists(env): - return msvc_exists() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/Tool/msvs.py b/share/scons-local-1.3.0/SCons/Tool/msvs.py deleted file mode 100644 index 17bb9a02c1c8a50d4c260224521b43cdbce2f44e..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/Tool/msvs.py +++ /dev/null @@ -1,1439 +0,0 @@ -"""SCons.Tool.msvs - -Tool-specific initialization for Microsoft Visual Studio project files. - -There normally shouldn't be any need to import this module directly. -It will usually be imported through the generic SCons.Tool.Tool() -selection method. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/Tool/msvs.py 4720 2010/03/24 03:14:11 jars" - -import base64 -import hashlib -import ntpath -import os -import pickle -import re -import string -import sys - -import SCons.Builder -import SCons.Node.FS -import SCons.Platform.win32 -import SCons.Script.SConscript -import SCons.Util -import SCons.Warnings - -from MSCommon import msvc_exists, msvc_setup_env_once -from SCons.Defaults import processDefines - -############################################################################## -# Below here are the classes and functions for generation of -# DSP/DSW/SLN/VCPROJ files. -############################################################################## - -def _hexdigest(s): - """Return a string as a string of hex characters. - """ - # NOTE: This routine is a method in the Python 2.0 interface - # of the native md5 module, but we want SCons to operate all - # the way back to at least Python 1.5.2, which doesn't have it. - h = string.hexdigits - r = '' - for c in s: - i = ord(c) - r = r + h[(i >> 4) & 0xF] + h[i & 0xF] - return r - -def xmlify(s): - s = string.replace(s, "&", "&") # do this first - s = string.replace(s, "'", "'") - s = string.replace(s, '"', """) - return s - -external_makefile_guid = '{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}' - -def _generateGUID(slnfile, name): - """This generates a dummy GUID for the sln file to use. It is - based on the MD5 signatures of the sln filename plus the name of - the project. It basically just needs to be unique, and not - change with each invocation.""" - m = hashlib.md5() - # Normalize the slnfile path to a Windows path (\ separators) so - # the generated file has a consistent GUID even if we generate - # it on a non-Windows platform. - m.update(ntpath.normpath(str(slnfile)) + str(name)) - # TODO(1.5) - #solution = m.hexdigest().upper() - solution = string.upper(_hexdigest(m.digest())) - # convert most of the signature to GUID form (discard the rest) - solution = "{" + solution[:8] + "-" + solution[8:12] + "-" + solution[12:16] + "-" + solution[16:20] + "-" + solution[20:32] + "}" - return solution - -version_re = re.compile(r'(\d+\.\d+)(.*)') - -def msvs_parse_version(s): - """ - Split a Visual Studio version, which may in fact be something like - '7.0Exp', into is version number (returned as a float) and trailing - "suite" portion. - """ - num, suite = version_re.match(s).groups() - return float(num), suite - -# This is how we re-invoke SCons from inside MSVS Project files. -# The problem is that we might have been invoked as either scons.bat -# or scons.py. If we were invoked directly as scons.py, then we could -# use sys.argv[0] to find the SCons "executable," but that doesn't work -# if we were invoked as scons.bat, which uses "python -c" to execute -# things and ends up with "-c" as sys.argv[0]. Consequently, we have -# the MSVS Project file invoke SCons the same way that scons.bat does, -# which works regardless of how we were invoked. -def getExecScriptMain(env, xml=None): - scons_home = env.get('SCONS_HOME') - if not scons_home and os.environ.has_key('SCONS_LIB_DIR'): - scons_home = os.environ['SCONS_LIB_DIR'] - if scons_home: - exec_script_main = "from os.path import join; import sys; sys.path = [ r'%s' ] + sys.path; import SCons.Script; SCons.Script.main()" % scons_home - else: - version = SCons.__version__ - exec_script_main = "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-%(version)s'), join(sys.prefix, 'scons-%(version)s'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons') ] + sys.path; import SCons.Script; SCons.Script.main()" % locals() - if xml: - exec_script_main = xmlify(exec_script_main) - return exec_script_main - -# The string for the Python executable we tell the Project file to use -# is either sys.executable or, if an external PYTHON_ROOT environment -# variable exists, $(PYTHON)ROOT\\python.exe (generalized a little to -# pluck the actual executable name from sys.executable). -try: - python_root = os.environ['PYTHON_ROOT'] -except KeyError: - python_executable = sys.executable -else: - python_executable = os.path.join('$$(PYTHON_ROOT)', - os.path.split(sys.executable)[1]) - -class Config: - pass - -def splitFully(path): - dir, base = os.path.split(path) - if dir and dir != '' and dir != path: - return splitFully(dir)+[base] - if base == '': - return [] - return [base] - -def makeHierarchy(sources): - '''Break a list of files into a hierarchy; for each value, if it is a string, - then it is a file. If it is a dictionary, it is a folder. The string is - the original path of the file.''' - - hierarchy = {} - for file in sources: - path = splitFully(file) - if len(path): - dict = hierarchy - for part in path[:-1]: - if not dict.has_key(part): - dict[part] = {} - dict = dict[part] - dict[path[-1]] = file - #else: - # print 'Warning: failed to decompose path for '+str(file) - return hierarchy - -class _DSPGenerator: - """ Base class for DSP generators """ - - srcargs = [ - 'srcs', - 'incs', - 'localincs', - 'resources', - 'misc'] - - def __init__(self, dspfile, source, env): - self.dspfile = str(dspfile) - try: - get_abspath = dspfile.get_abspath - except AttributeError: - self.dspabs = os.path.abspath(dspfile) - else: - self.dspabs = get_abspath() - - if not env.has_key('variant'): - raise SCons.Errors.InternalError, \ - "You must specify a 'variant' argument (i.e. 'Debug' or " +\ - "'Release') to create an MSVSProject." - elif SCons.Util.is_String(env['variant']): - variants = [env['variant']] - elif SCons.Util.is_List(env['variant']): - variants = env['variant'] - - if not env.has_key('buildtarget') or env['buildtarget'] == None: - buildtarget = [''] - elif SCons.Util.is_String(env['buildtarget']): - buildtarget = [env['buildtarget']] - elif SCons.Util.is_List(env['buildtarget']): - if len(env['buildtarget']) != len(variants): - raise SCons.Errors.InternalError, \ - "Sizes of 'buildtarget' and 'variant' lists must be the same." - buildtarget = [] - for bt in env['buildtarget']: - if SCons.Util.is_String(bt): - buildtarget.append(bt) - else: - buildtarget.append(bt.get_abspath()) - else: - buildtarget = [env['buildtarget'].get_abspath()] - if len(buildtarget) == 1: - bt = buildtarget[0] - buildtarget = [] - for _ in variants: - buildtarget.append(bt) - - if not env.has_key('outdir') or env['outdir'] == None: - outdir = [''] - elif SCons.Util.is_String(env['outdir']): - outdir = [env['outdir']] - elif SCons.Util.is_List(env['outdir']): - if len(env['outdir']) != len(variants): - raise SCons.Errors.InternalError, \ - "Sizes of 'outdir' and 'variant' lists must be the same." - outdir = [] - for s in env['outdir']: - if SCons.Util.is_String(s): - outdir.append(s) - else: - outdir.append(s.get_abspath()) - else: - outdir = [env['outdir'].get_abspath()] - if len(outdir) == 1: - s = outdir[0] - outdir = [] - for v in variants: - outdir.append(s) - - if not env.has_key('runfile') or env['runfile'] == None: - runfile = buildtarget[-1:] - elif SCons.Util.is_String(env['runfile']): - runfile = [env['runfile']] - elif SCons.Util.is_List(env['runfile']): - if len(env['runfile']) != len(variants): - raise SCons.Errors.InternalError, \ - "Sizes of 'runfile' and 'variant' lists must be the same." - runfile = [] - for s in env['runfile']: - if SCons.Util.is_String(s): - runfile.append(s) - else: - runfile.append(s.get_abspath()) - else: - runfile = [env['runfile'].get_abspath()] - if len(runfile) == 1: - s = runfile[0] - runfile = [] - for v in variants: - runfile.append(s) - - self.sconscript = env['MSVSSCONSCRIPT'] - - cmdargs = env.get('cmdargs', '') - - self.env = env - - if self.env.has_key('name'): - self.name = self.env['name'] - else: - self.name = os.path.basename(SCons.Util.splitext(self.dspfile)[0]) - self.name = self.env.subst(self.name) - - sourcenames = [ - 'Source Files', - 'Header Files', - 'Local Headers', - 'Resource Files', - 'Other Files'] - - self.sources = {} - for n in sourcenames: - self.sources[n] = [] - - self.configs = {} - - self.nokeep = 0 - if env.has_key('nokeep') and env['variant'] != 0: - self.nokeep = 1 - - if self.nokeep == 0 and os.path.exists(self.dspabs): - self.Parse() - - for t in zip(sourcenames,self.srcargs): - if self.env.has_key(t[1]): - if SCons.Util.is_List(self.env[t[1]]): - for i in self.env[t[1]]: - if not i in self.sources[t[0]]: - self.sources[t[0]].append(i) - else: - if not self.env[t[1]] in self.sources[t[0]]: - self.sources[t[0]].append(self.env[t[1]]) - - for n in sourcenames: - # TODO(1.5): - #self.sources[n].sort(lambda a, b: cmp(a.lower(), b.lower())) - self.sources[n].sort(lambda a, b: cmp(string.lower(a), string.lower(b))) - - def AddConfig(self, variant, buildtarget, outdir, runfile, cmdargs, dspfile=dspfile): - config = Config() - config.buildtarget = buildtarget - config.outdir = outdir - config.cmdargs = cmdargs - config.runfile = runfile - - match = re.match('(.*)\|(.*)', variant) - if match: - config.variant = match.group(1) - config.platform = match.group(2) - else: - config.variant = variant - config.platform = 'Win32' - - self.configs[variant] = config - print "Adding '" + self.name + ' - ' + config.variant + '|' + config.platform + "' to '" + str(dspfile) + "'" - - for i in range(len(variants)): - AddConfig(self, variants[i], buildtarget[i], outdir[i], runfile[i], cmdargs) - - self.platforms = [] - for key in self.configs.keys(): - platform = self.configs[key].platform - if not platform in self.platforms: - self.platforms.append(platform) - - def Build(self): - pass - -V6DSPHeader = """\ -# Microsoft Developer Studio Project File - Name="%(name)s" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) External Target" 0x0106 - -CFG=%(name)s - Win32 %(confkey)s -!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 "%(name)s.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 "%(name)s.mak" CFG="%(name)s - Win32 %(confkey)s" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -""" - -class _GenerateV6DSP(_DSPGenerator): - """Generates a Project file for MSVS 6.0""" - - def PrintHeader(self): - # pick a default config - confkeys = self.configs.keys() - confkeys.sort() - - name = self.name - confkey = confkeys[0] - - self.file.write(V6DSPHeader % locals()) - - for kind in confkeys: - self.file.write('!MESSAGE "%s - Win32 %s" (based on "Win32 (x86) External Target")\n' % (name, kind)) - - self.file.write('!MESSAGE \n\n') - - def PrintProject(self): - name = self.name - self.file.write('# Begin Project\n' - '# PROP AllowPerConfigDependencies 0\n' - '# PROP Scc_ProjName ""\n' - '# PROP Scc_LocalPath ""\n\n') - - first = 1 - confkeys = self.configs.keys() - confkeys.sort() - for kind in confkeys: - outdir = self.configs[kind].outdir - buildtarget = self.configs[kind].buildtarget - if first == 1: - self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind)) - first = 0 - else: - self.file.write('\n!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name, kind)) - - env_has_buildtarget = self.env.has_key('MSVSBUILDTARGET') - if not env_has_buildtarget: - self.env['MSVSBUILDTARGET'] = buildtarget - - # have to write this twice, once with the BASE settings, and once without - for base in ("BASE ",""): - self.file.write('# PROP %sUse_MFC 0\n' - '# PROP %sUse_Debug_Libraries ' % (base, base)) - # TODO(1.5): - #if kind.lower().find('debug') < 0: - if string.find(string.lower(kind), 'debug') < 0: - self.file.write('0\n') - else: - self.file.write('1\n') - self.file.write('# PROP %sOutput_Dir "%s"\n' - '# PROP %sIntermediate_Dir "%s"\n' % (base,outdir,base,outdir)) - cmd = 'echo Starting SCons && ' + self.env.subst('$MSVSBUILDCOM', 1) - self.file.write('# PROP %sCmd_Line "%s"\n' - '# PROP %sRebuild_Opt "-c && %s"\n' - '# PROP %sTarget_File "%s"\n' - '# PROP %sBsc_Name ""\n' - '# PROP %sTarget_Dir ""\n'\ - %(base,cmd,base,cmd,base,buildtarget,base,base)) - - if not env_has_buildtarget: - del self.env['MSVSBUILDTARGET'] - - self.file.write('\n!ENDIF\n\n' - '# Begin Target\n\n') - for kind in confkeys: - self.file.write('# Name "%s - Win32 %s"\n' % (name,kind)) - self.file.write('\n') - first = 0 - for kind in confkeys: - if first == 0: - self.file.write('!IF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind)) - first = 1 - else: - self.file.write('!ELSEIF "$(CFG)" == "%s - Win32 %s"\n\n' % (name,kind)) - self.file.write('!ENDIF \n\n') - self.PrintSourceFiles() - self.file.write('# End Target\n' - '# End Project\n') - - if self.nokeep == 0: - # now we pickle some data and add it to the file -- MSDEV will ignore it. - pdata = pickle.dumps(self.configs,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '\n') - pdata = pickle.dumps(self.sources,1) - pdata = base64.encodestring(pdata) - self.file.write(pdata + '\n') - - def PrintSourceFiles(self): - categories = {'Source Files': 'cpp|c|cxx|l|y|def|odl|idl|hpj|bat', - 'Header Files': 'h|hpp|hxx|hm|inl', - 'Local Headers': 'h|hpp|hxx|hm|inl', - 'Resource Files': 'r|rc|ico|cur|bmp|dlg|rc2|rct|bin|cnt|rtf|gif|jpg|jpeg|jpe', - 'Other Files': ''} - - cats = categories.keys() - # TODO(1.5): - #cats.sort(lambda a, b: cmp(a.lower(), b.lower())) - cats.sort(lambda a, b: cmp(string.lower(a), string.lower(b))) - for kind in cats: - if not self.sources[kind]: - continue # skip empty groups - - self.file.write('# Begin Group "' + kind + '"\n\n') - # TODO(1.5) - #typelist = categories[kind].replace('|', ';') - typelist = string.replace(categories[kind], '|', ';') - self.file.write('# PROP Default_Filter "' + typelist + '"\n') - - for file in self.sources[kind]: - file = os.path.normpath(file) - self.file.write('# Begin Source File\n\n' - 'SOURCE="' + file + '"\n' - '# End Source File\n') - self.file.write('# End Group\n') - - # add the SConscript file outside of the groups - self.file.write('# Begin Source File\n\n' - 'SOURCE="' + str(self.sconscript) + '"\n' - '# End Source File\n') - - def Parse(self): - try: - dspfile = open(self.dspabs,'r') - except IOError: - return # doesn't exist yet, so can't add anything to configs. - - line = dspfile.readline() - while line: - # TODO(1.5): - #if line.find("# End Project") > -1: - if string.find(line, "# End Project") > -1: - break - line = dspfile.readline() - - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.configs.update(data) - - data = None - line = dspfile.readline() - datas = line - while line and line != '\n': - line = dspfile.readline() - datas = datas + line - - # OK, we've found our little pickled cache of data. - # it has a "# " in front of it, so we strip that. - try: - datas = base64.decodestring(datas) - data = pickle.loads(datas) - except KeyboardInterrupt: - raise - except: - return # unable to unpickle any data for some reason - - self.sources.update(data) - - def Build(self): - try: - self.file = open(self.dspabs,'w') - except IOError, detail: - raise SCons.Errors.InternalError, 'Unable to open "' + self.dspabs + '" for writing:' + str(detail) - else: - self.PrintHeader() - self.PrintProject() - self.file.close() - -V7DSPHeader = """\ - - -""" - -V7DSPConfiguration = """\ -\t\t -\t\t\t -\t\t -""" - -V8DSPHeader = """\ - - -""" - -V8DSPConfiguration = """\ -\t\t -\t\t\t -\t\t -""" -class _GenerateV7DSP(_DSPGenerator): - """Generates a Project file for MSVS .NET""" - - def __init__(self, dspfile, source, env): - _DSPGenerator.__init__(self, dspfile, source, env) - self.version = env['MSVS_VERSION'] - self.version_num, self.suite = msvs_parse_version(self.version) - if self.version_num >= 8.0: - self.versionstr = '8.00' - self.dspheader = V8DSPHeader - self.dspconfiguration = V8DSPConfiguration - else: - if self.version_num >= 7.1: - self.versionstr = '7.10' - else: - self.versionstr = '7.00' - self.dspheader = V7DSPHeader - self.dspconfiguration = V7DSPConfiguration - self.file = None - - def PrintHeader(self): - env = self.env - versionstr = self.versionstr - name = self.name - encoding = self.env.subst('$MSVSENCODING') - scc_provider = env.get('MSVS_SCC_PROVIDER', '') - scc_project_name = env.get('MSVS_SCC_PROJECT_NAME', '') - scc_aux_path = env.get('MSVS_SCC_AUX_PATH', '') - scc_local_path = env.get('MSVS_SCC_LOCAL_PATH', '') - project_guid = env.get('MSVS_PROJECT_GUID', '') - if self.version_num >= 8.0 and not project_guid: - project_guid = _generateGUID(self.dspfile, '') - if scc_provider != '': - scc_attrs = ('\tProjectGUID="%s"\n' - '\tSccProjectName="%s"\n' - '\tSccAuxPath="%s"\n' - '\tSccLocalPath="%s"\n' - '\tSccProvider="%s"' % (project_guid, scc_project_name, scc_aux_path, scc_local_path, scc_provider)) - else: - scc_attrs = ('\tProjectGUID="%s"\n' - '\tSccProjectName="%s"\n' - '\tSccLocalPath="%s"' % (project_guid, scc_project_name, scc_local_path)) - - self.file.write(self.dspheader % locals()) - - self.file.write('\t\n') - for platform in self.platforms: - self.file.write( - '\t\t\n' % platform) - self.file.write('\t\n') - - if self.version_num >= 8.0: - self.file.write('\t\n' - '\t\n') - - def PrintProject(self): - self.file.write('\t\n') - - confkeys = self.configs.keys() - confkeys.sort() - for kind in confkeys: - variant = self.configs[kind].variant - platform = self.configs[kind].platform - outdir = self.configs[kind].outdir - buildtarget = self.configs[kind].buildtarget - runfile = self.configs[kind].runfile - cmdargs = self.configs[kind].cmdargs - - env_has_buildtarget = self.env.has_key('MSVSBUILDTARGET') - if not env_has_buildtarget: - self.env['MSVSBUILDTARGET'] = buildtarget - - starting = 'echo Starting SCons && ' - if cmdargs: - cmdargs = ' ' + cmdargs - else: - cmdargs = '' - buildcmd = xmlify(starting + self.env.subst('$MSVSBUILDCOM', 1) + cmdargs) - rebuildcmd = xmlify(starting + self.env.subst('$MSVSREBUILDCOM', 1) + cmdargs) - cleancmd = xmlify(starting + self.env.subst('$MSVSCLEANCOM', 1) + cmdargs) - - # TODO(1.5) - #preprocdefs = xmlify(';'.join(self.env.get('CPPDEFINES', []))) - #includepath = xmlify(';'.join(self.env.get('CPPPATH', []))) - preprocdefs = xmlify(string.join(processDefines(self.env.get('CPPDEFINES', [])), ';')) - includepath = xmlify(string.join(self.env.get('CPPPATH', []), ';')) - - if not env_has_buildtarget: - del self.env['MSVSBUILDTARGET'] - - self.file.write(self.dspconfiguration % locals()) - - self.file.write('\t\n') - - if self.version_num >= 7.1: - self.file.write('\t\n' - '\t\n') - - self.PrintSourceFiles() - - self.file.write('\n') - - if self.nokeep == 0: - # now we pickle some data and add it to the file -- MSDEV will ignore it. - pdata = pickle.dumps(self.configs,1) - pdata = base64.encodestring(pdata) - self.file.write('\n') - - def printSources(self, hierarchy, commonprefix): - sorteditems = hierarchy.items() - # TODO(1.5): - #sorteditems.sort(lambda a, b: cmp(a[0].lower(), b[0].lower())) - sorteditems.sort(lambda a, b: cmp(string.lower(a[0]), string.lower(b[0]))) - - # First folders, then files - for key, value in sorteditems: - if SCons.Util.is_Dict(value): - self.file.write('\t\t\t\n' % (key)) - self.printSources(value, commonprefix) - self.file.write('\t\t\t\n') - - for key, value in sorteditems: - if SCons.Util.is_String(value): - file = value - if commonprefix: - file = os.path.join(commonprefix, value) - file = os.path.normpath(file) - self.file.write('\t\t\t\n' - '\t\t\t\n' % (file)) - - def PrintSourceFiles(self): - categories = {'Source Files': 'cpp;c;cxx;l;y;def;odl;idl;hpj;bat', - 'Header Files': 'h;hpp;hxx;hm;inl', - 'Local Headers': 'h;hpp;hxx;hm;inl', - 'Resource Files': 'r;rc;ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe', - 'Other Files': ''} - - self.file.write('\t\n') - - cats = categories.keys() - # TODO(1.5) - #cats.sort(lambda a, b: cmp(a.lower(), b.lower())) - cats.sort(lambda a, b: cmp(string.lower(a), string.lower(b))) - cats = filter(lambda k, s=self: s.sources[k], cats) - for kind in cats: - if len(cats) > 1: - self.file.write('\t\t\n' % (kind, categories[kind])) - - sources = self.sources[kind] - - # First remove any common prefix - commonprefix = None - if len(sources) > 1: - s = map(os.path.normpath, sources) - # take the dirname because the prefix may include parts - # of the filenames (e.g. if you have 'dir\abcd' and - # 'dir\acde' then the cp will be 'dir\a' ) - cp = os.path.dirname( os.path.commonprefix(s) ) - if cp and s[0][len(cp)] == os.sep: - # +1 because the filename starts after the separator - sources = map(lambda s, l=len(cp)+1: s[l:], sources) - commonprefix = cp - elif len(sources) == 1: - commonprefix = os.path.dirname( sources[0] ) - sources[0] = os.path.basename( sources[0] ) - - hierarchy = makeHierarchy(sources) - self.printSources(hierarchy, commonprefix=commonprefix) - - if len(cats)>1: - self.file.write('\t\t\n') - - # add the SConscript file outside of the groups - self.file.write('\t\t\n' - '\t\t\n' % str(self.sconscript)) - - self.file.write('\t\n' - '\t\n' - '\t\n') - - def Parse(self): - try: - dspfile = open(self.dspabs,'r') - except IOError: - return # doesn't exist yet, so can't add anything to configs. - - line = dspfile.readline() - while line: - # TODO(1.5) - #if line.find(' p2cread - # c2pread <--stdout--- c2pwrite - # errread <--stderr--- errwrite - # - # On POSIX, the child objects are file descriptors. On - # Windows, these are Windows file handles. The parent objects - # are file descriptors on both platforms. The parent objects - # are None when not using PIPEs. The child objects are None - # when not redirecting. - - (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) = self._get_handles(stdin, stdout, stderr) - - self._execute_child(args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - if p2cwrite: - self.stdin = os.fdopen(p2cwrite, 'wb', bufsize) - if c2pread: - if universal_newlines: - self.stdout = os.fdopen(c2pread, 'rU', bufsize) - else: - self.stdout = os.fdopen(c2pread, 'rb', bufsize) - if errread: - if universal_newlines: - self.stderr = os.fdopen(errread, 'rU', bufsize) - else: - self.stderr = os.fdopen(errread, 'rb', bufsize) - - - def _translate_newlines(self, data): - data = data.replace("\r\n", "\n") - data = data.replace("\r", "\n") - return data - - - def __del__(self): - if not self._child_created: - # We didn't get to successfully create a child process. - return - # In case the child hasn't been waited on, check if it's done. - self.poll(_deadstate=sys.maxint) - if self.returncode is None and _active is not None: - # Child is still running, keep us alive until we can wait on it. - _active.append(self) - - - def communicate(self, input=None): - """Interact with process: Send data to stdin. Read data from - stdout and stderr, until end-of-file is reached. Wait for - process to terminate. The optional input argument should be a - string to be sent to the child process, or None, if no data - should be sent to the child. - - communicate() returns a tuple (stdout, stderr).""" - - # Optimization: If we are only using one pipe, or no pipe at - # all, using select() or threads is unnecessary. - if [self.stdin, self.stdout, self.stderr].count(None) >= 2: - stdout = None - stderr = None - if self.stdin: - if input: - self.stdin.write(input) - self.stdin.close() - elif self.stdout: - stdout = self.stdout.read() - elif self.stderr: - stderr = self.stderr.read() - self.wait() - return (stdout, stderr) - - return self._communicate(input) - - - if mswindows: - # - # Windows methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - if stdin is None and stdout is None and stderr is None: - return (None, None, None, None, None, None) - - p2cread, p2cwrite = None, None - c2pread, c2pwrite = None, None - errread, errwrite = None, None - - if stdin is None: - p2cread = GetStdHandle(STD_INPUT_HANDLE) - elif stdin == PIPE: - p2cread, p2cwrite = CreatePipe(None, 0) - # Detach and turn into fd - p2cwrite = p2cwrite.Detach() - p2cwrite = msvcrt.open_osfhandle(p2cwrite, 0) - elif is_int(stdin): - p2cread = msvcrt.get_osfhandle(stdin) - else: - # Assuming file-like object - p2cread = msvcrt.get_osfhandle(stdin.fileno()) - p2cread = self._make_inheritable(p2cread) - - if stdout is None: - c2pwrite = GetStdHandle(STD_OUTPUT_HANDLE) - elif stdout == PIPE: - c2pread, c2pwrite = CreatePipe(None, 0) - # Detach and turn into fd - c2pread = c2pread.Detach() - c2pread = msvcrt.open_osfhandle(c2pread, 0) - elif is_int(stdout): - c2pwrite = msvcrt.get_osfhandle(stdout) - else: - # Assuming file-like object - c2pwrite = msvcrt.get_osfhandle(stdout.fileno()) - c2pwrite = self._make_inheritable(c2pwrite) - - if stderr is None: - errwrite = GetStdHandle(STD_ERROR_HANDLE) - elif stderr == PIPE: - errread, errwrite = CreatePipe(None, 0) - # Detach and turn into fd - errread = errread.Detach() - errread = msvcrt.open_osfhandle(errread, 0) - elif stderr == STDOUT: - errwrite = c2pwrite - elif is_int(stderr): - errwrite = msvcrt.get_osfhandle(stderr) - else: - # Assuming file-like object - errwrite = msvcrt.get_osfhandle(stderr.fileno()) - errwrite = self._make_inheritable(errwrite) - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - def _make_inheritable(self, handle): - """Return a duplicate of handle, which is inheritable""" - return DuplicateHandle(GetCurrentProcess(), handle, - GetCurrentProcess(), 0, 1, - DUPLICATE_SAME_ACCESS) - - - def _find_w9xpopen(self): - """Find and return absolut path to w9xpopen.exe""" - w9xpopen = os.path.join(os.path.dirname(GetModuleFileName(0)), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - # Eeek - file-not-found - possibly an embedding - # situation - see if we can locate it in sys.exec_prefix - w9xpopen = os.path.join(os.path.dirname(sys.exec_prefix), - "w9xpopen.exe") - if not os.path.exists(w9xpopen): - raise RuntimeError("Cannot locate w9xpopen.exe, which is " - "needed for Popen to work with your " - "shell or platform.") - return w9xpopen - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite): - """Execute program (MS Windows version)""" - - if not isinstance(args, types.StringTypes): - args = list2cmdline(args) - - # Process startup details - if startupinfo is None: - startupinfo = STARTUPINFO() - if None not in (p2cread, c2pwrite, errwrite): - startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESTDHANDLES - startupinfo.hStdInput = p2cread - startupinfo.hStdOutput = c2pwrite - startupinfo.hStdError = errwrite - - if shell: - startupinfo.dwFlags = startupinfo.dwFlags | STARTF_USESHOWWINDOW - startupinfo.wShowWindow = SW_HIDE - comspec = os.environ.get("COMSPEC", "cmd.exe") - args = comspec + " /c " + args - if (GetVersion() >= 0x80000000L or - os.path.basename(comspec).lower() == "command.com"): - # Win9x, or using command.com on NT. We need to - # use the w9xpopen intermediate program. For more - # information, see KB Q150956 - # (http://web.archive.org/web/20011105084002/http://support.microsoft.com/support/kb/articles/Q150/9/56.asp) - w9xpopen = self._find_w9xpopen() - args = '"%s" %s' % (w9xpopen, args) - # Not passing CREATE_NEW_CONSOLE has been known to - # cause random failures on win9x. Specifically a - # dialog: "Your program accessed mem currently in - # use at xxx" and a hopeful warning about the - # stability of your system. Cost is Ctrl+C wont - # kill children. - creationflags = creationflags | CREATE_NEW_CONSOLE - - # Start the process - try: - hp, ht, pid, tid = CreateProcess(executable, args, - # no special security - None, None, - # must inherit handles to pass std - # handles - 1, - creationflags, - env, - cwd, - startupinfo) - except pywintypes.error, e: - # Translate pywintypes.error to WindowsError, which is - # a subclass of OSError. FIXME: We should really - # translate errno using _sys_errlist (or simliar), but - # how can this be done from Python? - raise apply(WindowsError, e.args) - - # Retain the process handle, but close the thread handle - self._child_created = True - self._handle = hp - self.pid = pid - ht.Close() - - # Child is launched. Close the parent's copy of those pipe - # handles that only the child should have open. You need - # to make sure that no handles to the write end of the - # output pipe are maintained in this process or else the - # pipe will not close when the child process exits and the - # ReadFile will hang. - if p2cread is not None: - p2cread.Close() - if c2pwrite is not None: - c2pwrite.Close() - if errwrite is not None: - errwrite.Close() - - - def poll(self, _deadstate=None): - """Check if child process has terminated. Returns returncode - attribute.""" - if self.returncode is None: - if WaitForSingleObject(self._handle, 0) == WAIT_OBJECT_0: - self.returncode = GetExitCodeProcess(self._handle) - return self.returncode - - - def wait(self): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is None: - obj = WaitForSingleObject(self._handle, INFINITE) - self.returncode = GetExitCodeProcess(self._handle) - return self.returncode - - - def _readerthread(self, fh, buffer): - buffer.append(fh.read()) - - - def _communicate(self, input): - stdout = None # Return - stderr = None # Return - - if self.stdout: - stdout = [] - stdout_thread = threading.Thread(target=self._readerthread, - args=(self.stdout, stdout)) - stdout_thread.setDaemon(True) - stdout_thread.start() - if self.stderr: - stderr = [] - stderr_thread = threading.Thread(target=self._readerthread, - args=(self.stderr, stderr)) - stderr_thread.setDaemon(True) - stderr_thread.start() - - if self.stdin: - if input is not None: - self.stdin.write(input) - self.stdin.close() - - if self.stdout: - stdout_thread.join() - if self.stderr: - stderr_thread.join() - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = stdout[0] - if stderr is not None: - stderr = stderr[0] - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - self.wait() - return (stdout, stderr) - - else: - # - # POSIX methods - # - def _get_handles(self, stdin, stdout, stderr): - """Construct and return tupel with IO objects: - p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite - """ - p2cread, p2cwrite = None, None - c2pread, c2pwrite = None, None - errread, errwrite = None, None - - if stdin is None: - pass - elif stdin == PIPE: - p2cread, p2cwrite = os.pipe() - elif is_int(stdin): - p2cread = stdin - else: - # Assuming file-like object - p2cread = stdin.fileno() - - if stdout is None: - pass - elif stdout == PIPE: - c2pread, c2pwrite = os.pipe() - elif is_int(stdout): - c2pwrite = stdout - else: - # Assuming file-like object - c2pwrite = stdout.fileno() - - if stderr is None: - pass - elif stderr == PIPE: - errread, errwrite = os.pipe() - elif stderr == STDOUT: - errwrite = c2pwrite - elif is_int(stderr): - errwrite = stderr - else: - # Assuming file-like object - errwrite = stderr.fileno() - - return (p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite) - - - def _set_cloexec_flag(self, fd): - try: - cloexec_flag = fcntl.FD_CLOEXEC - except AttributeError: - cloexec_flag = 1 - - old = fcntl.fcntl(fd, fcntl.F_GETFD) - fcntl.fcntl(fd, fcntl.F_SETFD, old | cloexec_flag) - - - def _close_fds(self, but): - for i in xrange(3, MAXFD): - if i == but: - continue - try: - os.close(i) - except KeyboardInterrupt: - raise # SCons: don't swallow keyboard interrupts - except: - pass - - - def _execute_child(self, args, executable, preexec_fn, close_fds, - cwd, env, universal_newlines, - startupinfo, creationflags, shell, - p2cread, p2cwrite, - c2pread, c2pwrite, - errread, errwrite): - """Execute program (POSIX version)""" - - if is_string(args): - args = [args] - - if shell: - args = ["/bin/sh", "-c"] + args - - if executable is None: - executable = args[0] - - # For transferring possible exec failure from child to parent - # The first char specifies the exception type: 0 means - # OSError, 1 means some other error. - errpipe_read, errpipe_write = os.pipe() - self._set_cloexec_flag(errpipe_write) - - self.pid = os.fork() - self._child_created = True - if self.pid == 0: - # Child - try: - # Close parent's pipe ends - if p2cwrite: - os.close(p2cwrite) - if c2pread: - os.close(c2pread) - if errread: - os.close(errread) - os.close(errpipe_read) - - # Dup fds for child - if p2cread: - os.dup2(p2cread, 0) - if c2pwrite: - os.dup2(c2pwrite, 1) - if errwrite: - os.dup2(errwrite, 2) - - # Close pipe fds. Make sure we don't close the same - # fd more than once, or standard fds. - try: - set - except NameError: - # Fall-back for earlier Python versions, so epydoc - # can use this module directly to execute things. - if p2cread: - os.close(p2cread) - if c2pwrite and c2pwrite not in (p2cread,): - os.close(c2pwrite) - if errwrite and errwrite not in (p2cread, c2pwrite): - os.close(errwrite) - else: - for fd in set((p2cread, c2pwrite, errwrite))-set((0,1,2)): - if fd: os.close(fd) - - # Close all other fds, if asked for - if close_fds: - self._close_fds(but=errpipe_write) - - if cwd is not None: - os.chdir(cwd) - - if preexec_fn: - apply(preexec_fn) - - if env is None: - os.execvp(executable, args) - else: - os.execvpe(executable, args, env) - - except KeyboardInterrupt: - raise # SCons: don't swallow keyboard interrupts - - except: - exc_type, exc_value, tb = sys.exc_info() - # Save the traceback and attach it to the exception object - exc_lines = traceback.format_exception(exc_type, - exc_value, - tb) - exc_value.child_traceback = string.join(exc_lines, '') - os.write(errpipe_write, pickle.dumps(exc_value)) - - # This exitcode won't be reported to applications, so it - # really doesn't matter what we return. - os._exit(255) - - # Parent - os.close(errpipe_write) - if p2cread and p2cwrite: - os.close(p2cread) - if c2pwrite and c2pread: - os.close(c2pwrite) - if errwrite and errread: - os.close(errwrite) - - # Wait for exec to fail or succeed; possibly raising exception - data = os.read(errpipe_read, 1048576) # Exceptions limited to 1 MB - os.close(errpipe_read) - if data != "": - os.waitpid(self.pid, 0) - child_exception = pickle.loads(data) - raise child_exception - - - def _handle_exitstatus(self, sts): - if os.WIFSIGNALED(sts): - self.returncode = -os.WTERMSIG(sts) - elif os.WIFEXITED(sts): - self.returncode = os.WEXITSTATUS(sts) - else: - # Should never happen - raise RuntimeError("Unknown child exit status!") - - - def poll(self, _deadstate=None): - """Check if child process has terminated. Returns returncode - attribute.""" - if self.returncode is None: - try: - pid, sts = os.waitpid(self.pid, os.WNOHANG) - if pid == self.pid: - self._handle_exitstatus(sts) - except os.error: - if _deadstate is not None: - self.returncode = _deadstate - return self.returncode - - - def wait(self): - """Wait for child process to terminate. Returns returncode - attribute.""" - if self.returncode is None: - pid, sts = os.waitpid(self.pid, 0) - self._handle_exitstatus(sts) - return self.returncode - - - def _communicate(self, input): - read_set = [] - write_set = [] - stdout = None # Return - stderr = None # Return - - if self.stdin: - # Flush stdio buffer. This might block, if the user has - # been writing to .stdin in an uncontrolled fashion. - self.stdin.flush() - if input: - write_set.append(self.stdin) - else: - self.stdin.close() - if self.stdout: - read_set.append(self.stdout) - stdout = [] - if self.stderr: - read_set.append(self.stderr) - stderr = [] - - input_offset = 0 - while read_set or write_set: - rlist, wlist, xlist = select.select(read_set, write_set, []) - - if self.stdin in wlist: - # When select has indicated that the file is writable, - # we can write up to PIPE_BUF bytes without risk - # blocking. POSIX defines PIPE_BUF >= 512 - bytes_written = os.write(self.stdin.fileno(), buffer(input, input_offset, 512)) - input_offset = input_offset + bytes_written - if input_offset >= len(input): - self.stdin.close() - write_set.remove(self.stdin) - - if self.stdout in rlist: - data = os.read(self.stdout.fileno(), 1024) - if data == "": - self.stdout.close() - read_set.remove(self.stdout) - stdout.append(data) - - if self.stderr in rlist: - data = os.read(self.stderr.fileno(), 1024) - if data == "": - self.stderr.close() - read_set.remove(self.stderr) - stderr.append(data) - - # All data exchanged. Translate lists into strings. - if stdout is not None: - stdout = string.join(stdout, '') - if stderr is not None: - stderr = string.join(stderr, '') - - # Translate newlines, if requested. We cannot let the file - # object do the translation: It is based on stdio, which is - # impossible to combine with select (unless forcing no - # buffering). - if self.universal_newlines and hasattr(file, 'newlines'): - if stdout: - stdout = self._translate_newlines(stdout) - if stderr: - stderr = self._translate_newlines(stderr) - - self.wait() - return (stdout, stderr) - - -def _demo_posix(): - # - # Example 1: Simple redirection: Get process list - # - plist = Popen(["ps"], stdout=PIPE).communicate()[0] - print "Process list:" - print plist - - # - # Example 2: Change uid before executing child - # - if os.getuid() == 0: - p = Popen(["id"], preexec_fn=lambda: os.setuid(100)) - p.wait() - - # - # Example 3: Connecting several subprocesses - # - print "Looking for 'hda'..." - p1 = Popen(["dmesg"], stdout=PIPE) - p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) - print repr(p2.communicate()[0]) - - # - # Example 4: Catch execution error - # - print - print "Trying a weird file..." - try: - print Popen(["/this/path/does/not/exist"]).communicate() - except OSError, e: - if e.errno == errno.ENOENT: - print "The file didn't exist. I thought so..." - print "Child traceback:" - print e.child_traceback - else: - print "Error", e.errno - else: - sys.stderr.write( "Gosh. No error.\n" ) - - -def _demo_windows(): - # - # Example 1: Connecting several subprocesses - # - print "Looking for 'PROMPT' in set output..." - p1 = Popen("set", stdout=PIPE, shell=True) - p2 = Popen('find "PROMPT"', stdin=p1.stdout, stdout=PIPE) - print repr(p2.communicate()[0]) - - # - # Example 2: Simple execution of program - # - print "Executing calc..." - p = Popen("calc") - p.wait() - - -if __name__ == "__main__": - if mswindows: - _demo_windows() - else: - _demo_posix() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/compat/_scons_textwrap.py b/share/scons-local-1.3.0/SCons/compat/_scons_textwrap.py deleted file mode 100644 index 81781af393ae46772e54bc96be169a042f4fcc02..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/compat/_scons_textwrap.py +++ /dev/null @@ -1,382 +0,0 @@ -"""Text wrapping and filling. -""" - -# Copyright (C) 1999-2001 Gregory P. Ward. -# Copyright (C) 2002, 2003 Python Software Foundation. -# Written by Greg Ward - -__revision__ = "$Id: textwrap.py,v 1.32.8.2 2004/05/13 01:48:15 gward Exp $" - -import string, re - -try: - unicode -except NameError: - class unicode: - pass - -# Do the right thing with boolean values for all known Python versions -# (so this module can be copied to projects that don't depend on Python -# 2.3, e.g. Optik and Docutils). -try: - True, False -except NameError: - (True, False) = (1, 0) - -__all__ = ['TextWrapper', 'wrap', 'fill'] - -# Hardcode the recognized whitespace characters to the US-ASCII -# whitespace characters. The main reason for doing this is that in -# ISO-8859-1, 0xa0 is non-breaking whitespace, so in certain locales -# that character winds up in string.whitespace. Respecting -# string.whitespace in those cases would 1) make textwrap treat 0xa0 the -# same as any other whitespace char, which is clearly wrong (it's a -# *non-breaking* space), 2) possibly cause problems with Unicode, -# since 0xa0 is not in range(128). -_whitespace = '\t\n\x0b\x0c\r ' - -class TextWrapper: - """ - Object for wrapping/filling text. The public interface consists of - the wrap() and fill() methods; the other methods are just there for - subclasses to override in order to tweak the default behaviour. - If you want to completely replace the main wrapping algorithm, - you'll probably have to override _wrap_chunks(). - - Several instance attributes control various aspects of wrapping: - width (default: 70) - the maximum width of wrapped lines (unless break_long_words - is false) - initial_indent (default: "") - string that will be prepended to the first line of wrapped - output. Counts towards the line's width. - subsequent_indent (default: "") - string that will be prepended to all lines save the first - of wrapped output; also counts towards each line's width. - expand_tabs (default: true) - Expand tabs in input text to spaces before further processing. - Each tab will become 1 .. 8 spaces, depending on its position in - its line. If false, each tab is treated as a single character. - replace_whitespace (default: true) - Replace all whitespace characters in the input text by spaces - after tab expansion. Note that if expand_tabs is false and - replace_whitespace is true, every tab will be converted to a - single space! - fix_sentence_endings (default: false) - Ensure that sentence-ending punctuation is always followed - by two spaces. Off by default because the algorithm is - (unavoidably) imperfect. - break_long_words (default: true) - Break words longer than 'width'. If false, those words will not - be broken, and some lines might be longer than 'width'. - """ - - whitespace_trans = string.maketrans(_whitespace, ' ' * len(_whitespace)) - - unicode_whitespace_trans = {} - try: - uspace = eval("ord(u' ')") - except SyntaxError: - # Python1.5 doesn't understand u'' syntax, in which case we - # won't actually use the unicode translation below, so it - # doesn't matter what value we put in the table. - uspace = ord(' ') - for x in map(ord, _whitespace): - unicode_whitespace_trans[x] = uspace - - # This funky little regex is just the trick for splitting - # text up into word-wrappable chunks. E.g. - # "Hello there -- you goof-ball, use the -b option!" - # splits into - # Hello/ /there/ /--/ /you/ /goof-/ball,/ /use/ /the/ /-b/ /option! - # (after stripping out empty strings). - try: - wordsep_re = re.compile(r'(\s+|' # any whitespace - r'[^\s\w]*\w{2,}-(?=\w{2,})|' # hyphenated words - r'(?<=[\w\!\"\'\&\.\,\?])-{2,}(?=\w))') # em-dash - except re.error: - # Pre-2.0 Python versions don't have the (?<= negative look-behind - # assertion. It mostly doesn't matter for the simple input - # SCons is going to give it, so just leave it out. - wordsep_re = re.compile(r'(\s+|' # any whitespace - r'-*\w{2,}-(?=\w{2,}))') # hyphenated words - - # XXX will there be a locale-or-charset-aware version of - # string.lowercase in 2.3? - sentence_end_re = re.compile(r'[%s]' # lowercase letter - r'[\.\!\?]' # sentence-ending punct. - r'[\"\']?' # optional end-of-quote - % string.lowercase) - - - def __init__(self, - width=70, - initial_indent="", - subsequent_indent="", - expand_tabs=True, - replace_whitespace=True, - fix_sentence_endings=False, - break_long_words=True): - self.width = width - self.initial_indent = initial_indent - self.subsequent_indent = subsequent_indent - self.expand_tabs = expand_tabs - self.replace_whitespace = replace_whitespace - self.fix_sentence_endings = fix_sentence_endings - self.break_long_words = break_long_words - - - # -- Private methods ----------------------------------------------- - # (possibly useful for subclasses to override) - - def _munge_whitespace(self, text): - """_munge_whitespace(text : string) -> string - - Munge whitespace in text: expand tabs and convert all other - whitespace characters to spaces. Eg. " foo\tbar\n\nbaz" - becomes " foo bar baz". - """ - if self.expand_tabs: - text = string.expandtabs(text) - if self.replace_whitespace: - if type(text) == type(''): - text = string.translate(text, self.whitespace_trans) - elif isinstance(text, unicode): - text = string.translate(text, self.unicode_whitespace_trans) - return text - - - def _split(self, text): - """_split(text : string) -> [string] - - Split the text to wrap into indivisible chunks. Chunks are - not quite the same as words; see wrap_chunks() for full - details. As an example, the text - Look, goof-ball -- use the -b option! - breaks into the following chunks: - 'Look,', ' ', 'goof-', 'ball', ' ', '--', ' ', - 'use', ' ', 'the', ' ', '-b', ' ', 'option!' - """ - chunks = self.wordsep_re.split(text) - chunks = filter(None, chunks) - return chunks - - def _fix_sentence_endings(self, chunks): - """_fix_sentence_endings(chunks : [string]) - - Correct for sentence endings buried in 'chunks'. Eg. when the - original text contains "... foo.\nBar ...", munge_whitespace() - and split() will convert that to [..., "foo.", " ", "Bar", ...] - which has one too few spaces; this method simply changes the one - space to two. - """ - i = 0 - pat = self.sentence_end_re - while i < len(chunks)-1: - if chunks[i+1] == " " and pat.search(chunks[i]): - chunks[i+1] = " " - i = i + 2 - else: - i = i + 1 - - def _handle_long_word(self, chunks, cur_line, cur_len, width): - """_handle_long_word(chunks : [string], - cur_line : [string], - cur_len : int, width : int) - - Handle a chunk of text (most likely a word, not whitespace) that - is too long to fit in any line. - """ - space_left = max(width - cur_len, 1) - - # If we're allowed to break long words, then do so: put as much - # of the next chunk onto the current line as will fit. - if self.break_long_words: - cur_line.append(chunks[0][0:space_left]) - chunks[0] = chunks[0][space_left:] - - # Otherwise, we have to preserve the long word intact. Only add - # it to the current line if there's nothing already there -- - # that minimizes how much we violate the width constraint. - elif not cur_line: - cur_line.append(chunks.pop(0)) - - # If we're not allowed to break long words, and there's already - # text on the current line, do nothing. Next time through the - # main loop of _wrap_chunks(), we'll wind up here again, but - # cur_len will be zero, so the next line will be entirely - # devoted to the long word that we can't handle right now. - - def _wrap_chunks(self, chunks): - """_wrap_chunks(chunks : [string]) -> [string] - - Wrap a sequence of text chunks and return a list of lines of - length 'self.width' or less. (If 'break_long_words' is false, - some lines may be longer than this.) Chunks correspond roughly - to words and the whitespace between them: each chunk is - indivisible (modulo 'break_long_words'), but a line break can - come between any two chunks. Chunks should not have internal - whitespace; ie. a chunk is either all whitespace or a "word". - Whitespace chunks will be removed from the beginning and end of - lines, but apart from that whitespace is preserved. - """ - lines = [] - if self.width <= 0: - raise ValueError("invalid width %r (must be > 0)" % self.width) - - while chunks: - - # Start the list of chunks that will make up the current line. - # cur_len is just the length of all the chunks in cur_line. - cur_line = [] - cur_len = 0 - - # Figure out which static string will prefix this line. - if lines: - indent = self.subsequent_indent - else: - indent = self.initial_indent - - # Maximum width for this line. - width = self.width - len(indent) - - # First chunk on line is whitespace -- drop it, unless this - # is the very beginning of the text (ie. no lines started yet). - if string.strip(chunks[0]) == '' and lines: - del chunks[0] - - while chunks: - l = len(chunks[0]) - - # Can at least squeeze this chunk onto the current line. - if cur_len + l <= width: - cur_line.append(chunks.pop(0)) - cur_len = cur_len + l - - # Nope, this line is full. - else: - break - - # The current line is full, and the next chunk is too big to - # fit on *any* line (not just this one). - if chunks and len(chunks[0]) > width: - self._handle_long_word(chunks, cur_line, cur_len, width) - - # If the last chunk on this line is all whitespace, drop it. - if cur_line and string.strip(cur_line[-1]) == '': - del cur_line[-1] - - # Convert current line back to a string and store it in list - # of all lines (return value). - if cur_line: - lines.append(indent + string.join(cur_line, '')) - - return lines - - - # -- Public interface ---------------------------------------------- - - def wrap(self, text): - """wrap(text : string) -> [string] - - Reformat the single paragraph in 'text' so it fits in lines of - no more than 'self.width' columns, and return a list of wrapped - lines. Tabs in 'text' are expanded with string.expandtabs(), - and all other whitespace characters (including newline) are - converted to space. - """ - text = self._munge_whitespace(text) - indent = self.initial_indent - chunks = self._split(text) - if self.fix_sentence_endings: - self._fix_sentence_endings(chunks) - return self._wrap_chunks(chunks) - - def fill(self, text): - """fill(text : string) -> string - - Reformat the single paragraph in 'text' to fit in lines of no - more than 'self.width' columns, and return a new string - containing the entire wrapped paragraph. - """ - return string.join(self.wrap(text), "\n") - - -# -- Convenience interface --------------------------------------------- - -def wrap(text, width=70, **kwargs): - """Wrap a single paragraph of text, returning a list of wrapped lines. - - Reformat the single paragraph in 'text' so it fits in lines of no - more than 'width' columns, and return a list of wrapped lines. By - default, tabs in 'text' are expanded with string.expandtabs(), and - all other whitespace characters (including newline) are converted to - space. See TextWrapper class for available keyword args to customize - wrapping behaviour. - """ - kw = kwargs.copy() - kw['width'] = width - w = apply(TextWrapper, (), kw) - return w.wrap(text) - -def fill(text, width=70, **kwargs): - """Fill a single paragraph of text, returning a new string. - - Reformat the single paragraph in 'text' to fit in lines of no more - than 'width' columns, and return a new string containing the entire - wrapped paragraph. As with wrap(), tabs are expanded and other - whitespace characters converted to space. See TextWrapper class for - available keyword args to customize wrapping behaviour. - """ - kw = kwargs.copy() - kw['width'] = width - w = apply(TextWrapper, (), kw) - return w.fill(text) - - -# -- Loosely related functionality ------------------------------------- - -def dedent(text): - """dedent(text : string) -> string - - Remove any whitespace than can be uniformly removed from the left - of every line in `text`. - - This can be used e.g. to make triple-quoted strings line up with - the left edge of screen/whatever, while still presenting it in the - source code in indented form. - - For example: - - def test(): - # end first line with \ to avoid the empty line! - s = '''\ - hello - world - ''' - print repr(s) # prints ' hello\n world\n ' - print repr(dedent(s)) # prints 'hello\n world\n' - """ - lines = text.expandtabs().split('\n') - margin = None - for line in lines: - content = line.lstrip() - if not content: - continue - indent = len(line) - len(content) - if margin is None: - margin = indent - else: - margin = min(margin, indent) - - if margin is not None and margin > 0: - for i in range(len(lines)): - lines[i] = lines[i][margin:] - - return string.join(lines, '\n') - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/compat/builtins.py b/share/scons-local-1.3.0/SCons/compat/builtins.py deleted file mode 100644 index e687885f5f9883dc48dc3cc55c19525e863560ca..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/compat/builtins.py +++ /dev/null @@ -1,187 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -# Portions of the following are derived from the compat.py file in -# Twisted, under the following copyright: -# -# Copyright (c) 2001-2004 Twisted Matrix Laboratories - -__doc__ = """ -Compatibility idioms for __builtin__ names - -This module adds names to the __builtin__ module for things that we want -to use in SCons but which don't show up until later Python versions than -the earliest ones we support. - -This module checks for the following __builtin__ names: - - all() - any() - bool() - dict() - True - False - zip() - -Implementations of functions are *NOT* guaranteed to be fully compliant -with these functions in later versions of Python. We are only concerned -with adding functionality that we actually use in SCons, so be wary -if you lift this code for other uses. (That said, making these more -nearly the same as later, official versions is still a desirable goal, -we just don't need to be obsessive about it.) - -If you're looking at this with pydoc and various names don't show up in -the FUNCTIONS or DATA output, that means those names are already built in -to this version of Python and we don't need to add them from this module. -""" - -__revision__ = "src/engine/SCons/compat/builtins.py 4720 2010/03/24 03:14:11 jars" - -import __builtin__ - -try: - all -except NameError: - # Pre-2.5 Python has no all() function. - def all(iterable): - """ - Returns True if all elements of the iterable are true. - """ - for element in iterable: - if not element: - return False - return True - __builtin__.all = all - all = all - -try: - any -except NameError: - # Pre-2.5 Python has no any() function. - def any(iterable): - """ - Returns True if any element of the iterable is true. - """ - for element in iterable: - if element: - return True - return False - __builtin__.any = any - any = any - -try: - bool -except NameError: - # Pre-2.2 Python has no bool() function. - def bool(value): - """Demote a value to 0 or 1, depending on its truth value. - - This is not to be confused with types.BooleanType, which is - way too hard to duplicate in early Python versions to be - worth the trouble. - """ - return not not value - __builtin__.bool = bool - bool = bool - -try: - dict -except NameError: - # Pre-2.2 Python has no dict() keyword. - def dict(seq=[], **kwargs): - """ - New dictionary initialization. - """ - d = {} - for k, v in seq: - d[k] = v - d.update(kwargs) - return d - __builtin__.dict = dict - -try: - False -except NameError: - # Pre-2.2 Python has no False keyword. - __builtin__.False = not 1 - # Assign to False in this module namespace so it shows up in pydoc output. - False = False - -try: - True -except NameError: - # Pre-2.2 Python has no True keyword. - __builtin__.True = not 0 - # Assign to True in this module namespace so it shows up in pydoc output. - True = True - -try: - file -except NameError: - # Pre-2.2 Python has no file() function. - __builtin__.file = open - -# -try: - zip -except NameError: - # Pre-2.2 Python has no zip() function. - def zip(*lists): - """ - Emulates the behavior we need from the built-in zip() function - added in Python 2.2. - - Returns a list of tuples, where each tuple contains the i-th - element rom each of the argument sequences. The returned - list is truncated in length to the length of the shortest - argument sequence. - """ - result = [] - for i in xrange(min(map(len, lists))): - result.append(tuple(map(lambda l, i=i: l[i], lists))) - return result - __builtin__.zip = zip - - - -#if sys.version_info[:3] in ((2, 2, 0), (2, 2, 1)): -# def lstrip(s, c=string.whitespace): -# while s and s[0] in c: -# s = s[1:] -# return s -# def rstrip(s, c=string.whitespace): -# while s and s[-1] in c: -# s = s[:-1] -# return s -# def strip(s, c=string.whitespace, l=lstrip, r=rstrip): -# return l(r(s, c), c) -# -# object.__setattr__(str, 'lstrip', lstrip) -# object.__setattr__(str, 'rstrip', rstrip) -# object.__setattr__(str, 'strip', strip) - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/cpp.py b/share/scons-local-1.3.0/SCons/cpp.py deleted file mode 100644 index 485ba6e81c35c71402c78972fafbc6da3cf2391c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/cpp.py +++ /dev/null @@ -1,598 +0,0 @@ -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/cpp.py 4720 2010/03/24 03:14:11 jars" - -__doc__ = """ -SCons C Pre-Processor module -""" - -# TODO(1.5): remove this import -# This module doesn't use anything from SCons by name, but we import SCons -# here to pull in zip() from the SCons.compat layer for early Pythons. -import SCons - -import os -import re -import string - -# -# First "subsystem" of regular expressions that we set up: -# -# Stuff to turn the C preprocessor directives in a file's contents into -# a list of tuples that we can process easily. -# - -# A table of regular expressions that fetch the arguments from the rest of -# a C preprocessor line. Different directives have different arguments -# that we want to fetch, using the regular expressions to which the lists -# of preprocessor directives map. -cpp_lines_dict = { - # Fetch the rest of a #if/#elif/#ifdef/#ifndef as one argument, - # separated from the keyword by white space. - ('if', 'elif', 'ifdef', 'ifndef',) - : '\s+(.+)', - - # Fetch the rest of a #import/#include/#include_next line as one - # argument, with white space optional. - ('import', 'include', 'include_next',) - : '\s*(.+)', - - # We don't care what comes after a #else or #endif line. - ('else', 'endif',) : '', - - # Fetch three arguments from a #define line: - # 1) The #defined keyword. - # 2) The optional parentheses and arguments (if it's a function-like - # macro, '' if it's not). - # 3) The expansion value. - ('define',) : '\s+([_A-Za-z][_A-Za-z0-9_]*)(\([^)]*\))?\s*(.*)', - - # Fetch the #undefed keyword from a #undef line. - ('undef',) : '\s+([_A-Za-z][A-Za-z0-9_]*)', -} - -# Create a table that maps each individual C preprocessor directive to -# the corresponding compiled regular expression that fetches the arguments -# we care about. -Table = {} -for op_list, expr in cpp_lines_dict.items(): - e = re.compile(expr) - for op in op_list: - Table[op] = e -del e -del op -del op_list - -# Create a list of the expressions we'll use to match all of the -# preprocessor directives. These are the same as the directives -# themselves *except* that we must use a negative lookahead assertion -# when matching "if" so it doesn't match the "if" in "ifdef." -override = { - 'if' : 'if(?!def)', -} -l = map(lambda x, o=override: o.get(x, x), Table.keys()) - - -# Turn the list of expressions into one big honkin' regular expression -# that will match all the preprocessor lines at once. This will return -# a list of tuples, one for each preprocessor line. The preprocessor -# directive will be the first element in each tuple, and the rest of -# the line will be the second element. -e = '^\s*#\s*(' + string.join(l, '|') + ')(.*)$' - -# And last but not least, compile the expression. -CPP_Expression = re.compile(e, re.M) - - - - -# -# Second "subsystem" of regular expressions that we set up: -# -# Stuff to translate a C preprocessor expression (as found on a #if or -# #elif line) into an equivalent Python expression that we can eval(). -# - -# A dictionary that maps the C representation of Boolean operators -# to their Python equivalents. -CPP_to_Python_Ops_Dict = { - '!' : ' not ', - '!=' : ' != ', - '&&' : ' and ', - '||' : ' or ', - '?' : ' and ', - ':' : ' or ', - '\r' : '', -} - -CPP_to_Python_Ops_Sub = lambda m, d=CPP_to_Python_Ops_Dict: d[m.group(0)] - -# We have to sort the keys by length so that longer expressions -# come *before* shorter expressions--in particular, "!=" must -# come before "!" in the alternation. Without this, the Python -# re module, as late as version 2.2.2, empirically matches the -# "!" in "!=" first, instead of finding the longest match. -# What's up with that? -l = CPP_to_Python_Ops_Dict.keys() -l.sort(lambda a, b: cmp(len(b), len(a))) - -# Turn the list of keys into one regular expression that will allow us -# to substitute all of the operators at once. -expr = string.join(map(re.escape, l), '|') - -# ...and compile the expression. -CPP_to_Python_Ops_Expression = re.compile(expr) - -# A separate list of expressions to be evaluated and substituted -# sequentially, not all at once. -CPP_to_Python_Eval_List = [ - ['defined\s+(\w+)', '__dict__.has_key("\\1")'], - ['defined\s*\((\w+)\)', '__dict__.has_key("\\1")'], - ['/\*.*\*/', ''], - ['/\*.*', ''], - ['//.*', ''], - ['(0x[0-9A-Fa-f]*)[UL]+', '\\1L'], -] - -# Replace the string representations of the regular expressions in the -# list with compiled versions. -for l in CPP_to_Python_Eval_List: - l[0] = re.compile(l[0]) - -# Wrap up all of the above into a handy function. -def CPP_to_Python(s): - """ - Converts a C pre-processor expression into an equivalent - Python expression that can be evaluated. - """ - s = CPP_to_Python_Ops_Expression.sub(CPP_to_Python_Ops_Sub, s) - for expr, repl in CPP_to_Python_Eval_List: - s = expr.sub(repl, s) - return s - - - -del expr -del l -del override - - - -class FunctionEvaluator: - """ - Handles delayed evaluation of a #define function call. - """ - def __init__(self, name, args, expansion): - """ - Squirrels away the arguments and expansion value of a #define - macro function for later evaluation when we must actually expand - a value that uses it. - """ - self.name = name - self.args = function_arg_separator.split(args) - try: - expansion = string.split(expansion, '##') - except (AttributeError, TypeError): - # Python 1.5 throws TypeError if "expansion" isn't a string, - # later versions throw AttributeError. - pass - self.expansion = expansion - def __call__(self, *values): - """ - Evaluates the expansion of a #define macro function called - with the specified values. - """ - if len(self.args) != len(values): - raise ValueError, "Incorrect number of arguments to `%s'" % self.name - # Create a dictionary that maps the macro arguments to the - # corresponding values in this "call." We'll use this when we - # eval() the expansion so that arguments will get expanded to - # the right values. - locals = {} - for k, v in zip(self.args, values): - locals[k] = v - - parts = [] - for s in self.expansion: - if not s in self.args: - s = repr(s) - parts.append(s) - statement = string.join(parts, ' + ') - - return eval(statement, globals(), locals) - - - -# Find line continuations. -line_continuations = re.compile('\\\\\r?\n') - -# Search for a "function call" macro on an expansion. Returns the -# two-tuple of the "function" name itself, and a string containing the -# arguments within the call parentheses. -function_name = re.compile('(\S+)\(([^)]*)\)') - -# Split a string containing comma-separated function call arguments into -# the separate arguments. -function_arg_separator = re.compile(',\s*') - - - -class PreProcessor: - """ - The main workhorse class for handling C pre-processing. - """ - def __init__(self, current=os.curdir, cpppath=(), dict={}, all=0): - global Table - - cpppath = tuple(cpppath) - - self.searchpath = { - '"' : (current,) + cpppath, - '<' : cpppath + (current,), - } - - # Initialize our C preprocessor namespace for tracking the - # values of #defined keywords. We use this namespace to look - # for keywords on #ifdef/#ifndef lines, and to eval() the - # expressions on #if/#elif lines (after massaging them from C to - # Python). - self.cpp_namespace = dict.copy() - self.cpp_namespace['__dict__'] = self.cpp_namespace - - if all: - self.do_include = self.all_include - - # For efficiency, a dispatch table maps each C preprocessor - # directive (#if, #define, etc.) to the method that should be - # called when we see it. We accomodate state changes (#if, - # #ifdef, #ifndef) by pushing the current dispatch table on a - # stack and changing what method gets called for each relevant - # directive we might see next at this level (#else, #elif). - # #endif will simply pop the stack. - d = { - 'scons_current_file' : self.scons_current_file - } - for op in Table.keys(): - d[op] = getattr(self, 'do_' + op) - self.default_table = d - - # Controlling methods. - - def tupleize(self, contents): - """ - Turns the contents of a file into a list of easily-processed - tuples describing the CPP lines in the file. - - The first element of each tuple is the line's preprocessor - directive (#if, #include, #define, etc., minus the initial '#'). - The remaining elements are specific to the type of directive, as - pulled apart by the regular expression. - """ - global CPP_Expression, Table - contents = line_continuations.sub('', contents) - cpp_tuples = CPP_Expression.findall(contents) - return map(lambda m, t=Table: - (m[0],) + t[m[0]].match(m[1]).groups(), - cpp_tuples) - - def __call__(self, file): - """ - Pre-processes a file. - - This is the main public entry point. - """ - self.current_file = file - return self.process_contents(self.read_file(file), file) - - def process_contents(self, contents, fname=None): - """ - Pre-processes a file contents. - - This is the main internal entry point. - """ - self.stack = [] - self.dispatch_table = self.default_table.copy() - self.current_file = fname - self.tuples = self.tupleize(contents) - - self.initialize_result(fname) - while self.tuples: - t = self.tuples.pop(0) - # Uncomment to see the list of tuples being processed (e.g., - # to validate the CPP lines are being translated correctly). - #print t - self.dispatch_table[t[0]](t) - return self.finalize_result(fname) - - # Dispatch table stack manipulation methods. - - def save(self): - """ - Pushes the current dispatch table on the stack and re-initializes - the current dispatch table to the default. - """ - self.stack.append(self.dispatch_table) - self.dispatch_table = self.default_table.copy() - - def restore(self): - """ - Pops the previous dispatch table off the stack and makes it the - current one. - """ - try: self.dispatch_table = self.stack.pop() - except IndexError: pass - - # Utility methods. - - def do_nothing(self, t): - """ - Null method for when we explicitly want the action for a - specific preprocessor directive to do nothing. - """ - pass - - def scons_current_file(self, t): - self.current_file = t[1] - - def eval_expression(self, t): - """ - Evaluates a C preprocessor expression. - - This is done by converting it to a Python equivalent and - eval()ing it in the C preprocessor namespace we use to - track #define values. - """ - t = CPP_to_Python(string.join(t[1:])) - try: return eval(t, self.cpp_namespace) - except (NameError, TypeError): return 0 - - def initialize_result(self, fname): - self.result = [fname] - - def finalize_result(self, fname): - return self.result[1:] - - def find_include_file(self, t): - """ - Finds the #include file for a given preprocessor tuple. - """ - fname = t[2] - for d in self.searchpath[t[1]]: - if d == os.curdir: - f = fname - else: - f = os.path.join(d, fname) - if os.path.isfile(f): - return f - return None - - def read_file(self, file): - return open(file).read() - - # Start and stop processing include lines. - - def start_handling_includes(self, t=None): - """ - Causes the PreProcessor object to start processing #import, - #include and #include_next lines. - - This method will be called when a #if, #ifdef, #ifndef or #elif - evaluates True, or when we reach the #else in a #if, #ifdef, - #ifndef or #elif block where a condition already evaluated - False. - - """ - d = self.dispatch_table - d['import'] = self.do_import - d['include'] = self.do_include - d['include_next'] = self.do_include - - def stop_handling_includes(self, t=None): - """ - Causes the PreProcessor object to stop processing #import, - #include and #include_next lines. - - This method will be called when a #if, #ifdef, #ifndef or #elif - evaluates False, or when we reach the #else in a #if, #ifdef, - #ifndef or #elif block where a condition already evaluated True. - """ - d = self.dispatch_table - d['import'] = self.do_nothing - d['include'] = self.do_nothing - d['include_next'] = self.do_nothing - - # Default methods for handling all of the preprocessor directives. - # (Note that what actually gets called for a given directive at any - # point in time is really controlled by the dispatch_table.) - - def _do_if_else_condition(self, condition): - """ - Common logic for evaluating the conditions on #if, #ifdef and - #ifndef lines. - """ - self.save() - d = self.dispatch_table - if condition: - self.start_handling_includes() - d['elif'] = self.stop_handling_includes - d['else'] = self.stop_handling_includes - else: - self.stop_handling_includes() - d['elif'] = self.do_elif - d['else'] = self.start_handling_includes - - def do_ifdef(self, t): - """ - Default handling of a #ifdef line. - """ - self._do_if_else_condition(self.cpp_namespace.has_key(t[1])) - - def do_ifndef(self, t): - """ - Default handling of a #ifndef line. - """ - self._do_if_else_condition(not self.cpp_namespace.has_key(t[1])) - - def do_if(self, t): - """ - Default handling of a #if line. - """ - self._do_if_else_condition(self.eval_expression(t)) - - def do_elif(self, t): - """ - Default handling of a #elif line. - """ - d = self.dispatch_table - if self.eval_expression(t): - self.start_handling_includes() - d['elif'] = self.stop_handling_includes - d['else'] = self.stop_handling_includes - - def do_else(self, t): - """ - Default handling of a #else line. - """ - pass - - def do_endif(self, t): - """ - Default handling of a #endif line. - """ - self.restore() - - def do_define(self, t): - """ - Default handling of a #define line. - """ - _, name, args, expansion = t - try: - expansion = int(expansion) - except (TypeError, ValueError): - pass - if args: - evaluator = FunctionEvaluator(name, args[1:-1], expansion) - self.cpp_namespace[name] = evaluator - else: - self.cpp_namespace[name] = expansion - - def do_undef(self, t): - """ - Default handling of a #undef line. - """ - try: del self.cpp_namespace[t[1]] - except KeyError: pass - - def do_import(self, t): - """ - Default handling of a #import line. - """ - # XXX finish this -- maybe borrow/share logic from do_include()...? - pass - - def do_include(self, t): - """ - Default handling of a #include line. - """ - t = self.resolve_include(t) - include_file = self.find_include_file(t) - if include_file: - #print "include_file =", include_file - self.result.append(include_file) - contents = self.read_file(include_file) - new_tuples = [('scons_current_file', include_file)] + \ - self.tupleize(contents) + \ - [('scons_current_file', self.current_file)] - self.tuples[:] = new_tuples + self.tuples - - # Date: Tue, 22 Nov 2005 20:26:09 -0500 - # From: Stefan Seefeld - # - # By the way, #include_next is not the same as #include. The difference - # being that #include_next starts its search in the path following the - # path that let to the including file. In other words, if your system - # include paths are ['/foo', '/bar'], and you are looking at a header - # '/foo/baz.h', it might issue an '#include_next ' which would - # correctly resolve to '/bar/baz.h' (if that exists), but *not* see - # '/foo/baz.h' again. See http://www.delorie.com/gnu/docs/gcc/cpp_11.html - # for more reasoning. - # - # I have no idea in what context 'import' might be used. - - # XXX is #include_next really the same as #include ? - do_include_next = do_include - - # Utility methods for handling resolution of include files. - - def resolve_include(self, t): - """Resolve a tuple-ized #include line. - - This handles recursive expansion of values without "" or <> - surrounding the name until an initial " or < is found, to handle - #include FILE - where FILE is a #define somewhere else. - """ - s = t[1] - while not s[0] in '<"': - #print "s =", s - try: - s = self.cpp_namespace[s] - except KeyError: - m = function_name.search(s) - s = self.cpp_namespace[m.group(1)] - if callable(s): - args = function_arg_separator.split(m.group(2)) - s = apply(s, args) - if not s: - return None - return (t[0], s[0], s[1:-1]) - - def all_include(self, t): - """ - """ - self.result.append(self.resolve_include(t)) - -class DumbPreProcessor(PreProcessor): - """A preprocessor that ignores all #if/#elif/#else/#endif directives - and just reports back *all* of the #include files (like the classic - SCons scanner did). - - This is functionally equivalent to using a regular expression to - find all of the #include lines, only slower. It exists mainly as - an example of how the main PreProcessor class can be sub-classed - to tailor its behavior. - """ - def __init__(self, *args, **kw): - apply(PreProcessor.__init__, (self,)+args, kw) - d = self.default_table - for func in ['if', 'elif', 'else', 'endif', 'ifdef', 'ifndef']: - d[func] = d[func] = self.do_nothing - -del __revision__ - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/dblite.py b/share/scons-local-1.3.0/SCons/dblite.py deleted file mode 100644 index bcb2aa00ad451fdfc7d23279ab7bb742025c4a7e..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/dblite.py +++ /dev/null @@ -1,248 +0,0 @@ -# dblite.py module contributed by Ralf W. Grosse-Kunstleve. -# Extended for Unicode by Steven Knight. - -import cPickle -import time -import shutil -import os -import types -import __builtin__ - -keep_all_files = 00000 -ignore_corrupt_dbfiles = 0 - -def corruption_warning(filename): - print "Warning: Discarding corrupt database:", filename - -if hasattr(types, 'UnicodeType'): - def is_string(s): - t = type(s) - return t is types.StringType or t is types.UnicodeType -else: - def is_string(s): - return type(s) is types.StringType - -try: - unicode('a') -except NameError: - def unicode(s): return s - -dblite_suffix = '.dblite' -tmp_suffix = '.tmp' - -class dblite: - - # Squirrel away references to the functions in various modules - # that we'll use when our __del__() method calls our sync() method - # during shutdown. We might get destroyed when Python is in the midst - # of tearing down the different modules we import in an essentially - # arbitrary order, and some of the various modules's global attributes - # may already be wiped out from under us. - # - # See the discussion at: - # http://mail.python.org/pipermail/python-bugs-list/2003-March/016877.html - - _open = __builtin__.open - _cPickle_dump = cPickle.dump - _os_chmod = os.chmod - try: - _os_chown = os.chown - except AttributeError: - _os_chown = None - _os_rename = os.rename - _os_unlink = os.unlink - _shutil_copyfile = shutil.copyfile - _time_time = time.time - - def __init__(self, file_base_name, flag, mode): - assert flag in (None, "r", "w", "c", "n") - if (flag is None): flag = "r" - base, ext = os.path.splitext(file_base_name) - if ext == dblite_suffix: - # There's already a suffix on the file name, don't add one. - self._file_name = file_base_name - self._tmp_name = base + tmp_suffix - else: - self._file_name = file_base_name + dblite_suffix - self._tmp_name = file_base_name + tmp_suffix - self._flag = flag - self._mode = mode - self._dict = {} - self._needs_sync = 00000 - if self._os_chown is not None and (os.geteuid()==0 or os.getuid()==0): - # running as root; chown back to current owner/group when done - try: - statinfo = os.stat(self._file_name) - self._chown_to = statinfo.st_uid - self._chgrp_to = statinfo.st_gid - except OSError, e: - # db file doesn't exist yet. - # Check os.environ for SUDO_UID, use if set - self._chown_to = int(os.environ.get('SUDO_UID', -1)) - self._chgrp_to = int(os.environ.get('SUDO_GID', -1)) - else: - self._chown_to = -1 # don't chown - self._chgrp_to = -1 # don't chgrp - if (self._flag == "n"): - self._open(self._file_name, "wb", self._mode) - else: - try: - f = self._open(self._file_name, "rb") - except IOError, e: - if (self._flag != "c"): - raise e - self._open(self._file_name, "wb", self._mode) - else: - p = f.read() - if (len(p) > 0): - try: - self._dict = cPickle.loads(p) - except (cPickle.UnpicklingError, EOFError): - if (ignore_corrupt_dbfiles == 0): raise - if (ignore_corrupt_dbfiles == 1): - corruption_warning(self._file_name) - - def __del__(self): - if (self._needs_sync): - self.sync() - - def sync(self): - self._check_writable() - f = self._open(self._tmp_name, "wb", self._mode) - self._cPickle_dump(self._dict, f, 1) - f.close() - # Windows doesn't allow renaming if the file exists, so unlink - # it first, chmod'ing it to make sure we can do so. On UNIX, we - # may not be able to chmod the file if it's owned by someone else - # (e.g. from a previous run as root). We should still be able to - # unlink() the file if the directory's writable, though, so ignore - # any OSError exception thrown by the chmod() call. - try: self._os_chmod(self._file_name, 0777) - except OSError: pass - self._os_unlink(self._file_name) - self._os_rename(self._tmp_name, self._file_name) - if self._os_chown is not None and self._chown_to > 0: # don't chown to root or -1 - try: - self._os_chown(self._file_name, self._chown_to, self._chgrp_to) - except OSError: - pass - self._needs_sync = 00000 - if (keep_all_files): - self._shutil_copyfile( - self._file_name, - self._file_name + "_" + str(int(self._time_time()))) - - def _check_writable(self): - if (self._flag == "r"): - raise IOError("Read-only database: %s" % self._file_name) - - def __getitem__(self, key): - return self._dict[key] - - def __setitem__(self, key, value): - self._check_writable() - if (not is_string(key)): - raise TypeError, "key `%s' must be a string but is %s" % (key, type(key)) - if (not is_string(value)): - raise TypeError, "value `%s' must be a string but is %s" % (value, type(value)) - self._dict[key] = value - self._needs_sync = 0001 - - def keys(self): - return self._dict.keys() - - def has_key(self, key): - return key in self._dict - - def __contains__(self, key): - return key in self._dict - - def iterkeys(self): - return self._dict.iterkeys() - - __iter__ = iterkeys - - def __len__(self): - return len(self._dict) - -def open(file, flag=None, mode=0666): - return dblite(file, flag, mode) - -def _exercise(): - db = open("tmp", "n") - assert len(db) == 0 - db["foo"] = "bar" - assert db["foo"] == "bar" - db[unicode("ufoo")] = unicode("ubar") - assert db[unicode("ufoo")] == unicode("ubar") - db.sync() - db = open("tmp", "c") - assert len(db) == 2, len(db) - assert db["foo"] == "bar" - db["bar"] = "foo" - assert db["bar"] == "foo" - db[unicode("ubar")] = unicode("ufoo") - assert db[unicode("ubar")] == unicode("ufoo") - db.sync() - db = open("tmp", "r") - assert len(db) == 4, len(db) - assert db["foo"] == "bar" - assert db["bar"] == "foo" - assert db[unicode("ufoo")] == unicode("ubar") - assert db[unicode("ubar")] == unicode("ufoo") - try: - db.sync() - except IOError, e: - assert str(e) == "Read-only database: tmp.dblite" - else: - raise RuntimeError, "IOError expected." - db = open("tmp", "w") - assert len(db) == 4 - db["ping"] = "pong" - db.sync() - try: - db[(1,2)] = "tuple" - except TypeError, e: - assert str(e) == "key `(1, 2)' must be a string but is ", str(e) - else: - raise RuntimeError, "TypeError exception expected" - try: - db["list"] = [1,2] - except TypeError, e: - assert str(e) == "value `[1, 2]' must be a string but is ", str(e) - else: - raise RuntimeError, "TypeError exception expected" - db = open("tmp", "r") - assert len(db) == 5 - db = open("tmp", "n") - assert len(db) == 0 - _open("tmp.dblite", "w") - db = open("tmp", "r") - _open("tmp.dblite", "w").write("x") - try: - db = open("tmp", "r") - except cPickle.UnpicklingError: - pass - else: - raise RuntimeError, "cPickle exception expected." - global ignore_corrupt_dbfiles - ignore_corrupt_dbfiles = 2 - db = open("tmp", "r") - assert len(db) == 0 - os.unlink("tmp.dblite") - try: - db = open("tmp", "w") - except IOError, e: - assert str(e) == "[Errno 2] No such file or directory: 'tmp.dblite'", str(e) - else: - raise RuntimeError, "IOError expected." - print "OK" - -if (__name__ == "__main__"): - _exercise() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/SCons/exitfuncs.py b/share/scons-local-1.3.0/SCons/exitfuncs.py deleted file mode 100644 index 6c75d01f889cac3bc2c4067e00929f12cccc9f1c..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/SCons/exitfuncs.py +++ /dev/null @@ -1,77 +0,0 @@ -"""SCons.exitfuncs - -Register functions which are executed when SCons exits for any reason. - -""" - -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/engine/SCons/exitfuncs.py 4720 2010/03/24 03:14:11 jars" - - - -_exithandlers = [] -def _run_exitfuncs(): - """run any registered exit functions - - _exithandlers is traversed in reverse order so functions are executed - last in, first out. - """ - - while _exithandlers: - func, targs, kargs = _exithandlers.pop() - apply(func, targs, kargs) - -def register(func, *targs, **kargs): - """register a function to be executed upon normal program termination - - func - function to be called at exit - targs - optional arguments to pass to func - kargs - optional keyword arguments to pass to func - """ - _exithandlers.append((func, targs, kargs)) - -import sys - -try: - x = sys.exitfunc - - # if x isn't our own exit func executive, assume it's another - # registered exit function - append it to our list... - if x != _run_exitfuncs: - register(x) - -except AttributeError: - pass - -# make our exit function get run by python when it exits: -sys.exitfunc = _run_exitfuncs - -del sys - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/scons-local-1.3.0/scons-1.3.0.egg-info b/share/scons-local-1.3.0/scons-1.3.0.egg-info deleted file mode 100644 index 3c3ed9182d59d4d1d0ca06fa18206b892845f979..0000000000000000000000000000000000000000 --- a/share/scons-local-1.3.0/scons-1.3.0.egg-info +++ /dev/null @@ -1,13 +0,0 @@ -Metadata-Version: 1.0 -Name: scons -Version: 1.3.0 -Summary: Open Source next-generation build tool. -Home-page: http://www.scons.org/ -Author: Steven Knight -Author-email: knight@baldmt.com -License: UNKNOWN -Description: Open Source next-generation build tool. - Improved, cross-platform substitute for the classic Make - utility. In short, SCons is an easier, more reliable - and faster way to build software. -Platform: UNKNOWN diff --git a/share/scons.py b/share/scons.py deleted file mode 100644 index 7fe4c60cdfa93af857c1221909dd8c633b792be4..0000000000000000000000000000000000000000 --- a/share/scons.py +++ /dev/null @@ -1,197 +0,0 @@ -#! /usr/bin/env python -# -# SCons - a Software Constructor -# -# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation -# -# Permission is hereby granted, free of charge, to any person obtaining -# a copy of this software and associated documentation files (the -# "Software"), to deal in the Software without restriction, including -# without limitation the rights to use, copy, modify, merge, publish, -# distribute, sublicense, and/or sell copies of the Software, and to -# permit persons to whom the Software is furnished to do so, subject to -# the following conditions: -# -# The above copyright notice and this permission notice shall be included -# in all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY -# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -# - -__revision__ = "src/script/scons.py 4720 2010/03/24 03:14:11 jars" - -__version__ = "1.3.0" - -__build__ = "r4720" - -__buildsys__ = "jars-desktop" - -__date__ = "2010/03/24 03:14:11" - -__developer__ = "jars" - -import os -import os.path -import sys - -############################################################################## -# BEGIN STANDARD SCons SCRIPT HEADER -# -# This is the cut-and-paste logic so that a self-contained script can -# interoperate correctly with different SCons versions and installation -# locations for the engine. If you modify anything in this section, you -# should also change other scripts that use this same header. -############################################################################## - -# Strip the script directory from sys.path() so on case-insensitive -# (WIN32) systems Python doesn't think that the "scons" script is the -# "SCons" package. Replace it with our own library directories -# (version-specific first, in case they installed by hand there, -# followed by generic) so we pick up the right version of the build -# engine modules if they're in either directory. - - -# Check to see if the python version is > 3.0 which is currently unsupported -# If so exit with error message -try: - if sys.version_info >= (3,0,0): - msg = "scons: *** SCons version %s does not run under Python version %s.\n" - sys.stderr.write(msg % (__version__, sys.version.split()[0])) - sys.exit(1) -except AttributeError: - # Pre-1.6 Python has no sys.version_info - # No need to check version as we then know the version is < 3.0.0 and supported - pass - -script_dir = sys.path[0] - -if script_dir in sys.path: - sys.path.remove(script_dir) - -libs = [] - -if os.environ.has_key("SCONS_LIB_DIR"): - libs.append(os.environ["SCONS_LIB_DIR"]) - -local_version = 'scons-local-' + __version__ -local = 'scons-local' -if script_dir: - local_version = os.path.join(script_dir, local_version) - local = os.path.join(script_dir, local) -libs.append(os.path.abspath(local_version)) -libs.append(os.path.abspath(local)) - -scons_version = 'scons-%s' % __version__ - -prefs = [] - -if sys.platform == 'win32': - # sys.prefix is (likely) C:\Python*; - # check only C:\Python*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, 'Lib', 'site-packages')) -else: - # On other (POSIX) platforms, things are more complicated due to - # the variety of path names and library locations. Try to be smart - # about it. - if script_dir == 'bin': - # script_dir is `pwd`/bin; - # check `pwd`/lib/scons*. - prefs.append(os.getcwd()) - else: - if script_dir == '.' or script_dir == '': - script_dir = os.getcwd() - head, tail = os.path.split(script_dir) - if tail == "bin": - # script_dir is /foo/bin; - # check /foo/lib/scons*. - prefs.append(head) - - head, tail = os.path.split(sys.prefix) - if tail == "usr": - # sys.prefix is /foo/usr; - # check /foo/usr/lib/scons* first, - # then /foo/usr/local/lib/scons*. - prefs.append(sys.prefix) - prefs.append(os.path.join(sys.prefix, "local")) - elif tail == "local": - h, t = os.path.split(head) - if t == "usr": - # sys.prefix is /foo/usr/local; - # check /foo/usr/local/lib/scons* first, - # then /foo/usr/lib/scons*. - prefs.append(sys.prefix) - prefs.append(head) - else: - # sys.prefix is /foo/local; - # check only /foo/local/lib/scons*. - prefs.append(sys.prefix) - else: - # sys.prefix is /foo (ends in neither /usr or /local); - # check only /foo/lib/scons*. - prefs.append(sys.prefix) - - temp = map(lambda x: os.path.join(x, 'lib'), prefs) - temp.extend(map(lambda x: os.path.join(x, - 'lib', - 'python' + sys.version[:3], - 'site-packages'), - prefs)) - prefs = temp - - # Add the parent directory of the current python's library to the - # preferences. On SuSE-91/AMD64, for example, this is /usr/lib64, - # not /usr/lib. - try: - libpath = os.__file__ - except AttributeError: - pass - else: - # Split /usr/libfoo/python*/os.py to /usr/libfoo/python*. - libpath, tail = os.path.split(libpath) - # Split /usr/libfoo/python* to /usr/libfoo - libpath, tail = os.path.split(libpath) - # Check /usr/libfoo/scons*. - prefs.append(libpath) - - try: - import pkg_resources - except ImportError: - pass - else: - # when running from an egg add the egg's directory - try: - d = pkg_resources.get_distribution('scons') - except pkg_resources.DistributionNotFound: - pass - else: - prefs.append(d.location) - -# Look first for 'scons-__version__' in all of our preference libs, -# then for 'scons'. -libs.extend(map(lambda x: os.path.join(x, scons_version), prefs)) -libs.extend(map(lambda x: os.path.join(x, 'scons'), prefs)) - -sys.path = libs + sys.path - -############################################################################## -# END STANDARD SCons SCRIPT HEADER -############################################################################## - -if __name__ == "__main__": - import SCons.Script - # this does all the work, and calls sys.exit - # with the proper exit status when done. - SCons.Script.main() - -# Local Variables: -# tab-width:4 -# indent-tabs-mode:nil -# End: -# vim: set expandtab tabstop=4 shiftwidth=4: diff --git a/share/yidl/include/yidl.h b/share/yidl/include/yidl.h deleted file mode 100644 index ae7f9dd139bbb062464da568c29711fd725f7c86..0000000000000000000000000000000000000000 --- a/share/yidl/include/yidl.h +++ /dev/null @@ -1,1297 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the yidl project. -// It is licensed under the New BSD license: -// -// 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 the yidl project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _YIDL_H_ -#define _YIDL_H_ - -#define __STDC_LIMIT_MACROS - -#ifdef _WIN32 - -// msstdint.h -// ISO C9x compliant stdint.h for Microsoft Visual Studio -// Based on ISO/IEC 9899:TC2 Committee draft (May 6, 2005) WG14/N1124 -// -// Copyright (c) 2006-2008 Alexander Chemeris -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. The name of the author may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; -// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, -// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -// -/////////////////////////////////////////////////////////////////////////////// - -#include - -// For Visual Studio 6 in C++ mode wrap include with 'extern "C++" {}' -// or compiler give many errors like this: -// error C2733: second C linkage of overloaded function 'wmemchr' not allowed -#if (_MSC_VER < 1300) && defined(__cplusplus) - extern "C++" { -#endif -# include -#if (_MSC_VER < 1300) && defined(__cplusplus) - } -#endif - -// Define _W64 macros to mark types changing their size, like intptr_t. -#ifndef _W64 -# if !defined(__midl) && (defined(_X86_) || defined(_M_IX86)) && _MSC_VER >= 1300 -# define _W64 __w64 -# else -# define _W64 -# endif -#endif - - -// 7.18.1 Integer types - -// 7.18.1.1 Exact-width integer types -typedef __int8 int8_t; -typedef __int16 int16_t; -typedef __int32 int32_t; -typedef __int64 int64_t; -typedef unsigned __int8 uint8_t; -typedef unsigned __int16 uint16_t; -typedef unsigned __int32 uint32_t; -typedef unsigned __int64 uint64_t; - -// 7.18.1.2 Minimum-width integer types -typedef int8_t int_least8_t; -typedef int16_t int_least16_t; -typedef int32_t int_least32_t; -typedef int64_t int_least64_t; -typedef uint8_t uint_least8_t; -typedef uint16_t uint_least16_t; -typedef uint32_t uint_least32_t; -typedef uint64_t uint_least64_t; - -// 7.18.1.3 Fastest minimum-width integer types -typedef int8_t int_fast8_t; -typedef int16_t int_fast16_t; -typedef int32_t int_fast32_t; -typedef int64_t int_fast64_t; -typedef uint8_t uint_fast8_t; -typedef uint16_t uint_fast16_t; -typedef uint32_t uint_fast32_t; -typedef uint64_t uint_fast64_t; - -// 7.18.1.4 Integer types capable of holding object pointers -#ifdef _WIN64 // [ - typedef __int64 intptr_t; - typedef unsigned __int64 uintptr_t; -#else // _WIN64 ][ - typedef _W64 int intptr_t; - typedef _W64 unsigned int uintptr_t; -#endif // _WIN64 ] - -// 7.18.1.5 Greatest-width integer types -typedef int64_t intmax_t; -typedef uint64_t uintmax_t; - - -// 7.18.2 Limits of specified-width integer types - -#if !defined(__cplusplus) || defined(__STDC_LIMIT_MACROS) // [ See footnote 220 at page 257 and footnote 221 at page 259 - -// 7.18.2.1 Limits of exact-width integer types -#define INT8_MIN ((int8_t)_I8_MIN) -#define INT8_MAX _I8_MAX -#define INT16_MIN ((int16_t)_I16_MIN) -#define INT16_MAX _I16_MAX -#define INT32_MIN ((int32_t)_I32_MIN) -#define INT32_MAX _I32_MAX -#define INT64_MIN ((int64_t)_I64_MIN) -#define INT64_MAX _I64_MAX -#define UINT8_MAX _UI8_MAX -#define UINT16_MAX _UI16_MAX -#define UINT32_MAX _UI32_MAX -#define UINT64_MAX _UI64_MAX - -// 7.18.2.2 Limits of minimum-width integer types -#define INT_LEAST8_MIN INT8_MIN -#define INT_LEAST8_MAX INT8_MAX -#define INT_LEAST16_MIN INT16_MIN -#define INT_LEAST16_MAX INT16_MAX -#define INT_LEAST32_MIN INT32_MIN -#define INT_LEAST32_MAX INT32_MAX -#define INT_LEAST64_MIN INT64_MIN -#define INT_LEAST64_MAX INT64_MAX -#define UINT_LEAST8_MAX UINT8_MAX -#define UINT_LEAST16_MAX UINT16_MAX -#define UINT_LEAST32_MAX UINT32_MAX -#define UINT_LEAST64_MAX UINT64_MAX - -// 7.18.2.3 Limits of fastest minimum-width integer types -#define INT_FAST8_MIN INT8_MIN -#define INT_FAST8_MAX INT8_MAX -#define INT_FAST16_MIN INT16_MIN -#define INT_FAST16_MAX INT16_MAX -#define INT_FAST32_MIN INT32_MIN -#define INT_FAST32_MAX INT32_MAX -#define INT_FAST64_MIN INT64_MIN -#define INT_FAST64_MAX INT64_MAX -#define UINT_FAST8_MAX UINT8_MAX -#define UINT_FAST16_MAX UINT16_MAX -#define UINT_FAST32_MAX UINT32_MAX -#define UINT_FAST64_MAX UINT64_MAX - -// 7.18.2.4 Limits of integer types capable of holding object pointers -#ifdef _WIN64 // [ -# define INTPTR_MIN INT64_MIN -# define INTPTR_MAX INT64_MAX -# define UINTPTR_MAX UINT64_MAX -#else // _WIN64 ][ -# define INTPTR_MIN INT32_MIN -# define INTPTR_MAX INT32_MAX -# define UINTPTR_MAX UINT32_MAX -#endif // _WIN64 ] - -// 7.18.2.5 Limits of greatest-width integer types -#define INTMAX_MIN INT64_MIN -#define INTMAX_MAX INT64_MAX -#define UINTMAX_MAX UINT64_MAX - -// 7.18.3 Limits of other integer types - -#ifdef _WIN64 // [ -# define PTRDIFF_MIN _I64_MIN -# define PTRDIFF_MAX _I64_MAX -#else // _WIN64 ][ -# define PTRDIFF_MIN _I32_MIN -# define PTRDIFF_MAX _I32_MAX -#endif // _WIN64 ] - -#define SIG_ATOMIC_MIN INT_MIN -#define SIG_ATOMIC_MAX INT_MAX - -#ifndef SIZE_MAX // [ -# ifdef _WIN64 // [ -# define SIZE_MAX _UI64_MAX -# else // _WIN64 ][ -# define SIZE_MAX _UI32_MAX -# endif // _WIN64 ] -#endif // SIZE_MAX ] - -// WCHAR_MIN and WCHAR_MAX are also defined in -#ifndef WCHAR_MIN // [ -# define WCHAR_MIN 0 -#endif // WCHAR_MIN ] -#ifndef WCHAR_MAX // [ -# define WCHAR_MAX _UI16_MAX -#endif // WCHAR_MAX ] - -#define WINT_MIN 0 -#define WINT_MAX _UI16_MAX - -#endif // __STDC_LIMIT_MACROS ] - - -// 7.18.4 Limits of other integer types - -#if !defined(__cplusplus) || defined(__STDC_CONSTANT_MACROS) // [ See footnote 224 at page 260 - -// 7.18.4.1 Macros for minimum-width integer constants - -#define INT8_C(val) val##i8 -#define INT16_C(val) val##i16 -#define INT32_C(val) val##i32 -#define INT64_C(val) val##i64 - -#define UINT8_C(val) val##ui8 -#define UINT16_C(val) val##ui16 -#define UINT32_C(val) val##ui32 -#define UINT64_C(val) val##ui64 - -// 7.18.4.2 Macros for greatest-width integer constants -#define INTMAX_C INT64_C -#define UINTMAX_C UINT64_C - -#endif // __STDC_CONSTANT_MACROS ] - -struct iovec // a WSABUF on 32-bit systems -{ - size_t iov_len; - void* iov_base; -}; - -// The WSABUF .len is actually a ULONG, which is != size_t on Win64. -// That means that we have to copy and truncate an iovec to a WSABUF on Win64. -// That's easier (in terms of warnings, use of sizeof, etc.) than having to -// change size_t to uint32_t everywhere. - -#ifdef _WIN64 -struct iovec64 // a WSABUF on 64-bit systems -{ - uint32_t iov_len; - void* iov_base; -}; -#endif - -#else // !_WIN32 - -#include -using std::memcmp; -using std::strlen; - -#include -#include // For struct iovec - -#ifdef __linux__ -#include // For strnlen -#else -inline size_t strnlen( const char* s, size_t maxlen ) { return strlen( s ); } -#endif - -inline void -memcpy_s -( - void* dest, - size_t dest_size, - const void* src, - size_t count -) -{ - std::memcpy( dest, src, count ); -} - -#endif - -#include // For Map subclasses to use -using std::map; - -#include -using std::string; - -#include // For Sequence subclasses to use -using std::vector; - - -#if defined(_WIN64) -extern "C" -{ - __int64 _InterlockedCompareExchange64 - ( - volatile __int64* cur_value, - __int64 new_value, - __int64 old_value - ); - - __int64 _InterlockedIncrement64( volatile __int64* cur_value ); - __int64 _InterlockedDecrement64( volatile __int64* cur_value ); -} -#elif defined(_WIN32) -extern "C" -{ - __declspec(dllimport) long __stdcall - InterlockedCompareExchange - ( - volatile long* cur_value, - long new_value, - long old_value - ); - - __declspec(dllimport) long __stdcall InterlockedIncrement( volatile long* ); - __declspec(dllimport) long __stdcall InterlockedDecrement( volatile long* ); -} -#elif defined(__sun) -#include -#elif defined(__arm__) -// gcc atomic builtins are not defined on ARM -#elif defined(__GNUC__) && \ - ( ( __GNUC__ == 4 && __GNUC_MINOR__ >= 1 ) || __GNUC__ > 4 ) -#define YIDL_RUNTIME_HAVE_GNUC_ATOMIC_BUILTINS 1 -#endif - - -namespace yidl -{ - namespace runtime - { -#if defined(_WIN64) - typedef __int64 atomic_t; -#elif defined(_WIN32) - typedef long atomic_t; -#elif defined(__LLP64__) || defined(__LP64__) - typedef int64_t atomic_t; -#else - typedef int32_t atomic_t; -#endif - - static inline atomic_t - atomic_cas - ( - volatile atomic_t* cur_value, - atomic_t new_value, - atomic_t old_value - ) - { -#if defined(_WIN64) - return _InterlockedCompareExchange64( cur_value, new_value, old_value ); -#elif defined(_WIN32) - return InterlockedCompareExchange( cur_value, new_value, old_value ); -#elif defined(__sun) -#if defined(__LLP64__) || defined(__LP64) - return atomic_cas_64 - ( - reinterpret_cast( cur_value ), - static_cast( old_value ), - static_cast( new_value ) - ); -#else - return atomic_cas_32 - ( - reinterpret_cast( cur_value ), - static_cast( old_value ), - static_cast( new_value ) - ); -#endif -#elif defined(YIDL_RUNTIME_HAVE_GNUC_ATOMIC_BUILTINS) - return __sync_val_compare_and_swap( cur_value, old_value, new_value ); -#elif defined(__arm__) -#if __ARM_ARCH__ >= 6 - atomic_t prev; - asm volatile( "@ atomic_cmpxchg\n" - "ldrex %1, [%2]\n" - "mov %0, #0\n" - "teq %1, %3\n" - "strexeq %0, %4, [%2]\n" - : "=&r" ( prev), "=&r" ( old_value ) - : "r" ( cur_value ), "Ir" ( old_value ), "r" ( new_value ) - : "cc" ); - return prev; -#else // ARM architectures < 6 are uniprocessor only - if ( *cur_value == old_value ) - { - *cur_value = new_value; - return old_value; - } - else - return *cur_value; -#endif -#elif defined(__i386__) - atomic_t prev; - asm volatile( "lock\n" - "cmpxchgl %1,%2\n" - : "=a" ( prev ) - : "r" ( new_value ), "m" ( *cur_value ) , "0" ( old_value ) - : "memory" - ); - return prev; -#elif defined(__ppc__) - atomic_t prev; - asm volatile( " \n\ - 1: ldarx %0,0,%2 \n\ - cmpd 0,%0,%3 \n\ - bne 2f \n\ - stdcx. %4,0,%2 \n\ - bne- 1b \n\ - sync\n" - "2:" - : "=&r" ( prev ), "=m" ( *cur_value ) - : "r" ( cur_value ), "r" ( old_value ), "r" ( new_value ), - "m" ( *cur_value ) - : "cc", "memory" - ); - return prev; -#elif defined(__x86_64__) - atomic_t prev; - asm volatile( "lock\n" - "cmpxchgq %1,%2\n" - : "=a" ( prev ) - : "r" ( new_value ), "m" ( *cur_value ) , "0" ( old_value ) - : "memory" - ); - return prev; -#endif - } - - static inline atomic_t atomic_dec( volatile atomic_t* cur_value ) - { -#if defined(_WIN64) - return _InterlockedDecrement64( cur_value ); -#elif defined(_WIN32) - return InterlockedDecrement( cur_value ); -#elif defined(__sun) -#if defined(__LLP64__) || defined(__LP64) - return atomic_dec_64_nv - ( - reinterpret_cast( cur_value ) - ); -#else - return atomic_dec_32_nv - ( - reinterpret_cast( cur_value ) - ); -#endif -#elif defined(YIDL_RUNTIME_HAVE_GNUC_ATOMIC_BUILTINS) - return __sync_sub_and_fetch( cur_value, 1 ); -#else - atomic_t old_value, new_value; - - do - { - old_value = *cur_value; - new_value = old_value - 1; - } - while ( atomic_cas( cur_value, new_value, old_value ) != old_value ); - - return new_value; -#endif - } - - static inline atomic_t atomic_inc( volatile atomic_t* cur_value ) - { -#if defined(_WIN64) - return _InterlockedIncrement64( cur_value ); -#elif defined(_WIN32) - return InterlockedIncrement( cur_value ); -#elif defined(__sun) -#if defined(__LLP64__) || defined(__LP64) - return atomic_inc_64_nv - ( - reinterpret_cast( cur_value ) - ); -#else - return atomic_inc_32_nv - ( - reinterpret_cast( cur_value ) - ); -#endif -#elif defined(YIDL_RUNTIME_HAVE_GNUC_ATOMIC_BUILTINS) - return __sync_add_and_fetch( cur_value, 1 ); -#else - atomic_t old_value, new_value; - - do - { - old_value = *cur_value; - new_value = old_value + 1; - } - while ( atomic_cas( cur_value, new_value, old_value ) != old_value ); - - return new_value; -#endif - } - - - class Marshaller; - class Unmarshaller; - class Sequence; - class Struct; - - - class Object - { - public: - Object() : refcnt( 1 ) - { } - - static inline void dec_ref( Object& object ) - { - if ( atomic_dec( &object.refcnt ) == 0 ) - delete &object; - } - - static inline void dec_ref( Object* object ) - { - if ( object != NULL ) - Object::dec_ref( *object ); - } - - template - static inline ObjectType& inc_ref( ObjectType& object ) - { - atomic_inc( &object.refcnt ); - return object; - } - - template - static inline ObjectType* inc_ref( ObjectType* object ) - { - if ( object != NULL ) - inc_ref( *object ); - return object; - } - - inline Object& inc_ref() - { - inc_ref( *this ); - return *this; - } - - protected: - virtual ~Object() - { } - - private: - volatile atomic_t refcnt; - }; - - // Macro indicating a new Object reference should be passed to a - // function/method or is returned by a function/method - #define YRO_NEW_REF - - - // Similar to auto_ptr, but using object references instead of delete - // Unlike auto_ptr auto_Object is immutable, so there is no release(), - // reset(), or operator=(). - // The class is primarily intended for use in testing, where an object - // should be deleted when it goes out of scope because of an exception. - template - class auto_Object - { - public: - auto_Object( YRO_NEW_REF ObjectType* object ) : object( *object ) { } - auto_Object( YRO_NEW_REF ObjectType& object ) : object( object ) { } - ~auto_Object() { Object::dec_ref( object ); } - - auto_Object( const auto_Object& other ) - : object( Object::inc_ref( other.object ) ) - { } - - inline ObjectType& get() const { return object; } - inline ObjectType* operator->() const { return &object; } - inline ObjectType& operator*() const { return object; } - - private: - ObjectType& object; - }; - - - class Buffer : public Object - { - public: - virtual ~Buffer() { } - - // capacity: the number of bytes available in the buffer >= size - virtual size_t capacity() const = 0; - - bool empty() const { return size() == 0; } - - // get: copy out of the buffer, advancing position - virtual size_t get( void* buf, size_t len ) - { - if ( size() - position() < len ) - len = size() - position(); - - if ( buf != NULL ) - memcpy_s( buf, len, static_cast( *this ) + position(), len ); - - position( position() + len ); - - return len; - } - - // Casts to get at the underlying buffer - operator char*() const - { - return static_cast( static_cast( *this ) ); - } - - operator unsigned char*() const - { - return static_cast( static_cast( *this ) ); - } - - operator struct iovec() const - { - struct iovec iov; - iov.iov_base = static_cast( *this ); - iov.iov_len = size(); - return iov; - } - -#ifdef _WIN64 - operator struct iovec64() const - { - struct iovec64 iov; - iov.iov_base = static_cast( *this ); - iov.iov_len = static_cast( size() ); - return iov; - } -#endif - - virtual operator void*() const = 0; - - char operator[]( int n ) - { - return static_cast( *this )[n]; - } - - bool operator==( const Buffer& other ) const - { - if ( size() == other.size() ) - { - void* this_base = static_cast( *this ); - void* other_base = static_cast( other ); - if ( this_base != NULL && other_base != NULL ) - return memcmp( this_base, other_base, size() ) == 0; - else - return false; - } - else - return false; - } - - // position: get and set the get() position - size_t position() const { return _position; } - - void position( size_t new_position ) - { - if ( new_position < size() ) - _position = new_position; - else - _position = size(); - } - - // put: append bytes to the buffer, increases size but not position - size_t put( Buffer& buf ) - { - size_t put_ret - = put - ( - static_cast( buf ) + buf.position(), - buf.size() - buf.position() - ); - - buf.position( buf.position() + put_ret ); - - return put_ret; - } - - virtual size_t put( char buf, size_t repeat_count ) - { - size_t total_put_ret = 0; - - for ( size_t char_i = 0; char_i < repeat_count; char_i++ ) - { - size_t put_ret = put( &buf, 1 ); - if ( put_ret == 1 ) - total_put_ret++; - else - break; - } - - return total_put_ret; - } - - size_t put( const struct iovec& iov ) - { - return put( iov.iov_base, iov.iov_len ); - } - - size_t put( const char* buf ) - { - return put( buf, strlen( buf ) ); - } - - size_t put( const string& buf ) - { - return put( buf.c_str(), buf.size() ); - } - - virtual size_t put( const void* buf, size_t len ) - { - if ( capacity() - size() < len ) - len = capacity() - size(); - - memcpy_s - ( - static_cast( *this ) + size(), - capacity() - size(), - buf, - len - ); - - resize( size() + len ); - - return len; - } - - virtual void resize( size_t n ) = 0; - - void rewind() { position( 0 ); } - void rewind( size_t n ) - { - if ( position() >= n ) - position( position() - n ); - else - position( 0 ); - } - - // size: the number of filled bytes, <= capacity - virtual size_t size() const = 0; - - // Object - Buffer& inc_ref() { return Object::inc_ref( *this ); } - - protected: - Buffer() { _position = 0; } - - private: - size_t _position; - }; - - - class MarshallableObject : public Object - { - public: - virtual uint32_t get_type_id() const = 0; - virtual const char* get_type_name() const = 0; - virtual void marshal( Marshaller& marshaller ) const = 0; - virtual void unmarshal( Unmarshaller& unmarshaller ) = 0; - - // Object - MarshallableObject& inc_ref() { return Object::inc_ref( *this ); } - }; - - - class MarshallableObjectFactory : public Object - { - public: - virtual YRO_NEW_REF MarshallableObject* - createMarshallableObject - ( - uint32_t type_id - ) - { - return NULL; - } - - virtual YRO_NEW_REF MarshallableObject* - createMarshallableObject - ( - const char* type_name - ) - { - return createMarshallableObject( type_name, strlen( type_name ) ); - } - - virtual YRO_NEW_REF MarshallableObject* - createMarshallableObject - ( - const char* type_name, - size_t type_name_len - ) - { - return NULL; - } - }; - - - class Map : public MarshallableObject - { - public: - virtual size_t get_size() const = 0; - }; - - - class MarshallerKeyTypes - { - public: - class Key : public Object - { - public: - Key() : tag( 0 ) { } - - inline uint32_t get_tag() const { return tag; } - - enum Type - { - TYPE_ANONYMOUS, - TYPE_DOUBLE, - TYPE_INT32, - TYPE_INT64, - TYPE_STRING, - TYPE_STRING_LITERAL - }; - - virtual Type get_type() const { return TYPE_ANONYMOUS; } - - protected: - Key( uint32_t tag ) : tag( tag ) { } - - private: - uint32_t tag; - }; - - - class StringKey : public Key, public string - { - public: - StringKey() { } - StringKey( const string& key ) : string( key ) { } - - StringKey( const char* key, size_t key_len ) - : string( key, key_len ) - { } - - StringKey( const string& key, uint32_t tag ) - : Key( tag ), string( key ) - { } - - StringKey( const char* key, const char* key_len, uint32_t tag ) - : Key( tag ), string( key, key_len ) - { } - - // Key - Type get_type() const { return TYPE_STRING; } - }; - -#define YIDL_RUNTIME_MARSHALLER_KEY_TYPE( ClassPrefix, CPPName, TYPE )\ - class ClassPrefix ## Key : public Key\ - {\ - public:\ - ClassPrefix ## Key( CPPName key ) : key( key ) { }\ - ClassPrefix ## Key( CPPName key, uint32_t tag )\ - : Key( tag ), key( key )\ - { }\ - inline operator CPPName() const { return key; }\ - Type get_type() const { return TYPE_ ## TYPE; }\ - private:\ - CPPName key;\ - }; - - YIDL_RUNTIME_MARSHALLER_KEY_TYPE( Double, double, DOUBLE ); - YIDL_RUNTIME_MARSHALLER_KEY_TYPE( Int32, int32_t, INT32 ); - YIDL_RUNTIME_MARSHALLER_KEY_TYPE( Int64, int64_t, INT64 ); - YIDL_RUNTIME_MARSHALLER_KEY_TYPE - ( - StringLiteral, - const char*, - STRING_LITERAL - ); - }; - - - class Marshaller : public Object, public MarshallerKeyTypes - { - public: - virtual ~Marshaller() { } - - // bool - void write( const char* key, bool value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, bool value ) { } - - // Buffer - void write( const char* key, Buffer& value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, Buffer& value ) - { - write( key, static_cast( value ), value.size() ); - } - - // float and double - void write( const char* key, float value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, float value ) - { - write( key, static_cast( value ) ); - } - - void write( const char* key, double value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, double value ) { } - - // Signed integers - void write( const char* key, int8_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, int8_t value ) - { - write( key, static_cast( value ) ); - } - - void write( const char* key, int16_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, int16_t value ) - { - write( key, static_cast( value ) ); - } - - void write( const char* key, int32_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, int32_t value ) - { - write( key, static_cast( value ) ); - } - - void write( const char* key, int64_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, int64_t value ) { } - - // Map - void write( const char* key, const Map& value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, const Map& value ) - { - write( key, static_cast( value ) ); - } - - // MarshallableObject - void write( const char* key, const MarshallableObject& value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, const MarshallableObject& value ) - { - value.marshal( *this ); - } - - // Sequence - void write( const char* key, const Sequence& value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, const Sequence& value ) - { } - - // strings - void write( const char* key, char* value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, char* value ) - { - write( key, value, strnlen( value, UINT16_MAX ) ); - } - - void write( const char* key, const char* value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, const char* value ) - { - write( key, value, strnlen( value, UINT16_MAX ) ); - } - - void write( const char* key, const string& value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, const string& value ) - { - write( key, const_cast( value.c_str() ), value.size() ); - } - - void write( const char* key, char* value, size_t value_len ) - { - write( StringLiteralKey( key ), value, value_len ); - } - - virtual void write( const Key& key, char* value, size_t value_len ) - { - write( key, const_cast( value ), value_len ); - } - - void write( const char* key, const char* value, size_t value_len ) - { - write( StringLiteralKey( key ), value, value_len ); - } - - virtual void write( const Key& key, const char* value, size_t value_len ) - { } - - // Unsigned integers - void write( const char* key, uint8_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, uint8_t value ) - { - write( key, static_cast( value ) ); - } - - void write( const char* key, uint16_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, uint16_t value ) - { - write( key, static_cast( value ) ); - } - - void write( const char* key, uint32_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, uint32_t value ) - { - write( key, static_cast( value ) ); - } - - void write( const char* key, uint64_t value ) - { - write( StringLiteralKey( key ), value ); - } - - virtual void write( const Key& key, uint64_t value ) - { - write( key, static_cast( value ) ); - } - }; - - - class Sequence : public MarshallableObject - { - public: - virtual size_t get_size() const = 0; - }; - - - class Struct : public MarshallableObject - { }; - - - class Unmarshaller : public Object, public MarshallerKeyTypes - { - public: - virtual ~Unmarshaller() { } - - // bool - bool read_bool( const char* key ) - { - return read_bool( StringLiteralKey( key ) ); - } - - virtual bool read_bool( const Key& key ) { return false; } - - // Buffer - void read( const char* key, Buffer& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, Buffer& value ) { } - - YRO_NEW_REF Buffer* read_buffer( const char* key ) - { - return read_buffer( StringLiteralKey( key ) ); - } - - virtual YRO_NEW_REF Buffer* read_buffer( const Key& ) { return NULL; } - - // float and double - float read_float( const char* key ) - { - return read_float( StringLiteralKey( key ) ); - } - - virtual float read_float( const Key& key ) - { - double double_value; - read( key, double_value ); - return static_cast( double_value ); - } - - void read( const char* key, double& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, double& value ) - { - value = 0; - } - - // Signed integers - int8_t read_int8( const char* key ) - { - return read_int8( StringLiteralKey( key ) ); - } - - virtual int8_t read_int8( const Key& key ) - { - return static_cast( read_int16( key ) ); - } - - int16_t read_int16( const char* key ) - { - return read_int16( StringLiteralKey( key ) ); - } - - virtual int16_t read_int16( const Key& key ) - { - return static_cast( read_int32( key ) ); - } - - int32_t read_int32( const char* key ) - { - return read_int32( StringLiteralKey( key ) ); - } - - virtual int32_t read_int32( const Key& key ) - { - int64_t int64_value; - read( key, int64_value ); - return static_cast( int64_value ); - } - - void read( const char* key, int64_t& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, int64_t& value ) { value = 0; } - - // Key - virtual YRO_NEW_REF Key* read( Key::Type ) { return NULL; } - - // Map - void read( const char* key, Map& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, Map& value ) { } - - // MarshallableObject - void read( const char* key, MarshallableObject& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, MarshallableObject& value ) { } - - // Sequence - void read( const char* key, Sequence& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, Sequence& value ) { } - - // string - void read( const char* key, string& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, string& value ) { } - - // Unsigned integers - uint8_t read_uint8( const char* key ) - { - return read_uint8( StringLiteralKey( key ) ); - } - - virtual uint8_t read_uint8( const Key& key ) - { - return read_int8( key ); - } - - uint16_t read_uint16( const char* key ) - { - return read_uint16( StringLiteralKey( key ) ); - } - - virtual uint16_t read_uint16( const Key& key ) - { - return static_cast( read_int16( key ) ); - } - - uint32_t read_uint32( const char* key ) - { - return read_uint32( StringLiteralKey( key ) ); - } - - virtual uint32_t read_uint32( const Key& key ) - { - return static_cast( read_int32( key ) ); - } - - void read( const char* key, uint64_t& value ) - { - read( StringLiteralKey( key ), value ); - } - - virtual void read( const Key& key, uint64_t& value ) - { - read( key, reinterpret_cast( value ) ); - } - }; - }; -}; - -#endif diff --git a/share/yidl/include/yunit.h b/share/yidl/include/yunit.h deleted file mode 100644 index 90cbd4d1ed74501f9d9b9836ed39733ff1c51b03..0000000000000000000000000000000000000000 --- a/share/yidl/include/yunit.h +++ /dev/null @@ -1,215 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// All rights reserved -// -// This source file is part of the yidl project. -// It is licensed under the New BSD license: -// -// 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 the yidl project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _YUNIT_H_ -#define _YUNIT_H_ - -#include -#include -#include -#include - - -#define ASSERT_TRUE( stat ) { if ( !( ( stat ) == true ) ) throw yunit::AssertionException( __FILE__, __LINE__, #stat" != true" ); } -#define ASSERT_FALSE( stat ) { if ( !( ( stat ) == false ) ) throw yunit::AssertionException( __FILE__, __LINE__, #stat" != false" ); } -#define ASSERT_EQUAL( stat_a, stat_b ) { if ( !( ( stat_a ) == ( stat_b ) ) ) throw yunit::AssertionException( __FILE__, __LINE__, #stat_a" != "#stat_b ); } -#define ASSERT_NOTEQUAL( stat_a, stat_b ) { if ( !( ( stat_a ) != ( stat_b ) ) ) throw yunit::AssertionException( __FILE__, __LINE__, #stat_a" == "#stat_b ); } -#define FAIL() throw yunit::AssertionException( __FILE__, __LINE__ ); - -#define TEST_SUITE_EX( TestSuiteName, TestSuiteType ) \ - yunit::TestSuite& TestSuiteName##TestSuite() { static TestSuiteType* ts = new TestSuiteType( #TestSuiteName ); return *ts; } \ -class TestSuiteName##TestSuiteDest { public: ~TestSuiteName##TestSuiteDest() { delete &TestSuiteName##TestSuite(); } }; \ -TestSuiteName##TestSuiteDest TestSuiteName##TestSuiteDestObj; - -#define TEST_SUITE( TestSuiteName ) TEST_SUITE_EX( TestSuiteName, yunit::TestSuite ) - -#define TEST_CASE_EX( TestSuiteName, TestCaseName, TestCaseType ) \ -extern yunit::TestSuite& TestSuiteName##TestSuite(); \ -class TestSuiteName##_##TestCaseName##Test : public TestCaseType \ -{ \ -public:\ - TestSuiteName##_##TestCaseName##Test() \ - : TestCaseType( # TestSuiteName "_" # TestCaseName "Test" ) \ - { \ - TestSuiteName##TestSuite().addTest( this ); \ - } \ - void runTest(); \ -};\ -TestSuiteName##_##TestCaseName##Test* TestSuiteName##_##TestCaseName##Test_inst = new TestSuiteName##_##TestCaseName##Test;\ -void TestSuiteName##_##TestCaseName##Test::runTest() - -#define TEST_CASE( TestSuiteName, TestCaseName ) TEST_CASE_EX( TestSuiteName, TestCaseName, yunit::TestCase ) - - -namespace yunit -{ - class TestResult; - class TestSuite; - - - class AssertionException : public std::exception - { - public: - AssertionException( const char* file_name, int line_number, const char* info = "" ) - { -#ifdef _WIN32 - _snprintf_s( what_buffer, 1024, "line number %d in %s (%s)", line_number, file_name, info ); -#else - snprintf( what_buffer, 1024, "line number %d in %s (%s)", line_number, file_name, info ); -#endif - } - - // std::exception - virtual const char* what() const throw() { return what_buffer; } - - private: - char what_buffer[1024]; - }; - - - class TestCase - { - public: - TestCase( const std::string& name ) - : name( name ) - { } - - virtual ~TestCase() { } - - virtual void setUp() { } - virtual void runTest() { } - virtual void run( TestResult& ) { runTest(); } - virtual void tearDown() { } - const char* shortDescription() const { return name.c_str(); } - - protected: - std::string name; - }; - - - class TestResult - { - public: - virtual ~TestResult() { } - }; - - - class TestRunner - { - public: - virtual ~TestRunner() { } - - virtual int run( TestSuite& test_suite ); - }; - - - class TestSuite : private std::vector - { - public: - TestSuite( const std::string& name ) - : name( name ) - { } - - virtual ~TestSuite() - { - for ( iterator test_case_i = begin(); test_case_i != end(); test_case_i++ ) - delete *test_case_i; - } - - void addTest( TestCase* test_case ) - { - push_back( test_case ); - } - - const std::string& get_name() const { return name; } - - virtual int run( TestResult& test_result ) - { - int failed_test_case_count = 0; - - for - ( - iterator test_case_i = begin(); - test_case_i != end(); - ++test_case_i - ) - { - TestCase* test_case = *test_case_i; - - bool called_runTest = false, called_tearDown = false; - - try - { - std::cout << test_case->shortDescription(); - test_case->setUp(); - called_runTest = true; - test_case->run( test_result ); - called_tearDown = true; - test_case->tearDown(); - std::cout << ": passed"; - } - catch ( yunit::AssertionException& exc ) - { - std::cout << " failed: " << exc.what(); - failed_test_case_count++; - } - catch ( std::exception& exc ) - { - std::cout << " threw exception: " << exc.what(); - failed_test_case_count++; - } - catch ( ... ) - { - std::cout << " threw unknown non-exception"; - failed_test_case_count++; - } - - std::cout << std::endl; - - if ( called_runTest && !called_tearDown ) - try { test_case->tearDown(); } catch ( ... ) { } - } - - return failed_test_case_count; - } - - private: - std::string name; - }; - - - inline int TestRunner::run( TestSuite& test_suite ) - { - TestResult* test_result = new TestResult; - return test_suite.run( *test_result ); - } -}; - - -#endif diff --git a/share/yield/include/yield.h b/share/yield/include/yield.h deleted file mode 100644 index c0daefff9bd59fcbbda136135baa4b1bdd2aa627..0000000000000000000000000000000000000000 --- a/share/yield/include/yield.h +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2003-2008 NEC HPC Europe, with original implementations and ideas contributed by Felix Hupfeld. -// This source comes from the Yield project. It is licensed under the GPLv2 (see COPYING for terms and conditions). - -#ifndef _YIELD_H_ -#define _YIELD_H_ - -#include "yield/concurrency.h" -#include "yield/ipc.h" -#include "yield/platform.h" - -#endif diff --git a/share/yield/include/yield/concurrency.h b/share/yield/include/yield/concurrency.h deleted file mode 100644 index f8fa35dd1ab0119b719e4d90f35d2e7fc6647ca3..0000000000000000000000000000000000000000 --- a/share/yield/include/yield/concurrency.h +++ /dev/null @@ -1,1640 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// -// All rights reserved -// -// This source file is part of the Yield project. -// It is licensed under the New BSD license: -// -// 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 the Yield project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _YIELD_CONCURRENCY_H_ -#define _YIELD_CONCURRENCY_H_ - -#include "yield/platform.h" - -#include // For std::sort -#include - - -// YIELD_CONCURRENCY_MG1_POLLING_TABLE_SIZE should be a Fibonnaci number: -// 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584 -#define YIELD_CONCURRENCY_MG1_POLLING_TABLE_SIZE 144 -#define YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX 64 - - -namespace yield -{ - namespace concurrency - { - class Exception; - class Request; - class Response; - class Stage; - - using yidl::runtime::atomic_cas; - using yidl::runtime::atomic_t; - using yidl::runtime::MarshallableObject; - using yidl::runtime::MarshallableObjectFactory; - using yidl::runtime::Marshaller; - using yidl::runtime::Object; - using yidl::runtime::Unmarshaller; - - using yield::platform::Mutex; - using yield::platform::ProcessorSet; - using yield::platform::Semaphore; - using yield::platform::Time; - - - class Event : public MarshallableObject - { - public: - virtual ~Event() { } - - virtual bool is_message() const { return false; } - - // Object - Event& inc_ref() { return Object::inc_ref( *this ); } - }; - - - class EventHandler : public Object - { - public: - virtual ~EventHandler() { } - - virtual void handle( Event& event ) = 0; - - // Object - EventHandler& inc_ref() { return Object::inc_ref( *this ); } - }; - - - class EventQueue : public EventHandler - { - public: - virtual ~EventQueue() { } - - virtual YRO_NEW_REF Event* dequeue() = 0; - virtual YRO_NEW_REF Event* dequeue( const Time& timeout ) = 0; - virtual bool enqueue( Event& ) = 0; - virtual YRO_NEW_REF Event* try_dequeue() = 0; - - // EventHandler - void handle( YRO_NEW_REF Event& event ) { enqueue( event ); } - }; - - - class EventHandlerMux : public EventHandler - { - public: - EventHandlerMux(); - ~EventHandlerMux(); - - void add( YRO_NEW_REF EventHandler& event_handler ); - - // EventHandler - void handle( YRO_NEW_REF Event& event ); - - private: - EventHandler** event_handlers; - size_t event_handlers_len; - size_t next_event_handler_i; - }; - - - class Message : public Event - { - public: - virtual ~Message() { } - - virtual bool is_request() const = 0; - - // Event - bool is_message() const { return true; } - - protected: - Message() { } - }; - - - class MessageFactory : public MarshallableObjectFactory - { - public: - virtual ~MessageFactory() { } - - virtual YRO_NEW_REF Exception* createException( uint32_t type_id ) - { - return NULL; - } - - virtual YRO_NEW_REF Exception* createException( const char* type_name ) - { - return createException( type_name, strlen( type_name ) ); - } - - virtual YRO_NEW_REF Exception* - createException - ( - const char* type_name, - size_t type_name_len - ) - { - return NULL; - } - - virtual YRO_NEW_REF Request* createRequest( uint32_t type_id ) - { - return NULL; - } - - virtual YRO_NEW_REF Request* createRequest( const char* type_name ) - { - return createRequest( type_name, strlen( type_name ) ); - } - - virtual YRO_NEW_REF Request* - createRequest - ( - const char* type_name, - size_t type_name_len - ) - { - return NULL; - } - - virtual YRO_NEW_REF Response* createResponse( uint32_t type_id ) - { - return NULL; - } - - virtual YRO_NEW_REF Response* createResponse( const char* type_name ) - { - return createResponse( type_name, strlen( type_name ) ); - } - - virtual YRO_NEW_REF Response* - createResponse - ( - const char* type_name, - size_t type_name_len - ) - { - return NULL; - } - - // Object - MessageFactory& inc_ref() { return Object::inc_ref( *this ); } - }; - - - class MessageHandler : public EventHandler - { - public: - virtual void handle( YRO_NEW_REF Message& message ) = 0; - - // EventHandler - virtual void handle( YRO_NEW_REF Event& event ); - }; - - - template - class NonBlockingFiniteQueue - { - public: - NonBlockingFiniteQueue() - { - head = 0; - tail = 1; - - for ( size_t element_i = 0; element_i < QueueLength+2; element_i++ ) - elements[element_i] = reinterpret_cast( 0 ); - - elements[0] = reinterpret_cast( 1 ); - } - - ElementType dequeue() - { - atomic_t copied_head, try_pos; - ElementType try_element; - - for ( ;; ) - { - copied_head = head; - try_pos = ( copied_head + 1 ) % ( QueueLength + 2 ); - try_element = reinterpret_cast( elements[try_pos] ); - - while - ( - try_element == reinterpret_cast( 0 ) || - try_element == reinterpret_cast( 1 ) - ) - { - if ( copied_head != head ) - break; - - if ( try_pos == tail ) - return 0; - - try_pos = ( try_pos + 1 ) % ( QueueLength + 2 ); - - try_element = reinterpret_cast( elements[try_pos] ); - } - - if ( copied_head != head ) - continue; - - if ( try_pos == tail ) - { - atomic_cas( &tail, ( try_pos+1 ) % ( QueueLength+2 ), try_pos ); - continue; - } - - if ( copied_head != head ) - continue; - - if - ( - atomic_cas - ( - // Memory - reinterpret_cast( &elements[try_pos] ), - // New value - ( - reinterpret_cast( try_element) & POINTER_HIGH_BIT - ) ? 1 : 0, - // New value - reinterpret_cast( try_element ) - ) // Test against old value - == reinterpret_cast( try_element ) - ) - { - if ( try_pos % 2 == 0 ) - atomic_cas( &head, try_pos, copied_head ); - - return - reinterpret_cast - ( - ( - reinterpret_cast( try_element ) - & POINTER_LOW_BITS - ) << 1 - ); - } - } - } - - bool enqueue( ElementType element ) - { -#ifdef _DEBUG - if ( reinterpret_cast( element ) & 0x1 ) - DebugBreak(); -#endif - - element - = reinterpret_cast - ( - reinterpret_cast( element ) >> 1 - ); - -#ifdef _DEBUG - if ( reinterpret_cast( element ) & POINTER_HIGH_BIT ) - DebugBreak(); -#endif - - atomic_t copied_tail, last_try_pos, try_pos; // te, ate, temp - ElementType try_element; - - for ( ;; ) - { - copied_tail = tail; - last_try_pos = copied_tail; - try_element = reinterpret_cast( elements[last_try_pos] ); - try_pos = ( last_try_pos + 1 ) % ( QueueLength + 2 ); - - while - ( - try_element != reinterpret_cast( 0 ) - && - try_element != reinterpret_cast( 1 ) - ) - { - if ( copied_tail != tail ) - break; - - if ( try_pos == head ) - break; - - try_element = reinterpret_cast( elements[try_pos] ); - last_try_pos = try_pos; - try_pos = ( last_try_pos + 1 ) % ( QueueLength + 2 ); - } - - if ( copied_tail != tail ) // Someone changed tail - continue; // while we were looping - - if ( try_pos == head ) - { - last_try_pos = ( try_pos + 1 ) % ( QueueLength + 2 ); - try_element - = reinterpret_cast( elements[last_try_pos] ); - - if - ( - try_element != reinterpret_cast( 0 ) - && - try_element != reinterpret_cast( 1 ) - ) - return false; // Queue is full - - atomic_cas( &head, last_try_pos, try_pos ); - continue; - } - - if ( copied_tail != tail ) - continue; - - // diff next line - if - ( - atomic_cas - ( - // Memory - reinterpret_cast - ( - &elements[last_try_pos] - ), - - // New value - try_element == reinterpret_cast( 1 ) ? - ( reinterpret_cast( element ) - | POINTER_HIGH_BIT ) : - reinterpret_cast( element ), - - // Old value - reinterpret_cast( try_element ) - - ) // Test against old value - == reinterpret_cast( try_element ) - ) - { - if ( try_pos % 2 == 0 ) - atomic_cas( &tail, try_pos, copied_tail ); - - return true; - } - } - } - - private: - volatile ElementType elements[QueueLength+2]; // extra 2 for sentinels - volatile atomic_t head, tail; - -#if defined(__LLP64__) || defined(__LP64__) - const static atomic_t POINTER_HIGH_BIT = 0x8000000000000000; - const static atomic_t POINTER_LOW_BITS = 0x7fffffffffffffff; -#else - const static atomic_t POINTER_HIGH_BIT = 0x80000000; - const static atomic_t POINTER_LOW_BITS = 0x7fffffff; -#endif - }; - - - template - class SynchronizedNonBlockingFiniteQueue - : private NonBlockingFiniteQueue - { - public: - ElementType dequeue() - { - ElementType element = - NonBlockingFiniteQueue::dequeue(); - - while ( element == 0 ) - { - signal.acquire(); - element = NonBlockingFiniteQueue::dequeue(); - } - - return element; - } - - ElementType dequeue( const Time& timeout ) - { - ElementType element - = NonBlockingFiniteQueue::dequeue(); - - if ( element != 0 ) - return element; - else - { - signal.acquire( timeout ); - return NonBlockingFiniteQueue::dequeue(); - } - } - - bool enqueue( ElementType element ) - { - bool enqueued = - NonBlockingFiniteQueue::enqueue( element ); - signal.release(); - return enqueued; - } - - ElementType try_dequeue() - { - return NonBlockingFiniteQueue::dequeue(); - } - - private: - Semaphore signal; - }; - - - class NonBlockingEventQueue - : public EventQueue, - private SynchronizedNonBlockingFiniteQueue - { - public: - // EventQueue - Event* dequeue() - { - return SynchronizedNonBlockingFiniteQueue::dequeue(); - } - - Event* dequeue( const Time& timeout ) - { - return SynchronizedNonBlockingFiniteQueue - ::dequeue( timeout ); - } - - bool enqueue( Event& event ) - { - return SynchronizedNonBlockingFiniteQueue::enqueue - ( - &event - ); - } - - Event* try_dequeue() - { - return SynchronizedNonBlockingFiniteQueue::try_dequeue(); - } - }; - - - class NOPLock - { - public: - inline bool acquire() { return true; } - inline bool acquire( const Time& ) { return true; } - inline void release() { } - inline bool try_acquire() { return true; } - }; - - - class Request : public Message - { - public: - Request(); - virtual ~Request(); - - virtual YRO_NEW_REF Response* createDefaultResponse() { return NULL; } - MarshallableObject* get_credentials() const { return credentials; } - EventHandler* get_response_handler() const { return response_handler; } - virtual void respond( Response& response ); - void set_credentials( YRO_NEW_REF MarshallableObject* credentials ); - void set_response_handler( YRO_NEW_REF EventHandler* response_handler ); - void set_response_handler( EventHandler& response_handler ); - - // Object - Request& inc_ref() { return Object::inc_ref( *this ); } - - // Message - bool is_request() const { return true; } - - private: - MarshallableObject* credentials; - EventHandler* response_handler; - }; - - - class RequestHandler : public MessageHandler - { - public: - virtual void handle( YRO_NEW_REF Request& request ) = 0; - - // MessageHandler - virtual void handle( YRO_NEW_REF Message& message ); - }; - - - class Response : public Message - { - public: - Response() { } - virtual ~Response() { } - - virtual bool is_exception() const { return false; } - - // Object - Response& inc_ref() { return Object::inc_ref( *this ); } - - // Message - bool is_request() const { return false; } - }; - - - class Exception : public Response, public yield::platform::Exception - { - public: - Exception() - { } - - Exception( uint32_t error_code ) - : yield::platform::Exception( error_code ) - { } - - Exception( const char* error_message ) - : yield::platform::Exception( error_message ) - { } - - Exception( const string& error_message ) - : yield::platform::Exception( error_message ) - { } - - Exception( uint32_t error_code, const char* error_message ) - : yield::platform::Exception( error_code, error_message ) - { } - - Exception( uint32_t error_code, const string& error_message ) - : yield::platform::Exception( error_code, error_message ) - { } - - Exception( const Exception& other ) - : yield::platform::Exception( other ) - { } - - virtual ~Exception() throw() - { } - - virtual Exception& clone() const { return *new Exception( *this ); } - virtual void throwStackClone() const { throw Exception( *this ); } - - // Object - Exception& inc_ref() { return Object::inc_ref( *this ); } - - // MarshallableObject - virtual uint32_t get_type_id() const { return 0; } - virtual const char* get_type_name() const { return "Exception"; } - virtual void marshal( Marshaller& ) const { } - virtual void unmarshal( Unmarshaller& ) { } - - // Response - bool is_exception() const { return true; } - }; - - - class ResponseHandler : public MessageHandler - { - public: - virtual void handle( YRO_NEW_REF Response& response ) = 0; - - // MessageHandler - void handle( YRO_NEW_REF Message& message ); - }; - - - template - class SynchronizedSTLQueue : private std::queue - { - public: - ElementType dequeue() - { - for ( ;; ) - { - signal.acquire(); - LockHolder lock_holder( lock ); - if ( std::queue::size() > 0 ) - { - ElementType element = std::queue::front(); - std::queue::pop(); - return element; - } - } - } - - ElementType dequeue( const Time& timeout ) - { - Time timeout_left( timeout ); - - for ( ;; ) - { - Time start_time; - - if ( signal.acquire( timeout_left ) ) - { - if ( lock.try_acquire() ) - { - if ( std::queue::size() > 0 ) - { - ElementType element = std::queue::front(); - std::queue::pop(); - lock.release(); - return element; - } - else - lock.release(); - } - } - - Time elapsed_time; elapsed_time -= start_time; - if ( elapsed_time < timeout_left ) - timeout_left -= elapsed_time; - else - return NULL; - } - } - - bool enqueue( ElementType element ) - { - lock.acquire(); - std::queue::push( element ); - lock.release(); - signal.release(); - return true; - } - - ElementType try_dequeue() - { - if ( lock.try_acquire() ) - { - if ( std::queue::size() > 0 ) - { - ElementType element = std::queue::front(); - std::queue::pop(); - lock.release(); - return element; - } - else - lock.release(); - } - - return NULL; - } - - private: - Mutex lock; - Semaphore signal; - }; - - - class STLEventQueue - : public EventQueue, - private SynchronizedSTLQueue - { - public: - // Object - STLEventQueue& inc_ref() { return Object::inc_ref( *this ); } - - // EventQueue - YRO_NEW_REF Event* dequeue() - { - return SynchronizedSTLQueue::dequeue(); - } - - YRO_NEW_REF Event* dequeue( const Time& timeout ) - { - return SynchronizedSTLQueue::dequeue( timeout ); - } - - bool enqueue( YRO_NEW_REF Event& event ) - { - return SynchronizedSTLQueue::enqueue( &event ); - } - - YRO_NEW_REF Event* try_dequeue() - { - return SynchronizedSTLQueue::try_dequeue(); - } - }; - - - class ThreadLocalEventQueue : public EventQueue - { - public: - ThreadLocalEventQueue(); - ~ThreadLocalEventQueue(); - - // EventQueue - YRO_NEW_REF Event* dequeue(); - YRO_NEW_REF Event* dequeue( const Time& timeout ); - bool enqueue( YRO_NEW_REF Event& ); - YRO_NEW_REF Event* try_dequeue(); - - private: - class EventStack; - - unsigned long tls_key; - vector event_stacks; - EventStack* getEventStack(); - - SynchronizedSTLQueue all_processor_event_queue; - }; - - - template - class ResponseQueue - : public ResponseHandler, - private SynchronizedSTLQueue - { - public: - YRO_NEW_REF ResponseType& dequeue() - { - Response* response = SynchronizedSTLQueue::dequeue(); - - if ( response->get_type_id() == ResponseType::TYPE_ID ) - return static_cast( *response ); - else if ( response->is_exception() ) - { - try - { - static_cast( response )->throwStackClone(); - // Eliminate compiler warnings about control paths - return static_cast( *response ); - } - catch ( Exception& ) - { - Response::dec_ref( *response ); - throw; - } - } - else - throw Exception( "ResponseQueue: dequeued unexpected Response type" ); - } - - YRO_NEW_REF ResponseType& dequeue( const Time& timeout ) - { - Response* response - = SynchronizedSTLQueue::dequeue( timeout ); - - if ( response != NULL ) - { - if ( response->get_type_id() == ResponseType::TYPE_ID ) - return static_cast( *response ); - else if ( response->is_exception() ) - { - try - { - static_cast( response )->throwStackClone(); - // Eliminate compiler warnings about control paths - return static_cast( *response ); - } - catch ( Exception& ) - { - Response::dec_ref( *response ); - throw; - } - } - else - throw Exception( "ResponseQueue: dequeued unexpected Response type" ); - } - else - throw Exception( "ResponseQueue::dequeue: timed out" ); - } - - // ResponseHandler - void handle( YRO_NEW_REF Response& response ) - { - SynchronizedSTLQueue::enqueue( &response ); - } - }; - - - template - class Sampler - { - public: - Sampler() - { - memset( samples, 0, sizeof( samples ) ); - samples_pos = samples_count = 0; - min = static_cast( ULONG_MAX ); max = 0; total = 0; - } - - void clear() - { - lock.acquire(); - samples_count = 0; - lock.release(); - } - - SampleType get_max() const - { - return max; - } - - SampleType get_mean() - { - lock.acquire(); - SampleType mean; - - if ( samples_count > 0 ) - mean = static_cast - ( - static_cast( total ) / - static_cast( samples_count ) - ); - else - mean = 0; - - lock.release(); - return mean; - } - - SampleType get_median() - { - lock.acquire(); - SampleType median; - - if ( samples_count > 0 ) - { - std::sort( samples, samples + samples_count ); - size_t sc_div_2 = samples_count / 2; - if ( samples_count % 2 == 1 ) - median = samples[sc_div_2]; - else - { - SampleType median_temp = samples[sc_div_2] + samples[sc_div_2-1]; - if ( median_temp > 0 ) - median = static_cast - ( - static_cast( median_temp ) / 2.0 - ); - else - median = 0; - } - } - else - median = 0; - - lock.release(); - return median; - } - - SampleType get_min() const - { - return min; - } - - SampleType get_percentile( double percentile ) - { - if ( percentile > 0 && percentile < 100 ) - { - lock.acquire(); - SampleType value; - - if ( samples_count > 0 ) - { - std::sort( samples, samples + samples_count ); - value = - samples[static_cast( percentile * - static_cast( samples_count ) )]; - } - else - value = 0; - - lock.release(); - return value; - } - else - return 0; - } - - uint32_t get_samples_count() const - { - return samples_count; - } - - void set_next_sample( SampleType sample ) - { - if ( lock.try_acquire() ) - { - samples[samples_pos] = sample; - samples_pos = ( samples_pos + 1 ) % ArraySize; - if ( samples_count < ArraySize ) samples_count++; - - if ( sample < min ) - min = sample; - if ( sample > max ) - max = sample; - total += sample; - - lock.release(); - } - } - - protected: - SampleType samples[ArraySize+1], min, max; SampleType total; - uint32_t samples_pos, samples_count; - LockType lock; - }; - - - class Stage : public EventHandler - { - public: - class StartupEvent : public Event - { - public: - StartupEvent( Stage& stage ) - : stage( stage.inc_ref() ) - { } - - ~StartupEvent() - { - Stage::dec_ref( stage ); - } - - Stage& get_stage() { return stage; } - - // MarshallableObject - const static uint32_t TYPE_ID = 104; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "Stage::ShutdownEvent"; } - void marshal( Marshaller& ) const { } - void unmarshal( Unmarshaller& ) { } - - private: - Stage& stage; - }; - - - class ShutdownEvent : public Event - { - public: - // MarshallableObject - const static uint32_t TYPE_ID = 105; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "Stage::ShutdownEvent"; } - void marshal( Marshaller& ) const { } - void unmarshal( Unmarshaller& ) { } - }; - - - virtual ~Stage(); - - double get_arrival_rate_s() const { return arrival_rate_s; } - double get_rho() const { return rho; } - double get_service_rate_s() const { return service_rate_s; } - uint8_t get_stage_id() const { return id; } - virtual EventHandler& get_event_handler() = 0; - virtual bool visit() = 0; - virtual bool visit( const Time& timeout ) = 0; - virtual void visit( Event& event ) = 0; - - // Object - Stage& inc_ref() { return Object::inc_ref( *this ); } - - protected: - Stage(); - - Sampler event_processing_time_sampler; - uint32_t event_queue_length, event_queue_arrival_count; - #ifdef YIELD_PLATFORM_HAVE_PERFORMANCE_COUNTERS - PerformanceCounterSet& performance_counters; - uint64_t performance_counter_totals[2]; - #endif - - private: - class StatisticsTimer; - - uint8_t id; - double arrival_rate_s, rho, service_rate_s; - - friend class StageGroup; - void set_stage_id( uint8_t stage_id ) { this->id = stage_id; } - }; - - - template - class StageImpl : public Stage - { - public: - StageImpl - ( - YRO_NEW_REF EventHandlerType& event_handler, - YRO_NEW_REF EventQueueType& event_queue - ) - : event_handler( event_handler ), - event_queue( event_queue ) - { } - - virtual ~StageImpl() - { - EventHandlerType::dec_ref( event_handler ); - EventQueueType::dec_ref( event_queue ); - } - - // EventHandler - void handle( Event& event ) - { - ++event_queue_length; - ++event_queue_arrival_count; - - if ( event_queue.enqueue( event ) ) - return; - else - { - //cerr << event_handler.get_type_name() << - // ": event queue full, stopping."; - DebugBreak(); - } - } - - EventHandler& get_event_handler() { return event_handler; } - - bool visit() - { - lock.acquire(); - - Event* event = event_queue.dequeue(); - - --event_queue_length; - _handle( *event ); - - for ( ;; ) - { - event = event_queue.try_dequeue(); - if ( event != NULL ) - { - --event_queue_length; - handle( *event ); - } - else - break; - } - - lock.release(); - - return true; - } - - bool visit( const Time& timeout ) - { - if ( lock.try_acquire() ) - { - Event* event = event_queue.dequeue( timeout ); - if ( event != NULL ) - { - --event_queue_length; - _handle( *event ); - - for ( ;; ) - { - event = event_queue.try_dequeue(); - if ( event != NULL ) - { - --event_queue_length; - _handle( *event ); - } - else - break; - } - - lock.release(); - - return true; - } - else - { - lock.release(); - return false; - } - } - else - return false; - } - - void visit( Event& event ) - { - --event_queue_length; - lock.acquire(); - _handle( event ); - lock.release(); - } - - private: - EventHandlerType& event_handler; - EventQueueType& event_queue; - - LockType lock; - - void _handle( Event& event ) - { - Time start_time; - - #ifdef YIELD_PLATFORM_HAVE_PERFORMANCE_COUNTERS - performance_counters->startCounting(); - #endif - - event_handler.handle( event ); - - #ifdef YIELD_PLATFORM_HAVE_PERFORMANCE_COUNTERS - uint64_t performance_counter_counts[2]; - performance_counters->stopCounting( performance_counter_counts ); - performance_counter_totals[0] += performance_counter_counts[0]; - performance_counter_totals[1] += performance_counter_counts[1]; - #endif - - Time event_processing_time; - event_processing_time -= start_time; - if ( event_processing_time < 10.0 ) - { - event_processing_time_sampler. - set_next_sample( event_processing_time ); - } - } - }; - - - class StageGroup : public Object - { - public: - virtual ~StageGroup(); - - template - YRO_NEW_REF Stage* createStage - ( - YRO_NEW_REF EventHandlerType& event_handler - ) - { - return createStage( static_cast( event_handler ) ); - } - - template - YRO_NEW_REF Stage* - createStage - ( - YRO_NEW_REF EventHandlerType& event_handler, - int16_t thread_count - ) - { - return createStage - ( - static_cast( event_handler ), - thread_count - ); - } - - virtual YRO_NEW_REF Stage* - createStage - ( - YRO_NEW_REF EventHandler& event_handler, - int16_t thread_count = 1 - ) = 0; - - Stage** get_stages() { return &stages[0]; } - - protected: - StageGroup(); - - void addStage( Stage* stage ); - - private: - Stage* stages[YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX]; - }; - - - template // CRTP - class StageGroupImpl : public StageGroup - { - public: - virtual ~StageGroupImpl() { } - - template - YRO_NEW_REF Stage* - createStage - ( - YRO_NEW_REF EventHandlerType& event_handler - ) - { - return static_cast( this ) - ->createStage( event_handler, 1 ); - } - - template - YRO_NEW_REF Stage* - createStage - ( - EventHandlerType& event_handler, - int16_t thread_count - ) - { - return static_cast( this ) - ->createStage( event_handler, thread_count ); - } - - // StageGroup - YRO_NEW_REF Stage* - createStage - ( - EventHandler& event_handler, - int16_t thread_count = 1 - ) - { - return createStage( event_handler, thread_count ); - } - - protected: - StageGroupImpl() { } - }; - - - class ColorStageGroup : public StageGroupImpl - { - public: - ColorStageGroup - ( - const char* name = "Main stage group", - uint16_t start_logical_processor_i = 0, - int16_t thread_count = -1 - ); - - ~ColorStageGroup(); - - template - YRO_NEW_REF Stage* - createStage - ( - EventHandlerType& event_handler, - int16_t thread_count - ) - { - Stage* stage; - - if ( thread_count == 1 ) - { - stage - = new StageImpl - ( - event_handler, - event_queue->inc_ref() - ); - } - else - { - stage - = new StageImpl - ( - event_handler, - event_queue->inc_ref() - ); - } - - // TODO: check flags before sending this - //event_handler->handle( *new Stage::StartupEvent( stage ) ); - - this->addStage( stage ); - - return stage; - } - - private: - STLEventQueue* event_queue; - - class Thread; - vector threads; - }; - - - class VisitPolicy - { - protected: - VisitPolicy( Stage** stages ) - : stages( stages ) - { } - - Stage** stages; - }; - - - template - class PollingStageGroup - : public StageGroupImpl< PollingStageGroup > - { - public: - PollingStageGroup - ( - const char* name = "Main stage group", - uint16_t start_logical_processor_i = 0, - int16_t thread_count = -1, - bool use_thread_local_event_queues = false - ); - - ~PollingStageGroup(); - - template - YRO_NEW_REF Stage* - createStage - ( - EventHandlerType& event_handler, - int16_t thread_count - ) - { - Stage* stage; - - if ( use_thread_local_event_queues ) - { - if ( thread_count == 1 ) - { - stage - = new StageImpl - ( - event_handler, - *new ThreadLocalEventQueue - ); - } - else - { - stage - = new StageImpl - ( - event_handler, - *new ThreadLocalEventQueue - ); - } - } - else - { - if ( thread_count == 1 ) - { - stage - = new StageImpl - ( - event_handler, - *new STLEventQueue - ); - } - else - { - stage - = new StageImpl - ( - event_handler, - *new STLEventQueue - ); - } - } - - // TODO: check flags before sending this - //event_handler->handle( *new Stage::StartupEvent( stage ) ); - - this->addStage( stage ); - - return stage; - } - - private: - bool use_thread_local_event_queues; - - class Thread; - vector threads; - }; - - - class DBRVisitPolicy : public VisitPolicy - { - public: - DBRVisitPolicy( Stage** stages ) - : VisitPolicy( stages ) - { - next_stage_i = YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX; - memset( sorted_stages, 0, sizeof( sorted_stages ) ); - } - - // VisitPolicy - inline Stage* getNextStageToVisit( bool last_visit_was_successful ) - { - if ( last_visit_was_successful ) - { - next_stage_i = 0; - return sorted_stages[0]; - } - else if ( next_stage_i < YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX ) - return sorted_stages[next_stage_i++]; - else - { - memcpy_s - ( - sorted_stages, - sizeof( sorted_stages ), - stages, - sizeof( sorted_stages ) - ); - - std::sort - ( - &sorted_stages[0], - &sorted_stages[YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX-1], - compare_stages() - ); - - next_stage_i = 0; - - return sorted_stages[0]; - } - } - - private: - uint8_t next_stage_i; - Stage* sorted_stages[YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX]; - - struct compare_stages : public std::binary_function - { - bool operator()( Stage* left, Stage* right ) - { - if ( left != NULL ) - { - if ( right != NULL ) - return left->get_service_rate_s() < right->get_service_rate_s(); - else - return true; - } - else - return false; - } - }; - }; - - - class MG1VisitPolicy : public VisitPolicy - { - public: - MG1VisitPolicy( Stage** stages ); - - // VisitPolicy - inline Stage* getNextStageToVisit( bool ) - { - if ( polling_table_pos < YIELD_CONCURRENCY_MG1_POLLING_TABLE_SIZE ) - return stages[polling_table[polling_table_pos++]]; - else - { - populatePollingTable(); - polling_table_pos = 0; - return stages[polling_table[polling_table_pos++]]; - } - } - - private: - uint8_t polling_table[YIELD_CONCURRENCY_MG1_POLLING_TABLE_SIZE]; - uint32_t polling_table_pos; - uint32_t golden_ratio_circle[YIELD_CONCURRENCY_MG1_POLLING_TABLE_SIZE]; - // These are only used in populating the polling table, - // but we have to keep the values to use in smoothing - double last_rhos[YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX]; - - bool populatePollingTable(); - }; - - - class SRPTVisitPolicy : public VisitPolicy - { - public: - SRPTVisitPolicy( Stage** stages ) : VisitPolicy( stages ) - { - next_stage_i = 0; - } - - // VisitPolicy - inline Stage* getNextStageToVisit( bool last_visit_was_successful ) - { - if ( last_visit_was_successful ) - next_stage_i = 0; - else - next_stage_i = ( next_stage_i + 1 ) % YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX; - - return stages[next_stage_i]; - } - - private: - unsigned char next_stage_i; - }; - - - class WavefrontVisitPolicy : public VisitPolicy - { - public: - WavefrontVisitPolicy( Stage** stages ) - : VisitPolicy( stages ) - { - forward = true; - next_stage_i = 0; - } - - // VisitPolicy - inline Stage* getNextStageToVisit( bool ) - { - if ( forward ) - { - if ( next_stage_i < YIELD_CONCURRENCY_STAGES_PER_GROUP_MAX - 1 ) - ++next_stage_i; - else - forward = false; - } - else - { - if ( next_stage_i > 0 ) - --next_stage_i; - else - forward = true; - } - - return stages[next_stage_i]; - } - - private: - bool forward; - unsigned char next_stage_i; - }; - - - class SEDAStageGroup : public StageGroupImpl - { - public: - SEDAStageGroup() { } - - template - YRO_NEW_REF Stage* - createStage - ( - EventHandlerType& event_handler, - int16_t thread_count - ) - { - if ( thread_count <= 0 ) - thread_count = ProcessorSet::getOnlinePhysicalProcessorCount(); - - Stage* stage; - if ( thread_count == 1 ) - { - stage - = new StageImpl - ( - event_handler, - *new STLEventQueue - ); - } - else - { - stage - = new StageImpl - ( - event_handler, - *new STLEventQueue - ); - } - - // TODO: check flags before sending this - //event_handler->handle( *new Stage::StartupEvent( stage ) ); - - this->addStage( stage ); - - startThreads( *stage, thread_count ); - - return stage; - } - - protected: - virtual ~SEDAStageGroup(); - - private: - class Thread; - vector threads; - void startThreads( Stage& stage, int16_t thread_count ); - }; - }; -}; - - -#endif diff --git a/share/yield/include/yield/ipc.h b/share/yield/include/yield/ipc.h deleted file mode 100644 index 8abdf48e8d6039fcf14051d3516dfc49fa17fdff..0000000000000000000000000000000000000000 --- a/share/yield/include/yield/ipc.h +++ /dev/null @@ -1,2440 +0,0 @@ -// Copyright (c) 2010 NEC HPC Europe -// -// All rights reserved -// -// This source file is part of the Yield project. -// It is licensed under the New BSD license: -// -// 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 the Yield project nor the -// names of its contributors may be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL NEC HPC Europe BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - -#ifndef _YIELD_IPC_H_ -#define _YIELD_IPC_H_ - -#include "yield/concurrency.h" - -#include -#include - -struct UriUriStructA; -struct yajl_gen_t; -typedef struct yajl_gen_t* yajl_gen; -struct yajl_handle_t; -typedef struct yajl_handle_t* yajl_handle; - - -#define YIELD_IPC_ONCRPC_ERROR( ClassName, ErrorCode, ErrorMessage ) \ - class ONCRPC ## ClassName ## Error : public Exception\ - {\ - public: \ - const static uint32_t ERROR_CODE = ErrorCode;\ - ONCRPC ## ClassName ## Error()\ - : Exception( ERROR_CODE, "ONC-RPC:" # ErrorMessage )\ - { }\ - };\ - - -namespace yield -{ - namespace ipc - { - class HTTPResponse; - class JSONRPCRequest; - class JSONRPCResponse; - class JSONValue; - class ONCRPCResponse; - class URI; - - using std::multimap; - using std::queue; - using std::stack; - - using yidl::runtime::Buffer; - using yidl::runtime::Map; - using yidl::runtime::MarshallableObject; - using yidl::runtime::Marshaller; - using yidl::runtime::Object; - using yidl::runtime::Sequence; - using yidl::runtime::Unmarshaller; - - using yield::concurrency::Message; - using yield::concurrency::MessageFactory; - using yield::concurrency::EventHandler; - using yield::concurrency::Exception; - using yield::concurrency::Request; - using yield::concurrency::RequestHandler; - using yield::concurrency::Response; - using yield::concurrency::ResponseHandler; - using yield::concurrency::SynchronizedSTLQueue; - - using yield::platform::Buffers; - using yield::platform::BufferedMarshaller; - using yield::platform::Log; - using yield::platform::Mutex; - using yield::platform::Path; - using yield::platform::Socket; - using yield::platform::SocketAddress; - using yield::platform::socket_t; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - using yield::platform::SSLContext; - using yield::platform::SSLSocket; -#endif - using yield::platform::StackBuffer; - using yield::platform::StreamSocket; - using yield::platform::StringBuffer; - using yield::platform::TCPSocket; - using yield::platform::Thread; - using yield::platform::UDPSocket; - using yield::platform::Time; - using yield::platform::XDRMarshaller; - using yield::platform::XDRUnmarshaller; - - - class RPCPeer - { - protected: - RPCPeer( YRO_NEW_REF MessageFactory& message_factory ) - : message_factory( message_factory ) - { } - - virtual ~RPCPeer() - { - MessageFactory::dec_ref( message_factory ); - } - - MessageFactory& get_message_factory() const { return message_factory; } - - private: - MessageFactory& message_factory; - }; - - - template - class RPCClient : public RPCPeer, public RequestHandler - { - protected: - RPCClient( YRO_NEW_REF MessageFactory& message_factory ) - : RPCPeer( message_factory ) - { } - - virtual ~RPCClient() { } - - protected: - class RPCResponseHandler : public ResponseHandler - { - public: - RPCResponseHandler( YRO_NEW_REF Request& request ) - : request( request ) - { } - - ~RPCResponseHandler() { Request::dec_ref( request ); } - - // ResponseHandler - void handle( Response& response ) - { - if ( response.get_type_id() == RPCResponseType::TYPE_ID ) - { - RPCResponseType& rpc_response - = static_cast( response ); - request.respond( rpc_response.get_body().inc_ref() ); - RPCResponseType::dec_ref( rpc_response ); - } - else if ( response.is_exception() ) - request.respond( response ); - else - DebugBreak(); - } - - private: - Request& request; - }; - }; - - - class RPCRequest : public Request - { - public: - Request& get_body() const { return body; } - - protected: - RPCRequest( YRO_NEW_REF Request& body ) : body( body ) { } - virtual ~RPCRequest() { Request::dec_ref( body ); } - - private: - Request& body; - }; - - - class RPCResponse : public Response - { - public: - Response& get_body() const { return body; } - - protected: - RPCResponse( YRO_NEW_REF Response& body ) : body( body ) { } - virtual ~RPCResponse() { Response::dec_ref( body ); } - - private: - Response& body; - }; - - - template - class RPCServer : public RPCPeer - { - protected: - RPCServer - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler - ) - : RPCPeer( message_factory ), - request_handler( request_handler ) - { } - - virtual ~RPCServer() - { - EventHandler::dec_ref( request_handler ); - } - - protected: - class RPCResponseHandler : public ResponseHandler - { - public: - RPCResponseHandler( YRO_NEW_REF RPCRequestType& rpc_request ) - : rpc_request( &rpc_request ) - { } - - ~RPCResponseHandler() - { - RPCRequestType::dec_ref( rpc_request ); - } - - // ResponseHandler - void handle( Response& response ) - { - rpc_request->respond( response ); - RPCRequestType::dec_ref( rpc_request ); // Have to do this to avoid - rpc_request = NULL; // circular references - } - - private: - RPCRequestType* rpc_request; - }; - - protected: - void handle( YRO_NEW_REF RPCRequestType& rpc_request ) - { - Request& request = rpc_request.get_body(); - request.set_response_handler( new RPCResponseHandler( rpc_request ) ); - request_handler.handle( request.inc_ref() ); - } - - private: - EventHandler& request_handler; - }; - - - class SocketPeer - { - protected: - SocketPeer( Log* error_log = NULL, Log* trace_log = NULL ); - virtual ~SocketPeer(); - - Log* get_error_log() const { return error_log; } - Log* get_trace_log() const { return trace_log; } - - private: - Log* error_log; - Log* trace_log; - }; - - - class SocketClient : public SocketPeer - { - public: - SocketAddress& get_peername() const { return peername; } - - protected: - SocketClient - ( - YRO_NEW_REF SocketAddress& peername, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~SocketClient(); - - private: - SocketAddress& peername; - }; - - - typedef SocketPeer SocketServer; - - - template - class StreamSocketClient : public SocketClient - { - public: - class Configuration : public Object - { - public: - const static uint16_t CONCURRENCY_LEVEL_DEFAULT = 1; - const static uint64_t CONNECT_TIMEOUT_DEFAULT = 5 * Time::NS_IN_S; - const static uint16_t RECONNECT_TRIES_MAX_DEFAULT = 2; - const static uint64_t RECV_TIMEOUT_DEFAULT = 5 * Time::NS_IN_S; - const static uint64_t SEND_TIMEOUT_DEFAULT = 5 * Time::NS_IN_S; - - public: - Configuration - ( - uint16_t concurrency_level = CONCURRENCY_LEVEL_DEFAULT, - const Time& connect_timeout = CONNECT_TIMEOUT_DEFAULT, - uint16_t reconnect_tries_max = RECONNECT_TRIES_MAX_DEFAULT, - const Time& recv_timeout = RECV_TIMEOUT_DEFAULT, - const Time& send_timeout = SEND_TIMEOUT_DEFAULT - ) - : concurrency_level( concurrency_level ), - connect_timeout( connect_timeout ), - reconnect_tries_max( reconnect_tries_max ), - recv_timeout( recv_timeout ), - send_timeout( send_timeout ) - { } - - uint16_t get_concurrency_level() const { return concurrency_level; } - const Time& get_connect_timeout() const { return connect_timeout; } - uint16_t get_reconnect_tries_max() const { return reconnect_tries_max; } - const Time& get_recv_timeout() const { return recv_timeout; } - const Time& get_send_timeout() const { return send_timeout; } - - // Object - Configuration& inc_ref() { return Object::inc_ref( *this ); } - - private: - uint16_t concurrency_level; - Time connect_timeout; - uint16_t reconnect_tries_max; - Time recv_timeout; - Time send_timeout; - }; - - public: - Configuration& get_configuration() const { return *configuration; } - - protected: - class Connection - : public StreamSocketType::AIOConnectCallback, - public StreamSocketType::AIORecvCallback, - public StreamSocketType::AIOSendCallback - { - public: - Connection( YRO_NEW_REF StreamSocketType&, StreamSocketClient& ); - virtual ~Connection(); - - void close(); - - protected: - void aio_recv( YRO_NEW_REF Buffer&, void* = 0, int flags = 0 ); - void aio_sendmsg( YRO_NEW_REF Buffers&, void* = 0, int flags = 0 ); - -#ifdef _DEBUG - void assert_single_threaded(); -#else - inline void assert_single_threaded() const { } -#endif - - Log* get_error_log() const { return error_log; } - SocketAddress& get_peername() const { return peername; } - StreamSocketType& get_stream_socket() const { return stream_socket; } - Log* get_trace_log() const { return trace_log; } - uint16_t get_remaining_connect_tries(); - virtual void onError( uint32_t error_code, void* context ); - void reset_connect_tries(); - - // Socket::AIOConnectCallback - virtual void onConnectCompletion( size_t bytes_written, void* ); - virtual void onConnectError( uint32_t error_code, void* context ); - - // Socket::AIORecvCallback - virtual void onReadError( uint32_t error_code, void* context ); - - // Socket::AIOSendCallback - virtual void onWriteError( uint32_t error_code, void* context ); - - private: - Time connect_timeout; - int16_t connect_tries; - Log* error_log; - SocketAddress& peername; - uint16_t reconnect_tries_max; - Time recv_timeout; - Time send_timeout; -#ifdef _DEBUG - unsigned long single_thread_id; -#endif - StreamSocketType& stream_socket; - Log* trace_log; - }; - - - template - class ConnectionQueue : private SynchronizedSTLQueue - { - public: - ConnectionQueue( uint16_t concurrency_level ) - : concurrency_level( concurrency_level ) - { } - - virtual ~ConnectionQueue() - { - vector connections; - - for ( uint16_t i = 0; i < concurrency_level; i++ ) - { - ConnectionType& connection = dequeue(); - connection.close(); - connections.push_back( &connection ); - } - - Thread::nanosleep( 0.1 ); // Allow Connections to get out of enqueue - - while ( !connections.empty() ) - { - ConnectionType::dec_ref( *connections.back() ); - connections.pop_back(); - } - } - - ConnectionType& dequeue() - { - return *SynchronizedSTLQueue::dequeue(); - } - - void enqueue( ConnectionType& connection ) - { - SynchronizedSTLQueue::enqueue( &connection ); - } - - private: - uint16_t concurrency_level; - }; - - protected: - StreamSocketClient - ( - YRO_NEW_REF SocketAddress& peername, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~StreamSocketClient(); - - private: - Configuration* configuration; - }; - - - template - class StreamSocketServer - : public SocketServer, - public StreamSocketType::AIOAcceptCallback - { - protected: - StreamSocketServer - ( - YRO_NEW_REF StreamSocketType& listen_stream_socket, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~StreamSocketServer(); - - StreamSocketType& get_listen_stream_socket() const - { - return listen_stream_socket; - } - - // StreamSocket::AIOAcceptCallback - virtual void onAcceptError( uint32_t error_code, void* ); - - protected: - class Connection - : public StreamSocketType::AIORecvCallback, - public StreamSocketType::AIOSendCallback - { - public: - StreamSocketType& get_stream_socket() const { return stream_socket; } - - // StreamSocket::AIORecvCallback - virtual void onReadError( uint32_t error_code, void* context ); - - // StreamSocket::AIOSendCallback - virtual void onWriteCompletion( size_t bytes_sent, void* context ); - virtual void onWriteError( uint32_t error_code, void* context ); - - protected: - Connection( YRO_NEW_REF StreamSocketType&, StreamSocketServer& ); - virtual ~Connection(); - - void aio_recv( YRO_NEW_REF Buffer&, void* = 0, int flags = 0 ); - void aio_sendmsg( YRO_NEW_REF Buffers&, void* = 0, int flags = 0 ); - - private: - StreamSocketType& stream_socket; - StreamSocketServer& stream_socket_server; - }; - - private: - void onReadError( Connection&, uint32_t error_code ); - void onWriteError( Connection&, uint32_t error_code ); - - private: - StreamSocketType& listen_stream_socket; - }; - - - class TCPSocketClient : public StreamSocketClient - { - public: - static YRO_NEW_REF TCPSocket& createTCPSocket( Log* trace_log = NULL ); - - protected: - TCPSocketClient - ( - YRO_NEW_REF SocketAddress& peername, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~TCPSocketClient() { } - }; - - - class TCPSocketServer : public StreamSocketServer - { - public: - static YRO_NEW_REF TCPSocket& - createListenTCPSocket - ( - const SocketAddress& sockname, - Log* trace_log = NULL - ); - - protected: - TCPSocketServer - ( - YRO_NEW_REF TCPSocket& listen_tcp_socket, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~TCPSocketServer() { } - - TCPSocket& get_listen_tcp_socket() const; - static bool init_listen_tcp_socket( TCPSocket&, const SocketAddress& ); - }; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - class SSLSocketClient : public TCPSocketClient - { - public: - static YRO_NEW_REF SSLSocket& - createSSLSocket - ( - SSLContext* ssl_context = NULL, - Log* trace_log = NULL - ); - - protected: - SSLSocketClient - ( - YRO_NEW_REF SocketAddress& peername, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~SSLSocketClient() { } - }; - - - class SSLSocketServer : public TCPSocketServer - { - public: - static YRO_NEW_REF SSLSocket& - createListenSSLSocket - ( - const SocketAddress& sockname, - SSLContext& ssl_context, - Log* trace_log = NULL - ); - - protected: - SSLSocketServer - ( - YRO_NEW_REF SSLSocket& listen_ssl_socket, - Log* error_log = NULL, - Log* trace_log = NULL - ); - }; -#endif - - - class UDPSocketClient - : public SocketClient, - public UDPSocket::AIORecvCallback - { - public: - const static uint64_t RECV_TIMEOUT_DEFAULT = 5 * Time::NS_IN_S; - - public: - static YRO_NEW_REF UDPSocket& - createConnectedUDPSocket - ( - const URI& absolute_uri, - Log* trace_log = NULL - ); - - static YRO_NEW_REF UDPSocket& createUDPSocket( Log* trace_log = NULL ); - - const Time& get_recv_timeout() const { return recv_timeout; } - - protected: - UDPSocketClient - ( - YRO_NEW_REF SocketAddress& peername, - YRO_NEW_REF UDPSocket& udp_socket, - Log* error_log = NULL, - const Time& recv_timeout = RECV_TIMEOUT_DEFAULT, - Log* trace_log = NULL - ); - - - UDPSocket& get_udp_socket() const { return udp_socket; } - - // UDPSocket::AIORecvCallback - virtual void onReadCompletion( Buffer& buffer, void* context ); - virtual void onReadError( uint32_t error_code, void* context ); - - private: - Time recv_timeout; - UDPSocket& udp_socket; - }; - - - class UDPSocketServer - : public SocketServer, - public UDPSocket::AIORecvFromCallback - { - public: - static YRO_NEW_REF UDPSocket& - createBoundUDPSocket - ( - const SocketAddress& sockname, - Log* trace_log = NULL - ); - - protected: - UDPSocketServer - ( - YRO_NEW_REF UDPSocket& udp_socket, - Log* error_log, - Log* trace_log - ); - - virtual ~UDPSocketServer(); - - UDPSocket& get_udp_socket() const { return udp_socket; } - - protected: - class ResponseHandler : public yield::concurrency::ResponseHandler - { - protected: - ResponseHandler( SocketAddress& peername, UDPSocket& udp_socket ); - virtual ~ResponseHandler(); - - const SocketAddress& get_peername() const { return peername; } - UDPSocket& get_udp_socket() const { return udp_socket; } - - private: - SocketAddress& peername; - UDPSocket& udp_socket; - }; - - private: - UDPSocket& udp_socket; - }; - - - class HTTPMessage - { - public: - typedef pair FieldOffset; - typedef vector FieldOffsets; - - public: - Buffer* get_body() const { return body; } - - const char* - get_field - ( - const char* name, - const char* default_value = "" - ) const; - - Time get_time_field( const char* name ) const; - - const char* operator[]( const char* name ) { return get_field( name ); } - - void set_body( YRO_NEW_REF Buffer* body ); - // set_field: char* copies into a buffer, const char* does not - void set_field( const char* name, const char* value ); - void set_field( const char* name, char* value ); - void set_field( char* name, char* value ); - void set_field( const string& name, const string& value ); - void set_field( const char* name, const Time& value ); - - protected: - HTTPMessage( YRO_NEW_REF Buffer* body = NULL ); - - HTTPMessage - ( - YRO_NEW_REF Buffer& header, - const FieldOffsets& field_offsets, - YRO_NEW_REF Buffer* body = NULL - ); - - virtual ~HTTPMessage(); - - Buffers& get_header() const { return *header; } - - virtual YRO_NEW_REF Buffers& marshal() const; - - private: - template friend class HTTPMessageParser; - - static const char* - get_field - ( - Buffer& header, - const FieldOffsets& field_offsets, - const char* name, - const char* default_value = "" - ); - - private: - Buffer* body; - FieldOffsets field_offsets; - Buffers* header; - }; - - - template - class HTTPMessageParser - { - public: - HTTPMessageType* parse( const string& buffer ); // For testing - - bool - parse - ( - Buffer& buffer, - HTTPMessageType*& out_http_message, - Buffer** out_next_buffer = NULL - ); - - static Time parse_http_date( const char* http_date ); - - protected: - HTTPMessageParser(); - virtual ~HTTPMessageParser(); - - private: - YRO_NEW_REF HTTPMessageType* createHTTPMessage( Buffer* body = NULL ); - size_t get_content_length(); - bool parse_body( Buffer&, HTTPMessageType*&, Buffer** ); - bool parse_header( Buffer&, HTTPMessageType*&, Buffer** ); - bool parse_header( char** inout_p, const char* pe ); - void reset(); - - private: - // Parse state - Buffer* body; - size_t content_length; - HTTPMessage::FieldOffsets field_offsets; - Buffer* header; - }; - - - class HTTPRequest : public Request, public HTTPMessage - { - public: - HTTPRequest - ( - const char* method, - const char* uri, - YRO_NEW_REF Buffer* body = NULL - ); - - HTTPRequest - ( - const char* method, - const URI& uri, - YRO_NEW_REF Buffer* body = NULL - ); - - virtual ~HTTPRequest(); - - const Time& get_creation_time() const { return creation_time; } - double get_http_version() const; // double to allow literal comparisons - const char* get_method() const; - URI& get_parsed_uri(); - const char* get_uri() const; - - YRO_NEW_REF Buffers& marshal() const { return HTTPMessage::marshal(); } - void respond( YRO_NEW_REF HTTPResponse& http_response ); - void respond( uint16_t status_code, YRO_NEW_REF Buffer* body = NULL ); - void respond( YRO_NEW_REF Exception& exception ); - - // Object - HTTPRequest& inc_ref() { return Object::inc_ref( *this ); } - - // MarshallableObject - const static uint32_t TYPE_ID = 205; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "HTTPRequest"; } - void marshal( Marshaller& marshaller ) const { } - void unmarshal( Unmarshaller& ) { } - - private: - friend class HTTPRequestParser; - - HTTPRequest - ( - YRO_NEW_REF Buffer& header, - uint16_t method_offset, // Into header - uint16_t uri_offset, - uint16_t http_version_offset, - const FieldOffsets& field_offsets, - YRO_NEW_REF Buffer* body = NULL - ); - - HTTPRequest( const HTTPRequest& ) { DebugBreak(); } // Prevent copying - - void init( const char* method, const char* uri ); - - private: - Time creation_time; - uint16_t method_offset, uri_offset, http_version_offset; - URI* parsed_uri; - }; - - - class HTTPRequestHandler : public RequestHandler - { - public: - virtual void handle( YRO_NEW_REF HTTPRequest& http_request ) = 0; - - // RequestHandler - virtual void handle( YRO_NEW_REF Request& request ); - }; - - - class HTTPRequestParser - : public HTTPMessageParser - { - public: - HTTPRequestParser(); - - private: - template friend class HTTPMessageParser; - - // HTTPMessageParser downcalls - YRO_NEW_REF HTTPRequest* - createHTTPMessage - ( - Buffer& header, - const HTTPMessage::FieldOffsets& field_offsets, - YRO_NEW_REF Buffer* body = NULL - ); - - bool parse_first_header_line( char** inout_p, const char* pe ); - - private: - uint16_t method_offset, uri_offset, http_version_offset; - }; - - - class HTTPResponse : public Response, public HTTPMessage - { - public: - HTTPResponse - ( - uint16_t status_code = 200, - YRO_NEW_REF Buffer* body = NULL - ); - - virtual ~HTTPResponse() { } - - uint16_t get_status_code() const { return status_code; } - YRO_NEW_REF Buffers& marshal() const { return HTTPMessage::marshal(); } - - // Object - HTTPResponse& inc_ref() { return Object::inc_ref( *this ); } - - // MarshallableObject - const static uint32_t TYPE_ID = 206; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "HTTPResponse"; } - void marshal( Marshaller& marshaller ) const { } - void unmarshal( Unmarshaller& ) { } - - private: - friend class HTTPResponseParser; - - HTTPResponse - ( - Buffer& header, - const FieldOffsets& field_offsets, - uint16_t status_code, - Buffer* body - ); - - HTTPResponse( const HTTPResponse& ) { DebugBreak(); } // Prevent copying - - void init( uint16_t status_code ); - - private: - uint16_t status_code; - }; - - - typedef yield::concurrency::ResponseQueue HTTPResponseQueue; - - - class HTTPResponseParser - : public HTTPMessageParser - { - public: - HTTPResponseParser(); - - private: - template friend class HTTPMessageParser; - - // HTTPMessageParser downcalls - YRO_NEW_REF HTTPResponse* - createHTTPMessage - ( - Buffer& header, - const HTTPMessage::FieldOffsets& field_offsets, - YRO_NEW_REF Buffer* body = NULL - ); - - bool parse_first_header_line( char** inout_p, const char* pe ); - - private: - uint16_t status_code; - }; - - - class HTTPClient : public HTTPRequestHandler, public TCPSocketClient - { - public: - HTTPClient - ( - YRO_NEW_REF SocketAddress& peername, - YRO_NEW_REF TCPSocket& tcp_socket, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~HTTPClient() { } - - static YRO_NEW_REF HTTPClient& - create - ( - const URI& absolute_uri, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - static YRO_NEW_REF HTTPResponse& GET( const URI& absolute_uri ); - - static - YRO_NEW_REF HTTPResponse& - PUT - ( - const URI& absolute_uri, - YRO_NEW_REF Buffer& body - ); - - static - YRO_NEW_REF HTTPResponse& - PUT - ( - const URI& absolute_uri, - const Path& body_file_path - ); - - // Object - HTTPClient& inc_ref() { return Object::inc_ref( *this ); } - - // HTTPRequestHandler - void handle( HTTPRequest& request ); - - private: - class Connection - : public TCPSocketClient::Connection, - private HTTPResponseParser - { - public: - Connection( HTTPClient&, YRO_NEW_REF TCPSocket& ); - - void handle( YRO_NEW_REF HTTPRequest& http_request ); - - private: - // TCPSocketClient::Connection - void onError( uint32_t error_code, void* context ); - - // TCPSocket::AIORecvCallback - void onReadCompletion( Buffer& buffer, void* context ); - - // TCPSocket::AIOSendCallback - void onWriteCompletion( size_t bytes_sent, void* context ); - void onWriteError( uint32_t error_code, void* context ); - - private: - HTTPClient::ConnectionQueue& connection_queue; - queue live_http_requests; - }; - - typedef ConnectionQueue ConnectionQueue; - ConnectionQueue connection_queue; - }; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - class HTTPSClient : public HTTPClient - { - public: - HTTPSClient - ( - YRO_NEW_REF SocketAddress& peername, - YRO_NEW_REF SSLSocket& ssl_socket, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~HTTPSClient() { } - - static HTTPSClient& - create - ( - const URI& absolute_uri, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL, - SSLContext* ssl_context = NULL - ); - }; -#endif - - - class HTTPServer : public TCPSocketServer - { - public: - class AccessLog : public Object - { - public: - class Format - { - public: - virtual string - operator() - ( - const HTTPRequest&, - const HTTPResponse& - ) const = 0; - }; - - class CommonFormat : public Format - { - public: - virtual string - operator() - ( - const HTTPRequest&, - const HTTPResponse& - ) const; - }; - - class CombinedFormat : public CommonFormat - { - public: - string operator()( const HTTPRequest&, const HTTPResponse& ) const; - }; - - public: - virtual ~AccessLog(); - - static AccessLog& - open - ( - const Path& file_path, - Format* format = NULL, // Steals this, defaults to CombinedFormat - bool lazy_open = false - ); - - static AccessLog& - open - ( - ostream&, - Format* format = NULL // Steals this, defaults to CombinedFormat - ); - - virtual void write( const HTTPRequest&, const HTTPResponse& ) = 0; - - protected: - AccessLog( Format& format ); - - Format& get_format() { return format; } - - private: - Format& format; - }; - - public: - HTTPServer - ( - YRO_NEW_REF EventHandler& http_request_handler, - YRO_NEW_REF TCPSocket& listen_tcp_socket, - YRO_NEW_REF AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~HTTPServer(); - - static HTTPServer& - create - ( - YRO_NEW_REF EventHandler& http_request_handler, - const SocketAddress& sockname, - YRO_NEW_REF AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - // Object - HTTPServer& inc_ref() { return Object::inc_ref( *this ); } - - private: - // TCPSocket::AIOAcceptCallback - virtual void onAcceptCompletion( TCPSocket&, void*, Buffer* ); - - private: - class Connection; - class FileAccessLog; - class ostreamAccessLog; - - private: - AccessLog* access_log; - EventHandler& http_request_handler; - }; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - class HTTPSServer : public HTTPServer - { - public: - HTTPSServer - ( - YRO_NEW_REF EventHandler& http_request_handler, - YRO_NEW_REF SSLSocket& listen_ssl_socket, - YRO_NEW_REF AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - static HTTPSServer& - create - ( - YRO_NEW_REF EventHandler& http_request_handler, - const SocketAddress& sockname, - SSLContext& ssl_context, - YRO_NEW_REF AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - }; -#endif - - - class JSONMarshaller : public Marshaller - { - public: - JSONMarshaller(); - virtual ~JSONMarshaller(); - - Buffer& get_buffer() const { return *buffer; } - - void write( const JSONRPCRequest& json_rpc_request ); - void write( const JSONRPCResponse& json_rpc_response ); - void write( const char* key, const JSONValue& value ); - virtual void write( const Key& key, const JSONValue& value ); - void write( const MarshallableObject& value ) { write( &value ); } - void write( const MarshallableObject* value ) { write_object( value ); } - void write( const Sequence& value ) { write( &value ); } - void write( const Sequence* value ) { write_array( value ); } - - void write_array( const char* key, const MarshallableObject* value ); - virtual void write_array( const Key& key, const MarshallableObject* ); - virtual void write_array( const MarshallableObject* value ); - void write_null( const char* key ); - virtual void write_null( const Key& key ); - void write_object( const char* key, const MarshallableObject* value ); - virtual void write_object( const Key& key, const MarshallableObject* ); - virtual void write_object( const MarshallableObject* value ); - - // Marshaller - virtual void write( const Key& key, bool value ); - virtual void write( const Key& key, double value ); - virtual void write( const Key& key, int64_t value ); - virtual void write( const Key& key, const MarshallableObject& value ); - virtual void write( const Key& key, const Sequence& value ); - virtual void write( const Key& key, const char* value, size_t ); - - protected: - virtual void write( const Key& ); - - private: - void flushYAJLBuffer(); - - private: - Buffer* buffer; - stack in_map_stack; - yajl_gen writer; - }; - - - class JSONValue : public Object - { - public: - enum Type - { - TYPE_ARRAY, - TYPE_FALSE, - TYPE_NULL, - TYPE_NUMBER, - TYPE_OBJECT, - TYPE_STRING, - TYPE_TRUE - }; - - JSONValue( Type type ) : type( type ) { } - - inline Type get_type() const { return type; } - - // Object - JSONValue& inc_ref() { return Object::inc_ref( *this ); } - - private: - Type type; - }; - - - class JSONArray : public JSONValue, public vector - { - public: - JSONArray() : JSONValue( TYPE_ARRAY ) { } - }; - - - class JSONNumber : public JSONValue - { - public: - JSONNumber( double value ) : JSONValue( TYPE_NUMBER ), value( value ) { } - inline operator double() const { return value; } - - private: - double value; - }; - - - class JSONString : public JSONValue - { - public: - JSONString - ( - Buffer& underlying_buffer, - const unsigned char* value, - unsigned int value_len - ) - : JSONValue( TYPE_STRING ), - underlying_buffer( underlying_buffer.inc_ref() ), - value( value ), - value_len( value_len ) - { } - - inline operator const unsigned char*() const { return value; } - - operator const char*() const - { - return reinterpret_cast( value ); - } - - inline unsigned int size() const { return value_len; } - - private: - Buffer& underlying_buffer; - const unsigned char* value; - unsigned int value_len; - }; - - - class JSONObject - : public JSONValue, - public vector< pair > - { - public: - JSONObject() : JSONValue( TYPE_OBJECT ) { } - - JSONValue* operator[]( const char* name ) - { - for ( const_iterator pair_i = begin(); pair_i != end(); ++pair_i ) - if ( strncmp( *pair_i->first, name, pair_i->first->size() ) == 0 ) - return pair_i->second; - - return NULL; - } - }; - - - class JSONParser - { - public: - JSONParser(); - ~JSONParser(); - - YRO_NEW_REF JSONValue* parse( Buffer& buffer ); - - private: - void handleJSONValue( JSONValue& json_value ); - - // yajl callbacks - static int handle_yajl_boolean( void*, int value ); - static int handle_yajl_double( void*, double value ); - static int handle_yajl_end_array( void* ); - static int handle_yajl_end_map( void* ); - static int handle_yajl_integer( void*, long value ); - static int handle_yajl_map_key( void*, const uint8_t*, unsigned int ); - static int handle_yajl_null( void* ); - static int handle_yajl_start_array( void* ); - static int handle_yajl_start_map( void* ); - static int handle_yajl_string( void*, const uint8_t*, unsigned int ); - - private: - Buffer* buffer; - JSONValue *JSONfalse, *JSONnull, *JSONtrue; - stack json_value_stack; - JSONString* next_map_key; - yajl_handle reader; - }; - - - class JSONRPCMessage - { - public: - JSONValue& get_id() const { return id; } - - protected: - JSONRPCMessage( JSONValue& id ) : id( id ) { } - virtual ~JSONRPCMessage() { JSONValue::dec_ref( id ); } - - private: - JSONValue& id; - }; - - - class JSONRPCMessageParser - { - protected: - JSONRPCMessageParser( MessageFactory& message_factory ) - : message_factory( message_factory.inc_ref() ) - { } - - virtual ~JSONRPCMessageParser() - { - MessageFactory::dec_ref( message_factory ); - } - - MessageFactory& get_message_factory() const { return message_factory; } - - private: - MessageFactory& message_factory; - }; - - - class JSONRPCRequest : public RPCRequest, public JSONRPCMessage - { - public: - JSONRPCRequest - ( - YRO_NEW_REF Request& body, - YRO_NEW_REF HTTPRequest& http_request, - YRO_NEW_REF JSONValue& id - ); - - virtual ~JSONRPCRequest(); - - HTTPRequest& get_http_request() const { return http_request; } - - YRO_NEW_REF Buffers& marshal() const; - void marshal( JSONMarshaller& json_marshaller ) const; - void respond( YRO_NEW_REF JSONRPCResponse& response ); - void respond( YRO_NEW_REF Response& response ); - - // Object - JSONRPCRequest& inc_ref() { return Object::inc_ref( *this ); } - - // MarshallableObject - const static uint32_t TYPE_ID = 313; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "JSONRPCRequest"; } - void marshal( Marshaller& marshaller ) const { } - void unmarshal( Unmarshaller& unmarshaller ) { } - - private: - HTTPRequest& http_request; - }; - - - class JSONRPCRequestHandler : public RequestHandler - { - public: - virtual void handle( YRO_NEW_REF JSONRPCRequest& json_rpc_request ) = 0; - - // RequestHandler - virtual void handle( YRO_NEW_REF Request& request ); - }; - - - class JSONRPCRequestParser : private JSONRPCMessageParser - { - public: - JSONRPCRequestParser( MessageFactory& message_factory ); - virtual ~JSONRPCRequestParser() { } - - YRO_NEW_REF JSONRPCRequest* parse( YRO_NEW_REF HTTPRequest& ); - - private: - YRO_NEW_REF JSONRPCRequest* parse( Buffer&, YRO_NEW_REF HTTPRequest& ); - }; - - - class JSONRPCResponse : public RPCResponse, public JSONRPCMessage - { - public: - JSONRPCResponse - ( - YRO_NEW_REF Response& body, - YRO_NEW_REF HTTPResponse& http_response, - YRO_NEW_REF JSONValue& id - ); - - virtual ~JSONRPCResponse(); - - HTTPResponse& get_http_response() const { return http_response; } - YRO_NEW_REF Buffers& marshal() const; - void marshal( JSONMarshaller& json_marshaller ) const; - - // Object - JSONRPCResponse& inc_ref() { return Object::inc_ref( *this ); } - - // MarshallableObject - const static uint32_t TYPE_ID = 314; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "JSONRPCResponse"; } - void marshal( Marshaller& marshaller ) const { } - void unmarshal( Unmarshaller& unmarshaller ) { } - - private: - HTTPResponse& http_response; - }; - - - class JSONRPCResponseParser : private JSONRPCMessageParser - { - public: - JSONRPCResponseParser( MessageFactory& message_factory ); - virtual ~JSONRPCResponseParser() { } - - JSONRPCResponse* parse( HTTPResponse&, JSONRPCRequest& ); - }; - - - class JSONRPCClient - : public RPCClient, - public TCPSocketClient - { - public: - JSONRPCClient - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF SocketAddress& peername, - const URI& post_uri, // e.g. /JSONRPC - YRO_NEW_REF TCPSocket& tcp_socket, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~JSONRPCClient(); - - static JSONRPCClient& - create - ( - const URI& absolute_uri, - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - // RequestHandler - virtual void handle( YRO_NEW_REF Request& request ); - - private: - class Connection - : public TCPSocketClient::Connection, - public HTTPResponseParser, - public JSONRPCResponseParser - { - public: - Connection( JSONRPCClient&, YRO_NEW_REF TCPSocket& ); - - void handle( YRO_NEW_REF JSONRPCRequest& ); - - private: - // TCPSocket::AIORecvCallback - void onReadCompletion( Buffer& buffer, void* context ); - - // TCPSocket::AIOSendCallback - void onWriteCompletion( size_t bytes_sent, void* context ); - void onWriteError( uint32_t error_code, void* context ); - - // StreamSocketClient::Connection - void onError( uint32_t error_code, void* context ); - - private: - JSONRPCClient::ConnectionQueue& connection_queue; - queue live_json_rpc_requests; - }; - - typedef ConnectionQueue ConnectionQueue; - ConnectionQueue connection_queue; - - URI* post_uri; - }; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - class JSONRPCSClient : public JSONRPCClient - { - public: - JSONRPCSClient - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF SocketAddress& peername, - const URI& post_uri, // e.g. /JSONRPC - YRO_NEW_REF SSLSocket& ssl_socket, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~JSONRPCSClient() { } - - static JSONRPCSClient& - create - ( - const URI& absolute_uri, - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - SSLContext* ssl_context = NULL, - Log* trace_log = NULL - ); - }; -#endif - - - class JSONRPCServer - : public RPCServer, - public TCPSocketServer - { - public: - JSONRPCServer - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF TCPSocket& listen_tcp_socket, - YRO_NEW_REF EventHandler& request_handler, - YRO_NEW_REF HTTPServer::AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~JSONRPCServer() { } - - static JSONRPCServer& - create - ( - MessageFactory& message_factory, // Steals this reference - EventHandler& request_handler, // Steals this reference - const SocketAddress& sockname, - YRO_NEW_REF HTTPServer::AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - private: - // TCPSocket::AIOAcceptCallback - virtual void onAcceptCompletion( TCPSocket&, void*, Buffer* ); - - private: - class Connection; - - private: - HTTPServer::AccessLog* access_log; - }; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - class JSONRPCSServer : public JSONRPCServer - { - public: - JSONRPCSServer - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF SSLSocket& listen_ssl_socket, - YRO_NEW_REF EventHandler& request_handler, - YRO_NEW_REF HTTPServer::AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~JSONRPCSServer() { } - - static JSONRPCSServer& - create - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - const SocketAddress& sockname, - SSLContext& ssl_context, - YRO_NEW_REF HTTPServer::AccessLog* access_log = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - }; -#endif - - - class JSONUnmarshaller : public Unmarshaller - { - public: - JSONUnmarshaller( const JSONValue& root_json_value ); - virtual ~JSONUnmarshaller() { } - - void read( Map& value ); - void read( MarshallableObject& value ); - void read( Sequence& value ); - - // Unmarshaller - virtual bool read_bool( const Key& key ); - virtual void read( const Key& key, double& value ); - virtual void read( const Key& key, int64_t& value ); - virtual Key* read( Key::Type ); - virtual void read( const Key& key, Map& value ); - virtual void read( const Key& key, MarshallableObject& value ); - virtual void read( const Key& key, Sequence& value ); - virtual void read( const Key& key, string& value ); - - private: - const JSONValue* read( const Key& key ); - - private: - const JSONValue& root_json_value; - size_t next_json_value_i; - }; - - - - YIELD_IPC_ONCRPC_ERROR( ProgramUnavailable, 1, "program unavailable" ); - YIELD_IPC_ONCRPC_ERROR( ProgramMismatch, 2, "program mismatch" ); - YIELD_IPC_ONCRPC_ERROR( ProcedureUnavailable, 3, "procedure unavailable" ); - YIELD_IPC_ONCRPC_ERROR( GarbageArguments, 4, "garbage arguments" ); - YIELD_IPC_ONCRPC_ERROR( System, 5, "system error" ); - YIELD_IPC_ONCRPC_ERROR( RPCMismatch, 6, "RPC version mismatch" ); - - - class ONCRPCMessage - { - public: - enum auth_flavor { AUTH_NONE = 0, AUTH_SYS = 1, AUTH_SHORT = 2 }; - enum msg_type { CALL = 0, REPLY = 1 }; - - public: - virtual ~ONCRPCMessage(); - - MarshallableObject* get_verf() const { return verf; } - uint32_t get_xid() const { return xid; } - - protected: - ONCRPCMessage( YRO_NEW_REF MarshallableObject* verf, uint32_t xid ); - - void marshal_opaque_auth( Marshaller&, MarshallableObject* ) const; - - private: - MarshallableObject* verf; - uint32_t xid; - }; - - - template - class ONCRPCMessageParser - { - protected: - ONCRPCMessageParser( MessageFactory&, bool parse_records ); - virtual ~ONCRPCMessageParser(); - - MessageFactory& get_message_factory() const { return message_factory; } - - bool - parse - ( - Buffer& buffer, - ONCRPCMessageType*& out_onc_rpc_message, - Buffer** out_next_buffer = NULL - ); - - MarshallableObject* unmarshal_opaque_auth( XDRUnmarshaller& ); - - private: - MessageFactory& message_factory; - bool parse_records; - }; - - - class ONCRPCRequest : public RPCRequest, public ONCRPCMessage - { - public: - ONCRPCRequest - ( - YRO_NEW_REF Request& body, - uint32_t prog, - uint32_t vers, - uint32_t xid, - YRO_NEW_REF MarshallableObject* cred = NULL, // = AUTH_NONE - YRO_NEW_REF MarshallableObject* verf = NULL // = AUTH_NONE - ); - - MarshallableObject* get_cred() const { return get_credentials(); } - uint32_t get_proc() const { return get_body().get_type_id(); } - uint32_t get_prog() const { return prog; } - uint32_t get_vers() const { return vers; } - YRO_NEW_REF Buffers& marshal( bool in_record = false ) const; - void respond( YRO_NEW_REF ONCRPCResponse& response ); - void respond( YRO_NEW_REF Response& response ); - void respond( YRO_NEW_REF Exception& response ); - - // Object - ONCRPCRequest& inc_ref() { return Object::inc_ref( *this ); } - - // MarshallableObject - const static uint32_t TYPE_ID = 213; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ONCRPCRequest"; } - void marshal( Marshaller& marshaller ) const; - void unmarshal( Unmarshaller& unmarshaller ) { } - - private: - uint32_t prog, vers; - }; - - - class ONCRPCRequestHandler : public RequestHandler - { - public: - virtual void handle( YRO_NEW_REF ONCRPCRequest& onc_rpc_request ) = 0; - - // RequestHandler - virtual void handle( YRO_NEW_REF Request& request ); - }; - - - class ONCRPCRequestParser - : public ONCRPCMessageParser - { - public: - ONCRPCRequestParser( MessageFactory&, bool parse_records = false ); - - bool - parse - ( - Buffer& buffer, - Message*& out_onc_rpc_message, - Buffer** out_next_buffer = NULL - ); - - private: - template friend class ONCRPCMessageParser; - // ONCRPCMessageParser - Message* unmarshalONCRPCMessage( XDRUnmarshaller& ); - }; - - - class ONCRPCResponse : public RPCResponse, public ONCRPCMessage - { - public: - enum accept_stat - { - SUCCESS = 0, - PROG_UNAVAIL = 1, - PROG_MISMATCH = 2, - PROC_UNAVAIL = 3, - GARBAGE_ARGS = 4, - SYSTEM_ERR = 5 - }; - - enum auth_stat - { - AUTH_OK = 0, - AUTH_BADCRED = 1, - AUTH_REJECTEDCRED = 2, - AUTH_BADVERF = 3, - AUTH_REJECTEDVERF = 4, - AUTH_TOOWEAK = 5, - AUTH_INVALIDRESP = 6, - AUTH_FAILED = 7 - }; - - struct mismatch_info - { - uint32_t low; - uint32_t high; - }; - - enum reject_stat { RPC_MISMATCH = 0, AUTH_ERROR = 1 }; - enum reply_stat { MSG_ACCEPTED = 0, MSG_DENIED = 1 }; - - public: - // Accepted reply (MSG_ACCEPTED) - SUCCESS accept_stat - ONCRPCResponse - ( - YRO_NEW_REF Response& body, - uint32_t xid, - YRO_NEW_REF MarshallableObject* verf = NULL // = AUTH_NONE - ); - - // Accepted reply (MSG_ACCEPTED) - other accept_stat = body.get_type_id() - ONCRPCResponse - ( - YRO_NEW_REF Exception& body, - uint32_t xid, - YRO_NEW_REF MarshallableObject* verf = NULL // = AUTH_NONE - ); - - // Rejected reply (MSG_DENIED) - RPC_MISMATCH - ONCRPCResponse( const struct mismatch_info&, uint32_t xid ); - - // Rejected reply (MSG_DENIED ) - AUTH_ERROR - ONCRPCResponse( auth_stat, uint32_t xid ); - - YRO_NEW_REF Buffers& marshal( bool in_record = false ) const; - - // Object - ONCRPCResponse& inc_ref() { return Object::inc_ref( *this ); } - - // MarshallableObject - const static uint32_t TYPE_ID = 214; - uint32_t get_type_id() const { return TYPE_ID; } - const char* get_type_name() const { return "ONCRPCResponse"; } - void marshal( Marshaller& marshaller ) const; - void unmarshal( Unmarshaller& unmarshaller ) { } - - private: - uint32_t accept_stat_; - auth_stat auth_stat_; - struct mismatch_info mismatch_info_; - reject_stat reject_stat_; - reply_stat reply_stat_; - }; - - - class ONCRPCResponseParser - : public ONCRPCMessageParser - { - public: - ONCRPCResponseParser( MessageFactory&, bool parse_records = false ); - - bool - parse - ( - Buffer& buffer, - ONCRPCRequest& onc_rpc_request, - ONCRPCResponse*& out_onc_rpc_response, - Buffer** out_next_buffer = NULL - ); - - private: - template friend class ONCRPCMessageParser; - // ONCRPCMessageParser - ONCRPCResponse* unmarshalONCRPCMessage( XDRUnmarshaller& ); - - private: - ONCRPCRequest* onc_rpc_request; - }; - - - class ONCRPCAuthError : public Exception - { - public: - const static uint32_t ERROR_CODE = 7; - - ONCRPCAuthError( ONCRPCResponse::auth_stat auth_stat_ ) - : Exception( ERROR_CODE, "ONC-RPC: auth error" ), - auth_stat_( auth_stat_ ) - { } - - ONCRPCResponse::auth_stat get_auth_stat() const { return auth_stat_; } - - private: - ONCRPCResponse::auth_stat auth_stat_; - }; - - - class ONCRPCClient : public RPCClient - { - public: - virtual ~ONCRPCClient() { } - - uint32_t get_prog() const { return prog; } - uint32_t get_vers() const { return vers; } - - virtual void handle( YRO_NEW_REF ONCRPCRequest& onc_rpc_request ) = 0; - - // RequestHandler - virtual void handle( YRO_NEW_REF Request& request ); - - protected: - ONCRPCClient - ( - YRO_NEW_REF MessageFactory& message_factory, - uint32_t prog, - uint32_t vers - ); - - private: - uint32_t prog, vers; - }; - - - typedef RPCServer ONCRPCServer; - - - template - class ONCRPCStreamSocketClient - : public ONCRPCClient, - public StreamSocketClient - { - public: - typedef typename - StreamSocketClient::Configuration Configuration; - - ONCRPCStreamSocketClient - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF SocketAddress& peername, - uint32_t prog, - YRO_NEW_REF StreamSocketType& stream_socket, - uint32_t vers, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~ONCRPCStreamSocketClient() { } - - private: - // ONCRPCClient - virtual void handle( YRO_NEW_REF ONCRPCRequest& onc_rpc_request ); - - private: - class Connection - : public StreamSocketClient::Connection, - private ONCRPCResponseParser - { - public: - Connection - ( - ONCRPCStreamSocketClient&, - YRO_NEW_REF StreamSocketType& stream_socket - ); - - void handle( YRO_NEW_REF ONCRPCRequest& onc_rpc_request ); - - private: - // StreamSocket::AIORecvCallback - void onReadCompletion( Buffer& buffer, void* context ); - - // StreamSocket::AIOSendCallback - void onWriteCompletion( size_t bytes_sent, void* context ); - void onWriteError( uint32_t error_code, void* context ); - - // StreamSocketClient::Connection - void onError( uint32_t error_code, void* context ); - - private: - typedef typename StreamSocketClient:: - template ConnectionQueue ConnectionQueue; - ConnectionQueue& connection_queue; - - map live_onc_rpc_requests; - }; - - typedef typename StreamSocketClient:: - template ConnectionQueue ConnectionQueue; - ConnectionQueue connection_queue; - }; - - - template - class ONCRPCStreamSocketServer - : private ONCRPCServer, - public StreamSocketServer - { - public: - ONCRPCStreamSocketServer - ( - YRO_NEW_REF StreamSocketType& listen_stream_socket, - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~ONCRPCStreamSocketServer() { } - - private: - // StreamSocketType::AIOAcceptCallback - void onAcceptCompletion( StreamSocketType&, void*, Buffer* ); - - private: - class Connection; - }; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - class ONCRPCSSLSocketClient : public ONCRPCStreamSocketClient - { - public: - ONCRPCSSLSocketClient - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF SocketAddress& peername, - uint32_t prog, - YRO_NEW_REF SSLSocket& ssl_socket, - uint32_t vers, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~ONCRPCSSLSocketClient() { } - - static ONCRPCSSLSocketClient& - create - ( - const URI& absolute_uri, - YRO_NEW_REF MessageFactory& message_factory, - uint32_t prog, - uint32_t vers, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - SSLContext* ssl_context = NULL, - Log* trace_log = NULL - ); - }; - - - class ONCRPCSSLSocketServer : public ONCRPCStreamSocketServer - { - public: - ONCRPCSSLSocketServer - ( - YRO_NEW_REF SSLSocket& listen_ssl_socket, - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - static ONCRPCSSLSocketServer& - create - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - const SocketAddress& sockname, - SSLContext& ssl_context, - Log* error_log = NULL, - Log* trace_log = NULL - ); - }; -#endif - - - class ONCRPCTCPSocketClient : public ONCRPCStreamSocketClient - { - public: - ONCRPCTCPSocketClient - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF SocketAddress& peername, - uint32_t prog, - YRO_NEW_REF TCPSocket& tcp_socket, - uint32_t vers, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - virtual ~ONCRPCTCPSocketClient() { } - - static ONCRPCTCPSocketClient& - create - ( - const URI& absolute_uri, - YRO_NEW_REF MessageFactory& message_factory, - uint32_t prog, - uint32_t vers, - YRO_NEW_REF Configuration* configuration = NULL, - Log* error_log = NULL, - Log* trace_log = NULL - ); - }; - - - class ONCRPCTCPSocketServer : public ONCRPCStreamSocketServer - { - public: - ONCRPCTCPSocketServer - ( - YRO_NEW_REF TCPSocket& listen_tcp_socket, - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - static ONCRPCTCPSocketServer& - create - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - const SocketAddress& sockname, - Log* error_log = NULL, - Log* trace_log = NULL - ); - }; - - - class ONCRPCUDPSocketClient - : public ONCRPCClient, - public UDPSocketClient, - private ONCRPCResponseParser - { - public: - ONCRPCUDPSocketClient - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF SocketAddress& peername, - uint32_t prog, - YRO_NEW_REF UDPSocket& udp_socket, - uint32_t vers, - Log* error_log = NULL, - const Time& recv_timeout = RECV_TIMEOUT_DEFAULT, - Log* trace_log = NULL - ); - - static ONCRPCUDPSocketClient& - create - ( - const URI& absolute_uri, - YRO_NEW_REF MessageFactory& message_factory, - uint32_t prog, - uint32_t vers, - Log* error_log = NULL, - const Time& recv_timeout = RECV_TIMEOUT_DEFAULT, - Log* trace_log = NULL - ); - - protected: - // ONCRPCClient - virtual void handle( ONCRPCRequest& onc_rpc_request ); - - // UDPSocket::AIORecvCallback - void onReadCompletion( Buffer& buffer, void* context ); - void onReadError( uint32_t error_code, void* context ); - }; - - - class ONCRPCUDPSocketServer - : private ONCRPCServer, - public UDPSocketServer, - private ONCRPCRequestParser - { - public: - ONCRPCUDPSocketServer - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - YRO_NEW_REF UDPSocket& udp_socket, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - static ONCRPCUDPSocketServer& - create - ( - YRO_NEW_REF MessageFactory& message_factory, - YRO_NEW_REF EventHandler& request_handler, - const SocketAddress& sockname, - Log* error_log = NULL, - Log* trace_log = NULL - ); - - private: - // UDPSocket::AIORecvFromCallback - void onRecvFromCompletion( Buffer&, SocketAddress& peername, void* ); - void onRecvFromError( uint32_t error_code, void* context ); - - private: - class ResponseHandler; - }; - - - class TracingSocket - { - protected: - TracingSocket( Log&, socket_t ); - virtual ~TracingSocket(); - - Log& get_log() const { return log; } - - void set_peername( const SocketAddress& peername ); - void set_sockname( const SocketAddress& sockname ); - - YRO_NEW_REF StreamSocket* trace_accept( YRO_NEW_REF StreamSocket* ); - bool trace_bind( const SocketAddress& sockname, bool ret ); - bool trace_connect( const SocketAddress& peername, bool ret ); - ssize_t trace_recv( void* buf, size_t buflen, ssize_t ret ); - ssize_t trace_send( const void* buf, size_t buflen, ssize_t ret ); - ssize_t trace_sendmsg( const struct iovec*, uint32_t iovlen, ssize_t ret ); - - private: - Log& log; - socket_t socket_; - string peername, sockname; - }; - -#define YIELD_IPC_TRACING_SOCKET_PROTOTYPES\ - bool bind( const SocketAddress& to_sockaddr );\ - bool connect( const SocketAddress& peername );\ - YIELD_PLATFORM_SOCKET_RECV_SEND_PROTOTYPES; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - class TracingSSLSocket : public SSLSocket, private TracingSocket - { - public: - static YRO_NEW_REF TracingSSLSocket* create( Log&, SSLContext& ); - - static YRO_NEW_REF TracingSSLSocket* - create - ( - int domain, - Log&, - SSLContext& - ); - - // Socket - YIELD_IPC_TRACING_SOCKET_PROTOTYPES; - - // StreamSocket - YRO_NEW_REF StreamSocket* accept(); - - // SSLSocket - virtual YRO_NEW_REF SSLSocket* dup(); - - private: - TracingSSLSocket( int domain, Log&, socket_t, SSL*, SSLContext& ); - - // StreamSocket - YRO_NEW_REF StreamSocket* dup2( socket_t ); - }; -#endif - - - class TracingTCPSocket : public TCPSocket, private TracingSocket - { - public: - static YRO_NEW_REF TracingTCPSocket* create( Log& log ); - static YRO_NEW_REF TracingTCPSocket* create( int domain, Log& log ); - - // Socket - YIELD_IPC_TRACING_SOCKET_PROTOTYPES; - - // StreamSocket - YRO_NEW_REF StreamSocket* accept(); - - // TCPSocket - virtual YRO_NEW_REF TCPSocket* dup(); - - private: - TracingTCPSocket( int domain, Log&, socket_t ); - - // StreamSocket - StreamSocket* dup2( socket_t ); - }; - - - class TracingUDPSocket : public UDPSocket, private TracingSocket - { - public: - static YRO_NEW_REF TracingUDPSocket* create( Log& log ); - static YRO_NEW_REF TracingUDPSocket* create( int domain, Log& log ); - - // Socket - YIELD_IPC_TRACING_SOCKET_PROTOTYPES; - - // UDPSocket - ssize_t - recvfrom - ( - void* buf, - size_t len, - struct sockaddr_storage& peername, - int flags = 0 - ); - - ssize_t - sendmsg - ( - const struct iovec* iov, - uint32_t iovlen, - const SocketAddress& peername, - int flags = 0 - ); - - ssize_t - sendto - ( - const void* buf, - size_t len, - const SocketAddress& peername, - int flags = 0 - ); - - private: - TracingUDPSocket( int domain, Log&, socket_t ); - }; - - - class URI : public Object - { - public: - URI(); - URI( const char* scheme, const char* host, uint16_t port ); - URI( const char* scheme, const char* host, uint16_t port, const char* resource ); - URI( const URI& other ); - // Parsing constructors throw exceptions - URI( const char* uri ); - URI( const string& uri ); - URI( const char* uri, size_t uri_len ); - virtual ~URI() { } - - const string& get_scheme() const { return scheme; } - const string& get_host() const { return host; } - const string& get_user() const { return user; } - const string& get_password() const { return password; } - unsigned short get_port() const { return port; } - const string& get_resource() const { return resource; } - const multimap& get_query() const { return query; } - - string get_query_value - ( - const string& key, - const char* default_value = "" - ) const; - - multimap::const_iterator - get_query_values - ( - const string& key - ) const; - - URI& operator=( const URI& ); - operator string() const; - operator YRO_NEW_REF SocketAddress*() const; - operator YRO_NEW_REF SocketAddress&() const; // throws exceptions - - static YRO_NEW_REF URI* parse( const char* uri ); - static YRO_NEW_REF URI* parse( const string& uri ); - static YRO_NEW_REF URI* parse( const char* uri, size_t uri_len ); - - void set_port( uint16_t port ) { this->port = port; } - - private: - URI( UriUriStructA& parsed_uri ); - - void init( const char* uri, size_t uri_len ); - void init( UriUriStructA& parsed_uri ); - - private: - string scheme, user, password, host; - unsigned short port; - string resource; - multimap query; - }; - }; -}; - -#endif diff --git a/share/yield/include/yield/main.h b/share/yield/include/yield/main.h deleted file mode 100644 index 3c5ddbe13eb97b1024e8a2e86917bd245af83f89..0000000000000000000000000000000000000000 --- a/share/yield/include/yield/main.h +++ /dev/null @@ -1,303 +0,0 @@ -// Copyright 2003-2009 NEC HPC Europe, with original implementations and ideas contributed by Felix Hupfeld. -// This source comes from the Yield project. It is licensed under the GPLv2 (see COPYING for terms and conditions). - -#ifndef _YIELD_MAIN_H_ -#define _YIELD_MAIN_H_ - -#include "yield/platform.h" - -#include -#include -#include -#include -#include -#include - -#ifdef _WIN32 -//#include -#include // For ConsoleCtrlHandler -#else -#ifdef __MACH__ -#include // For _NSGetExecutablePath -#endif -#include -#endif - -#include "SimpleOpt.h" - - -namespace YIELD -{ - class Main - { - public: - const char* get_program_name() const { return program_name; } - -#ifdef _WIN32 - virtual int main( char* args ) // From WinMain - { - std::vector argvv; - - char argv0[PATH_MAX]; - GetModuleFileNameA( NULL, argv0, PATH_MAX ); - argvv.push_back( argv0 ); - - const char *start_args_p = args, *args_p = start_args_p; - while ( *args_p != 0 ) - { - while ( *args_p != ' ' && *args_p != 0 ) args_p++; - size_t arg_len = args_p - start_args_p; - char* arg = new char[arg_len+1]; - memcpy_s( arg, arg_len, start_args_p, arg_len ); - arg[arg_len] = 0; - argvv.push_back( arg ); - if ( *args_p != 0 ) - { - args_p++; - start_args_p = args_p; - } - } - - int ret = main( static_cast( argvv.size() ), &argvv[0] ); - - for ( std::vector::size_type argvv_i = 1; argvv_i < argvv.size(); argvv_i++ ) - delete [] argvv[argvv_i]; - - return ret; - } -#endif - - virtual int main( int argc, char** argv ) - { - int ret = 0; - - try - { - std::vector simpleopt_options; - for ( std::vectorsection 5.2.2 of RFC 3986. - * NOTE: On success you have to call uriFreeUriMembersA on \p absoluteDest manually later. - * - * @param absoluteDest OUT: Result %URI - * @param relativeSource IN: Reference to resolve - * @param absoluteBase IN: Base %URI to apply - * @return Error code or 0 on success - * - * @see uriRemoveBaseUriA - * @since 0.4.0 - */ -int URI_FUNC(AddBaseUri)(URI_TYPE(Uri) * absoluteDest, - const URI_TYPE(Uri) * relativeSource, - const URI_TYPE(Uri) * absoluteBase); - - - -/** - * Tries to make a relative %URI (a reference) from an - * absolute %URI and a given base %URI. This can only work if - * the absolute %URI shares scheme and authority with - * the base %URI. If it does not the result will still be - * an absolute URI (with scheme part if necessary). - * NOTE: On success you have to call uriFreeUriMembersA on - * \p dest manually later. - * - * @param dest OUT: Result %URI - * @param absoluteSource IN: Absolute %URI to make relative - * @param absoluteBase IN: Base %URI - * @param domainRootMode IN: Create %URI with path relative to domain root - * @return Error code or 0 on success - * - * @see uriAddBaseUriA - * @since 0.5.2 - */ -int URI_FUNC(RemoveBaseUri)(URI_TYPE(Uri) * dest, - const URI_TYPE(Uri) * absoluteSource, - const URI_TYPE(Uri) * absoluteBase, - UriBool domainRootMode); - - - -/** - * Checks two URIs for equivalence. Comparison is done - * the naive way, without prior normalization. - * NOTE: Two NULL URIs are equal as well. - * - * @param a IN: First %URI - * @param b IN: Second %URI - * @return URI_TRUE when equal, URI_FAlSE else - * - * @since 0.4.0 - */ -UriBool URI_FUNC(EqualsUri)(const URI_TYPE(Uri) * a, const URI_TYPE(Uri) * b); - - - -/** - * Calculates the number of characters needed to store the - * string representation of the given %URI excluding the - * terminator. - * - * @param uri IN: %URI to measure - * @param charsRequired OUT: Length of the string representation in characters excluding terminator - * @return Error code or 0 on success - * - * @see uriToStringA - * @since 0.5.0 - */ -int URI_FUNC(ToStringCharsRequired)(const URI_TYPE(Uri) * uri, - int * charsRequired); - - - -/** - * Converts a %URI structure back to text as described in - * section 5.3 of RFC 3986. - * - * @param dest OUT: Output destination - * @param uri IN: %URI to convert - * @param maxChars IN: Maximum number of characters to copy including terminator - * @param charsWritten OUT: Number of characters written, can be lower than maxChars even if the %URI is too long! - * @return Error code or 0 on success - * - * @see uriToStringCharsRequiredA - * @since 0.4.0 - */ -int URI_FUNC(ToString)(URI_CHAR * dest, const URI_TYPE(Uri) * uri, int maxChars, int * charsWritten); - - - -/** - * Determines the components of a %URI that are not normalized. - * - * @param uri IN: %URI to check - * @return Normalization job mask - * - * @see uriNormalizeSyntaxA - * @since 0.5.0 - */ -unsigned int URI_FUNC(NormalizeSyntaxMaskRequired)(const URI_TYPE(Uri) * uri); - - - -/** - * Normalizes a %URI using a normalization mask. - * The normalization mask decides what components are normalized. - * - * NOTE: If necessary the %URI becomes owner of all memory - * behind the text pointed to. Text is duplicated in that case. - * - * @param uri INOUT: %URI to normalize - * @param mask IN: Normalization mask - * @return Error code or 0 on success - * - * @see uriNormalizeSyntaxA - * @see uriNormalizeSyntaxMaskRequiredA - * @since 0.5.0 - */ -int URI_FUNC(NormalizeSyntaxEx)(URI_TYPE(Uri) * uri, unsigned int mask); - - - -/** - * Normalizes all components of a %URI. - * - * NOTE: If necessary the %URI becomes owner of all memory - * behind the text pointed to. Text is duplicated in that case. - * - * @param uri INOUT: %URI to normalize - * @return Error code or 0 on success - * - * @see uriNormalizeSyntaxExA - * @see uriNormalizeSyntaxMaskRequiredA - * @since 0.5.0 - */ -int URI_FUNC(NormalizeSyntax)(URI_TYPE(Uri) * uri); - - - -/** - * Converts a Unix filename to a %URI string. - * The destination buffer must be large enough to hold 7 + 3 * len(filename) + 1 - * characters in case of an absolute filename or 3 * len(filename) + 1 in case - * of a relative filename. - * - * EXAMPLE - * Input: "/bin/bash" - * Output: "file:///bin/bash" - * - * @param filename IN: Unix filename to convert - * @param uriString OUT: Destination to write %URI string to - * @return Error code or 0 on success - * - * @see uriUriStringToUnixFilenameA - * @see uriWindowsFilenameToUriStringA - * @since 0.5.2 - */ -int URI_FUNC(UnixFilenameToUriString)(const URI_CHAR * filename, - URI_CHAR * uriString); - - - -/** - * Converts a Windows filename to a %URI string. - * The destination buffer must be large enough to hold 8 + 3 * len(filename) + 1 - * characters in case of an absolute filename or 3 * len(filename) + 1 in case - * of a relative filename. - * - * EXAMPLE - * Input: "E:\\Documents and Settings" - * Output: "file:///E:/Documents%20and%20Settings" - * - * @param filename IN: Windows filename to convert - * @param uriString OUT: Destination to write %URI string to - * @return Error code or 0 on success - * - * @see uriUriStringToWindowsFilenameA - * @see uriUnixFilenameToUriStringA - * @since 0.5.2 - */ -int URI_FUNC(WindowsFilenameToUriString)(const URI_CHAR * filename, - URI_CHAR * uriString); - - - -/** - * Extracts a Unix filename from a %URI string. - * The destination buffer must be large enough to hold len(uriString) + 1 - 7 - * characters in case of an absolute %URI or len(uriString) + 1 in case - * of a relative %URI. - * - * @param uriString IN: %URI string to convert - * @param filename OUT: Destination to write filename to - * @return Error code or 0 on success - * - * @see uriUnixFilenameToUriStringA - * @see uriUriStringToWindowsFilenameA - * @since 0.5.2 - */ -int URI_FUNC(UriStringToUnixFilename)(const URI_CHAR * uriString, - URI_CHAR * filename); - - - -/** - * Extracts a Windows filename from a %URI string. - * The destination buffer must be large enough to hold len(uriString) + 1 - 8 - * characters in case of an absolute %URI or len(uriString) + 1 in case - * of a relative %URI. - * - * @param uriString IN: %URI string to convert - * @param filename OUT: Destination to write filename to - * @return Error code or 0 on success - * - * @see uriWindowsFilenameToUriStringA - * @see uriUriStringToUnixFilenameA - * @since 0.5.2 - */ -int URI_FUNC(UriStringToWindowsFilename)(const URI_CHAR * uriString, - URI_CHAR * filename); - - - -/** - * Calculates the number of characters needed to store the - * string representation of the given query list excluding the - * terminator. It is assumed that line breaks are will be - * normalized to "%0D%0A". - * - * @param queryList IN: Query list to measure - * @param charsRequired OUT: Length of the string representation in characters excluding terminator - * @return Error code or 0 on success - * - * @see uriComposeQueryCharsRequiredExA - * @see uriComposeQueryA - * @since 0.7.0 - */ -int URI_FUNC(ComposeQueryCharsRequired)(const URI_TYPE(QueryList) * queryList, - int * charsRequired); - - - -/** - * Calculates the number of characters needed to store the - * string representation of the given query list excluding the - * terminator. - * - * @param queryList IN: Query list to measure - * @param charsRequired OUT: Length of the string representation in characters excluding terminator - * @param spaceToPlus IN: Wether to convert ' ' to '+' or not - * @param normalizeBreaks IN: Wether to convert CR and LF to CR-LF or not. - * @return Error code or 0 on success - * - * @see uriComposeQueryCharsRequiredA - * @see uriComposeQueryExA - * @since 0.7.0 - */ -int URI_FUNC(ComposeQueryCharsRequiredEx)(const URI_TYPE(QueryList) * queryList, - int * charsRequired, UriBool spaceToPlus, UriBool normalizeBreaks); - - - -/** - * Converts a query list structure back to a query string. - * The composed string does not start with '?', - * on the way ' ' is converted to '+' and line breaks are - * normalized to "%0D%0A". - * - * @param dest OUT: Output destination - * @param queryList IN: Query list to convert - * @param maxChars IN: Maximum number of characters to copy including terminator - * @param charsWritten OUT: Number of characters written, can be lower than maxChars even if the query list is too long! - * @return Error code or 0 on success - * - * @see uriComposeQueryExA - * @see uriComposeQueryMallocA - * @see uriComposeQueryCharsRequiredA - * @see uriDissectQueryMallocA - * @since 0.7.0 - */ -int URI_FUNC(ComposeQuery)(URI_CHAR * dest, - const URI_TYPE(QueryList) * queryList, int maxChars, int * charsWritten); - - - -/** - * Converts a query list structure back to a query string. - * The composed string does not start with '?'. - * - * @param dest OUT: Output destination - * @param queryList IN: Query list to convert - * @param maxChars IN: Maximum number of characters to copy including terminator - * @param charsWritten OUT: Number of characters written, can be lower than maxChars even if the query list is too long! - * @param spaceToPlus IN: Wether to convert ' ' to '+' or not - * @param normalizeBreaks IN: Wether to convert CR and LF to CR-LF or not. - * @return Error code or 0 on success - * - * @see uriComposeQueryA - * @see uriComposeQueryMallocExA - * @see uriComposeQueryCharsRequiredExA - * @see uriDissectQueryMallocExA - * @since 0.7.0 - */ -int URI_FUNC(ComposeQueryEx)(URI_CHAR * dest, - const URI_TYPE(QueryList) * queryList, int maxChars, int * charsWritten, - UriBool spaceToPlus, UriBool normalizeBreaks); - - - -/** - * Converts a query list structure back to a query string. - * Memory for this string is allocated internally. - * The composed string does not start with '?', - * on the way ' ' is converted to '+' and line breaks are - * normalized to "%0D%0A". - * - * @param dest OUT: Output destination - * @param queryList IN: Query list to convert - * @return Error code or 0 on success - * - * @see uriComposeQueryMallocExA - * @see uriComposeQueryA - * @see uriDissectQueryMallocA - * @since 0.7.0 - */ -int URI_FUNC(ComposeQueryMalloc)(URI_CHAR ** dest, - const URI_TYPE(QueryList) * queryList); - - - -/** - * Converts a query list structure back to a query string. - * Memory for this string is allocated internally. - * The composed string does not start with '?'. - * - * @param dest OUT: Output destination - * @param queryList IN: Query list to convert - * @param spaceToPlus IN: Wether to convert ' ' to '+' or not - * @param normalizeBreaks IN: Wether to convert CR and LF to CR-LF or not. - * @return Error code or 0 on success - * - * @see uriComposeQueryMallocA - * @see uriComposeQueryExA - * @see uriDissectQueryMallocExA - * @since 0.7.0 - */ -int URI_FUNC(ComposeQueryMallocEx)(URI_CHAR ** dest, - const URI_TYPE(QueryList) * queryList, - UriBool spaceToPlus, UriBool normalizeBreaks); - - - -/** - * Constructs a query list from the raw query string of a given URI. - * On the way '+' is converted back to ' ', line breaks are not modified. - * - * @param dest OUT: Output destination - * @param itemCount OUT: Number of items found, can be NULL - * @param first IN: Pointer to first character after '?' - * @param afterLast IN: Pointer to character after the last one still in - * @return Error code or 0 on success - * - * @see uriDissectQueryMallocExA - * @see uriComposeQueryA - * @see uriFreeQueryListA - * @since 0.7.0 - */ -int URI_FUNC(DissectQueryMalloc)(URI_TYPE(QueryList) ** dest, int * itemCount, - const URI_CHAR * first, const URI_CHAR * afterLast); - - - -/** - * Constructs a query list from the raw query string of a given URI. - * - * @param dest OUT: Output destination - * @param itemCount OUT: Number of items found, can be NULL - * @param first IN: Pointer to first character after '?' - * @param afterLast IN: Pointer to character after the last one still in - * @param plusToSpace IN: Whether to convert '+' to ' ' or not - * @param breakConversion IN: Line break conversion mode - * @return Error code or 0 on success - * - * @see uriDissectQueryMallocA - * @see uriComposeQueryExA - * @see uriFreeQueryListA - * @since 0.7.0 - */ -int URI_FUNC(DissectQueryMallocEx)(URI_TYPE(QueryList) ** dest, int * itemCount, - const URI_CHAR * first, const URI_CHAR * afterLast, - UriBool plusToSpace, UriBreakConversion breakConversion); - - - -/** - * Frees all memory associated with the given query list. - * The structure itself is freed as well. - * - * @param queryList INOUT: Query list to free - * - * @since 0.7.0 - */ -void URI_FUNC(FreeQueryList)(URI_TYPE(QueryList) * queryList); - - -/* Header: UriIp4.h */ -/** - * Converts a IPv4 text representation into four bytes. - * - * @param octetOutput Output destination - * @param first First character of IPv4 text to parse - * @param afterLast Position to stop parsing at - * @return Error code or 0 on success - */ -int URI_FUNC(ParseIpFourAddress)(unsigned char * octetOutput, - const URI_CHAR * first, const URI_CHAR * afterLast); - -#endif - - -// yajl.h -/* - * Copyright 2007, Lloyd Hilaiel. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must 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 Lloyd Hilaiel nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef YAJL_H -#define YAJL_H - - -/* Header: yajl_common.h */ -#define YAJL_MAX_DEPTH 128 - -/* msft dll export gunk. To build a DLL on windows, you - * must define WIN32, YAJL_SHARED, and YAJL_BUILD. To use a shared - * DLL, you must define YAJL_SHARED and WIN32 */ -#if defined(WIN32) && defined(YAJL_SHARED) -# ifdef YAJL_BUILD -# define YAJL_API __declspec(dllexport) -# else -# define YAJL_API __declspec(dllimport) -# endif -#else -# define YAJL_API -#endif - - -/* Header: yajl_buf.h */ -/** - * yajl_buf is a buffer with exponential growth. the buffer ensures that - * you are always null padded. - */ -typedef struct yajl_buf_t * yajl_buf; - -/* allocate a new buffer */ -yajl_buf yajl_buf_alloc(void); - -/* free the buffer */ -void yajl_buf_free(yajl_buf buf); - -/* append a number of bytes to the buffer */ -void yajl_buf_append(yajl_buf buf, const void * data, unsigned int len); - -/* empty the buffer */ -void yajl_buf_clear(yajl_buf buf); - -/* get a pointer to the beginning of the buffer */ -const unsigned char * yajl_buf_data(yajl_buf buf); - -/* get the length of the buffer */ -unsigned int yajl_buf_len(yajl_buf buf); - -/* truncate the buffer */ -void yajl_buf_truncate(yajl_buf buf, unsigned int len); - - -/* Header: yajl_encode.h */ -void yajl_string_encode(yajl_buf buf, const unsigned char * str, - unsigned int length); - -void yajl_string_decode(yajl_buf buf, const unsigned char * str, - unsigned int length); - - -/* yajl_gen.h */ - /** generator status codes */ - typedef enum { - /** no error */ - yajl_gen_status_ok = 0, - /** at a point where a map key is generated, a function other than - * yajl_gen_string was called */ - yajl_gen_keys_must_be_strings, - /** YAJL's maximum generation depth was exceeded. see - * YAJL_MAX_DEPTH */ - yajl_max_depth_exceeded, - /** A generator function (yajl_gen_XXX) was called while in an error - * state */ - yajl_gen_in_error_state, - /** A complete JSON document has been generated */ - yajl_gen_generation_complete - } yajl_gen_status; - - /** an opaque handle to a generator */ - typedef struct yajl_gen_t * yajl_gen; - - /** configuration structure for the generator */ - typedef struct { - /** generate indented (beautiful) output */ - unsigned int beautify; - /** an opportunity to define an indent string. such as \\t or - * some number of spaces. default is four spaces ' '. This - * member is only relevant when beautify is true */ - const char * indentString; - } yajl_gen_config; - - /** allocate a generator handle */ - yajl_gen YAJL_API yajl_gen_alloc(const yajl_gen_config * config); - - /** free a generator handle */ - void YAJL_API yajl_gen_free(yajl_gen handle); - - yajl_gen_status YAJL_API yajl_gen_integer(yajl_gen hand, long int number); - yajl_gen_status YAJL_API yajl_gen_double(yajl_gen hand, double number); - yajl_gen_status YAJL_API yajl_gen_number(yajl_gen hand, - const char * num, - unsigned int len); - yajl_gen_status YAJL_API yajl_gen_string(yajl_gen hand, - const unsigned char * str, - unsigned int len); - yajl_gen_status YAJL_API yajl_gen_null(yajl_gen hand); - yajl_gen_status YAJL_API yajl_gen_bool(yajl_gen hand, int boolean); - yajl_gen_status YAJL_API yajl_gen_map_open(yajl_gen hand); - yajl_gen_status YAJL_API yajl_gen_map_close(yajl_gen hand); - yajl_gen_status YAJL_API yajl_gen_array_open(yajl_gen hand); - yajl_gen_status YAJL_API yajl_gen_array_close(yajl_gen hand); - - /** access the null terminated generator buffer. If incrementally - * outputing JSON, one should call yajl_gen_clear to clear the - * buffer. This allows stream generation. */ - yajl_gen_status YAJL_API yajl_gen_get_buf(yajl_gen hand, - const unsigned char ** buf, - unsigned int * len); - - /** clear yajl's output buffer, but maintain all internal generation - * state. This function will not "reset" the generator state, and is - * intended to enable incremental JSON outputing. */ - void YAJL_API yajl_gen_clear(yajl_gen hand); - - -/* yajl_lex.h */ - typedef enum { - yajl_tok_bool, - yajl_tok_colon, - yajl_tok_comma, - yajl_tok_eof, - yajl_tok_error, - yajl_tok_left_brace, - yajl_tok_left_bracket, - yajl_tok_null, - yajl_tok_right_brace, - yajl_tok_right_bracket, - - /* we differentiate between integers and doubles to allow the - * parser to interpret the number without re-scanning */ - yajl_tok_integer, - yajl_tok_double, - - /* we differentiate between strings which require further processing, - * and strings that do not */ - yajl_tok_string, - yajl_tok_string_with_escapes, - - /* comment tokens are not currently returned to the parser, ever */ - yajl_tok_comment -} yajl_tok; - -typedef struct yajl_lexer_t * yajl_lexer; - -yajl_lexer yajl_lex_alloc(unsigned int allowComments, - unsigned int validateUTF8); - -void yajl_lex_free(yajl_lexer lexer); - -/** - * run/continue a lex. "offset" is an input/output parameter. - * It should be initialized to zero for a - * new chunk of target text, and upon subsetquent calls with the same - * target text should passed with the value of the previous invocation. - * - * the client may be interested in the value of offset when an error is - * returned from the lexer. This allows the client to render useful -n * error messages. - * - * When you pass the next chunk of data, context should be reinitialized - * to zero. - * - * Finally, the output buffer is usually just a pointer into the jsonText, - * however in cases where the entity being lexed spans multiple chunks, - * the lexer will buffer the entity and the data returned will be - * a pointer into that buffer. - * - * This behavior is abstracted from client code except for the performance - * implications which require that the client choose a reasonable chunk - * size to get adequate performance. - */ -yajl_tok yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int * offset, - const unsigned char ** outBuf, unsigned int * outLen); - -/** have a peek at the next token, but don't move the lexer forward */ -yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int offset); - - -typedef enum { - yajl_lex_e_ok = 0, - yajl_lex_string_invalid_utf8, - yajl_lex_string_invalid_escaped_char, - yajl_lex_string_invalid_json_char, - yajl_lex_string_invalid_hex_char, - yajl_lex_invalid_char, - yajl_lex_invalid_string, - yajl_lex_missing_integer_after_decimal, - yajl_lex_missing_integer_after_exponent, - yajl_lex_missing_integer_after_minus, - yajl_lex_unallowed_comment -} yajl_lex_error; - -const char * yajl_lex_error_to_string(yajl_lex_error error); - -/** allows access to more specific information about the lexical - * error when yajl_lex_lex returns yajl_tok_error. */ -yajl_lex_error yajl_lex_get_error(yajl_lexer lexer); - -/** get the current offset into the most recently lexed json string. */ -unsigned int yajl_lex_current_offset(yajl_lexer lexer); - -/** get the number of lines lexed by this lexer instance */ -unsigned int yajl_lex_current_line(yajl_lexer lexer); - -/** get the number of chars lexed by this lexer instance since the last - * \n or \r */ -unsigned int yajl_lex_current_char(yajl_lexer lexer); - - -/* yajl_parse.h */ - /** error codes returned from this interface */ - typedef enum { - /** no error was encountered */ - yajl_status_ok, - /** a client callback returned zero, stopping the parse */ - yajl_status_client_canceled, - /** The parse cannot yet complete because more json input text - * is required, call yajl_parse with the next buffer of input text. - * (pertinent only when stream parsing) */ - yajl_status_insufficient_data, - /** An error occured during the parse. Call yajl_get_error for - * more information about the encountered error */ - yajl_status_error - } yajl_status; - - /** attain a human readable, english, string for an error */ - const char * YAJL_API yajl_status_to_string(yajl_status code); - - /** an opaque handle to a parser */ - typedef struct yajl_handle_t * yajl_handle; - - /** yajl is an event driven parser. this means as json elements are - * parsed, you are called back to do something with the data. The - * functions in this table indicate the various events for which - * you will be called back. Each callback accepts a "context" - * pointer, this is a void * that is passed into the yajl_parse - * function which the client code may use to pass around context. - * - * All callbacks return an integer. If non-zero, the parse will - * continue. If zero, the parse will be canceled and - * yajl_status_client_canceled will be returned from the parse. - * - * Note about handling of numbers: - * yajl will only convert numbers that can be represented in a double - * or a long int. All other numbers will be passed to the client - * in string form using the yajl_number callback. Furthermore, if - * yajl_number is not NULL, it will always be used to return numbers, - * that is yajl_integer and yajl_double will be ignored. If - * yajl_number is NULL but one of yajl_integer or yajl_double are - * defined, parsing of a number larger than is representable - * in a double or long int will result in a parse error. - */ - typedef struct { - int (* yajl_null)(void * ctx); - int (* yajl_boolean)(void * ctx, int boolVal); - int (* yajl_integer)(void * ctx, long integerVal); - int (* yajl_double)(void * ctx, double doubleVal); - /** A callback which passes the string representation of the number - * back to the client. Will be used for all numbers when present */ - int (* yajl_number)(void * ctx, const char * numberVal, - unsigned int numberLen); - - /** strings are returned as pointers into the JSON text when, - * possible, as a result, they are _not_ null padded */ - int (* yajl_string)(void * ctx, const unsigned char * stringVal, - unsigned int stringLen); - - int (* yajl_start_map)(void * ctx); - int (* yajl_map_key)(void * ctx, const unsigned char * key, - unsigned int stringLen); - int (* yajl_end_map)(void * ctx); - - int (* yajl_start_array)(void * ctx); - int (* yajl_end_array)(void * ctx); - } yajl_callbacks; - - /** configuration structure for the generator */ - typedef struct { - /** if nonzero, javascript style comments will be allowed in - * the json input, both slash star and slash slash */ - unsigned int allowComments; - /** if nonzero, invalid UTF8 strings will cause a parse - * error */ - unsigned int checkUTF8; - } yajl_parser_config; - - /** allocate a parser handle - * \param callbacks a yajl callbacks structure specifying the - * functions to call when different JSON entities - * are encountered in the input text. May be NULL, - * which is only useful for validation. - * \param config configuration parameters for the parse. - * \param ctx a context pointer that will be passed to callbacks. - */ - yajl_handle YAJL_API yajl_alloc(const yajl_callbacks * callbacks, - const yajl_parser_config * config, - void * ctx); - - /** free a parser handle */ - void YAJL_API yajl_free(yajl_handle handle); - - /** Parse some json! - * \param hand - a handle to the json parser allocated with yajl_alloc - * \param jsonText - a pointer to the UTF8 json text to be parsed - * \param jsonTextLength - the length, in bytes, of input text - */ - yajl_status YAJL_API yajl_parse(yajl_handle hand, - const unsigned char * jsonText, - unsigned int jsonTextLength); - - /** get an error string describing the state of the - * parse. - * - * If verbose is non-zero, the message will include the JSON - * text where the error occured, along with an arrow pointing to - * the specific char. - * - * A dynamically allocated string will be returned which should - * be freed with yajl_free_error - */ - unsigned char * YAJL_API yajl_get_error(yajl_handle hand, int verbose, - const unsigned char * jsonText, - unsigned int jsonTextLength); - - /** free an error returned from yajl_get_error */ - void YAJL_API yajl_free_error(unsigned char * str); - - -/* yajl_parser.h */ - typedef enum { - yajl_state_start = 0, - yajl_state_parse_complete, - yajl_state_parse_error, - yajl_state_lexical_error, - yajl_state_map_start, - yajl_state_map_sep, - yajl_state_map_need_val, - yajl_state_map_got_val, - yajl_state_map_need_key, - yajl_state_array_start, - yajl_state_array_got_val, - yajl_state_array_need_val -} yajl_state; - -struct yajl_handle_t { - const yajl_callbacks * callbacks; - void * ctx; - yajl_lexer lexer; - const char * parseError; - unsigned int errorOffset; - /* temporary storage for decoded strings */ - yajl_buf decodeBuf; - /* a stack of states. access with yajl_state_XXX routines */ - yajl_buf stateBuf; -}; - -yajl_status -yajl_do_parse(yajl_handle handle, unsigned int * offset, - const unsigned char * jsonText, unsigned int jsonTextLen); - -unsigned char * -yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText, - unsigned int jsonTextLen, int verbose); - -yajl_state yajl_state_current(yajl_handle handle); - -void yajl_state_push(yajl_handle handle, yajl_state state); - -yajl_state yajl_state_pop(yajl_handle handle); - -unsigned int yajl_parse_depth(yajl_handle handle); - -void yajl_state_set(yajl_handle handle, yajl_state state); - - -#endif - - -// uriparser.c -/* - * uriparser - RFC 3986 URI parsing library - * - * Copyright (C) 2007, Weijia Song - * Copyright (C) 2007, Sebastian Pipping - * 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 the 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. - */ - - - -/* Prototypes: UriCommon.h */ -/* Used to point to from empty path segments. - * X.first and X.afterLast must be the same non-NULL value then. */ -extern const URI_CHAR * const URI_FUNC(SafeToPointTo); -extern const URI_CHAR * const URI_FUNC(ConstPwd); -extern const URI_CHAR * const URI_FUNC(ConstParent); - - - -void URI_FUNC(ResetUri)(URI_TYPE(Uri) * uri); - -UriBool URI_FUNC(RemoveDotSegmentsAbsolute)(URI_TYPE(Uri) * uri); -UriBool URI_FUNC(RemoveDotSegments)(URI_TYPE(Uri) * uri, UriBool relative); -UriBool URI_FUNC(RemoveDotSegmentsEx)(URI_TYPE(Uri) * uri, - UriBool relative, UriBool pathOwned); - -unsigned char URI_FUNC(HexdigToInt)(URI_CHAR hexdig); -URI_CHAR URI_FUNC(HexToLetter)(unsigned int value); -URI_CHAR URI_FUNC(HexToLetterEx)(unsigned int value, UriBool uppercase); - -UriBool URI_FUNC(IsHostSet)(const URI_TYPE(Uri) * uri); - -UriBool URI_FUNC(CopyPath)(URI_TYPE(Uri) * dest, const URI_TYPE(Uri) * source); -UriBool URI_FUNC(CopyAuthority)(URI_TYPE(Uri) * dest, const URI_TYPE(Uri) * source); - -UriBool URI_FUNC(FixAmbiguity)(URI_TYPE(Uri) * uri); -void URI_FUNC(FixEmptyTrailSegment)(URI_TYPE(Uri) * uri); - -/* Prototypes: UriCommon.c */ -/*extern*/ const URI_CHAR * const URI_FUNC(SafeToPointTo) = _UT("X"); -/*extern*/ const URI_CHAR * const URI_FUNC(ConstPwd) = _UT("."); -/*extern*/ const URI_CHAR * const URI_FUNC(ConstParent) = _UT(".."); - - -/* Prototypes: UriCompare.c */ -static int URI_FUNC(CompareRange)(const URI_TYPE(TextRange) * a, - const URI_TYPE(TextRange) * b); - - -/* Prototypes: UriIpBase.h */ -typedef struct UriIp4ParserStruct { - unsigned char stackCount; - unsigned char stackOne; - unsigned char stackTwo; - unsigned char stackThree; -} UriIp4Parser; - - - -void uriPushToStack(UriIp4Parser * parser, unsigned char digit); -void uriStackToOctet(UriIp4Parser * parser, unsigned char * octet); - -/* Prototypes: UriIp4.c */ -static const URI_CHAR * URI_FUNC(ParseDecOctet)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseDecOctetOne)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseDecOctetTwo)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseDecOctetThree)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseDecOctetFour)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast); - - -/* Prototypes: UriNormalizeBase.h */ -UriBool uriIsUnreserved(int code); - -/* Prototypes: UriNormalize.c */ -static int URI_FUNC(NormalizeSyntaxEngine)(URI_TYPE(Uri) * uri, unsigned int inMask, - unsigned int * outMask); - -static UriBool URI_FUNC(MakeRangeOwner)(unsigned int * doneMask, - unsigned int maskTest, URI_TYPE(TextRange) * range); -static UriBool URI_FUNC(MakeOwner)(URI_TYPE(Uri) * uri, - unsigned int * doneMask); - -static void URI_FUNC(FixPercentEncodingInplace)(const URI_CHAR * first, - const URI_CHAR ** afterLast); -static UriBool URI_FUNC(FixPercentEncodingMalloc)(const URI_CHAR ** first, - const URI_CHAR ** afterLast); -static void URI_FUNC(FixPercentEncodingEngine)( - const URI_CHAR * inFirst, const URI_CHAR * inAfterLast, - const URI_CHAR * outFirst, const URI_CHAR ** outAfterLast); - -static UriBool URI_FUNC(ContainsUppercaseLetters)(const URI_CHAR * first, - const URI_CHAR * afterLast); -static UriBool URI_FUNC(ContainsUglyPercentEncoding)(const URI_CHAR * first, - const URI_CHAR * afterLast); - -static void URI_FUNC(LowercaseInplace)(const URI_CHAR * first, - const URI_CHAR * afterLast); -static UriBool URI_FUNC(LowercaseMalloc)(const URI_CHAR ** first, - const URI_CHAR ** afterLast); - -static void URI_FUNC(PreventLeakage)(URI_TYPE(Uri) * uri, - unsigned int revertMask); - - -/* Prototypes: UriParseBase.h */ -void uriWriteQuadToDoubleByte(const unsigned char * hexDigits, int digitCount, - unsigned char * output); -unsigned char uriGetOctetValue(const unsigned char * digits, int digitCount); - -/* Prototypes: UriParse.c */ -static const URI_CHAR * URI_FUNC(ParseAuthority)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseAuthorityTwo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseHexZero)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseHierPart)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseIpFutLoop)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseIpFutStopGo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseIpLit2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseIPv6address2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseMustBeSegmentNzNc)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseOwnHost)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseOwnHost2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseOwnHostUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseOwnHostUserInfoNz)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseOwnPortUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseOwnUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePartHelperTwo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePathAbsEmpty)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePathAbsNoLeadSlash)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePathRootless)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePchar)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePctEncoded)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePctSubUnres)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParsePort)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseQueryFrag)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseSegment)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseSegmentNz)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseSegmentNzNcOrScheme2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseUriReference)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseUriTail)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseUriTailTwo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); -static const URI_CHAR * URI_FUNC(ParseZeroMoreSlashSegs)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); - -static UriBool URI_FUNC(OnExitOwnHost2)(URI_TYPE(ParserState) * state, const URI_CHAR * first); -static UriBool URI_FUNC(OnExitOwnHostUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first); -static UriBool URI_FUNC(OnExitOwnPortUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first); -static UriBool URI_FUNC(OnExitSegmentNzNcOrScheme2)(URI_TYPE(ParserState) * state, const URI_CHAR * first); -static void URI_FUNC(OnExitPartHelperTwo)(URI_TYPE(ParserState) * state); - -static void URI_FUNC(ResetParserState)(URI_TYPE(ParserState) * state); - -static UriBool URI_FUNC(PushPathSegment)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast); - -static void URI_FUNC(StopSyntax)(URI_TYPE(ParserState) * state, const URI_CHAR * errorPos); -static void URI_FUNC(StopMalloc)(URI_TYPE(ParserState) * state); - - -/* Prototypes: UriQuery.c */ -static int URI_FUNC(ComposeQueryEngine)(URI_CHAR * dest, - const URI_TYPE(QueryList) * queryList, - int maxChars, int * charsWritten, int * charsRequired, - UriBool spaceToPlus, UriBool normalizeBreaks); - -static UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) ** prevNext, - int * itemCount, const URI_CHAR * keyFirst, const URI_CHAR * keyAfter, - const URI_CHAR * valueFirst, const URI_CHAR * valueAfter, - UriBool plusToSpace, UriBreakConversion breakConversion); - - -/* Prototypes: UriRecompose.c */ -static int URI_FUNC(ToStringEngine)(URI_CHAR * dest, const URI_TYPE(Uri) * uri, - int maxChars, int * charsWritten, int * charsRequired); - - - - -/* Source: UriCommon.c */ -void URI_FUNC(ResetUri)(URI_TYPE(Uri) * uri) { - memset(uri, 0, sizeof(URI_TYPE(Uri))); -} - - - -/* Properly removes "." and ".." path segments */ -UriBool URI_FUNC(RemoveDotSegments)(URI_TYPE(Uri) * uri, - UriBool relative) { - if (uri == NULL) { - return URI_TRUE; - } - return URI_FUNC(RemoveDotSegmentsEx)(uri, relative, uri->owner); -} - - - -UriBool URI_FUNC(RemoveDotSegmentsEx)(URI_TYPE(Uri) * uri, - UriBool relative, UriBool pathOwned) { - URI_TYPE(PathSegment) * walker; - if ((uri == NULL) || (uri->pathHead == NULL)) { - return URI_TRUE; - } - - walker = uri->pathHead; - walker->reserved = NULL; /* Prev pointer */ - do { - UriBool removeSegment = URI_FALSE; - int len = (int)(walker->text.afterLast - walker->text.first); - switch (len) { - case 1: - if ((walker->text.first)[0] == _UT('.')) { - /* "." segment -> remove if not essential */ - URI_TYPE(PathSegment) * const prev = ( URI_TYPE(PathSegment) * const )walker->reserved; - URI_TYPE(PathSegment) * const nextBackup = ( URI_TYPE(PathSegment) * const )walker->next; - - /* Is this dot segment essential? */ - removeSegment = URI_TRUE; - if (relative && (walker == uri->pathHead) && (walker->next != NULL)) { - const URI_CHAR * ch = walker->next->text.first; - for (; ch < walker->next->text.afterLast; ch++) { - if (*ch == _UT(':')) { - removeSegment = URI_FALSE; - break; - } - } - } - - if (removeSegment) { - /* Last segment? */ - if (walker->next != NULL) { - /* Not last segment */ - walker->next->reserved = prev; - - if (prev == NULL) { - /* First but not last segment */ - uri->pathHead = walker->next; - } else { - /* Middle segment */ - prev->next = walker->next; - } - - if (pathOwned && (walker->text.first != walker->text.afterLast)) { - free((URI_CHAR *)walker->text.first); - } - free(walker); - } else { - /* Last segment */ - if (pathOwned && (walker->text.first != walker->text.afterLast)) { - free((URI_CHAR *)walker->text.first); - } - - if (prev == NULL) { - /* Last and first */ - if (URI_FUNC(IsHostSet)(uri)) { - /* Replace "." with empty segment to represent trailing slash */ - walker->text.first = URI_FUNC(SafeToPointTo); - walker->text.afterLast = URI_FUNC(SafeToPointTo); - } else { - free(walker); - - uri->pathHead = NULL; - uri->pathTail = NULL; - } - } else { - /* Last but not first, replace "." with empty segment to represent trailing slash */ - walker->text.first = URI_FUNC(SafeToPointTo); - walker->text.afterLast = URI_FUNC(SafeToPointTo); - } - } - - walker = nextBackup; - } - } - break; - - case 2: - if (((walker->text.first)[0] == _UT('.')) - && ((walker->text.first)[1] == _UT('.'))) { - /* Path ".." -> remove this and the previous segment */ - URI_TYPE(PathSegment) * const prev = ( URI_TYPE(PathSegment) * const )walker->reserved; - URI_TYPE(PathSegment) * prevPrev; - URI_TYPE(PathSegment) * const nextBackup = ( URI_TYPE(PathSegment) * const )walker->next; - - removeSegment = URI_TRUE; - if (relative) { - if (prev == NULL) { - removeSegment = URI_FALSE; - } else if ((prev != NULL) - && ((prev->text.afterLast - prev->text.first) == 2) - && ((prev->text.first)[0] == _UT('.')) - && ((prev->text.first)[1] == _UT('.'))) { - removeSegment = URI_FALSE; - } - } - - if (removeSegment) { - if (prev != NULL) { - /* Not first segment */ - prevPrev = ( URI_TYPE(PathSegment) * const )prev->reserved; - if (prevPrev != NULL) { - /* Not even prev is the first one */ - prevPrev->next = walker->next; - if (walker->next != NULL) { - walker->next->reserved = prevPrev; - } else { - /* Last segment -> insert "" segment to represent trailing slash, update tail */ - URI_TYPE(PathSegment) * const segment = ( URI_TYPE(PathSegment) * const )malloc(1 * sizeof(URI_TYPE(PathSegment))); - if (segment == NULL) { - if (pathOwned && (walker->text.first != walker->text.afterLast)) { - free((URI_CHAR *)walker->text.first); - } - free(walker); - - if (pathOwned && (prev->text.first != prev->text.afterLast)) { - free((URI_CHAR *)prev->text.first); - } - free(prev); - - return URI_FALSE; /* Raises malloc error */ - } - memset(segment, 0, sizeof(URI_TYPE(PathSegment))); - segment->text.first = URI_FUNC(SafeToPointTo); - segment->text.afterLast = URI_FUNC(SafeToPointTo); - prevPrev->next = segment; - uri->pathTail = segment; - } - - if (pathOwned && (walker->text.first != walker->text.afterLast)) { - free((URI_CHAR *)walker->text.first); - } - free(walker); - - if (pathOwned && (prev->text.first != prev->text.afterLast)) { - free((URI_CHAR *)prev->text.first); - } - free(prev); - - walker = nextBackup; - } else { - /* Prev is the first segment */ - if (walker->next != NULL) { - uri->pathHead = walker->next; - walker->next->reserved = NULL; - - if (pathOwned && (walker->text.first != walker->text.afterLast)) { - free((URI_CHAR *)walker->text.first); - } - free(walker); - } else { - /* Re-use segment for "" path segment to represent trailing slash, update tail */ - URI_TYPE(PathSegment) * const segment = walker; - if (pathOwned && (segment->text.first != segment->text.afterLast)) { - free((URI_CHAR *)segment->text.first); - } - segment->text.first = URI_FUNC(SafeToPointTo); - segment->text.afterLast = URI_FUNC(SafeToPointTo); - uri->pathHead = segment; - uri->pathTail = segment; - } - - if (pathOwned && (prev->text.first != prev->text.afterLast)) { - free((URI_CHAR *)prev->text.first); - } - free(prev); - - walker = nextBackup; - } - } else { - URI_TYPE(PathSegment) * const nextBackup = walker->next; - /* First segment -> update head pointer */ - uri->pathHead = walker->next; - if (walker->next != NULL) { - walker->next->reserved = NULL; - } else { - /* Last segment -> update tail */ - uri->pathTail = NULL; - } - - if (pathOwned && (walker->text.first != walker->text.afterLast)) { - free((URI_CHAR *)walker->text.first); - } - free(walker); - - walker = nextBackup; - } - } - } - break; - - } - - if (!removeSegment) { - if (walker->next != NULL) { - walker->next->reserved = walker; - } else { - /* Last segment -> update tail */ - uri->pathTail = walker; - } - walker = walker->next; - } - } while (walker != NULL); - - return URI_TRUE; -} - - - -/* Properly removes "." and ".." path segments */ -UriBool URI_FUNC(RemoveDotSegmentsAbsolute)(URI_TYPE(Uri) * uri) { - const UriBool ABSOLUTE = URI_FALSE; - return URI_FUNC(RemoveDotSegments)(uri, ABSOLUTE); -} - - - -unsigned char URI_FUNC(HexdigToInt)(URI_CHAR hexdig) { - switch (hexdig) { - case _UT('0'): - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - case _UT('5'): - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - return (unsigned char)(9 + hexdig - _UT('9')); - - case _UT('a'): - case _UT('b'): - case _UT('c'): - case _UT('d'): - case _UT('e'): - case _UT('f'): - return (unsigned char)(15 + hexdig - _UT('f')); - - case _UT('A'): - case _UT('B'): - case _UT('C'): - case _UT('D'): - case _UT('E'): - case _UT('F'): - return (unsigned char)(15 + hexdig - _UT('F')); - - default: - return 0; - } -} - - - -URI_CHAR URI_FUNC(HexToLetter)(unsigned int value) { - /* Uppercase recommended in section 2.1. of RFC 3986 * - * http://tools.ietf.org/html/rfc3986#section-2.1 */ - return URI_FUNC(HexToLetterEx)(value, URI_TRUE); -} - - - -URI_CHAR URI_FUNC(HexToLetterEx)(unsigned int value, UriBool uppercase) { - switch (value) { - case 0: return _UT('0'); - case 1: return _UT('1'); - case 2: return _UT('2'); - case 3: return _UT('3'); - case 4: return _UT('4'); - case 5: return _UT('5'); - case 6: return _UT('6'); - case 7: return _UT('7'); - case 8: return _UT('8'); - case 9: return _UT('9'); - - case 10: return (uppercase == URI_TRUE) ? _UT('A') : _UT('a'); - case 11: return (uppercase == URI_TRUE) ? _UT('B') : _UT('b'); - case 12: return (uppercase == URI_TRUE) ? _UT('C') : _UT('c'); - case 13: return (uppercase == URI_TRUE) ? _UT('D') : _UT('d'); - case 14: return (uppercase == URI_TRUE) ? _UT('E') : _UT('e'); - default: return (uppercase == URI_TRUE) ? _UT('F') : _UT('f'); - } -} - - - -/* Checks if a URI has the host component set. */ -UriBool URI_FUNC(IsHostSet)(const URI_TYPE(Uri) * uri) { - return (uri != NULL) - && ((uri->hostText.first != NULL) - || (uri->hostData.ip4 != NULL) - || (uri->hostData.ip6 != NULL) - || (uri->hostData.ipFuture.first != NULL) - ); -} - - - -/* Copies the path segment list from one URI to another. */ -UriBool URI_FUNC(CopyPath)(URI_TYPE(Uri) * dest, - const URI_TYPE(Uri) * source) { - if (source->pathHead == NULL) { - /* No path component */ - dest->pathHead = NULL; - dest->pathTail = NULL; - } else { - /* Copy list but not the text contained */ - URI_TYPE(PathSegment) * sourceWalker = source->pathHead; - URI_TYPE(PathSegment) * destPrev = NULL; - do { - URI_TYPE(PathSegment) * cur = ( URI_TYPE(PathSegment) * const )malloc(sizeof(URI_TYPE(PathSegment))); - if (cur == NULL) { - /* Fix broken list */ - if (destPrev != NULL) { - destPrev->next = NULL; - } - return URI_FALSE; /* Raises malloc error */ - } - - /* From this functions usage we know that * - * the dest URI cannot be uri->owner */ - cur->text = sourceWalker->text; - if (destPrev == NULL) { - /* First segment ever */ - dest->pathHead = cur; - } else { - destPrev->next = cur; - } - destPrev = cur; - sourceWalker = sourceWalker->next; - } while (sourceWalker != NULL); - dest->pathTail = destPrev; - dest->pathTail->next = NULL; - } - - dest->absolutePath = source->absolutePath; - return URI_TRUE; -} - - - -/* Copies the authority part of an URI over to another. */ -UriBool URI_FUNC(CopyAuthority)(URI_TYPE(Uri) * dest, - const URI_TYPE(Uri) * source) { - /* From this functions usage we know that * - * the dest URI cannot be uri->owner */ - - /* Copy userInfo */ - dest->userInfo = source->userInfo; - - /* Copy hostText */ - dest->hostText = source->hostText; - - /* Copy hostData */ - if (source->hostData.ip4 != NULL) { - dest->hostData.ip4 = ( UriIp4* )malloc(sizeof(UriIp4)); - if (dest->hostData.ip4 == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - *(dest->hostData.ip4) = *(source->hostData.ip4); - dest->hostData.ip6 = NULL; - dest->hostData.ipFuture.first = NULL; - dest->hostData.ipFuture.afterLast = NULL; - } else if (source->hostData.ip6 != NULL) { - dest->hostData.ip4 = NULL; - dest->hostData.ip6 = ( UriIp6* )malloc(sizeof(UriIp6)); - if (dest->hostData.ip6 == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - *(dest->hostData.ip6) = *(source->hostData.ip6); - dest->hostData.ipFuture.first = NULL; - dest->hostData.ipFuture.afterLast = NULL; - } else { - dest->hostData.ip4 = NULL; - dest->hostData.ip6 = NULL; - dest->hostData.ipFuture = source->hostData.ipFuture; - } - - /* Copy portText */ - dest->portText = source->portText; - - return URI_TRUE; -} - - - -UriBool URI_FUNC(FixAmbiguity)(URI_TYPE(Uri) * uri) { - URI_TYPE(PathSegment) * segment; - - if ( /* Case 1: absolute path, empty first segment */ - (uri->absolutePath - && (uri->pathHead != NULL) - && (uri->pathHead->text.afterLast == uri->pathHead->text.first)) - - /* Case 2: relative path, empty first and second segment */ - || (!uri->absolutePath - && (uri->pathHead != NULL) - && (uri->pathHead->next != NULL) - && (uri->pathHead->text.afterLast == uri->pathHead->text.first) - && (uri->pathHead->next->text.afterLast == uri->pathHead->next->text.first))) { - /* NOOP */ - } else { - return URI_TRUE; - } - - segment = ( URI_TYPE(PathSegment) * const )malloc(1 * sizeof(URI_TYPE(PathSegment))); - if (segment == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - - /* Insert "." segment in front */ - segment->next = uri->pathHead; - segment->text.first = URI_FUNC(ConstPwd); - segment->text.afterLast = URI_FUNC(ConstPwd) + 1; - uri->pathHead = segment; - return URI_TRUE; -} - - - -void URI_FUNC(FixEmptyTrailSegment)(URI_TYPE(Uri) * uri) { - /* Fix path if only one empty segment */ - if (!uri->absolutePath - && !URI_FUNC(IsHostSet)(uri) - && (uri->pathHead != NULL) - && (uri->pathHead->next == NULL) - && (uri->pathHead->text.first == uri->pathHead->text.afterLast)) { - free(uri->pathHead); - uri->pathHead = NULL; - uri->pathTail = NULL; - } -} - - -/* Source: UriIp4Base.c */ -void uriStackToOctet(UriIp4Parser * parser, unsigned char * octet) { - switch (parser->stackCount) { - case 1: - *octet = parser->stackOne; - break; - - case 2: - *octet = parser->stackOne * 10 - + parser->stackTwo; - break; - - case 3: - *octet = parser->stackOne * 100 - + parser->stackTwo * 10 - + parser->stackThree; - break; - - default: - ; - } - parser->stackCount = 0; -} - - - -void uriPushToStack(UriIp4Parser * parser, unsigned char digit) { - switch (parser->stackCount) { - case 0: - parser->stackOne = digit; - parser->stackCount = 1; - break; - - case 1: - parser->stackTwo = digit; - parser->stackCount = 2; - break; - - case 2: - parser->stackThree = digit; - parser->stackCount = 3; - break; - - default: - ; - } -} - - -/* Source: UriIp4.c */ - -/* - * [ipFourAddress]->[decOctet]<.>[decOctet]<.>[decOctet]<.>[decOctet] - */ -int URI_FUNC(ParseIpFourAddress)(unsigned char * octetOutput, - const URI_CHAR * first, const URI_CHAR * afterLast) { - const URI_CHAR * after; - UriIp4Parser parser; - - /* Essential checks */ - if ((octetOutput == NULL) || (first == NULL) - || (afterLast <= first)) { - return URI_ERROR_SYNTAX; - } - - /* Reset parser */ - parser.stackCount = 0; - - /* Octet #1 */ - after = URI_FUNC(ParseDecOctet)(&parser, first, afterLast); - if ((after == NULL) || (after >= afterLast) || (*after != _UT('.'))) { - return URI_ERROR_SYNTAX; - } - uriStackToOctet(&parser, octetOutput); - - /* Octet #2 */ - after = URI_FUNC(ParseDecOctet)(&parser, after + 1, afterLast); - if ((after == NULL) || (after >= afterLast) || (*after != _UT('.'))) { - return URI_ERROR_SYNTAX; - } - uriStackToOctet(&parser, octetOutput + 1); - - /* Octet #3 */ - after = URI_FUNC(ParseDecOctet)(&parser, after + 1, afterLast); - if ((after == NULL) || (after >= afterLast) || (*after != _UT('.'))) { - return URI_ERROR_SYNTAX; - } - uriStackToOctet(&parser, octetOutput + 2); - - /* Octet #4 */ - after = URI_FUNC(ParseDecOctet)(&parser, after + 1, afterLast); - if (after != afterLast) { - return URI_ERROR_SYNTAX; - } - uriStackToOctet(&parser, octetOutput + 3); - - return URI_SUCCESS; -} - - - -/* - * [decOctet]-><0> - * [decOctet]-><1>[decOctetOne] - * [decOctet]-><2>[decOctetTwo] - * [decOctet]-><3>[decOctetThree] - * [decOctet]-><4>[decOctetThree] - * [decOctet]-><5>[decOctetThree] - * [decOctet]-><6>[decOctetThree] - * [decOctet]-><7>[decOctetThree] - * [decOctet]-><8>[decOctetThree] - * [decOctet]-><9>[decOctetThree] - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseDecOctet)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return NULL; - } - - switch (*first) { - case _UT('0'): - uriPushToStack(parser, 0); - return first + 1; - - case _UT('1'): - uriPushToStack(parser, 1); - return (const URI_CHAR *)URI_FUNC(ParseDecOctetOne)(parser, first + 1, afterLast); - - case _UT('2'): - uriPushToStack(parser, 2); - return (const URI_CHAR *)URI_FUNC(ParseDecOctetTwo)(parser, first + 1, afterLast); - - case _UT('3'): - case _UT('4'): - case _UT('5'): - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - uriPushToStack(parser, (unsigned char)(9 + *first - _UT('9'))); - return (const URI_CHAR *)URI_FUNC(ParseDecOctetThree)(parser, first + 1, afterLast); - - default: - return NULL; - } -} - - - -/* - * [decOctetOne]-> - * [decOctetOne]->[DIGIT][decOctetThree] - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseDecOctetOne)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('0'): - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - case _UT('5'): - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - uriPushToStack(parser, (unsigned char)(9 + *first - _UT('9'))); - return (const URI_CHAR *)URI_FUNC(ParseDecOctetThree)(parser, first + 1, afterLast); - - default: - return first; - } -} - - - -/* - * [decOctetTwo]-> - * [decOctetTwo]-><0>[decOctetThree] - * [decOctetTwo]-><1>[decOctetThree] - * [decOctetTwo]-><2>[decOctetThree] - * [decOctetTwo]-><3>[decOctetThree] - * [decOctetTwo]-><4>[decOctetThree] - * [decOctetTwo]-><5>[decOctetFour] - * [decOctetTwo]-><6> - * [decOctetTwo]-><7> - * [decOctetTwo]-><8> - * [decOctetTwo]-><9> -*/ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseDecOctetTwo)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('0'): - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - uriPushToStack(parser, (unsigned char)(9 + *first - _UT('9'))); - return (const URI_CHAR *)URI_FUNC(ParseDecOctetThree)(parser, first + 1, afterLast); - - case _UT('5'): - uriPushToStack(parser, 5); - return (const URI_CHAR *)URI_FUNC(ParseDecOctetFour)(parser, first + 1, afterLast); - - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - uriPushToStack(parser, (unsigned char)(9 + *first - _UT('9'))); - return first + 1; - - default: - return first; - } -} - - - -/* - * [decOctetThree]-> - * [decOctetThree]->[DIGIT] - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseDecOctetThree)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('0'): - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - case _UT('5'): - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - uriPushToStack(parser, (unsigned char)(9 + *first - _UT('9'))); - return first + 1; - - default: - return first; - } -} - - - -/* - * [decOctetFour]-> - * [decOctetFour]-><0> - * [decOctetFour]-><1> - * [decOctetFour]-><2> - * [decOctetFour]-><3> - * [decOctetFour]-><4> - * [decOctetFour]-><5> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseDecOctetFour)(UriIp4Parser * parser, - const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('0'): - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - case _UT('5'): - uriPushToStack(parser, (unsigned char)(9 + *first - _UT('9'))); - return first + 1; - - default: - return first; - } -} - - -/* Source: UriCompare.c */ -static int URI_FUNC(CompareRange)(const URI_TYPE(TextRange) * a, - const URI_TYPE(TextRange) * b); - - - -/* Compares two text ranges for equal text content */ -static URI_INLINE int URI_FUNC(CompareRange)(const URI_TYPE(TextRange) * a, - const URI_TYPE(TextRange) * b) { - int diff; - - /* NOTE: Both NULL means equal! */ - if ((a == NULL) || (b == NULL)) { - return ((a == NULL) && (b == NULL)) ? URI_TRUE : URI_FALSE; - } - - diff = ((int)(a->afterLast - a->first) - (int)(b->afterLast - b->first)); - if (diff > 0) { - return 1; - } else if (diff < 0) { - return -1; - } - - return URI_STRNCMP(a->first, b->first, (a->afterLast - a->first)); -} - - - -UriBool URI_FUNC(EqualsUri)(const URI_TYPE(Uri) * a, - const URI_TYPE(Uri) * b) { - /* NOTE: Both NULL means equal! */ - if ((a == NULL) || (b == NULL)) { - return ((a == NULL) && (b == NULL)) ? URI_TRUE : URI_FALSE; - } - - /* scheme */ - if (URI_FUNC(CompareRange)(&(a->scheme), &(b->scheme))) { - return URI_FALSE; - } - - /* absolutePath */ - if ((a->scheme.first == NULL)&& (a->absolutePath != b->absolutePath)) { - return URI_FALSE; - } - - /* userInfo */ - if (URI_FUNC(CompareRange)(&(a->userInfo), &(b->userInfo))) { - return URI_FALSE; - } - - /* Host */ - if (((a->hostData.ip4 == NULL) != (b->hostData.ip4 == NULL)) - || ((a->hostData.ip6 == NULL) != (b->hostData.ip6 == NULL)) - || ((a->hostData.ipFuture.first == NULL) - != (b->hostData.ipFuture.first == NULL))) { - return URI_FALSE; - } - - if (a->hostData.ip4 != NULL) { - if (memcmp(a->hostData.ip4->data, b->hostData.ip4->data, 4)) { - return URI_FALSE; - } - } - - if (a->hostData.ip6 != NULL) { - if (memcmp(a->hostData.ip6->data, b->hostData.ip6->data, 16)) { - return URI_FALSE; - } - } - - if (a->hostData.ipFuture.first != NULL) { - if (URI_FUNC(CompareRange)(&(a->hostData.ipFuture), &(b->hostData.ipFuture))) { - return URI_FALSE; - } - } - - if ((a->hostData.ip4 == NULL) - && (a->hostData.ip6 == NULL) - && (a->hostData.ipFuture.first == NULL)) { - if (URI_FUNC(CompareRange)(&(a->hostText), &(b->hostText))) { - return URI_FALSE; - } - } - - /* portText */ - if (URI_FUNC(CompareRange)(&(a->portText), &(b->portText))) { - return URI_FALSE; - } - - /* Path */ - if ((a->pathHead == NULL) != (b->pathHead == NULL)) { - return URI_FALSE; - } - - if (a->pathHead != NULL) { - URI_TYPE(PathSegment) * walkA = a->pathHead; - URI_TYPE(PathSegment) * walkB = b->pathHead; - do { - if (URI_FUNC(CompareRange)(&(walkA->text), &(walkB->text))) { - return URI_FALSE; - } - if ((walkA->next == NULL) != (walkB->next == NULL)) { - return URI_FALSE; - } - walkA = walkA->next; - walkB = walkB->next; - } while (walkA != NULL); - } - - /* query */ - if (URI_FUNC(CompareRange)(&(a->query), &(b->query))) { - return URI_FALSE; - } - - /* fragment */ - if (URI_FUNC(CompareRange)(&(a->fragment), &(b->fragment))) { - return URI_FALSE; - } - - return URI_TRUE; /* Equal*/ -} - - -/* Source: UriEscape.c */ -URI_CHAR * URI_FUNC(Escape)(const URI_CHAR * in, URI_CHAR * out, - UriBool spaceToPlus, UriBool normalizeBreaks) { - return URI_FUNC(EscapeEx)(in, NULL, out, spaceToPlus, normalizeBreaks); -} - - - -URI_CHAR * URI_FUNC(EscapeEx)(const URI_CHAR * inFirst, - const URI_CHAR * inAfterLast, URI_CHAR * out, - UriBool spaceToPlus, UriBool normalizeBreaks) { - const URI_CHAR * read = inFirst; - URI_CHAR * write = out; - UriBool prevWasCr = URI_FALSE; - if ((out == NULL) || (inFirst == out)) { - return NULL; - } else if (inFirst == NULL) { - if (out != NULL) { - out[0] = _UT('\0'); - } - return out; - } - - for (;;) { - if ((inAfterLast != NULL) && (read >= inAfterLast)) { - write[0] = _UT('\0'); - return write; - } - - switch (read[0]) { - case _UT('\0'): - write[0] = _UT('\0'); - return write; - - case _UT(' '): - if (spaceToPlus) { - write[0] = _UT('+'); - write++; - } else { - write[0] = _UT('%'); - write[1] = _UT('2'); - write[2] = _UT('0'); - write += 3; - } - prevWasCr = URI_FALSE; - break; - - case _UT('a'): /* ALPHA */ - case _UT('A'): - case _UT('b'): - case _UT('B'): - case _UT('c'): - case _UT('C'): - case _UT('d'): - case _UT('D'): - case _UT('e'): - case _UT('E'): - case _UT('f'): - case _UT('F'): - case _UT('g'): - case _UT('G'): - case _UT('h'): - case _UT('H'): - case _UT('i'): - case _UT('I'): - case _UT('j'): - case _UT('J'): - case _UT('k'): - case _UT('K'): - case _UT('l'): - case _UT('L'): - case _UT('m'): - case _UT('M'): - case _UT('n'): - case _UT('N'): - case _UT('o'): - case _UT('O'): - case _UT('p'): - case _UT('P'): - case _UT('q'): - case _UT('Q'): - case _UT('r'): - case _UT('R'): - case _UT('s'): - case _UT('S'): - case _UT('t'): - case _UT('T'): - case _UT('u'): - case _UT('U'): - case _UT('v'): - case _UT('V'): - case _UT('w'): - case _UT('W'): - case _UT('x'): - case _UT('X'): - case _UT('y'): - case _UT('Y'): - case _UT('z'): - case _UT('Z'): - case _UT('0'): /* DIGIT */ - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - case _UT('5'): - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - case _UT('-'): /* "-" / "." / "_" / "~" */ - case _UT('.'): - case _UT('_'): - case _UT('~'): - /* Copy unmodified */ - write[0] = read[0]; - write++; - - prevWasCr = URI_FALSE; - break; - - case _UT('\x0a'): - if (normalizeBreaks) { - if (!prevWasCr) { - write[0] = _UT('%'); - write[1] = _UT('0'); - write[2] = _UT('D'); - write[3] = _UT('%'); - write[4] = _UT('0'); - write[5] = _UT('A'); - write += 6; - } - } else { - write[0] = _UT('%'); - write[1] = _UT('0'); - write[2] = _UT('A'); - write += 3; - } - prevWasCr = URI_FALSE; - break; - - case _UT('\x0d'): - if (normalizeBreaks) { - write[0] = _UT('%'); - write[1] = _UT('0'); - write[2] = _UT('D'); - write[3] = _UT('%'); - write[4] = _UT('0'); - write[5] = _UT('A'); - write += 6; - } else { - write[0] = _UT('%'); - write[1] = _UT('0'); - write[2] = _UT('D'); - write += 3; - } - prevWasCr = URI_TRUE; - break; - - default: - /* Percent encode */ - { - const unsigned char code = (unsigned char)read[0]; - write[0] = _UT('%'); - write[1] = URI_FUNC(HexToLetter)(code >> 4); - write[2] = URI_FUNC(HexToLetter)(code & 0x0f); - write += 3; - } - prevWasCr = URI_FALSE; - break; - } - - read++; - } -} - - - -const URI_CHAR * URI_FUNC(UnescapeInPlace)(URI_CHAR * inout) { - return URI_FUNC(UnescapeInPlaceEx)(inout, URI_FALSE, URI_BR_DONT_TOUCH); -} - - - -const URI_CHAR * URI_FUNC(UnescapeInPlaceEx)(URI_CHAR * inout, - UriBool plusToSpace, UriBreakConversion breakConversion) { - URI_CHAR * read = inout; - URI_CHAR * write = inout; - UriBool prevWasCr = URI_FALSE; - - if (inout == NULL) { - return NULL; - } - - for (;;) { - switch (read[0]) { - case _UT('\0'): - if (read > write) { - write[0] = _UT('\0'); - } - return write; - - case _UT('%'): - switch (read[1]) { - case _UT('0'): - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - case _UT('5'): - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - case _UT('a'): - case _UT('b'): - case _UT('c'): - case _UT('d'): - case _UT('e'): - case _UT('f'): - case _UT('A'): - case _UT('B'): - case _UT('C'): - case _UT('D'): - case _UT('E'): - case _UT('F'): - switch (read[2]) { - case _UT('0'): - case _UT('1'): - case _UT('2'): - case _UT('3'): - case _UT('4'): - case _UT('5'): - case _UT('6'): - case _UT('7'): - case _UT('8'): - case _UT('9'): - case _UT('a'): - case _UT('b'): - case _UT('c'): - case _UT('d'): - case _UT('e'): - case _UT('f'): - case _UT('A'): - case _UT('B'): - case _UT('C'): - case _UT('D'): - case _UT('E'): - case _UT('F'): - { - /* Percent group found */ - const unsigned char left = URI_FUNC(HexdigToInt)(read[1]); - const unsigned char right = URI_FUNC(HexdigToInt)(read[2]); - const int code = 16 * left + right; - switch (code) { - case 10: - switch (breakConversion) { - case URI_BR_TO_LF: - if (!prevWasCr) { - write[0] = (URI_CHAR)10; - write++; - } - break; - - case URI_BR_TO_CRLF: - if (!prevWasCr) { - write[0] = (URI_CHAR)13; - write[1] = (URI_CHAR)10; - write += 2; - } - break; - - case URI_BR_TO_CR: - if (!prevWasCr) { - write[0] = (URI_CHAR)13; - write++; - } - break; - - case URI_BR_DONT_TOUCH: - default: - write[0] = (URI_CHAR)10; - write++; - - } - prevWasCr = URI_FALSE; - break; - - case 13: - switch (breakConversion) { - case URI_BR_TO_LF: - write[0] = (URI_CHAR)10; - write++; - break; - - case URI_BR_TO_CRLF: - write[0] = (URI_CHAR)13; - write[1] = (URI_CHAR)10; - write += 2; - break; - - case URI_BR_TO_CR: - write[0] = (URI_CHAR)13; - write++; - break; - - case URI_BR_DONT_TOUCH: - default: - write[0] = (URI_CHAR)13; - write++; - - } - prevWasCr = URI_TRUE; - break; - - default: - write[0] = (URI_CHAR)(code); - write++; - - prevWasCr = URI_FALSE; - - } - read += 3; - } - break; - - default: - /* Copy two chars unmodified and */ - /* look at this char again */ - if (read > write) { - write[0] = read[0]; - write[1] = read[1]; - } - read += 2; - write += 2; - - prevWasCr = URI_FALSE; - } - break; - - default: - /* Copy one char unmodified and */ - /* look at this char again */ - if (read > write) { - write[0] = read[0]; - } - read++; - write++; - - prevWasCr = URI_FALSE; - } - break; - - case _UT('+'): - if (plusToSpace) { - /* Convert '+' to ' ' */ - write[0] = _UT(' '); - } else { - /* Copy one char unmodified */ - if (read > write) { - write[0] = read[0]; - } - } - read++; - write++; - - prevWasCr = URI_FALSE; - break; - - default: - /* Copy one char unmodified */ - if (read > write) { - write[0] = read[0]; - } - read++; - write++; - - prevWasCr = URI_FALSE; - } - } -} - - -/* Source: UriFile.c */ - -static URI_INLINE int URI_FUNC(FilenameToUriString)(const URI_CHAR * filename, - URI_CHAR * uriString, UriBool fromUnix) { - const URI_CHAR * input = filename; - const URI_CHAR * lastSep = input - 1; - UriBool firstSegment = URI_TRUE; - URI_CHAR * output = uriString; - const UriBool absolute = (filename != NULL) && ((fromUnix && (filename[0] == _UT('/'))) - || (!fromUnix && (filename[0] != _UT('\0')) && (filename[1] == _UT(':')))); - - if ((filename == NULL) || (uriString == NULL)) { - return URI_ERROR_NULL; - } - - if (absolute) { - const URI_CHAR * const prefix = fromUnix ? _UT("file://") : _UT("file:///"); - const int prefixLen = fromUnix ? 7 : 8; - - /* Copy prefix */ - memcpy(uriString, prefix, prefixLen * sizeof(URI_CHAR)); - output += prefixLen; - } - - /* Copy and escape on the fly */ - for (;;) { - if ((input[0] == _UT('\0')) - || (fromUnix && input[0] == _UT('/')) - || (!fromUnix && input[0] == _UT('\\'))) { - /* Copy text after last seperator */ - if (lastSep + 1 < input) { - if (!fromUnix && absolute && (firstSegment == URI_TRUE)) { - /* Quick hack to not convert "C:" to "C%3A" */ - const int charsToCopy = (int)(input - (lastSep + 1)); - memcpy(output, lastSep + 1, charsToCopy * sizeof(URI_CHAR)); - output += charsToCopy; - } else { - output = URI_FUNC(EscapeEx)(lastSep + 1, input, output, - URI_FALSE, URI_FALSE); - } - } - firstSegment = URI_FALSE; - } - - if (input[0] == _UT('\0')) { - output[0] = _UT('\0'); - break; - } else if (fromUnix && (input[0] == _UT('/'))) { - /* Copy separators unmodified */ - output[0] = _UT('/'); - output++; - lastSep = input; - } else if (!fromUnix && (input[0] == _UT('\\'))) { - /* Convert backslashes to forward slashes */ - output[0] = _UT('/'); - output++; - lastSep = input; - } - input++; - } - - return URI_SUCCESS; -} - - - -static URI_INLINE int URI_FUNC(UriStringToFilename)(const URI_CHAR * uriString, - URI_CHAR * filename, UriBool toUnix) { - const URI_CHAR * const prefix = toUnix ? _UT("file://") : _UT("file:///"); - const int prefixLen = toUnix ? 7 : 8; - URI_CHAR * walker = filename; - size_t charsToCopy; - const UriBool absolute = (URI_STRNCMP(uriString, prefix, prefixLen) == 0); - const int charsToSkip = (absolute ? prefixLen : 0); - - charsToCopy = URI_STRLEN(uriString + charsToSkip) + 1; - memcpy(filename, uriString + charsToSkip, charsToCopy * sizeof(URI_CHAR)); - URI_FUNC(UnescapeInPlaceEx)(filename, URI_FALSE, URI_BR_DONT_TOUCH); - - /* Convert forward slashes to backslashes */ - if (!toUnix) { - while (walker[0] != _UT('\0')) { - if (walker[0] == _UT('/')) { - walker[0] = _UT('\\'); - } - walker++; - } - } - - return URI_SUCCESS; -} - - - -int URI_FUNC(UnixFilenameToUriString)(const URI_CHAR * filename, URI_CHAR * uriString) { - return URI_FUNC(FilenameToUriString)(filename, uriString, URI_TRUE); -} - - - -int URI_FUNC(WindowsFilenameToUriString)(const URI_CHAR * filename, URI_CHAR * uriString) { - return URI_FUNC(FilenameToUriString)(filename, uriString, URI_FALSE); -} - - - -int URI_FUNC(UriStringToUnixFilename)(const URI_CHAR * uriString, URI_CHAR * filename) { - return URI_FUNC(UriStringToFilename)(uriString, filename, URI_TRUE); -} - - - -int URI_FUNC(UriStringToWindowsFilename)(const URI_CHAR * uriString, URI_CHAR * filename) { - return URI_FUNC(UriStringToFilename)(uriString, filename, URI_FALSE); -} - - -/* Source: UriNormalizeBase.c */ -UriBool uriIsUnreserved(int code) { - switch (code) { - case L'a': /* ALPHA */ - case L'A': - case L'b': - case L'B': - case L'c': - case L'C': - case L'd': - case L'D': - case L'e': - case L'E': - case L'f': - case L'F': - case L'g': - case L'G': - case L'h': - case L'H': - case L'i': - case L'I': - case L'j': - case L'J': - case L'k': - case L'K': - case L'l': - case L'L': - case L'm': - case L'M': - case L'n': - case L'N': - case L'o': - case L'O': - case L'p': - case L'P': - case L'q': - case L'Q': - case L'r': - case L'R': - case L's': - case L'S': - case L't': - case L'T': - case L'u': - case L'U': - case L'v': - case L'V': - case L'w': - case L'W': - case L'x': - case L'X': - case L'y': - case L'Y': - case L'z': - case L'Z': - case L'0': /* DIGIT */ - case L'1': - case L'2': - case L'3': - case L'4': - case L'5': - case L'6': - case L'7': - case L'8': - case L'9': - case L'-': /* "-" / "." / "_" / "~" */ - case L'.': - case L'_': - case L'~': - return URI_TRUE; - - default: - return URI_FALSE; - } -} - - -/* Source: UriNormalize.c */ - -static URI_INLINE void URI_FUNC(PreventLeakage)(URI_TYPE(Uri) * uri, - unsigned int revertMask) { - if (revertMask & URI_NORMALIZE_SCHEME) { - free((URI_CHAR *)uri->scheme.first); - uri->scheme.first = NULL; - uri->scheme.afterLast = NULL; - } - - if (revertMask & URI_NORMALIZE_USER_INFO) { - free((URI_CHAR *)uri->userInfo.first); - uri->userInfo.first = NULL; - uri->userInfo.afterLast = NULL; - } - - if (revertMask & URI_NORMALIZE_HOST) { - if (uri->hostData.ipFuture.first != NULL) { - /* IPvFuture */ - free((URI_CHAR *)uri->hostData.ipFuture.first); - uri->hostData.ipFuture.first = NULL; - uri->hostData.ipFuture.afterLast = NULL; - uri->hostText.first = NULL; - uri->hostText.afterLast = NULL; - } else if ((uri->hostText.first != NULL) - && (uri->hostData.ip4 == NULL) - && (uri->hostData.ip6 == NULL)) { - /* Regname */ - free((URI_CHAR *)uri->hostText.first); - uri->hostText.first = NULL; - uri->hostText.afterLast = NULL; - } - } - - /* NOTE: Port cannot happen! */ - - if (revertMask & URI_NORMALIZE_PATH) { - URI_TYPE(PathSegment) * walker = uri->pathHead; - while (walker != NULL) { - URI_TYPE(PathSegment) * const next = walker->next; - if (walker->text.afterLast > walker->text.first) { - free((URI_CHAR *)walker->text.first); - } - free(walker); - walker = next; - } - uri->pathHead = NULL; - uri->pathTail = NULL; - } - - if (revertMask & URI_NORMALIZE_QUERY) { - free((URI_CHAR *)uri->query.first); - uri->query.first = NULL; - uri->query.afterLast = NULL; - } - - if (revertMask & URI_NORMALIZE_FRAGMENT) { - free((URI_CHAR *)uri->fragment.first); - uri->fragment.first = NULL; - uri->fragment.afterLast = NULL; - } -} - - - -static URI_INLINE UriBool URI_FUNC(ContainsUppercaseLetters)(const URI_CHAR * first, - const URI_CHAR * afterLast) { - if ((first != NULL) && (afterLast != NULL) && (afterLast > first)) { - const URI_CHAR * i = first; - for (; i < afterLast; i++) { - /* 6.2.2.1 Case Normalization: uppercase letters in scheme or host */ - if ((*i >= _UT('A')) && (*i <= _UT('Z'))) { - return URI_TRUE; - } - } - } - return URI_FALSE; -} - - - -static URI_INLINE UriBool URI_FUNC(ContainsUglyPercentEncoding)(const URI_CHAR * first, - const URI_CHAR * afterLast) { - if ((first != NULL) && (afterLast != NULL) && (afterLast > first)) { - const URI_CHAR * i = first; - for (; i + 2 < afterLast; i++) { - if (i[0] == _UT('%')) { - /* 6.2.2.1 Case Normalization: * - * lowercase percent-encodings */ - if (((i[1] >= _UT('a')) && (i[1] <= _UT('f'))) - || ((i[2] >= _UT('a')) && (i[2] <= _UT('f')))) { - return URI_TRUE; - } else { - /* 6.2.2.2 Percent-Encoding Normalization: * - * percent-encoded unreserved characters */ - const unsigned char left = URI_FUNC(HexdigToInt)(i[1]); - const unsigned char right = URI_FUNC(HexdigToInt)(i[2]); - const int code = 16 * left + right; - if (uriIsUnreserved(code)) { - return URI_TRUE; - } - } - } - } - } - return URI_FALSE; -} - - - -static URI_INLINE void URI_FUNC(LowercaseInplace)(const URI_CHAR * first, - const URI_CHAR * afterLast) { - if ((first != NULL) && (afterLast != NULL) && (afterLast > first)) { - URI_CHAR * i = (URI_CHAR *)first; - const int lowerUpperDiff = (_UT('a') - _UT('A')); - for (; i < afterLast; i++) { - if ((*i >= _UT('A')) && (*i <=_UT('Z'))) { - *i = (URI_CHAR)(*i + lowerUpperDiff); - } - } - } -} - - - -static URI_INLINE UriBool URI_FUNC(LowercaseMalloc)(const URI_CHAR ** first, - const URI_CHAR ** afterLast) { - int lenInChars; - const int lowerUpperDiff = (_UT('a') - _UT('A')); - URI_CHAR * buffer; - int i = 0; - - if ((first == NULL) || (afterLast == NULL) || (*first == NULL) - || (*afterLast == NULL)) { - return URI_FALSE; - } - - lenInChars = (int)(*afterLast - *first); - if (lenInChars == 0) { - return URI_TRUE; - } else if (lenInChars < 0) { - return URI_FALSE; - } - - buffer = ( URI_CHAR* )malloc(lenInChars * sizeof(URI_CHAR)); - if (buffer == NULL) { - return URI_FALSE; - } - - for (; i < lenInChars; i++) { - if (((*first)[i] >= _UT('A')) && ((*first)[i] <=_UT('Z'))) { - buffer[i] = (URI_CHAR)((*first)[i] + lowerUpperDiff); - } else { - buffer[i] = (*first)[i]; - } - } - - *first = buffer; - *afterLast = buffer + lenInChars; - return URI_TRUE; -} - - - -/* NOTE: Implementation must stay inplace-compatible */ -static URI_INLINE void URI_FUNC(FixPercentEncodingEngine)( - const URI_CHAR * inFirst, const URI_CHAR * inAfterLast, - const URI_CHAR * outFirst, const URI_CHAR ** outAfterLast) { - URI_CHAR * write = (URI_CHAR *)outFirst; - const int lenInChars = (int)(inAfterLast - inFirst); - int i = 0; - - /* All but last two */ - for (; i + 2 < lenInChars; i++) { - if (inFirst[i] != _UT('%')) { - write[0] = inFirst[i]; - write++; - } else { - /* 6.2.2.2 Percent-Encoding Normalization: * - * percent-encoded unreserved characters */ - const URI_CHAR one = inFirst[i + 1]; - const URI_CHAR two = inFirst[i + 2]; - const unsigned char left = URI_FUNC(HexdigToInt)(one); - const unsigned char right = URI_FUNC(HexdigToInt)(two); - const int code = 16 * left + right; - if (uriIsUnreserved(code)) { - write[0] = (URI_CHAR)(code); - write++; - } else { - /* 6.2.2.1 Case Normalization: * - * lowercase percent-encodings */ - write[0] = _UT('%'); - write[1] = URI_FUNC(HexToLetter)(left); - write[2] = URI_FUNC(HexToLetter)(right); - write += 3; - } - - i += 2; /* For the two chars of the percent group we just ate */ - } - } - - /* Last two */ - for (; i < lenInChars; i++) { - write[0] = inFirst[i]; - write++; - } - - *outAfterLast = write; -} - - - -static URI_INLINE void URI_FUNC(FixPercentEncodingInplace)(const URI_CHAR * first, - const URI_CHAR ** afterLast) { - /* Death checks */ - if ((first == NULL) || (afterLast == NULL) || (*afterLast == NULL)) { - return; - } - - /* Fix inplace */ - URI_FUNC(FixPercentEncodingEngine)(first, *afterLast, first, afterLast); -} - - - -static URI_INLINE UriBool URI_FUNC(FixPercentEncodingMalloc)(const URI_CHAR ** first, - const URI_CHAR ** afterLast) { - int lenInChars; - URI_CHAR * buffer; - - /* Death checks */ - if ((first == NULL) || (afterLast == NULL) - || (*first == NULL) || (*afterLast == NULL)) { - return URI_FALSE; - } - - /* Old text length */ - lenInChars = (int)(*afterLast - *first); - if (lenInChars == 0) { - return URI_TRUE; - } else if (lenInChars < 0) { - return URI_FALSE; - } - - /* New buffer */ - buffer = ( URI_CHAR* )malloc(lenInChars * sizeof(URI_CHAR)); - if (buffer == NULL) { - return URI_FALSE; - } - - /* Fix on copy */ - URI_FUNC(FixPercentEncodingEngine)(*first, *afterLast, buffer, afterLast); - *first = buffer; - return URI_TRUE; -} - - - -static URI_INLINE UriBool URI_FUNC(MakeRangeOwner)(unsigned int * doneMask, - unsigned int maskTest, URI_TYPE(TextRange) * range) { - if (((*doneMask & maskTest) == 0) - && (range->first != NULL) - && (range->afterLast != NULL) - && (range->afterLast > range->first)) { - const int lenInChars = (int)(range->afterLast - range->first); - const int lenInBytes = lenInChars * sizeof(URI_CHAR); - URI_CHAR * dup = ( URI_CHAR* )malloc(lenInBytes); - if (dup == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - memcpy(dup, range->first, lenInBytes); - range->first = dup; - range->afterLast = dup + lenInChars; - *doneMask |= maskTest; - } - return URI_TRUE; -} - - - -static URI_INLINE UriBool URI_FUNC(MakeOwner)(URI_TYPE(Uri) * uri, - unsigned int * doneMask) { - URI_TYPE(PathSegment) * walker = uri->pathHead; - if (!URI_FUNC(MakeRangeOwner)(doneMask, URI_NORMALIZE_SCHEME, - &(uri->scheme)) - || !URI_FUNC(MakeRangeOwner)(doneMask, URI_NORMALIZE_USER_INFO, - &(uri->userInfo)) - || !URI_FUNC(MakeRangeOwner)(doneMask, URI_NORMALIZE_QUERY, - &(uri->query)) - || !URI_FUNC(MakeRangeOwner)(doneMask, URI_NORMALIZE_FRAGMENT, - &(uri->fragment))) { - return URI_FALSE; /* Raises malloc error */ - } - - /* Host */ - if ((*doneMask & URI_NORMALIZE_HOST) == 0) { - if ((uri->hostData.ip4 == NULL) - && (uri->hostData.ip6 == NULL)) { - if (uri->hostData.ipFuture.first != NULL) { - /* IPvFuture */ - if (!URI_FUNC(MakeRangeOwner)(doneMask, URI_NORMALIZE_HOST, - &(uri->hostData.ipFuture))) { - return URI_FALSE; /* Raises malloc error */ - } - uri->hostText.first = uri->hostData.ipFuture.first; - uri->hostText.afterLast = uri->hostData.ipFuture.afterLast; - } else if (uri->hostText.first != NULL) { - /* Regname */ - if (!URI_FUNC(MakeRangeOwner)(doneMask, URI_NORMALIZE_HOST, - &(uri->hostText))) { - return URI_FALSE; /* Raises malloc error */ - } - } - } - } - - /* Path */ - if ((*doneMask & URI_NORMALIZE_PATH) == 0) { - while (walker != NULL) { - if (!URI_FUNC(MakeRangeOwner)(doneMask, 0, &(walker->text))) { - /* Kill path to one before walker */ - URI_TYPE(PathSegment) * ranger = uri->pathHead; - while (ranger->next != walker) { - URI_TYPE(PathSegment) * const next = ranger->next; - if ((ranger->text.first != NULL) - && (ranger->text.afterLast != NULL) - && (ranger->text.afterLast > ranger->text.first)) { - free((URI_CHAR *)ranger->text.first); - free(ranger); - } - ranger = next; - } - - /* Kill path from walker */ - while (walker != NULL) { - URI_TYPE(PathSegment) * const next = walker->next; - free(walker); - walker = next; - } - - uri->pathHead = NULL; - uri->pathTail = NULL; - return URI_FALSE; /* Raises malloc error */ - } - walker = walker->next; - } - *doneMask |= URI_NORMALIZE_PATH; - } - - /* Port text, must come last so we don't have to undo that one if it fails. * - * Otherwise we would need and extra enum flag for it although the port * - * cannot go unnormalized... */ - if (!URI_FUNC(MakeRangeOwner)(doneMask, 0, &(uri->portText))) { - return URI_FALSE; /* Raises malloc error */ - } - - return URI_TRUE; -} - - - -unsigned int URI_FUNC(NormalizeSyntaxMaskRequired)(const URI_TYPE(Uri) * uri) { - unsigned int res; -#if defined(__GNUC__) && ((__GNUC__ > 4) \ - || ((__GNUC__ == 4) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ >= 2))) - /* Slower code that fixes a warning, not sure if this is a smart idea */ - URI_TYPE(Uri) writeableClone; - memcpy(&writeableClone, uri, 1 * sizeof(URI_TYPE(Uri))); - URI_FUNC(NormalizeSyntaxEngine)(&writeableClone, 0, &res); -#else - URI_FUNC(NormalizeSyntaxEngine)((URI_TYPE(Uri) *)uri, 0, &res); -#endif - return res; -} - - - -int URI_FUNC(NormalizeSyntaxEx)(URI_TYPE(Uri) * uri, unsigned int mask) { - return URI_FUNC(NormalizeSyntaxEngine)(uri, mask, NULL); -} - - - -int URI_FUNC(NormalizeSyntax)(URI_TYPE(Uri) * uri) { - return URI_FUNC(NormalizeSyntaxEx)(uri, (unsigned int)-1); -} - - - -static URI_INLINE int URI_FUNC(NormalizeSyntaxEngine)(URI_TYPE(Uri) * uri, unsigned int inMask, unsigned int * outMask) { - unsigned int doneMask = URI_NORMALIZED; - if (uri == NULL) { - if (outMask != NULL) { - *outMask = URI_NORMALIZED; - return URI_SUCCESS; - } else { - return URI_ERROR_NULL; - } - } - - if (outMask != NULL) { - /* Reset mask */ - *outMask = URI_NORMALIZED; - } else if (inMask == URI_NORMALIZED) { - /* Nothing to do */ - return URI_SUCCESS; - } - - /* Scheme, host */ - if (outMask != NULL) { - const UriBool normalizeScheme = URI_FUNC(ContainsUppercaseLetters)( - uri->scheme.first, uri->scheme.afterLast); - const UriBool normalizeHostCase = URI_FUNC(ContainsUppercaseLetters)( - uri->hostText.first, uri->hostText.afterLast); - if (normalizeScheme) { - *outMask |= URI_NORMALIZE_SCHEME; - } - - if (normalizeHostCase) { - *outMask |= URI_NORMALIZE_HOST; - } else { - const UriBool normalizeHostPrecent = URI_FUNC(ContainsUglyPercentEncoding)( - uri->hostText.first, uri->hostText.afterLast); - if (normalizeHostPrecent) { - *outMask |= URI_NORMALIZE_HOST; - } - } - } else { - /* Scheme */ - if ((inMask & URI_NORMALIZE_SCHEME) && (uri->scheme.first != NULL)) { - if (uri->owner) { - URI_FUNC(LowercaseInplace)(uri->scheme.first, uri->scheme.afterLast); - } else { - if (!URI_FUNC(LowercaseMalloc)(&(uri->scheme.first), &(uri->scheme.afterLast))) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - doneMask |= URI_NORMALIZE_SCHEME; - } - } - - /* Host */ - if (inMask & URI_NORMALIZE_HOST) { - if (uri->hostData.ipFuture.first != NULL) { - /* IPvFuture */ - if (uri->owner) { - URI_FUNC(LowercaseInplace)(uri->hostData.ipFuture.first, - uri->hostData.ipFuture.afterLast); - } else { - if (!URI_FUNC(LowercaseMalloc)(&(uri->hostData.ipFuture.first), - &(uri->hostData.ipFuture.afterLast))) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - doneMask |= URI_NORMALIZE_HOST; - } - uri->hostText.first = uri->hostData.ipFuture.first; - uri->hostText.afterLast = uri->hostData.ipFuture.afterLast; - } else if ((uri->hostText.first != NULL) - && (uri->hostData.ip4 == NULL) - && (uri->hostData.ip6 == NULL)) { - /* Regname */ - if (uri->owner) { - URI_FUNC(FixPercentEncodingInplace)(uri->hostText.first, - &(uri->hostText.afterLast)); - } else { - if (!URI_FUNC(FixPercentEncodingMalloc)( - &(uri->hostText.first), - &(uri->hostText.afterLast))) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - doneMask |= URI_NORMALIZE_HOST; - } - - URI_FUNC(LowercaseInplace)(uri->hostText.first, - uri->hostText.afterLast); - } - } - } - - /* User info */ - if (outMask != NULL) { - const UriBool normalizeUserInfo = URI_FUNC(ContainsUglyPercentEncoding)( - uri->userInfo.first, uri->userInfo.afterLast); - if (normalizeUserInfo) { - *outMask |= URI_NORMALIZE_USER_INFO; - } - } else { - if ((inMask & URI_NORMALIZE_USER_INFO) && (uri->userInfo.first != NULL)) { - if (uri->owner) { - URI_FUNC(FixPercentEncodingInplace)(uri->userInfo.first, &(uri->userInfo.afterLast)); - } else { - if (!URI_FUNC(FixPercentEncodingMalloc)(&(uri->userInfo.first), - &(uri->userInfo.afterLast))) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - doneMask |= URI_NORMALIZE_USER_INFO; - } - } - } - - /* Path */ - if (outMask != NULL) { - const URI_TYPE(PathSegment) * walker = uri->pathHead; - while (walker != NULL) { - const URI_CHAR * const first = walker->text.first; - const URI_CHAR * const afterLast = walker->text.afterLast; - if ((first != NULL) - && (afterLast != NULL) - && (afterLast > first) - && ( - (((afterLast - first) == 1) - && (first[0] == _UT('.'))) - || - (((afterLast - first) == 2) - && (first[0] == _UT('.')) - && (first[1] == _UT('.'))) - || - URI_FUNC(ContainsUglyPercentEncoding)(first, afterLast) - )) { - *outMask |= URI_NORMALIZE_PATH; - break; - } - walker = walker->next; - } - } else if (inMask & URI_NORMALIZE_PATH) { - URI_TYPE(PathSegment) * walker; - const UriBool relative = ((uri->scheme.first == NULL) - && !uri->absolutePath) ? URI_TRUE : URI_FALSE; - - /* Fix percent-encoding for each segment */ - walker = uri->pathHead; - if (uri->owner) { - while (walker != NULL) { - URI_FUNC(FixPercentEncodingInplace)(walker->text.first, &(walker->text.afterLast)); - walker = walker->next; - } - } else { - while (walker != NULL) { - if (!URI_FUNC(FixPercentEncodingMalloc)(&(walker->text.first), - &(walker->text.afterLast))) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - walker = walker->next; - } - doneMask |= URI_NORMALIZE_PATH; - } - - /* 6.2.2.3 Path Segment Normalization */ - if (!URI_FUNC(RemoveDotSegmentsEx)(uri, relative, - (uri->owner == URI_TRUE) - || ((doneMask & URI_NORMALIZE_PATH) != 0) - )) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - URI_FUNC(FixEmptyTrailSegment)(uri); - } - - /* Query, fragment */ - if (outMask != NULL) { - const UriBool normalizeQuery = URI_FUNC(ContainsUglyPercentEncoding)( - uri->query.first, uri->query.afterLast); - const UriBool normalizeFragment = URI_FUNC(ContainsUglyPercentEncoding)( - uri->fragment.first, uri->fragment.afterLast); - if (normalizeQuery) { - *outMask |= URI_NORMALIZE_QUERY; - } - - if (normalizeFragment) { - *outMask |= URI_NORMALIZE_FRAGMENT; - } - } else { - /* Query */ - if ((inMask & URI_NORMALIZE_QUERY) && (uri->query.first != NULL)) { - if (uri->owner) { - URI_FUNC(FixPercentEncodingInplace)(uri->query.first, &(uri->query.afterLast)); - } else { - if (!URI_FUNC(FixPercentEncodingMalloc)(&(uri->query.first), - &(uri->query.afterLast))) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - doneMask |= URI_NORMALIZE_QUERY; - } - } - - /* Fragment */ - if ((inMask & URI_NORMALIZE_FRAGMENT) && (uri->fragment.first != NULL)) { - if (uri->owner) { - URI_FUNC(FixPercentEncodingInplace)(uri->fragment.first, &(uri->fragment.afterLast)); - } else { - if (!URI_FUNC(FixPercentEncodingMalloc)(&(uri->fragment.first), - &(uri->fragment.afterLast))) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - doneMask |= URI_NORMALIZE_FRAGMENT; - } - } - } - - /* Dup all not duped yet */ - if ((outMask == NULL) && !uri->owner) { - if (!URI_FUNC(MakeOwner)(uri, &doneMask)) { - URI_FUNC(PreventLeakage)(uri, doneMask); - return URI_ERROR_MALLOC; - } - uri->owner = URI_TRUE; - } - - return URI_SUCCESS; -} - - -/* Source: UriParseBase.c */ - - - -void uriWriteQuadToDoubleByte(const unsigned char * hexDigits, int digitCount, unsigned char * output) { - switch (digitCount) { - case 1: - /* 0x___? -> \x00 \x0? */ - output[0] = 0; - output[1] = hexDigits[0]; - break; - - case 2: - /* 0x__?? -> \0xx \x?? */ - output[0] = 0; - output[1] = 16 * hexDigits[0] + hexDigits[1]; - break; - - case 3: - /* 0x_??? -> \0x? \x?? */ - output[0] = hexDigits[0]; - output[1] = 16 * hexDigits[1] + hexDigits[2]; - break; - - case 4: - /* 0x???? -> \0?? \x?? */ - output[0] = 16 * hexDigits[0] + hexDigits[1]; - output[1] = 16 * hexDigits[2] + hexDigits[3]; - break; - - } -} - - - -unsigned char uriGetOctetValue(const unsigned char * digits, int digitCount) { - switch (digitCount) { - case 1: - return digits[0]; - - case 2: - return 10 * digits[0] + digits[1]; - - case 3: - default: - return 100 * digits[0] + 10 * digits[1] + digits[2]; - - } -} - - -/* Source: UriParse.c */ - -#define URI_SET_DIGIT \ - _UT('0'): \ - case _UT('1'): \ - case _UT('2'): \ - case _UT('3'): \ - case _UT('4'): \ - case _UT('5'): \ - case _UT('6'): \ - case _UT('7'): \ - case _UT('8'): \ - case _UT('9') - -#define URI_SET_HEX_LETTER_UPPER \ - _UT('A'): \ - case _UT('B'): \ - case _UT('C'): \ - case _UT('D'): \ - case _UT('E'): \ - case _UT('F') - -#define URI_SET_HEX_LETTER_LOWER \ - _UT('a'): \ - case _UT('b'): \ - case _UT('c'): \ - case _UT('d'): \ - case _UT('e'): \ - case _UT('f') - -#define URI_SET_HEXDIG \ - URI_SET_DIGIT: \ - case URI_SET_HEX_LETTER_UPPER: \ - case URI_SET_HEX_LETTER_LOWER - -#define URI_SET_ALPHA \ - URI_SET_HEX_LETTER_UPPER: \ - case URI_SET_HEX_LETTER_LOWER: \ - case _UT('g'): \ - case _UT('G'): \ - case _UT('h'): \ - case _UT('H'): \ - case _UT('i'): \ - case _UT('I'): \ - case _UT('j'): \ - case _UT('J'): \ - case _UT('k'): \ - case _UT('K'): \ - case _UT('l'): \ - case _UT('L'): \ - case _UT('m'): \ - case _UT('M'): \ - case _UT('n'): \ - case _UT('N'): \ - case _UT('o'): \ - case _UT('O'): \ - case _UT('p'): \ - case _UT('P'): \ - case _UT('q'): \ - case _UT('Q'): \ - case _UT('r'): \ - case _UT('R'): \ - case _UT('s'): \ - case _UT('S'): \ - case _UT('t'): \ - case _UT('T'): \ - case _UT('u'): \ - case _UT('U'): \ - case _UT('v'): \ - case _UT('V'): \ - case _UT('w'): \ - case _UT('W'): \ - case _UT('x'): \ - case _UT('X'): \ - case _UT('y'): \ - case _UT('Y'): \ - case _UT('z'): \ - case _UT('Z') - -static URI_INLINE void URI_FUNC(StopSyntax)(URI_TYPE(ParserState) * state, - const URI_CHAR * errorPos) { - URI_FUNC(FreeUriMembers)(state->uri); - state->errorPos = errorPos; - state->errorCode = URI_ERROR_SYNTAX; -} - - - -static URI_INLINE void URI_FUNC(StopMalloc)(URI_TYPE(ParserState) * state) { - URI_FUNC(FreeUriMembers)(state->uri); - state->errorPos = NULL; - state->errorCode = URI_ERROR_MALLOC; -} - - - -/* - * [authority]-><[>[ipLit2][authorityTwo] - * [authority]->[ownHostUserInfoNz] - * [authority]-> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseAuthority)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - /* "" regname host */ - state->uri->hostText.first = URI_FUNC(SafeToPointTo); - state->uri->hostText.afterLast = URI_FUNC(SafeToPointTo); - return afterLast; - } - - switch (*first) { - case _UT('['): - { - const URI_CHAR * const afterIpLit2 - = URI_FUNC(ParseIpLit2)(state, first + 1, afterLast); - if (afterIpLit2 == NULL) { - return NULL; - } - state->uri->hostText.first = first + 1; /* HOST BEGIN */ - return URI_FUNC(ParseAuthorityTwo)(state, afterIpLit2, afterLast); - } - - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('@'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - state->uri->userInfo.first = first; /* USERINFO BEGIN */ - return URI_FUNC(ParseOwnHostUserInfoNz)(state, first, afterLast); - - default: - /* "" regname host */ - state->uri->hostText.first = URI_FUNC(SafeToPointTo); - state->uri->hostText.afterLast = URI_FUNC(SafeToPointTo); - return first; - } -} - - - -/* - * [authorityTwo]-><:>[port] - * [authorityTwo]-> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseAuthorityTwo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT(':'): - { - const URI_CHAR * const afterPort = URI_FUNC(ParsePort)(state, first + 1, afterLast); - if (afterPort == NULL) { - return NULL; - } - state->uri->portText.first = first + 1; /* PORT BEGIN */ - state->uri->portText.afterLast = afterPort; /* PORT END */ - return afterPort; - } - - default: - return first; - } -} - - - -/* - * [hexZero]->[HEXDIG][hexZero] - * [hexZero]-> - */ -static const URI_CHAR * URI_FUNC(ParseHexZero)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case URI_SET_HEXDIG: - return URI_FUNC(ParseHexZero)(state, first + 1, afterLast); - - default: - return first; - } -} - - - -/* - * [hierPart]->[pathRootless] - * [hierPart]->[partHelperTwo] - * [hierPart]-> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseHierPart)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('@'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - return URI_FUNC(ParsePathRootless)(state, first, afterLast); - - case _UT('/'): - return URI_FUNC(ParsePartHelperTwo)(state, first + 1, afterLast); - - default: - return first; - } -} - - - -/* - * [ipFutLoop]->[subDelims][ipFutStopGo] - * [ipFutLoop]->[unreserved][ipFutStopGo] - * [ipFutLoop]-><:>[ipFutStopGo] - */ -static const URI_CHAR * URI_FUNC(ParseIpFutLoop)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - return URI_FUNC(ParseIpFutStopGo)(state, first + 1, afterLast); - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } -} - - - -/* - * [ipFutStopGo]->[ipFutLoop] - * [ipFutStopGo]-> - */ -static const URI_CHAR * URI_FUNC(ParseIpFutStopGo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - return URI_FUNC(ParseIpFutLoop)(state, first, afterLast); - - default: - return first; - } -} - - - -/* - * [ipFuture]->[HEXDIG][hexZero]<.>[ipFutLoop] - */ -static const URI_CHAR * URI_FUNC(ParseIpFuture)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - /* - First character has already been - checked before entering this rule. - - switch (*first) { - case _UT('v'): - */ - if (first + 1 >= afterLast) { - URI_FUNC(StopSyntax)(state, first + 1); - return NULL; - } - - switch (first[1]) { - case URI_SET_HEXDIG: - { - const URI_CHAR * afterIpFutLoop; - const URI_CHAR * const afterHexZero - = URI_FUNC(ParseHexZero)(state, first + 2, afterLast); - if (afterHexZero == NULL) { - return NULL; - } - if ((afterHexZero >= afterLast) - || (*afterHexZero != _UT('.'))) { - URI_FUNC(StopSyntax)(state, afterHexZero); - return NULL; - } - state->uri->hostText.first = first; /* HOST BEGIN */ - state->uri->hostData.ipFuture.first = first; /* IPFUTURE BEGIN */ - afterIpFutLoop = URI_FUNC(ParseIpFutLoop)(state, afterHexZero + 1, afterLast); - if (afterIpFutLoop == NULL) { - return NULL; - } - state->uri->hostText.afterLast = afterIpFutLoop; /* HOST END */ - state->uri->hostData.ipFuture.afterLast = afterIpFutLoop; /* IPFUTURE END */ - return afterIpFutLoop; - } - - default: - URI_FUNC(StopSyntax)(state, first + 1); - return NULL; - } - - /* - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - */ -} - - - -/* - * [ipLit2]->[ipFuture]<]> - * [ipLit2]->[IPv6address2] - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseIpLit2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - switch (*first) { - case _UT('v'): - { - const URI_CHAR * const afterIpFuture - = URI_FUNC(ParseIpFuture)(state, first, afterLast); - if (afterIpFuture == NULL) { - return NULL; - } - if ((afterIpFuture >= afterLast) - || (*afterIpFuture != _UT(']'))) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - return afterIpFuture + 1; - } - - case _UT(':'): - case _UT(']'): - case URI_SET_HEXDIG: - state->uri->hostData.ip6 = ( UriIp6* )malloc(1 * sizeof(UriIp6)); /* Freed when stopping on parse error */ - if (state->uri->hostData.ip6 == NULL) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return URI_FUNC(ParseIPv6address2)(state, first, afterLast); - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } -} - - - -/* - * [IPv6address2]->..<]> - */ -static const URI_CHAR * URI_FUNC(ParseIPv6address2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - int zipperEver = 0; - int quadsDone = 0; - int digitCount = 0; - unsigned char digitHistory[4]; - int ip4OctetsDone = 0; - - unsigned char quadsAfterZipper[14]; - int quadsAfterZipperCount = 0; - - - for (;;) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - /* Inside IPv4 part? */ - if (ip4OctetsDone > 0) { - /* Eat rest of IPv4 address */ - for (;;) { - switch (*first) { - case URI_SET_DIGIT: - if (digitCount == 4) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - digitHistory[digitCount++] = (unsigned char)(9 + *first - _UT('9')); - break; - - case _UT('.'): - if ((ip4OctetsDone == 4) /* NOTE! */ - || (digitCount == 0) - || (digitCount == 4)) { - /* Invalid digit or octet count */ - URI_FUNC(StopSyntax)(state, first); - return NULL; - } else if ((digitCount > 1) - && (digitHistory[0] == 0)) { - /* Leading zero */ - URI_FUNC(StopSyntax)(state, first - digitCount); - return NULL; - } else if ((digitCount > 2) - && (digitHistory[1] == 0)) { - /* Leading zero */ - URI_FUNC(StopSyntax)(state, first - digitCount + 1); - return NULL; - } else if ((digitCount == 3) - && (100 * digitHistory[0] - + 10 * digitHistory[1] - + digitHistory[2] > 255)) { - /* Octet value too large */ - if (digitHistory[0] > 2) { - URI_FUNC(StopSyntax)(state, first - 3); - } else if (digitHistory[1] > 5) { - URI_FUNC(StopSyntax)(state, first - 2); - } else { - URI_FUNC(StopSyntax)(state, first - 1); - } - return NULL; - } - - /* Copy IPv4 octet */ - state->uri->hostData.ip6->data[16 - 4 + ip4OctetsDone] = uriGetOctetValue(digitHistory, digitCount); - digitCount = 0; - ip4OctetsDone++; - break; - - case _UT(']'): - if ((ip4OctetsDone != 3) /* NOTE! */ - || (digitCount == 0) - || (digitCount == 4)) { - /* Invalid digit or octet count */ - URI_FUNC(StopSyntax)(state, first); - return NULL; - } else if ((digitCount > 1) - && (digitHistory[0] == 0)) { - /* Leading zero */ - URI_FUNC(StopSyntax)(state, first - digitCount); - return NULL; - } else if ((digitCount > 2) - && (digitHistory[1] == 0)) { - /* Leading zero */ - URI_FUNC(StopSyntax)(state, first - digitCount + 1); - return NULL; - } else if ((digitCount == 3) - && (100 * digitHistory[0] - + 10 * digitHistory[1] - + digitHistory[2] > 255)) { - /* Octet value too large */ - if (digitHistory[0] > 2) { - URI_FUNC(StopSyntax)(state, first - 3); - } else if (digitHistory[1] > 5) { - URI_FUNC(StopSyntax)(state, first - 2); - } else { - URI_FUNC(StopSyntax)(state, first - 1); - } - return NULL; - } - - state->uri->hostText.afterLast = first; /* HOST END */ - - /* Copy missing quads right before IPv4 */ - memcpy(state->uri->hostData.ip6->data + 16 - 4 - 2 * quadsAfterZipperCount, - quadsAfterZipper, 2 * quadsAfterZipperCount); - - /* Copy last IPv4 octet */ - state->uri->hostData.ip6->data[16 - 4 + 3] = uriGetOctetValue(digitHistory, digitCount); - - return first + 1; - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - first++; - } - } else { - /* Eat while no dot in sight */ - int letterAmong = 0; - int walking = 1; - do { - switch (*first) { - case URI_SET_HEX_LETTER_LOWER: - letterAmong = 1; - if (digitCount == 4) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - digitHistory[digitCount] = (unsigned char)(15 + *first - _UT('f')); - digitCount++; - break; - - case URI_SET_HEX_LETTER_UPPER: - letterAmong = 1; - if (digitCount == 4) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - digitHistory[digitCount] = (unsigned char)(15 + *first - _UT('F')); - digitCount++; - break; - - case URI_SET_DIGIT: - if (digitCount == 4) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - digitHistory[digitCount] = (unsigned char)(9 + *first - _UT('9')); - digitCount++; - break; - - case _UT(':'): - { - int setZipper = 0; - - /* Too many quads? */ - if (quadsDone > 8 - zipperEver) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - /* "::"? */ - if (first + 1 >= afterLast) { - URI_FUNC(StopSyntax)(state, first + 1); - return NULL; - } - if (first[1] == _UT(':')) { - const int resetOffset = 2 * (quadsDone + (digitCount > 0)); - - first++; - if (zipperEver) { - URI_FUNC(StopSyntax)(state, first); - return NULL; /* "::.+::" */ - } - - /* Zero everything after zipper */ - memset(state->uri->hostData.ip6->data + resetOffset, 0, 16 - resetOffset); - setZipper = 1; - - /* ":::+"? */ - if (first + 1 >= afterLast) { - URI_FUNC(StopSyntax)(state, first + 1); - return NULL; /* No ']' yet */ - } - if (first[1] == _UT(':')) { - URI_FUNC(StopSyntax)(state, first + 1); - return NULL; /* ":::+ "*/ - } - } - if (digitCount > 0) { - if (zipperEver) { - uriWriteQuadToDoubleByte(digitHistory, digitCount, quadsAfterZipper + 2 * quadsAfterZipperCount); - quadsAfterZipperCount++; - } else { - uriWriteQuadToDoubleByte(digitHistory, digitCount, state->uri->hostData.ip6->data + 2 * quadsDone); - } - quadsDone++; - digitCount = 0; - } - letterAmong = 0; - - if (setZipper) { - zipperEver = 1; - } - } - break; - - case _UT('.'): - if ((quadsDone > 6) /* NOTE */ - || (!zipperEver && (quadsDone < 6)) - || letterAmong - || (digitCount == 0) - || (digitCount == 4)) { - /* Invalid octet before */ - URI_FUNC(StopSyntax)(state, first); - return NULL; - } else if ((digitCount > 1) - && (digitHistory[0] == 0)) { - /* Leading zero */ - URI_FUNC(StopSyntax)(state, first - digitCount); - return NULL; - } else if ((digitCount > 2) - && (digitHistory[1] == 0)) { - /* Leading zero */ - URI_FUNC(StopSyntax)(state, first - digitCount + 1); - return NULL; - } else if ((digitCount == 3) - && (100 * digitHistory[0] - + 10 * digitHistory[1] - + digitHistory[2] > 255)) { - /* Octet value too large */ - if (digitHistory[0] > 2) { - URI_FUNC(StopSyntax)(state, first - 3); - } else if (digitHistory[1] > 5) { - URI_FUNC(StopSyntax)(state, first - 2); - } else { - URI_FUNC(StopSyntax)(state, first - 1); - } - return NULL; - } - - /* Copy first IPv4 octet */ - state->uri->hostData.ip6->data[16 - 4] = uriGetOctetValue(digitHistory, digitCount); - digitCount = 0; - - /* Switch over to IPv4 loop */ - ip4OctetsDone = 1; - walking = 0; - break; - - case _UT(']'): - /* Too little quads? */ - if (!zipperEver && !((quadsDone == 7) && (digitCount > 0))) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - if (digitCount > 0) { - if (zipperEver) { - uriWriteQuadToDoubleByte(digitHistory, digitCount, quadsAfterZipper + 2 * quadsAfterZipperCount); - quadsAfterZipperCount++; - } else { - uriWriteQuadToDoubleByte(digitHistory, digitCount, state->uri->hostData.ip6->data + 2 * quadsDone); - } - /* - quadsDone++; - digitCount = 0; - */ - } - - /* Copy missing quads to the end */ - memcpy(state->uri->hostData.ip6->data + 16 - 2 * quadsAfterZipperCount, - quadsAfterZipper, 2 * quadsAfterZipperCount); - - state->uri->hostText.afterLast = first; /* HOST END */ - return first + 1; /* Fine */ - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - first++; - - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; /* No ']' yet */ - } - } while (walking); - } - } -} - - - -/* - * [mustBeSegmentNzNc]->[pctEncoded][mustBeSegmentNzNc] - * [mustBeSegmentNzNc]->[subDelims][mustBeSegmentNzNc] - * [mustBeSegmentNzNc]->[unreserved][mustBeSegmentNzNc] - * [mustBeSegmentNzNc]->[uriTail] // can take - * [mustBeSegmentNzNc]->[segment][zeroMoreSlashSegs][uriTail] - * [mustBeSegmentNzNc]-><@>[mustBeSegmentNzNc] - */ -static const URI_CHAR * URI_FUNC(ParseMustBeSegmentNzNc)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - if (!URI_FUNC(PushPathSegment)(state, state->uri->scheme.first, first)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - state->uri->scheme.first = NULL; /* Not a scheme, reset */ - return afterLast; - } - - switch (*first) { - case _UT('%'): - { - const URI_CHAR * const afterPctEncoded - = URI_FUNC(ParsePctEncoded)(state, first, afterLast); - if (afterPctEncoded == NULL) { - return NULL; - } - return URI_FUNC(ParseMustBeSegmentNzNc)(state, afterPctEncoded, afterLast); - } - - case _UT('@'): - case _UT('!'): - case _UT('$'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('*'): - case _UT(','): - case _UT(';'): - case _UT('\''): - case _UT('+'): - case _UT('='): - case _UT('-'): - case _UT('.'): - case _UT('_'): - case _UT('~'): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - return URI_FUNC(ParseMustBeSegmentNzNc)(state, first + 1, afterLast); - - case _UT('/'): - { - const URI_CHAR * afterZeroMoreSlashSegs; - const URI_CHAR * afterSegment; - if (!URI_FUNC(PushPathSegment)(state, state->uri->scheme.first, first)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - state->uri->scheme.first = NULL; /* Not a scheme, reset */ - afterSegment = URI_FUNC(ParseSegment)(state, first + 1, afterLast); - if (afterSegment == NULL) { - return NULL; - } - if (!URI_FUNC(PushPathSegment)(state, first + 1, afterSegment)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - afterZeroMoreSlashSegs - = URI_FUNC(ParseZeroMoreSlashSegs)(state, afterSegment, afterLast); - if (afterZeroMoreSlashSegs == NULL) { - return NULL; - } - return URI_FUNC(ParseUriTail)(state, afterZeroMoreSlashSegs, afterLast); - } - - default: - if (!URI_FUNC(PushPathSegment)(state, state->uri->scheme.first, first)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - state->uri->scheme.first = NULL; /* Not a scheme, reset */ - return URI_FUNC(ParseUriTail)(state, first, afterLast); - } -} - - - -/* - * [ownHost]-><[>[ipLit2][authorityTwo] - * [ownHost]->[ownHost2] // can take - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseOwnHost)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('['): - { - const URI_CHAR * const afterIpLit2 - = URI_FUNC(ParseIpLit2)(state, first + 1, afterLast); - if (afterIpLit2 == NULL) { - return NULL; - } - state->uri->hostText.first = first + 1; /* HOST BEGIN */ - return URI_FUNC(ParseAuthorityTwo)(state, afterIpLit2, afterLast); - } - - default: - return URI_FUNC(ParseOwnHost2)(state, first, afterLast); - } -} - - - -static URI_INLINE UriBool URI_FUNC(OnExitOwnHost2)(URI_TYPE(ParserState) * state, const URI_CHAR * first) { - state->uri->hostText.afterLast = first; /* HOST END */ - - /* Valid IPv4 or just a regname? */ - state->uri->hostData.ip4 = ( UriIp4* )malloc(1 * sizeof(UriIp4)); /* Freed when stopping on parse error */ - if (state->uri->hostData.ip4 == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - if (URI_FUNC(ParseIpFourAddress)(state->uri->hostData.ip4->data, - state->uri->hostText.first, state->uri->hostText.afterLast)) { - /* Not IPv4 */ - free(state->uri->hostData.ip4); - state->uri->hostData.ip4 = NULL; - } - return URI_TRUE; /* Success */ -} - - - -/* - * [ownHost2]->[authorityTwo] // can take - * [ownHost2]->[pctSubUnres][ownHost2] - */ -static const URI_CHAR * URI_FUNC(ParseOwnHost2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - if (!URI_FUNC(OnExitOwnHost2)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return afterLast; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(';'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - { - const URI_CHAR * const afterPctSubUnres - = URI_FUNC(ParsePctSubUnres)(state, first, afterLast); - if (afterPctSubUnres == NULL) { - return NULL; - } - return URI_FUNC(ParseOwnHost2)(state, afterPctSubUnres, afterLast); - } - - default: - if (!URI_FUNC(OnExitOwnHost2)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return URI_FUNC(ParseAuthorityTwo)(state, first, afterLast); - } -} - - - -static URI_INLINE UriBool URI_FUNC(OnExitOwnHostUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first) { - state->uri->hostText.first = state->uri->userInfo.first; /* Host instead of userInfo, update */ - state->uri->userInfo.first = NULL; /* Not a userInfo, reset */ - state->uri->hostText.afterLast = first; /* HOST END */ - - /* Valid IPv4 or just a regname? */ - state->uri->hostData.ip4 = ( UriIp4* )malloc(1 * sizeof(UriIp4)); /* Freed when stopping on parse error */ - if (state->uri->hostData.ip4 == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - if (URI_FUNC(ParseIpFourAddress)(state->uri->hostData.ip4->data, - state->uri->hostText.first, state->uri->hostText.afterLast)) { - /* Not IPv4 */ - free(state->uri->hostData.ip4); - state->uri->hostData.ip4 = NULL; - } - return URI_TRUE; /* Success */ -} - - - -/* - * [ownHostUserInfo]->[ownHostUserInfoNz] - * [ownHostUserInfo]-> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseOwnHostUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - if (!URI_FUNC(OnExitOwnHostUserInfo)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return afterLast; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('@'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - return URI_FUNC(ParseOwnHostUserInfoNz)(state, first, afterLast); - - default: - if (!URI_FUNC(OnExitOwnHostUserInfo)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return first; - } -} - - - -/* - * [ownHostUserInfoNz]->[pctSubUnres][ownHostUserInfo] - * [ownHostUserInfoNz]-><:>[ownPortUserInfo] - * [ownHostUserInfoNz]-><@>[ownHost] - */ -static const URI_CHAR * URI_FUNC(ParseOwnHostUserInfoNz)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(';'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - { - const URI_CHAR * const afterPctSubUnres - = URI_FUNC(ParsePctSubUnres)(state, first, afterLast); - if (afterPctSubUnres == NULL) { - return NULL; - } - return URI_FUNC(ParseOwnHostUserInfo)(state, afterPctSubUnres, afterLast); - } - - case _UT(':'): - state->uri->hostText.afterLast = first; /* HOST END */ - state->uri->portText.first = first + 1; /* PORT BEGIN */ - return URI_FUNC(ParseOwnPortUserInfo)(state, first + 1, afterLast); - - case _UT('@'): - state->uri->userInfo.afterLast = first; /* USERINFO END */ - state->uri->hostText.first = first + 1; /* HOST BEGIN */ - return URI_FUNC(ParseOwnHost)(state, first + 1, afterLast); - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } -} - - - -static URI_INLINE UriBool URI_FUNC(OnExitOwnPortUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first) { - state->uri->hostText.first = state->uri->userInfo.first; /* Host instead of userInfo, update */ - state->uri->userInfo.first = NULL; /* Not a userInfo, reset */ - state->uri->portText.afterLast = first; /* PORT END */ - - /* Valid IPv4 or just a regname? */ - state->uri->hostData.ip4 = ( UriIp4* )malloc(1 * sizeof(UriIp4)); /* Freed when stopping on parse error */ - if (state->uri->hostData.ip4 == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - if (URI_FUNC(ParseIpFourAddress)(state->uri->hostData.ip4->data, - state->uri->hostText.first, state->uri->hostText.afterLast)) { - /* Not IPv4 */ - free(state->uri->hostData.ip4); - state->uri->hostData.ip4 = NULL; - } - return URI_TRUE; /* Success */ -} - - - -/* - * [ownPortUserInfo]->[ALPHA][ownUserInfo] - * [ownPortUserInfo]->[DIGIT][ownPortUserInfo] - * [ownPortUserInfo]-><.>[ownUserInfo] - * [ownPortUserInfo]-><_>[ownUserInfo] - * [ownPortUserInfo]-><~>[ownUserInfo] - * [ownPortUserInfo]-><->[ownUserInfo] - * [ownPortUserInfo]-><@>[ownHost] - * [ownPortUserInfo]-> - */ -static const URI_CHAR * URI_FUNC(ParseOwnPortUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - if (!URI_FUNC(OnExitOwnPortUserInfo)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return afterLast; - } - - switch (*first) { - case _UT('.'): - case _UT('_'): - case _UT('~'): - case _UT('-'): - case URI_SET_ALPHA: - state->uri->hostText.afterLast = NULL; /* Not a host, reset */ - state->uri->portText.first = NULL; /* Not a port, reset */ - return URI_FUNC(ParseOwnUserInfo)(state, first + 1, afterLast); - - case URI_SET_DIGIT: - return URI_FUNC(ParseOwnPortUserInfo)(state, first + 1, afterLast); - - case _UT('@'): - state->uri->hostText.afterLast = NULL; /* Not a host, reset */ - state->uri->portText.first = NULL; /* Not a port, reset */ - state->uri->userInfo.afterLast = first; /* USERINFO END */ - state->uri->hostText.first = first + 1; /* HOST BEGIN */ - return URI_FUNC(ParseOwnHost)(state, first + 1, afterLast); - - default: - if (!URI_FUNC(OnExitOwnPortUserInfo)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return first; - } -} - - - -/* - * [ownUserInfo]->[pctSubUnres][ownUserInfo] - * [ownUserInfo]-><:>[ownUserInfo] - * [ownUserInfo]-><@>[ownHost] - */ -static const URI_CHAR * URI_FUNC(ParseOwnUserInfo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(';'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - { - const URI_CHAR * const afterPctSubUnres - = URI_FUNC(ParsePctSubUnres)(state, first, afterLast); - if (afterPctSubUnres == NULL) { - return NULL; - } - return URI_FUNC(ParseOwnUserInfo)(state, afterPctSubUnres, afterLast); - } - - case _UT(':'): - return URI_FUNC(ParseOwnUserInfo)(state, first + 1, afterLast); - - case _UT('@'): - /* SURE */ - state->uri->userInfo.afterLast = first; /* USERINFO END */ - state->uri->hostText.first = first + 1; /* HOST BEGIN */ - return URI_FUNC(ParseOwnHost)(state, first + 1, afterLast); - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } -} - - - -static URI_INLINE void URI_FUNC(OnExitPartHelperTwo)(URI_TYPE(ParserState) * state) { - state->uri->absolutePath = URI_TRUE; -} - - - -/* - * [partHelperTwo]->[pathAbsNoLeadSlash] // can take - * [partHelperTwo]->[authority][pathAbsEmpty] - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParsePartHelperTwo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(OnExitPartHelperTwo)(state); - return afterLast; - } - - switch (*first) { - case _UT('/'): - { - const URI_CHAR * const afterAuthority - = URI_FUNC(ParseAuthority)(state, first + 1, afterLast); - const URI_CHAR * afterPathAbsEmpty; - if (afterAuthority == NULL) { - return NULL; - } - afterPathAbsEmpty = URI_FUNC(ParsePathAbsEmpty)(state, afterAuthority, afterLast); - - URI_FUNC(FixEmptyTrailSegment)(state->uri); - - return afterPathAbsEmpty; - } - - default: - URI_FUNC(OnExitPartHelperTwo)(state); - return URI_FUNC(ParsePathAbsNoLeadSlash)(state, first, afterLast); - } -} - - - -/* - * [pathAbsEmpty]->[segment][pathAbsEmpty] - * [pathAbsEmpty]-> - */ -static const URI_CHAR * URI_FUNC(ParsePathAbsEmpty)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('/'): - { - const URI_CHAR * const afterSegment - = URI_FUNC(ParseSegment)(state, first + 1, afterLast); - if (afterSegment == NULL) { - return NULL; - } - if (!URI_FUNC(PushPathSegment)(state, first + 1, afterSegment)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - return URI_FUNC(ParsePathAbsEmpty)(state, afterSegment, afterLast); - } - - default: - return first; - } -} - - - -/* - * [pathAbsNoLeadSlash]->[segmentNz][zeroMoreSlashSegs] - * [pathAbsNoLeadSlash]-> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParsePathAbsNoLeadSlash)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('@'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - { - const URI_CHAR * const afterSegmentNz - = URI_FUNC(ParseSegmentNz)(state, first, afterLast); - if (afterSegmentNz == NULL) { - return NULL; - } - if (!URI_FUNC(PushPathSegment)(state, first, afterSegmentNz)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - return URI_FUNC(ParseZeroMoreSlashSegs)(state, afterSegmentNz, afterLast); - } - - default: - return first; - } -} - - - -/* - * [pathRootless]->[segmentNz][zeroMoreSlashSegs] - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParsePathRootless)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - const URI_CHAR * const afterSegmentNz - = URI_FUNC(ParseSegmentNz)(state, first, afterLast); - if (afterSegmentNz == NULL) { - return NULL; - } else { - if (!URI_FUNC(PushPathSegment)(state, first, afterSegmentNz)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - } - return URI_FUNC(ParseZeroMoreSlashSegs)(state, afterSegmentNz, afterLast); -} - - - -/* - * [pchar]->[pctEncoded] - * [pchar]->[subDelims] - * [pchar]->[unreserved] - * [pchar]-><:> - * [pchar]-><@> - */ -static const URI_CHAR * URI_FUNC(ParsePchar)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - switch (*first) { - case _UT('%'): - return URI_FUNC(ParsePctEncoded)(state, first, afterLast); - - case _UT(':'): - case _UT('@'): - case _UT('!'): - case _UT('$'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('*'): - case _UT(','): - case _UT(';'): - case _UT('\''): - case _UT('+'): - case _UT('='): - case _UT('-'): - case _UT('.'): - case _UT('_'): - case _UT('~'): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - return first + 1; - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } -} - - - -/* - * [pctEncoded]-><%>[HEXDIG][HEXDIG] - */ -static const URI_CHAR * URI_FUNC(ParsePctEncoded)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - /* - First character has already been - checked before entering this rule. - - switch (*first) { - case _UT('%'): - */ - if (first + 1 >= afterLast) { - URI_FUNC(StopSyntax)(state, first + 1); - return NULL; - } - - switch (first[1]) { - case URI_SET_HEXDIG: - if (first + 2 >= afterLast) { - URI_FUNC(StopSyntax)(state, first + 2); - return NULL; - } - - switch (first[2]) { - case URI_SET_HEXDIG: - return first + 3; - - default: - URI_FUNC(StopSyntax)(state, first + 2); - return NULL; - } - - default: - URI_FUNC(StopSyntax)(state, first + 1); - return NULL; - } - - /* - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - */ -} - - - -/* - * [pctSubUnres]->[pctEncoded] - * [pctSubUnres]->[subDelims] - * [pctSubUnres]->[unreserved] - */ -static const URI_CHAR * URI_FUNC(ParsePctSubUnres)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - URI_FUNC(StopSyntax)(state, first); - return NULL; - } - - switch (*first) { - case _UT('%'): - return URI_FUNC(ParsePctEncoded)(state, first, afterLast); - - case _UT('!'): - case _UT('$'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('*'): - case _UT(','): - case _UT(';'): - case _UT('\''): - case _UT('+'): - case _UT('='): - case _UT('-'): - case _UT('.'): - case _UT('_'): - case _UT('~'): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - return first + 1; - - default: - URI_FUNC(StopSyntax)(state, first); - return NULL; - } -} - - - -/* - * [port]->[DIGIT][port] - * [port]-> - */ -static const URI_CHAR * URI_FUNC(ParsePort)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case URI_SET_DIGIT: - return URI_FUNC(ParsePort)(state, first + 1, afterLast); - - default: - return first; - } -} - - - -/* - * [queryFrag]->[pchar][queryFrag] - * [queryFrag]->[queryFrag] - * [queryFrag]->[queryFrag] - * [queryFrag]-> - */ -static const URI_CHAR * URI_FUNC(ParseQueryFrag)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('@'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - { - const URI_CHAR * const afterPchar - = URI_FUNC(ParsePchar)(state, first, afterLast); - if (afterPchar == NULL) { - return NULL; - } - return URI_FUNC(ParseQueryFrag)(state, afterPchar, afterLast); - } - - case _UT('/'): - case _UT('?'): - return URI_FUNC(ParseQueryFrag)(state, first + 1, afterLast); - - default: - return first; - } -} - - - -/* - * [segment]->[pchar][segment] - * [segment]-> - */ -static const URI_CHAR * URI_FUNC(ParseSegment)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('!'): - case _UT('$'): - case _UT('%'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('-'): - case _UT('*'): - case _UT(','): - case _UT('.'): - case _UT(':'): - case _UT(';'): - case _UT('@'): - case _UT('\''): - case _UT('_'): - case _UT('~'): - case _UT('+'): - case _UT('='): - case URI_SET_DIGIT: - case URI_SET_ALPHA: - { - const URI_CHAR * const afterPchar - = URI_FUNC(ParsePchar)(state, first, afterLast); - if (afterPchar == NULL) { - return NULL; - } - return URI_FUNC(ParseSegment)(state, afterPchar, afterLast); - } - - default: - return first; - } -} - - - -/* - * [segmentNz]->[pchar][segment] - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseSegmentNz)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - const URI_CHAR * const afterPchar - = URI_FUNC(ParsePchar)(state, first, afterLast); - if (afterPchar == NULL) { - return NULL; - } - return URI_FUNC(ParseSegment)(state, afterPchar, afterLast); -} - - - -static URI_INLINE UriBool URI_FUNC(OnExitSegmentNzNcOrScheme2)(URI_TYPE(ParserState) * state, const URI_CHAR * first) { - if (!URI_FUNC(PushPathSegment)(state, state->uri->scheme.first, first)) { /* SEGMENT BOTH */ - return URI_FALSE; /* Raises malloc error*/ - } - state->uri->scheme.first = NULL; /* Not a scheme, reset */ - return URI_TRUE; /* Success */ -} - - - -/* - * [segmentNzNcOrScheme2]->[ALPHA][segmentNzNcOrScheme2] - * [segmentNzNcOrScheme2]->[DIGIT][segmentNzNcOrScheme2] - * [segmentNzNcOrScheme2]->[pctEncoded][mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]->[uriTail] // can take - * [segmentNzNcOrScheme2]->[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><$>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><&>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><(>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><)>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><*>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><,>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><.>[segmentNzNcOrScheme2] - * [segmentNzNcOrScheme2]->[segment][zeroMoreSlashSegs][uriTail] - * [segmentNzNcOrScheme2]-><:>[hierPart][uriTail] - * [segmentNzNcOrScheme2]-><;>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><@>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><_>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><~>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><+>[segmentNzNcOrScheme2] - * [segmentNzNcOrScheme2]-><=>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><'>[mustBeSegmentNzNc] - * [segmentNzNcOrScheme2]-><->[segmentNzNcOrScheme2] - */ -static const URI_CHAR * URI_FUNC(ParseSegmentNzNcOrScheme2)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - if (!URI_FUNC(OnExitSegmentNzNcOrScheme2)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return afterLast; - } - - switch (*first) { - case _UT('.'): - case _UT('+'): - case _UT('-'): - case URI_SET_ALPHA: - case URI_SET_DIGIT: - return URI_FUNC(ParseSegmentNzNcOrScheme2)(state, first + 1, afterLast); - - case _UT('%'): - { - const URI_CHAR * const afterPctEncoded - = URI_FUNC(ParsePctEncoded)(state, first, afterLast); - if (afterPctEncoded == NULL) { - return NULL; - } - return URI_FUNC(ParseMustBeSegmentNzNc)(state, afterPctEncoded, afterLast); - } - - case _UT('!'): - case _UT('$'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('*'): - case _UT(','): - case _UT(';'): - case _UT('@'): - case _UT('_'): - case _UT('~'): - case _UT('='): - case _UT('\''): - return URI_FUNC(ParseMustBeSegmentNzNc)(state, first + 1, afterLast); - - case _UT('/'): - { - const URI_CHAR * afterZeroMoreSlashSegs; - const URI_CHAR * const afterSegment - = URI_FUNC(ParseSegment)(state, first + 1, afterLast); - if (afterSegment == NULL) { - return NULL; - } - if (!URI_FUNC(PushPathSegment)(state, state->uri->scheme.first, first)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - state->uri->scheme.first = NULL; /* Not a scheme, reset */ - if (!URI_FUNC(PushPathSegment)(state, first + 1, afterSegment)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - afterZeroMoreSlashSegs - = URI_FUNC(ParseZeroMoreSlashSegs)(state, afterSegment, afterLast); - if (afterZeroMoreSlashSegs == NULL) { - return NULL; - } - return URI_FUNC(ParseUriTail)(state, afterZeroMoreSlashSegs, afterLast); - } - - case _UT(':'): - { - const URI_CHAR * const afterHierPart - = URI_FUNC(ParseHierPart)(state, first + 1, afterLast); - state->uri->scheme.afterLast = first; /* SCHEME END */ - if (afterHierPart == NULL) { - return NULL; - } - return URI_FUNC(ParseUriTail)(state, afterHierPart, afterLast); - } - - default: - if (!URI_FUNC(OnExitSegmentNzNcOrScheme2)(state, first)) { - URI_FUNC(StopMalloc)(state); - return NULL; - } - return URI_FUNC(ParseUriTail)(state, first, afterLast); - } -} - - - -/* - * [uriReference]->[ALPHA][segmentNzNcOrScheme2] - * [uriReference]->[DIGIT][mustBeSegmentNzNc] - * [uriReference]->[pctEncoded][mustBeSegmentNzNc] - * [uriReference]->[subDelims][mustBeSegmentNzNc] - * [uriReference]->[uriTail] // can take - * [uriReference]-><.>[mustBeSegmentNzNc] - * [uriReference]->[partHelperTwo][uriTail] - * [uriReference]-><@>[mustBeSegmentNzNc] - * [uriReference]-><_>[mustBeSegmentNzNc] - * [uriReference]-><~>[mustBeSegmentNzNc] - * [uriReference]-><->[mustBeSegmentNzNc] - */ -static const URI_CHAR * URI_FUNC(ParseUriReference)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case URI_SET_ALPHA: - state->uri->scheme.first = first; /* SCHEME BEGIN */ - return URI_FUNC(ParseSegmentNzNcOrScheme2)(state, first + 1, afterLast); - - case URI_SET_DIGIT: - case _UT('!'): - case _UT('$'): - case _UT('&'): - case _UT('('): - case _UT(')'): - case _UT('*'): - case _UT(','): - case _UT(';'): - case _UT('\''): - case _UT('+'): - case _UT('='): - case _UT('.'): - case _UT('_'): - case _UT('~'): - case _UT('-'): - case _UT('@'): - state->uri->scheme.first = first; /* SEGMENT BEGIN, ABUSE SCHEME POINTER */ - return URI_FUNC(ParseMustBeSegmentNzNc)(state, first + 1, afterLast); - - case _UT('%'): - { - const URI_CHAR * const afterPctEncoded - = URI_FUNC(ParsePctEncoded)(state, first, afterLast); - if (afterPctEncoded == NULL) { - return NULL; - } - state->uri->scheme.first = first; /* SEGMENT BEGIN, ABUSE SCHEME POINTER */ - return URI_FUNC(ParseMustBeSegmentNzNc)(state, afterPctEncoded, afterLast); - } - - case _UT('/'): - { - const URI_CHAR * const afterPartHelperTwo - = URI_FUNC(ParsePartHelperTwo)(state, first + 1, afterLast); - if (afterPartHelperTwo == NULL) { - return NULL; - } - return URI_FUNC(ParseUriTail)(state, afterPartHelperTwo, afterLast); - } - - default: - return URI_FUNC(ParseUriTail)(state, first, afterLast); - } -} - - - -/* - * [uriTail]-><#>[queryFrag] - * [uriTail]->[queryFrag][uriTailTwo] - * [uriTail]-> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseUriTail)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('#'): - { - const URI_CHAR * const afterQueryFrag = URI_FUNC(ParseQueryFrag)(state, first + 1, afterLast); - if (afterQueryFrag == NULL) { - return NULL; - } - state->uri->fragment.first = first + 1; /* FRAGMENT BEGIN */ - state->uri->fragment.afterLast = afterQueryFrag; /* FRAGMENT END */ - return afterQueryFrag; - } - - case _UT('?'): - { - const URI_CHAR * const afterQueryFrag - = URI_FUNC(ParseQueryFrag)(state, first + 1, afterLast); - if (afterQueryFrag == NULL) { - return NULL; - } - state->uri->query.first = first + 1; /* QUERY BEGIN */ - state->uri->query.afterLast = afterQueryFrag; /* QUERY END */ - return URI_FUNC(ParseUriTailTwo)(state, afterQueryFrag, afterLast); - } - - default: - return first; - } -} - - - -/* - * [uriTailTwo]-><#>[queryFrag] - * [uriTailTwo]-> - */ -static URI_INLINE const URI_CHAR * URI_FUNC(ParseUriTailTwo)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('#'): - { - const URI_CHAR * const afterQueryFrag = URI_FUNC(ParseQueryFrag)(state, first + 1, afterLast); - if (afterQueryFrag == NULL) { - return NULL; - } - state->uri->fragment.first = first + 1; /* FRAGMENT BEGIN */ - state->uri->fragment.afterLast = afterQueryFrag; /* FRAGMENT END */ - return afterQueryFrag; - } - - default: - return first; - } -} - - - -/* - * [zeroMoreSlashSegs]->[segment][zeroMoreSlashSegs] - * [zeroMoreSlashSegs]-> - */ -static const URI_CHAR * URI_FUNC(ParseZeroMoreSlashSegs)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - if (first >= afterLast) { - return afterLast; - } - - switch (*first) { - case _UT('/'): - { - const URI_CHAR * const afterSegment - = URI_FUNC(ParseSegment)(state, first + 1, afterLast); - if (afterSegment == NULL) { - return NULL; - } - if (!URI_FUNC(PushPathSegment)(state, first + 1, afterSegment)) { /* SEGMENT BOTH */ - URI_FUNC(StopMalloc)(state); - return NULL; - } - return URI_FUNC(ParseZeroMoreSlashSegs)(state, afterSegment, afterLast); - } - - default: - return first; - } -} - - - -static URI_INLINE void URI_FUNC(ResetParserState)(URI_TYPE(ParserState) * state) { - URI_TYPE(Uri) * const uriBackup = state->uri; - memset(state, 0, sizeof(URI_TYPE(ParserState))); - state->uri = uriBackup; -} - - - -static URI_INLINE UriBool URI_FUNC(PushPathSegment)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - URI_TYPE(PathSegment) * segment = ( URI_TYPE(PathSegment) * )malloc(1 * sizeof(URI_TYPE(PathSegment))); - if (segment == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - memset(segment, 0, sizeof(URI_TYPE(PathSegment))); - if (first == afterLast) { - segment->text.first = URI_FUNC(SafeToPointTo); - segment->text.afterLast = URI_FUNC(SafeToPointTo); - } else { - segment->text.first = first; - segment->text.afterLast = afterLast; - } - - /* First segment ever? */ - if (state->uri->pathHead == NULL) { - /* First segement ever, set head and tail */ - state->uri->pathHead = segment; - state->uri->pathTail = segment; - } else { - /* Append, update tail */ - state->uri->pathTail->next = segment; - state->uri->pathTail = segment; - } - - return URI_TRUE; /* Success */ -} - - - -int URI_FUNC(ParseUriEx)(URI_TYPE(ParserState) * state, const URI_CHAR * first, const URI_CHAR * afterLast) { - const URI_CHAR * afterUriReference; - URI_TYPE(Uri) * uri; - - /* Check params */ - if ((state == NULL) || (first == NULL) || (afterLast == NULL)) { - return URI_ERROR_NULL; - } - uri = state->uri; - - /* Init parser */ - URI_FUNC(ResetParserState)(state); - URI_FUNC(ResetUri)(uri); - - /* Parse */ - afterUriReference = URI_FUNC(ParseUriReference)(state, first, afterLast); - if (afterUriReference == NULL) { - return state->errorCode; - } - if (afterUriReference != afterLast) { - return URI_ERROR_SYNTAX; - } - return URI_SUCCESS; -} - - - -int URI_FUNC(ParseUri)(URI_TYPE(ParserState) * state, const URI_CHAR * text) { - if ((state == NULL) || (text == NULL)) { - return URI_ERROR_NULL; - } - return URI_FUNC(ParseUriEx)(state, text, text + URI_STRLEN(text)); -} - - - -void URI_FUNC(FreeUriMembers)(URI_TYPE(Uri) * uri) { - if (uri == NULL) { - return; - } - - if (uri->owner) { - /* Scheme */ - if (uri->scheme.first != NULL) { - if (uri->scheme.first != uri->scheme.afterLast) { - free((URI_CHAR *)uri->scheme.first); - } - uri->scheme.first = NULL; - uri->scheme.afterLast = NULL; - } - - /* User info */ - if (uri->userInfo.first != NULL) { - if (uri->userInfo.first != uri->userInfo.afterLast) { - free((URI_CHAR *)uri->userInfo.first); - } - uri->userInfo.first = NULL; - uri->userInfo.afterLast = NULL; - } - - /* Host data - IPvFuture */ - if (uri->hostData.ipFuture.first != NULL) { - if (uri->hostData.ipFuture.first != uri->hostData.ipFuture.afterLast) { - free((URI_CHAR *)uri->hostData.ipFuture.first); - } - uri->hostData.ipFuture.first = NULL; - uri->hostData.ipFuture.afterLast = NULL; - uri->hostText.first = NULL; - uri->hostText.afterLast = NULL; - } - - /* Host text (if regname, after IPvFuture!) */ - if ((uri->hostText.first != NULL) - && (uri->hostData.ip4 == NULL) - && (uri->hostData.ip6 == NULL)) { - /* Real regname */ - if (uri->hostText.first != uri->hostText.afterLast) { - free((URI_CHAR *)uri->hostText.first); - } - uri->hostText.first = NULL; - uri->hostText.afterLast = NULL; - } - } - - /* Host data - IPv4 */ - if (uri->hostData.ip4 != NULL) { - free(uri->hostData.ip4); - uri->hostData.ip4 = NULL; - } - - /* Host data - IPv6 */ - if (uri->hostData.ip6 != NULL) { - free(uri->hostData.ip6); - uri->hostData.ip6 = NULL; - } - - /* Port text */ - if (uri->owner && (uri->portText.first != NULL)) { - if (uri->portText.first != uri->portText.afterLast) { - free((URI_CHAR *)uri->portText.first); - } - uri->portText.first = NULL; - uri->portText.afterLast = NULL; - } - - /* Path */ - if (uri->pathHead != NULL) { - URI_TYPE(PathSegment) * segWalk = uri->pathHead; - while (segWalk != NULL) { - URI_TYPE(PathSegment) * const next = segWalk->next; - if (uri->owner && (segWalk->text.first != NULL) - && (segWalk->text.first < segWalk->text.afterLast)) { - free((URI_CHAR *)segWalk->text.first); - } - free(segWalk); - segWalk = next; - } - uri->pathHead = NULL; - uri->pathTail = NULL; - } - - if (uri->owner) { - /* Query */ - if (uri->query.first != NULL) { - if (uri->query.first != uri->query.afterLast) { - free((URI_CHAR *)uri->query.first); - } - uri->query.first = NULL; - uri->query.afterLast = NULL; - } - - /* Fragment */ - if (uri->fragment.first != NULL) { - if (uri->fragment.first != uri->fragment.afterLast) { - free((URI_CHAR *)uri->fragment.first); - } - uri->fragment.first = NULL; - uri->fragment.afterLast = NULL; - } - } -} - - - -UriBool URI_FUNC(_TESTING_ONLY_ParseIpSix)(const URI_CHAR * text) { - URI_TYPE(Uri) uri; - URI_TYPE(ParserState) parser; - const URI_CHAR * const afterIpSix = text + URI_STRLEN(text); - const URI_CHAR * res; - - URI_FUNC(ResetParserState)(&parser); - URI_FUNC(ResetUri)(&uri); - parser.uri = &uri; - parser.uri->hostData.ip6 = ( UriIp6* )malloc(1 * sizeof(UriIp6)); - res = URI_FUNC(ParseIPv6address2)(&parser, text, afterIpSix); - URI_FUNC(FreeUriMembers)(&uri); - return res == afterIpSix ? URI_TRUE : URI_FALSE; -} - - - -UriBool URI_FUNC(_TESTING_ONLY_ParseIpFour)(const URI_CHAR * text) { - unsigned char octets[4]; - int res = URI_FUNC(ParseIpFourAddress)(octets, text, text + URI_STRLEN(text)); - return (res == URI_SUCCESS) ? URI_TRUE : URI_FALSE; -} - - - -#undef URI_SET_DIGIT -#undef URI_SET_HEX_LETTER_UPPER -#undef URI_SET_HEX_LETTER_LOWER -#undef URI_SET_HEXDIG -#undef URI_SET_ALPHA - - -/* Source: UriQuery.c */ -static int URI_FUNC(ComposeQueryEngine)(URI_CHAR * dest, - const URI_TYPE(QueryList) * queryList, - int maxChars, int * charsWritten, int * charsRequired, - UriBool spaceToPlus, UriBool normalizeBreaks); - -static UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) ** prevNext, - int * itemCount, const URI_CHAR * keyFirst, const URI_CHAR * keyAfter, - const URI_CHAR * valueFirst, const URI_CHAR * valueAfter, - UriBool plusToSpace, UriBreakConversion breakConversion); - - - -int URI_FUNC(ComposeQueryCharsRequired)(const URI_TYPE(QueryList) * queryList, - int * charsRequired) { - const UriBool spaceToPlus = URI_TRUE; - const UriBool normalizeBreaks = URI_TRUE; - - return URI_FUNC(ComposeQueryCharsRequiredEx)(queryList, charsRequired, - spaceToPlus, normalizeBreaks); -} - - - -int URI_FUNC(ComposeQueryCharsRequiredEx)(const URI_TYPE(QueryList) * queryList, - int * charsRequired, UriBool spaceToPlus, UriBool normalizeBreaks) { - if ((queryList == NULL) || (charsRequired == NULL)) { - return URI_ERROR_NULL; - } - - return URI_FUNC(ComposeQueryEngine)(NULL, queryList, 0, NULL, - charsRequired, spaceToPlus, normalizeBreaks); -} - - - -int URI_FUNC(ComposeQuery)(URI_CHAR * dest, - const URI_TYPE(QueryList) * queryList, int maxChars, int * charsWritten) { - const UriBool spaceToPlus = URI_TRUE; - const UriBool normalizeBreaks = URI_TRUE; - - return URI_FUNC(ComposeQueryEx)(dest, queryList, maxChars, charsWritten, - spaceToPlus, normalizeBreaks); -} - - - -int URI_FUNC(ComposeQueryEx)(URI_CHAR * dest, - const URI_TYPE(QueryList) * queryList, int maxChars, int * charsWritten, - UriBool spaceToPlus, UriBool normalizeBreaks) { - if ((dest == NULL) || (queryList == NULL)) { - return URI_ERROR_NULL; - } - - if (maxChars < 1) { - return URI_ERROR_OUTPUT_TOO_LARGE; - } - - return URI_FUNC(ComposeQueryEngine)(dest, queryList, maxChars, - charsWritten, NULL, spaceToPlus, normalizeBreaks); -} - - - -int URI_FUNC(ComposeQueryMalloc)(URI_CHAR ** dest, - const URI_TYPE(QueryList) * queryList) { - const UriBool spaceToPlus = URI_TRUE; - const UriBool normalizeBreaks = URI_TRUE; - - return URI_FUNC(ComposeQueryMallocEx)(dest, queryList, - spaceToPlus, normalizeBreaks); -} - - - -int URI_FUNC(ComposeQueryMallocEx)(URI_CHAR ** dest, - const URI_TYPE(QueryList) * queryList, - UriBool spaceToPlus, UriBool normalizeBreaks) { - int charsRequired; - int res; - URI_CHAR * queryString; - - if (dest == NULL) { - return URI_ERROR_NULL; - } - - /* Calculate space */ - res = URI_FUNC(ComposeQueryCharsRequiredEx)(queryList, &charsRequired, - spaceToPlus, normalizeBreaks); - if (res != URI_SUCCESS) { - return res; - } - charsRequired++; - - /* Allocate space */ - queryString = ( URI_CHAR* )malloc(charsRequired * sizeof(URI_CHAR)); - if (queryString == NULL) { - return URI_ERROR_MALLOC; - } - - /* Put query in */ - res = URI_FUNC(ComposeQueryEx)(queryString, queryList, charsRequired, - NULL, spaceToPlus, normalizeBreaks); - if (res != URI_SUCCESS) { - free(queryString); - return res; - } - - *dest = queryString; - return URI_SUCCESS; -} - - - -int URI_FUNC(ComposeQueryEngine)(URI_CHAR * dest, - const URI_TYPE(QueryList) * queryList, - int maxChars, int * charsWritten, int * charsRequired, - UriBool spaceToPlus, UriBool normalizeBreaks) { - UriBool firstItem = URI_TRUE; - int ampersandLen = 0; - URI_CHAR * write = dest; - - /* Subtract terminator */ - if (dest == NULL) { - *charsRequired = 0; - } else { - maxChars--; - } - - while (queryList != NULL) { - const URI_CHAR * const key = queryList->key; - const URI_CHAR * const value = queryList->value; - const int worstCase = (normalizeBreaks == URI_TRUE ? 6 : 3); - const int keyLen = (key == NULL) ? 0 : (int)URI_STRLEN(key); - const int keyRequiredChars = worstCase * keyLen; - const int valueLen = (value == NULL) ? 0 : (int)URI_STRLEN(value); - const int valueRequiredChars = worstCase * valueLen; - - if (dest == NULL) { - if (firstItem == URI_TRUE) { - ampersandLen = 1; - firstItem = URI_FALSE; - } - - (*charsRequired) += ampersandLen + keyRequiredChars + ((value == NULL) - ? 0 - : 1 + valueRequiredChars); - } else { - URI_CHAR * afterKey; - - if ((write - dest) + ampersandLen + keyRequiredChars > maxChars) { - return URI_ERROR_OUTPUT_TOO_LARGE; - } - - /* Copy key */ - if (firstItem == URI_TRUE) { - firstItem = URI_FALSE; - } else { - write[0] = _UT('&'); - write++; - } - afterKey = URI_FUNC(EscapeEx)(key, key + keyLen, - write, spaceToPlus, normalizeBreaks); - write += (afterKey - write); - - if (value != NULL) { - URI_CHAR * afterValue; - - if ((write - dest) + 1 + valueRequiredChars > maxChars) { - return URI_ERROR_OUTPUT_TOO_LARGE; - } - - /* Copy value */ - write[0] = _UT('='); - write++; - afterValue = URI_FUNC(EscapeEx)(value, value + valueLen, - write, spaceToPlus, normalizeBreaks); - write += (afterValue - write); - } - } - - queryList = queryList->next; - } - - if (dest != NULL) { - write[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = (int)(write - dest) + 1; /* .. for terminator */ - } - } - - return URI_SUCCESS; -} - - - -UriBool URI_FUNC(AppendQueryItem)(URI_TYPE(QueryList) ** prevNext, - int * itemCount, const URI_CHAR * keyFirst, const URI_CHAR * keyAfter, - const URI_CHAR * valueFirst, const URI_CHAR * valueAfter, - UriBool plusToSpace, UriBreakConversion breakConversion) { - const int keyLen = (int)(keyAfter - keyFirst); - const int valueLen = (int)(valueAfter - valueFirst); - URI_CHAR * key; - URI_CHAR * value; - - if ((prevNext == NULL) || (itemCount == NULL) - || (keyFirst == NULL) || (keyAfter == NULL) - || (keyFirst > keyAfter) || (valueFirst > valueAfter) - || ((keyFirst == keyAfter) - && (valueFirst == NULL) && (valueAfter == NULL))) { - return URI_TRUE; - } - - /* Append new empty item */ - *prevNext = ( URI_TYPE(QueryList) * )malloc(1 * sizeof(URI_TYPE(QueryList))); - if (*prevNext == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - (*prevNext)->next = NULL; - - - /* Fill key */ - key = ( URI_CHAR* )malloc((keyLen + 1) * sizeof(URI_CHAR)); - if (key == NULL) { - free(*prevNext); - *prevNext = NULL; - return URI_FALSE; /* Raises malloc error */ - } - - key[keyLen] = _UT('\0'); - if (keyLen > 0) { - /* Copy 1:1 */ - memcpy(key, keyFirst, keyLen * sizeof(URI_CHAR)); - - /* Unescape */ - URI_FUNC(UnescapeInPlaceEx)(key, plusToSpace, breakConversion); - } - (*prevNext)->key = key; - - - /* Fill value */ - if (valueFirst != NULL) { - value = ( URI_CHAR* )malloc((valueLen + 1) * sizeof(URI_CHAR)); - if (value == NULL) { - free(key); - free(*prevNext); - *prevNext = NULL; - return URI_FALSE; /* Raises malloc error */ - } - - value[valueLen] = _UT('\0'); - if (valueLen > 0) { - /* Copy 1:1 */ - memcpy(value, valueFirst, valueLen * sizeof(URI_CHAR)); - - /* Unescape */ - URI_FUNC(UnescapeInPlaceEx)(value, plusToSpace, breakConversion); - } - (*prevNext)->value = value; - } else { - value = NULL; - } - (*prevNext)->value = value; - - (*itemCount)++; - return URI_TRUE; -} - - - -void URI_FUNC(FreeQueryList)(URI_TYPE(QueryList) * queryList) { - while (queryList != NULL) { - URI_TYPE(QueryList) * nextBackup = queryList->next; - free(queryList->key); - free(queryList->value); - free(queryList); - queryList = nextBackup; - } -} - - - -int URI_FUNC(DissectQueryMalloc)(URI_TYPE(QueryList) ** dest, int * itemCount, - const URI_CHAR * first, const URI_CHAR * afterLast) { - const UriBool plusToSpace = URI_TRUE; - const UriBreakConversion breakConversion = URI_BR_DONT_TOUCH; - - return URI_FUNC(DissectQueryMallocEx)(dest, itemCount, first, afterLast, - plusToSpace, breakConversion); -} - - - -int URI_FUNC(DissectQueryMallocEx)(URI_TYPE(QueryList) ** dest, int * itemCount, - const URI_CHAR * first, const URI_CHAR * afterLast, - UriBool plusToSpace, UriBreakConversion breakConversion) { - const URI_CHAR * walk = first; - const URI_CHAR * keyFirst = first; - const URI_CHAR * keyAfter = NULL; - const URI_CHAR * valueFirst = NULL; - const URI_CHAR * valueAfter = NULL; - URI_TYPE(QueryList) ** prevNext = dest; - int nullCounter; - int * itemsAppended = (itemCount == NULL) ? &nullCounter : itemCount; - - if ((dest == NULL) || (first == NULL) || (afterLast == NULL)) { - return URI_ERROR_NULL; - } - - if (first > afterLast) { - return URI_ERROR_RANGE_INVALID; - } - - *dest = NULL; - *itemsAppended = 0; - - /* Parse query string */ - for (; walk < afterLast; walk++) { - switch (*walk) { - case _UT('&'): - if (valueFirst != NULL) { - valueAfter = walk; - } else { - keyAfter = walk; - } - - if (URI_FUNC(AppendQueryItem)(prevNext, itemsAppended, - keyFirst, keyAfter, valueFirst, valueAfter, - plusToSpace, breakConversion) - == URI_FALSE) { - /* Free list we built */ - *itemsAppended = 0; - URI_FUNC(FreeQueryList)(*dest); - return URI_ERROR_MALLOC; - } - - /* Make future items children of the current */ - if ((prevNext != NULL) && (*prevNext != NULL)) { - prevNext = &((*prevNext)->next); - } - - if (walk + 1 < afterLast) { - keyFirst = walk + 1; - } else { - keyFirst = NULL; - } - keyAfter = NULL; - valueFirst = NULL; - valueAfter = NULL; - break; - - case _UT('='): - /* NOTE: WE treat the first '=' as a separator, */ - /* all following go into the value part */ - if (keyAfter == NULL) { - keyAfter = walk; - if (walk + 1 < afterLast) { - valueFirst = walk + 1; - valueAfter = walk + 1; - } - } - break; - - default: - break; - } - } - - if (valueFirst != NULL) { - /* Must be key/value pair */ - valueAfter = walk; - } else { - /* Must be key only */ - keyAfter = walk; - } - - if (URI_FUNC(AppendQueryItem)(prevNext, itemsAppended, keyFirst, keyAfter, - valueFirst, valueAfter, plusToSpace, breakConversion) - == URI_FALSE) { - /* Free list we built */ - *itemsAppended = 0; - URI_FUNC(FreeQueryList)(*dest); - return URI_ERROR_MALLOC; - } - - return URI_SUCCESS; -} - - -/* Source: UriRecompose.c */ - - -int URI_FUNC(ToStringCharsRequired)(const URI_TYPE(Uri) * uri, - int * charsRequired) { - const int MAX_CHARS = ((unsigned int)-1) >> 1; - return URI_FUNC(ToStringEngine)(NULL, uri, MAX_CHARS, NULL, charsRequired); -} - - - -int URI_FUNC(ToString)(URI_CHAR * dest, const URI_TYPE(Uri) * uri, - int maxChars, int * charsWritten) { - return URI_FUNC(ToStringEngine)(dest, uri, maxChars, charsWritten, NULL); -} - - - -static URI_INLINE int URI_FUNC(ToStringEngine)(URI_CHAR * dest, - const URI_TYPE(Uri) * uri, int maxChars, int * charsWritten, - int * charsRequired) { - int written = 0; - if ((uri == NULL) || ((dest == NULL) && (charsRequired == NULL))) { - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_NULL; - } - - if (maxChars < 1) { - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - maxChars--; /* So we don't have to substract 1 for '\0' all the time */ - - /* [01/19] result = "" */ - if (dest != NULL) { - dest[0] = _UT('\0'); - } else { - (*charsRequired) = 0; - } - /* [02/19] if defined(scheme) then */ - if (uri->scheme.first != NULL) { - /* [03/19] append scheme to result; */ - const int charsToWrite - = (int)(uri->scheme.afterLast - uri->scheme.first); - if (dest != NULL) { - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, uri->scheme.first, - charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += charsToWrite; - } - /* [04/19] append ":" to result; */ - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT(":"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - /* [05/19] endif; */ - } - /* [06/19] if defined(authority) then */ - if (URI_FUNC(IsHostSet)(uri)) { - /* [07/19] append "//" to result; */ - if (dest != NULL) { - if (written + 2 <= maxChars) { - memcpy(dest + written, _UT("//"), - 2 * sizeof(URI_CHAR)); - written += 2; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 2; - } - /* [08/19] append authority to result; */ - /* UserInfo */ - if (uri->userInfo.first != NULL) { - const int charsToWrite = (int)(uri->userInfo.afterLast - uri->userInfo.first); - if (dest != NULL) { - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, uri->userInfo.first, - charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("@"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += charsToWrite + 1; - } - } - - /* Host */ - if (uri->hostData.ip4 != NULL) { - /* IPv4 */ - int i = 0; - for (; i < 4; i++) { - const unsigned char value = uri->hostData.ip4->data[i]; - const int charsToWrite = (value > 99) ? 3 : ((value > 9) ? 2 : 1); - if (dest != NULL) { - if (written + charsToWrite <= maxChars) { - URI_CHAR text[4]; - if (value > 99) { - text[0] = _UT('0') + (value / 100); - text[1] = _UT('0') + ((value % 100) / 10); - text[2] = _UT('0') + (value % 10); - } else if (value > 9) { - text[0] = _UT('0') + (value / 10); - text[1] = _UT('0') + (value % 10); - } else { - text[0] = _UT('0') + value; - } - text[charsToWrite] = _UT('\0'); - memcpy(dest + written, text, charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - if (i < 3) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("."), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } - } else { - (*charsRequired) += charsToWrite + 1; - } - } - } else if (uri->hostData.ip6 != NULL) { - /* IPv6 */ - int i = 0; - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("["), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - - for (; i < 16; i++) { - const unsigned char value = uri->hostData.ip6->data[i]; - if (dest != NULL) { - if (written + 2 <= maxChars) { - URI_CHAR text[3]; - text[0] = URI_FUNC(HexToLetterEx)(value / 16, URI_FALSE); - text[1] = URI_FUNC(HexToLetterEx)(value % 16, URI_FALSE); - text[2] = _UT('\0'); - memcpy(dest + written, text, 2 * sizeof(URI_CHAR)); - written += 2; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 2; - } - if (((i & 1) == 1) && (i < 15)) { - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT(":"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - } - } - - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("]"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - } else if (uri->hostData.ipFuture.first != NULL) { - /* IPvFuture */ - const int charsToWrite = (int)(uri->hostData.ipFuture.afterLast - - uri->hostData.ipFuture.first); - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("["), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, uri->hostData.ipFuture.first, charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("]"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1 + charsToWrite + 1; - } - } else if (uri->hostText.first != NULL) { - /* Regname */ - const int charsToWrite = (int)(uri->hostText.afterLast - uri->hostText.first); - if (dest != NULL) { - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, uri->hostText.first, - charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += charsToWrite; - } - } - - /* Port */ - if (uri->portText.first != NULL) { - const int charsToWrite = (int)(uri->portText.afterLast - uri->portText.first); - if (dest != NULL) { - /* Leading ':' */ - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT(":"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - - /* Port number */ - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, uri->portText.first, - charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1 + charsToWrite; - } - } - /* [09/19] endif; */ - } - /* [10/19] append path to result; */ - /* Slash needed here? */ - if (uri->absolutePath || ((uri->pathHead != NULL) - && URI_FUNC(IsHostSet)(uri))) { - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("/"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - } - - if (uri->pathHead != NULL) { - URI_TYPE(PathSegment) * walker = uri->pathHead; - do { - const int charsToWrite = (int)(walker->text.afterLast - walker->text.first); - if (dest != NULL) { - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, walker->text.first, - charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += charsToWrite; - } - - /* Not last segment -> append slash */ - if (walker->next != NULL) { - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("/"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - } - - walker = walker->next; - } while (walker != NULL); - } - /* [11/19] if defined(query) then */ - if (uri->query.first != NULL) { - /* [12/19] append "?" to result; */ - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("?"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - /* [13/19] append query to result; */ - { - const int charsToWrite - = (int)(uri->query.afterLast - uri->query.first); - if (dest != NULL) { - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, uri->query.first, - charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += charsToWrite; - } - } - /* [14/19] endif; */ - } - /* [15/19] if defined(fragment) then */ - if (uri->fragment.first != NULL) { - /* [16/19] append "#" to result; */ - if (dest != NULL) { - if (written + 1 <= maxChars) { - memcpy(dest + written, _UT("#"), - 1 * sizeof(URI_CHAR)); - written += 1; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += 1; - } - /* [17/19] append fragment to result; */ - { - const int charsToWrite - = (int)(uri->fragment.afterLast - uri->fragment.first); - if (dest != NULL) { - if (written + charsToWrite <= maxChars) { - memcpy(dest + written, uri->fragment.first, - charsToWrite * sizeof(URI_CHAR)); - written += charsToWrite; - } else { - dest[0] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = 0; - } - return URI_ERROR_TOSTRING_TOO_LONG; - } - } else { - (*charsRequired) += charsToWrite; - } - } - /* [18/19] endif; */ - } - /* [19/19] return result; */ - if (dest != NULL) { - dest[written++] = _UT('\0'); - if (charsWritten != NULL) { - *charsWritten = written; - } - } - return URI_SUCCESS; -} - - -/* Source: UriResolve.c */ -/* Appends a relative URI to an absolute. The last path segement of - * the absolute URI is replaced. */ -static URI_INLINE UriBool URI_FUNC(MergePath)(URI_TYPE(Uri) * absWork, - const URI_TYPE(Uri) * relAppend) { - URI_TYPE(PathSegment) * sourceWalker; - URI_TYPE(PathSegment) * destPrev; - if (relAppend->pathHead == NULL) { - return URI_TRUE; - } - - /* Replace last segment ("" if trailing slash) with first of append chain */ - if (absWork->pathHead == NULL) { - URI_TYPE(PathSegment) * const dup = ( URI_TYPE(PathSegment) * const )malloc(sizeof(URI_TYPE(PathSegment))); - if (dup == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - dup->next = NULL; - absWork->pathHead = dup; - absWork->pathTail = dup; - } - absWork->pathTail->text.first = relAppend->pathHead->text.first; - absWork->pathTail->text.afterLast = relAppend->pathHead->text.afterLast; - - /* Append all the others */ - sourceWalker = relAppend->pathHead->next; - if (sourceWalker == NULL) { - return URI_TRUE; - } - destPrev = absWork->pathTail; - - for (;;) { - URI_TYPE(PathSegment) * const dup = ( URI_TYPE(PathSegment) * const )malloc(sizeof(URI_TYPE(PathSegment))); - if (dup == NULL) { - destPrev->next = NULL; - absWork->pathTail = destPrev; - return URI_FALSE; /* Raises malloc error */ - } - dup->text = sourceWalker->text; - destPrev->next = dup; - - if (sourceWalker->next == NULL) { - absWork->pathTail = dup; - absWork->pathTail->next = NULL; - break; - } - destPrev = dup; - sourceWalker = sourceWalker->next; - } - - return URI_TRUE; -} - - - -static int URI_FUNC(AddBaseUriImpl)(URI_TYPE(Uri) * absDest, - const URI_TYPE(Uri) * relSource, - const URI_TYPE(Uri) * absBase) { - if (absDest == NULL) { - return URI_ERROR_NULL; - } - URI_FUNC(ResetUri)(absDest); - - if ((relSource == NULL) || (absBase == NULL)) { - return URI_ERROR_NULL; - } - - /* absBase absolute? */ - if (absBase->scheme.first == NULL) { - return URI_ERROR_ADDBASE_REL_BASE; - } - - /* [01/32] if defined(R.scheme) then */ - if (relSource->scheme.first != NULL) { - /* [02/32] T.scheme = R.scheme; */ - absDest->scheme = relSource->scheme; - /* [03/32] T.authority = R.authority; */ - if (!URI_FUNC(CopyAuthority)(absDest, relSource)) { - return URI_ERROR_MALLOC; - } - /* [04/32] T.path = remove_dot_segments(R.path); */ - if (!URI_FUNC(CopyPath)(absDest, relSource)) { - return URI_ERROR_MALLOC; - } - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { - return URI_ERROR_MALLOC; - } - /* [05/32] T.query = R.query; */ - absDest->query = relSource->query; - /* [06/32] else */ - } else { - /* [07/32] if defined(R.authority) then */ - if (URI_FUNC(IsHostSet)(relSource)) { - /* [08/32] T.authority = R.authority; */ - if (!URI_FUNC(CopyAuthority)(absDest, relSource)) { - return URI_ERROR_MALLOC; - } - /* [09/32] T.path = remove_dot_segments(R.path); */ - if (!URI_FUNC(CopyPath)(absDest, relSource)) { - return URI_ERROR_MALLOC; - } - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { - return URI_ERROR_MALLOC; - } - /* [10/32] T.query = R.query; */ - absDest->query = relSource->query; - /* [11/32] else */ - } else { - /* [28/32] T.authority = Base.authority; */ - if (!URI_FUNC(CopyAuthority)(absDest, absBase)) { - return URI_ERROR_MALLOC; - } - /* [12/32] if (R.path == "") then */ - if (relSource->pathHead == NULL) { - /* [13/32] T.path = Base.path; */ - if (!URI_FUNC(CopyPath)(absDest, absBase)) { - return URI_ERROR_MALLOC; - } - /* [14/32] if defined(R.query) then */ - if (relSource->query.first != NULL) { - /* [15/32] T.query = R.query; */ - absDest->query = relSource->query; - /* [16/32] else */ - } else { - /* [17/32] T.query = Base.query; */ - absDest->query = absBase->query; - /* [18/32] endif; */ - } - /* [19/32] else */ - } else { - /* [20/32] if (R.path starts-with "/") then */ - if (relSource->absolutePath) { - /* [21/32] T.path = remove_dot_segments(R.path); */ - if (!URI_FUNC(CopyPath)(absDest, relSource)) { - return URI_ERROR_MALLOC; - } - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { - return URI_ERROR_MALLOC; - } - /* [22/32] else */ - } else { - /* [23/32] T.path = merge(Base.path, R.path); */ - if (!URI_FUNC(CopyPath)(absDest, absBase)) { - return URI_ERROR_MALLOC; - } - if (!URI_FUNC(MergePath)(absDest, relSource)) { - return URI_ERROR_MALLOC; - } - /* [24/32] T.path = remove_dot_segments(T.path); */ - if (!URI_FUNC(RemoveDotSegmentsAbsolute)(absDest)) { - return URI_ERROR_MALLOC; - } - - if (!URI_FUNC(FixAmbiguity)(absDest)) { - return URI_ERROR_MALLOC; - } - /* [25/32] endif; */ - } - /* [26/32] T.query = R.query; */ - absDest->query = relSource->query; - /* [27/32] endif; */ - } - URI_FUNC(FixEmptyTrailSegment)(absDest); - /* [29/32] endif; */ - } - /* [30/32] T.scheme = Base.scheme; */ - absDest->scheme = absBase->scheme; - /* [31/32] endif; */ - } - /* [32/32] T.fragment = R.fragment; */ - absDest->fragment = relSource->fragment; - - return URI_SUCCESS; - -} - - - -int URI_FUNC(AddBaseUri)(URI_TYPE(Uri) * absDest, - const URI_TYPE(Uri) * relSource, const URI_TYPE(Uri) * absBase) { - const int res = URI_FUNC(AddBaseUriImpl)(absDest, relSource, absBase); - if ((res != URI_SUCCESS) && (absDest != NULL)) { - URI_FUNC(FreeUriMembers)(absDest); - } - return res; -} - - -/* Source: UriShorten.c */ - -static URI_INLINE UriBool URI_FUNC(AppendSegment)(URI_TYPE(Uri) * uri, - const URI_CHAR * first, const URI_CHAR * afterLast) { - /* Create segment */ - URI_TYPE(PathSegment) * segment = ( URI_TYPE(PathSegment) * const )malloc(1 * sizeof(URI_TYPE(PathSegment))); - if (segment == NULL) { - return URI_FALSE; /* Raises malloc error */ - } - segment->next = NULL; - segment->text.first = first; - segment->text.afterLast = afterLast; - - /* Put into chain */ - if (uri->pathTail == NULL) { - uri->pathHead = segment; - } else { - uri->pathTail->next = segment; - } - uri->pathTail = segment; - - return URI_TRUE; -} - - - -static URI_INLINE UriBool URI_FUNC(EqualsAuthority)(const URI_TYPE(Uri) * first, - const URI_TYPE(Uri) * second) { - /* IPv4 */ - if (first->hostData.ip4 != NULL) { - return ((second->hostData.ip4 != NULL) - && !memcmp(first->hostData.ip4->data, - second->hostData.ip4->data, 4)) ? URI_TRUE : URI_FALSE; - } - - /* IPv6 */ - if (first->hostData.ip6 != NULL) { - return ((second->hostData.ip6 != NULL) - && !memcmp(first->hostData.ip6->data, - second->hostData.ip6->data, 16)) ? URI_TRUE : URI_FALSE; - } - - /* IPvFuture */ - if (first->hostData.ipFuture.first != NULL) { - return ((second->hostData.ipFuture.first != NULL) - && !URI_STRNCMP(first->hostData.ipFuture.first, - second->hostData.ipFuture.first, - first->hostData.ipFuture.afterLast - - first->hostData.ipFuture.first)) - ? URI_TRUE : URI_FALSE; - } - - if (first->hostText.first != NULL) { - return ((second->hostText.first != NULL) - && !URI_STRNCMP(first->hostText.first, - second->hostText.first, - first->hostText.afterLast - - first->hostText.first)) ? URI_TRUE : URI_FALSE; - } - - return (second->hostText.first == NULL); -} - - - -int URI_FUNC(RemoveBaseUriImpl)(URI_TYPE(Uri) * dest, - const URI_TYPE(Uri) * absSource, - const URI_TYPE(Uri) * absBase, - UriBool domainRootMode) { - if (dest == NULL) { - return URI_ERROR_NULL; - } - URI_FUNC(ResetUri)(dest); - - if ((absSource == NULL) || (absBase == NULL)) { - return URI_ERROR_NULL; - } - - /* absBase absolute? */ - if (absBase->scheme.first == NULL) { - return URI_ERROR_REMOVEBASE_REL_BASE; - } - - /* absSource absolute? */ - if (absSource->scheme.first == NULL) { - return URI_ERROR_REMOVEBASE_REL_SOURCE; - } - - /* [01/50] if (A.scheme != Base.scheme) then */ - if (URI_STRNCMP(absSource->scheme.first, absBase->scheme.first, - absSource->scheme.afterLast - absSource->scheme.first)) { - /* [02/50] T.scheme = A.scheme; */ - dest->scheme = absSource->scheme; - /* [03/50] T.authority = A.authority; */ - if (!URI_FUNC(CopyAuthority)(dest, absSource)) { - return URI_ERROR_MALLOC; - } - /* [04/50] T.path = A.path; */ - if (!URI_FUNC(CopyPath)(dest, absSource)) { - return URI_ERROR_MALLOC; - } - /* [05/50] else */ - } else { - /* [06/50] undef(T.scheme); */ - /* NOOP */ - /* [07/50] if (A.authority != Base.authority) then */ - if (!URI_FUNC(EqualsAuthority)(absSource, absBase)) { - /* [08/50] T.authority = A.authority; */ - if (!URI_FUNC(CopyAuthority)(dest, absSource)) { - return URI_ERROR_MALLOC; - } - /* [09/50] T.path = A.path; */ - if (!URI_FUNC(CopyPath)(dest, absSource)) { - return URI_ERROR_MALLOC; - } - /* [10/50] else */ - } else { - /* [11/50] if domainRootMode then */ - if (domainRootMode == URI_TRUE) { - /* [12/50] undef(T.authority); */ - /* NOOP */ - /* [13/50] if (first(A.path) == "") then */ - /* GROUPED */ - /* [14/50] T.path = "/." + A.path; */ - /* GROUPED */ - /* [15/50] else */ - /* GROUPED */ - /* [16/50] T.path = A.path; */ - /* GROUPED */ - /* [17/50] endif; */ - if (!URI_FUNC(CopyPath)(dest, absSource)) { - return URI_ERROR_MALLOC; - } - dest->absolutePath = URI_TRUE; - - if (!URI_FUNC(FixAmbiguity)(dest)) { - return URI_ERROR_MALLOC; - } - /* [18/50] else */ - } else { - const URI_TYPE(PathSegment) * sourceSeg = absSource->pathHead; - const URI_TYPE(PathSegment) * baseSeg = absBase->pathHead; - /* [19/50] bool pathNaked = true; */ - UriBool pathNaked = URI_TRUE; - /* [20/50] undef(last(Base.path)); */ - /* NOOP */ - /* [21/50] T.path = ""; */ - dest->absolutePath = URI_FALSE; - /* [22/50] while (first(A.path) == first(Base.path)) do */ - while ((sourceSeg != NULL) && (baseSeg != NULL) - && !URI_STRNCMP(sourceSeg->text.first, baseSeg->text.first, - sourceSeg->text.afterLast - sourceSeg->text.first) - && !((sourceSeg->text.first == sourceSeg->text.afterLast) - && ((sourceSeg->next == NULL) != (baseSeg->next == NULL)))) { - /* [23/50] A.path++; */ - sourceSeg = sourceSeg->next; - /* [24/50] Base.path++; */ - baseSeg = baseSeg->next; - /* [25/50] endwhile; */ - } - /* [26/50] while defined(first(Base.path)) do */ - while ((baseSeg != NULL) && (baseSeg->next != NULL)) { - /* [27/50] Base.path++; */ - baseSeg = baseSeg->next; - /* [28/50] T.path += "../"; */ - if (!URI_FUNC(AppendSegment)(dest, URI_FUNC(ConstParent), - URI_FUNC(ConstParent) + 2)) { - return URI_ERROR_MALLOC; - } - /* [29/50] pathNaked = false; */ - pathNaked = URI_FALSE; - /* [30/50] endwhile; */ - } - /* [31/50] while defined(first(A.path)) do */ - while (sourceSeg != NULL) { - /* [32/50] if pathNaked then */ - if (pathNaked == URI_TRUE) { - /* [33/50] if (first(A.path) contains ":") then */ - UriBool containsColon = URI_FALSE; - const URI_CHAR * ch = sourceSeg->text.first; - for (; ch < sourceSeg->text.afterLast; ch++) { - if (*ch == _UT(':')) { - containsColon = URI_TRUE; - break; - } - } - - if (containsColon) { - /* [34/50] T.path += "./"; */ - if (!URI_FUNC(AppendSegment)(dest, URI_FUNC(ConstPwd), - URI_FUNC(ConstPwd) + 1)) { - return URI_ERROR_MALLOC; - } - /* [35/50] elseif (first(A.path) == "") then */ - } else if (sourceSeg->text.first == sourceSeg->text.afterLast) { - /* [36/50] T.path += "/."; */ - if (!URI_FUNC(AppendSegment)(dest, URI_FUNC(ConstPwd), - URI_FUNC(ConstPwd) + 1)) { - return URI_ERROR_MALLOC; - } - /* [37/50] endif; */ - } - /* [38/50] endif; */ - } - /* [39/50] T.path += first(A.path); */ - if (!URI_FUNC(AppendSegment)(dest, sourceSeg->text.first, - sourceSeg->text.afterLast)) { - return URI_ERROR_MALLOC; - } - /* [40/50] pathNaked = false; */ - pathNaked = URI_FALSE; - /* [41/50] A.path++; */ - sourceSeg = sourceSeg->next; - /* [42/50] if defined(first(A.path)) then */ - /* NOOP */ - /* [43/50] T.path += + "/"; */ - /* NOOP */ - /* [44/50] endif; */ - /* NOOP */ - /* [45/50] endwhile; */ - } - /* [46/50] endif; */ - } - /* [47/50] endif; */ - } - /* [48/50] endif; */ - } - /* [49/50] T.query = A.query; */ - dest->query = absSource->query; - /* [50/50] T.fragment = A.fragment; */ - dest->fragment = absSource->fragment; - - return URI_SUCCESS; -} - - - -int URI_FUNC(RemoveBaseUri)(URI_TYPE(Uri) * dest, - const URI_TYPE(Uri) * absSource, - const URI_TYPE(Uri) * absBase, - UriBool domainRootMode) { - const int res = URI_FUNC(RemoveBaseUriImpl)(dest, absSource, - absBase, domainRootMode); - if ((res != URI_SUCCESS) && (dest != NULL)) { - URI_FUNC(FreeUriMembers)(dest); - } - return res; -} - - -// yajl.c -/* - * Copyright 2007, Lloyd Hilaiel. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must 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 Lloyd Hilaiel nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ - - - -#include -#include -#include -#include -#include -#include -#include -#include - - -/* Source: yajl.c */ -const char * -yajl_status_to_string(yajl_status stat) -{ - const char * statStr = "unknown"; - switch (stat) { - case yajl_status_ok: - statStr = "ok, no error"; - break; - case yajl_status_client_canceled: - statStr = "client canceled parse"; - break; - case yajl_status_insufficient_data: - statStr = "eof was met before the parse could complete"; - break; - case yajl_status_error: - statStr = "parse error"; - break; - } - return statStr; -} - -yajl_handle -yajl_alloc(const yajl_callbacks * callbacks, - const yajl_parser_config * config, - void * ctx) -{ - unsigned int allowComments = 0; - unsigned int validateUTF8 = 0; - yajl_handle hand = (yajl_handle) malloc(sizeof(struct yajl_handle_t)); - - if (config != NULL) { - allowComments = config->allowComments; - validateUTF8 = config->checkUTF8; - } - - hand->callbacks = callbacks; - hand->ctx = ctx; - hand->lexer = yajl_lex_alloc(allowComments, validateUTF8); - hand->errorOffset = 0; - hand->decodeBuf = yajl_buf_alloc(); - hand->stateBuf = yajl_buf_alloc(); - - yajl_state_push(hand, yajl_state_start); - - return hand; -} - -void -yajl_free(yajl_handle handle) -{ - yajl_buf_free(handle->stateBuf); - yajl_buf_free(handle->decodeBuf); - yajl_lex_free(handle->lexer); - free(handle); -} - -yajl_status -yajl_parse(yajl_handle hand, const unsigned char * jsonText, - unsigned int jsonTextLen) -{ - unsigned int offset = 0; - yajl_status status; - status = yajl_do_parse(hand, &offset, jsonText, jsonTextLen); - return status; -} - -unsigned char * -yajl_get_error(yajl_handle hand, int verbose, - const unsigned char * jsonText, unsigned int jsonTextLen) -{ - return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose); -} - -void -yajl_free_error(unsigned char * str) -{ - /* XXX: use memory allocation functions if set */ - free(str); -} - - -/* yajl_buf.c */ -#define YAJL_BUF_INIT_SIZE 2048 - -struct yajl_buf_t { - unsigned int len; - unsigned int used; - unsigned char * data; -}; - -static -void yajl_buf_ensure_available(yajl_buf buf, unsigned int want) -{ - unsigned int need; - - assert(buf != NULL); - - /* first call */ - if (buf->data == NULL) { - buf->len = YAJL_BUF_INIT_SIZE; - buf->data = (unsigned char *) malloc(buf->len); - buf->data[0] = 0; - } - - need = buf->len; - - while (want >= (need - buf->used)) need <<= 1; - - if (need != buf->len) { - buf->data = (unsigned char *) realloc(buf->data, need); - buf->len = need; - } -} - -yajl_buf yajl_buf_alloc(void) -{ - return (yajl_buf) calloc(1, sizeof(struct yajl_buf_t)); -} - -void yajl_buf_free(yajl_buf buf) -{ - assert(buf != NULL); - if (buf->data) free(buf->data); - free(buf); -} - -void yajl_buf_append(yajl_buf buf, const void * data, unsigned int len) -{ - yajl_buf_ensure_available(buf, len); - if (len > 0) { - assert(data != NULL); - memcpy(buf->data + buf->used, data, len); - buf->used += len; - buf->data[buf->used] = 0; - } -} - -void yajl_buf_clear(yajl_buf buf) -{ - buf->used = 0; - if (buf->data) buf->data[buf->used] = 0; -} - -const unsigned char * yajl_buf_data(yajl_buf buf) -{ - return buf->data; -} - -unsigned int yajl_buf_len(yajl_buf buf) -{ - return buf->used; -} - -void -yajl_buf_truncate(yajl_buf buf, unsigned int len) -{ - assert(len <= buf->used); - buf->used = len; -} - - -/* yajl_encode.c */ -static void CharToHex(unsigned char c, char * hexBuf) -{ - const char * hexchar = "0123456789ABCDEF"; - hexBuf[0] = hexchar[c >> 4]; - hexBuf[1] = hexchar[c & 0x0F]; -} - -void -yajl_string_encode(yajl_buf buf, const unsigned char * str, - unsigned int len) -{ - unsigned int beg = 0; - unsigned int end = 0; - char hexBuf[7]; - hexBuf[0] = '\\'; hexBuf[1] = 'u'; hexBuf[2] = '0'; hexBuf[3] = '0'; - hexBuf[6] = 0; - - while (end < len) { - char * escaped = NULL; - switch (str[end]) { - case '\r': escaped = "\\r"; break; - case '\n': escaped = "\\n"; break; - case '\\': escaped = "\\\\"; break; - /* case '/': escaped = "\\/"; break; */ - case '"': escaped = "\\\""; break; - case '\f': escaped = "\\f"; break; - case '\b': escaped = "\\b"; break; - case '\t': escaped = "\\t"; break; - default: - if ((unsigned char) str[end] < 32) { - CharToHex(str[end], hexBuf + 4); - escaped = hexBuf; - } - break; - } - if (escaped != NULL) { - yajl_buf_append(buf, str + beg, end - beg); - yajl_buf_append(buf, escaped, strlen(escaped)); - beg = ++end; - } else { - ++end; - } - } - yajl_buf_append(buf, str + beg, end - beg); -} - -static void hexToDigit(unsigned int * val, const unsigned char * hex) -{ - unsigned int i; - for (i=0;i<4;i++) { - unsigned char c = hex[i]; - if (c >= 'A') c = (c & ~0x20) - 7; - c -= '0'; - assert(!(c & 0xF0)); - *val = (*val << 4) | c; - } -} - -static void Utf32toUtf8(unsigned int codepoint, char * utf8Buf) -{ - if (codepoint < 0x80) { - utf8Buf[0] = (char) codepoint; - utf8Buf[1] = 0; - } else if (codepoint < 0x0800) { - utf8Buf[0] = (char) ((codepoint >> 6) | 0xC0); - utf8Buf[1] = (char) ((codepoint & 0x3F) | 0x80); - utf8Buf[2] = 0; - } else if (codepoint < 0x10000) { - utf8Buf[0] = (char) ((codepoint >> 12) | 0xE0); - utf8Buf[1] = (char) (((codepoint >> 6) & 0x3F) | 0x80); - utf8Buf[2] = (char) ((codepoint & 0x3F) | 0x80); - utf8Buf[3] = 0; - } else if (codepoint < 0x200000) { - utf8Buf[0] =(char)((codepoint >> 18) | 0xF0); - utf8Buf[1] =(char)(((codepoint >> 12) & 0x3F) | 0x80); - utf8Buf[2] =(char)(((codepoint >> 6) & 0x3F) | 0x80); - utf8Buf[3] =(char)((codepoint & 0x3F) | 0x80); - utf8Buf[4] = 0; - } else { - utf8Buf[0] = '?'; - utf8Buf[1] = 0; - } -} - -void yajl_string_decode(yajl_buf buf, const unsigned char * str, - unsigned int len) -{ - unsigned int beg = 0; - unsigned int end = 0; - - while (end < len) { - if (str[end] == '\\') { - char utf8Buf[5]; - const char * unescaped = "?"; - yajl_buf_append(buf, str + beg, end - beg); - switch (str[++end]) { - case 'r': unescaped = "\r"; break; - case 'n': unescaped = "\n"; break; - case '\\': unescaped = "\\"; break; - case '/': unescaped = "/"; break; - case '"': unescaped = "\""; break; - case 'f': unescaped = "\f"; break; - case 'b': unescaped = "\b"; break; - case 't': unescaped = "\t"; break; - case 'u': { - unsigned int codepoint = 0; - hexToDigit(&codepoint, str + ++end); - end+=3; - /* check if this is a surrogate */ - if ((codepoint & 0xFC00) == 0xD800) { - end++; - if (str[end] == '\\' && str[end + 1] == 'u') { - unsigned int surrogate = 0; - hexToDigit(&surrogate, str + end + 2); - codepoint = - (((codepoint & 0x3F) << 10) | - ((((codepoint >> 6) & 0xF) + 1) << 16) | - (surrogate & 0x3FF)); - end += 5; - } else { - unescaped = "?"; - break; - } - } - - Utf32toUtf8(codepoint, utf8Buf); - unescaped = utf8Buf; - break; - } - default: - assert("this should never happen" == NULL); - } - yajl_buf_append(buf, unescaped, strlen(unescaped)); - beg = ++end; - } else { - end++; - } - } - yajl_buf_append(buf, str + beg, end - beg); -} - - -/* Source: yajl_gen.c */ -typedef enum { - yajl_gen_start, - yajl_gen_map_start, - yajl_gen_map_key, - yajl_gen_map_val, - yajl_gen_array_start, - yajl_gen_in_array, - yajl_gen_complete, - yajl_gen_error -} yajl_gen_state; - -struct yajl_gen_t -{ - unsigned int depth; - unsigned int pretty; - const char * indentString; - yajl_gen_state state[YAJL_MAX_DEPTH]; - yajl_buf buf; -}; - -yajl_gen -yajl_gen_alloc(const yajl_gen_config * config) -{ - yajl_gen g = (yajl_gen) malloc(sizeof(struct yajl_gen_t)); - memset((void *) g, 0, sizeof(struct yajl_gen_t)); - if (config) { - g->pretty = config->beautify; - g->indentString = config->indentString ? config->indentString : " "; - } - g->buf = yajl_buf_alloc(); - return g; -} - -void -yajl_gen_free(yajl_gen g) -{ - yajl_buf_free(g->buf); - free(g); -} - -#define INSERT_SEP \ - if (g->state[g->depth] == yajl_gen_map_key || \ - g->state[g->depth] == yajl_gen_in_array) { \ - yajl_buf_append(g->buf, ",", 1); \ - if (g->pretty) yajl_buf_append(g->buf, "\n", 1); \ - } else if (g->state[g->depth] == yajl_gen_map_val) { \ - yajl_buf_append(g->buf, ":", 1); \ - if (g->pretty) yajl_buf_append(g->buf, " ", 1); \ - } - -#define INSERT_WHITESPACE \ - if (g->pretty) { \ - if (g->state[g->depth] != yajl_gen_map_val) { \ - unsigned int i; \ - for (i=0;idepth;i++) \ - yajl_buf_append(g->buf, g->indentString, \ - strlen(g->indentString)); \ - } \ - } - -#define ENSURE_NOT_KEY \ - if (g->state[g->depth] == yajl_gen_map_key) { \ - return yajl_gen_keys_must_be_strings; \ - } \ - -/* check that we're not complete, or in error state. in a valid state - * to be generating */ -#define ENSURE_VALID_STATE \ - if (g->state[g->depth] == yajl_gen_error) { \ - return yajl_gen_in_error_state;\ - } else if (g->state[g->depth] == yajl_gen_complete) { \ - return yajl_gen_generation_complete; \ - } - -#define INCREMENT_DEPTH \ - if (++(g->depth) >= YAJL_MAX_DEPTH) return yajl_max_depth_exceeded; - -#define APPENDED_ATOM \ - switch (g->state[g->depth]) { \ - case yajl_gen_start: \ - g->state[g->depth] = yajl_gen_complete; \ - break; \ - case yajl_gen_map_start: \ - case yajl_gen_map_key: \ - g->state[g->depth] = yajl_gen_map_val; \ - break; \ - case yajl_gen_array_start: \ - g->state[g->depth] = yajl_gen_in_array; \ - break; \ - case yajl_gen_map_val: \ - g->state[g->depth] = yajl_gen_map_key; \ - break; \ - default: \ - break; \ - } \ - -#define FINAL_NEWLINE \ - if (g->pretty && g->state[g->depth] == yajl_gen_complete) \ - yajl_buf_append(g->buf, "\n", 1); - -yajl_gen_status -yajl_gen_integer(yajl_gen g, long int number) -{ - char i[32]; - ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; - sprintf(i, "%ld", number); - yajl_buf_append(g->buf, i, strlen(i)); - APPENDED_ATOM; - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_double(yajl_gen g, double number) -{ - char i[32]; - ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; - sprintf(i, "%g", number); - yajl_buf_append(g->buf, i, strlen(i)); - APPENDED_ATOM; - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_number(yajl_gen g, const char * s, unsigned int l) -{ - ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; - yajl_buf_append(g->buf, s, l); - APPENDED_ATOM; - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_string(yajl_gen g, const unsigned char * str, - unsigned int len) -{ - ENSURE_VALID_STATE; INSERT_SEP; INSERT_WHITESPACE; - yajl_buf_append(g->buf, "\"", 1); - yajl_string_encode(g->buf, str, len); - yajl_buf_append(g->buf, "\"", 1); - APPENDED_ATOM; - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_null(yajl_gen g) -{ - ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; - yajl_buf_append(g->buf, "null", strlen("null")); - APPENDED_ATOM; - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_bool(yajl_gen g, int boolean) -{ - const char * val = boolean ? "true" : "false"; - - ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; - yajl_buf_append(g->buf, val, strlen(val)); - APPENDED_ATOM; - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_map_open(yajl_gen g) -{ - ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; - INCREMENT_DEPTH; - - g->state[g->depth] = yajl_gen_map_start; - yajl_buf_append(g->buf, "{", 1); - if (g->pretty) yajl_buf_append(g->buf, "\n", 1); - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_map_close(yajl_gen g) -{ - ENSURE_VALID_STATE; - (g->depth)--; - if (g->pretty) yajl_buf_append(g->buf, "\n", 1); - APPENDED_ATOM; - INSERT_WHITESPACE; - yajl_buf_append(g->buf, "}", 1); - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_array_open(yajl_gen g) -{ - ENSURE_VALID_STATE; ENSURE_NOT_KEY; INSERT_SEP; INSERT_WHITESPACE; - INCREMENT_DEPTH; - g->state[g->depth] = yajl_gen_array_start; - yajl_buf_append(g->buf, "[", 1); - if (g->pretty) yajl_buf_append(g->buf, "\n", 1); - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_array_close(yajl_gen g) -{ - ENSURE_VALID_STATE; - if (g->pretty) yajl_buf_append(g->buf, "\n", 1); - (g->depth)--; - APPENDED_ATOM; - INSERT_WHITESPACE; - yajl_buf_append(g->buf, "]", 1); - FINAL_NEWLINE; - return yajl_gen_status_ok; -} - -yajl_gen_status -yajl_gen_get_buf(yajl_gen g, const unsigned char ** buf, - unsigned int * len) -{ - *buf = yajl_buf_data(g->buf); - *len = yajl_buf_len(g->buf); - return yajl_gen_status_ok; -} - -void -yajl_gen_clear(yajl_gen g) -{ - yajl_buf_clear(g->buf); -} - - -/* yajl_lex.c */ -#ifdef YAJL_LEXER_DEBUG -static const char * -tokToStr(yajl_tok tok) -{ - switch (tok) { - case yajl_tok_bool: return "bool"; - case yajl_tok_colon: return "colon"; - case yajl_tok_comma: return "comma"; - case yajl_tok_eof: return "eof"; - case yajl_tok_error: return "error"; - case yajl_tok_left_brace: return "brace"; - case yajl_tok_left_bracket: return "bracket"; - case yajl_tok_null: return "null"; - case yajl_tok_integer: return "integer"; - case yajl_tok_double: return "double"; - case yajl_tok_right_brace: return "brace"; - case yajl_tok_right_bracket: return "bracket"; - case yajl_tok_string: return "string"; - case yajl_tok_string_with_escapes: return "string_with_escapes"; - } - return "unknown"; -} -#endif - -/* Impact of the stream parsing feature on the lexer: - * - * YAJL support stream parsing. That is, the ability to parse the first - * bits of a chunk of JSON before the last bits are available (still on - * the network or disk). This makes the lexer more complex. The - * responsibility of the lexer is to handle transparently the case where - * a chunk boundary falls in the middle of a token. This is - * accomplished is via a buffer and a character reading abstraction. - * - * Overview of implementation - * - * When we lex to end of input string before end of token is hit, we - * copy all of the input text composing the token into our lexBuf. - * - * Every time we read a character, we do so through the readChar function. - * readChar's responsibility is to handle pulling all chars from the buffer - * before pulling chars from input text - */ - -struct yajl_lexer_t { - /* the overal line and char offset into the data */ - unsigned int lineOff; - unsigned int charOff; - - /* error */ - yajl_lex_error error; - - /* a input buffer to handle the case where a token is spread over - * multiple chunks */ - yajl_buf buf; - - /* in the case where we have data in the lexBuf, bufOff holds - * the current offset into the lexBuf. */ - unsigned int bufOff; - - /* are we using the lex buf? */ - unsigned int bufInUse; - - /* shall we allow comments? */ - unsigned int allowComments; - - /* shall we validate utf8 inside strings? */ - unsigned int validateUTF8; -}; - -static unsigned char -readChar(yajl_lexer lxr, const unsigned char * txt, unsigned int *off) -{ - if (lxr->bufInUse && yajl_buf_len(lxr->buf) && - lxr->bufOff < yajl_buf_len(lxr->buf)) - { - return *((unsigned char *) yajl_buf_data(lxr->buf) + (lxr->bufOff)++); - } - return txt[(*off)++]; -} - -static void -unreadChar(yajl_lexer lxr, unsigned int *off) -{ - if (*off > 0) (*off)--; - else (lxr->bufOff)--; -} - -yajl_lexer -yajl_lex_alloc(unsigned int allowComments, unsigned int validateUTF8) -{ - yajl_lexer lxr = (yajl_lexer) calloc(1, sizeof(struct yajl_lexer_t)); - lxr->buf = yajl_buf_alloc(); - lxr->allowComments = allowComments; - lxr->validateUTF8 = validateUTF8; - return lxr; -} - -void -yajl_lex_free(yajl_lexer lxr) -{ - yajl_buf_free(lxr->buf); - free(lxr); - return; -} - -/* a lookup table which lets us quickly determine three things: - * VEC - valid escaped conrol char - * IJC - invalid json char - * VHC - valid hex char - * note. the solidus '/' may be escaped or not. - * note. the - */ -#define VEC 1 -#define IJC 2 -#define VHC 4 -const static char charLookupTable[256] = -{ -/*00*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , -/*08*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , -/*10*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , -/*18*/ IJC , IJC , IJC , IJC , IJC , IJC , IJC , IJC , - -/*20*/ 0 , 0 , VEC|IJC, 0 , 0 , 0 , 0 , 0 , -/*28*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , VEC , -/*30*/ VHC , VHC , VHC , VHC , VHC , VHC , VHC , VHC , -/*38*/ VHC , VHC , 0 , 0 , 0 , 0 , 0 , 0 , - -/*40*/ 0 , VHC , VHC , VHC , VHC , VHC , VHC , 0 , -/*48*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , -/*50*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , -/*58*/ 0 , 0 , 0 , 0 , VEC|IJC, 0 , 0 , 0 , - -/*60*/ 0 , VHC , VEC|VHC, VHC , VHC , VHC , VEC|VHC, 0 , -/*68*/ 0 , 0 , 0 , 0 , 0 , 0 , VEC , 0 , -/*70*/ 0 , 0 , VEC , 0 , VEC , 0 , 0 , 0 , -/*78*/ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - -/* include these so we don't have to always check the range of the char */ - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , - 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 -}; - -/** process a variable length utf8 encoded codepoint. - * - * returns: - * yajl_tok_string - if valid utf8 char was parsed and offset was - * advanced - * yajl_tok_eof - if end of input was hit before validation could - * complete - * yajl_tok_error - if invalid utf8 was encountered - * - * NOTE: on error the offset will point to the first char of the - * invalid utf8 */ -#define UTF8_CHECK_EOF if (*offset >= jsonTextLen) { return yajl_tok_eof; } - -static yajl_tok -yajl_lex_utf8_char(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int * offset, - unsigned char curChar) -{ - if (curChar <= 0x7f) { - /* single byte */ - return yajl_tok_string; - } else if ((curChar >> 5) == 0x6) { - /* two byte */ - UTF8_CHECK_EOF; - curChar = readChar(lexer, jsonText, offset); - if ((curChar >> 6) == 0x2) return yajl_tok_string; - } else if ((curChar >> 4) == 0x0d) { - /* three byte */ - UTF8_CHECK_EOF; - curChar = readChar(lexer, jsonText, offset); - if ((curChar >> 6) == 0x2) { - UTF8_CHECK_EOF; - curChar = readChar(lexer, jsonText, offset); - if ((curChar >> 6) == 0x2) return yajl_tok_string; - } - } else if ((curChar >> 3) == 0x1d) { - /* four byte */ - UTF8_CHECK_EOF; - curChar = readChar(lexer, jsonText, offset); - if ((curChar >> 6) == 0x2) { - UTF8_CHECK_EOF; - curChar = readChar(lexer, jsonText, offset); - if ((curChar >> 6) == 0x2) { - UTF8_CHECK_EOF; - curChar = readChar(lexer, jsonText, offset); - if ((curChar >> 6) == 0x2) return yajl_tok_string; - } - } - } - - return yajl_tok_error; -} - -/* lex a string. input is the lexer, pointer to beginning of - * json text, and start of string (offset). - * a token is returned which has the following meanings: - * yajl_tok_string: lex of string was successful. offset points to - * terminating '"'. - * yajl_tok_eof: end of text was encountered before we could complete - * the lex. - * yajl_tok_error: embedded in the string were unallowable chars. offset - * points to the offending char - */ -#define STR_CHECK_EOF \ -if (*offset >= jsonTextLen) { \ - tok = yajl_tok_eof; \ - goto finish_string_lex; \ -} - -static yajl_tok -yajl_lex_string(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int * offset) -{ - yajl_tok tok = yajl_tok_error; - int hasEscapes = 0; - - for (;;) { - unsigned char curChar; - - STR_CHECK_EOF; - - curChar = readChar(lexer, jsonText, offset); - - /* quote terminates */ - if (curChar == '"') { - tok = yajl_tok_string; - break; - } - /* backslash escapes a set of control chars, */ - else if (curChar == '\\') { - hasEscapes = 1; - STR_CHECK_EOF; - - /* special case \u */ - curChar = readChar(lexer, jsonText, offset); - if (curChar == 'u') { - unsigned int i = 0; - - for (i=0;i<4;i++) { - STR_CHECK_EOF; - curChar = readChar(lexer, jsonText, offset); - if (!(charLookupTable[curChar] & VHC)) { - /* back up to offending char */ - unreadChar(lexer, offset); - lexer->error = yajl_lex_string_invalid_hex_char; - goto finish_string_lex; - } - } - } else if (!(charLookupTable[curChar] & VEC)) { - /* back up to offending char */ - unreadChar(lexer, offset); - lexer->error = yajl_lex_string_invalid_escaped_char; - goto finish_string_lex; - } - } - /* when not validating UTF8 it's a simple table lookup to determine - * if the present character is invalid */ - else if(charLookupTable[curChar] & IJC) { - /* back up to offending char */ - unreadChar(lexer, offset); - lexer->error = yajl_lex_string_invalid_json_char; - goto finish_string_lex; - } - /* when in validate UTF8 mode we need to do some extra work */ - else if (lexer->validateUTF8) { - yajl_tok t = yajl_lex_utf8_char(lexer, jsonText, jsonTextLen, - offset, curChar); - - if (t == yajl_tok_eof) { - tok = yajl_tok_eof; - goto finish_string_lex; - } else if (t == yajl_tok_error) { - lexer->error = yajl_lex_string_invalid_utf8; - goto finish_string_lex; - } - } - /* accept it, and move on */ - } - finish_string_lex: - /* tell our buddy, the parser, wether he needs to process this string - * again */ - if (hasEscapes && tok == yajl_tok_string) { - tok = yajl_tok_string_with_escapes; - } - - return tok; -} - -#define RETURN_IF_EOF if (*offset >= jsonTextLen) return yajl_tok_eof; - -static yajl_tok -yajl_lex_number(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int * offset) -{ - /** XXX: numbers are the only entities in json that we must lex - * _beyond_ in order to know that they are complete. There - * is an ambiguous case for integers at EOF. */ - - unsigned char c; - - yajl_tok tok = yajl_tok_integer; - - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - - /* optional leading minus */ - if (c == '-') { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - } - - /* a single zero, or a series of integers */ - if (c == '0') { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - } else if (c >= '1' && c <= '9') { - do { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - } while (c >= '0' && c <= '9'); - } else { - unreadChar(lexer, offset); - lexer->error = yajl_lex_missing_integer_after_minus; - return yajl_tok_error; - } - - /* optional fraction (indicates this is floating point) */ - if (c == '.') { - int numRd = 0; - - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - - while (c >= '0' && c <= '9') { - numRd++; - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - } - - if (!numRd) { - unreadChar(lexer, offset); - lexer->error = yajl_lex_missing_integer_after_decimal; - return yajl_tok_error; - } - tok = yajl_tok_double; - } - - /* optional exponent (indicates this is floating point) */ - if (c == 'e' || c == 'E') { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - - /* optional sign */ - if (c == '+' || c == '-') { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - } - - if (c >= '0' && c <= '9') { - do { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - } while (c >= '0' && c <= '9'); - } else { - unreadChar(lexer, offset); - lexer->error = yajl_lex_missing_integer_after_exponent; - return yajl_tok_error; - } - tok = yajl_tok_double; - } - - /* we always go "one too far" */ - unreadChar(lexer, offset); - - return tok; -} - -static yajl_tok -yajl_lex_comment(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int * offset) -{ - unsigned char c; - - yajl_tok tok = yajl_tok_comment; - - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - - /* either slash or star expected */ - if (c == '/') { - /* now we throw away until end of line */ - do { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - } while (c != '\n'); - } else if (c == '*') { - /* now we throw away until end of comment */ - for (;;) { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - if (c == '*') { - RETURN_IF_EOF; - c = readChar(lexer, jsonText, offset); - if (c == '/') { - break; - } else { - unreadChar(lexer, offset); - } - } - } - } else { - lexer->error = yajl_lex_invalid_char; - tok = yajl_tok_error; - } - - return tok; -} - -yajl_tok -yajl_lex_lex(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int * context, - const unsigned char ** outBuf, unsigned int * outLen) -{ - yajl_tok tok = yajl_tok_error; - unsigned char c; - unsigned int startCtx = *context; - - *outBuf = NULL; - *outLen = 0; - - for (;;) { - assert(*context <= jsonTextLen); - - if (*context >= jsonTextLen) { - tok = yajl_tok_eof; - goto lexed; - } - - c = readChar(lexer, jsonText, context); - - switch (c) { - case '{': - tok = yajl_tok_left_bracket; - goto lexed; - case '}': - tok = yajl_tok_right_bracket; - goto lexed; - case '[': - tok = yajl_tok_left_brace; - goto lexed; - case ']': - tok = yajl_tok_right_brace; - goto lexed; - case ',': - tok = yajl_tok_comma; - goto lexed; - case ':': - tok = yajl_tok_colon; - goto lexed; - case '\t': case '\n': case '\v': case '\f': case '\r': case ' ': - startCtx++; - break; - case 't': { - const char * want = "rue"; - do { - if (*context >= jsonTextLen) { - tok = yajl_tok_eof; - goto lexed; - } - c = readChar(lexer, jsonText, context); - if (c != *want) { - unreadChar(lexer, context); - lexer->error = yajl_lex_invalid_string; - tok = yajl_tok_error; - goto lexed; - } - } while (*(++want)); - tok = yajl_tok_bool; - goto lexed; - } - case 'f': { - const char * want = "alse"; - do { - if (*context >= jsonTextLen) { - tok = yajl_tok_eof; - goto lexed; - } - c = readChar(lexer, jsonText, context); - if (c != *want) { - unreadChar(lexer, context); - lexer->error = yajl_lex_invalid_string; - tok = yajl_tok_error; - goto lexed; - } - } while (*(++want)); - tok = yajl_tok_bool; - goto lexed; - } - case 'n': { - const char * want = "ull"; - do { - if (*context >= jsonTextLen) { - tok = yajl_tok_eof; - goto lexed; - } - c = readChar(lexer, jsonText, context); - if (c != *want) { - unreadChar(lexer, context); - lexer->error = yajl_lex_invalid_string; - tok = yajl_tok_error; - goto lexed; - } - } while (*(++want)); - tok = yajl_tok_null; - goto lexed; - } - case '"': { - tok = yajl_lex_string(lexer, (unsigned char *) jsonText, - jsonTextLen, context); - goto lexed; - } - case '-': - case '0': case '1': case '2': case '3': case '4': - case '5': case '6': case '7': case '8': case '9': { - /* integer parsing wants to start from the beginning */ - unreadChar(lexer, context); - tok = yajl_lex_number(lexer, (unsigned char *) jsonText, - jsonTextLen, context); - goto lexed; - } - case '/': - /* hey, look, a probable comment! If comments are disabled - * it's an error. */ - if (!lexer->allowComments) { - unreadChar(lexer, context); - lexer->error = yajl_lex_unallowed_comment; - tok = yajl_tok_error; - goto lexed; - } - /* if comments are enabled, then we should try to lex - * the thing. possible outcomes are - * - successful lex (tok_comment, which means continue), - * - malformed comment opening (slash not followed by - * '*' or '/') (tok_error) - * - eof hit. (tok_eof) */ - tok = yajl_lex_comment(lexer, (unsigned char *) jsonText, - jsonTextLen, context); - if (tok == yajl_tok_comment) { - /* "error" is silly, but that's the initial - * state of tok. guilty until proven innocent. */ - tok = yajl_tok_error; - yajl_buf_clear(lexer->buf); - lexer->bufInUse = 0; - startCtx = *context; - break; - } - /* hit error or eof, bail */ - goto lexed; - default: - lexer->error = yajl_lex_invalid_char; - tok = yajl_tok_error; - goto lexed; - } - } - - - lexed: - /* need to append to buffer if the buffer is in use or - * if it's an EOF token */ - if (tok == yajl_tok_eof || lexer->bufInUse) { - if (!lexer->bufInUse) yajl_buf_clear(lexer->buf); - lexer->bufInUse = 1; - yajl_buf_append(lexer->buf, jsonText + startCtx, *context - startCtx); - lexer->bufOff = 0; - - if (tok != yajl_tok_eof) { - *outBuf = yajl_buf_data(lexer->buf); - *outLen = yajl_buf_len(lexer->buf); - lexer->bufInUse = 0; - } - } else if (tok != yajl_tok_error) { - *outBuf = jsonText + startCtx; - *outLen = *context - startCtx; - } - - /* special case for strings. skip the quotes. */ - if (tok == yajl_tok_string || tok == yajl_tok_string_with_escapes) - { - assert(*outLen >= 2); - (*outBuf)++; - *outLen -= 2; - } - - -#ifdef YAJL_LEXER_DEBUG - if (tok == yajl_tok_error) { - printf("lexical error: %s\n", - yajl_lex_error_to_string(yajl_lex_get_error(lexer))); - } else if (tok == yajl_tok_eof) { - printf("EOF hit\n"); - } else { - printf("lexed %s: '", tokToStr(tok)); - fwrite(*outBuf, 1, *outLen, stdout); - printf("'\n"); - } -#endif - - return tok; -} - -const char * -yajl_lex_error_to_string(yajl_lex_error error) -{ - switch (error) { - case yajl_lex_e_ok: - return "ok, no error"; - case yajl_lex_string_invalid_utf8: - return "invalid bytes in UTF8 string."; - case yajl_lex_string_invalid_escaped_char: - return "inside a string, '\\' occurs before a character " - "which it may not."; - case yajl_lex_string_invalid_json_char: - return "invalid character inside string."; - case yajl_lex_string_invalid_hex_char: - return "invalid (non-hex) character occurs after '\\u' inside " - "string."; - case yajl_lex_invalid_char: - return "invalid char in json text."; - case yajl_lex_invalid_string: - return "invalid string in json text."; - case yajl_lex_missing_integer_after_exponent: - return "malformed number, a digit is required after the exponent."; - case yajl_lex_missing_integer_after_decimal: - return "malformed number, a digit is required after the " - "decimal point."; - case yajl_lex_missing_integer_after_minus: - return "malformed number, a digit is required after the " - "minus sign."; - case yajl_lex_unallowed_comment: - return "probable comment found in input text, comments are " - "not enabled."; - } - return "unknown error code"; -} - - -/** allows access to more specific information about the lexical - * error when yajl_lex_lex returns yajl_tok_error. */ -yajl_lex_error -yajl_lex_get_error(yajl_lexer lexer) -{ - if (lexer == NULL) return (yajl_lex_error) -1; - return lexer->error; -} - -unsigned int yajl_lex_current_line(yajl_lexer lexer) -{ - return lexer->lineOff; -} - -unsigned int yajl_lex_current_char(yajl_lexer lexer) -{ - return lexer->charOff; -} - -yajl_tok yajl_lex_peek(yajl_lexer lexer, const unsigned char * jsonText, - unsigned int jsonTextLen, unsigned int offset) -{ - const unsigned char * outBuf; - unsigned int outLen; - unsigned int bufLen = yajl_buf_len(lexer->buf); - unsigned int bufOff = lexer->bufOff; - unsigned int bufInUse = lexer->bufInUse; - yajl_tok tok; - - tok = yajl_lex_lex(lexer, jsonText, jsonTextLen, &offset, - &outBuf, &outLen); - - lexer->bufOff = bufOff; - lexer->bufInUse = bufInUse; - yajl_buf_truncate(lexer->buf, bufLen); - - return tok; -} - - -/* Source: yajl_parser.c */ -unsigned char * -yajl_render_error_string(yajl_handle hand, const unsigned char * jsonText, - unsigned int jsonTextLen, int verbose) -{ - unsigned int offset = hand->errorOffset; - unsigned char * str; - const char * errorType = NULL; - const char * errorText = NULL; - char text[72]; - const char * arrow = " (right here) ------^\n"; - - if (yajl_state_current(hand) == yajl_state_parse_error) { - errorType = "parse"; - errorText = hand->parseError; - } else if (yajl_state_current(hand) == yajl_state_lexical_error) { - errorType = "lexical"; - errorText = yajl_lex_error_to_string(yajl_lex_get_error(hand->lexer)); - } else { - errorType = "unknown"; - } - - { - unsigned int memneeded = 0; - memneeded += strlen(errorType); - memneeded += strlen(" error"); - if (errorText != NULL) { - memneeded += strlen(": "); - memneeded += strlen(errorText); - } - str = (unsigned char *) malloc(memneeded + 2); - str[0] = 0; - strcat((char *) str, errorType); - strcat((char *) str, " error"); - if (errorText != NULL) { - strcat((char *) str, ": "); - strcat((char *) str, errorText); - } - strcat((char *) str, "\n"); - } - - /* now we append as many spaces as needed to make sure the error - * falls at char 41, if verbose was specified */ - if (verbose) { - unsigned int start, end, i; - unsigned int spacesNeeded; - - spacesNeeded = (offset < 30 ? 40 - offset : 10); - start = (offset >= 30 ? offset - 30 : 0); - end = (offset + 30 > jsonTextLen ? jsonTextLen : offset + 30); - - for (i=0;iparseError = \ - "client cancelled parse via callback return value"; \ - return yajl_status_client_canceled; \ - } - - -yajl_status -yajl_do_parse(yajl_handle hand, unsigned int * offset, - const unsigned char * jsonText, unsigned int jsonTextLen) -{ - yajl_tok tok; - const unsigned char * buf; - unsigned int bufLen; - - around_again: - switch (yajl_state_current(hand)) { - case yajl_state_parse_complete: - return yajl_status_ok; - case yajl_state_lexical_error: - case yajl_state_parse_error: - hand->errorOffset = *offset; - return yajl_status_error; - case yajl_state_start: - case yajl_state_map_need_val: - case yajl_state_array_need_val: - case yajl_state_array_start: { - /* for arrays and maps, we advance the state for this - * depth, then push the state of the next depth. - * If an error occurs during the parsing of the nesting - * enitity, the state at this level will not matter. - * a state that needs pushing will be anything other - * than state_start */ - yajl_state stateToPush = yajl_state_start; - - tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, - offset, &buf, &bufLen); - - switch (tok) { - case yajl_tok_eof: - return yajl_status_insufficient_data; - case yajl_tok_error: - yajl_state_set(hand, yajl_state_lexical_error); - goto around_again; - case yajl_tok_string: - if (hand->callbacks && hand->callbacks->yajl_string) { - _CC_CHK(hand->callbacks->yajl_string(hand->ctx, - buf, bufLen)); - } - break; - case yajl_tok_string_with_escapes: - if (hand->callbacks && hand->callbacks->yajl_string) { - yajl_buf_clear(hand->decodeBuf); - yajl_string_decode(hand->decodeBuf, buf, bufLen); - _CC_CHK(hand->callbacks->yajl_string( - hand->ctx, yajl_buf_data(hand->decodeBuf), - yajl_buf_len(hand->decodeBuf))); - } - break; - case yajl_tok_bool: - if (hand->callbacks && hand->callbacks->yajl_boolean) { - _CC_CHK(hand->callbacks->yajl_boolean(hand->ctx, - *buf == 't')); - } - break; - case yajl_tok_null: - if (hand->callbacks && hand->callbacks->yajl_null) { - _CC_CHK(hand->callbacks->yajl_null(hand->ctx)); - } - break; - case yajl_tok_left_bracket: - if (hand->callbacks && hand->callbacks->yajl_start_map) { - _CC_CHK(hand->callbacks->yajl_start_map(hand->ctx)); - } - stateToPush = yajl_state_map_start; - break; - case yajl_tok_left_brace: - if (hand->callbacks && hand->callbacks->yajl_start_array) { - _CC_CHK(hand->callbacks->yajl_start_array(hand->ctx)); - } - stateToPush = yajl_state_array_start; - break; - case yajl_tok_integer: - /* - * note. strtol does not respect the length of - * the lexical token. in a corner case where the - * lexed number is a integer with a trailing zero, - * immediately followed by the end of buffer, - * sscanf could run off into oblivion and cause a - * crash. for this reason we copy the integer - * (and doubles), into our parse buffer (the same - * one used for unescaping strings), before - * calling strtol. yajl_buf ensures null padding, - * so we're safe. - */ - if (hand->callbacks) { - if (hand->callbacks->yajl_number) { - _CC_CHK(hand->callbacks->yajl_number(hand->ctx, - (char *) buf, - bufLen)); - } else if (hand->callbacks->yajl_integer) { - long int i = 0; - yajl_buf_clear(hand->decodeBuf); - yajl_buf_append(hand->decodeBuf, buf, bufLen); - buf = yajl_buf_data(hand->decodeBuf); - i = strtol((char *) buf, NULL, 10); - if ((i == LONG_MIN || i == LONG_MAX) && - errno == ERANGE) - { - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = "integer overflow" ; - /* try to restore error offset */ - if (*offset >= bufLen) *offset -= bufLen; - else *offset = 0; - goto around_again; - } - _CC_CHK(hand->callbacks->yajl_integer(hand->ctx, - i)); - } - } - break; - case yajl_tok_double: - if (hand->callbacks) { - if (hand->callbacks->yajl_number) { - _CC_CHK(hand->callbacks->yajl_number(hand->ctx, - (char *) buf, - bufLen)); - } else if (hand->callbacks->yajl_double) { - double d = 0.0; - yajl_buf_clear(hand->decodeBuf); - yajl_buf_append(hand->decodeBuf, buf, bufLen); - buf = yajl_buf_data(hand->decodeBuf); - d = strtod((char *) buf, NULL); - if ((d == HUGE_VAL || d == -HUGE_VAL) && - errno == ERANGE) - { - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = "numeric (floating point) " - "overflow"; - /* try to restore error offset */ - if (*offset >= bufLen) *offset -= bufLen; - else *offset = 0; - goto around_again; - } - _CC_CHK(hand->callbacks->yajl_double(hand->ctx, - d)); - } - } - break; - case yajl_tok_right_brace: { - if (yajl_state_current(hand) == yajl_state_array_start) { - if (hand->callbacks && - hand->callbacks->yajl_end_array) - { - _CC_CHK(hand->callbacks->yajl_end_array(hand->ctx)); - } - (void) yajl_state_pop(hand); - goto around_again; - } - /* intentional fall-through */ - } - case yajl_tok_colon: - case yajl_tok_comma: - case yajl_tok_right_bracket: - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = - "unallowed token at this point in JSON text"; - goto around_again; - default: - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = "invalid token, internal error"; - goto around_again; - } - /* got a value. transition depends on the state we're in. */ - { - yajl_state s = yajl_state_current(hand); - if (s == yajl_state_start) { - yajl_state_set(hand, yajl_state_parse_complete); - } else if (s == yajl_state_map_need_val) { - yajl_state_set(hand, yajl_state_map_got_val); - } else { - yajl_state_set(hand, yajl_state_array_got_val); - } - } - if (stateToPush != yajl_state_start) { - yajl_state_push(hand, stateToPush); - } - - goto around_again; - } - case yajl_state_map_start: - case yajl_state_map_need_key: { - /* only difference between these two states is that in - * start '}' is valid, whereas in need_key, we've parsed - * a comma, and a string key _must_ follow */ - tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, - offset, &buf, &bufLen); - switch (tok) { - case yajl_tok_eof: - return yajl_status_insufficient_data; - case yajl_tok_error: - yajl_state_set(hand, yajl_state_lexical_error); - goto around_again; - case yajl_tok_string_with_escapes: - if (hand->callbacks && hand->callbacks->yajl_map_key) { - yajl_buf_clear(hand->decodeBuf); - yajl_string_decode(hand->decodeBuf, buf, bufLen); - buf = yajl_buf_data(hand->decodeBuf); - bufLen = yajl_buf_len(hand->decodeBuf); - } - /* intentional fall-through */ - case yajl_tok_string: - if (hand->callbacks && hand->callbacks->yajl_map_key) { - _CC_CHK(hand->callbacks->yajl_map_key(hand->ctx, buf, - bufLen)); - } - yajl_state_set(hand, yajl_state_map_sep); - goto around_again; - case yajl_tok_right_bracket: - if (yajl_state_current(hand) == yajl_state_map_start) { - if (hand->callbacks && hand->callbacks->yajl_end_map) { - _CC_CHK(hand->callbacks->yajl_end_map(hand->ctx)); - } - (void) yajl_state_pop(hand); - goto around_again; - } - default: - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = - "invalid object key (must be a string)"; - goto around_again; - } - } - case yajl_state_map_sep: { - tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, - offset, &buf, &bufLen); - switch (tok) { - case yajl_tok_colon: - yajl_state_set(hand, yajl_state_map_need_val); - goto around_again; - case yajl_tok_eof: - return yajl_status_insufficient_data; - case yajl_tok_error: - yajl_state_set(hand, yajl_state_lexical_error); - goto around_again; - default: - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = "object key and value must " - "be separated by a colon (':')"; - goto around_again; - } - } - case yajl_state_map_got_val: { - tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, - offset, &buf, &bufLen); - switch (tok) { - case yajl_tok_right_bracket: - if (hand->callbacks && hand->callbacks->yajl_end_map) { - _CC_CHK(hand->callbacks->yajl_end_map(hand->ctx)); - } - (void) yajl_state_pop(hand); - goto around_again; - case yajl_tok_comma: - yajl_state_set(hand, yajl_state_map_need_key); - goto around_again; - case yajl_tok_eof: - return yajl_status_insufficient_data; - case yajl_tok_error: - yajl_state_set(hand, yajl_state_lexical_error); - goto around_again; - default: - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = "after key and value, inside map, " - "I expect ',' or '}'"; - /* try to restore error offset */ - if (*offset >= bufLen) *offset -= bufLen; - else *offset = 0; - goto around_again; - } - } - case yajl_state_array_got_val: { - tok = yajl_lex_lex(hand->lexer, jsonText, jsonTextLen, - offset, &buf, &bufLen); - switch (tok) { - case yajl_tok_right_brace: - if (hand->callbacks && hand->callbacks->yajl_end_array) { - _CC_CHK(hand->callbacks->yajl_end_array(hand->ctx)); - } - (void) yajl_state_pop(hand); - goto around_again; - case yajl_tok_comma: - yajl_state_set(hand, yajl_state_array_need_val); - goto around_again; - case yajl_tok_eof: - return yajl_status_insufficient_data; - case yajl_tok_error: - yajl_state_set(hand, yajl_state_lexical_error); - goto around_again; - default: - yajl_state_set(hand, yajl_state_parse_error); - hand->parseError = - "after array element, I expect ',' or ']'"; - goto around_again; - } - } - } - - abort(); - return yajl_status_error; -} - -/* state stack maintenence routines */ -yajl_state -yajl_state_current(yajl_handle h) -{ - assert(yajl_buf_len(h->stateBuf) > 0); - return (yajl_state) *(yajl_buf_data(h->stateBuf) + - yajl_buf_len(h->stateBuf) - 1); -} - -void yajl_state_push(yajl_handle h, yajl_state s) -{ - unsigned char c = (unsigned char) s; - yajl_buf_append(h->stateBuf, &c, sizeof(c)); -} - -yajl_state yajl_state_pop(yajl_handle h) -{ - yajl_state s; - unsigned int len = yajl_buf_len(h->stateBuf); - /* start state is never popped */ - assert(len > 1); - s = (yajl_state) *(yajl_buf_data(h->stateBuf) + len - 1); - yajl_buf_truncate(h->stateBuf, len - 1); - return s; -} - -unsigned int yajl_parse_depth(yajl_handle h) -{ - assert(yajl_buf_len(h->stateBuf) > 0); - return (yajl_buf_len(h->stateBuf) - 1); -} - -void yajl_state_set(yajl_handle h, yajl_state state) -{ - assert(yajl_buf_len(h->stateBuf) > 0); - *(unsigned char *) (yajl_buf_data(h->stateBuf) + - yajl_buf_len(h->stateBuf) - 1) = (unsigned char) state; -} - - -// http_client.cpp -using yield::concurrency::ResponseQueue; - - -using yield::platform::File; -using yield::platform::Stat; -using yield::platform::Volume; - - -HTTPClient::HTTPClient -( - SocketAddress& peername, - TCPSocket& tcp_socket, - Configuration* configuration, - Log* error_log, - Log* trace_log -) -: TCPSocketClient( peername, configuration, error_log, trace_log ), - connection_queue( get_configuration().get_concurrency_level() ) -{ - for ( uint16_t i = 1; i < get_configuration().get_concurrency_level(); i++ ) - { - TCPSocket* dup_tcp_socket = tcp_socket.dup(); - if ( dup_tcp_socket != NULL ) - connection_queue.enqueue( *new Connection( *this, *dup_tcp_socket ) ); - } - - connection_queue.enqueue( *new Connection( *this, tcp_socket ) ); -} - -HTTPClient& -HTTPClient::create -( - const URI& absolute_uri, - Configuration* configuration, - Log* error_log, - Log* trace_log -) -{ - URI absolute_uri_with_port( absolute_uri ); - if ( absolute_uri_with_port.get_port() == 0 ) - absolute_uri_with_port.set_port( 80 ); - - return *new HTTPClient - ( - absolute_uri_with_port, - createTCPSocket( trace_log ), - configuration, - error_log, - trace_log - ); -} - -HTTPResponse& HTTPClient::GET( const URI& absolute_uri ) -{ - HTTPClient& http_client = HTTPClient::create( absolute_uri ); - - HTTPRequest* http_request = new HTTPRequest( "GET", absolute_uri ); - - HTTPResponseQueue http_response_queue; - http_request->set_response_handler( http_response_queue ); - - http_client.handle( *http_request ); - - try - { - HTTPResponse& http_response = http_response_queue.dequeue(); - HTTPClient::dec_ref( http_client ); - return http_response; - } - catch ( Exception& ) - { - HTTPClient::dec_ref( http_client ); - throw; - } -} - -void HTTPClient::handle( HTTPRequest& http_request ) -{ - Connection& connection = connection_queue.dequeue(); - connection.handle( http_request ); -} - -HTTPResponse& HTTPClient::PUT( const URI& absolute_uri, Buffer& body ) -{ - HTTPClient& http_client = HTTPClient::create( absolute_uri ); - - HTTPRequest* http_request = new HTTPRequest( "PUT", absolute_uri, &body ); - - HTTPResponseQueue http_response_queue; - http_request->set_response_handler( http_response_queue ); - - http_client.handle( *http_request ); - - try - { - HTTPResponse& http_response = http_response_queue.dequeue(); - HTTPClient::dec_ref( http_client ); - return http_response; - } - catch ( Exception& ) - { - HTTPClient::dec_ref( http_client ); - throw; - } -} - -HTTPResponse& -HTTPClient::PUT -( - const URI& absolute_uri, - const Path& body_file_path -) -{ - File* file = Volume().open( body_file_path ); - - if ( file != NULL ) - { - Stat* stbuf = file->stat(); - if ( stbuf != NULL ) - { - size_t file_size = static_cast( stbuf->get_size() ); - Stat::dec_ref( *stbuf ); - Buffer* body = new StringBuffer( file_size ); - file->read( *body ); - File::dec_ref( *file ); - return PUT( absolute_uri, *body ); - } - else - throw Exception(); - } - else - throw Exception(); -} - - -HTTPClient::Connection::Connection -( - HTTPClient& http_client, - TCPSocket& tcp_socket -) - : TCPSocketClient::Connection( tcp_socket, http_client ), - connection_queue( http_client.connection_queue ) -{ } - -void HTTPClient::Connection::handle( HTTPRequest& http_request ) -{ - aio_sendmsg( http_request.marshal(), &http_request ); -} - -void HTTPClient::Connection::onError( uint32_t error_code, void* context ) -{ - assert_single_threaded(); - - TCPSocketClient::Connection::onError( error_code, context ); - - if ( get_remaining_connect_tries() > 0 ) - { - if ( !live_http_requests.empty() ) - { - Buffers* pipelined_http_request_buffers = NULL; - queue temp_live_http_requests; - - do - { - HTTPRequest* http_request = live_http_requests.front(); - live_http_requests.pop(); - - if ( pipelined_http_request_buffers == NULL ) - pipelined_http_request_buffers = &http_request->marshal(); - else - { - Buffers& http_request_buffers = http_request->marshal(); - pipelined_http_request_buffers->extend( http_request_buffers ); - Buffers::dec_ref( http_request_buffers ); - } - - temp_live_http_requests.push( http_request ); - } while ( !live_http_requests.empty() ); - - live_http_requests = temp_live_http_requests; - - aio_sendmsg( *pipelined_http_request_buffers ); - } - } - else - { - if ( !live_http_requests.empty() ) - { - Exception* exception = new Exception( error_code ); - - do - { - HTTPRequest* http_request = live_http_requests.front(); - live_http_requests.pop(); - http_request->respond( exception->inc_ref() ); - } while ( !live_http_requests.empty() ); - - Exception::dec_ref( *exception ); - } - - reset_connect_tries(); - - connection_queue.enqueue( *this ); - } -} - -void HTTPClient::Connection::onReadCompletion( Buffer& buffer, void* context ) -{ - assert_single_threaded(); - - HTTPResponse* http_response; - Buffer* next_buffer; - while ( parse( buffer, http_response, &next_buffer ) ) - { - if ( http_response != NULL ) - { -#ifdef _DEBUG - if ( live_http_requests.empty() ) DebugBreak(); -#endif - HTTPRequest* http_request = live_http_requests.front(); - live_http_requests.pop(); - http_request->respond( *http_response ); - HTTPRequest::dec_ref( *http_request ); - } - - if ( next_buffer != NULL ) - { - aio_recv( *next_buffer ); - return; - } - } - - onReadError( 0, NULL ); -} - -void -HTTPClient::Connection::onWriteCompletion -( - size_t bytes_sent, - void* context -) -{ - assert_single_threaded(); - - if ( context != NULL ) - live_http_requests.push( static_cast( context ) ); - - connection_queue.enqueue( *this ); -} - -void HTTPClient::Connection::onWriteError( uint32_t error_code, void* context ) -{ - assert_single_threaded(); - - if ( context != NULL ) - live_http_requests.push( static_cast( context ) ); - - TCPSocketClient::Connection::onWriteError( error_code, context ); -} - - -// http_message.cpp -#ifdef _WIN32 -#include // For SYSTEMTIME -#endif - - -HTTPMessage::HTTPMessage( Buffer* body ) - : body( body ) -{ - header = new Buffers; -} - -HTTPMessage::HTTPMessage -( - Buffer& header, - const FieldOffsets& field_offsets, - Buffer* body -) - : body( body ), - field_offsets( field_offsets ), - header( new Buffers( header ) ) -{ } - -HTTPMessage::~HTTPMessage() -{ - Buffer::dec_ref( body ); - Buffers::dec_ref( header ); -} - -const char* -HTTPMessage::get_field -( - const char* name, - const char* default_value -) const -{ - Buffer& header = this->header->join(); - const char* value = get_field( header, field_offsets, name, default_value ); - Buffer::dec_ref( header ); - return value; -} - -const char* -HTTPMessage::get_field -( - Buffer& header, - const FieldOffsets& field_offsets, - const char* name, - const char* default_value -) -{ - if ( !field_offsets.empty() ) - { - uint16_t namelen = static_cast( strnlen( name, UINT16_MAX ) ); - - uint16_t field_offsets_base = field_offsets[0].first; - const char* fields_base - = static_cast( header ) + field_offsets_base; - - size_t field_offsets_size = field_offsets.size(); - - for ( uint32_t fo_i = 0; fo_i < field_offsets_size; fo_i++ ) - { - const FieldOffset& field_offset = field_offsets[fo_i]; - - if - ( - ( field_offset.second - field_offset.first ) >= namelen - && - strcmp - ( - fields_base + ( field_offset.first - field_offsets_base ), - name - ) == 0 - ) - return fields_base + ( field_offset.second - field_offsets_base ); - } - } - - return const_cast( default_value ); -} - -Time HTTPMessage::get_time_field( const char* name ) const -{ - return HTTPMessageParser::parse_http_date - ( - get_field( name, NULL ) - ); -} - -Buffers& HTTPMessage::marshal() const -{ - BufferedMarshaller buffered_marshaller; - - buffered_marshaller.write( *header ); - - if ( body != NULL ) - { - if ( get_field( "Content-Length", NULL ) == NULL ) - { - char cl[64]; -#ifdef _WIN32 - int cl_len = sprintf_s( cl, 64, "Content-Length: %u\r\n", body->size() ); -#else - int cl_len = snprintf( cl, 64, "Content-Length: %zu\r\n", body->size() ); -#endif - buffered_marshaller.write( cl, cl_len ); - } - - buffered_marshaller.write( "\r\n", 2 ); - - buffered_marshaller.write( *body ); - } - else - buffered_marshaller.write( "\r\n", 2 ); - - return buffered_marshaller.get_buffers().inc_ref(); -} - -void HTTPMessage::set_body( Buffer* body ) -{ - Buffer::dec_ref( this->body ); - this->body = body; -} - -void HTTPMessage::set_field( const char* name, const char* value ) -{ - header->push_back( name ); - header->push_back( ": ", 2 ); - header->push_back( value ); - header->push_back( "\r\n" ); -} - -void HTTPMessage::set_field( const char* name, char* value ) -{ - header->push_back( name ); - header->push_back( ": ", 2 ); - header->push_back( value ); - header->push_back( "\r\n", 2 ); -} - -void HTTPMessage::set_field( char* name, char* value ) -{ - header->push_back( name ); - header->push_back( ": ", 2 ); - header->push_back( value ); - header->push_back( "\r\n", 2 ); -} - -void HTTPMessage::set_field( const string& name, const string& value ) -{ - header->push_back( name ); - header->push_back( ": ", 2 ); - header->push_back( value ); - header->push_back( "\r\n", 2 ); -} - -void HTTPMessage::set_field( const char* name, const Time& value ) -{ - static const char* HTTPWeekDays[] - = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - - static const char* HTTPMonths[] - = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; - - char http_date[30]; - -#ifdef _WIN32 - SYSTEMTIME utc_system_time = value.as_utc_SYSTEMTIME(); - - _snprintf_s - ( - http_date, - 30, - _TRUNCATE, - "%s, %02d %s %04d %02d:%02d:%02d GMT", - HTTPWeekDays[utc_system_time.wDayOfWeek], - utc_system_time.wDay, - HTTPMonths[utc_system_time.wMonth-1], - utc_system_time.wYear, - utc_system_time.wHour, - utc_system_time.wMinute, - utc_system_time.wSecond - ); -#else - struct tm utc_struct_tm = value.as_utc_struct_tm(); - - snprintf - ( - http_date, - 30, - "%s, %02d %s %04d %02d:%02d:%02d GMT", - HTTPWeekDays[utc_struct_tm.tm_wday], - utc_struct_tm.tm_mday, - HTTPMonths[utc_struct_tm.tm_mon], - utc_struct_tm.tm_year + 1900, - utc_struct_tm.tm_hour, - utc_struct_tm.tm_min, - utc_struct_tm.tm_sec - ); -#endif - - set_field( name, http_date ); -} - - -// http_message_parser.cpp -#ifdef _WIN32 -#pragma warning( push ) -#pragma warning( disable: 4702 ) -#endif - - - - - - - - - - - - - - -namespace yield -{ - namespace ipc - { - class SubBuffer : public Buffer - { - public: - SubBuffer - ( - Buffer& parent_buffer, - size_t parent_buffer_offset, - size_t capacity, - size_t size - ) - : _capacity( capacity ), - parent_buffer( parent_buffer.inc_ref() ), - parent_buffer_offset( parent_buffer_offset ), - _size( size ) - { } - - ~SubBuffer() - { - Buffer::dec_ref( parent_buffer ); - } - - // Buffer - size_t capacity() const { return _capacity; } - - operator void*() const - { - return static_cast( parent_buffer ) + parent_buffer_offset; - } - - size_t size() const { return _size; } - void resize( size_t n ) { _size = ( n <= _capacity ? n : _capacity ); } - - private: - size_t _capacity; - Buffer& parent_buffer; - size_t parent_buffer_offset; - size_t _size; - }; - }; -}; - - -template -HTTPMessageParser::HTTPMessageParser() -{ - header = NULL; - body = NULL; -} - -template -HTTPMessageParser::~HTTPMessageParser() -{ - Buffer::dec_ref( header ); - Buffer::dec_ref( body ); -} - -template -HTTPMessageType* -HTTPMessageParser::createHTTPMessage -( - Buffer* body -) -{ - return static_cast( this ) - ->createHTTPMessage( *header, field_offsets, body ); -} - -template -size_t -HTTPMessageParser:: -get_content_length() -{ - const char* content_length_string - = HTTPMessage::get_field - ( - *header, - field_offsets, - "Content-Length", - NULL - ); - - if ( content_length_string == NULL ) - { - content_length_string - = HTTPMessage::get_field - ( - *header, - field_offsets, - "Content-length" - ); - } - - size_t content_length - = static_cast( atoi( content_length_string ) ); - - if ( content_length == 0 ) - { - const char* transfer_encoding - = HTTPMessage::get_field - ( - *header, - field_offsets, - "Transfer-Encoding", - NULL - ); - - if ( transfer_encoding != NULL ) - if ( strcmp( transfer_encoding, "chunked" ) == 0 ) - content_length = SIZE_MAX; - } - - return content_length; -} - -template -HTTPMessageType* -HTTPMessageParser:: -parse -( - const string& buffer -) -{ - Buffer* string_buffer = new StringBuffer( buffer ); - HTTPMessageType* http_message; - parse( *string_buffer, http_message ); - Buffer::dec_ref( *string_buffer ); - return http_message; -} - -template -bool -HTTPMessageParser:: -parse -( - Buffer& buffer, - HTTPMessageType*& out_http_message, - Buffer** out_next_buffer -) -{ - out_http_message = NULL; - - if ( buffer.position() < buffer.size() ) - { - if ( out_next_buffer != NULL ) - *out_next_buffer = NULL; - - if ( body == NULL ) - return parse_header( buffer, out_http_message, out_next_buffer ); - else - return parse_body( buffer, out_http_message, out_next_buffer ); - } - else if ( out_next_buffer != NULL ) - { - *out_next_buffer = new StackBuffer<1024>; - return true; - } - else - return false; -} - -template -bool -HTTPMessageParser:: -parse_body -( - Buffer& buffer, - HTTPMessageType*& out_http_message, - Buffer** out_next_buffer -) -{ -#ifdef _DEBUG - if ( header == NULL || field_offsets.empty() ) DebugBreak(); -#endif - - if ( content_length < SIZE_MAX ) // Normal body - { -#ifdef _DEBUG - if ( content_length == 0 ) DebugBreak(); - if ( &buffer != body ) DebugBreak(); - if ( body->size() >= content_length ) DebugBreak(); -#endif - - if ( body->size() == content_length ) - { - out_http_message = createHTTPMessage( body ); - reset(); - return true; - } - else if ( out_next_buffer != NULL ) - { - *out_next_buffer = &body->inc_ref(); - return true; - } - else - return false; - } - else // Chunked body - { - body->put( buffer ); - - // Variables used by Ragel - int cs; - char *p = static_cast( *body ) + body->position(), - *ps = p, - *pe = p + ( body->size() - body->position() ), - *eof = pe; - - // Variables used by machine actions; - char *chunk_data_p = NULL, *chunk_size_p = NULL; - size_t chunk_size = 0, seen_chunk_size = 0; - uint16_t field_name_offset = 0, field_value_offset = 0; - -static const char _http_chunk_parser_actions[] = { - 0, 1, 0, 1, 1, 1, 2, 1, - 3, 1, 4, 1, 5, 1, 6, 1, - 8, 1, 9, 2, 0, 6, 2, 2, - 3, 2, 7, 5 -}; - -static const char _http_chunk_parser_cond_offsets[] = { - 0, 0, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 1, 2, 3, 4, 5, - 5, 6, 7, 7, 7, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 9, - 9 -}; - -static const char _http_chunk_parser_cond_lengths[] = { - 0, 0, 0, 0, 1, 0, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 0, - 1, 1, 0, 0, 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, 1, 0, - 1 -}; - -static const short _http_chunk_parser_cond_keys[] = { - 0u, 255u, 0u, 255u, 0u, 255u, 0u, 255u, - 0u, 255u, 0u, 255u, 0u, 255u, 0u, 255u, - 0u, 255u, 0u, 255u, 0 -}; - -static const char _http_chunk_parser_cond_spaces[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0 -}; - -static const short _http_chunk_parser_key_offsets[] = { - 0, 0, 7, 15, 16, 54, 55, 70, - 72, 73, 74, 89, 93, 99, 139, 147, - 148, 154, 160, 168, 169, 173, 187, 204, - 219, 235, 256, 261, 263, 265, 272, 291, - 313, 331, 345, 362, 377, 393, 414, 419, - 421, 423, 430, 449, 471, 489, 489, 493, - 508 -}; - -static const short _http_chunk_parser_trans_keys[] = { - 48u, 49u, 57u, 65u, 70u, 97u, 102u, 13u, - 59u, 48u, 57u, 65u, 70u, 97u, 102u, 10u, - 269u, 380u, 382u, 525u, 556u, 559u, 635u, 637u, - 289u, 294u, 298u, 299u, 301u, 302u, 304u, 313u, - 321u, 346u, 350u, 378u, 512u, 544u, 545u, 550u, - 551u, 553u, 554u, 569u, 570u, 576u, 577u, 602u, - 603u, 605u, 606u, 638u, 639u, 767u, 10u, 58u, - 124u, 126u, 33u, 38u, 42u, 43u, 45u, 46u, - 48u, 57u, 65u, 90u, 94u, 122u, 13u, 32u, - 13u, 10u, 13u, 124u, 126u, 33u, 38u, 42u, - 43u, 45u, 46u, 48u, 57u, 65u, 90u, 94u, - 122u, 269u, 525u, 512u, 767u, 266u, 269u, 522u, - 525u, 512u, 767u, 269u, 314u, 380u, 382u, 525u, - 556u, 559u, 570u, 635u, 637u, 289u, 294u, 298u, - 299u, 301u, 302u, 304u, 313u, 321u, 346u, 350u, - 378u, 512u, 544u, 545u, 550u, 551u, 553u, 554u, - 569u, 571u, 576u, 577u, 602u, 603u, 605u, 606u, - 638u, 639u, 767u, 269u, 288u, 525u, 544u, 256u, - 511u, 512u, 767u, 10u, 269u, 525u, 256u, 511u, - 512u, 767u, 266u, 269u, 522u, 525u, 512u, 767u, - 13u, 59u, 48u, 57u, 65u, 70u, 97u, 102u, - 10u, 269u, 525u, 512u, 767u, 124u, 126u, 33u, - 38u, 42u, 43u, 45u, 46u, 48u, 57u, 65u, - 90u, 94u, 122u, 13u, 59u, 61u, 124u, 126u, - 33u, 38u, 42u, 43u, 45u, 46u, 48u, 57u, - 65u, 90u, 94u, 122u, 34u, 124u, 126u, 33u, - 38u, 42u, 43u, 45u, 46u, 48u, 57u, 65u, - 90u, 94u, 122u, 13u, 59u, 124u, 126u, 33u, - 38u, 42u, 43u, 45u, 46u, 48u, 57u, 65u, - 90u, 94u, 122u, 13u, 34u, 59u, 92u, 124u, - 126u, 127u, 0u, 31u, 33u, 38u, 42u, 43u, - 45u, 46u, 48u, 57u, 65u, 90u, 94u, 122u, - 34u, 92u, 127u, 0u, 31u, 13u, 59u, 34u, - 92u, 13u, 34u, 59u, 92u, 127u, 0u, 31u, - 34u, 92u, 124u, 126u, 127u, 0u, 31u, 33u, - 38u, 42u, 43u, 45u, 46u, 48u, 57u, 65u, - 90u, 94u, 122u, 13u, 34u, 59u, 61u, 92u, - 124u, 126u, 127u, 0u, 31u, 33u, 38u, 42u, - 43u, 45u, 46u, 48u, 57u, 65u, 90u, 94u, - 122u, 92u, 124u, 126u, 127u, 0u, 31u, 33u, - 38u, 42u, 43u, 45u, 46u, 48u, 57u, 65u, - 90u, 94u, 122u, 124u, 126u, 33u, 38u, 42u, - 43u, 45u, 46u, 48u, 57u, 65u, 90u, 94u, - 122u, 13u, 59u, 61u, 124u, 126u, 33u, 38u, - 42u, 43u, 45u, 46u, 48u, 57u, 65u, 90u, - 94u, 122u, 34u, 124u, 126u, 33u, 38u, 42u, - 43u, 45u, 46u, 48u, 57u, 65u, 90u, 94u, - 122u, 13u, 59u, 124u, 126u, 33u, 38u, 42u, - 43u, 45u, 46u, 48u, 57u, 65u, 90u, 94u, - 122u, 13u, 34u, 59u, 92u, 124u, 126u, 127u, - 0u, 31u, 33u, 38u, 42u, 43u, 45u, 46u, - 48u, 57u, 65u, 90u, 94u, 122u, 34u, 92u, - 127u, 0u, 31u, 13u, 59u, 34u, 92u, 13u, - 34u, 59u, 92u, 127u, 0u, 31u, 34u, 92u, - 124u, 126u, 127u, 0u, 31u, 33u, 38u, 42u, - 43u, 45u, 46u, 48u, 57u, 65u, 90u, 94u, - 122u, 13u, 34u, 59u, 61u, 92u, 124u, 126u, - 127u, 0u, 31u, 33u, 38u, 42u, 43u, 45u, - 46u, 48u, 57u, 65u, 90u, 94u, 122u, 92u, - 124u, 126u, 127u, 0u, 31u, 33u, 38u, 42u, - 43u, 45u, 46u, 48u, 57u, 65u, 90u, 94u, - 122u, 269u, 525u, 512u, 767u, 13u, 124u, 126u, - 33u, 38u, 42u, 43u, 45u, 46u, 48u, 57u, - 65u, 90u, 94u, 122u, 269u, 380u, 382u, 525u, - 556u, 559u, 635u, 637u, 289u, 294u, 298u, 299u, - 301u, 302u, 304u, 313u, 321u, 346u, 350u, 378u, - 512u, 544u, 545u, 550u, 551u, 553u, 554u, 569u, - 570u, 576u, 577u, 602u, 603u, 605u, 606u, 638u, - 639u, 767u, 0 -}; - -static const char _http_chunk_parser_single_lengths[] = { - 0, 1, 2, 1, 8, 1, 3, 2, - 1, 1, 3, 2, 4, 10, 4, 1, - 2, 4, 2, 1, 2, 2, 5, 3, - 4, 7, 3, 2, 2, 5, 5, 8, - 4, 2, 5, 3, 4, 7, 3, 2, - 2, 5, 5, 8, 4, 0, 2, 3, - 8 -}; - -static const char _http_chunk_parser_range_lengths[] = { - 0, 3, 3, 0, 15, 0, 6, 0, - 0, 0, 6, 1, 1, 15, 2, 0, - 2, 1, 3, 0, 1, 6, 6, 6, - 6, 7, 1, 0, 0, 1, 7, 7, - 7, 6, 6, 6, 6, 7, 1, 0, - 0, 1, 7, 7, 7, 0, 1, 6, - 15 -}; - -static const short _http_chunk_parser_index_offsets[] = { - 0, 0, 5, 11, 13, 37, 39, 49, - 52, 54, 56, 66, 70, 76, 102, 109, - 111, 116, 122, 128, 130, 134, 143, 155, - 165, 176, 191, 196, 199, 202, 209, 222, - 238, 250, 259, 271, 281, 292, 307, 312, - 315, 318, 325, 338, 354, 366, 367, 371, - 381 -}; - -static const char _http_chunk_parser_indicies[] = { - 1, 2, 2, 2, 0, 3, 5, 4, - 4, 4, 0, 6, 0, 7, 8, 8, - 10, 9, 9, 9, 9, 8, 8, 8, - 8, 8, 8, 9, 11, 9, 11, 9, - 11, 9, 11, 9, 0, 12, 0, 14, - 13, 13, 13, 13, 13, 13, 13, 13, - 0, 16, 17, 15, 19, 18, 20, 0, - 21, 8, 8, 8, 8, 8, 8, 8, - 8, 0, 21, 23, 22, 0, 12, 21, - 24, 23, 22, 0, 21, 14, 13, 13, - 23, 22, 22, 26, 22, 22, 13, 13, - 13, 13, 13, 13, 22, 25, 22, 25, - 22, 25, 22, 25, 22, 0, 27, 17, - 29, 30, 15, 28, 0, 31, 0, 32, - 34, 18, 33, 0, 31, 21, 35, 23, - 22, 0, 36, 37, 4, 4, 4, 0, - 38, 0, 7, 10, 9, 0, 39, 39, - 39, 39, 39, 39, 39, 39, 0, 40, - 41, 42, 39, 39, 39, 39, 39, 39, - 39, 39, 0, 44, 43, 43, 43, 43, - 43, 43, 43, 43, 0, 40, 41, 43, - 43, 43, 43, 43, 43, 43, 43, 0, - 40, 43, 46, 47, 44, 44, 0, 0, - 44, 44, 44, 44, 44, 44, 45, 48, - 47, 0, 0, 45, 40, 41, 0, 49, - 47, 45, 40, 48, 46, 47, 0, 0, - 45, 39, 47, 50, 50, 0, 0, 50, - 50, 50, 50, 50, 50, 45, 40, 39, - 46, 51, 47, 50, 50, 0, 0, 50, - 50, 50, 50, 50, 50, 45, 47, 44, - 44, 0, 0, 44, 44, 44, 44, 44, - 44, 45, 52, 52, 52, 52, 52, 52, - 52, 52, 0, 53, 54, 55, 52, 52, - 52, 52, 52, 52, 52, 52, 0, 57, - 56, 56, 56, 56, 56, 56, 56, 56, - 0, 53, 54, 56, 56, 56, 56, 56, - 56, 56, 56, 0, 53, 56, 59, 60, - 57, 57, 0, 0, 57, 57, 57, 57, - 57, 57, 58, 61, 60, 0, 0, 58, - 53, 54, 0, 62, 60, 58, 53, 61, - 59, 60, 0, 0, 58, 52, 60, 63, - 63, 0, 0, 63, 63, 63, 63, 63, - 63, 58, 53, 52, 59, 64, 60, 63, - 63, 0, 0, 63, 63, 63, 63, 63, - 63, 58, 60, 57, 57, 0, 0, 57, - 57, 57, 57, 57, 57, 58, 0, 21, - 23, 22, 0, 21, 8, 8, 8, 8, - 8, 8, 8, 8, 0, 21, 8, 8, - 23, 22, 22, 22, 22, 8, 8, 8, - 8, 8, 8, 22, 65, 22, 65, 22, - 65, 22, 65, 22, 0, 0 -}; - -static const char _http_chunk_parser_trans_targs[] = { - 0, 2, 18, 3, 18, 33, 4, 5, - 6, 11, 12, 13, 45, 6, 7, 8, - 9, 7, 8, 9, 10, 5, 11, 12, - 46, 13, 14, 15, 16, 17, 14, 47, - 15, 16, 17, 48, 19, 21, 20, 22, - 19, 21, 23, 24, 25, 26, 30, 28, - 27, 29, 31, 32, 34, 3, 33, 35, - 36, 37, 38, 42, 40, 39, 41, 43, - 44, 13 -}; - -static const char _http_chunk_parser_trans_actions[] = { - 17, 9, 9, 25, 0, 25, 0, 13, - 1, 13, 13, 19, 15, 0, 3, 5, - 22, 5, 0, 7, 0, 0, 0, 0, - 15, 0, 3, 22, 5, 22, 5, 15, - 7, 0, 7, 15, 11, 11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1 -}; - -static const char _http_chunk_parser_eof_actions[] = { - 0, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 0, 0, 0, - 0 -}; - -static const int http_chunk_parser_start = 1; -static const int http_chunk_parser_first_final = 45; -static const int http_chunk_parser_error = 0; - -static const int http_chunk_parser_en_main = 1; - - - { - cs = http_chunk_parser_start; - } - - { - int _klen; - unsigned int _trans; - short _widec; - const char *_acts; - unsigned int _nacts; - const short *_keys; - - if ( cs == 0 ) - goto _out; -_resume: - _widec = (*p); - _klen = _http_chunk_parser_cond_lengths[cs]; - _keys = _http_chunk_parser_cond_keys + (_http_chunk_parser_cond_offsets[cs]*2); - if ( _klen > 0 ) { - const short *_lower = _keys; - const short *_mid; - const short *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( _widec < _mid[0] ) - _upper = _mid - 2; - else if ( _widec > _mid[1] ) - _lower = _mid + 2; - else { - switch ( _http_chunk_parser_cond_spaces[_http_chunk_parser_cond_offsets[cs] + ((_mid - _keys)>>1)] ) { - case 0: { - _widec = (short)(256u + ((*p) - 0u)); - if ( - seen_chunk_size++ < chunk_size ) _widec += 256; - break; - } - } - break; - } - } - } - - _keys = _http_chunk_parser_trans_keys + _http_chunk_parser_key_offsets[cs]; - _trans = _http_chunk_parser_index_offsets[cs]; - - _klen = _http_chunk_parser_single_lengths[cs]; - if ( _klen > 0 ) { - const short *_lower = _keys; - const short *_mid; - const short *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( _widec < *_mid ) - _upper = _mid - 1; - else if ( _widec > *_mid ) - _lower = _mid + 1; - else { - _trans += (_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _http_chunk_parser_range_lengths[cs]; - if ( _klen > 0 ) { - const short *_lower = _keys; - const short *_mid; - const short *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( _widec < _mid[0] ) - _upper = _mid - 2; - else if ( _widec > _mid[1] ) - _lower = _mid + 2; - else { - _trans += ((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _http_chunk_parser_indicies[_trans]; - cs = _http_chunk_parser_trans_targs[_trans]; - - if ( _http_chunk_parser_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _http_chunk_parser_actions + _http_chunk_parser_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 0: - { field_name_offset = static_cast( p - ps ); } - break; - case 1: - { *p = 0; } - break; - case 2: - { field_value_offset = static_cast( p - ps ); } - break; - case 3: - { - *p = 0; - field_offsets.push_back - ( - HTTPMessage::FieldOffset - ( - field_name_offset, - field_value_offset - ) - ); - } - break; - case 4: - { chunk_size_p = p; } - break; - case 5: - { - char* chunk_size_pe = p; - chunk_size - = static_cast - ( - strtol - ( - chunk_size_p, - &chunk_size_pe, - 16 - ) - ); - } - break; - case 6: - { chunk_data_p = p; } - break; - case 7: - { chunk_size = 0; } - break; - case 8: - { {p++; goto _out; } } - break; - case 9: - { Buffer::dec_ref( *body ); reset(); return NULL; } - break; - } - } - -_again: - if ( cs == 0 ) - goto _out; - p += 1; - goto _resume; - if ( p == eof ) - { - const char *__acts = _http_chunk_parser_actions + _http_chunk_parser_eof_actions[cs]; - unsigned int __nacts = (unsigned int) *__acts++; - while ( __nacts-- > 0 ) { - switch ( *__acts++ ) { - case 9: - { Buffer::dec_ref( *body ); reset(); return NULL; } - break; - } - } - } - - _out: {} - } - - - - if ( cs != http_chunk_parser_error ) - { - body->position( body->position() + ( p - ps ) ); - - if ( body->position() < body->size() ) - { - buffer.position - ( - buffer.size() - + - body->position() - - - body->size() - ); - } - - if ( chunk_size > 0 ) - { - // Cut off the chunk size + extension + CRLF before - // the chunk data and the CRLF after - out_http_message - = createHTTPMessage - ( - new SubBuffer - ( - *body, - chunk_data_p - ps, - p - chunk_data_p - 2, - p - chunk_data_p - 2 - ) - ); - - Buffer::dec_ref( *body ); - body = new StringBuffer; - - return true; - } - else // Last chunk - { - out_http_message = createHTTPMessage( new StringBuffer ); - Buffer::dec_ref( *body ); - reset(); - return true; - } - } - else if ( out_next_buffer != NULL ) // The chunk wasn't completely parsed - { - *out_next_buffer = new StackBuffer<1024>; - return true; - } - else - return false; - } -} - -template -bool -HTTPMessageParser:: -parse_header -( - Buffer& buffer, - HTTPMessageType*& out_http_message, - Buffer** out_next_buffer -) -{ - if ( header == NULL ) - { - char *p = static_cast( buffer ) + buffer.position(); - const char *ps = p, - *pe = p + ( buffer.size() - buffer.position() ); - - if ( parse_header( &p, pe ) ) - { - header = &buffer.inc_ref(); - header->position( header->position() + ( p - ps ) ); - } - else if ( p != ps && out_next_buffer != NULL ) - { - header = new StringBuffer( buffer ); - *out_next_buffer = new StackBuffer<1024>; - return true; - } - else - return false; - } - else - { - header->put( buffer ); // header must be a StringBuffer - - char *p = static_cast( *header ) + header->position(); - const char *ps = p, - *pe = p + ( header->size() - header->position() ); - - if ( parse_header( &p, pe ) ) - header->position( header->position() + ( p - ps ) ); - else if ( p != ps && out_next_buffer != NULL ) - { - *out_next_buffer = new StackBuffer<1024>; - return true; - } - else - { - reset(); - return false; - } - } - - // Here the header has been parsed successfully and header has been - // set to the header buffer. This is a "new" reference that must be - // dec_ref'd. - - content_length = get_content_length(); - - if ( content_length == 0 ) // No body, done reading this message - { - out_http_message = createHTTPMessage(); - - if ( header->position() < header->size() && &buffer != header ) - { - // Adjust buffer.position() according to header->position() - // so that buffer can be parsed again - buffer.position - ( - buffer.size() - + - header->position() - - - header->size() - ); - } - - reset(); - - return true; - } - else if ( content_length < SIZE_MAX ) // Normal body - { - if ( header->position() < header->size() ) - { - // At least some of the body is in header - if ( header->size() - header->position() >= content_length ) - { - // All of the body is in header - out_http_message - = createHTTPMessage - ( - new SubBuffer - ( - *header, - header->position(), - content_length, - content_length - ) - ); - - header->position( header->position() + content_length ); - - if ( header->position() < header->size() && &buffer != header ) - { - buffer.position - ( - buffer.size() - + - header->position() - - - header->size() - ); - } - - reset(); - return true; - } - else if ( out_next_buffer != NULL ) - { - // Only part of the body is in header - body = new StringBuffer( content_length ); - body->put( *header ); // Copies from position() - // header and field_offsets stay set - *out_next_buffer = &body->inc_ref(); - return true; - } - else - { - reset(); - return false; - } - } - else if ( out_next_buffer != NULL ) - { - // None of the body is in header - body = new StringBuffer( content_length ); - // header and field_offsets stay set - *out_next_buffer = &body->inc_ref(); - return true; - } - else - { - reset(); - return false; - } - } - else // Chunked body - { - // header stays set - if ( header->position() == header->size() ) // header was consumed - { - if ( out_next_buffer != NULL ) - { - body = new StringBuffer; - *out_next_buffer = new StackBuffer<1024>; - return true; - } - else - { - reset(); - return false; - } - } - else if ( &buffer == header ) - { - body = new StringBuffer; - return parse_body( buffer, out_http_message, out_next_buffer ); - } - else // buffer was subsumed by header - { - body = new StringBuffer; - - // Adjust buffer.position() then parse buffer again - buffer.position - ( - buffer.size() - + - header->position() - - - header->size() - ); - - return parse_body( buffer, out_http_message, out_next_buffer ); - } - } -} - -template -bool -HTTPMessageParser:: -parse_header -( - char** inout_p, - const char* pe -) -{ - char* p = *inout_p; - const char* ps = p; // This has to be here to get the correct offsets - - if - ( - static_cast( this )-> - parse_first_header_line( &p, pe ) - ) - { - // Variables used by Ragel - int cs; - const char* eof = pe; - - // Variables used by machine actions - uint16_t field_name_offset = 0, field_value_offset = 0; - -static const char _http_field_parser_actions[] = { - 0, 1, 0, 1, 1, 1, 2, 1, - 3, 1, 4, 1, 5, 2, 2, 3 - -}; - -static const char _http_field_parser_key_offsets[] = { - 0, 0, 15, 16, 31, 33, 34, 35 -}; - -static const unsigned char _http_field_parser_trans_keys[] = { - 13u, 124u, 126u, 33u, 38u, 42u, 43u, 45u, - 46u, 48u, 57u, 65u, 90u, 94u, 122u, 10u, - 58u, 124u, 126u, 33u, 38u, 42u, 43u, 45u, - 46u, 48u, 57u, 65u, 90u, 94u, 122u, 13u, - 32u, 13u, 10u, 0 -}; - -static const char _http_field_parser_single_lengths[] = { - 0, 3, 1, 3, 2, 1, 1, 0 -}; - -static const char _http_field_parser_range_lengths[] = { - 0, 6, 0, 6, 0, 0, 0, 0 -}; - -static const char _http_field_parser_index_offsets[] = { - 0, 0, 10, 12, 22, 25, 27, 29 -}; - -static const char _http_field_parser_indicies[] = { - 1, 2, 2, 2, 2, 2, 2, 2, - 2, 0, 3, 0, 5, 4, 4, 4, - 4, 4, 4, 4, 4, 0, 7, 8, - 6, 10, 9, 11, 0, 0, 0 -}; - -static const char _http_field_parser_trans_targs[] = { - 0, 2, 3, 7, 3, 4, 5, 6, - 4, 5, 6, 1 -}; - -static const char _http_field_parser_trans_actions[] = { - 11, 0, 1, 9, 0, 3, 5, 13, - 5, 0, 7, 0 -}; - -static const char _http_field_parser_eof_actions[] = { - 0, 11, 11, 11, 11, 11, 11, 0 -}; - -static const int http_field_parser_start = 1; -static const int http_field_parser_first_final = 7; -static const int http_field_parser_error = 0; - -static const int http_field_parser_en_main = 1; - - - { - cs = http_field_parser_start; - } - - { - int _klen; - unsigned int _trans; - const char *_acts; - unsigned int _nacts; - const unsigned char *_keys; - - if ( cs == 0 ) - goto _out; -_resume: - _keys = _http_field_parser_trans_keys + _http_field_parser_key_offsets[cs]; - _trans = _http_field_parser_index_offsets[cs]; - - _klen = _http_field_parser_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_mid; - const unsigned char *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (*p) < *_mid ) - _upper = _mid - 1; - else if ( (*p) > *_mid ) - _lower = _mid + 1; - else { - _trans += (_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _http_field_parser_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_mid; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (*p) < _mid[0] ) - _upper = _mid - 2; - else if ( (*p) > _mid[1] ) - _lower = _mid + 2; - else { - _trans += ((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _http_field_parser_indicies[_trans]; - cs = _http_field_parser_trans_targs[_trans]; - - if ( _http_field_parser_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _http_field_parser_actions + _http_field_parser_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 0: - { field_name_offset = static_cast( p - ps ); } - break; - case 1: - { *p = 0; } - break; - case 2: - { field_value_offset = static_cast( p - ps ); } - break; - case 3: - { - *p = 0; - field_offsets.push_back - ( - HTTPMessage::FieldOffset - ( - field_name_offset, - field_value_offset - ) - ); - } - break; - case 4: - { {p++; goto _out; } } - break; - case 5: - { return false; } - break; - } - } - -_again: - if ( cs == 0 ) - goto _out; - p += 1; - goto _resume; - if ( p == eof ) - { - const char *__acts = _http_field_parser_actions + _http_field_parser_eof_actions[cs]; - unsigned int __nacts = (unsigned int) *__acts++; - while ( __nacts-- > 0 ) { - switch ( *__acts++ ) { - case 5: - { return false; } - break; - } - } - } - - _out: {} - } - - - - *inout_p = p; - - return cs != http_field_parser_error; - } - else - { - *inout_p = p; - - return false; - } -} - -template -Time -HTTPMessageParser::parse_http_date -( - const char* http_date -) -{ - if ( http_date != NULL && http_date[0] != 0 ) - { - // Variables used by Ragel - int cs; - const char *p = http_date, - *ps = p, - *pe = p + strnlen( http_date, UINT8_MAX ), - *eof = pe; - - // Variables used by machine actions - int hour = 0, minute = 0, second = 0; - int day = 0, month = 0, year = 0; - - -static const char _http_date_parser_actions[] = { - 0, 1, 0, 1, 1, 1, 2, 1, - 3, 1, 4, 1, 5, 1, 6, 1, - 7, 1, 8, 1, 9 -}; - -static const unsigned char _http_date_parser_key_offsets[] = { - 0, 0, 5, 6, 7, 10, 18, 20, - 21, 22, 25, 27, 28, 30, 32, 33, - 35, 37, 38, 40, 42, 43, 45, 47, - 49, 51, 53, 54, 55, 56, 57, 58, - 59, 61, 62, 64, 65, 67, 68, 69, - 70, 71, 72, 73, 74, 76, 78, 79, - 87, 89, 90, 91, 93, 95, 97, 99, - 100, 102, 104, 105, 107, 109, 110, 112, - 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 124, 126, 127, 129, 130, 132, - 133, 134, 135, 136, 137, 138, 139, 140, - 141, 142, 144, 146, 147, 155, 157, 158, - 159, 161, 162, 163, 164, 165, 166, 167, - 169, 170, 172, 173, 175, 176, 177, 178, - 179, 180, 181, 182, 183, 185, 186, 189, - 190, 191, 193, 194, 197, 198, 199, 202, - 203, 204, 207, 208 -}; - -static const char _http_date_parser_trans_keys[] = { - 70, 77, 83, 84, 87, 114, 105, 32, - 44, 100, 65, 68, 70, 74, 77, 78, - 79, 83, 112, 117, 114, 32, 32, 48, - 57, 48, 57, 32, 48, 57, 48, 57, - 58, 48, 57, 48, 57, 58, 48, 57, - 48, 57, 32, 48, 57, 48, 57, 48, - 57, 48, 57, 48, 57, 103, 101, 99, - 32, 101, 98, 97, 117, 110, 108, 110, - 97, 114, 121, 111, 118, 99, 116, 101, - 112, 32, 48, 57, 48, 57, 32, 65, - 68, 70, 74, 77, 78, 79, 83, 112, - 117, 114, 32, 48, 57, 48, 57, 48, - 57, 48, 57, 32, 48, 57, 48, 57, - 58, 48, 57, 48, 57, 58, 48, 57, - 48, 57, 32, 71, 77, 84, 103, 101, - 99, 32, 101, 98, 97, 117, 110, 108, - 110, 97, 114, 121, 111, 118, 99, 116, - 101, 112, 97, 121, 44, 32, 48, 57, - 48, 57, 45, 65, 68, 70, 74, 77, - 78, 79, 83, 112, 117, 114, 45, 48, - 57, 103, 101, 99, 45, 101, 98, 97, - 117, 110, 108, 110, 97, 114, 121, 111, - 118, 99, 116, 101, 112, 111, 110, 97, - 117, 116, 32, 44, 117, 114, 100, 104, - 117, 117, 32, 44, 114, 115, 101, 32, - 44, 115, 101, 100, 32, 44, 110, 101, - 0 -}; - -static const char _http_date_parser_single_lengths[] = { - 0, 5, 1, 1, 3, 8, 2, 1, - 1, 1, 0, 1, 0, 0, 1, 0, - 0, 1, 0, 0, 1, 0, 0, 0, - 0, 0, 1, 1, 1, 1, 1, 1, - 2, 1, 2, 1, 2, 1, 1, 1, - 1, 1, 1, 1, 0, 0, 1, 8, - 2, 1, 1, 0, 0, 0, 0, 1, - 0, 0, 1, 0, 0, 1, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 1, 2, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 1, 8, 2, 1, 1, - 0, 1, 1, 1, 1, 1, 1, 2, - 1, 2, 1, 2, 1, 1, 1, 1, - 1, 1, 1, 1, 2, 1, 3, 1, - 1, 2, 1, 3, 1, 1, 3, 1, - 1, 3, 1, 0 -}; - -static const char _http_date_parser_range_lengths[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 1, 1, 0, 1, - 1, 0, 1, 1, 0, 1, 1, 1, - 1, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 1, 1, 0, 0, - 0, 0, 0, 1, 1, 1, 1, 0, - 1, 1, 0, 1, 1, 0, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 0, 0, 0, 0, 0, - 1, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0 -}; - -static const short _http_date_parser_index_offsets[] = { - 0, 0, 6, 8, 10, 14, 23, 26, - 28, 30, 33, 35, 37, 39, 41, 43, - 45, 47, 49, 51, 53, 55, 57, 59, - 61, 63, 65, 67, 69, 71, 73, 75, - 77, 80, 82, 85, 87, 90, 92, 94, - 96, 98, 100, 102, 104, 106, 108, 110, - 119, 122, 124, 126, 128, 130, 132, 134, - 136, 138, 140, 142, 144, 146, 148, 150, - 152, 154, 156, 158, 160, 162, 164, 166, - 168, 170, 172, 175, 177, 180, 182, 185, - 187, 189, 191, 193, 195, 197, 199, 201, - 203, 205, 207, 209, 211, 220, 223, 225, - 227, 229, 231, 233, 235, 237, 239, 241, - 244, 246, 249, 251, 254, 256, 258, 260, - 262, 264, 266, 268, 270, 273, 275, 279, - 281, 283, 286, 288, 292, 294, 296, 300, - 302, 304, 308, 310 -}; - -static const unsigned char _http_date_parser_indicies[] = { - 1, 2, 3, 4, 5, 0, 6, 0, - 7, 0, 8, 9, 10, 0, 11, 12, - 13, 14, 15, 16, 17, 18, 0, 19, - 20, 0, 21, 0, 22, 0, 23, 24, - 0, 25, 0, 26, 0, 27, 0, 28, - 0, 29, 0, 30, 0, 31, 0, 32, - 0, 33, 0, 34, 0, 35, 0, 36, - 0, 37, 0, 38, 0, 39, 0, 40, - 0, 21, 0, 41, 0, 42, 0, 43, - 0, 44, 0, 21, 0, 45, 46, 0, - 21, 0, 21, 21, 0, 47, 0, 21, - 21, 0, 48, 0, 21, 0, 49, 0, - 21, 0, 50, 0, 21, 0, 51, 0, - 52, 0, 53, 0, 54, 0, 55, 56, - 57, 58, 59, 60, 61, 62, 0, 63, - 64, 0, 65, 0, 66, 0, 67, 0, - 68, 0, 69, 0, 70, 0, 71, 0, - 72, 0, 73, 0, 74, 0, 75, 0, - 76, 0, 77, 0, 78, 0, 79, 0, - 80, 0, 81, 0, 82, 0, 39, 0, - 65, 0, 83, 0, 84, 0, 85, 0, - 86, 0, 65, 0, 87, 88, 0, 65, - 0, 65, 65, 0, 89, 0, 65, 65, - 0, 90, 0, 65, 0, 91, 0, 65, - 0, 92, 0, 65, 0, 93, 0, 94, - 0, 95, 0, 96, 0, 97, 0, 98, - 0, 99, 0, 100, 101, 102, 103, 104, - 105, 106, 107, 0, 108, 109, 0, 110, - 0, 111, 0, 112, 0, 110, 0, 113, - 0, 114, 0, 115, 0, 116, 0, 110, - 0, 117, 118, 0, 110, 0, 110, 110, - 0, 119, 0, 110, 110, 0, 120, 0, - 110, 0, 121, 0, 110, 0, 122, 0, - 110, 0, 123, 0, 7, 0, 124, 123, - 0, 125, 0, 8, 9, 126, 0, 127, - 0, 10, 0, 128, 129, 0, 130, 0, - 8, 9, 131, 0, 127, 0, 132, 0, - 8, 9, 127, 0, 133, 0, 134, 0, - 8, 9, 135, 0, 131, 0, 0, 0 -}; - -static const unsigned char _http_date_parser_trans_targs[] = { - 0, 2, 114, 116, 121, 127, 3, 4, - 5, 43, 85, 6, 27, 30, 32, 35, - 37, 39, 41, 7, 26, 8, 9, 10, - 25, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 23, 24, 131, - 11, 28, 29, 9, 31, 33, 34, 36, - 38, 40, 42, 44, 45, 46, 47, 48, - 69, 72, 74, 77, 79, 81, 83, 49, - 68, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, - 65, 66, 67, 70, 71, 51, 73, 75, - 76, 78, 80, 82, 84, 86, 87, 88, - 89, 90, 91, 92, 93, 98, 101, 103, - 106, 108, 110, 112, 94, 97, 95, 96, - 54, 99, 100, 96, 102, 104, 105, 107, - 109, 111, 113, 115, 117, 118, 119, 120, - 122, 125, 123, 124, 126, 128, 129, 130 -}; - -static const char _http_date_parser_trans_actions[] = { - 19, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 11, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 9, 7, 0, 1, 0, 0, 3, 0, - 0, 5, 0, 0, 17, 0, 0, 0, - 0, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, - 11, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 17, 0, 0, 0, 0, - 1, 0, 0, 3, 0, 0, 5, 0, - 0, 0, 0, 0, 0, 13, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 0, 0, 0, 11, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 15, 0, 0, 13, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0 -}; - -static const char _http_date_parser_eof_actions[] = { - 0, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 0 -}; - -static const int http_date_parser_start = 1; -static const int http_date_parser_first_final = 131; -static const int http_date_parser_error = 0; - -static const int http_date_parser_en_main = 1; - - - { - cs = http_date_parser_start; - } - - { - int _klen; - unsigned int _trans; - const char *_acts; - unsigned int _nacts; - const char *_keys; - - if ( cs == 0 ) - goto _out; -_resume: - _keys = _http_date_parser_trans_keys + _http_date_parser_key_offsets[cs]; - _trans = _http_date_parser_index_offsets[cs]; - - _klen = _http_date_parser_single_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (*p) < *_mid ) - _upper = _mid - 1; - else if ( (*p) > *_mid ) - _lower = _mid + 1; - else { - _trans += (_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _http_date_parser_range_lengths[cs]; - if ( _klen > 0 ) { - const char *_lower = _keys; - const char *_mid; - const char *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (*p) < _mid[0] ) - _upper = _mid - 2; - else if ( (*p) > _mid[1] ) - _lower = _mid + 2; - else { - _trans += ((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _http_date_parser_indicies[_trans]; - cs = _http_date_parser_trans_targs[_trans]; - - if ( _http_date_parser_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _http_date_parser_actions + _http_date_parser_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 0: - { hour = atoi( p ); } - break; - case 1: - { minute = atoi( p ); } - break; - case 2: - { second = atoi( p ); } - break; - case 3: - { day = atoi( p ); } - break; - case 4: - { day = atoi( p ); } - break; - case 5: - { ps = p; } - break; - case 6: - { - if ( *ps == 'J' ) month = 1; - else if ( *ps == 'F' ) month = 2; - else if ( *ps == 'M' ) - { - if ( *(p+1) == 'a' ) month = 3; - else month = 5; - } - else if ( *ps == 'A' ) - { - if ( *(ps+1) == 'p' ) month = 4; - else month = 8; - } - else if ( *ps == 'J' ) - { - if ( *(ps+2) == 'n') month = 6; - else month = 7; - } - else if ( *ps == 'S' ) month = 9; - else if ( *ps == 'O' ) month = 10; - else if ( *ps == 'N' ) month = 11; - else if ( *ps == 'D' ) month = 12; - else DebugBreak(); - } - break; - case 7: - { year = atoi( p ); } - break; - case 8: - { year = atoi( p ); } - break; - case 9: - { return Time::INVALID_TIME; } - break; - } - } - -_again: - if ( cs == 0 ) - goto _out; - p += 1; - goto _resume; - if ( p == eof ) - { - const char *__acts = _http_date_parser_actions + _http_date_parser_eof_actions[cs]; - unsigned int __nacts = (unsigned int) *__acts++; - while ( __nacts-- > 0 ) { - switch ( *__acts++ ) { - case 9: - { return Time::INVALID_TIME; } - break; - } - } - } - - _out: {} - } - - - - if ( cs != http_date_parser_error ) - { - if ( year < 100 ) year += 2000; - return Time( second, minute, hour, day, month - 1, year - 1900, false ); - } - } - - return Time::INVALID_TIME; -} - -template -void HTTPMessageParser::reset() -{ - body = NULL; - content_length = 0; - field_offsets.clear(); - Buffer::dec_ref( *header ); - header = NULL; -} - -template class HTTPMessageParser; -template class HTTPMessageParser; - -#ifdef _WIN32 -#pragma warning( pop ) -#endif - - -// http_request.cpp -HTTPRequest::HTTPRequest -( - const char* method, - const char* uri, - Buffer* body -) -: HTTPMessage( body ) -{ - init( method, uri ); -} - -HTTPRequest::HTTPRequest -( - const char* method, - const URI& uri, - Buffer* body -) -: HTTPMessage( body ) -{ - init( method, uri.get_resource().c_str() ); -} - -HTTPRequest::HTTPRequest -( - Buffer& header, - uint16_t method_offset, - uint16_t uri_offset, - uint16_t http_version_offset, - const FieldOffsets& field_offsets, - Buffer* body -) - : HTTPMessage( header, field_offsets, body ), - method_offset( method_offset ), - uri_offset( uri_offset ), - http_version_offset( http_version_offset ) -{ - parsed_uri = NULL; -} - -HTTPRequest::~HTTPRequest() -{ - URI::dec_ref( parsed_uri ); -} - -double HTTPRequest::get_http_version() const -{ - const char* http_version_string - = static_cast( get_header() ) + http_version_offset; - - double http_version = atof( http_version_string ); - - if ( http_version != 0 ) - return http_version; - else - return 1.1; -} - -const char* HTTPRequest::get_method() const -{ - return static_cast( get_header() ) + method_offset; -} - -URI& HTTPRequest::get_parsed_uri() -{ - if ( parsed_uri != NULL ) - return *parsed_uri; - else - { - parsed_uri = URI::parse( get_uri() ); -#ifdef _DEBUG - if ( parsed_uri == NULL ) DebugBreak(); -#endif - return *parsed_uri; - } -} - -const char* HTTPRequest::get_uri() const -{ - return static_cast( get_header() ) + uri_offset; -} - -void HTTPRequest::init( const char* method, const char* uri ) -{ - get_header().push_back( const_cast( method ) ); - get_header().push_back( " ", 1 ); - get_header().push_back( const_cast( uri ) ); - get_header().push_back( " HTTP/1.1\r\n", 11 ); - parsed_uri = NULL; -} - -void HTTPRequest::respond( HTTPResponse& http_response ) -{ - Request::respond( http_response ); -} - -void HTTPRequest::respond( uint16_t status_code, Buffer* body ) -{ - Request::respond( *new HTTPResponse( status_code, body ) ); -} - -void HTTPRequest::respond( Exception& exception ) -{ - Request::respond( exception ); -} - - -// http_request_handler.cpp -void HTTPRequestHandler::handle( Request& request ) -{ - if ( request.get_type_id() == HTTPRequest::TYPE_ID ) - handle( static_cast( request ) ); - else - { - cerr << "HTTPRequestHandler: received non-HTTPRequest request: " << - request.get_type_name() << "." << endl; - - Request::dec_ref( request ); - } -} - - -// http_request_parser.cpp -#ifdef _WIN32 -#pragma warning( push ) -#pragma warning( disable: 4702 ) -#endif - -HTTPRequestParser::HTTPRequestParser() -{ - method_offset = 0; - uri_offset = 0; - http_version_offset = 0; -} - -HTTPRequest* -HTTPRequestParser::createHTTPMessage -( - Buffer& header, - const HTTPMessage::FieldOffsets& field_offsets, - Buffer* body -) -{ - return new HTTPRequest - ( - header, - method_offset, - uri_offset, - http_version_offset, - field_offsets, - body - ); -} - -bool -HTTPRequestParser::parse_first_header_line -( - char** inout_p, - const char* pe -) -{ - // Variables used by the Ragel parser - int cs; - char* p = *inout_p; - const char *ps = p, *eof = pe; - - // Variables used by machine actions - method_offset = 0; uri_offset = 0; http_version_offset = 0; - - -static const char _http_request_line_parser_actions[] = { - 0, 1, 0, 1, 1, 1, 2, 1, - 3, 1, 4, 1, 5, 1, 6, 1, - 7 -}; - -static const unsigned char _http_request_line_parser_key_offsets[] = { - 0, 0, 2, 6, 9, 11, 12, 13, - 14, 15, 16, 18, 21, 23, 27, 28, - 41, 47, 53, 67, 73, 79, 80, 81, - 82, 84, 85, 86, 92, 100, 107, 115, - 121, 133, 140, 142, 147, 153, 161, 167, - 175, 181, 193, 194 -}; - -static const unsigned char _http_request_line_parser_trans_keys[] = { - 65u, 90u, 0u, 32u, 65u, 90u, 42u, 47u, - 104u, 0u, 32u, 72u, 84u, 84u, 80u, 47u, - 48u, 57u, 46u, 48u, 57u, 48u, 57u, 0u, - 13u, 48u, 57u, 10u, 0u, 32u, 33u, 37u, - 61u, 63u, 95u, 36u, 59u, 64u, 90u, 97u, - 122u, 48u, 57u, 65u, 70u, 97u, 102u, 48u, - 57u, 65u, 70u, 97u, 102u, 0u, 32u, 33u, - 37u, 61u, 95u, 36u, 46u, 48u, 59u, 64u, - 90u, 97u, 122u, 48u, 57u, 65u, 70u, 97u, - 102u, 48u, 57u, 65u, 70u, 97u, 102u, 116u, - 116u, 112u, 58u, 115u, 47u, 47u, 48u, 57u, - 65u, 90u, 97u, 122u, 45u, 46u, 48u, 57u, - 65u, 90u, 97u, 122u, 45u, 48u, 57u, 65u, - 90u, 97u, 122u, 45u, 46u, 48u, 57u, 65u, - 90u, 97u, 122u, 48u, 57u, 65u, 90u, 97u, - 122u, 0u, 32u, 45u, 46u, 47u, 58u, 48u, - 57u, 65u, 90u, 97u, 122u, 45u, 48u, 57u, - 65u, 90u, 97u, 122u, 48u, 57u, 0u, 32u, - 47u, 48u, 57u, 48u, 57u, 65u, 90u, 97u, - 122u, 45u, 46u, 48u, 57u, 65u, 90u, 97u, - 122u, 48u, 57u, 65u, 90u, 97u, 122u, 45u, - 46u, 48u, 57u, 65u, 90u, 97u, 122u, 48u, - 57u, 65u, 90u, 97u, 122u, 0u, 32u, 45u, - 46u, 47u, 58u, 48u, 57u, 65u, 90u, 97u, - 122u, 58u, 0 -}; - -static const char _http_request_line_parser_single_lengths[] = { - 0, 0, 2, 3, 2, 1, 1, 1, - 1, 1, 0, 1, 0, 2, 1, 7, - 0, 0, 6, 0, 0, 1, 1, 1, - 2, 1, 1, 0, 2, 1, 2, 0, - 6, 1, 0, 3, 0, 2, 0, 2, - 0, 6, 1, 0 -}; - -static const char _http_request_line_parser_range_lengths[] = { - 0, 1, 1, 0, 0, 0, 0, 0, - 0, 0, 1, 1, 1, 1, 0, 3, - 3, 3, 4, 3, 3, 0, 0, 0, - 0, 0, 0, 3, 3, 3, 3, 3, - 3, 3, 1, 1, 3, 3, 3, 3, - 3, 3, 0, 0 -}; - -static const unsigned char _http_request_line_parser_index_offsets[] = { - 0, 0, 2, 6, 10, 13, 15, 17, - 19, 21, 23, 25, 28, 30, 34, 36, - 47, 51, 55, 66, 70, 74, 76, 78, - 80, 83, 85, 87, 91, 97, 102, 108, - 112, 122, 127, 129, 134, 138, 144, 148, - 154, 158, 168, 170 -}; - -static const char _http_request_line_parser_indicies[] = { - 1, 0, 2, 2, 3, 0, 4, 5, - 6, 0, 7, 7, 0, 8, 0, 9, - 0, 10, 0, 11, 0, 12, 0, 13, - 0, 14, 15, 0, 16, 0, 17, 17, - 16, 0, 18, 0, 7, 7, 19, 20, - 19, 21, 19, 19, 19, 19, 0, 22, - 22, 22, 0, 19, 19, 19, 0, 7, - 7, 21, 23, 21, 21, 21, 21, 21, - 21, 0, 24, 24, 24, 0, 21, 21, - 21, 0, 25, 0, 26, 0, 27, 0, - 28, 29, 0, 30, 0, 31, 0, 32, - 33, 33, 0, 34, 35, 32, 36, 36, - 0, 34, 36, 36, 36, 0, 34, 37, - 36, 36, 36, 0, 36, 33, 33, 0, - 7, 7, 38, 37, 19, 39, 33, 33, - 33, 0, 38, 33, 33, 33, 0, 40, - 0, 7, 7, 19, 40, 0, 41, 33, - 33, 0, 34, 42, 41, 36, 36, 0, - 43, 33, 33, 0, 34, 44, 43, 36, - 36, 0, 45, 33, 33, 0, 7, 7, - 34, 37, 19, 39, 45, 36, 36, 0, - 28, 0, 0, 0 -}; - -static const char _http_request_line_parser_trans_targs[] = { - 0, 2, 3, 2, 4, 15, 21, 5, - 6, 7, 8, 9, 10, 11, 12, 11, - 13, 14, 43, 15, 16, 18, 17, 19, - 20, 22, 23, 24, 25, 42, 26, 27, - 28, 32, 29, 36, 30, 31, 33, 34, - 35, 37, 38, 39, 40, 41 -}; - -static const char _http_request_line_parser_trans_actions[] = { - 15, 1, 3, 0, 5, 5, 5, 7, - 0, 0, 0, 0, 0, 9, 0, 0, - 0, 11, 13, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0 -}; - -static const char _http_request_line_parser_eof_actions[] = { - 0, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 0 -}; - -static const int http_request_line_parser_start = 1; -static const int http_request_line_parser_first_final = 43; -static const int http_request_line_parser_error = 0; - -static const int http_request_line_parser_en_main = 1; - - - { - cs = http_request_line_parser_start; - } - - { - int _klen; - unsigned int _trans; - const char *_acts; - unsigned int _nacts; - const unsigned char *_keys; - - if ( cs == 0 ) - goto _out; -_resume: - _keys = _http_request_line_parser_trans_keys + _http_request_line_parser_key_offsets[cs]; - _trans = _http_request_line_parser_index_offsets[cs]; - - _klen = _http_request_line_parser_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_mid; - const unsigned char *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (*p) < *_mid ) - _upper = _mid - 1; - else if ( (*p) > *_mid ) - _lower = _mid + 1; - else { - _trans += (_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _http_request_line_parser_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_mid; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (*p) < _mid[0] ) - _upper = _mid - 2; - else if ( (*p) > _mid[1] ) - _lower = _mid + 2; - else { - _trans += ((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _http_request_line_parser_indicies[_trans]; - cs = _http_request_line_parser_trans_targs[_trans]; - - if ( _http_request_line_parser_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _http_request_line_parser_actions + _http_request_line_parser_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 0: - { method_offset = static_cast( p - ps ); } - break; - case 1: - { *p = 0; } - break; - case 2: - { uri_offset = static_cast( p - ps ); } - break; - case 3: - { *p = 0; } - break; - case 4: - { http_version_offset = static_cast( p - ps ); } - break; - case 5: - { *p = 0; } - break; - case 6: - { {p++; goto _out; } } - break; - case 7: - { return false; } - break; - } - } - -_again: - if ( cs == 0 ) - goto _out; - p += 1; - goto _resume; - if ( p == eof ) - { - const char *__acts = _http_request_line_parser_actions + _http_request_line_parser_eof_actions[cs]; - unsigned int __nacts = (unsigned int) *__acts++; - while ( __nacts-- > 0 ) { - switch ( *__acts++ ) { - case 7: - { return false; } - break; - } - } - } - - _out: {} - } - - - - *inout_p = p; - - return cs != http_request_line_parser_error; -} - -#ifdef _WIN32 -#pragma warning( pop ) -#endif - - -// http_response.cpp -HTTPResponse::HTTPResponse( uint16_t status_code, Buffer* body ) - : HTTPMessage( body ) -{ - init( status_code ); -} - -HTTPResponse::HTTPResponse -( - Buffer& header, - const FieldOffsets& field_offsets, - uint16_t status_code, - Buffer* body -) - : HTTPMessage( header, field_offsets, body ) -{ - init( status_code ); -} - -void HTTPResponse::init( uint16_t status_code ) -{ - this->status_code = status_code; - - const char* status_line; - size_t status_line_len; - - switch ( status_code ) - { - case 100: status_line = "HTTP/1.1 100 Continue\r\n"; status_line_len = 23; break; - case 200: status_line = "HTTP/1.1 200 OK\r\n"; status_line_len = 17; break; - case 201: status_line = "HTTP/1.1 201 Created\r\n"; status_line_len = 22; break; - case 202: status_line = "HTTP/1.1 202 Accepted\r\n"; status_line_len = 23; break; - case 203: status_line = "HTTP/1.1 203 Non-Authoritative Information\r\n"; status_line_len = 44; break; - case 204: status_line = "HTTP/1.1 204 No Content\r\n"; status_line_len = 25; break; - case 205: status_line = "HTTP/1.1 205 Reset Content\r\n"; status_line_len = 28; break; - case 206: status_line = "HTTP/1.1 206 Partial Content\r\n"; status_line_len = 30; break; - case 207: status_line = "HTTP/1.1 207 Multi-Status\r\n"; status_line_len = 27; break; - case 300: status_line = "HTTP/1.1 300 Multiple Choices\r\n"; status_line_len = 31; break; - case 301: status_line = "HTTP/1.1 301 Moved Permanently\r\n"; status_line_len = 32; break; - case 302: status_line = "HTTP/1.1 302 Found\r\n"; status_line_len = 20; break; - case 303: status_line = "HTTP/1.1 303 See Other\r\n"; status_line_len = 24; break; - case 304: status_line = "HTTP/1.1 304 Not Modified\r\n"; status_line_len = 27; break; - case 305: status_line = "HTTP/1.1 305 Use Proxy\r\n"; status_line_len = 24; break; - case 307: status_line = "HTTP/1.1 307 Temporary Redirect\r\n"; status_line_len = 33; break; - case 400: status_line = "HTTP/1.1 400 Bad Request\r\n"; status_line_len = 26; break; - case 401: status_line = "HTTP/1.1 401 Unauthorized\r\n"; status_line_len = 27; break; - case 403: status_line = "HTTP/1.1 403 Forbidden\r\n"; status_line_len = 24; break; - case 404: status_line = "HTTP/1.1 404 Not Found\r\n"; status_line_len = 24; break; - case 405: status_line = "HTTP/1.1 405 Method Not Allowed\r\n"; status_line_len = 33; break; - case 406: status_line = "HTTP/1.1 406 Not Acceptable\r\n"; status_line_len = 29; break; - case 407: status_line = "HTTP/1.1 407 Proxy Authentication Required\r\n"; status_line_len = 44; break; - case 408: status_line = "HTTP/1.1 408 Request Timeout\r\n"; status_line_len = 30; break; - case 409: status_line = "HTTP/1.1 409 Conflict\r\n"; status_line_len = 23; break; - case 410: status_line = "HTTP/1.1 410 Gone\r\n"; status_line_len = 19; break; - case 411: status_line = "HTTP/1.1 411 Length Required\r\n"; status_line_len = 30; break; - case 412: status_line = "HTTP/1.1 412 Precondition Failed\r\n"; status_line_len = 34; break; - case 413: status_line = "HTTP/1.1 413 Request Entity Too Large\r\n"; status_line_len = 39; break; - case 414: status_line = "HTTP/1.1 414 Request-URI Too Long\r\n"; status_line_len = 35; break; - case 415: status_line = "HTTP/1.1 415 Unsupported Media Type\r\n"; status_line_len = 37; break; - case 416: status_line = "HTTP/1.1 416 Request Range Not Satisfiable\r\n"; status_line_len = 44; break; - case 417: status_line = "HTTP/1.1 417 Expectation Failed\r\n"; status_line_len = 33; break; - case 422: status_line = "HTTP/1.1 422 Unprocessable Entitiy\r\n"; status_line_len = 36; break; - case 423: status_line = "HTTP/1.1 423 Locked\r\n"; status_line_len = 21; break; - case 424: status_line = "HTTP/1.1 424 Failed Dependency\r\n"; status_line_len = 32; break; - case 500: status_line = "HTTP/1.1 500 Internal Server Error\r\n"; status_line_len = 36; break; - case 501: status_line = "HTTP/1.1 501 Not Implemented\r\n"; status_line_len = 30; break; - case 502: status_line = "HTTP/1.1 502 Bad Gateway\r\n"; status_line_len = 26; break; - case 503: status_line = "HTTP/1.1 503 Service Unavailable\r\n"; status_line_len = 34; break; - case 504: status_line = "HTTP/1.1 504 Gateway Timeout\r\n"; status_line_len = 30; break; - case 505: status_line = "HTTP/1.1 505 HTTP Version Not Supported\r\n"; status_line_len = 41; break; - case 507: status_line = "HTTP/1.1 507 Insufficient Storage\r\n"; status_line_len = 35; break; - default: status_line = "HTTP/1.1 500 Internal Server Error\r\n"; status_line_len = 36; break; - } - - get_header().push_back( status_line, status_line_len ); - - set_field( "Date", Time() ); -} - - -// http_response_parser.cpp -#ifdef _WIN32 -#pragma warning( push ) -#pragma warning( disable: 4702 ) -#endif - -HTTPResponseParser::HTTPResponseParser() -{ - status_code = 0; -} - -HTTPResponse* -HTTPResponseParser::createHTTPMessage -( - Buffer& header, - const HTTPMessage::FieldOffsets& field_offsets, - Buffer* body -) -{ - return new HTTPResponse( header, field_offsets, status_code, body ); -} - -bool -HTTPResponseParser::parse_first_header_line -( - char** inout_p, - const char* pe -) -{ - // Variables used by the Ragel parser - int cs; - char* p = *inout_p; - const char *ps = p, *eof = pe; - - // Variables used by machine actions - uint16_t status_code_offset = 0; - - -static const char _http_status_line_parser_actions[] = { - 0, 1, 0, 1, 1, 1, 2, 1, - 3 -}; - -static const char _http_status_line_parser_key_offsets[] = { - 0, 0, 1, 2, 3, 4, 5, 7, - 10, 12, 15, 17, 21, 26, 32, 33 -}; - -static const unsigned char _http_status_line_parser_trans_keys[] = { - 72u, 84u, 84u, 80u, 47u, 48u, 57u, 46u, - 48u, 57u, 48u, 57u, 32u, 48u, 57u, 48u, - 57u, 0u, 32u, 48u, 57u, 32u, 65u, 90u, - 97u, 122u, 13u, 32u, 65u, 90u, 97u, 122u, - 10u, 0 -}; - -static const char _http_status_line_parser_single_lengths[] = { - 0, 1, 1, 1, 1, 1, 0, 1, - 0, 1, 0, 2, 1, 2, 1, 0 -}; - -static const char _http_status_line_parser_range_lengths[] = { - 0, 0, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 2, 2, 0, 0 -}; - -static const char _http_status_line_parser_index_offsets[] = { - 0, 0, 2, 4, 6, 8, 10, 12, - 15, 17, 20, 22, 26, 30, 35, 37 -}; - -static const char _http_status_line_parser_indicies[] = { - 1, 0, 2, 0, 3, 0, 4, 0, - 5, 0, 6, 0, 7, 6, 0, 8, - 0, 9, 8, 0, 10, 0, 11, 11, - 12, 0, 13, 13, 13, 0, 14, 13, - 13, 13, 0, 15, 0, 0, 0 -}; - -static const char _http_status_line_parser_trans_targs[] = { - 0, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 11, 13, 14, 15 -}; - -static const char _http_status_line_parser_trans_actions[] = { - 7, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 3, 0, 0, 0, 5 -}; - -static const char _http_status_line_parser_eof_actions[] = { - 0, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 0 -}; - -static const int http_status_line_parser_start = 1; -static const int http_status_line_parser_first_final = 15; -static const int http_status_line_parser_error = 0; - -static const int http_status_line_parser_en_main = 1; - - - { - cs = http_status_line_parser_start; - } - - { - int _klen; - unsigned int _trans; - const char *_acts; - unsigned int _nacts; - const unsigned char *_keys; - - if ( cs == 0 ) - goto _out; -_resume: - _keys = _http_status_line_parser_trans_keys + _http_status_line_parser_key_offsets[cs]; - _trans = _http_status_line_parser_index_offsets[cs]; - - _klen = _http_status_line_parser_single_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_mid; - const unsigned char *_upper = _keys + _klen - 1; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + ((_upper-_lower) >> 1); - if ( (*p) < *_mid ) - _upper = _mid - 1; - else if ( (*p) > *_mid ) - _lower = _mid + 1; - else { - _trans += (_mid - _keys); - goto _match; - } - } - _keys += _klen; - _trans += _klen; - } - - _klen = _http_status_line_parser_range_lengths[cs]; - if ( _klen > 0 ) { - const unsigned char *_lower = _keys; - const unsigned char *_mid; - const unsigned char *_upper = _keys + (_klen<<1) - 2; - while (1) { - if ( _upper < _lower ) - break; - - _mid = _lower + (((_upper-_lower) >> 1) & ~1); - if ( (*p) < _mid[0] ) - _upper = _mid - 2; - else if ( (*p) > _mid[1] ) - _lower = _mid + 2; - else { - _trans += ((_mid - _keys)>>1); - goto _match; - } - } - _trans += _klen; - } - -_match: - _trans = _http_status_line_parser_indicies[_trans]; - cs = _http_status_line_parser_trans_targs[_trans]; - - if ( _http_status_line_parser_trans_actions[_trans] == 0 ) - goto _again; - - _acts = _http_status_line_parser_actions + _http_status_line_parser_trans_actions[_trans]; - _nacts = (unsigned int) *_acts++; - while ( _nacts-- > 0 ) - { - switch ( *_acts++ ) - { - case 0: - { status_code_offset = static_cast( p - ps ); } - break; - case 1: - { - *p = 0; - - status_code - = static_cast - ( - atoi( ps + status_code_offset ) - ); - - if ( status_code == 0 ) - return false; - } - break; - case 2: - { {p++; goto _out; } } - break; - case 3: - { return false; } - break; - } - } - -_again: - if ( cs == 0 ) - goto _out; - p += 1; - goto _resume; - if ( p == eof ) - { - const char *__acts = _http_status_line_parser_actions + _http_status_line_parser_eof_actions[cs]; - unsigned int __nacts = (unsigned int) *__acts++; - while ( __nacts-- > 0 ) { - switch ( *__acts++ ) { - case 3: - { return false; } - break; - } - } - } - - _out: {} - } - - - - *inout_p = p; - - return cs != http_status_line_parser_error; -} - -#ifdef _WIN32 -#pragma warning( pop ) -#endif - - -// http_server.cpp -using yield::platform::File; -using yield::platform::Volume; - -#ifdef _WIN32 -#include -#endif - - -HTTPServer::HTTPServer -( - EventHandler& http_request_handler, - TCPSocket& listen_tcp_socket, - AccessLog* access_log, - Log* error_log, - Log* trace_log -) - : TCPSocketServer - ( - listen_tcp_socket, - error_log, - trace_log - ), - access_log( access_log ), - http_request_handler( http_request_handler ) -{ - get_listen_tcp_socket().aio_accept( *this, NULL, new StackBuffer<1024> ); -} - -HTTPServer::~HTTPServer() -{ - EventHandler::dec_ref( http_request_handler ); -} - -HTTPServer& -HTTPServer::create -( - EventHandler& http_request_handler, - const SocketAddress& sockname, - AccessLog* access_log, - Log* error_log, - Log* trace_log -) -{ - return *new HTTPServer - ( - http_request_handler, - createListenTCPSocket( sockname, trace_log ), - access_log, - error_log, - trace_log - ); -} - - -class HTTPServer::Connection - : public TCPSocketServer::Connection, - private HTTPRequestParser, - public ResponseHandler -{ -public: - Connection( HTTPServer& http_server, TCPSocket& tcp_socket ) - : TCPSocketServer::Connection( tcp_socket, http_server ), - http_server( http_server ) - { } - - // RTTIObject - virtual const char* get_type_name() const - { - return "HTTPServer::Connection"; - } - - // TCPSocket::AIORecvCallback - virtual void onReadCompletion( Buffer& buffer, void* context ) - { - HTTPRequest* http_request; - Buffer* next_buffer; - while ( parse( buffer, http_request, &next_buffer ) ) - { - if ( http_request != NULL ) - { - http_request->set_response_handler( *this ); - http_server.http_request_handler.handle( *http_request ); - } - - if ( next_buffer != NULL ) - { - aio_recv( *next_buffer ); - return; - } - } - - onReadError( 0, NULL ); - } - - // ResponseHandler - virtual void handle( Response& response ) - { - if ( response.get_type_id() == HTTPResponse::TYPE_ID ) - { - HTTPResponse& http_response = static_cast( response ); - Buffers& buffers = http_response.marshal(); - HTTPResponse::dec_ref( http_response ); - aio_sendmsg( buffers ); - } - else - DebugBreak(); - } - -private: - HTTPServer& http_server; -}; - - -void -HTTPServer::onAcceptCompletion -( - TCPSocket& accepted_tcp_socket, - void* context, - Buffer* recv_buffer -) -{ - Connection* connection = new Connection( *this, accepted_tcp_socket ); - connection->onReadCompletion( *recv_buffer, NULL ); - - get_listen_tcp_socket().aio_accept( *this, NULL, new StackBuffer<1024> ); -} - - -HTTPServer::AccessLog::AccessLog( Format& format ) - : format( format ) -{ } - -HTTPServer::AccessLog::~AccessLog() -{ - delete &format; -} - - -string -HTTPServer::AccessLog::CombinedFormat::operator() -( - const HTTPRequest& http_request, - const HTTPResponse& http_response -) const -{ - string common_entry - = CommonFormat::operator()( http_request, http_response ); - - return common_entry; -} - - -string -HTTPServer::AccessLog::CommonFormat::operator() -( - const HTTPRequest& http_request, - const HTTPResponse& http_response -) const -{ - string client_ip; - { - SocketAddress* peername = SocketAddress::getaddrinfo( "127.0.0.1" ); - if ( peername != NULL ) - { - if ( !peername->getnameinfo( client_ip ) ) - client_ip = "-"; - SocketAddress::dec_ref( *peername ); - } - else - client_ip = "-"; - } - - char request_creation_time[32]; - { - static const char* Months[] - = { - "Jan", "Feb", "Mar", "Apr", "May", "Jun", - "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" - }; - -#ifdef _WIN32 - SYSTEMTIME local_system_time = http_request.get_creation_time(); - TIME_ZONE_INFORMATION time_zone_information; - GetTimeZoneInformation( &time_zone_information ); - - // 10/Oct/2000:13:55:36 -0700 - _snprintf_s - ( - request_creation_time, - 32, - _TRUNCATE, - "[%02d/%s/%04d:%02d:%02d:%02d %+0.4d]", - local_system_time.wDay, - Months[local_system_time.wMonth-1], - local_system_time.wYear, - local_system_time.wHour, - local_system_time.wMinute, - local_system_time.wSecond, - ( time_zone_information.Bias / 60 ) * -100 - ); -#else - struct tm local_tm = Time(); - - snprintf - ( - request_creation_time, - 32, - "[%02d/%s/%04d:%02d:%02d:%02d %d]", - local_tm.tm_mday, - Months[local_tm.tm_mon], - local_tm.tm_year + 1900, - local_tm.tm_hour, - local_tm.tm_min, - local_tm.tm_sec, - 0 - ); -#endif - } - - const char* request_http_version; - if ( http_request.get_http_version() == 1.0 ) - request_http_version = "1.0"; - else if ( http_request.get_http_version() == 1.1 ) - request_http_version = "1.1"; - else - DebugBreak(); - - ostringstream entry; - entry << client_ip << " "; - entry << "- "; // RFC 1413 identity - entry << "- "; // HTTP auth userid - entry << request_creation_time << " "; - entry << "\""; - entry << http_request.get_method() << " "; - entry << http_request.get_uri() << " "; - entry << "HTTP/" << request_http_version; - entry << "\" "; - entry << http_response.get_status_code() << " "; - if ( http_response.get_body() != NULL ) - entry << http_response.get_body()->size(); - else - entry << "-"; - entry << "\r\n"; - - return entry.str(); -} - - -class HTTPServer::ostreamAccessLog : public AccessLog -{ -public: - ostreamAccessLog( ostream& os, Format& format ) - : AccessLog( format ), os( os ) - { } - - // AccessLog - void - write - ( - const HTTPRequest& http_request, - const HTTPResponse& http_response - ) - { - string entry = get_format()( http_request, http_response ); - os << entry; - } - -private: - ostream& os; -}; - -HTTPServer::AccessLog& -HTTPServer::AccessLog::open -( - ostream& os, - Format* format -) -{ - if ( format == NULL ) - format = new CombinedFormat; - - return *new ostreamAccessLog( os, *format ); -} - - -class HTTPServer::FileAccessLog : public AccessLog -{ -public: - FileAccessLog( File& file, Format& format ) - : AccessLog( format ), file( &file ) - { } - - FileAccessLog( const Path& file_path, Format& format ) // Lazy open - : AccessLog( format ), file_path( file_path ) - { } - - ~FileAccessLog() - { - File::dec_ref( file ); - } - - // AccessLog - void - write - ( - const HTTPRequest& http_request, - const HTTPResponse& http_response - ) - { - if ( file == NULL ) // Lazy open - { - file = Volume().open( file_path, O_CREAT|O_WRONLY|O_APPEND ); - if ( file == NULL ) - return; - } - - string entry = get_format()( http_request, http_response ); - - file->write( entry.c_str(), entry.size() ); - } - -private: - File* file; - Path file_path; -}; - -HTTPServer::AccessLog& -HTTPServer::AccessLog::open -( - const Path& file_path, - Format* format, - bool lazy_open -) -{ - if ( format == NULL ) - format = new CombinedFormat; - - if ( file_path.empty() || file_path == "-" ) - return *new ostreamAccessLog( cout, *format ); - else if ( lazy_open ) - return *new FileAccessLog( file_path, *format ); - else - { - File* file = Volume().open( file_path, O_CREAT|O_WRONLY|O_APPEND ); - if ( file != NULL ) - return *new FileAccessLog( *file, *format ); - else - throw Exception(); - } -} - - -// https_client.cpp -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -HTTPSClient::HTTPSClient -( - SocketAddress& peername, - SSLSocket& ssl_socket, - Configuration* configuration, - Log* error_log, - Log* trace_log -) - : HTTPClient( peername, ssl_socket, configuration, error_log, trace_log ) -{ } - -HTTPSClient& -HTTPSClient::create -( - const URI& absolute_uri, - Configuration* configuration, - Log* error_log, - Log* trace_log, - SSLContext* ssl_context -) -{ - URI absolute_uri_with_port( absolute_uri ); - if ( absolute_uri_with_port.get_port() == 0 ) - absolute_uri_with_port.set_port( 443 ); - - return *new HTTPSClient - ( - absolute_uri_with_port, - SSLSocketClient::createSSLSocket( ssl_context, trace_log ), - configuration, - error_log, - trace_log - ); -} - -#endif - - -// https_server.cpp -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -HTTPSServer::HTTPSServer -( - EventHandler& http_request_handler, - SSLSocket& listen_ssl_socket, - AccessLog* access_log, - Log* error_log, - Log* trace_log -) -: HTTPServer - ( - http_request_handler, - listen_ssl_socket, - access_log, - error_log, - trace_log - ) -{ } - -HTTPSServer& -HTTPSServer::create -( - EventHandler& http_request_handler, - const SocketAddress& sockname, - SSLContext& ssl_context, - AccessLog* access_log, - Log* error_log, - Log* trace_log -) -{ - return *new HTTPSServer - ( - http_request_handler, - SSLSocketServer::createListenSSLSocket - ( - sockname, - ssl_context, - trace_log - ), - access_log, - error_log, - trace_log - ); -} - -#endif - - -// json_marshaller.cpp -extern "C" -{ -}; - - -JSONMarshaller::JSONMarshaller() -{ - buffer = new StringBuffer; - writer = yajl_gen_alloc( NULL ); -} - -JSONMarshaller::~JSONMarshaller() -{ - Buffer::dec_ref( *buffer ); -} - -void JSONMarshaller::flushYAJLBuffer() -{ - const unsigned char* buffer; - unsigned int len; - yajl_gen_get_buf( writer, &buffer, &len ); - this->buffer->put( buffer, len ); - yajl_gen_clear( writer ); -} - -void JSONMarshaller::write( const Key& key, bool value ) -{ - write( key ); - yajl_gen_bool( writer, static_cast( value ) ); - flushYAJLBuffer(); -} - -void JSONMarshaller::write( const Key& key, double value ) -{ - write( key ); - yajl_gen_double( writer, value ); - flushYAJLBuffer(); -} - -void JSONMarshaller::write( const Key& key, int64_t value ) -{ - write( key ); - yajl_gen_integer( writer, static_cast( value ) ); - flushYAJLBuffer(); -} - -void JSONMarshaller::write( const JSONRPCRequest& json_rpc_request ) -{ - yajl_gen_map_open( writer ); - - in_map_stack.push( true ); - json_rpc_request.marshal( *this ); - in_map_stack.pop(); - - yajl_gen_map_close( writer ); - - flushYAJLBuffer(); -} - -void JSONMarshaller::write( const JSONRPCResponse& json_rpc_response ) -{ - yajl_gen_map_open( writer ); - - in_map_stack.push( true ); - json_rpc_response.marshal( *this ); - in_map_stack.pop(); - - yajl_gen_map_close( writer ); - - flushYAJLBuffer(); -} - -void JSONMarshaller::write( const char* key, const JSONValue& json_value ) -{ - write( StringLiteralKey( key ), json_value ); -} - -void JSONMarshaller::write( const Key& key, const JSONValue& json_value ) -{ - switch ( json_value.get_type() ) - { - case JSONValue::TYPE_ARRAY: - { - const JSONArray& json_array - = static_cast( json_value ); - - for - ( - JSONArray::const_iterator i = json_array.begin(); - i != json_array.end(); - ++i - ) - write( Key(), **i ); - } - break; - - case JSONValue::TYPE_FALSE: write( key, false ); break; - case JSONValue::TYPE_NULL: write_null( key ); break; - - case JSONValue::TYPE_NUMBER: - { - write - ( - key, - static_cast( static_cast( json_value ) ) - ); - } - break; - - case JSONValue::TYPE_OBJECT: - { - const JSONObject& json_object - = static_cast( json_value ); - - for - ( - JSONObject::const_iterator i = json_object.begin(); - i != json_object.end(); - ++i - ) - write( StringKey( *i->first, i->first->size() ), *i->second ); - } - break; - - case JSONValue::TYPE_TRUE: write( key, true ); break; - - case JSONValue::TYPE_STRING: - { - write - ( - key, - static_cast - ( - static_cast( json_value ) - ), - static_cast( json_value ).size() - ); - } - break; - } -} - -void JSONMarshaller::write( const Key& key ) -{ - if ( in_map_stack.empty() || in_map_stack.top() ) - { - Key::Type key_type = key.get_type(); - if ( key_type == Key::TYPE_DOUBLE ) - yajl_gen_double( writer, static_cast( key ) ); - else if ( key_type == Key::TYPE_INT32 ) - yajl_gen_integer( writer, static_cast( key ) ); - else if ( key_type == Key::TYPE_INT64 ) - { - yajl_gen_integer - ( - writer, - static_cast( static_cast( key ) ) - ); - } - else if ( key_type == Key::TYPE_STRING ) - { - yajl_gen_string - ( - writer, - reinterpret_cast - ( - static_cast( key ).c_str() - ), - static_cast( key ).size() - ); - } - else if ( key_type == Key::TYPE_STRING_LITERAL ) - { - yajl_gen_string - ( - writer, - reinterpret_cast - ( - static_cast - ( - static_cast( key ) - ) - ), - strnlen( static_cast( key ), UINT16_MAX ) - ); - } - } -} - -void JSONMarshaller::write( const Key& key, const MarshallableObject& value ) -{ - write_object( key, &value ); -} - -void JSONMarshaller::write( const Key& key, const Sequence& value ) -{ - write_array( key, &value ); -} - -void -JSONMarshaller::write -( - const Key& key, - const char* value, - size_t value_len -) -{ - write( key ); - - yajl_gen_string - ( - writer, - reinterpret_cast( value ), - static_cast( value_len ) - ); - - flushYAJLBuffer(); -} - -void -JSONMarshaller::write_array -( - const char* key, - const MarshallableObject* value -) -{ - write_array( StringLiteralKey( key ), value ); -} - -void -JSONMarshaller::write_array -( - const Key& key, - const MarshallableObject* value -) -{ - write( key ); - write_array( value ); -} - -void JSONMarshaller::write_array( const MarshallableObject* value ) -{ - yajl_gen_array_open( writer ); - - if ( value != NULL ) - { - in_map_stack.push( false ); - value->marshal( *this ); - in_map_stack.pop(); - } - - yajl_gen_array_close( writer ); - - flushYAJLBuffer(); -} - -void JSONMarshaller::write_null( const char* key ) -{ - write_null( StringLiteralKey( key ) ); -} - -void JSONMarshaller::write_null( const Key& key ) -{ - write( key ); - yajl_gen_null( writer ); - flushYAJLBuffer(); -} - -void -JSONMarshaller::write_object -( - const char* key, - const MarshallableObject* value -) -{ - write_object( StringLiteralKey( key ), value ); -} - -void -JSONMarshaller::write_object -( - const Key& key, - const MarshallableObject* value -) -{ - write( key ); - write( value ); -} - -void JSONMarshaller::write_object( const MarshallableObject* value ) -{ - yajl_gen_map_open( writer ); - - if ( value != NULL ) - { - in_map_stack.push( true ); - value->marshal( *this ); - in_map_stack.pop(); - } - - yajl_gen_map_close( writer ); - - flushYAJLBuffer(); -} - - -// json_parser.cpp -using yield::platform::StringBuffer; - -extern "C" -{ -}; - - -JSONParser::JSONParser() -{ - buffer = NULL; - - JSONfalse = new JSONValue( JSONValue::TYPE_FALSE ); - JSONnull = new JSONValue( JSONValue::TYPE_NULL ); - JSONtrue = new JSONValue( JSONValue::TYPE_TRUE ); - - static yajl_callbacks JSONParser_yajl_callbacks - = { - handle_yajl_null, - handle_yajl_boolean, - handle_yajl_integer, - handle_yajl_double, - NULL, - handle_yajl_string, - handle_yajl_start_map, - handle_yajl_map_key, - handle_yajl_end_map, - handle_yajl_start_array, - handle_yajl_end_array - }; - - reader = yajl_alloc( &JSONParser_yajl_callbacks, NULL, this ); -} - -JSONParser::~JSONParser() -{ - Buffer::dec_ref( buffer ); - JSONValue::dec_ref( *JSONfalse ); - JSONValue::dec_ref( *JSONnull ); - JSONValue::dec_ref( *JSONtrue ); - yajl_free( reader ); -} - -void JSONParser::handleJSONValue( JSONValue& json_value ) -{ - if ( !json_value_stack.empty() ) - { - switch ( json_value_stack.top()->get_type() ) - { - case JSONValue::TYPE_ARRAY: - { - static_cast( json_value_stack.top() )-> - push_back( &json_value ); - } - break; - - case JSONValue::TYPE_OBJECT: - { -#ifdef _DEBUG - if ( next_map_key == NULL ) DebugBreak(); -#endif - static_cast( json_value_stack.top() )-> - push_back( make_pair( next_map_key, &json_value ) ); - next_map_key = NULL; - } - break; - - default: DebugBreak(); - } - } - else - json_value_stack.push( &json_value ); -} - -int JSONParser::handle_yajl_boolean( void* this__, int value ) -{ - JSONParser* this_ = static_cast( this__ ); - - if ( value ) - this_->handleJSONValue( this_->JSONtrue->inc_ref() ); - else - this_->handleJSONValue( this_->JSONfalse->inc_ref() ); - - return 1; -} - -int JSONParser::handle_yajl_double( void* this__, double value ) -{ - JSONParser* this_ = static_cast( this__ ); - this_->handleJSONValue( *new JSONNumber( value ) ); - return 1; -} - -int JSONParser::handle_yajl_end_array( void* this__ ) -{ - JSONParser* this_ = static_cast( this__ ); -#ifdef _DEBUG - if ( this_->json_value_stack.top()->get_type() != JSONValue::TYPE_ARRAY ) - DebugBreak(); -#endif - this_->json_value_stack.pop(); - return 1; -} - -int JSONParser::handle_yajl_end_map( void* this__ ) -{ - JSONParser* this_ = static_cast( this__ ); -#ifdef _DEBUG - if ( this_->json_value_stack.top()->get_type() != JSONValue::TYPE_OBJECT ) - DebugBreak(); -#endif - this_->json_value_stack.pop(); - return 1; -} - -int JSONParser::handle_yajl_integer( void* this__, long value ) -{ - JSONParser* this_ = static_cast( this__ ); - this_->handleJSONValue( *new JSONNumber( value ) ); - return 1; -} - -int JSONParser::handle_yajl_map_key -( - void* this__, - const unsigned char* map_key, - unsigned int map_key_len -) -{ - JSONParser* this_ = static_cast( this__ ); - this_->next_map_key = new JSONString( *this_->buffer, map_key, map_key_len ); - return 1; -} - -int JSONParser::handle_yajl_null( void* this__ ) -{ - JSONParser* this_ = static_cast( this__ ); - this_->handleJSONValue( this_->JSONnull->inc_ref() ); - return 1; -} - -int JSONParser::handle_yajl_start_array( void* this__ ) -{ - JSONParser* this_ = static_cast( this__ ); - JSONArray* json_array = new JSONArray; - this_->handleJSONValue( *json_array ); - this_->json_value_stack.push( json_array ); - return 1; -} - -int JSONParser::handle_yajl_start_map( void* this__ ) -{ - JSONParser* this_ = static_cast( this__ ); - JSONObject* json_object = new JSONObject; - this_->handleJSONValue( *json_object ); - this_->json_value_stack.push( json_object ); - return 1; -} - -int JSONParser::handle_yajl_string -( - void* this__, - const unsigned char* buffer, - unsigned int len -) -{ - JSONParser* this_ = static_cast( this__ ); - this_->handleJSONValue( *new JSONString( *this_->buffer, buffer, len ) ); - return 1; -} - -JSONValue* JSONParser::parse( Buffer& buffer ) -{ - if ( this->buffer == NULL ) - this->buffer = &buffer.inc_ref(); - else - this->buffer->put( buffer ); - - const unsigned char* json_text = *this->buffer; - unsigned int json_text_len = this->buffer->size(); - - next_map_key = NULL; - yajl_status yajl_parse_status = yajl_parse( reader, json_text, json_text_len ); - - if ( yajl_parse_status == yajl_status_ok ) - { - Buffer::dec_ref( this->buffer ); - this->buffer = NULL; - - if ( !json_value_stack.empty() ) - { -#ifdef _DEBUG - if ( json_value_stack.size() > 1 ) DebugBreak(); -#endif - JSONValue* json_value = json_value_stack.top(); - json_value_stack.pop(); - return json_value; - } - else - return new JSONObject; - } - else if ( yajl_parse_status == yajl_status_insufficient_data ) - { - if ( this->buffer == &buffer ) - { - this->buffer = new StringBuffer; - this->buffer->put( buffer ); - } - - return NULL; - } - else - { - //unsigned char* yajl_error_str - // = yajl_get_error( reader, 1, json_text, json_text_len ); - //ostringstream what; - //what << __FILE__ << ":" << __LINE__ << ": JSON parsing error: " - // << reinterpret_cast( yajl_error_str ) << endl; - //yajl_free_error( yajl_error_str ); - return NULL; - } -} - - -// json_rpc_client.cpp -#ifdef _WIN32 -#include -#define ESHUTDOWN WSAESHUTDOWN -#endif - - -JSONRPCClient::JSONRPCClient -( - MessageFactory& message_factory, - SocketAddress& peername, - const URI& post_uri, - TCPSocket& tcp_socket, - Configuration* configuration, - Log* error_log, - Log* trace_log -) - : RPCClient( message_factory ), - TCPSocketClient - ( - peername, - configuration, - error_log, - trace_log - ), - connection_queue( get_configuration().get_concurrency_level() ) -{ - this->post_uri = new URI( post_uri ); - - for ( uint16_t i = 1; i < get_configuration().get_concurrency_level(); i++ ) - { - TCPSocket* dup_tcp_socket = tcp_socket.dup(); - if ( dup_tcp_socket != NULL ) - connection_queue.enqueue( *new Connection( *this, *dup_tcp_socket ) ); - } - - connection_queue.enqueue( *new Connection( *this, tcp_socket ) ); -} - -JSONRPCClient::~JSONRPCClient() -{ - delete post_uri; -} - -JSONRPCClient& -JSONRPCClient::create -( - const URI& absolute_uri, - MessageFactory& message_factory, - Configuration* configuration, - Log* error_log, - Log* trace_log -) -{ - return *new JSONRPCClient - ( - message_factory, - absolute_uri, - absolute_uri, - createTCPSocket( trace_log ), - configuration, - error_log, - trace_log - ); -} - -void JSONRPCClient::handle( Request& request ) -{ - JSONRPCRequest* json_rpc_request; - - switch ( request.get_type_id() ) - { - case JSONRPCRequest::TYPE_ID: - { - json_rpc_request = static_cast( &request ); - } - break; - - default: - { - HTTPRequest* http_request = new HTTPRequest( "POST", *post_uri ); - json_rpc_request - = new JSONRPCRequest - ( - request.inc_ref(), - *http_request, - *new JSONNumber( request.get_type_id() ) - ); - json_rpc_request - ->set_response_handler( new RPCResponseHandler( request ) ); - } - break; - } - - Connection& connection = connection_queue.dequeue(); - connection.handle( *json_rpc_request ); -} - - -JSONRPCClient::Connection::Connection -( - JSONRPCClient& json_rpc_client, - TCPSocket& tcp_socket -) - : TCPSocketClient::Connection( tcp_socket, json_rpc_client ), - JSONRPCResponseParser( json_rpc_client.get_message_factory() ), - connection_queue( json_rpc_client.connection_queue ) -{ } - -void JSONRPCClient::Connection::handle( JSONRPCRequest& json_rpc_request ) -{ - aio_sendmsg( json_rpc_request.marshal(), &json_rpc_request ); -} - -void JSONRPCClient::Connection::onError( uint32_t error_code, void* context ) -{ - assert_single_threaded(); - - TCPSocketClient::Connection::onError( error_code, context ); - - if ( error_code != ESHUTDOWN && get_remaining_connect_tries() > 0 ) - { - if ( !live_json_rpc_requests.empty() ) - { - Buffers* pipelined_json_rpc_request_buffers = NULL; - queue temp_live_json_rpc_requests; - - do - { - JSONRPCRequest* json_rpc_request = live_json_rpc_requests.front(); - live_json_rpc_requests.pop(); - - if ( pipelined_json_rpc_request_buffers == NULL ) - pipelined_json_rpc_request_buffers = &json_rpc_request->marshal(); - else - { - Buffers& json_rpc_request_buffers = json_rpc_request->marshal(); - pipelined_json_rpc_request_buffers->extend( json_rpc_request_buffers ); - Buffers::dec_ref( json_rpc_request_buffers ); - } - - temp_live_json_rpc_requests.push( json_rpc_request ); - } while ( !live_json_rpc_requests.empty() ); - - live_json_rpc_requests = temp_live_json_rpc_requests; - - aio_sendmsg( *pipelined_json_rpc_request_buffers ); - } - } - else - { - if ( !live_json_rpc_requests.empty() ) - { - Exception* exception = new Exception( error_code ); - - do - { - JSONRPCRequest* json_rpc_request = live_json_rpc_requests.front(); - live_json_rpc_requests.pop(); - json_rpc_request->respond( exception->inc_ref() ); - } while ( !live_json_rpc_requests.empty() ); - - Exception::dec_ref( *exception ); - } - - reset_connect_tries(); - - connection_queue.enqueue( *this ); - } -} - -void -JSONRPCClient::Connection::onReadCompletion -( - Buffer& buffer, - void* context -) -{ - assert_single_threaded(); - - HTTPResponse* http_response; - Buffer* next_buffer; - while ( HTTPResponseParser::parse( buffer, http_response, &next_buffer ) ) - { - if ( http_response != NULL ) - { -#ifdef _DEBUG - if ( live_json_rpc_requests.empty() ) DebugBreak(); -#endif - JSONRPCRequest* json_rpc_request = live_json_rpc_requests.front(); - live_json_rpc_requests.pop(); - - JSONRPCResponse* json_rpc_response - = JSONRPCResponseParser::parse( *http_response, *json_rpc_request ); - - if ( json_rpc_response != NULL ) - json_rpc_request->respond( *json_rpc_response ); - else - HTTPResponse::dec_ref( *http_response); - - JSONRPCRequest::dec_ref( *json_rpc_request ); - } - - if ( next_buffer != NULL ) - { - aio_recv( *next_buffer ); - return; - } - } - - onReadError( 0, NULL ); -} - -void -JSONRPCClient::Connection::onWriteCompletion -( - size_t bytes_sent, - void* context -) -{ - assert_single_threaded(); - - if ( context != NULL ) - live_json_rpc_requests.push( static_cast( context ) ); - - connection_queue.enqueue( *this ); -} - -void -JSONRPCClient::Connection::onWriteError -( - uint32_t error_code, - void* context -) -{ - assert_single_threaded(); - - if ( context != NULL ) - live_json_rpc_requests.push( static_cast( context ) ); - - TCPSocketClient::Connection::onWriteError( error_code, context ); -} - - -// json_rpc_request.cpp -JSONRPCRequest::JSONRPCRequest -( - Request& body, - HTTPRequest& http_request, - JSONValue& id -) -: RPCRequest( body ), - JSONRPCMessage( id ), - http_request( http_request ) -{ } - -JSONRPCRequest::~JSONRPCRequest() -{ - HTTPRequest::dec_ref( http_request ); -} - -Buffers& JSONRPCRequest::marshal() const -{ - JSONMarshaller json_marshaller; - json_marshaller.write( *this ); - http_request.set_body( &json_marshaller.get_buffer().inc_ref() ); - return http_request.marshal(); -} - -void JSONRPCRequest::marshal( JSONMarshaller& json_marshaller ) const -{ - static_cast( json_marshaller ).write - ( - "method", - get_body().get_type_name() - ); - - json_marshaller.write_array( "params", &get_body() ); - json_marshaller.write( "id", get_id() ); -} - -void JSONRPCRequest::respond( JSONRPCResponse& response ) -{ - Request::respond( response ); -} - -void JSONRPCRequest::respond( Response& response ) -{ - HTTPResponse* http_response = new HTTPResponse; - JSONRPCResponse* json_rpc_response - = new JSONRPCResponse( response, *http_response, get_id().inc_ref() ); - Request::respond( *json_rpc_response ); -} - - -// json_rpc_request_handler.cpp -void JSONRPCRequestHandler::handle( Request& request ) -{ - if ( request.get_type_id() == JSONRPCRequest::TYPE_ID ) - handle( static_cast( request ) ); - else - { - cerr << "JSONRPCRequestHandler: received non-JSONRPCRequest request: " << - request.get_type_name() << "." << endl; - - Request::dec_ref( request ); - } -} - - -// json_rpc_request_parser.cpp -JSONRPCRequestParser::JSONRPCRequestParser( MessageFactory& message_factory ) - : JSONRPCMessageParser( message_factory ) -{ } - -JSONRPCRequest* JSONRPCRequestParser::parse( HTTPRequest& http_request ) -{ - if ( http_request.get_body() != NULL ) - return parse( *http_request.get_body(), http_request.inc_ref() ); - else - return NULL; -} - -JSONRPCRequest* -JSONRPCRequestParser::parse -( - Buffer& buffer, - HTTPRequest& http_request -) -{ - JSONValue* json_value = JSONParser().parse( buffer ); - if - ( - json_value != NULL - && - json_value->get_type() == JSONValue::TYPE_OBJECT - ) - { - JSONObject* json_object = static_cast( json_value ); - - JSONValue* method = ( *json_object )["method"]; - JSONValue* params = ( *json_object )["params"]; - JSONValue* id = ( *json_object )["id"]; - - if - ( - method != NULL - && - method->get_type() == JSONValue::TYPE_STRING - && - params != NULL - && - params->get_type() == JSONValue::TYPE_ARRAY - && - id != NULL - ) - { - Request* body - = get_message_factory().createRequest - ( - static_cast( *method ), - static_cast( method )->size() - ); - - if ( body != NULL ) - { - JSONUnmarshaller json_unmarshaller( *params ); - body->unmarshal( json_unmarshaller ); - return new JSONRPCRequest( *body, http_request, *id ); - } - } - } - - HTTPRequest::dec_ref( http_request ); - JSONValue::dec_ref( json_value ); - - return NULL; -} - - -// json_rpc_response.cpp -JSONRPCResponse::JSONRPCResponse -( - Response& body, // Steals this reference - HTTPResponse& http_response, // Steals this reference - JSONValue& id // Steals this reference -) - : RPCResponse( body ), - JSONRPCMessage( id ), - http_response( http_response ) -{ } - -JSONRPCResponse::~JSONRPCResponse() -{ - HTTPResponse::dec_ref( http_response ); -} - -Buffers& JSONRPCResponse::marshal() const -{ - JSONMarshaller json_marshaller; - json_marshaller.write( *this ); - http_response.set_body( &json_marshaller.get_buffer().inc_ref() ); - return http_response.marshal(); -} - -void JSONRPCResponse::marshal( JSONMarshaller& json_marshaller ) const -{ - if ( get_body().is_exception() ) - { - json_marshaller.write_null( "result" ); - json_marshaller.write_object( "error", &get_body() ); - } - else - { - json_marshaller.write_object( "result", &get_body() ); - json_marshaller.write_null( "error" ); - } - - json_marshaller.write( "id", get_id() ); -} - - -// json_rpc_response_parser.cpp -using yield::platform::StringBuffer; - - -JSONRPCResponseParser::JSONRPCResponseParser( MessageFactory& message_factory ) - : JSONRPCMessageParser( message_factory ) -{ } - -JSONRPCResponse* -JSONRPCResponseParser::parse -( - HTTPResponse& http_response, - JSONRPCRequest& json_rpc_request -) -{ - if ( http_response.get_body() != NULL ) - { - JSONValue* json_value = JSONParser().parse( *http_response.get_body() ); - if - ( - json_value != NULL - && - json_value->get_type() == JSONValue::TYPE_OBJECT - ) - { - JSONObject* json_object = static_cast( json_value ); - - JSONValue* error = ( *json_object )["error"]; - JSONValue* result = ( *json_object )["result"]; - JSONValue* id = ( *json_object )["id"]; - - if ( error != NULL && result != NULL && id != NULL ) - { - Response* body; - - if ( error->get_type() != JSONValue::TYPE_NULL ) - { - switch ( error->get_type() ) - { - case JSONValue::TYPE_NUMBER: - { - double error_code = *static_cast( error ) ; - body = new Exception( static_cast( error_code ) ); - } - break; - - case JSONValue::TYPE_STRING: - { - const char* error_message = *static_cast( error ); - body = new Exception( error_message ); - } - break; - - default: body = new Exception; - } - - return new JSONRPCResponse( *body, http_response, *id ); - } - else if ( result->get_type() != JSONValue::TYPE_NULL ) - { - body = json_rpc_request.get_body().createDefaultResponse(); -#ifdef _DEBUG - if ( body == NULL ) DebugBreak(); -#endif - JSONUnmarshaller json_unmarshaller( *result ); - body->unmarshal( json_unmarshaller ); - return new JSONRPCResponse( *body, http_response, *id ); - } - } - } - - JSONValue::dec_ref( json_value ); - } - - HTTPResponse::dec_ref( http_response ); - - return NULL; -} - - - -// json_rpc_s_client.cpp -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -JSONRPCSClient::JSONRPCSClient -( - MessageFactory& message_factory, - SocketAddress& peername, - const URI& post_uri, - SSLSocket& ssl_socket, - Configuration* configuration, - Log* error_log, - Log* trace_log -) - : JSONRPCClient - ( - message_factory, - peername, - post_uri, - ssl_socket, - configuration, - error_log, - trace_log - ) -{ } - -JSONRPCSClient& -JSONRPCSClient::create -( - const URI& absolute_uri, - MessageFactory& message_factory, - Configuration* configuration, - Log* error_log, - SSLContext* ssl_context, - Log* trace_log -) -{ - return *new JSONRPCSClient - ( - message_factory, - absolute_uri, - absolute_uri, - SSLSocketClient::createSSLSocket( ssl_context, trace_log ), - configuration, - error_log, - trace_log - ); -} - -#endif - - -// json_rpc_s_server.cpp -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -JSONRPCSServer::JSONRPCSServer -( - MessageFactory& message_factory, - SSLSocket& listen_ssl_socket, - EventHandler& request_handler, - HTTPServer::AccessLog* access_log, - Log* error_log, - Log* trace_log -) - : JSONRPCServer - ( - message_factory, - listen_ssl_socket, - request_handler, - access_log, - error_log, - trace_log - ) -{ } - -JSONRPCSServer& -JSONRPCSServer::create -( - MessageFactory& message_factory, - EventHandler& request_handler, - const SocketAddress& sockname, - SSLContext& ssl_context, - HTTPServer::AccessLog* access_log, - Log* error_log, - Log* trace_log -) -{ - return *new JSONRPCSServer - ( - message_factory, - SSLSocketServer::createListenSSLSocket - ( - sockname, - ssl_context, - trace_log - ), - request_handler, - access_log, - error_log, - trace_log - ); -} - -#endif - - -// json_rpc_server.cpp -JSONRPCServer::JSONRPCServer -( - MessageFactory& message_factory, - TCPSocket& listen_tcp_socket, - EventHandler& request_handler, - HTTPServer::AccessLog* access_log, - Log* error_log, - Log* trace_log -) - : RPCServer - ( - message_factory, - request_handler - ), - TCPSocketServer - ( - listen_tcp_socket, - error_log, - trace_log - ), - access_log( Object::inc_ref( access_log ) ) -{ - get_listen_tcp_socket().aio_accept( *this, NULL, new StackBuffer<1024> ); -} - -JSONRPCServer& -JSONRPCServer::create -( - MessageFactory& message_factory, - EventHandler& request_handler, - const SocketAddress& sockname, - HTTPServer::AccessLog* access_log, - Log* error_log, - Log* trace_log -) -{ - return *new JSONRPCServer - ( - message_factory, - createListenTCPSocket( sockname, trace_log ), - request_handler, - access_log, - error_log, - trace_log - ); -} - - -class JSONRPCServer::Connection - : public TCPSocketServer::Connection, - private HTTPRequestParser, - private JSONRPCRequestParser, - public ResponseHandler -{ -public: - Connection( JSONRPCServer& json_rpc_server, TCPSocket& tcp_socket ) - : TCPSocketServer::Connection( tcp_socket, json_rpc_server ), - JSONRPCRequestParser( json_rpc_server.get_message_factory() ), - json_rpc_server( json_rpc_server ) - { } - - // TCPSocket::AIORecvCallback - virtual void onReadCompletion( Buffer& buffer, void* context ) - { - HTTPRequest* http_request; - Buffer* next_buffer; - while ( HTTPRequestParser::parse( buffer, http_request, &next_buffer ) ) - { - if ( http_request != NULL ) - { - JSONRPCRequest* json_rpc_request - = JSONRPCRequestParser::parse( *http_request ); - - if ( json_rpc_request != NULL ) - { - json_rpc_request->set_response_handler( *this ); - json_rpc_server.handle( *json_rpc_request ); - } - else - break; - } - - if ( next_buffer != NULL ) - { - aio_recv( *next_buffer ); - return; - } - } - - onReadError( 0, NULL ); - } - - // ResponseHandler - virtual void handle( Response& response ) - { - if ( response.get_type_id() == JSONRPCResponse::TYPE_ID ) - { - JSONRPCResponse& json_rpc_response - = static_cast( response ); - - aio_sendmsg( json_rpc_response.marshal(), &json_rpc_response ); - } - else - DebugBreak(); - } - -private: - // TCPSocket::AIOSendCallback - virtual void onWriteCompletion( size_t bytes_written, void* context ) - { - JSONRPCResponse* json_rpc_response = static_cast( context ); - JSONRPCResponse::dec_ref( *json_rpc_response ); - } - - virtual void onWriteError( uint32_t error_code, void* context ) - { - JSONRPCResponse* json_rpc_response = static_cast( context ); - JSONRPCResponse::dec_ref( *json_rpc_response ); - TCPSocketServer::Connection::onWriteError( error_code, context ); - } - -private: - JSONRPCServer& json_rpc_server; -}; - - -void -JSONRPCServer::onAcceptCompletion -( - TCPSocket& accepted_tcp_socket, - void* context, - Buffer* recv_buffer -) -{ - Connection* connection = new Connection( *this, accepted_tcp_socket ); - connection->onReadCompletion( *recv_buffer, NULL ); - - get_listen_tcp_socket().aio_accept( *this, NULL, new StackBuffer<1024> ); -} - - -// json_unmarshaller.cpp -JSONUnmarshaller::JSONUnmarshaller( const JSONValue& root_json_value ) - : root_json_value( root_json_value ) -{ - next_json_value_i = 0; -} - -bool JSONUnmarshaller::read_bool( const Key& key ) -{ - const JSONValue* json_value = read( key ); - if ( json_value != NULL ) - return json_value->get_type() == JSONValue::TYPE_TRUE; - else - return false; -} - -void JSONUnmarshaller::read( const Key& key, double& value ) -{ - const JSONValue* json_value = read( key ); - if ( json_value != NULL ) - { - if ( json_value->get_type() == JSONValue::TYPE_NUMBER ) - value = *static_cast( json_value ); - else - value = 0; - } - else - value = 0; -} - -void JSONUnmarshaller::read( const Key& key, int64_t& value ) -{ - const JSONValue* json_value = read( key ); - if ( json_value != NULL ) - { - if ( json_value->get_type() == JSONValue::TYPE_NUMBER ) - { - const JSONNumber* json_number - = static_cast( json_value ); - value = static_cast( *json_number ); - } - else - value = 0; - } - else - value = 0; -} - -JSONUnmarshaller::Key* JSONUnmarshaller::read( Key::Type key_type ) -{ - if - ( - key_type == Key::TYPE_STRING - && - root_json_value.get_type() == JSONValue::TYPE_OBJECT - && - next_json_value_i < static_cast( root_json_value ).size() - ) - { - const JSONObject& json_object - = static_cast( root_json_value ); - const JSONString* name = json_object.at( next_json_value_i ).first; - return new StringKey( *name, name->size() ); - } - else - return NULL; -} - -const JSONValue* JSONUnmarshaller::read( const Key& key ) -{ - if ( root_json_value.get_type() == JSONValue::TYPE_ARRAY ) - { - const JSONArray& json_array - = static_cast( root_json_value ); - - if ( next_json_value_i < json_array.size() ) - return json_array[next_json_value_i++]; - else - return NULL; - } - else if ( root_json_value.get_type() == JSONValue::TYPE_OBJECT ) - { - const JSONObject& json_object - = static_cast( root_json_value ); - - if ( next_json_value_i < json_object.size() ) - return json_object.at( next_json_value_i++ ).second; - else - return NULL; - } - else - return &root_json_value; -} - -void JSONUnmarshaller::read( const Key& key, Map& value ) -{ - const JSONValue* json_value = read( key ); - if ( json_value != NULL ) - { - if ( json_value->get_type() == JSONValue::TYPE_OBJECT ) - JSONUnmarshaller( *json_value ).read( value ); - } - else if ( root_json_value.get_type() == JSONValue::TYPE_OBJECT ) - JSONUnmarshaller( root_json_value ).read( value ); -} - -void JSONUnmarshaller::read( Map& value ) -{ - size_t size = static_cast( root_json_value ).size(); - while ( next_json_value_i < size ) - value.unmarshal( *this ); -} - -void JSONUnmarshaller::read( const Key& key, MarshallableObject& value ) -{ - const JSONValue* json_value = read( key ); - if ( json_value != NULL ) - { - if ( json_value->get_type() == JSONValue::TYPE_OBJECT ) - JSONUnmarshaller( *json_value ).read( value ); - } - else if ( root_json_value.get_type() == JSONValue::TYPE_OBJECT ) - JSONUnmarshaller( root_json_value ).read( value ); -} - -void JSONUnmarshaller::read( MarshallableObject& value ) -{ - value.unmarshal( *this ); -} - -void JSONUnmarshaller::read( const Key& key, Sequence& value ) -{ - const JSONValue* json_value = read( key ); - if ( json_value != NULL ) - { - if ( json_value->get_type() == JSONValue::TYPE_ARRAY ) - JSONUnmarshaller( *json_value ).read( value ); - } - else if ( root_json_value.get_type() == JSONValue::TYPE_ARRAY ) - JSONUnmarshaller( root_json_value ).read( value ); -} - -void JSONUnmarshaller::read( Sequence& value ) -{ - size_t size = static_cast( root_json_value ).size(); - while ( next_json_value_i < size ) - value.unmarshal( *this ); -} - -void JSONUnmarshaller::read( const Key& key, string& value ) -{ - const JSONValue* json_value = read( key ); - if - ( - json_value != NULL - && - json_value->get_type() == JSONValue::TYPE_STRING - ) - { - value.assign - ( - *static_cast( json_value ), - static_cast( json_value )->size() - ); - } -} - - -// onc_rpc_client.cpp -ONCRPCClient::ONCRPCClient -( - MessageFactory& message_factory, - uint32_t prog, - uint32_t vers -) : RPCClient( message_factory ), - prog( prog ), - vers( vers ) -{ } - -void ONCRPCClient::handle( Request& request ) -{ - ONCRPCRequest* onc_rpc_request; - - switch ( request.get_type_id() ) - { - case ONCRPCRequest::TYPE_ID: - { - onc_rpc_request = static_cast( &request ); - } - break; - - default: - { - onc_rpc_request - = new ONCRPCRequest - ( - request.inc_ref(), - get_prog(), - get_vers(), - static_cast( Time().as_unix_time_s() ) - ); - - onc_rpc_request - ->set_response_handler( new RPCResponseHandler( request ) ); - } - break; - } - - handle( *onc_rpc_request ); -} - - -// onc_rpc_message.cpp -ONCRPCMessage::ONCRPCMessage( MarshallableObject* verf, uint32_t xid ) - : verf( verf ), xid( xid ) -{ } - -ONCRPCMessage::~ONCRPCMessage() -{ - MarshallableObject::dec_ref( verf ); -} - -void ONCRPCMessage::marshal_opaque_auth -( - Marshaller& marshaller, - MarshallableObject* opaque_auth -) const -{ - if ( opaque_auth != NULL ) - { - marshaller.write( "auth_flavor", opaque_auth->get_type_id() ); - XDRMarshaller temp_xdr_marshaller; - opaque_auth->marshal( temp_xdr_marshaller ); - Buffer& auth_body = temp_xdr_marshaller.get_buffers().join(); -#ifdef _DEBUG - if ( auth_body.size() % 4 != 0 ) DebugBreak(); -#endif - marshaller.write( "auth_body", auth_body ); - Buffer::dec_ref( auth_body ); - } - else - { - marshaller.write( "auth_flavor", ONCRPCMessage::AUTH_NONE ); - marshaller.write( "auth_body_length", 0 ); - } -} - - -// onc_rpc_message_parser.cpp -using yield::platform::ntohl; - - -template -ONCRPCMessageParser:: -ONCRPCMessageParser -( - MessageFactory& message_factory, - bool parse_records -) - : message_factory( message_factory.inc_ref() ), - parse_records( parse_records ) -{ } - -template -ONCRPCMessageParser:: -~ONCRPCMessageParser() -{ - MessageFactory::dec_ref( message_factory ); -} - -template -bool -ONCRPCMessageParser:: -parse -( - Buffer& buffer, - ONCRPCMessageType*& out_onc_rpc_message, - Buffer** out_next_buffer -) -{ - out_onc_rpc_message = NULL; - if ( out_next_buffer != NULL ) - *out_next_buffer = NULL; - - if ( parse_records ) - { - if ( buffer.size() - buffer.position() >= sizeof( uint32_t ) ) - { - uint32_t record_fragment_marker; - buffer.get( &record_fragment_marker, sizeof( record_fragment_marker ) ); - record_fragment_marker = ntohl( record_fragment_marker ); - - bool is_last_record_fragment - = ( ( record_fragment_marker ) & ( 1UL << 31UL ) ) == ( 1UL << 31UL ); - if ( !is_last_record_fragment ) DebugBreak(); - - uint32_t record_fragment_length - = ( record_fragment_marker ) ^ ( 1 << 31UL ); - - if ( buffer.size() - buffer.position() >= record_fragment_length ) - { - size_t buffer_start_position = buffer.position(); - - XDRUnmarshaller xdr_unmarshaller( buffer ); - - out_onc_rpc_message - = static_cast( this ) - ->unmarshalONCRPCMessage( xdr_unmarshaller ); - - size_t buffer_consumed = buffer.position() - buffer_start_position; - - if ( buffer_consumed < record_fragment_length ) - { - buffer.position - ( - buffer.position() - + - record_fragment_length - buffer_consumed - ); - } - - return true; - } - else if ( out_next_buffer != NULL ) - { - buffer.rewind( sizeof( record_fragment_marker ) ); - - *out_next_buffer - = new StringBuffer - ( - sizeof( record_fragment_marker ) + record_fragment_length - ); - - ( *out_next_buffer )->put( buffer ); - - return true; - } - else - return false; - } - else if ( out_next_buffer != NULL ) - { - if ( buffer.size() == 0 && buffer.capacity() > 0 ) - *out_next_buffer = &buffer.inc_ref(); - else - { - *out_next_buffer = new StackBuffer<1024>; - if ( buffer.size() - buffer.position() > 0 ) - ( *out_next_buffer )->put( buffer ); - } - - return true; - } - else - return false; - } - else - { - XDRUnmarshaller xdr_unmarshaller( buffer ); - - out_onc_rpc_message - = static_cast( this ) - ->unmarshalONCRPCMessage( xdr_unmarshaller ); - - return true; - } -} - -template -MarshallableObject* -ONCRPCMessageParser:: -unmarshal_opaque_auth -( - XDRUnmarshaller& xdr_unmarshaller -) -{ - uint32_t auth_flavor = xdr_unmarshaller.read_uint32(); - if ( auth_flavor != ONCRPCMessage::AUTH_NONE ) - { - MarshallableObject* opaque_auth - = get_message_factory().createMarshallableObject( auth_flavor ); - - if ( opaque_auth != NULL ) - { - xdr_unmarshaller.read_int32(); // length - xdr_unmarshaller.read( *opaque_auth ); - return opaque_auth; - } - } - - string opaque_auth; - xdr_unmarshaller.read( opaque_auth ); - - return NULL; -} - -template class ONCRPCMessageParser; -template class ONCRPCMessageParser; - - -// onc_rpc_request.cpp -using yield::platform::htonl; - - -ONCRPCRequest::ONCRPCRequest -( - Request& body, - uint32_t prog, - uint32_t vers, - uint32_t xid, - MarshallableObject* cred, - MarshallableObject* verf -) - : RPCRequest( body ), - ONCRPCMessage( verf, xid ), - prog( prog ), - vers( vers ) -{ - if ( cred == NULL ) - cred = Object::inc_ref( get_body().get_credentials() ); - set_credentials( cred ); -} - -Buffers& ONCRPCRequest::marshal( bool in_record ) const -{ - XDRMarshaller xdr_marshaller; - marshal( xdr_marshaller ); - Buffers& buffers = xdr_marshaller.get_buffers().inc_ref(); - - if ( in_record ) - { - uint32_t record_fragment_length = buffers.join_size(); - uint32_t record_fragment_marker = record_fragment_length | ( 1 << 31UL ); - record_fragment_marker = htonl( record_fragment_marker ); - buffers.insert - ( - 0, - &record_fragment_marker, - sizeof( record_fragment_marker ) - ); - } - - return buffers; -} - -void ONCRPCRequest::marshal( Marshaller& marshaller ) const -{ - marshaller.write( "xid", get_xid() ); - marshaller.write( "msg_type", CALL ); - marshaller.write( "rpcvers", 2 ); - marshaller.write( "prog", get_prog() ); - marshaller.write( "vers", get_vers() ); - marshaller.write( "proc", get_proc() ); - marshal_opaque_auth( marshaller, get_cred() ); - marshal_opaque_auth( marshaller, get_verf() ); - marshaller.write( "body", get_body() ); -} - -void ONCRPCRequest::respond( ONCRPCResponse& response ) -{ - Request::respond( response ); -} - -void ONCRPCRequest::respond( Response& response ) -{ - Request::respond( *new ONCRPCResponse( response, get_xid(), get_verf() ) ); -} - -void ONCRPCRequest::respond( Exception& response ) -{ - Request::respond( *new ONCRPCResponse( response, get_xid(), get_verf() ) ); -} - - -// onc_rpc_request_handler.cpp -void ONCRPCRequestHandler::handle( Request& request ) -{ - if ( request.get_type_id() == ONCRPCRequest::TYPE_ID ) - handle( static_cast( request ) ); - else - { - cerr << "ONCRPCRequestHandler: received non-ONCRPCRequest request: " << - request.get_type_name() << "." << endl; - - Request::dec_ref( request ); - } -} - - -// onc_rpc_request_parser.cpp -ONCRPCRequestParser::ONCRPCRequestParser -( - MessageFactory& message_factory, - bool parse_records -) -: ONCRPCMessageParser - ( - message_factory, - parse_records - ) -{ } - -bool -ONCRPCRequestParser::parse -( - Buffer& buffer, - Message*& out_onc_rpc_message, - Buffer** out_next_buffer -) -{ - return ONCRPCMessageParser::parse - ( - buffer, - out_onc_rpc_message, - out_next_buffer - ); -} - -Message* -ONCRPCRequestParser::unmarshalONCRPCMessage -( - XDRUnmarshaller& xdr_unmarshaller -) -{ - uint32_t xid = xdr_unmarshaller.read_uint32(); - - uint32_t msg_type = xdr_unmarshaller.read_uint32(); - if ( msg_type == ONCRPCMessage::CALL ) - { - uint32_t rpcvers = xdr_unmarshaller.read_uint32(); - if ( rpcvers == 2 ) - { - uint32_t prog = xdr_unmarshaller.read_uint32(); - uint32_t vers = xdr_unmarshaller.read_uint32(); - uint32_t proc = xdr_unmarshaller.read_uint32(); - - MarshallableObject* cred = unmarshal_opaque_auth( xdr_unmarshaller ); - MarshallableObject* verf = unmarshal_opaque_auth( xdr_unmarshaller ); - - Request* body = get_message_factory().createRequest( proc ); - if ( body != NULL ) - { - xdr_unmarshaller.read( *body ); - return new ONCRPCRequest( *body, prog, vers, xid, cred, verf ); - } - else - { - MarshallableObject::dec_ref( cred ); - return new ONCRPCResponse - ( - *new ONCRPCProcedureUnavailableError, - xid, - verf - ); - } - } - else - { - ONCRPCResponse::mismatch_info mismatch_info_ = { 0 }; - return new ONCRPCResponse( mismatch_info_, xid ); - } - } - else - return new ONCRPCResponse( *new ONCRPCGarbageArgumentsError, xid ); -} - - -// onc_rpc_response.cpp -using yield::platform::htonl; - - -ONCRPCResponse::ONCRPCResponse -( - Response& body, - uint32_t xid, - MarshallableObject* verf -) - : RPCResponse( body ), - ONCRPCMessage( verf, xid ), - accept_stat_( SUCCESS ), - auth_stat_( AUTH_OK ), - reject_stat_( RPC_MISMATCH ), - reply_stat_( MSG_ACCEPTED ) -{ - memset( &mismatch_info_, 0, sizeof( mismatch_info_ ) ); -} - -ONCRPCResponse::ONCRPCResponse -( - Exception& body, - uint32_t xid, - MarshallableObject* verf -) - : RPCResponse( body ), - ONCRPCMessage( verf, xid ), - accept_stat_( body.get_type_id() ), - auth_stat_( AUTH_OK ), - reject_stat_( RPC_MISMATCH ), - reply_stat_( MSG_ACCEPTED ) -{ - memset( &mismatch_info_, 0, sizeof( mismatch_info_ ) ); -} - -ONCRPCResponse::ONCRPCResponse -( - const struct mismatch_info& mismatch_info_, - uint32_t xid -) - : RPCResponse( *new ONCRPCRPCMismatchError ), - ONCRPCMessage( NULL, xid ), - accept_stat_( SYSTEM_ERR ), - auth_stat_( AUTH_OK ), - mismatch_info_( mismatch_info_ ), - reject_stat_( RPC_MISMATCH ), - reply_stat_( MSG_DENIED ) -{ } - -ONCRPCResponse::ONCRPCResponse( auth_stat auth_stat_, uint32_t xid ) - : RPCResponse( *new ONCRPCAuthError( auth_stat_ ) ), - ONCRPCMessage( NULL, xid ), - accept_stat_( SYSTEM_ERR ), - auth_stat_( auth_stat_ ), - reject_stat_( AUTH_ERROR ), - reply_stat_( MSG_DENIED ) -{ - memset( &mismatch_info_, 0, sizeof( mismatch_info_ ) ); -} - -Buffers& ONCRPCResponse::marshal( bool in_record ) const -{ - XDRMarshaller xdr_marshaller; - marshal( xdr_marshaller ); - Buffers& buffers = xdr_marshaller.get_buffers().inc_ref(); - - if ( in_record ) - { - uint32_t record_fragment_length = buffers.join_size(); - uint32_t record_fragment_marker = record_fragment_length | ( 1 << 31UL ); - record_fragment_marker = htonl( record_fragment_marker ); - buffers.insert - ( - 0, - &record_fragment_marker, - sizeof( record_fragment_marker ) - ); - } - - return buffers; -} - -void ONCRPCResponse::marshal( Marshaller& marshaller ) const -{ - marshaller.write( "xid", get_xid() ); - marshaller.write( "msg_type", REPLY ); - marshaller.write( "reply_stat", reply_stat_ ); - if ( reply_stat_ == MSG_ACCEPTED ) - { - marshal_opaque_auth( marshaller, get_verf() ); - marshaller.write( "accept_stat", accept_stat_ ); - marshaller.write( "body", get_body() ); - } - else - { - marshaller.write( "reject_stat", reject_stat_ ); - if ( reject_stat_ == RPC_MISMATCH ) - { - marshaller.write( "mismatch_info_low", mismatch_info_.low ); - marshaller.write( "mismatch_info_high", mismatch_info_.high ); - } - else - marshaller.write( "auth_stat", auth_stat_ ); - } -} - - -// onc_rpc_response_parser.cpp -ONCRPCResponseParser::ONCRPCResponseParser -( - MessageFactory& message_factory, - bool parse_records -) -: ONCRPCMessageParser - ( - message_factory, - parse_records - ) -{ - onc_rpc_request = NULL; -} - -bool -ONCRPCResponseParser::parse -( - Buffer& buffer, - ONCRPCRequest& onc_rpc_request, - ONCRPCResponse*& out_onc_rpc_response, - Buffer** out_next_buffer -) -{ - this->onc_rpc_request = &onc_rpc_request; - - bool ret - = ONCRPCMessageParser:: - parse - ( - buffer, - out_onc_rpc_response, - out_next_buffer - ); - - this->onc_rpc_request = NULL; - - return ret; -} - -ONCRPCResponse* -ONCRPCResponseParser::unmarshalONCRPCMessage -( - XDRUnmarshaller& xdr_unmarshaller -) -{ - uint32_t xid = xdr_unmarshaller.read_uint32(); -#ifdef _DEBUG - if ( xid != onc_rpc_request->get_xid() ) DebugBreak(); -#endif - - uint32_t msg_type = xdr_unmarshaller.read_uint32(); - if ( msg_type == ONCRPCMessage::REPLY ) - { - uint32_t reply_stat = xdr_unmarshaller.read_uint32(); - if ( reply_stat == ONCRPCResponse::MSG_ACCEPTED ) - { - MarshallableObject* verf = unmarshal_opaque_auth( xdr_unmarshaller ); - - uint32_t accept_stat = xdr_unmarshaller.read_uint32(); - switch ( accept_stat ) - { - case ONCRPCResponse::SUCCESS: - { - Response* body = onc_rpc_request->get_body().createDefaultResponse(); -#ifdef _DEBUG - if ( body == NULL ) DebugBreak(); -#endif - xdr_unmarshaller.read( *body ); - return new ONCRPCResponse - ( - *body, - xid, - Object::inc_ref( onc_rpc_request->get_verf() ) - ); - } - break; - - case ONCRPCResponse::PROG_UNAVAIL: - { - return new ONCRPCResponse - ( - *new ONCRPCProgramUnavailableError, - xid, - verf - ); - } - break; - - case ONCRPCResponse::PROG_MISMATCH: - { - return new ONCRPCResponse - ( - *new ONCRPCProgramMismatchError, - xid, - verf - ); - } - break; - - case ONCRPCResponse::PROC_UNAVAIL: - { - return new ONCRPCResponse - ( - *new ONCRPCProcedureUnavailableError, - xid, - verf - ); - } - break; - - case ONCRPCResponse::GARBAGE_ARGS: - { - return new ONCRPCResponse - ( - *new ONCRPCGarbageArgumentsError, - xid, - verf - ); - - } - break; - - case ONCRPCResponse::SYSTEM_ERR: - { - return new ONCRPCResponse - ( - *new ONCRPCSystemError, - xid, - verf - ); - } - break; - - default: - { - Exception* body - = get_message_factory().createException( accept_stat ); - - if ( body != NULL ) - xdr_unmarshaller.read( *body ); - else - body = new ONCRPCSystemError; - - return new ONCRPCResponse( *body, xid, verf ); - } - break; - } - } - else if ( reply_stat == ONCRPCResponse::MSG_DENIED ) - { - uint32_t reject_stat = xdr_unmarshaller.read_uint32(); - if ( reject_stat == ONCRPCResponse::RPC_MISMATCH ) - { - struct ONCRPCResponse::mismatch_info mismatch_info_; - mismatch_info_.low = xdr_unmarshaller.read_uint32(); - mismatch_info_.high = xdr_unmarshaller.read_uint32(); - return new ONCRPCResponse( mismatch_info_, xid ); - } - else if ( reject_stat == ONCRPCResponse::AUTH_ERROR ) - { - uint32_t auth_stat = xdr_unmarshaller.read_uint32(); - if - ( - auth_stat >= ONCRPCResponse::AUTH_OK - && - auth_stat <= ONCRPCResponse::AUTH_FAILED - ) - { - return new ONCRPCResponse - ( - static_cast( auth_stat ), - xid - ); - } - } - } - } - - return NULL; -} - - -// onc_rpc_ssl_socket_client.cpp -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -ONCRPCSSLSocketClient::ONCRPCSSLSocketClient -( - MessageFactory& message_factory, - SocketAddress& peername, - uint32_t prog, - SSLSocket& ssl_socket, - uint32_t vers, - Configuration* configuration, - Log* error_log, - Log* trace_log -) -: ONCRPCStreamSocketClient - ( - message_factory, - peername, - prog, - ssl_socket, - vers, - configuration, - error_log, - trace_log - ) -{ } - -ONCRPCSSLSocketClient& -ONCRPCSSLSocketClient::create -( - const URI& absolute_uri, - MessageFactory& message_factory, - uint32_t prog, - uint32_t vers, - Configuration* configuration, - Log* error_log, - SSLContext* ssl_context, - Log* trace_log -) -{ - return *new ONCRPCSSLSocketClient - ( - message_factory, - absolute_uri, - prog, - SSLSocketClient::createSSLSocket( ssl_context, trace_log ), - vers, - configuration, - error_log, - trace_log - ); -} - -#endif - - -// onc_rpc_ssl_socket_server.cpp -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -ONCRPCSSLSocketServer::ONCRPCSSLSocketServer -( - SSLSocket& listen_tcp_socket, - MessageFactory& message_factory, - EventHandler& request_handler, - Log* error_log, - Log* trace_log -) - : ONCRPCStreamSocketServer - ( - listen_tcp_socket, - message_factory, - request_handler, - error_log - ) -{ } - -ONCRPCSSLSocketServer& -ONCRPCSSLSocketServer::create -( - MessageFactory& message_factory, - EventHandler& request_handler, - const SocketAddress& sockname, - SSLContext& ssl_context, - Log* error_log, - Log* trace_log -) -{ - return *new ONCRPCSSLSocketServer - ( - SSLSocketServer::createListenSSLSocket - ( - sockname, - ssl_context, - trace_log - ), - message_factory, - request_handler, - error_log, - trace_log - ); -} - -#endif - - -// onc_rpc_stream_socket_client.cpp -using yield::platform::ntohl; - - -template -ONCRPCStreamSocketClient::ONCRPCStreamSocketClient -( - MessageFactory& message_factory, - SocketAddress& peername, - uint32_t prog, - StreamSocketType& stream_socket, - uint32_t vers, - Configuration* configuration, - Log* error_log, - Log* trace_log -) - : ONCRPCClient( message_factory, prog, vers ), - StreamSocketClient - ( - peername, - configuration, - error_log, - trace_log - ), - connection_queue( this->get_configuration().get_concurrency_level() ) -{ - for - ( - uint16_t connection_i = 1; - connection_i < this->get_configuration().get_concurrency_level(); - connection_i++ - ) - { - StreamSocketType* dup_stream_socket = stream_socket.dup(); - if ( dup_stream_socket != NULL ) - connection_queue.enqueue( *new Connection( *this, *dup_stream_socket ) ); - } - - connection_queue.enqueue( *new Connection( *this, stream_socket ) ); -} - -template -void -ONCRPCStreamSocketClient::handle -( - ONCRPCRequest& onc_rpc_request -) -{ - Connection& connection = connection_queue.dequeue(); - connection.handle( onc_rpc_request ); -} - - -template -ONCRPCStreamSocketClient::Connection::Connection -( - ONCRPCStreamSocketClient& onc_rpc_stream_socket_client, - StreamSocketType& stream_socket -) -: StreamSocketClient::Connection - ( - stream_socket, - onc_rpc_stream_socket_client - ), - ONCRPCResponseParser - ( - onc_rpc_stream_socket_client.get_message_factory(), - true - ), - connection_queue( onc_rpc_stream_socket_client.connection_queue ) -{ } - -template -void -ONCRPCStreamSocketClient::Connection:: -handle -( - ONCRPCRequest& onc_rpc_request -) -{ - this->aio_sendmsg( onc_rpc_request.marshal( true ), &onc_rpc_request ); -} - -template -void -ONCRPCStreamSocketClient::Connection:: -onError -( - uint32_t error_code, - void* context -) -{ - this->assert_single_threaded(); - - StreamSocketClient::Connection::onError - ( - error_code, - context - ); - - if ( this->get_remaining_connect_tries() > 0 ) - { - if ( !live_onc_rpc_requests.empty() ) - { - Buffers* pipelined_onc_rpc_request_buffers = NULL; - - for - ( - map::const_iterator - onc_rpc_request_i = live_onc_rpc_requests.begin(); - onc_rpc_request_i != live_onc_rpc_requests.end(); - ++onc_rpc_request_i - ) - { - ONCRPCRequest* onc_rpc_request = onc_rpc_request_i->second; - if ( pipelined_onc_rpc_request_buffers == NULL ) - pipelined_onc_rpc_request_buffers = &onc_rpc_request->marshal( true ); - else - { - Buffers& buffers = onc_rpc_request->marshal( true ); - pipelined_onc_rpc_request_buffers->extend( buffers ); - Buffers::dec_ref( buffers ); - } - } - - this->aio_sendmsg( *pipelined_onc_rpc_request_buffers ); - } - } - else - { - if ( !live_onc_rpc_requests.empty() ) - { - Exception* exception = new Exception( error_code ); - - for - ( - map::const_iterator - onc_rpc_request_i = live_onc_rpc_requests.begin(); - onc_rpc_request_i != live_onc_rpc_requests.end(); - ++onc_rpc_request_i - ) - onc_rpc_request_i->second->respond( exception->inc_ref() ); - - live_onc_rpc_requests.clear(); - - Exception::dec_ref( *exception ); - } - - this->reset_connect_tries(); - - connection_queue.enqueue( *this ); - } -} - -template -void -ONCRPCStreamSocketClient::Connection:: -onReadCompletion -( - Buffer& buffer, - void* context -) -{ - this->assert_single_threaded(); - - while ( buffer.size() - buffer.position() >= sizeof( uint32_t ) * 2 ) - { - // Skip the record fragment marker - buffer.position( buffer.position() + sizeof( uint32_t ) ); - - uint32_t xid; - buffer.get( &xid, sizeof( xid ) ); - xid = ntohl( xid ); - - map::iterator onc_rpc_request_i - = live_onc_rpc_requests.find( xid ); - - if ( onc_rpc_request_i != live_onc_rpc_requests.end() ) - { - ONCRPCRequest* onc_rpc_request = onc_rpc_request_i->second; - - buffer.rewind( sizeof( uint32_t ) * 2 ); - - ONCRPCResponse* onc_rpc_response; - Buffer* next_buffer; - if - ( - ONCRPCResponseParser::parse - ( - buffer, - *onc_rpc_request, - onc_rpc_response, - &next_buffer - ) - ) - { - if ( onc_rpc_response != NULL ) - { - onc_rpc_request->respond( *onc_rpc_response ); - ONCRPCRequest::dec_ref( *onc_rpc_request ); - live_onc_rpc_requests.erase( onc_rpc_request_i ); - } - - if ( next_buffer != NULL ) - { - this->aio_recv( *next_buffer ); - return; - } - } - else - { - this->onReadError( 0, NULL ); - return; - } - } - else - DebugBreak(); - } - - if ( buffer.size() == 0 && buffer.capacity() > 0 ) - this->aio_recv( buffer.inc_ref() ); - else - { - Buffer* new_buffer = new StackBuffer<1024>; - if ( buffer.size() - buffer.position() > 0 ) - new_buffer->put( buffer ); - this->aio_recv( *new_buffer ); - } -} - -template -void -ONCRPCStreamSocketClient::Connection:: -onWriteCompletion -( - size_t bytes_sent, - void* context -) -{ - this->assert_single_threaded(); - - ONCRPCRequest* onc_rpc_request = static_cast( context ); - if ( onc_rpc_request != NULL ) - { -#ifdef _DEBUG - if - ( - live_onc_rpc_requests.find( onc_rpc_request->get_xid() ) - != - live_onc_rpc_requests.end() - ) - DebugBreak(); -#endif - live_onc_rpc_requests[onc_rpc_request->get_xid()] = onc_rpc_request; - } - - connection_queue.enqueue( *this ); -} - -template -void -ONCRPCStreamSocketClient::Connection:: -onWriteError -( - uint32_t error_code, - void* context -) -{ - this->assert_single_threaded(); - - ONCRPCRequest* onc_rpc_request = static_cast( context ); - if ( onc_rpc_request >= NULL ) - { -#ifdef _DEBUG - if - ( - live_onc_rpc_requests.find( onc_rpc_request->get_xid() ) - != - live_onc_rpc_requests.end() - ) - DebugBreak(); -#endif - live_onc_rpc_requests[onc_rpc_request->get_xid()] = onc_rpc_request; - } - - StreamSocketClient::Connection::onWriteError - ( - error_code, - context - ); -} - -template class ONCRPCStreamSocketClient; -template class ONCRPCStreamSocketClient; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL -template class ONCRPCStreamSocketClient; -#endif - - -// onc_rpc_stream_socket_server.cpp -template -ONCRPCStreamSocketServer::ONCRPCStreamSocketServer -( - StreamSocketType& listen_stream_socket, - MessageFactory& message_factory, - EventHandler& request_handler, - Log* error_log, - Log* trace_log -) - : ONCRPCServer( message_factory, request_handler ), - StreamSocketServer - ( - listen_stream_socket, - error_log, - trace_log - ) -{ - this->get_listen_stream_socket().aio_accept( *this, NULL, new StackBuffer<1024> ); -} - - -template -class ONCRPCStreamSocketServer::Connection - : public StreamSocketServer::Connection, - private ONCRPCRequestParser, - public ResponseHandler -{ -public: - Connection - ( - ONCRPCStreamSocketServer& onc_rpc_stream_socket_server, - StreamSocketType& stream_socket - ) - : StreamSocketServer::Connection - ( - stream_socket, - onc_rpc_stream_socket_server - ), - ONCRPCRequestParser - ( - onc_rpc_stream_socket_server.get_message_factory(), - true - ), - onc_rpc_stream_socket_server( onc_rpc_stream_socket_server ) - { } - - // StreamSocket::AIORecvCallback - void onReadCompletion( Buffer& buffer, void* context ) - { - Message* onc_rpc_message; - Buffer* next_buffer; - while - ( - ONCRPCRequestParser::parse - ( - buffer, - onc_rpc_message, - &next_buffer - ) - ) - { - if ( onc_rpc_message != NULL ) - { - if ( onc_rpc_message->get_type_id() == ONCRPCRequest::TYPE_ID ) - { - ONCRPCRequest* onc_rpc_request - = static_cast( onc_rpc_message ); - onc_rpc_request->set_response_handler( *this ); - onc_rpc_stream_socket_server.handle( *onc_rpc_request ); - } - else - handle( *static_cast( onc_rpc_message ) ); - } - - if ( next_buffer != NULL ) - { - this->aio_recv( *next_buffer ); - return; - } - } - - this->onReadError( 0, NULL ); - } - - // ResponseHandler - void handle( Response& response ) - { - if ( response.get_type_id() == ONCRPCResponse::TYPE_ID ) - { - ONCRPCResponse& onc_rpc_response - = static_cast( response ); - Buffers& buffers = onc_rpc_response.marshal( true ); - ONCRPCResponse::dec_ref( onc_rpc_response ); - this->aio_sendmsg( buffers ); - } - else - DebugBreak(); - } - -private: - ONCRPCStreamSocketServer& onc_rpc_stream_socket_server; -}; - - -template -void -ONCRPCStreamSocketServer::onAcceptCompletion -( - StreamSocketType& accepted_stream_socket, - void* context, - Buffer* recv_buffer -) -{ - Connection* connection = new Connection( *this, accepted_stream_socket ); - connection->onReadCompletion( *recv_buffer, NULL ); - - this->get_listen_stream_socket().aio_accept( *this, NULL, new StackBuffer<1024> ); -} - -template class ONCRPCStreamSocketServer; -template class ONCRPCStreamSocketServer; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL -template class ONCRPCStreamSocketServer; -#endif - - -// onc_rpc_tcp_socket_client.cpp -ONCRPCTCPSocketClient::ONCRPCTCPSocketClient -( - MessageFactory& message_factory, - SocketAddress& peername, - uint32_t prog, - TCPSocket& tcp_socket, - uint32_t vers, - Configuration* configuration, - Log* error_log, - Log* trace_log -) -: ONCRPCStreamSocketClient - ( - message_factory, - peername, - prog, - tcp_socket, - vers, - configuration, - error_log, - trace_log - ) -{ } - -ONCRPCTCPSocketClient& -ONCRPCTCPSocketClient::create -( - const URI& absolute_uri, - MessageFactory& message_factory, - uint32_t prog, - uint32_t vers, - Configuration* configuration, - Log* error_log, - Log* trace_log -) -{ - return *new ONCRPCTCPSocketClient - ( - message_factory, - absolute_uri, - prog, - TCPSocketClient::createTCPSocket( trace_log ), - vers, - configuration, - error_log, - trace_log - ); -} - - -// onc_rpc_tcp_socket_server.cpp -ONCRPCTCPSocketServer::ONCRPCTCPSocketServer -( - TCPSocket& listen_tcp_socket, - MessageFactory& message_factory, - EventHandler& request_handler, - Log* error_log, - Log* trace_log -) - : ONCRPCStreamSocketServer - ( - listen_tcp_socket, - message_factory, - request_handler, - error_log - ) -{ } - -ONCRPCTCPSocketServer& -ONCRPCTCPSocketServer::create -( - MessageFactory& message_factory, - EventHandler& request_handler, - const SocketAddress& sockname, - Log* error_log, - Log* trace_log -) -{ - return *new ONCRPCTCPSocketServer - ( - TCPSocketServer::createListenTCPSocket - ( - sockname, - trace_log - ), - message_factory, - request_handler, - error_log, - trace_log - ); -} - - -// onc_rpc_udp_socket_client.cpp -ONCRPCUDPSocketClient::ONCRPCUDPSocketClient -( - MessageFactory& message_factory, - SocketAddress& peername, - uint32_t prog, - UDPSocket& udp_socket, - uint32_t vers, - Log* error_log, - const Time& recv_timeout, - Log* trace_log -) -: ONCRPCClient( message_factory, prog, vers ), - UDPSocketClient( peername, udp_socket, error_log, recv_timeout, trace_log ), - ONCRPCResponseParser( message_factory ) -{ } - -ONCRPCUDPSocketClient& -ONCRPCUDPSocketClient::create -( - const URI& absolute_uri, - MessageFactory& message_factory, - uint32_t prog, - uint32_t vers, - Log* error_log, - const Time& recv_timeout, - Log* trace_log -) -{ - return *new ONCRPCUDPSocketClient - ( - message_factory, - absolute_uri, - prog, - createConnectedUDPSocket( absolute_uri, trace_log ), - vers, - error_log, - recv_timeout, - trace_log - ); -} - -void ONCRPCUDPSocketClient::handle( ONCRPCRequest& onc_rpc_request ) -{ -} - -void ONCRPCUDPSocketClient::onReadCompletion( Buffer& buffer, void* context ) -{ -} - -void ONCRPCUDPSocketClient::onReadError( uint32_t error_code, void* context ) -{ -} - - -// onc_rpc_udp_socket_server.cpp -ONCRPCUDPSocketServer::ONCRPCUDPSocketServer -( - MessageFactory& message_factory, - EventHandler& request_handler, - UDPSocket& udp_socket, - Log* error_log, - Log* trace_log -) -: - ONCRPCServer( message_factory, request_handler ), - UDPSocketServer - ( - udp_socket, - error_log, - trace_log - ), - ONCRPCRequestParser( message_factory ) -{ - // get_udp_socket().aio_recvfrom( *new StackBuffer<1024>, *this, NULL ); -} - -ONCRPCUDPSocketServer& -ONCRPCUDPSocketServer::create -( - MessageFactory& message_factory, - EventHandler& request_handler, - const SocketAddress& sockname, - Log* error_log, - Log* trace_log -) -{ - return *new ONCRPCUDPSocketServer - ( - message_factory, - request_handler, - createBoundUDPSocket( sockname, trace_log ), - error_log, - trace_log - ); -} - - -void -ONCRPCUDPSocketServer::onRecvFromCompletion -( - Buffer& buffer, - SocketAddress& peername, - void* context -) -{ - DebugBreak(); - //ONCRPCRequest* request = static_cast( context ); - // - //Buffer* next_buffer = request->deserialize( &buffer ); - //if ( next_buffer == NULL ) - //{ - // UDPConnection* udp_connection = new UDPConnection( peername, *udp_socket ); - // request->set_response_handler( udp_connection ); - // UDPConnection::dec_ref( *udp_connection ); - // sendRequest( *request ); - //} - //else if ( next_buffer != reinterpret_cast( -1 ) ) - // Buffer::dec_ref( *next_buffer ); - - //request = createRequest(); - //udp_socket->aio_recvfrom( *request->deserialize( NULL ), *this, request ); -} - -void ONCRPCUDPSocketServer::onRecvFromError( uint32_t, void* context ) -{ - DebugBreak(); - //ONCRPCRequest* request = static_cast( context ); - //delete request; - //request = createRequest(); - //udp_socket->aio_recvfrom( *request->deserialize( NULL ), *this, request ); -} - - -class ONCRPCUDPSocketServer::ResponseHandler : public UDPSocketServer::ResponseHandler -{ -public: - ResponseHandler( SocketAddress& peername, UDPSocket& udp_socket ) - : UDPSocketServer::ResponseHandler( peername, udp_socket ) - { } - - // ResponseHandler - void handle( Response& response ) - { - //if ( request_handler.get_type_id() == ONCRPC - //switch ( ev.get_type_id() ) - //{ - // case ONCRPCResponse::TYPE_ID: - // { - // ONCRPCResponse& response = static_cast( ev ); - // DebugBreak(); - // //response.serialize( udp_socket, *this, NULL ); - // //ONCRPCResponse::dec_ref( response ); - // } - // break; - - //} - } -}; - - -// socket_client.cpp -SocketClient::SocketClient -( - SocketAddress& peername, - Log* error_log, - Log* trace_log -) - : SocketPeer( error_log, trace_log ), - peername( peername ) -{ } - -SocketClient::~SocketClient() -{ - SocketAddress::dec_ref( peername ); -} - - -// socket_peer.cpp -SocketPeer::SocketPeer -( - Log* error_log, - Log* trace_log -) - : error_log( Object::inc_ref( error_log ) ), - trace_log( Object::inc_ref( trace_log ) ) -{ } - -SocketPeer::~SocketPeer() -{ - Log::dec_ref( error_log ); - Log::dec_ref( trace_log ); -} - - -// ssl_socket_client.cpp -using yield::platform::NBIOQueue; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -SSLSocketClient::SSLSocketClient -( - SocketAddress& peername, - Configuration* configuration, - Log* error_log, - Log* trace_log -) - : TCPSocketClient - ( - peername, - configuration, - error_log, - trace_log - ) -{ } - -SSLSocket& -SSLSocketClient::createSSLSocket -( - SSLContext* ssl_context, - Log* trace_log -) -{ - if ( ssl_context != NULL ) - ssl_context->inc_ref(); - else - ssl_context = &SSLContext::create( SSLv23_client_method() ); - - NBIOQueue* nbio_queue = NBIOQueue::create(); - - SSLSocket* ssl_socket; - if ( trace_log != NULL ) - ssl_socket = TracingSSLSocket::create( *trace_log, *ssl_context ); - else - ssl_socket = SSLSocket::create( *ssl_context ); - - SSLContext::dec_ref( *ssl_context ); - - if - ( - nbio_queue != NULL - && - ssl_socket != NULL - && - static_cast( ssl_socket )->associate( *nbio_queue ) - ) - { - NBIOQueue::dec_ref( *nbio_queue ); - return *ssl_socket; - } - else - { - SSLSocket::dec_ref( ssl_socket ); - NBIOQueue::dec_ref( nbio_queue ); - throw Exception(); - } -} - -#endif - - -// ssl_socket_server.cpp -using yield::platform::NBIOQueue; - - -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -SSLSocketServer::SSLSocketServer -( - SSLSocket& listen_ssl_socket, - Log* error_log, - Log* trace_log -) : TCPSocketServer - ( - listen_ssl_socket, - error_log, - trace_log - ) -{ } - -SSLSocket& -SSLSocketServer::createListenSSLSocket -( - const SocketAddress& sockname, - SSLContext& ssl_context, - Log* trace_log -) -{ - NBIOQueue* nbio_queue = NBIOQueue::create(); - - if ( nbio_queue != NULL ) - { - SSLSocket* listen_ssl_socket; - if ( trace_log != NULL ) - listen_ssl_socket = TracingSSLSocket::create( *trace_log, ssl_context ); - else - listen_ssl_socket = SSLSocket::create( ssl_context ); - - if - ( - listen_ssl_socket != NULL - && - static_cast( listen_ssl_socket )->associate( *nbio_queue ) - && - init_listen_tcp_socket( *listen_ssl_socket, sockname ) - ) - { - NBIOQueue::dec_ref( *nbio_queue ); - return *listen_ssl_socket; - } - else - { - SSLSocket::dec_ref( listen_ssl_socket ); - NBIOQueue::dec_ref( *nbio_queue ); - } - } - - throw Exception(); -} - -#endif - - -// stream_socket_client.cpp -#ifdef _WIN32 -#include -#define ESHUTDOWN WSAESHUTDOWN -#endif - - -template -StreamSocketClient::StreamSocketClient -( - SocketAddress& peername, - Configuration* configuration, - Log* error_log, - Log* trace_log -) : SocketClient( peername, error_log, trace_log ) -{ - if ( configuration != NULL ) - this->configuration = configuration; - else - this->configuration = new Configuration; -} - -template -StreamSocketClient::~StreamSocketClient() -{ - Configuration::dec_ref( *configuration ); -} - - -template -StreamSocketClient::Connection::Connection -( - StreamSocketType& stream_socket, - StreamSocketClient& stream_socket_client -) -: connect_timeout - ( - stream_socket_client.get_configuration().get_connect_timeout() - ), - error_log( Object::inc_ref( stream_socket_client.get_error_log() ) ), - peername( stream_socket_client.get_peername().inc_ref() ), - reconnect_tries_max - ( - stream_socket_client.get_configuration().get_reconnect_tries_max() - ), - recv_timeout( stream_socket_client.get_configuration().get_recv_timeout() ), - send_timeout( stream_socket_client.get_configuration().get_send_timeout() ), - stream_socket( stream_socket ), - trace_log( Object::inc_ref( stream_socket_client.get_trace_log() ) ) -{ - // connect_tries == 0 means "never tried to connect" - // connect_tries > 0 means "connected" - // connect_tries < 0 means "failed to connect abs( connect_tries ) times" - connect_tries = 0; -#ifdef _DEBUG - single_thread_id = 0; -#endif -} - -template -StreamSocketClient::Connection::~Connection() -{ - close(); - Log::dec_ref( error_log ); - SocketAddress::dec_ref( peername ); - StreamSocket::dec_ref( stream_socket ); - Log::dec_ref( trace_log ); -} - -template -void -StreamSocketClient::Connection::aio_recv -( - Buffer& buffer, - void* context, - int flags -) -{ - get_stream_socket().aio_recv - ( - buffer, - *this, - context, - flags, - recv_timeout - ); -} - -template -void -StreamSocketClient::Connection::aio_sendmsg -( - Buffers& buffers, - void* context, - int flags -) -{ - if ( connect_tries <= 0 ) - { - Buffer& buffer = buffers.join(); - Buffers::dec_ref( buffers ); - - get_stream_socket().aio_connect - ( - get_peername(), - *this, - context, - &buffer, - connect_timeout - ); - } - else - { - get_stream_socket().aio_sendmsg - ( - buffers, - *this, - context, - flags, - send_timeout - ); - } -} - -#ifdef _DEBUG -template -void -StreamSocketClient::Connection:: -assert_single_threaded() -{ - if ( single_thread_id == 0 ) - single_thread_id = Thread::gettid(); - else if ( single_thread_id != Thread::gettid() ) - DebugBreak(); -} -#endif - -template -void StreamSocketClient::Connection::close() -{ - get_stream_socket().shutdown(); - get_stream_socket().close(); -} - -template -uint16_t -StreamSocketClient::Connection:: -get_remaining_connect_tries() -{ - return connect_tries + reconnect_tries_max; -} - -template -void -StreamSocketClient::Connection:: -onConnectCompletion -( - size_t bytes_sent, - void* context -) -{ - connect_tries = 1; - - //if ( get_trace_log() != NULL ) - //{ - // get_trace_log()->get_stream( Log::LOG_INFO ) << - // "yield::ipc::SocketClient: successfully connected to :" << - // get_peername().get_port() << " on socket #" << - // static_cast( stream_socket ) << "."; - - // //log->get_stream( Log::LOG_INFO ) << - // //"yield::ipc::SocketClient: writing " << request.get_type_name() - // //<< "/" << reinterpret_cast( &request ) << - // //" to :" << client.get_get_peername()().get_port() << - // //" on socket #" << static_cast( stream_socket ) << "."; - //} - - if ( bytes_sent > 0 ) - this->onWriteCompletion( bytes_sent, context ); - - aio_recv( *new StackBuffer<1024>, 0, NULL ); -} - -template -void -StreamSocketClient::Connection:: -onConnectError -( - uint32_t error_code, - void* context -) -{ - connect_tries -= 1; - - if ( get_error_log() != NULL ) - { - get_error_log()->get_stream( Log::LOG_ERR ) << - "yield::ipc::SocketClient: connect() to :" << - get_peername().get_port() << - " failed: " << Exception( error_code ) << "."; - } - - onError( error_code, context ); -} - -template -void -StreamSocketClient::Connection:: -onError -( - uint32_t error_code, - void* context -) -{ - if ( !get_stream_socket().recreate() ) - DebugBreak(); - - if ( connect_tries > 0 ) - connect_tries = 0; -} - -template -void -StreamSocketClient::Connection:: -onReadError -( - uint32_t error_code, - void* context -) -{ - if ( get_error_log() != NULL ) - { - //log->get_stream( Log::LOG_ERR ) << - //"yield::ipc::SocketClient: error reading " << response->get_type_name() << - // "/" << reinterpret_cast( response ) << - //" from socket #" << static_cast( stream_socket ) << - //", error='" << Exception( error_code ) << - //"', responding to " << request.get_type_name() << - // "/" << reinterpret_cast( &request ) << - // " with Exception."; - } - - onError( error_code, context ); -} - -template -void -StreamSocketClient::Connection:: -onWriteError -( - uint32_t error_code, - void* context -) -{ - if ( get_error_log() != NULL ) - { - //log->get_stream( Log::LOG_ERR ) << - //"yield::ipc::SocketClient: error writing " << - //request.get_type_name() << - // "/" << reinterpret_cast( &request ) << - //" to socket #" << static_cast( stream_socket ) << - //", error='" << Exception( error_code ) << - //"', responding to " << request.get_type_name() << - // "/" << reinterpret_cast( &request ) << - // " with Exception."; - } - - onError( error_code, context ); -} - -template -void -StreamSocketClient::Connection:: -reset_connect_tries() -{ - this->connect_tries = 0; -} - -template class StreamSocketClient; -template class StreamSocketClient; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL -template class StreamSocketClient; -#endif - - -// stream_socket_server.cpp -template -StreamSocketServer::StreamSocketServer -( - StreamSocketType& listen_stream_socket, - Log* error_log, - Log* trace_log -) : SocketServer( error_log, trace_log ), - listen_stream_socket( listen_stream_socket ) -{ } - -template -StreamSocketServer::~StreamSocketServer() -{ - StreamSocketType::dec_ref( listen_stream_socket ); -} - -template -void -StreamSocketServer::onAcceptError -( - uint32_t error_code, - void* -) -{ - // listen_stream_socket->aio_accept( *this ); -} - -template -void -StreamSocketServer::onReadError -( - Connection& connection, - uint32_t -) -{ - // TODO: keep a list of connections, delete the connection from the list here - // Also do logging here? - Connection::dec_ref( connection ); -} - -template -void -StreamSocketServer::onWriteError -( - Connection& connection, - uint32_t -) -{ - Connection::dec_ref( connection ); -} - - -template -StreamSocketServer::Connection::Connection -( - StreamSocketType& stream_socket, - StreamSocketServer& stream_socket_server -) - : stream_socket( stream_socket ), - stream_socket_server( stream_socket_server ) -{ } - -template -StreamSocketServer::Connection::~Connection() -{ - StreamSocket::dec_ref( stream_socket ); -} - -template -void -StreamSocketServer::Connection:: -aio_recv -( - Buffer& buffer, - void* context, - int flags -) -{ - get_stream_socket().aio_recv - ( - buffer, - *this, - context, - flags, - StreamSocket::TIMEOUT_INFINITE // get_configuration().get_recv_timeout() - ); -} - -template -void -StreamSocketServer::Connection:: -aio_sendmsg -( - Buffers& buffers, - void* context, - int flags -) -{ - get_stream_socket().aio_sendmsg - ( - buffers, - *this, - context, - flags, - StreamSocket::TIMEOUT_INFINITE // get_configuration().get_send_timeout() - ); -} - -template -void StreamSocketServer::Connection::onReadError -( - uint32_t error_code, - void* -) -{ - stream_socket.shutdown(); - stream_socket.close(); - stream_socket_server.onReadError( *this, error_code ); -} - -template -void -StreamSocketServer::Connection::onWriteCompletion -( - size_t bytes_sent, - void* -) -{ } - -template -void -StreamSocketServer::Connection::onWriteError -( - uint32_t error_code, - void* -) -{ - stream_socket.shutdown(); - stream_socket.close(); - stream_socket_server.onWriteError( *this, error_code ); -} - -template class StreamSocketServer; -template class StreamSocketServer; -#ifdef YIELD_PLATFORM_HAVE_OPENSSL -template class StreamSocketServer; -#endif - - -// tcp_socket_client.cpp -using yield::platform::IOQueue; -using yield::platform::NBIOQueue; -#ifdef _WIN32 -using yield::platform::Win32AIOQueue; -#endif - - -TCPSocketClient::TCPSocketClient -( - SocketAddress& peername, - Configuration* configuration, - Log* error_log, - Log* trace_log -) - : StreamSocketClient - ( - peername, - configuration, - error_log, - trace_log - ) -{ } - -TCPSocket& TCPSocketClient::createTCPSocket( Log* trace_log ) -{ - NBIOQueue* nbio_queue = NULL; -#ifdef _WIN32 - Win32AIOQueue* win32_aio_queue = NULL; -#endif - TCPSocket* tcp_socket; - - if ( trace_log != NULL ) - { - nbio_queue = NBIOQueue::create(); - tcp_socket = TracingTCPSocket::create( *trace_log ); - } - else - { -#ifdef _WIN32 - win32_aio_queue = Win32AIOQueue::create(); -#else - nbio_queue = NBIOQueue::create(); -#endif - tcp_socket = TCPSocket::create(); - } - - if - ( -#ifdef _WIN32 - ( nbio_queue != NULL || win32_aio_queue != NULL ) -#else - ( nbio_queue != NULL ) -#endif - && - tcp_socket != NULL - && - ( - ( nbio_queue != NULL && tcp_socket->associate( *nbio_queue ) ) -#ifdef _WIN32 - || - ( win32_aio_queue != NULL && tcp_socket->associate( *win32_aio_queue ) ) -#endif - ) - ) - { - NBIOQueue::dec_ref( nbio_queue ); -#ifdef _WIN32 - Win32AIOQueue::dec_ref( win32_aio_queue ); -#endif - return *tcp_socket; - } - else - { - NBIOQueue::dec_ref( nbio_queue ); -#ifdef _WIN32 - Win32AIOQueue::dec_ref( win32_aio_queue ); -#endif - TCPSocket::dec_ref( tcp_socket ); - throw Exception(); - } -} - - -// tcp_socket_server.cpp -using yield::platform::IOQueue; -using yield::platform::NBIOQueue; -#ifdef _WIN32 -using yield::platform::Win32AIOQueue; -#endif - - -TCPSocketServer::TCPSocketServer -( - TCPSocket& listen_tcp_socket, - Log* error_log, - Log* trace_log -) - : StreamSocketServer - ( - listen_tcp_socket, - error_log, - trace_log - ) -{ } - -TCPSocket& -TCPSocketServer::createListenTCPSocket -( - const SocketAddress& sockname, - Log* trace_log -) -{ - TCPSocket& tcp_socket = TCPSocketClient::createTCPSocket( trace_log ); - if ( init_listen_tcp_socket( tcp_socket, sockname ) ) - return tcp_socket; - else - { - TCPSocket::dec_ref( tcp_socket ); - throw Exception(); - } -} - -TCPSocket& TCPSocketServer::get_listen_tcp_socket() const -{ - return StreamSocketServer::get_listen_stream_socket(); -} - -bool -TCPSocketServer::init_listen_tcp_socket -( - TCPSocket& listen_tcp_socket, - const SocketAddress& sockname -) -{ - return listen_tcp_socket.bind( sockname ) - && - listen_tcp_socket.listen() - && - listen_tcp_socket.setsockopt( Socket::OPTION_SO_KEEPALIVE, true ) - && - listen_tcp_socket.setsockopt( Socket::OPTION_SO_LINGER, true ) - && - listen_tcp_socket.setsockopt( TCPSocket::OPTION_TCP_NODELAY, true ); -} - - -// tracing_socket.cpp -#ifdef _WIN32 -#include -#endif - - -TracingSocket::TracingSocket( Log& log, socket_t socket_ ) - : log( log.inc_ref() ), socket_( socket_ ) -{ - SocketAddress* peername = Socket::getpeername( socket_ ); - if ( peername != NULL ) - { - set_peername( *peername ); - SocketAddress::dec_ref( *peername ); - } - else - this->peername = "(unknown)"; - - SocketAddress* sockname = Socket::getsockname( socket_ ); - if ( sockname != NULL ) - { - set_sockname( *sockname ); - SocketAddress::dec_ref( *sockname ); - } - else - { - ostringstream sockname; - sockname << "socket #" << socket_; - this->sockname = sockname.str(); - } -} - -TracingSocket::~TracingSocket() -{ - Log::dec_ref( log ); -} - -void TracingSocket::set_peername( const SocketAddress& peername ) -{ - this->peername = peername; -} - -void TracingSocket::set_sockname( const SocketAddress& sockname ) -{ - this->sockname = sockname; -} - -StreamSocket* TracingSocket::trace_accept( StreamSocket* ret ) -{ - uint32_t last_error = Exception::get_last_error(); - - if ( ret != NULL ) - { - string peername; - SocketAddress* peername_sockaddr = ret->getpeername(); - if ( peername_sockaddr != NULL ) - { - peername = *peername_sockaddr; - SocketAddress::dec_ref( *peername_sockaddr ); - } - else - { - ostringstream peername_oss; - peername_oss << "(socket #" << static_cast( *ret ) << ")"; - peername = peername_oss.str(); - } - - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << this->sockname << "):" << - " accepted connection from " << peername << "."; - } -#ifdef _WIN32 - else if ( last_error == WSAEWOULDBLOCK ) -#else - else if ( last_error == EWOULDBLOCK ) -#endif - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " accept() would block."; - } - else - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" - " encountered error on accept(): " << - yield::platform::Exception( last_error ) << "."; - } - - Exception::set_last_error( last_error ); - - return ret; -} - -bool TracingSocket::trace_bind( const SocketAddress& sockname, bool ret ) -{ - uint32_t last_error = Exception::get_last_error(); - - if ( ret ) - { - // Try getsockname in case it was an ephemeral bind - SocketAddress* real_sockname = Socket::getsockname( socket_ ); - if ( real_sockname != NULL ) - { - set_sockname( *real_sockname ); - SocketAddress::dec_ref( *real_sockname ); - } - else - set_sockname( sockname ); - } - else - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket: failed to bind " << this->sockname << - " to " << static_cast( sockname ) << - ": " << yield::platform::Exception( last_error ) << "."; - } - - Exception::set_last_error( last_error ); - - return ret; -} - -bool TracingSocket::trace_connect( const SocketAddress& peername, bool ret ) -{ - uint32_t last_error = Exception::get_last_error(); - - set_peername( peername ); - - if ( ret ) - { - SocketAddress* sockname = Socket::getsockname( socket_ ); - if ( sockname != NULL ) - { - set_sockname( *sockname ); - SocketAddress::dec_ref( *sockname ); - } - - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << this->sockname << "):" << - " successfully connected to " << this->peername << "."; - } -#ifdef _WIN32 - else if ( last_error == WSAEWOULDBLOCK ) -#else - else if ( last_error == EWOULDBLOCK ) -#endif - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << this->sockname << "):" << - " connect() to " << this->peername << " would block."; - } - else - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << this->sockname << "):" << - " connect() to " << this->peername << - " failed: " << yield::platform::Exception( last_error ) << "."; - } - - Exception::set_last_error( last_error ); - - return ret; -} - -ssize_t TracingSocket::trace_recv( void* buf, size_t buflen, ssize_t ret ) -{ - uint32_t last_error = Exception::get_last_error(); - - if ( ret > 0 ) - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" - " received " << ret << "/" << buflen << - " bytes from " << peername << "."; - - log.write( buf, static_cast( ret ), Log::LOG_DEBUG ); - log.write("\n", Log::LOG_DEBUG ); - } - else if ( ret == 0 ) - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" - " lost connection while trying to recv(" << buflen << ")" - " from " << peername << "."; - } -#ifdef _WIN32 - else if ( last_error == WSAEWOULDBLOCK ) -#else - else if ( last_error == EWOULDBLOCK ) -#endif - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " recv(" << buflen << ") from " << peername << " would block."; - } - else - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" - " encountered error while trying to recv(" << buflen << ")" << - " from " << peername << - ": " << yield::platform::Exception( last_error ) << "."; - } - - Exception::set_last_error( last_error ); - - return ret; -} - -ssize_t TracingSocket::trace_send( const void* buf, size_t buflen, ssize_t ret ) -{ - uint32_t last_error = Exception::get_last_error(); - - if ( ret >= 0 ) - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " sent " << ret << "/" << buflen << - " bytes to " << peername << "."; - - log.write( buf, buflen, Log::LOG_DEBUG ); - log.write("\n", Log::LOG_DEBUG ); - } -#ifdef _WIN32 - else if ( last_error == WSAEWOULDBLOCK ) -#else - else if ( last_error == EWOULDBLOCK ) -#endif - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " send(" << buflen << ") to " << peername << " would block."; - } - else - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " encountered error while trying to send(" << buflen << ")" - " to " << peername << - ": " << yield::platform::Exception( last_error ) << "."; - } - - Exception::set_last_error( last_error ); - - return ret; -} - -ssize_t -TracingSocket::trace_sendmsg -( - const struct iovec* iov, - uint32_t iovlen, - ssize_t ret -) -{ - uint32_t last_error = Exception::get_last_error(); - - ssize_t buflen = 0; - for ( uint32_t iov_i = 0; iov_i < iovlen; iov_i++ ) - buflen += iov[iov_i].iov_len; - - if ( ret >= 0 ) - { - size_t temp_ret = static_cast( ret ); - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " sent " << ret << "/" << buflen << - " bytes to " << peername << "."; - - for ( uint32_t iov_i = 0; iov_i < iovlen; iov_i++ ) - { - if ( iov[iov_i].iov_len <= temp_ret ) - { - log.write( iov[iov_i].iov_base, iov[iov_i].iov_len, Log::LOG_DEBUG ); - temp_ret -= iov[iov_i].iov_len; - } - else - { - log.write( iov[iov_i].iov_base, temp_ret, Log::LOG_DEBUG ); - break; - } - } - - log.write("\n", Log::LOG_DEBUG ); - } -#ifdef _WIN32 - else if ( last_error == WSAEWOULDBLOCK ) -#else - else if ( last_error == EWOULDBLOCK ) -#endif - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " sendmsg(" << buflen << ") to " << peername << " would block."; - } - else - { - log.get_stream( Log::LOG_INFO ) << - "yield::ipc::TracingSocket(" << sockname << "):" << - " encountered error while trying to sendmsg(" << buflen << ")" << - " to" << peername << - ": " << yield::platform::Exception( last_error ) << "."; - } - - Exception::set_last_error( last_error ); - - return ret; -} - - -// tracing_ssl_socket.cpp -#ifdef YIELD_PLATFORM_HAVE_OPENSSL - -TracingSSLSocket::TracingSSLSocket -( - int domain, - Log& log, - socket_t socket_, - SSL* ssl, - SSLContext& ssl_context -) : SSLSocket( domain, socket_, ssl, ssl_context ), - TracingSocket( log, socket_ ) -{ } - -StreamSocket* TracingSSLSocket::accept() -{ - return trace_accept( SSLSocket::accept() ); -} - -bool TracingSSLSocket::bind( const SocketAddress& to_sockaddr ) -{ - return trace_bind( to_sockaddr, SSLSocket::bind( to_sockaddr ) ); -} - -bool TracingSSLSocket::connect( const SocketAddress& peername ) -{ - return trace_connect( peername, SSLSocket::connect( peername ) ); -} - -TracingSSLSocket* TracingSSLSocket::create( Log& log, SSLContext& ssl_context ) -{ - return create( DOMAIN_DEFAULT, log, ssl_context ); -} - -TracingSSLSocket* -TracingSSLSocket::create -( - int domain, - Log& log, - SSLContext& ssl_context -) -{ - SSL* ssl = SSL_new( ssl_context ); - if ( ssl != NULL ) - { - socket_t socket_ = Socket::create( &domain, TYPE, PROTOCOL ); - if ( socket_ != -1 ) - { - return new TracingSSLSocket - ( - domain, - log, - socket_, - ssl, - ssl_context - ); - } - else - { - SSL_free( ssl ); - return NULL; - } - } - else - return NULL; -} - -SSLSocket* TracingSSLSocket::dup() -{ - return StreamSocket::dup2 - ( - create - ( - get_domain(), - get_log(), - get_ssl_context() - ) - ); -} - -StreamSocket* TracingSSLSocket::dup2( socket_t socket_ ) -{ - SSL* ssl = SSL_new( get_ssl_context() ); - if ( ssl != NULL ) - { - return StreamSocket::dup2 - ( - new TracingSSLSocket - ( - get_domain(), - get_log(), - socket_, - ssl, - get_ssl_context() - ) - ); - } - else - return NULL; -} - -ssize_t TracingSSLSocket::recv( void* buf, size_t buflen, int flags ) -{ - return trace_recv( buf, buflen, SSLSocket::recv( buf, buflen, flags ) ); -} - -ssize_t TracingSSLSocket::send( const void* buf, size_t buflen, int flags ) -{ - return trace_send( buf, buflen, SSLSocket::send( buf, buflen, flags ) ); -} - -ssize_t -TracingSSLSocket::sendmsg -( - const struct iovec* iov, - uint32_t iovlen, - int flags -) -{ - return trace_sendmsg( iov, iovlen, SSLSocket::sendmsg( iov, iovlen, flags ) ); -} - -#endif - - -// tracing_tcp_socket.cpp -TracingTCPSocket::TracingTCPSocket( int domain, Log& log, socket_t socket_ ) - : TCPSocket( domain, socket_ ), - TracingSocket( log, socket_ ) -{ } - -StreamSocket* TracingTCPSocket::accept() -{ - return trace_accept( TCPSocket::accept() ); -} - -bool TracingTCPSocket::bind( const SocketAddress& to_sockaddr ) -{ - return trace_bind( to_sockaddr, TCPSocket::bind( to_sockaddr ) ); -} - -bool TracingTCPSocket::connect( const SocketAddress& peername ) -{ - return trace_connect( peername, TCPSocket::connect( peername ) ); -} - -TracingTCPSocket* TracingTCPSocket::create( Log& log ) -{ - return create( DOMAIN_DEFAULT, log ); -} - -TracingTCPSocket* TracingTCPSocket::create( int domain, Log& log ) -{ - socket_t socket_ = Socket::create( &domain, TYPE, PROTOCOL ); - if ( socket_ != INVALID_SOCKET ) - return new TracingTCPSocket( domain, log, socket_ ); - else - return NULL; -} - -TCPSocket* TracingTCPSocket::dup() -{ - return StreamSocket::dup2( create( get_domain(), get_log() ) ); -} - -StreamSocket* TracingTCPSocket::dup2( socket_t socket_ ) -{ - return StreamSocket::dup2 - ( - new TracingTCPSocket( get_domain(), get_log(), socket_ ) - ); -} - -ssize_t TracingTCPSocket::recv( void* buf, size_t buflen, int flags ) -{ - return trace_recv( buf, buflen, TCPSocket::recv( buf, buflen, flags ) ); -} - -ssize_t TracingTCPSocket::send( const void* buf, size_t buflen, int flags ) -{ - return trace_send( buf, buflen, TCPSocket::send( buf, buflen, flags ) ); -} - -ssize_t -TracingTCPSocket::sendmsg -( - const struct iovec* iov, - uint32_t iovlen, - int flags -) -{ - return trace_sendmsg( iov, iovlen, TCPSocket::sendmsg( iov, iovlen, flags ) ); -} - - -// tracing_udp_socket.cpp -TracingUDPSocket::TracingUDPSocket( int domain, Log& log, socket_t socket_ ) - : UDPSocket( domain, socket_ ), - TracingSocket( log, socket_ ) -{ } - -bool TracingUDPSocket::bind( const SocketAddress& to_sockaddr ) -{ - return trace_bind( to_sockaddr, UDPSocket::bind( to_sockaddr ) ); -} - -bool TracingUDPSocket::connect( const SocketAddress& peername ) -{ - return trace_connect( peername, UDPSocket::connect( peername ) ); -} - -TracingUDPSocket* TracingUDPSocket::create( Log& log ) -{ - return create( DOMAIN_DEFAULT, log ); -} - -TracingUDPSocket* TracingUDPSocket::create( int domain, Log& log ) -{ - socket_t socket_ = Socket::create( &domain, TYPE, PROTOCOL ); - if ( socket_ != -1 ) - return new TracingUDPSocket( domain, log, socket_ ); - else - return NULL; -} - -ssize_t TracingUDPSocket::recv( void* buf, size_t len, int flags ) -{ - return trace_recv( buf, len, UDPSocket::recv( buf, len, flags ) ); -} - -ssize_t -TracingUDPSocket::recvfrom -( - void* buf, - size_t len, - struct sockaddr_storage& peername, - int flags -) -{ - set_peername( peername ); - return trace_recv - ( - buf, - len, - UDPSocket::recvfrom( buf, len, peername, flags ) - ); -} - -ssize_t TracingUDPSocket::send( const void* buf, size_t len, int flags ) -{ - return trace_send( buf, len, UDPSocket::send( buf, len, flags ) ); -} - -ssize_t -TracingUDPSocket::sendmsg -( - const struct iovec* iov, - uint32_t iovlen, - int flags -) -{ - return trace_sendmsg( iov, iovlen, Socket::sendmsg( iov, iovlen, flags ) ); -} - -ssize_t -TracingUDPSocket::sendmsg -( - const struct iovec* iov, - uint32_t iovlen, - const SocketAddress& peername, - int flags -) -{ - set_peername( peername ); - return trace_sendmsg - ( - iov, - iovlen, - UDPSocket::sendmsg( iov, iovlen, peername, flags ) - ); -} - -ssize_t -TracingUDPSocket::sendto -( - const void* buf, - size_t len, - const SocketAddress& peername, - int flags -) -{ - set_peername( peername ); - return trace_send - ( - buf, - len, - UDPSocket::sendto( buf, len, peername, flags ) - ); -} - - -// udp_socket_client.cpp -using yidl::runtime::auto_Object; - - -using yield::platform::IOQueue; -using yield::platform::NBIOQueue; -#ifdef _WIN32 -using yield::platform::Win32AIOQueue; -#endif - - -UDPSocketClient::UDPSocketClient -( - SocketAddress& peername, - UDPSocket& udp_socket, - Log* error_log, - const Time& recv_timeout, - Log* trace_log -) -: SocketClient( peername, error_log, trace_log ), - recv_timeout( recv_timeout ), - udp_socket( udp_socket ) -{ } - -UDPSocket& UDPSocketClient::createConnectedUDPSocket -( - const URI& absolute_uri, - Log* trace_log -) -{ - auto_Object peername - = static_cast( absolute_uri ); - - UDPSocket& udp_socket = createUDPSocket( trace_log ); - - if ( udp_socket.connect( *peername ) ) - return udp_socket; - else - { - UDPSocket::dec_ref( udp_socket ); - throw Exception(); - } -} - - -UDPSocket& UDPSocketClient::createUDPSocket( Log* trace_log ) -{ - NBIOQueue* nbio_queue = NULL; -#ifdef _WIN32 - Win32AIOQueue* win32_aio_queue = NULL; -#endif - UDPSocket* udp_socket; - - if ( trace_log != NULL ) - { - nbio_queue = NBIOQueue::create(); - udp_socket = TracingUDPSocket::create( *trace_log ); - } - else - { -#ifdef _WIN32 - win32_aio_queue = Win32AIOQueue::create(); -#else - nbio_queue = NBIOQueue::create(); -#endif - udp_socket = UDPSocket::create(); - } - - if - ( -#ifdef _WIN32 - ( nbio_queue != NULL || win32_aio_queue != NULL ) -#else - ( nbio_queue != NULL ) -#endif - && - udp_socket != NULL - && - ( - ( nbio_queue != NULL && udp_socket->associate( *nbio_queue ) ) -#ifdef _WIN32 - || - ( win32_aio_queue != NULL && udp_socket->associate( *win32_aio_queue ) ) -#endif - ) - ) - { - NBIOQueue::dec_ref( nbio_queue ); -#ifdef _WIN32 - Win32AIOQueue::dec_ref( win32_aio_queue ); -#endif - return *udp_socket; - } - else - { - NBIOQueue::dec_ref( nbio_queue ); -#ifdef _WIN32 - Win32AIOQueue::dec_ref( win32_aio_queue ); -#endif - UDPSocket::dec_ref( udp_socket ); - throw Exception(); - } -} - -void UDPSocketClient::onReadCompletion( Buffer& buffer, void* context ) -{ -} - -void UDPSocketClient::onReadError( uint32_t error_code, void* context ) -{ - // TODO: error logging -} - - -// udp_socket_server.cpp -using yield::platform::IOQueue; -using yield::platform::NBIOQueue; -#ifdef _WIN32 -using yield::platform::Win32AIOQueue; -#endif - - -UDPSocketServer::UDPSocketServer -( - UDPSocket& udp_socket, - Log* error_log, - Log* trace_log -) -: SocketServer( error_log, trace_log ), - udp_socket( udp_socket ) -{ } - -UDPSocketServer::~UDPSocketServer() -{ - UDPSocket::dec_ref( udp_socket ); -} - -UDPSocket& UDPSocketServer::createBoundUDPSocket -( - const SocketAddress& sockname, - Log* trace_log -) -{ - UDPSocket& udp_socket = UDPSocketClient::createUDPSocket( trace_log ); - if ( udp_socket.bind( sockname ) ) - return udp_socket; - else - { - UDPSocket::dec_ref( udp_socket ); - throw Exception(); - } -} - - -UDPSocketServer::ResponseHandler::ResponseHandler -( - SocketAddress& peername, - UDPSocket& udp_socket -) -: peername( peername ), - udp_socket( udp_socket.inc_ref() ) -{ } - -UDPSocketServer::ResponseHandler::~ResponseHandler() -{ - SocketAddress::dec_ref( peername ); - UDPSocket::dec_ref( udp_socket ); -} - - -// uri.cpp -extern "C" -{ -}; - - -URI::URI() -{ } - -URI::URI( const char* uri ) -{ - init( uri, strnlen( uri, UINT16_MAX ) ); -} - -URI::URI( const string& uri ) -{ - init( uri.c_str(), uri.size() ); -} - -URI::URI( const char* uri, size_t uri_len ) -{ - init( uri, uri_len ); -} - -URI::URI( const char* scheme, const char* host, uint16_t port ) - : scheme( scheme ), host( host ), port( port ), resource( "/" ) -{ } - -URI::URI -( - const char* scheme, - const char* host, - uint16_t port, - const char* resource -) - : scheme( scheme ), host( host ), port( port ), resource( resource ) -{ } - -URI::URI( const URI& other ) -: scheme( other.scheme ), user( other.user ), password( other.password ), - host( other.host ), port( other.port ), resource( other.resource ) -{ } - -URI::URI( UriUriStructA& parsed_uri ) -{ - init( parsed_uri ); -} - -void URI::init( const char* uri, size_t uri_len ) -{ - UriParserStateA parser_state; - UriUriA parsed_uri; - parser_state.uri = &parsed_uri; - if ( uriParseUriExA( &parser_state, uri, uri + uri_len ) == URI_SUCCESS ) - { - init( parsed_uri ); - uriFreeUriMembersA( &parsed_uri ); - } - else - { - uriFreeUriMembersA( &parsed_uri ); - throw Exception( "invalid URI" ); - } -} - -void URI::init( UriUriA& parsed_uri ) -{ - scheme.assign - ( - parsed_uri.scheme.first, - static_cast - ( - parsed_uri.scheme.afterLast - parsed_uri.scheme.first - ) - ); - - host.assign - ( - parsed_uri.hostText.first, - static_cast - ( - parsed_uri.hostText.afterLast - parsed_uri.hostText.first - ) - ); - - if ( parsed_uri.portText.first != NULL ) - { - port - = static_cast - ( - strtol - ( - parsed_uri.portText.first, - NULL, - 0 - ) - ); - } - else - port = 0; - - if ( parsed_uri.userInfo.first != NULL ) - { - const char* userInfo_p = parsed_uri.userInfo.first; - while ( userInfo_p < parsed_uri.userInfo.afterLast ) - { - if ( *userInfo_p == ':' ) - { - user.assign - ( - parsed_uri.userInfo.first, - static_cast - ( - userInfo_p - parsed_uri.userInfo.first - ) - ); - - password.assign - ( - userInfo_p + 1, - static_cast - ( - parsed_uri.userInfo.afterLast - userInfo_p - 1 - ) - ); - - break; - } - userInfo_p++; - } - - if ( user.empty() ) // No colon found => no password, just the user - { - user.assign - ( - parsed_uri.userInfo.first, - static_cast - ( - parsed_uri.userInfo.afterLast - parsed_uri.userInfo.first - ) - ); - } - } - - if ( parsed_uri.pathHead != NULL ) - { - UriPathSegmentA* path_segment = parsed_uri.pathHead; - do - { - resource.append( "/" ); - resource.append - ( - path_segment->text.first, - static_cast - ( - path_segment->text.afterLast - path_segment->text.first - ) - ); - - path_segment = path_segment->next; - } - while ( path_segment != NULL ); - - if ( parsed_uri.query.first != NULL ) - { - UriQueryListA* query_list; - uriDissectQueryMallocA - ( - &query_list, - NULL, - parsed_uri.query.first, - parsed_uri.query.afterLast - ); - - UriQueryListA* query_list_p = query_list; - while ( query_list_p != NULL ) - { - query.insert( make_pair( query_list_p->key, query_list_p->value ) ); - query_list_p = query_list_p->next; - } - - uriFreeQueryListA( query_list ); - } - } - else - resource = "/"; -} - -string -URI::get_query_value -( - const string& key, - const char* default_query_value -) const -{ - multimap::const_iterator query_value_i - = query.find( key ); - - if ( query_value_i != query.end() ) - return query_value_i->second; - else - return default_query_value; -} - -multimap::const_iterator -URI::get_query_values -( - const string& key -) const -{ - return query.find( key ); -} - -URI& URI::operator=( const URI& other ) -{ - scheme = other.scheme; - user = other.user; - password = other.password; - host = other.host; - port = other.port; - resource = other.resource; - return *this; -} - -URI::operator string() const -{ - ostringstream uri_oss; - uri_oss << scheme << "://"; - if ( !user.empty() ) - uri_oss << user; - if ( !password.empty() ) - uri_oss << ":" << password; - uri_oss << host; - if ( port != 0 ) - uri_oss << ":" << port; - uri_oss << resource; - if ( !query.empty() ) - DebugBreak(); - return uri_oss.str(); -} - -URI::operator SocketAddress*() const -{ - return SocketAddress::getaddrinfo( get_host().c_str(), get_port() ); -} - -URI::operator SocketAddress&() const -{ - SocketAddress* sockaddr - = SocketAddress::getaddrinfo( get_host().c_str(), get_port() ); - - if ( sockaddr != NULL ) - return *sockaddr; - else - throw Exception(); -} - -URI* URI::parse( const char* uri ) -{ - return parse( uri, strnlen( uri, UINT16_MAX ) ); -} - -URI* URI::parse( const string& uri ) -{ - return parse( uri.c_str(), uri.size() ); -} - -URI* URI::parse( const char* uri, size_t uri_len ) -{ - UriParserStateA parser_state; - UriUriA parsed_uri; - parser_state.uri = &parsed_uri; - if ( uriParseUriExA( &parser_state, uri, uri + uri_len ) == URI_SUCCESS ) - { - URI* uri = new URI( parsed_uri ); - uriFreeUriMembersA( &parsed_uri ); - return uri; - } - else - { - uriFreeUriMembersA( &parsed_uri ); - return NULL; - } -} - diff --git a/share/yield/src/yield/platform.cpp b/share/yield/src/yield/platform.cpp deleted file mode 100644 index d665304d82b0717c5fbf715e67ed65a482810381..0000000000000000000000000000000000000000 --- a/share/yield/src/yield/platform.cpp +++ /dev/null @@ -1,14686 +0,0 @@ -#include "yield/platform.h" -using namespace yield::platform; - - -// bio_queue.cpp -class BIOQueue::Thread : public yield::platform::Thread -{ -public: - Thread( BIOCB& biocb ) - : biocb( biocb ) - { } - - // Thread - void run() - { - biocb.execute(); - BIOCB::dec_ref( biocb ); - } - -private: - BIOCB& biocb; -}; - - -BIOQueue* BIOQueue::create() -{ - return new BIOQueue; -} - -void BIOQueue::submit( BIOCB& biocb ) -{ - Thread* thread = new Thread( biocb ); - thread->start(); -} - - -// buffered_marshaller.cpp -BufferedMarshaller::BufferedMarshaller() -{ - buffers = new Buffers; -} - -BufferedMarshaller::~BufferedMarshaller() -{ - Buffers::dec_ref( *buffers ); -} - -void BufferedMarshaller::write( Buffers& value ) -{ - buffers->extend( value ); -} - -void BufferedMarshaller::write( const Key&, Buffer& value ) -{ - write( value ); -} - -void BufferedMarshaller::write( Buffer& value ) -{ - buffers->push_back( value ); -} - -void BufferedMarshaller::write( const Key&, char* value, size_t value_len ) -{ - write( value, value_len ); -} - -void BufferedMarshaller::write( char* value, size_t value_len ) -{ - buffers->push_back( value, value_len ); -} - -void -BufferedMarshaller::write -( - const Key&, - const char* value, - size_t value_len -) -{ - write( value, value_len ); -} - -void BufferedMarshaller::write( const char* value, size_t value_len ) -{ - buffers->push_back( value, value_len ); -} - - -// buffers.cpp -Buffers::Buffers() -{ - init(); -} - -Buffers::Buffers( Buffer& buffer ) - : vector( 1 ) -{ - vector::at( 0 ).iov_base = &buffer.inc_ref(); - vector::at( 0 ).iov_len = static_cast( -1 ); - init(); -} - -Buffers::Buffers( const struct iovec* iov, uint32_t iov_size ) - : vector( iov_size ) -{ - memcpy_s - ( - &vector::front(), - size() * sizeof( struct iovec ), - iov, - iov_size * sizeof( iov ) - ); - - init(); -} - -Buffers::Buffers( const Buffers& other ) - : vector( other ) -{ - for ( size_t iov_i = 0; iov_i < size(); iov_i++ ) - Object::inc_ref( get_Buffer( iov_i ) ); - - init(); -} - -Buffers::Buffers( const Buffers& head, const Buffers& tail ) - : vector( head ) -{ - vector::insert( end(), tail.begin(), tail.end() ); - - for ( size_t iov_i = 0; iov_i < size(); iov_i++ ) - Object::inc_ref( get_Buffer( iov_i ) ); - - init(); -} - -Buffers::~Buffers() -{ - for ( size_t iov_i = 0; iov_i < size(); iov_i++ ) - Buffer::dec_ref( get_Buffer( iov_i ) ); - - delete [] finalized_iov; - Buffer::dec_ref( joined_buffer ); -} - -void Buffers::extend( const Buffers& other ) -{ - size_t start_size = size(); - vector::insert( end(), other.begin(), other.end() ); - for ( size_t iov_i = start_size; iov_i < size(); iov_i++ ) - Object::inc_ref( get_Buffer( iov_i ) ); -} - -size_t Buffers::get( void* buf, size_t len ) -{ - char* buf_p = static_cast( buf ); - - uint32_t iov_i = 0; - size_t iov_off = position(); - size_t iov_len = get_iov_len( 0 ); - while ( iov_off >= iov_len ) - { - iov_off -= iov_len; - if ( ++iov_i < size() ) - iov_len = get_iov_len( iov_i ); - else - return 0; - } - - for ( ;; ) - { - if ( iov_len - iov_off < len ) - { - // len is larger than the current iovec - size_t copy_len = iov_len - iov_off; - memcpy_s - ( - buf_p, - len, - get_iov_base( iov_i ) + iov_off, - copy_len - ); - - buf_p += copy_len; - _position += copy_len; - - if ( ++iov_i < size() ) - { - len -= copy_len; - iov_off = 0; - iov_len = get_iov_len( iov_i ); - } - else - break; - } - else - { - // len is smaller than the current iovec - memcpy_s - ( - buf_p, - len, - get_iov_base( iov_i ) + iov_off, - len - ); - - buf_p += len; - _position += len; - - break; - } - } - - return buf_p - static_cast( buf ); -} - -Buffer* Buffers::get_Buffer( size_t iov_i ) const -{ - const struct iovec& iov = at( iov_i ); - if ( iov.iov_len == static_cast( -1 ) ) - return static_cast( iov.iov_base ); - else - return NULL; -} - -char* Buffers::get_iov_base( size_t iov_i ) const -{ - Buffer* buffer = get_Buffer( iov_i ); - if ( buffer != NULL ) - return static_cast( *buffer ); - else - return static_cast( at( iov_i ).iov_base ); -} - -size_t Buffers::get_iov_len( size_t iov_i ) const -{ - Buffer* buffer = get_Buffer( iov_i ); - if ( buffer != NULL ) - return buffer->size(); - else - return at( iov_i ).iov_len; -} - -void Buffers::init() -{ - finalized_iov = NULL; - joined_buffer = NULL; - _position = 0; -} - -void Buffers::insert( size_t i, Buffer& buffer ) -{ - struct iovec iov; - iov.iov_base = &buffer.inc_ref(); - iov.iov_len = static_cast( -1 ); - insert( i, iov ); -} - -void Buffers::insert( size_t i, Buffer* buffer ) -{ - struct iovec iov; - iov.iov_base = buffer; - iov.iov_len = static_cast( -1 ); - insert( i, iov ); -} - -void Buffers::insert( size_t i, char* buf ) -{ - insert( i, new StringBuffer( buf ) ); -} - -void Buffers::insert( size_t i, const char* buf ) -{ - insert( i, buf, strnlen( buf, UINT16_MAX ) ); -} - -void Buffers::insert( size_t i, const string& buf ) -{ - insert( i, new StringBuffer( buf ) ); -} - -void Buffers::insert( size_t i, void* buf, size_t len ) -{ - insert( i, new StringBuffer( static_cast( buf ), len ) ); -} - -void Buffers::insert( size_t i, const void* buf, size_t len ) -{ - struct iovec iov; - iov.iov_base = const_cast( buf ); - iov.iov_len = len; - insert( i, iov ); -} - -void Buffers::insert( size_t i, const struct iovec& iov ) -{ - vector::insert( begin() + i, iov ); -} - -Buffer& Buffers::join() -{ - if ( size() == 1 ) - { - Buffer* buffer = get_Buffer( 0 ); - if ( buffer != NULL ) - return buffer->inc_ref(); - } - - size_t join_size = this->join_size(); - - if ( joined_buffer != NULL && joined_buffer->size() == join_size ) - { - char* joined_buffer_p = *joined_buffer; - - uint32_t iov_i; - for ( iov_i = 0; iov_i < size(); iov_i++ ) - { - char* iov_base = get_iov_base( iov_i ); - size_t iov_len = get_iov_len( iov_i ); - if ( memcmp( joined_buffer_p, iov_base, iov_len ) == 0 ) - joined_buffer_p += iov_len; - else - break; - } - - if ( iov_i == size() ) // The joined_buffer has not changed - return joined_buffer->inc_ref(); - else - Buffer::dec_ref( *joined_buffer ); - } - - joined_buffer = new StringBuffer( join_size ); - char* joined_buffer_p = *joined_buffer; - - for ( uint32_t iov_i = 0; iov_i < size(); iov_i++ ) - { - char* iov_base = get_iov_base( iov_i ); - size_t iov_len = get_iov_len( iov_i ); - joined_buffer->put( iov_base, iov_len ); - joined_buffer_p += iov_len; - } - - return joined_buffer->inc_ref(); -} - -size_t Buffers::join_size() const -{ - size_t join_size = 0; - for ( uint32_t iov_i = 0; iov_i < size(); iov_i++ ) - join_size += get_iov_len( iov_i ); - return join_size; -} - -struct iovec Buffers::operator[]( int iov_i ) const -{ - Buffer* buffer = get_Buffer( iov_i ); - if ( buffer != NULL ) - return *buffer; - else - return vector::at( iov_i ); -} - -Buffers::operator const struct iovec*() -{ - for ( uint32_t iov_i = 0; iov_i < size(); iov_i++ ) - { - Buffer* buffer = get_Buffer( iov_i ); - if ( buffer != NULL ) - { - delete [] finalized_iov; - - finalized_iov = new struct iovec[size()]; - - for ( uint32_t iov_j = 0; iov_j < iov_i; iov_j++ ) - finalized_iov[iov_j] = at( iov_j ); - - finalized_iov[iov_i] = *buffer; - - for ( ; iov_i < size(); iov_i++ ) - { - buffer = get_Buffer( iov_i ); - if ( buffer != NULL ) - finalized_iov[iov_i] = *buffer; - else - finalized_iov[iov_i] = vector::at( iov_i ); - } - - return finalized_iov; - } - } - - // No Buffers - return &front(); -} - -Buffers::operator char*() -{ - Buffer& joined_buffer = join(); - Buffer::dec_ref( joined_buffer ); - return joined_buffer; -} - -Buffers::operator unsigned char*() -{ - Buffer& joined_buffer = join(); - Buffer::dec_ref( joined_buffer ); - return joined_buffer; -} - -void Buffers::position( size_t new_position ) -{ - size_t join_size = this->join_size(); - if ( new_position <= join_size ) - _position = new_position; - else - _position = join_size; -} - -void Buffers::push_back( Buffer& buffer ) -{ - struct iovec iov; - iov.iov_base = &buffer.inc_ref(); - iov.iov_len = static_cast( -1 ); - push_back( iov ); -} - -void Buffers::push_back( Buffer* buffer ) -{ - struct iovec iov; - iov.iov_base = buffer; - iov.iov_len = static_cast( -1 ); - push_back( iov ); -} - -void Buffers::push_back( char* buf ) -{ - push_back( new StringBuffer( buf ) ); -} - -void Buffers::push_back( const char* buf ) -{ - push_back( buf, strnlen( buf, UINT16_MAX ) ); -} - -void Buffers::push_back( const string& buf ) -{ - push_back( new StringBuffer( buf ) ); -} - -void Buffers::push_back( void* buf, size_t len ) -{ - push_back( new StringBuffer( static_cast( buf ), len ) ); -} - -void Buffers::push_back( const void* buf, size_t len ) -{ - struct iovec iov; - iov.iov_base = const_cast( buf ); - iov.iov_len = len; - push_back( iov ); -} - -void Buffers::push_back( const struct iovec& iov ) -{ - vector::push_back( iov ); -} - -uint32_t Buffers::size() const -{ - return static_cast( vector::size() ); -} - - -// channel.cpp -void -Channel::aio_read -( - Buffer& buffer, - AIOReadCallback& callback, - void* callback_context, - const Time& timeout -) -{ - ssize_t read_ret = read( buffer ); - if ( read_ret >= 0 ) - { - callback.onReadCompletion - ( - buffer, - callback_context - ); - } - else - callback.onReadError( Exception::get_last_error(), callback_context ); - - Buffer::dec_ref( buffer ); -} - -void -Channel::aio_write -( - Buffer& buffer, - AIOWriteCallback& callback, - void* callback_context, - const Time& timeout -) -{ - ssize_t write_ret = write( buffer ); - if ( write_ret >= 0 ) - { -#ifdef _DEBUG - if ( static_cast( write_ret ) != buffer.size() ) - DebugBreak(); -#endif - callback.onWriteCompletion( write_ret, callback_context ); - } - else - callback.onWriteError( Exception::get_last_error(), callback_context ); - - Buffer::dec_ref( buffer ); -} - -void -Channel::aio_writev -( - Buffers& buffers, - AIOWriteCallback& callback, - void* callback_context, - const Time& timeout -) -{ - ssize_t writev_ret = writev( buffers ); - - if ( writev_ret >= 0 ) - callback.onWriteCompletion( writev_ret, callback_context ); - else - callback.onWriteError( Exception::get_last_error(), callback_context ); - - Buffer::dec_ref( buffers ); -} - -ssize_t Channel::read( Buffer& buffer ) -{ - ssize_t read_ret - = read - ( - static_cast( buffer ) + buffer.size(), - buffer.capacity() - buffer.size() - ); - - if ( read_ret > 0 ) - buffer.resize( buffer.size() + static_cast( read_ret ) ); - - return read_ret; -} - -ssize_t Channel::read( void* buf, size_t len ) -{ - DebugBreak(); - return -1; -} - -ssize_t Channel::write( const Buffer& buffer ) -{ - return write( static_cast( buffer ), buffer.size() ); -} - -ssize_t Channel::write( const void* buf, size_t len ) -{ - DebugBreak(); - return -1; -} - -ssize_t Channel::writev( Buffers& buffers ) -{ - return writev( buffers, buffers.size() ); -} - -ssize_t Channel::writev( const struct iovec* iov, uint32_t iovlen ) -{ - if ( iovlen == 1 ) - return write( iov[0].iov_base, iov[0].iov_len ); - else - { - string buffer; - for ( uint32_t iov_i = 0; iov_i < iovlen; iov_i++ ) - { - buffer.append - ( - static_cast( iov[iov_i].iov_base ), - iov[iov_i].iov_len - ); - } - - return write( buffer.c_str(), buffer.size() ); - } -} - - -// directory.cpp -#ifdef _WIN32 -#include -#else -#include -#endif - - -class Directory::IOReadChangesCB -{ -protected: - IOReadChangesCB - ( - AIOReadChangesCallback& callback, - void* callback_context, - Directory& directory, - bool recursive - ) - : callback( callback.inc_ref() ), - callback_context( callback_context ), - directory( directory.inc_ref() ), - recursive( recursive ) - { } - - ~IOReadChangesCB() - { - AIOReadChangesCallback::dec_ref( callback ); - Directory::dec_ref( directory ); - } - - AIOReadChangesCallback& get_callback() const { return callback; } - void* get_callback_context() const { return callback_context; } - Directory& get_directory() const { return directory; } - bool get_recursive() const { return recursive; } - - bool isdir( const Path& path ) const - { - return Volume().isdir( path ); - } - - void onReadChangesError() - { - onReadChangesError( Exception::get_last_error() ); - } - - void onReadChangesError( uint32_t error_code ) - { - callback.onError( error_code, callback_context ); - } - -private: - AIOReadChangesCallback& callback; - void* callback_context; - Directory& directory; - bool recursive; -}; - - -class Directory::BIOReadChangesCB : public BIOCB, private IOReadChangesCB -{ -public: - BIOReadChangesCB - ( - AIOReadChangesCallback& callback, - void* callback_context, - Directory& directory, - bool recursive - ) - : IOReadChangesCB( callback, callback_context, directory, recursive ) - { } - - // BIOCB - void execute() - { } -}; - -#ifdef YIELD_PLATFORM_HAVE_LINUX_INOTIFY -class Directory::inotifyReadChangesCB : public NBIOCB, private IOReadChangesCB -{ -public: - inotifyReadChangesCB - ( - AIOReadChangesCallback& callback, - void* callback_context, - Directory& directory, - fd_t inotify_fd, - bool recursive - ) - : IOReadChangesCB( callback, callback_context, directory, recursive ), - inotify_fd( inotify_fd ) - { } - - ~inotifyReadChangesCB() - { - close( inotify_fd ); - } - - // NBIOCB - void execute() - { - } - - fd_t get_fd() const { return inotify_fd; } - - void onError( uint32_t error_code ) - { - set_state( STATE_ERROR ); - onReadChangesError( error_code ); - } - -private: - fd_t inotify_fd; -}; -#endif - - -#ifdef _WIN32 - class Directory::Win32AIOReadChangesCB - : public Win32AIOCB, private IOReadChangesCB -{ -public: - Win32AIOReadChangesCB - ( - AIOReadChangesCallback& callback, - void* callback_context, - Directory& directory, - bool recursive - ) - : IOReadChangesCB( callback, callback_context, directory, recursive ) - { } - - ~Win32AIOReadChangesCB() - { - while ( !old_file_path_stack.empty() ) - { - delete old_file_path_stack.top(); - old_file_path_stack.pop(); - } - } - - // Win32AIOCB - void execute() - { - if - ( - ReadDirectoryChangesW - ( - get_directory(), - file_notify_info, - sizeof( file_notify_info ), - get_recursive() ? TRUE : FALSE, - FILE_NOTIFY_CHANGE_FILE_NAME| - FILE_NOTIFY_CHANGE_DIR_NAME| - FILE_NOTIFY_CHANGE_SIZE| - FILE_NOTIFY_CHANGE_CREATION| - FILE_NOTIFY_CHANGE_LAST_WRITE, - NULL, - *this, - NULL - ) - ) - set_state( STATE_WANT_READ ); - else - { - set_state( STATE_ERROR ); - onReadChangesError(); - } - } - - HANDLE get_fd() const { return get_directory(); } - - void onCompletion( DWORD dwBytesTransferred ) - { - DWORD dwDirectoryChangesOffset = 0; - - for ( ;; ) - { - FILE_NOTIFY_INFORMATION* file_notify_info - = reinterpret_cast - ( - &file_notify_info[dwDirectoryChangesOffset] - ); - - wchar_t* file_name = file_notify_info->FileName; - size_t file_name_len = wcslen( file_name ); - // file_notify_info->FileNameLength; - // For some reason FileNameLength is usually longer than the actual - // null-terminated string; padding? - Path file_path = get_directory().get_path() - + - Path( file_name, file_name_len ); - - switch ( file_notify_info->Action ) - { - case FILE_ACTION_ADDED: - { - if ( isdir( file_path ) ) - { - get_callback().onDirectoryAddition - ( - file_path, - get_callback_context() - ); - } - else - get_callback().onFileAddition( file_path, get_callback_context() ); - } - break; - - case FILE_ACTION_MODIFIED: - { - if ( isdir( file_path ) ) - { - get_callback().onDirectoryModification - ( - file_path, - get_callback_context() - ); - } - else - { - get_callback().onFileModification - ( - file_path, - get_callback_context() - ); - } - } - break; - - case FILE_ACTION_REMOVED: - { - get_callback().onDeletion( file_path, get_callback_context() ); - } - break; - - case FILE_ACTION_RENAMED_NEW_NAME: - { -#ifdef _DEBUG - if ( old_file_path_stack.empty() ) DebugBreak(); -#endif - Path* old_file_path = old_file_path_stack.top(); - old_file_path_stack.pop(); - - if ( isdir( file_path ) ) - { - get_callback().onDirectoryRename - ( - *old_file_path, - file_path, - get_callback_context() - ); - } - else - { - get_callback().onFileRename - ( - *old_file_path, - file_path, - get_callback_context() - ); - } - - delete old_file_path; - } - break; - - case FILE_ACTION_RENAMED_OLD_NAME: - { - old_file_path_stack.push( new Path( file_path ) ); - } - break; - - default: DebugBreak(); - } - - if ( file_notify_info->NextEntryOffset > 0 ) - dwDirectoryChangesOffset += file_notify_info->NextEntryOffset; - else - break; - } - } - - void onError( DWORD dwErrorCode ) - { - set_state( STATE_ERROR ); - onReadChangesError( dwErrorCode ); - } - -private: - char file_notify_info[( sizeof( FILE_NOTIFY_INFORMATION ) + MAX_PATH ) * 16]; - stack old_file_path_stack; -}; -#endif - - -Directory::Directory() -#ifdef _WIN32 - : hDirectory( INVALID_HANDLE_VALUE ), hFindFile( INVALID_HANDLE_VALUE ) -#else - : dirp( NULL ) -#endif -{ - init(); -} - -Directory::Directory( const Path& path ) -#ifdef _WIN32 - : hDirectory( INVALID_HANDLE_VALUE ), hFindFile( INVALID_HANDLE_VALUE ) -#else - : dirp( NULL ) -#endif - , path( path ) -{ - init(); -} - -#ifdef _WIN32 -Directory::Directory( HANDLE hDirectory, const Path& path ) - : hDirectory( hDirectory ), hFindFile( INVALID_HANDLE_VALUE ), path( path ) -{ - init(); -} -#else -Directory::Directory( void* dirp, const Path& path ) - : dirp( dirp ), path( path ) -{ - init(); -} -#endif - -Directory::~Directory() -{ - close(); -} - -void -Directory::aio_read_changes -( - AIOReadChangesCallback& callback, - void* callback_context -) -{ - -} - -bool Directory::associate( BIOQueue& bio_queue ) -{ - if ( !have_io_queue() ) - { - this->bio_queue = &bio_queue; - return true; - } - else - return false; -} - -#if defined(YIELD_PLATFORM_HAVE_LINUX_INOTIFY) -bool Directory::associate( NBIOQueue& nbio_queue ) -{ - if ( !have_io_queue() ) - { - this->nbio_queue = &nbio_queue.inc_ref(); - return true; - } - else - return false; -} -#elif defined(_WIN32) -bool Directory::associate( Win32AIOQueue& win32_aio_queue ) -{ - if ( !have_io_queue() ) - { - if ( win32_aio_queue.associate( *this ) ) - { - this->win32_aio_queue = &win32_aio_queue.inc_ref(); - return true; - } - else - return false; - } - else - return false; -} -#endif - -bool Directory::close() -{ -#ifdef _WIN32 - if ( hDirectory != INVALID_HANDLE_VALUE ) - { - CloseHandle( hDirectory ); - hDirectory = INVALID_HANDLE_VALUE; - - if ( hFindFile != INVALID_HANDLE_VALUE ) - { - FindClose( hFindFile ); - hFindFile = INVALID_HANDLE_VALUE; - } - - return true; - } -#else - if ( dirp != NULL ) - { - closedir( static_cast( dirp ) ); - dirp = NULL; - return true; - } -#endif - else - return false; -} - -bool Directory::have_io_queue() const -{ - if ( bio_queue != NULL ) - return true; - else - { -#if defined(YIELD_PLATFORM_HAVE_LINUX_INOTIFY) - return nbio_queue != NULL; -#elif defined(_WIN32) - return win32_aio_queue != NULL; -#endif - } -} - -void Directory::init() -{ - bio_queue = NULL; -#if defined(YIELD_PLATFORM_HAVE_LINUX_INOTIFY) - nbio_queue = NULL; -#elif defined(_WIN32) - win32_aio_queue = NULL; -#endif -} - -Directory::Entry* Directory::read() -{ -#ifdef _WIN32 - WIN32_FIND_DATA find_data; - if ( hFindFile == NULL ) - { - wstring search_pattern( path ); - if ( search_pattern.size() > 0 && - search_pattern[search_pattern.size()-1] != L'\\' ) - search_pattern.append( L"\\" ); - search_pattern.append( L"*" ); - - WIN32_FIND_DATA find_data; - hFindFile = FindFirstFileW( search_pattern.c_str(), &find_data ); - if ( hFindFile != INVALID_HANDLE_VALUE ) - return new Entry( find_data.cFileName, *new Stat( find_data ) ); - } - else if ( FindNextFileW( hFindFile, &find_data ) ) - return new Entry( find_data.cFileName, *new Stat( find_data ) ); -#else - struct dirent* next_dirent = ::readdir( static_cast( dirp ) ); - if ( next_dirent != NULL ) - return new Entry( next_dirent->d_name ); -#endif - - return NULL; -} - - -Directory::Entry::Entry( const Path& name ) - : name( name ), stbuf( NULL ) -{ } - -Directory::Entry::Entry( const Path& name, Stat& stbuf ) - : name( name ), stbuf( &stbuf ) -{ } - -Directory::Entry::~Entry() -{ - Stat::dec_ref( stbuf ); -} - - -// exception.cpp -#ifdef _WIN32 -#include -#include -#else -#include -#endif - - -Exception::Exception() - : error_code( get_last_error() ), - error_message( NULL ) -{ -} - -Exception::Exception( uint32_t error_code ) - : error_code( error_code ), error_message( NULL ) -{ } - -Exception::Exception( const char* error_message ) - : error_code( 0 ), error_message( NULL ) -{ - set_error_message( error_message ); -} - -Exception::Exception( const string& error_message ) - : error_code( 0 ), error_message( NULL ) -{ - set_error_message( error_message.c_str() ); -} - -Exception::Exception( uint32_t error_code, const char* error_message ) - : error_code( error_code ), error_message( NULL ) -{ - set_error_message( error_message ); -} - -Exception::Exception( uint32_t error_code, const string& error_message ) - : error_code( error_code ), error_message( NULL ) -{ - set_error_message( error_message.c_str() ); -} - -Exception::Exception( const Exception& other ) - : error_code( other.error_code ), error_message( NULL ) -{ - set_error_message( other.error_message ); -} - -Exception::~Exception() throw() -{ -#ifdef _WIN32 - LocalFree( error_message ); -#else - delete [] error_message; -#endif -} - -const char* Exception::get_error_message() const throw() -{ - if ( error_message != NULL ) - return error_message; - else if ( error_code != 0 ) - { -#ifdef _WIN32 - DWORD dwMessageLength - = FormatMessageA - ( - FORMAT_MESSAGE_ALLOCATE_BUFFER| - FORMAT_MESSAGE_FROM_SYSTEM| - FORMAT_MESSAGE_IGNORE_INSERTS, - NULL, - error_code, - MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), - error_message, - 0, - NULL - ); - - if ( dwMessageLength > 0 ) - { - if ( dwMessageLength > 2 ) - error_message[dwMessageLength - 2] = 0; // Cut off trailing \r\n - - return error_message; - } - else if ( error_code >= NERR_BASE || error_code <= MAX_NERR ) - { - HMODULE hModule - = LoadLibraryEx - ( - TEXT( "netmsg.dll" ), - NULL, - LOAD_LIBRARY_AS_DATAFILE - ); // Let's hope this is cheap.. - - if ( hModule != NULL ) - { - dwMessageLength - = FormatMessageA - ( - FORMAT_MESSAGE_ALLOCATE_BUFFER| - FORMAT_MESSAGE_FROM_SYSTEM| - FORMAT_MESSAGE_IGNORE_INSERTS, - hModule, - error_code, - MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), - error_message, - 0, - NULL - ); - - if ( dwMessageLength > 0 ) - { - FreeLibrary( hModule ); - - if ( dwMessageLength > 2 ) - error_message[dwMessageLength - 2] = 0; // Cut off trailing \r\n - - return error_message; - } - else - FreeLibrary( hModule ); - } - } - - // Could not get an error_message for error_code from FormatMessage - // Set error_message to a dummy value so we don't have to try this again - const_cast( this )->error_message - = static_cast( LocalAlloc( LMEM_FIXED, 19 ) ); - sprintf_s( error_message, 19, "errno = %u", error_code ); - return error_message; -#else - // strerror_r is more or less unusable in a portable way, - // thanks to the GNU-specific implementation. - // You have to define _XOPEN_SOURCE to get the POSIX implementation, - // but that apparently breaks libstdc++. - // So we just use strerror. - const_cast( this )->set_error_message( strerror( error_code ) ); - return error_message; -#endif - } - else - return "(unknown)"; -} - -uint32_t Exception::get_last_error() -{ -#ifdef _WIN32 - return static_cast( GetLastError() ); -#else - return static_cast( errno ); -#endif -} - -void Exception::set_error_code( uint32_t error_code ) -{ - this->error_code = error_code; -} - -void Exception::set_error_message( const char* error_message ) -{ -#ifdef _WIN32 - LocalFree( this->error_message ); -#else - delete [] this->error_message; -#endif - - if ( error_message != NULL ) - { - size_t error_message_len = strlen( error_message ); -#ifdef _WIN32 - this->error_message - = static_cast( LocalAlloc( LMEM_FIXED, error_message_len+1 ) ); -#else - this->error_message = new char[error_message_len+1]; -#endif - memcpy( this->error_message, error_message, error_message_len+1 ); - } - else - this->error_message = NULL; -} - -void Exception::set_error_message( const string& error_message ) -{ -#ifdef _WIN32 - LocalFree( this->error_message ); -#else - delete [] this->error_message; -#endif - -#ifdef _WIN32 - this->error_message - = static_cast( LocalAlloc( LMEM_FIXED, error_message.size()+1 ) ); -#else - this->error_message = new char[error_message.size()+1]; -#endif - memcpy( this->error_message, error_message.c_str(), error_message.size()+1 ); -} - -void Exception::set_last_error( uint32_t error_code ) -{ -#ifdef _WIN32 - SetLastError( error_code ); -#else - errno = error_code; -#endif -} - -const char* Exception::what() const throw() -{ - return get_error_message(); -} - - -// fd_event_poller.cpp -#ifdef _WIN32 -#ifndef FD_SETSIZE -#define FD_SETSIZE 1024 -#endif -#undef INVALID_SOCKET -#pragma warning( push ) -#pragma warning( disable: 4365 4995 ) -#include -#pragma warning( pop ) -#pragma warning( push ) -#pragma warning( disable: 4127 4389 ) // Warnings in the FD_* macros -#define INVALID_SOCKET (SOCKET)(~0) -#else -#include -#include -#include -#if defined(__FreeBSD__) || defined(__MACH__) || defined(__OpenBSD__) -#define YIELD_PLATFORM_HAVE_KQUEUE 1 -#include -#include -#include -#elif defined(__linux__) -#define YIELD_PLATFORM_HAVE_LINUX_EPOLL 1 -#include -#elif defined(YIELD_PLATFORM_HAVE_SOLARIS_EVENT_PORTS) -#include -#endif -#endif - - -namespace yield -{ - namespace platform - { - class FDEventPollerImpl : public FDEventPoller - { - protected: - FDEventPollerImpl() { } - virtual ~FDEventPollerImpl() { } - - bool associate( fd_t fd, void* context ) - { - FDToContextMap::const_iterator fd_i = fd_to_context_map.find( fd ); - if ( fd_i == fd_to_context_map.end() ) - { - fd_to_context_map[fd] = context; - return true; - } - else - { -#ifdef _WIN32 - WSASetLastError( WSA_INVALID_PARAMETER ); -#else - errno = EEXIST; -#endif - return false; - } - } - - bool find_context( fd_t fd, void** out_context = NULL ) - { - FDToContextMap::const_iterator fd_i = fd_to_context_map.find( fd ); - if ( fd_i != fd_to_context_map.end() ) - { - if ( out_context != NULL ) - *out_context = fd_i->second; - return true; - } - else - { -#ifdef _WIN32 - WSASetLastError( WSA_INVALID_PARAMETER ); -#else - errno = ENOENT; -#endif - return false; - } - } - - // FDEventPoller - virtual bool dissociate( fd_t fd ) - { - FDToContextMap::iterator fd_i = fd_to_context_map.find( fd ); - if ( fd_i != fd_to_context_map.end() ) - { - fd_to_context_map.erase( fd_i ); - return true; - } - else - { -#ifdef _WIN32 - WSASetLastError( WSA_INVALID_PARAMETER ); -#else - errno = ENOENT; -#endif - return false; - } - } - - protected: - // Need an fd_to_context_map even for poll primitives - // like kqueue that keep a context pointer in the kernel so that - // toggle doesn't have to take the context - // The map is protected and not private because the select() - // implementation iterates over the fd's - typedef map FDToContextMap; - FDToContextMap fd_to_context_map; - }; - - -#ifdef YIELD_PLATFORM_HAVE_LINUX_EPOLL - class epollFDEventPoller : public FDEventPollerImpl - { - public: - ~epollFDEventPoller() - { - close( epfd ); - } - - static epollFDEventPoller& create() - { - int epfd = epoll_create( 32768 ); - if ( epfd != -1 ) - return *new epollFDEventPoller( epfd ); - else - throw Exception(); - } - - // FDEventPoller - bool associate( fd_t fd, void* context, bool want_read, bool want_write ) - { - if ( FDEventPollerImpl::associate( fd, context ) ) - { - struct epoll_event epoll_event_; - memset( &epoll_event_, 0, sizeof( epoll_event_ ) ); - epoll_event_.data.fd = fd; - if ( want_read ) epoll_event_.events |= EPOLLIN; - if ( want_write ) epoll_event_.events |= EPOLLOUT; - - if ( epoll_ctl( epfd, EPOLL_CTL_ADD, fd, &epoll_event_ ) != -1 ) - return true; - else - { - FDEventPollerImpl::dissociate( fd ); - return false; - } - } - else - return false; - } - - bool dissociate( fd_t fd ) - { - if ( FDEventPollerImpl::dissociate( fd ) ) - { - // From the man page: In kernel versions before 2.6.9, - // the EPOLL_CTL_DEL operation required a non-NULL pointer in event, - // even though this argument is ignored. Since kernel 2.6.9, - // event can be specified as NULL when using EPOLL_CTL_DEL. - struct epoll_event epoll_event_; - return epoll_ctl( epfd, EPOLL_CTL_DEL, fd, &epoll_event_ ) != -1; - } - else - return false; - } - - int poll( FDEvent* fd_events, int fd_events_len, const Time* timeout ) - { - if ( epoll_events.capacity() < static_cast( fd_events_len ) ) - epoll_events.reserve( static_cast( fd_events_len ) ); - - int active_fds_count - = epoll_wait - ( - epfd, - &epoll_events[0], - fd_events_len, - timeout == NULL - ? -1 - : static_cast( timeout->as_unix_time_ms() ) - ); - - if ( active_fds_count > 0 ) - { - for - ( - int active_fd_i = 0; - active_fd_i < active_fds_count; - active_fd_i++ - ) - { - const struct epoll_event& epoll_event_ - = epoll_events[active_fd_i]; - - void* context; - if ( find_context( epoll_event_.data.fd, &context ) ) - { - fd_events[active_fd_i].fill - ( - context, - epoll_event_.data.fd, - ( epoll_event_.events & EPOLLIN ) == EPOLLIN, - ( epoll_event_.events & EPOLLOUT ) == EPOLLOUT - ); - } - else - DebugBreak(); - } - } - - return active_fds_count; - } - - bool toggle( fd_t fd, bool want_read, bool want_write ) - { - struct epoll_event epoll_event_; - memset( &epoll_event_, 0, sizeof( epoll_event_ ) ); - epoll_event_.data.fd = fd; - if ( want_read ) epoll_event_.events |= EPOLLIN; - if ( want_write ) epoll_event_.events |= EPOLLOUT; - - if ( epoll_ctl( epfd, EPOLL_CTL_MOD, fd, &epoll_event_ ) != -1 ) - { -#ifdef _DEBUG - if ( !find_context( fd ) ) DebugBreak(); -#endif - return true; - } - else - return false; - } - - private: - epollFDEventPoller( int epfd ) - : epfd( epfd ) - { } - - private: - int epfd; - vector epoll_events; - }; -#endif - - -#ifdef YIELD_PLATFORM_HAVE_SOLARIS_EVENT_PORTS - class EventPortFDEventPoller : public FDEventPollerImpl - { - public: - ~EventPortFDEventPoller() - { - close( port ); - } - - static EventPortFDEventPoller& create() - { - int port = port_create(); - if ( port != -1 ) - return *new EventPortFDEventPoller( port ); - else - throw Exception(); - } - - // FDEventPoller - bool associate( fd_t fd, void* context, bool want_read, bool want_write ) - { - if ( FDEventPollerImpl::associate( fd, context ) ) - { - int events = 0; - if ( want_read ) events |= POLLIN; - if ( want_write ) events |= POLLOUT; - - if - ( - port_associate( port, PORT_SOURCE_FD, fd, events, context ) != -1 - ) - return true; - else - { - FDEventPollerImpl::dissociate( fd ); - return false; - } - } - else - return false; - } - - bool dissociate( fd_t fd ) - { - if ( FDEventPollerImpl::dissociate( fd ) ) - return port_dissociate( port, PORT_SOURCE_FD, fd ) != -1; - else - return false; - } - - int poll( FDEvent* fd_events, int fd_events_len, const Time* timeout ) - { - if ( port_events.capacity() < fd_events_len ) - port_events.reserve( fd_events_len ); - - // port_getn doesn't seem to work -> only one event at a time - int active_fds_count; - if ( timeout == NULL ) - active_fds_count = port_get( port, &port_events[0], NULL ); - else - { - struct timespec timeout_ts = *timeout; - active_fds_count = port_get( port, &port_events[0], &timeout_ts ); - } - - if ( active_fds_count > 0 ) - { - for - ( - int active_fd_i = 0; - active_fd_i < active_fds_count; - active_fd_i++ - ) - ( - const port_event_t& port_event = port_events[active_fd_i]; - - fd_events[active_fd_i].fill - ( - port_event.portev_user - port_event.portev_object - ( port_event.portev_events & POLLIN ) == POLLIN, - ( port_event.portev_events & POLLOUT ) == POLLOUT - ); - } - } - - return active_fds_count; - } - - bool toggle( fd_t fd, bool want_read, bool want_write ) - { - if ( want_read || want_write ) - { - void* context; - if ( find_context( fd, &context ) ) - { - int events = 0 - if ( want_read ) events |= POLLIN; - if ( want_write ) events |= POLLOUT; - return port_associate( poll_fd, PORT_SOURCE_FD, fd, events, context ) != -1; - } - else - return false; - } - else - return port_dissociate( poll_fd, PORT_SOURCE_FD, fd ) != -1; - } - - private: - EventPortFDEventPoller( int port ) - : port( port ) - { } - - private: - int port; - vector port_events; - }; -#endif - - -#ifdef YIELD_PLATFORM_HAVE_KQUEUE - class kqueueFDEventPoller : public FDEventPollerImpl - { - public: - ~kqueueFDEventPoller() - { - close( kq ); - } - - static kqueueFDEventPoller& create() - { - int kq = kqueue(); - if ( kq != -1 ) - return *new kqueueFDEventPoller( kq ); - else - throw Exception(); - } - - // FDEventPoller - bool associate( fd_t fd, void* context, bool want_read, bool want_write ) - { - if ( FDEventPollerImpl::associate( fd, context ) ) - { - struct kevent kevents[2]; - int nchanges = 0; - - if ( want_read ) - { - EV_SET - ( - &kevents[nchanges], - fd, - EVFILT_READ, - EV_ENABLE - 0, - 0, - context - ); - - nchanges++; - } - - if ( want_write ) - { - EV_SET - ( - &kevents[nchanges], - fd, - EVFILT_WRITE, - EV_ENABLE, - 0, - 0, - context - ); - - nchanges++; - } - - if ( kevent( kq, kevents, nchanges - 1, 0, 0, NULL ) != -1 ) - return true; - else - { - FDEventPollerImpl::dissociate( fd ); - return false; - } - } - else - return false; - } - - bool dissociate( fd_t fd ) - { - if ( FDEventPollerImpl::dissociate( fd ) ) - { - struct kevent kevents[2]; - EV_SET( &kevents[0], fd, EVFILT_READ, EV_DELETE, 0, 0, NULL ); - EV_SET( &kevents[1], fd, EVFILT_WRITE, EV_DELETE, 0, 0, NULL ); - kevent( kq, change_events, 2, 0, 0, NULL ); - } - else - return false; - } - - int poll( FDEvent* fd_events, int fd_events_len, const Time* timeout ) - { - if ( kevents.capacity() < fd_events_len ) - kevents.reserve( fd_events_len ); - - int active_fds_count; - - if ( timeout == NULL ) - { - active_fds_count - = kevent( epfd, 0, 0, &kevents[0], fd_events_len, NULL ); - } - else - { - struct timespec timeout_ts = *timeout; - active_fds_count - = kevent( epfd, 0, 0, &kevents[0], fd_events_len, &timeout_ts ); - } - - if ( active_fds_count > 0 ) - { - for - ( - int active_fd_i = 0; - active_fd_i < active_fds_count; - active_fd_i++ - ) - ( - const struct kevent& kevent_ = kevents[active_fd_i]; - - fd_events[active_fd_i].fill - ( - kevent_.udata, - kevent_.ident, - kevent_.filter == EVFILT_READ, - kevent_.filter != EVFILT_READ - ); - } - } - - return active_fds_count; - } - - bool toggle( fd_t fd, bool want_read, bool want_write ) - { - void* context; - if ( find_context( fd, &context ) ) - { - struct kevent kevents[2]; - - EV_SET - ( - &kevents[nchanges], - fd, - EVFILT_READ, want_read ? EV_ENABLE : EV_DISABLE, - 0, - 0, - fd_i->second - ); - - EV_SET - ( - &kevents[nchanges], - fd, - EVFILT_WRITE, - want_write ? EV_ENABLE : EV_DISABLE, - 0, - 0, - fd_i->second - ); - - return kevent( kq, kevents, 2, 0, 0, NULL ) != -1; - } - else - return false; - } - - private: - kqueueFDEventPoller( int kq ) - : epfd( kq ) - { } - - private: - vector kevents; - int kq; - }; -#endif - - -#ifndef _WIN32 - class pollFDEventPoller : public FDEventPollerImpl - { - public: - static pollFDEventPoller& create() - { - return *new pollFDEventPoller; - } - - // FDEventPoller - bool associate( fd_t fd, void* context, bool want_read, bool want_write ) - { - if ( FDEventPollerImpl::associate( fd, context ) ) - { - fd_to_context_map[fd] = context; - - struct pollfd new_pollfd; - memset( &new_pollfd, 0, sizeof( new_pollfd ) ); - new_pollfd.fd = fd; - if ( want_read ) new_pollfd.events |= POLLIN; - if ( want_write ) new_pollfd.events |= POLLOUT; - pollfds.push_back( new_pollfd ); - - return true; - } - else - return false; - } - - bool dissociate( fd_t fd ) - { - if ( FDEventPollerImpl::dissociate( fd ) ) - { - for - ( - vector::iterator pollfd_i = pollfds.begin(); - pollfd_i != pollfds.end(); - ++pollfd_i - ) - { - if ( ( *pollfd_i ).fd == fd ) - { - pollfds.erase( pollfd_i ); - return true; - } - } - - DebugBreak(); - } - else - return false; - } - - int poll( FDEvent* fd_events, int fd_events_len, const Time* timeout ) - { - int active_fds_count - = ::poll - ( - &pollfds[0], - pollfds.size(), - timeout == NULL ? -1 : timeout->as_unix_time_ms() - ); - - if ( active_fds_count > 0 ) - { - int fd_event_i = 0; - vector::const_iterator pollfd_i - = pollfds.begin(); - - while - ( - active_fds_count > 0 - && - fd_event_i < fd_events_len - && - pollfd_i != pollfds.end() - ) - { - const struct pollfd& pollfd_ = *pollfd_i; - - if ( pollfd_.revents != 0 ) - { -#ifdef _DEBUG - if ( ( pollfd_.revents & POLLERR ) == POLLERR ) - DebugBreak(); - if ( ( pollfd_.revents & POLLHUP ) == POLLHUP ) - DebugBreak(); - if ( ( pollfd_.revents & POLLPRI ) == POLLPRI ) - DebugBreak(); -#endif - - void* context; - if ( find_context( pollfd_.fd, &context ) ) - { - fd_events[fd_event_i].fill - ( - context, - pollfd_.fd, - ( pollfd_.revents & POLLIN ) == POLLIN, - ( pollfd_.revents & POLLOUT ) == POLLOUT - ); - - fd_event_i++; - } - else - DebugBreak(); - -// pollfd_.revents = 0; - - active_fds_count--; - } - - ++pollfd_i; - } - - return fd_event_i; - } - else - return active_fds_count; - } - - bool toggle( fd_t fd, bool want_read, bool want_write ) - { - void* context; - if ( find_context( fd, &context ) ) - { - for - ( - vector::iterator pollfd_i = pollfds.begin(); - pollfd_i != pollfds.end(); - ++pollfd_i - ) - { - if ( ( *pollfd_i ).fd == fd ) - { - ( *pollfd_i ).events = 0; - if ( want_read ) ( *pollfd_i ).events |= POLLIN; - if ( want_write ) ( *pollfd_i ).events |= POLLOUT; - return true; - } - } - - DebugBreak(); - } - else - return false; - } - - private: - pollFDEventPoller() - { } - - private: - vector pollfds; - }; -#endif - - - class selectFDEventPoller : public FDEventPollerImpl - { - public: - static selectFDEventPoller& create() - { - return *new selectFDEventPoller; - } - - // FDEventPoller - bool associate( fd_t fd, void* context, bool want_read, bool want_write ) - { - if ( FDEventPollerImpl::associate( fd, context ) ) - { - if ( want_read ) - FD_SET( fd, &read_fds ); - - if ( want_write ) - { - //FD_SET( fd, &except_fds ); - FD_SET( fd, &write_fds ); - } - - return true; - } - else - return false; - } - - bool dissociate( fd_t fd ) - { - if ( FDEventPollerImpl::dissociate( fd ) ) - { - //FD_CLR( fd, &except_fds ); - FD_CLR( fd, &read_fds ); - FD_CLR( fd, &write_fds ); - return true; - } - else - return false; - } - - int poll( FDEvent* fd_events, int fd_events_len, const Time* timeout ) - { - fd_set except_fds_copy, read_fds_copy, write_fds_copy; - - memcpy_s - ( - &except_fds_copy, - sizeof( except_fds_copy ), - &except_fds, - sizeof( except_fds ) - ); - - memcpy_s - ( - &read_fds_copy, - sizeof( read_fds_copy ), - &read_fds, - sizeof( read_fds ) - ); - - memcpy_s - ( - &write_fds_copy, - sizeof( write_fds_copy ), - &write_fds, - sizeof( write_fds ) - ); - - int active_fds_count; - if ( timeout == NULL ) - { - active_fds_count - = select - ( - 0, - &read_fds_copy, - &write_fds_copy, - &except_fds_copy, - NULL - ); - } - else - { - struct timeval timeout_tv = *timeout; - active_fds_count - = select - ( - 0, - &read_fds_copy, - &write_fds_copy, - &except_fds_copy, - &timeout_tv - ); - } - - if ( active_fds_count > 0 ) - { - FDToContextMap::const_iterator fd_i = fd_to_context_map.begin(); - int fd_event_i = 0; - - while - ( - active_fds_count > 0 - && - fd_event_i < fd_events_len - && - fd_i != fd_to_context_map.end() - ) - { - bool want_except, want_read, want_write; - - //if ( FD_ISSET( fd_i->first, &except_fds_copy ) ) - //{ - // want_except = true; - // active_fds_count--; // one for every fd event, not every fd - //} - //else - want_except = false; - - if ( FD_ISSET( fd_i->first, &read_fds_copy ) ) - { - want_read = true; - active_fds_count--; - } - else - want_read = false; - - if - ( - active_fds_count > 0 - && - FD_ISSET( fd_i->first, &write_fds_copy ) - ) - { - want_write = true; - active_fds_count--; - } - else - want_write = false; - - if ( want_except || want_read || want_write ) - { - fd_events[fd_event_i].fill - ( - fd_i->second, - fd_i->first, - want_read, - want_except | want_write - ); - - fd_event_i++; - } - - ++fd_i; - } - - return fd_event_i; - } - else - return active_fds_count; - } - - bool toggle( fd_t fd, bool want_read, bool want_write ) - { - void* context; - if ( find_context( fd, &context ) ) - { - if ( want_read ) - FD_SET( fd, &read_fds ); - else - FD_CLR( fd, &read_fds ); - - if ( want_write ) - { - //FD_SET( fd, &except_fds ); - FD_SET( fd, &write_fds ); - } - else - { - //FD_CLR( fd, &except_fds ); - FD_CLR( fd, &write_fds ); - } - - return true; - } - else - return false; - } - - private: - selectFDEventPoller() - { - FD_ZERO( &except_fds ); - FD_ZERO( &read_fds ); - FD_ZERO( &write_fds ); - } - - private: - fd_set except_fds, read_fds, write_fds; - }; - }; -}; - - -FDEventPoller& FDEventPoller::create() -{ -#if defined(_WIN32) - return selectFDEventPoller::create(); -#elif defined(YIELD_HAVE_KQUEUE) - return kqueueFDEventPoller::create(); -#elif defined(YIELD_PLATFORM_HAVE_LINUX_EPOLL) - return epollFDEventPoller::create(); -#elif defined(YIELD_PLATFORM_HAVE_SOLARIS_EVENT_PORTS) - return EventPortFDEventPoller::create(); -#else - return pollFDEventPoller::create(); -#endif -} - -bool FDEventPoller::poll() -{ - FDEvent fd_event; - return poll( &fd_event, 1, NULL ) == 1; -} - -bool FDEventPoller::poll( const Time& timeout ) -{ - FDEvent fd_event; - return poll( &fd_event, 1, &timeout ) == 1; -} - -bool FDEventPoller::poll( FDEvent& fd_event ) -{ - return poll( &fd_event, 1, NULL ) == 1; -} - -bool FDEventPoller::poll( FDEvent& fd_event, const Time& timeout ) -{ - return poll( &fd_event, 1, &timeout ) == 1; -} - -int FDEventPoller::poll( FDEvent* fd_events, int fd_events_len ) -{ - return poll( fd_events, fd_events_len, NULL ); -} - -int -FDEventPoller::poll -( - FDEvent* fd_events, - int fd_events_len, - const Time& timeout -) -{ - if ( fd_events_len > 0 ) - return poll( fd_events, fd_events_len, &timeout ); - else - return 0; -} - -bool FDEventPoller::try_poll() -{ - FDEvent fd_event; - Time timeout( 0 * Time::NS_IN_S ); - return poll( &fd_event, 1, &timeout ) == 1; -} - -bool FDEventPoller::try_poll( FDEvent& fd_event ) -{ - Time timeout( 0 * Time::NS_IN_S ); - return poll( &fd_event, 1, &timeout ) == 1; -} - -int FDEventPoller::try_poll( FDEvent* fd_events, int fd_events_len ) -{ - Time timeout( 0 * Time::NS_IN_S ); - return poll( fd_events, fd_events_len, &timeout ); -} - -#ifdef _WIN32 -#pragma warning( pop ) -#endif - - -// file.cpp -#ifdef _WIN32 -#include -#else -#include -#include -#include -#include -#include // For writev -#include -#if defined(__linux__) -// Mac OS X's off_t is already 64-bit -#define lseek lseek64 -#elif defined(__sun) -extern off64_t lseek64(int, off64_t, int); -#define lseek lseek64 -#endif -#ifdef YIELD_PLATFORM_HAVE_POSIX_AIO -#include -#endif -#ifdef YIELD_PLATFORM_HAVE_XATTR_H -#if defined(__linux__) -#include -#define FLISTXATTR ::flistxattr -#define FGETXATTR ::fgetxattr -#define FSETXATTR ::fsetxattr -#define FREMOVEXATTR ::fremovexattr -#elif defined(__MACH__) -#include -#define FLISTXATTR( fd, namebuf, size ) \ - ::flistxattr( fd, namebuf, size, 0 ) -#define FGETXATTR( fd, name, value, size ) \ - ::fgetxattr( fd, name, value, size, 0, 0 ) -#define FSETXATTR( fd, name, value, size, flags ) \ - ::fsetxattr( fd, name, value, size, 0, flags ) -#define FREMOVEXATTR( fd, name ) \ - ::fremovexattr( fd, name, 0 ) -#endif -#endif -#endif - - -template -class File::IOCB -{ -protected: - IOCB - ( - AIOCallbackType& callback, - void* callback_context, - File& file, - uint64_t offset - ) - : callback( callback.inc_ref() ), - callback_context( callback_context ), - file( file.inc_ref() ), - offset( offset ) - { } - - ~IOCB() - { - AIOCallbackType::dec_ref( callback ); - File::dec_ref( file ); - } - - AIOCallbackType& get_callback() const { return callback; } - void* get_callback_context() const { return callback_context; } - File& get_file() const { return file; } - uint64_t get_offset() const { return offset; } - -private: - AIOCallbackType& callback; - void* callback_context; - File& file; - uint64_t offset; -}; - - -class File::IOReadCB : public IOCB -{ -public: - Buffer& get_buffer() const { return buffer; } - - void onReadCompletion() - { - get_callback().onReadCompletion( buffer, get_callback_context() ); - } - - void onReadError() - { - onReadError( Exception::get_last_error() ); - } - - void onReadError( uint32_t error_code ) - { - get_callback().onReadError( error_code, get_callback_context() ); - } - -protected: - IOReadCB - ( - Buffer& buffer, - AIOReadCallback& callback, - void* callback_context, - File& file, - uint64_t offset - ) - : IOCB( callback, callback_context, file, offset ), - buffer( buffer ) - { } - - ~IOReadCB() - { - Buffer::dec_ref( buffer ); - } - -private: - Buffer& buffer; -}; - - -class File::IOWriteCB : public IOCB -{ -public: - Buffer& get_buffer() const { return buffer; } - - void onWriteCompletion( size_t bytes_written ) - { - get_callback().onWriteCompletion( bytes_written, get_callback_context() ); - } - - void onWriteError() - { - onWriteError( Exception::get_last_error() ); - } - - void onWriteError( uint32_t error_code ) - { - get_callback().onWriteError( error_code, get_callback_context() ); - } - -protected: - IOWriteCB - ( - Buffer& buffer, - AIOWriteCallback& callback, - void* callback_context, - File& file, - uint64_t offset - ) - : IOCB( callback, callback_context, file, offset ), - buffer( buffer ) - { } - - ~IOWriteCB() - { - Buffer::dec_ref( buffer ); - } - -private: - Buffer& buffer; -}; - - -class File::IOWriteVCB : public IOCB -{ -protected: - IOWriteVCB - ( - Buffers& buffers, - AIOWriteCallback& callback, - void* callback_context, - File& file, - uint64_t offset - ) - : IOCB( callback, callback_context, file, offset ), - buffers( buffers ) - { } - - ~IOWriteVCB() - { - Buffers::dec_ref( buffers ); - } - - Buffers& get_buffers() const { return buffers; } - - void onWriteVCompletion( size_t bytes_written ) - { - get_callback().onWriteCompletion( bytes_written, get_callback_context() ); - } - - void onWriteVError() - { - onWriteVError( Exception::get_last_error() ); - } - - void onWriteVError( uint32_t error_code ) - { - get_callback().onWriteError( error_code, get_callback_context() ); - } - -private: - Buffers& buffers; -}; - - -class File::BIOReadCB : public BIOCB, public IOReadCB -{ -public: - BIOReadCB - ( - Buffer& buffer, - AIOReadCallback& callback, - void* callback_context, - File& file, - uint64_t offset, - const Time& timeout - ) - : BIOCB( timeout ), - IOReadCB( buffer, callback, callback_context, file, offset ) - { } - - // BIOCB - void execute() - { - ssize_t read_ret = get_file().read( get_buffer(), get_offset() ); - - if ( read_ret >= 0 ) - { - set_state( STATE_COMPLETE ); - onReadCompletion(); - } - else - { - set_state( STATE_ERROR ); - onReadError(); - } - } -}; - - -class File::BIOWriteCB : public BIOCB, public IOWriteCB -{ -public: - BIOWriteCB - ( - Buffer& buffer, - AIOWriteCallback& callback, - void* callback_context, - File& file, - uint64_t offset, - const Time& timeout - ) - : BIOCB( timeout ), - IOWriteCB( buffer, callback, callback_context, file, offset ) - { } - - // BIOCB - void execute() - { - ssize_t write_ret = get_file().write( get_buffer(), get_offset() ); - - if ( write_ret >= 0 ) - { - set_state( STATE_COMPLETE ); - onWriteCompletion( static_cast( write_ret ) ); - } - else - { - set_state( STATE_ERROR ); - onWriteError(); - } - } -}; - - -class File::BIOWriteVCB : public BIOCB, public IOWriteVCB -{ -public: - BIOWriteVCB - ( - Buffers& buffers, - AIOWriteCallback& callback, - void* callback_context, - File& file, - uint64_t offset, - const Time& timeout - ) - : BIOCB( timeout ), - IOWriteVCB( buffers, callback, callback_context, file, offset ) - { } - - // BIOCB - void execute() - { - ssize_t writev_ret = get_file().writev( get_buffers(), get_offset() ); - if ( writev_ret >= 0 ) - { - set_state( STATE_COMPLETE ); - onWriteVCompletion( static_cast( writev_ret ) ); - } - else - { - set_state( STATE_ERROR ); - onWriteVError(); - } - } -}; - - -#ifdef _WIN32 -class File::Win32AIOReadCB : public Win32AIOCB, public IOReadCB -{ -public: - Win32AIOReadCB - ( - Buffer& buffer, - AIOReadCallback& callback, - void* callback_context, - File& file, - uint64_t offset, - const Time& timeout - ) - : Win32AIOCB( offset, timeout ), - IOReadCB( buffer, callback, callback_context, file, offset ) - { } - - // Win32AIOCB - void execute() - { - if - ( - ReadFile - ( - get_file(), - get_buffer(), - get_buffer().capacity() - get_buffer().size(), - NULL, - *this - ) - ) - set_state( STATE_WANT_READ ); - else if ( GetLastError() == ERROR_IO_PENDING ) - set_state( STATE_WANT_READ ); - else - { - set_state( STATE_ERROR ); - onReadError( GetLastError() ); - } - } - - fd_t get_fd() const { return get_file(); } - - void onCompletion( DWORD dwNumberOfBytesTransferred ) - { - set_state( STATE_COMPLETE ); - get_buffer().resize( get_buffer().size() + dwNumberOfBytesTransferred ); - onReadCompletion(); - } - - void onError( DWORD dwErrorCode ) - { - set_state( STATE_ERROR ); - onReadError( dwErrorCode ); - } -}; - - -class File::Win32AIOWriteCB : public Win32AIOCB, public IOWriteCB -{ -public: - Win32AIOWriteCB - ( - Buffer& buffer, - AIOWriteCallback& callback, - void* callback_context, - File& file, - uint64_t offset, - const Time& timeout - ) - : Win32AIOCB( offset, timeout ), - IOWriteCB( buffer, callback, callback_context, file, offset ) - { } - - // Win32AIOCB - void execute() - { - if - ( - WriteFile - ( - get_file(), - get_buffer(), - get_buffer().size(), - NULL, - *this - ) - ) - set_state( STATE_WANT_WRITE ); - else if ( GetLastError() == ERROR_IO_PENDING ) - set_state( STATE_WANT_WRITE ); - else - { - set_state( STATE_ERROR ); - onWriteError(); - } - } - - fd_t get_fd() const { return get_file(); } - - void onCompletion( DWORD dwNumberOfBytesTransferred ) - { - set_state( STATE_COMPLETE ); - onWriteCompletion( dwNumberOfBytesTransferred ); - } - - void onError( DWORD dwErrorCode ) - { - set_state( STATE_ERROR ); - onWriteError( dwErrorCode ); - } -}; -#endif - - -File::File() - : fd( INVALID_FD ) -{ - bio_queue = NULL; -#ifdef _WIN32 - win32_aio_queue = NULL; -#endif -} - -File::File( fd_t fd ) - : fd( fd ) -{ - bio_queue = NULL; -#ifdef _WIN32 - win32_aio_queue = NULL; -#endif -} - -File::~File() -{ - close(); - - if ( bio_queue != NULL ) - BIOQueue::dec_ref( *bio_queue ); -#ifdef _WIN32 - else if ( win32_aio_queue != NULL ) - Win32AIOQueue::dec_ref( *win32_aio_queue ); -#endif -} - -void -File::aio_read -( - Buffer& buffer, - AIOReadCallback& callback, - void* callback_context, - const Time& timeout -) -{ - aio_read( buffer, tell(), callback, callback_context, timeout ); -} - -void -File::aio_read -( - Buffer& buffer, - uint64_t offset, - AIOReadCallback& callback, - void* callback_context, - const Time& timeout -) -{ - if ( get_bio_queue() != NULL ) - { - get_bio_queue()->submit - ( - *new BIOReadCB - ( - buffer, - callback, - callback_context, - *this, - offset, - timeout - ) - ); - - return; - } -#ifdef _WIN32 - else if ( get_win32_aio_queue() != NULL ) - { - get_win32_aio_queue()->submit - ( - *new Win32AIOReadCB - ( - buffer, - callback, - callback_context, - *this, - offset, - timeout - ) - ); - } - else -#endif - { - BIOReadCB - ( - buffer, - callback, - callback_context, - *this, - offset, - timeout - ).execute(); - } -} - -void -File::aio_write -( - Buffer& buffer, - AIOWriteCallback& callback, - void* callback_context, - const Time& timeout -) -{ - aio_write( buffer, tell(), callback, callback_context, timeout ); -} - -void -File::aio_write -( - Buffer& buffer, - uint64_t offset, - AIOWriteCallback& callback, - void* callback_context, - const Time& timeout -) -{ - if ( get_bio_queue() != NULL ) - { - get_bio_queue()->submit - ( - *new BIOWriteCB - ( - buffer, - callback, - callback_context, - *this, - offset, - timeout - ) - ); - - return; - } -#ifdef _WIN32 - else if ( get_win32_aio_queue() != NULL ) - { - get_win32_aio_queue()->submit - ( - *new Win32AIOWriteCB - ( - buffer, - callback, - callback_context, - *this, - offset, - timeout - ) - ); - } - else -#endif - { - BIOWriteCB - ( - buffer, - callback, - callback_context, - *this, - offset, - timeout - ).execute(); - } -} - -void -File::aio_writev -( - Buffers& buffers, - AIOWriteCallback& callback, - void* callback_context, - const Time& timeout -) -{ - aio_writev( buffers, tell(), callback, callback_context, timeout ); -} - -void -File::aio_writev -( - Buffers& buffers, - uint64_t offset, - AIOWriteCallback& callback, - void* callback_context, - const Time& timeout -) -{ -#ifdef _WIN32 - Buffer& buffer = buffers.join(); - Buffers::dec_ref( buffers ); - aio_write( buffer, offset, callback, callback_context, timeout ); -#else - if ( get_bio_queue() != NULL ) - { - get_bio_queue()->submit - ( - *new BIOWriteVCB - ( - buffers, - callback, - callback_context, - *this, - offset, - timeout - ) - ); - - return; - } - else - { - BIOWriteVCB - ( - buffers, - callback, - callback_context, - *this, - offset, - timeout - ).execute(); - } -#endif -} - -bool File::associate( BIOQueue& bio_queue ) -{ - if ( !have_io_queue() ) - { - this->bio_queue = &bio_queue.inc_ref(); - return true; - } - else - return false; -} - -#ifdef _WIN32 -bool File::associate( Win32AIOQueue& win32_aio_queue ) -{ - if ( !have_io_queue() ) - { - if ( win32_aio_queue.associate( *this ) ) - { - this->win32_aio_queue = &win32_aio_queue.inc_ref(); - return true; - } - else - return false; - } - else - return false; -} -#endif - -bool File::close() -{ - if ( close( *this ) ) - { - fd = INVALID_FD; - return true; - } - else - return false; -} - -bool File::close( fd_t fd ) -{ - if ( fd != INVALID_FD ) -#ifdef _WIN32 - return CloseHandle( fd ) == TRUE; -#else - return ::close( fd ) != -1; -#endif - else - { -#ifdef _WIN32 - SetLastError( ERROR_INVALID_HANDLE ); -#else - errno = EBADF; -#endif - return false; - } -} - -bool File::datasync() -{ -#if defined(_WIN32) - return FlushFileBuffers( fd ) != 0; -#elif defined(__linux__) || defined(__sun) - return fdatasync( fd ) != -1; -#else - return true; -#endif -} - -Stat* File::getattr() -{ -#ifdef _WIN32 - BY_HANDLE_FILE_INFORMATION by_handle_file_information; - if ( GetFileInformationByHandle( fd, &by_handle_file_information ) != 0 ) - return new Stat( by_handle_file_information ); -#else - struct stat stbuf; - if ( fstat( fd, &stbuf ) != -1 ) - return new Stat( stbuf ); -#endif - return NULL; -} - -bool File::getlk( bool exclusive, uint64_t offset, uint64_t length ) -{ -#ifdef _WIN32 - return false; -#else - struct flock flock_; - flock_.l_type = exclusive ? F_WRLCK : F_RDLCK; - flock_.l_whence = SEEK_SET; - flock_.l_start = offset; - flock_.l_len = length; - flock_.l_pid = getpid(); - if ( fcntl( fd, F_GETLK, &flock_ ) != -1 ) - return flock_.l_type != F_UNLCK; - else - return false; -#endif -} - -size_t File::getpagesize() -{ -#ifdef _WIN32 - SYSTEM_INFO system_info; - GetSystemInfo( &system_info ); - return system_info.dwPageSize; -#else - return ::getpagesize(); -#endif -} - -bool File::getxattr( const string& name, string& out_value ) -{ -#ifdef YIELD_PLATFORM_HAVE_XATTR_H - ssize_t value_len = FGETXATTR( fd, name.c_str(), NULL, 0 ); - if ( value_len != -1 ) - { - char* value = new char[value_len]; - FGETXATTR( fd, name.c_str(), value, value_len ); - out_value.assign( value, value_len ); - delete [] value; - return true; - } - else - return false; -#else - return false; -#endif -} - -bool File::have_io_queue() const -{ - return bio_queue != NULL -#ifdef _WIN32 - || - win32_aio_queue != NULL -#endif - ; -} - -bool File::listxattr( vector& out_names ) -{ -#ifdef YIELD_PLATFORM_HAVE_XATTR_H - size_t names_len = FLISTXATTR( fd, NULL, 0 ); - if ( names_len > 0 ) - { - char* names = new char[names_len]; - FLISTXATTR( fd, names, names_len ); - char* name = names; - do - { - size_t name_len = strlen( name ); - out_names.push_back( string( name, name_len ) ); - name += name_len; - } - while ( static_cast( name - names ) < names_len ); - delete [] names; - } - return true; -#else - return false; -#endif -} - -ssize_t File::read( Buffer& buffer ) -{ - return Channel::read( buffer ); -} - -ssize_t File::read( void* buf, size_t buflen ) -{ -#ifdef _WIN32 - DWORD dwBytesRead; - if - ( - ReadFile - ( - *this, - buf, - static_cast( buflen ), - &dwBytesRead, - NULL - ) - ) - return static_cast( dwBytesRead ); - else - return -1; -#else - return ::read( *this, buf, buflen ); -#endif -} - -ssize_t File::read( Buffer& buffer, uint64_t offset ) -{ - ssize_t read_ret - = read - ( - static_cast( buffer ) + buffer.size(), - buffer.capacity() - buffer.size(), - offset - ); - - if ( read_ret > 0 ) - buffer.resize( buffer.size() + static_cast( read_ret ) ); - - return read_ret; -} - -ssize_t File::read( void* buf, size_t buflen, uint64_t offset ) -{ - if ( seek( offset, SEEK_SET ) ) - return read( buf, buflen ); - else - return -1; -} - -bool File::removexattr( const string& name ) -{ -#ifdef YIELD_PLATFORM_HAVE_XATTR_H - return FREMOVEXATTR( fd, name.c_str() ) != -1; -#else - return false; -#endif -} - -bool File::seek( uint64_t offset ) -{ - return seek( offset, SEEK_SET ); -} - -bool File::seek( uint64_t offset, unsigned char whence ) -{ -#ifdef _WIN32 - ULARGE_INTEGER uliOffset; - uliOffset.QuadPart = offset; - DWORD dwOffsetLow = uliOffset.LowPart; - LONG lOffsetHigh = uliOffset.HighPart; - return SetFilePointer( fd, dwOffsetLow, &lOffsetHigh, whence ) != -1; -#else - return lseek( fd, static_cast( offset ), whence ) != -1; -#endif -} - -bool File::setlk( bool exclusive, uint64_t offset, uint64_t length ) -{ -#ifdef _WIN32 - return setlkw( exclusive, offset, length ); -#else - struct flock flock_; - flock_.l_type = exclusive ? F_WRLCK : F_RDLCK; - flock_.l_whence = SEEK_SET; - flock_.l_start = offset; - flock_.l_len = length; - flock_.l_pid = getpid(); - return fcntl( fd, F_SETLK, &flock_ ) != -1; -#endif -} - -bool File::setlkw( bool exclusive, uint64_t offset, uint64_t length ) -{ -#ifdef _WIN32 - if ( exclusive ) - { - ULARGE_INTEGER uliOffset, uliLength; - uliOffset.QuadPart = offset; - uliLength.QuadPart = length; - return LockFile - ( - fd, - uliOffset.LowPart, - uliOffset.HighPart, - uliLength.LowPart, - uliLength.HighPart - ) == TRUE; - } - else - return false; -#else - struct flock flock_; - flock_.l_type = exclusive ? F_WRLCK : F_RDLCK; - flock_.l_whence = SEEK_SET; - flock_.l_start = offset; - flock_.l_len = length; - flock_.l_pid = getpid(); - return fcntl( fd, F_SETLKW, &flock_ ) != -1; -#endif -} - -bool File::setxattr -( - const string& name, - const string& value, - int flags -) -{ -#ifdef YIELD_PLATFORM_HAVE_XATTR_H - return FSETXATTR - ( - fd, - name.c_str(), - value.c_str(), - value.size(), - flags - ) != -1; -#else - return false; -#endif -} - -bool File::sync() -{ -#ifdef _WIN32 - return FlushFileBuffers( fd ) != 0; -#else - return fsync( fd ) != -1; -#endif -} - -uint64_t File::tell() -{ -#ifdef _WIN32 - ULARGE_INTEGER uliFilePointer; - LONG lFilePointerHigh = 0; - uliFilePointer.LowPart - = SetFilePointer( fd, 0, &lFilePointerHigh, FILE_CURRENT ); - uliFilePointer.HighPart = lFilePointerHigh; - return uliFilePointer.QuadPart; -#else - return lseek( fd, 0, SEEK_CUR ); -#endif -} - -bool File::truncate( uint64_t new_size ) -{ -#ifdef _WIN32 - if ( seek( new_size, FILE_BEGIN ) ) - return SetEndOfFile( fd ) != 0; - else - return false; -#else - return ::ftruncate( fd, new_size ) != -1; -#endif -} - -bool File::unlk( uint64_t offset, uint64_t length ) -{ -#ifdef _WIN32 - ULARGE_INTEGER uliOffset, uliLength; - uliOffset.QuadPart = offset; - uliLength.QuadPart = length; - return UnlockFile - ( - fd, - uliOffset.LowPart, - uliOffset.HighPart, - uliLength.LowPart, - uliLength.HighPart - ) == TRUE; -#else - struct flock flock_; - flock_.l_type = F_UNLCK; - flock_.l_whence = SEEK_SET; - flock_.l_start = offset; - flock_.l_len = length; - flock_.l_pid = getpid(); - return fcntl( fd, F_SETLK, &flock_ ) != -1; -#endif -} - -ssize_t File::write( const Buffer& buffer ) -{ - return Channel::write( buffer ); -} - -ssize_t File::write( const void* buf, size_t buflen ) -{ -#ifdef _WIN32 - DWORD dwBytesWritten; - if - ( - WriteFile - ( - *this, - buf, - static_cast( buflen ), - &dwBytesWritten, - NULL - ) - ) - return static_cast( dwBytesWritten ); - else - return -1; -#else - return ::write( *this, buf, buflen ); -#endif -} - -ssize_t File::write( const Buffer& buffer, uint64_t offset ) -{ - return write( buffer, buffer.size(), offset ); -} - -ssize_t File::write( const void* buf, size_t buflen, uint64_t offset ) -{ - if ( seek( offset ) ) - return write( buf, buflen ); - else - return -1; -} - -ssize_t File::writev( Buffers& buffers ) -{ - return Channel::writev( buffers ); -} - -ssize_t File::writev( const struct iovec* iov, uint32_t iovlen ) -{ -#ifdef _WIN32 - return Channel::writev( iov, iovlen ); -#else - return ::writev( *this, iov, iovlen ); -#endif -} - -ssize_t File::writev( Buffers& buffers, uint64_t offset ) -{ - return writev( buffers, buffers.size(), offset ); -} - -ssize_t -File::writev -( - const struct iovec* iov, - uint32_t iovlen, - uint64_t offset -) -{ - if ( seek( offset ) ) - return writev( iov, iovlen ); - else - return -1; -} - - -// iconv.cpp -#ifdef _WIN32 -#include -#else -#include -#ifdef __sun -#undef iconv -#endif -#if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__sun) -#define ICONV_SOURCE_CAST const char** -#else -#define ICONV_SOURCE_CAST char** -#endif -#endif - - -#ifdef _WIN32 -iconv::iconv( UINT from_code_page, UINT to_code_page ) - : from_code_page( from_code_page ), to_code_page( to_code_page ) -{ } -#else -iconv::iconv( iconv_t cd ) - : cd( cd ) -{ } -#endif - -iconv::~iconv() -{ -#ifndef _WIN32 - iconv_close( cd ); -#endif -} - -#ifdef _WIN32 -UINT iconv::Code_to_win32_code_page( Code code ) -{ - switch ( code ) - { - case CODE_CHAR: return GetACP(); - case CODE_ISO88591: return CP_ACP; - case CODE_UTF8: return CP_UTF8; - default: return GetACP(); - } -} -#else -const char* iconv::Code_to_iconv_code( Code code ) -{ - switch ( code ) - { - case CODE_CHAR: return ""; - case CODE_ISO88591: return "ISO-8859-1"; - case CODE_UTF8: return "UTF-8"; - default: return ""; - } -} -#endif - -yield::platform::iconv* iconv::open( Code tocode, Code fromcode ) -{ -#ifdef _WIN32 - UINT to_code_page = Code_to_win32_code_page( tocode ); - UINT from_code_page = Code_to_win32_code_page( fromcode ); - return new iconv( from_code_page, to_code_page ); -#else - iconv_t cd - = ::iconv_open - ( - Code_to_iconv_code( tocode ), - Code_to_iconv_code( fromcode ) - ); - - if ( cd != reinterpret_cast( -1 ) ) - return new iconv( cd ); - else - return NULL; -#endif -} - -size_t -iconv::operator() -( - const char** inbuf, - size_t* inbytesleft, - char** outbuf, - size_t* outbytesleft -) -{ -#ifdef _WIN32 - int inbuf_w_len - = MultiByteToWideChar - ( - from_code_page, - 0, - *inbuf, - static_cast( *inbytesleft ), - NULL, - 0 - ); - - if ( inbuf_w_len > 0 ) - { - wchar_t* inbuf_w = new wchar_t[inbuf_w_len]; - - inbuf_w_len - = MultiByteToWideChar - ( - from_code_page, - 0, - *inbuf, - static_cast( *inbytesleft ), - inbuf_w, - inbuf_w_len - ); - - if ( inbuf_w_len > 0 ) - { - int outbyteswritten - = WideCharToMultiByte - ( - to_code_page, - 0, - inbuf_w, - inbuf_w_len, - *outbuf, - *outbytesleft, - 0, - 0 - ); - - delete [] inbuf_w; - - if ( outbyteswritten > 0 ) - { - *inbuf += *inbytesleft; - *inbytesleft = 0; - *outbytesleft -= outbyteswritten; - return outbyteswritten; - } - } - else - delete [] inbuf_w; - } - - return static_cast( -1 ); -#else - if ( reset() ) - { - // Now try to convert; will return ( size_t )-1 on failure -#ifdef __sun - return ::libiconv -#else - return ::iconv -#endif - ( - cd, - ( ICONV_SOURCE_CAST )inbuf, - inbytesleft, - outbuf, - outbytesleft - ); - } - else - return static_cast( -1 ); -#endif -} - -bool iconv::operator()( const string& inbuf, string& outbuf ) -{ -#ifdef _WIN32 - int inbuf_w_len - = MultiByteToWideChar - ( - from_code_page, - 0, - inbuf.c_str(), - inbuf.size(), - NULL, - 0 - ); - - if ( inbuf_w_len > 0 ) - { - wchar_t* inbuf_w = new wchar_t[inbuf_w_len]; - - inbuf_w_len - = MultiByteToWideChar - ( - from_code_page, - 0, - inbuf.c_str(), - inbuf.size(), - inbuf_w, - inbuf_w_len - ); - - if ( inbuf_w_len > 0 ) - { - int outbuf_c_len - = WideCharToMultiByte - ( - to_code_page, - 0, - inbuf_w, - inbuf_w_len, - NULL, - 0, - 0, - 0 - ); - - if ( outbuf_c_len > 0 ) - { - char* outbuf_c = new char[outbuf_c_len]; - - outbuf_c_len - = WideCharToMultiByte - ( - to_code_page, - 0, - inbuf_w, - inbuf_w_len, - outbuf_c, - outbuf_c_len, - 0, - 0 - ); - - if ( outbuf_c_len > 0 ) - { - outbuf.append( outbuf_c, outbuf_c_len ); - delete [] outbuf_c; - return true; - } - else - delete [] outbuf_c; - } - else - delete [] inbuf_w; - } - else - delete [] inbuf_w; - } - - return false; -#else - // Reset the converter - if ( reset() ) - { - char* inbuf_c = const_cast( inbuf.c_str() ); - size_t inbytesleft = inbuf.size(); - size_t outbuf_c_len = inbuf.size(); - - for ( ;; ) // Loop as long as ::iconv returns E2BIG - { - char* outbuf_c = new char[outbuf_c_len]; - char* outbuf_c_dummy = outbuf_c; - size_t outbytesleft = outbuf_c_len; - - size_t iconv_ret -#ifdef __sun - = ::libiconv -#else - = ::iconv -#endif - ( - cd, - ( ICONV_SOURCE_CAST )&inbuf_c, - &inbytesleft, - &outbuf_c_dummy, - &outbytesleft - ); - - if ( iconv_ret != static_cast( -1 ) ) - { - outbuf.append( outbuf_c, outbuf_c_len - outbytesleft ); - delete [] outbuf_c; - return true; - } - else if ( errno == E2BIG ) - { -#ifdef _DEBUG - if ( outbytesleft != 0 ) DebugBreak(); -#endif - outbuf.append( outbuf_c, outbuf_c_len ); - delete [] outbuf_c; - outbuf_c_len *= 2; - continue; - } - else - { - delete [] outbuf_c; - return false; - } - } - } - else - return false; -#endif -} - -#ifdef _WIN32 -bool iconv::operator()( const string& inbuf, wstring& outbuf ) -{ - int outbuf_w_len - = MultiByteToWideChar - ( - from_code_page, - 0, - inbuf.c_str(), - inbuf.size(), - NULL, - 0 - ); - - if ( outbuf_w_len > 0 ) - { - wchar_t* outbuf_w = new wchar_t[outbuf_w_len]; - - outbuf_w_len - = MultiByteToWideChar - ( - from_code_page, - 0, - inbuf.c_str(), - inbuf.size(), - outbuf_w, - outbuf_w_len - ); - - if ( outbuf_w_len > 0 ) - { - outbuf.append( outbuf_w, outbuf_w_len ); - delete [] outbuf_w; - } - else - delete [] outbuf_w; - } - - return false; -} - -bool iconv::operator()( const wstring& inbuf, string& outbuf ) -{ - int outbuf_c_len - = WideCharToMultiByte - ( - to_code_page, - 0, - inbuf.c_str(), - inbuf.size(), - NULL, - 0, - 0, - 0 - ); - - if ( outbuf_c_len > 0 ) - { - char* outbuf_c = new char[outbuf_c_len]; - - outbuf_c_len - = WideCharToMultiByte - ( - to_code_page, - 0, - inbuf.c_str(), - inbuf.size(), - outbuf_c, - outbuf_c_len, - 0, - 0 - ); - - if ( outbuf_c_len > 0 ) - { - outbuf.append( outbuf_c, outbuf_c_len ); - delete [] outbuf_c; - return true; - } - else - delete [] outbuf_c; - } - - return false; -} -#endif - -#ifndef _WIN32 -bool iconv::reset() -{ -#ifdef __sun - return ::libiconv( cd, NULL, 0, NULL, 0 ) != static_cast( -1 ); -#else - return ::iconv( cd, NULL, 0, NULL, 0 ) != static_cast( -1 ); -#endif -} -#endif - - -// log.cpp -Log::Level Log::LOG_EMERG( "EMERG", 0 ); -Log::Level Log::LOG_ALERT( "ALERT", 1 ); -Log::Level Log::LOG_CRIT( "CRIT", 2 ); -Log::Level Log::LOG_ERR( "ERR", 3 ); -Log::Level Log::LOG_WARNING( "WARNING", 4 ); -Log::Level Log::LOG_INFO( "INFO", 5 ); -Log::Level Log::LOG_DEBUG( "DEBUG", 6 ); - - -namespace yield -{ - namespace platform - { - class FileLog : public Log - { - public: - FileLog( File& file, const Level& level ) - : Log( level ), file( &file ) - { } - - FileLog( const Path& file_path, const Level& level ) // Lazy open - : Log( level ), file_path( file_path ) - { } - - ~FileLog() - { - File::dec_ref( file ); - } - - // Log - void write( const char* str, size_t str_len ) - { - if ( file == NULL ) // Lazy open - { - file = Volume().open( file_path, O_CREAT|O_WRONLY|O_APPEND ); - if ( file == NULL ) - return; - } - - file->write( str, str_len ); - } - - private: - File* file; - Path file_path; - }; - - - class ostreamLog : public Log - { - public: - ostreamLog( ostream& os, const Level& level ) - : Log( level ), os( os ) - { } - - // Log - void write( const char* str, size_t str_len ) - { - os.write( str, str_len ); - } - - private: - ostream& os; - }; - }; -}; - - -Log::Level::Level( const char* level ) - : level_string( level ) -{ - init( level ); -} - -Log::Level::Level( const string& level ) - : level_string( level ) -{ - init( level.c_str() ); -} - - -Log::Level::Level( uint8_t level ) - : level_uint8( level ) -{ - switch ( level ) - { - case 0: level_string = "EMERG"; break; - case 1: level_string = "ALERT"; break; - case 2: level_string = "CRIT"; break; - case 3: level_string = "ERR"; break; - case 4: level_string = "WARNING"; break; - case 5: level_string = "NOTICE"; break; - case 6: level_string = "INFO"; break; - default: level_string = "DEBUG"; break; - } -} - -Log::Level::Level( const char* level_string, uint8_t level_uint8 ) -: level_string( level_string ), level_uint8( level_uint8 ) -{ } - -Log::Level::Level( const Level& other ) -: level_string( other.level_string ), level_uint8( other.level_uint8 ) -{ } - -void Log::Level::init( const char* level ) -{ - level_uint8 = static_cast( atoi( level ) ); - if ( level_uint8 == 0 ) - { - if - ( - strcmp( level, "LOG_EMERG" ) == 0 || - strcmp( level, "EMERG" ) == 0 || - strcmp( level, "EMERGENCY" ) == 0 || - strcmp( level, "FATAL" ) == 0 || - strcmp( level, "FAIL" ) == 0 - ) - level_uint8 = 0; - - else if - ( - strcmp( level, "LOG_ALERT" ) == 0 || - strcmp( level, "ALERT" ) == 0 - ) - level_uint8 = 1; - - else if - ( - strcmp( level, "LOG_CRIT" ) == 0 || - strcmp( level, "CRIT" ) == 0 || - strcmp( level, "CRITICAL" ) == 0 - ) - level_uint8 = 1; - - else if - ( - strcmp( level, "LOG_ERR" ) == 0 || - strcmp( level, "ERR" ) == 0 || - strcmp( level, "ERROR" ) == 0 - ) - level_uint8 = 2; - - else if - ( - strcmp( level, "LOG_WARNING" ) == 0 || - strcmp( level, "WARNING" ) == 0 || - strcmp( level, "WARN" ) == 0 - ) - level_uint8 = 3; - - else if - ( - strcmp( level, "LOG_NOTICE" ) == 0 || - strcmp( level, "NOTICE" ) == 0 - ) - level_uint8 = 4; - - else if - ( - strcmp( level, "LOG_INFO" ) == 0 || - strcmp( level, "INFO" ) == 0 - ) - level_uint8 = 5; - - else if - ( - strcmp( level, "LOG_DEBUG" ) == 0 || - strcmp( level, "DEBUG" ) == 0 || - strcmp( level, "TRACE" ) == 0 - ) - level_uint8 = 6; - - else - level_uint8 = 7; - } -} - -Log::Stream::Stream( Log& log, Log::Level level ) - : log( log ), level( level ) -{ } - -Log::Stream::Stream( const Stream& other ) - : log( other.log.inc_ref() ), level( other.level ) -{ } - -Log::Stream::~Stream() -{ - if ( level <= log.get_level() && !oss.str().empty() ) - { - ostringstream stamped_oss; - stamped_oss << static_cast( Time().as_unix_time_s() ); - stamped_oss << " "; - stamped_oss << static_cast( log.get_level() ); - stamped_oss << ": "; - stamped_oss << oss.str(); - stamped_oss << endl; - - log.write( stamped_oss.str(), level ); - } - - Log::dec_ref( log ); -} - - -Log::Log( const Level& level ) - : level( level ) -{ } - -Log& Log::open( ostream& os, const Level& level ) -{ - return *new ostreamLog( os, level ); -} - -Log& Log::open( const Path& file_path, const Level& level, bool lazy_open ) -{ - if ( file_path.empty() || file_path == "-" ) - return *new ostreamLog( cout, level ); - else if ( lazy_open ) - return *new FileLog( file_path, level ); - else - { - File* file = Volume().open( file_path, O_CREAT|O_WRONLY|O_APPEND ); - if ( file != NULL ) - return *new FileLog( *file, level ); - else - throw Exception(); - } -} - -void Log::write( const char* str, const Level& level ) -{ - write( str, strnlen( str, UINT16_MAX ), level ); -} - -void Log::write( const string& str, const Level& level ) -{ - write( str.c_str(), str.size(), level ); -} - -void Log::write( const char* str, size_t str_len, const Level& level ) -{ - if ( level <= this->level ) - write( str, str_len ); -} - -void Log::write( const void* str, size_t str_len, const Level& level ) -{ - return write - ( - static_cast( str ), - str_len, - level - ); -} - -void Log::write( const unsigned char* str, size_t str_len, const Level& level ) -{ - if ( level <= this->level ) - { - bool str_is_printable = true; - for ( size_t str_i = 0; str_i < str_len; str_i++ ) - { - if - ( - str[str_i] == '\r' || - str[str_i] == '\n' || - ( str[str_i] >= 32 && str[str_i] <= 126 ) - ) - continue; - else - { - str_is_printable = false; - break; - } - } - - if ( str_is_printable ) - write( reinterpret_cast( str ), str_len ); - else - { - char* printable_str = new char[str_len * 3]; - size_t printable_str_len = 0; - - for ( size_t str_i = 0; str_i < str_len; str_i++ ) - { - char hex_digit = ( str[str_i] >> 4 ) & 0x0F; - if ( hex_digit >= 0 && hex_digit <= 9 ) - printable_str[printable_str_len++] = '0' + hex_digit; - else - printable_str[printable_str_len++] = 'A' + hex_digit - 10; - - hex_digit = str[str_i] & 0x0F; - if ( hex_digit >= 0 && hex_digit <= 9 ) - printable_str[printable_str_len++] = '0' + hex_digit; - else - printable_str[printable_str_len++] = 'A' + hex_digit - 10; - - printable_str[printable_str_len++] = ' '; - } - - write( printable_str, printable_str_len ); - - delete [] printable_str; - } - } -} - - -// memory_mapped_file.cpp -using std::max; - -#ifdef _WIN32 -#include -#else -#include -#endif - - -MemoryMappedFile::MemoryMappedFile -( - File& underlying_file, - uint32_t open_flags -) - : underlying_file( underlying_file ), - open_flags( open_flags ) -{ -#ifdef _WIN32 - mapping = NULL; -#endif - size_ = 0; - start = NULL; -} - -MemoryMappedFile::~MemoryMappedFile() -{ - close(); - File::dec_ref( underlying_file ); -} - -bool MemoryMappedFile::close() -{ - if ( start != NULL ) - { - sync(); -#ifdef _WIN32 - UnmapViewOfFile( start ); -#else - munmap( start, size() ); -#endif - start = NULL; - } - -#ifdef _WIN32 - if ( mapping != NULL ) - { - CloseHandle( mapping ); - mapping = NULL; - } -#endif - - return underlying_file.close(); -} - -MemoryMappedFile* MemoryMappedFile::open( const Path& path ) -{ - return open - ( - path, - File::FLAGS_DEFAULT, - File::MODE_DEFAULT, - File::ATTRIBUTES_DEFAULT, - 0 - ); -} - -MemoryMappedFile* MemoryMappedFile::open( const Path& path, uint32_t flags ) -{ - return open - ( - path, - flags, - File::MODE_DEFAULT, - File::ATTRIBUTES_DEFAULT, - 0 - ); -} - -MemoryMappedFile* -MemoryMappedFile::open -( - const Path& path, - uint32_t flags, - mode_t mode, - uint32_t attributes, - size_t minimum_size -) -{ - File* file = Volume().open( path, flags, mode, attributes ); - - if ( file != NULL ) - { - size_t current_file_size; - if ( ( flags & O_TRUNC ) != O_TRUNC ) - { -#ifdef _WIN32 - ULARGE_INTEGER uliFileSize; - uliFileSize.LowPart = GetFileSize( *file, &uliFileSize.HighPart ); - current_file_size = static_cast( uliFileSize.QuadPart ); -#else - Stat* stbuf = file->stat(); - if ( stbuf != NULL ) - { - current_file_size = stbuf->get_size(); - Stat::dec_ref( *stbuf ); - } - else - current_file_size = 0; -#endif - } - else - current_file_size = 0; - - MemoryMappedFile* memory_mapped_file - = new MemoryMappedFile( *file, flags ); - - if ( memory_mapped_file->resize( max( minimum_size, current_file_size ) ) ) - return memory_mapped_file; - else - { - delete memory_mapped_file; - return NULL; - } - } - else - return NULL; -} - -bool MemoryMappedFile::resize( size_t new_size ) -{ - if ( new_size > 0 ) - { -#ifdef _WIN32 - if ( start != NULL ) - { - if ( UnmapViewOfFile( start ) != TRUE ) - return false; - } - - if ( mapping != NULL ) - { - if ( CloseHandle( mapping ) != TRUE ) - return false; - } -#else - if ( start != NULL ) - { - sync(); - if ( munmap( start, size() ) == -1 ) - return false; - } -#endif - - if - ( - size() == new_size - || - underlying_file.truncate( new_size ) ) - { -#ifdef _WIN32 - unsigned long map_flags = PAGE_READONLY; - if ( ( open_flags & O_RDWR ) == O_RDWR || - ( open_flags & O_WRONLY ) == O_WRONLY ) - map_flags = PAGE_READWRITE; - - ULARGE_INTEGER uliNewSize; uliNewSize.QuadPart = new_size; - - mapping = CreateFileMapping - ( - underlying_file, - NULL, map_flags, - uliNewSize.HighPart, - uliNewSize.LowPart, - NULL - ); - - if ( mapping != NULL ) - { - map_flags = FILE_MAP_READ; - if( ( open_flags & O_RDWR ) || ( open_flags & O_WRONLY ) ) - map_flags = FILE_MAP_ALL_ACCESS; - - start = static_cast( MapViewOfFile( mapping, map_flags, 0, 0, 0 ) ); - if ( start != NULL ) - { - } -#else - unsigned long mmap_flags = PROT_READ; - if( ( open_flags & O_RDWR ) == O_RDWR || - ( open_flags & O_WRONLY ) == O_WRONLY ) - mmap_flags |= PROT_WRITE; - - void* mmap_ret = mmap - ( - 0, - new_size, - mmap_flags, - MAP_SHARED, - underlying_file, - 0 - ); - - if ( mmap_ret != MAP_FAILED ) - { - start = static_cast( mmap_ret ); -#endif - this->size_ = new_size; - return true; - } - } - } - else - return true; - - return false; -} - -bool MemoryMappedFile::sync() -{ -#ifdef _WIN32 - return sync - ( - static_cast( 0 ), - static_cast( 0 ) - ); // length 0 = flush to end of mapping -#else - return sync( static_cast( 0 ), size() ); -#endif -} - -bool MemoryMappedFile::sync( size_t offset, size_t length ) -{ - return sync( start + offset, length ); -} - -bool MemoryMappedFile::sync( void* ptr, size_t length ) -{ -#if defined(_WIN32) - return FlushViewOfFile( ptr, length ) == TRUE; -#elif defined(__sun) - return msync( static_cast( ptr ), length, MS_SYNC ) == 0; -#else - return msync( ptr, length, MS_SYNC ) == 0; -#endif -} - - -// mutex.cpp -#if defined(_WIN32) -#include -#elif defined(__linux__) || defined(__FreeBSD__) || defined(__sun) -#define YIELD_PLATFORM_HAVE_PTHREAD_MUTEX_TIMEDLOCK -#endif - - -Mutex::Mutex() -{ -#ifdef _WIN32 - if ( ( hMutex = CreateEvent( NULL, FALSE, TRUE, NULL ) ) == NULL ) - DebugBreak(); -#else - if ( pthread_mutex_init( &pthread_mutex, NULL ) != 0 ) - DebugBreak(); -#endif -} - -Mutex::~Mutex() -{ -#ifdef _WIN32 - if ( hMutex ) CloseHandle( hMutex ); -#else - pthread_mutex_destroy( &pthread_mutex ); -#endif -} - -bool Mutex::acquire() -{ -#ifdef _WIN32 - DWORD dwRet = WaitForSingleObjectEx( hMutex, INFINITE, TRUE ); - return dwRet == WAIT_OBJECT_0 || dwRet == WAIT_ABANDONED; -#else - pthread_mutex_lock( &pthread_mutex ); - return true; -#endif -} - -bool Mutex::acquire( const Time& timeout ) -{ -#ifdef _WIN32 - DWORD timeout_ms = static_cast( timeout.as_unix_time_ms() ); - DWORD dwRet = WaitForSingleObjectEx( hMutex, timeout_ms, TRUE ); - return dwRet == WAIT_OBJECT_0 || dwRet == WAIT_ABANDONED; -#else -#ifdef YIELD_PLATFORM_HAVE_PTHREAD_MUTEX_TIMEDLOCK - struct timespec timeout_ts = Time() + timeout; - return ( pthread_mutex_timedlock( &pthread_mutex, &timeout_ts ) == 0 ); -#else - if ( pthread_mutex_trylock( &pthread_mutex ) == 0 ) - return true; - else - { - usleep( timeout.as_unix_time_us() ); - return pthread_mutex_trylock( &pthread_mutex ) == 0; - } -#endif -#endif -} - -void Mutex::release() -{ -#ifdef _WIN32 - SetEvent( hMutex ); -#else - pthread_mutex_unlock( &pthread_mutex ); -#endif -} - -bool Mutex::try_acquire() -{ -#ifdef _WIN32 - DWORD dwRet = WaitForSingleObjectEx( hMutex, 0, TRUE ); - return dwRet == WAIT_OBJECT_0 || dwRet == WAIT_ABANDONED; -#else - return pthread_mutex_trylock( &pthread_mutex ) == 0; -#endif -} - - -// named_pipe.cpp -#ifdef _WIN32 -#include -#endif - - -NamedPipe* NamedPipe::open( const Path& path, uint32_t flags, mode_t mode ) -{ -#ifdef _WIN32 - Path named_pipe_base_dir_path( TEXT( "\\\\.\\pipe" ) ); - Path named_pipe_path( named_pipe_base_dir_path + path ); - - if ( ( flags & O_CREAT ) == O_CREAT ) // Server - { - HANDLE hPipe - = CreateNamedPipe - ( - named_pipe_path, - PIPE_ACCESS_DUPLEX|FILE_FLAG_OVERLAPPED, - PIPE_TYPE_BYTE|PIPE_READMODE_BYTE|PIPE_WAIT, - PIPE_UNLIMITED_INSTANCES, - 4096, - 4096, - 0, - NULL - ); - - if ( hPipe != INVALID_HANDLE_VALUE ) - return new NamedPipe( hPipe, false ); - } - else // Client - { - File* underlying_file = Volume().open( named_pipe_path, flags ); - if ( underlying_file != NULL ) - { - fd_t fd; - - DuplicateHandle - ( - GetCurrentProcess(), - *underlying_file, - GetCurrentProcess(), - &fd, - 0, - FALSE, - DUPLICATE_SAME_ACCESS - ); - - NamedPipe* named_pipe = new NamedPipe( fd, true ); - - File::dec_ref( *underlying_file ); - - return named_pipe; - } - } -#else - if ( ( flags & O_CREAT ) == O_CREAT ) - { - if - ( - ::mkfifo( path, mode ) != -1 - || - errno == EEXIST - ) - flags ^= O_CREAT; - else - return NULL; - } - - File* underlying_file = Volume().open( path, flags ); - if ( underlying_file != NULL ) - { - NamedPipe* named_pipe = new NamedPipe( dup( *underlying_file ) ); - File::dec_ref( *underlying_file ); - return named_pipe; - } -#endif - - return NULL; -} - -#ifdef _WIN32 -NamedPipe::NamedPipe( fd_t fd, bool connected ) - : File( fd ), connected( connected ) -{ } -#else -NamedPipe::NamedPipe( fd_t fd ) - : File( fd ) -{ } -#endif - -#ifdef _WIN32 -bool NamedPipe::connect() -{ - if ( connected ) - return true; - else - { - if - ( - ConnectNamedPipe( *this, NULL ) != 0 - || - GetLastError() == ERROR_PIPE_CONNECTED - ) - { - connected = true; - return true; - } - else - return false; - } -} - -ssize_t NamedPipe::read( void* buf, size_t buflen ) -{ - if ( connect() ) - return File::read( buf, buflen ); - else - return -1; -} - -ssize_t NamedPipe::write( const void* buf, size_t buflen ) -{ - if ( connect() ) - return File::write( buf, buflen ); - else - return -1; -} -#endif - - -// nbio_queue.cpp -#ifdef _WIN32 -#include -#endif - - -class NBIOQueue::Thread : public yield::platform::Thread -{ -public: - ~Thread() - { - FDEventPoller::dec_ref( fd_event_poller ); - SocketPair::dec_ref( submit_pipe ); - } - - static Thread& create() - { - FDEventPoller& fd_event_poller = FDEventPoller::create(); - SocketPair& submit_pipe = SocketPair::create(); - - if - ( - submit_pipe.first().set_blocking_mode( false ) - && - fd_event_poller.associate( submit_pipe.first(), true, false ) - ) - return *new Thread( fd_event_poller, submit_pipe ); - else - throw Exception(); - } - - void submit( NBIOCB* nbiocb ) - { - submit_pipe.second().write( &nbiocb, sizeof( nbiocb ) ); - } - - // Thread - void run() - { - set_name( "NBIOQueue::Thread" ); - - FDEventPoller::FDEvent fd_events[64]; - - for ( ;; ) - { - int fd_events_count; - if ( nbiocbs_with_timeouts.empty() ) - fd_events_count = fd_event_poller.poll( fd_events, 64 ); - else - { - Time current_time; - if ( nbiocbs_with_timeouts.top().first > current_time ) - { - Time next_timeout = current_time - nbiocbs_with_timeouts.top().first; - fd_events_count = fd_event_poller.poll( fd_events, 64, next_timeout ); - } - else - fd_events_count = 0; - } - - if ( fd_events_count > 0 ) - { - for ( int fd_event_i = 0; fd_event_i < fd_events_count; fd_event_i++ ) - { - const FDEventPoller::FDEvent& fd_event = fd_events[fd_event_i]; - - if ( fd_event.get_fd() == submit_pipe.first() ) - { - // Read submitted NBIOCB's - NBIOCB* nbiocb; - for ( ;; ) - { - ssize_t read_ret - = submit_pipe.first().read( &nbiocb, sizeof( nbiocb ) ); - - if ( read_ret == sizeof( nbiocb ) ) - { - if ( nbiocb != NULL ) - { - if ( nbiocb->get_state() == NBIOCB::STATE_UNKNOWN ) - nbiocb->execute(); - - bool want_read, want_write; - - switch ( nbiocb->get_state() ) - { - case NBIOCB::STATE_WANT_CONNECT: - case NBIOCB::STATE_WANT_WRITE: - { - want_read = false; - want_write = true; - } - break; - - case NBIOCB::STATE_WANT_READ: - { - want_read = true; - want_write = false; - } - break; - - default: - { - NBIOCB::dec_ref( *nbiocb ); - continue; - } - break; - } - - fd_event_poller.associate - ( - nbiocb->get_fd(), - nbiocb, - want_read, - want_write - ); - - if ( nbiocb->get_timeout() != NBIOCB::TIMEOUT_INFINITE ) - { - nbiocbs_with_timeouts.push - ( - Time() + nbiocb->get_timeout(), - nbiocb - ); - } - } - else // NULL nbiocb = the stop signal - return; - } - else if ( read_ret <= 0 ) - break; - else - DebugBreak(); - } - } - else - { - NBIOCB* nbiocb = static_cast( fd_event.get_context() ); - - nbiocb->execute(); - - switch ( nbiocb->get_state() ) - { - case NBIOCB::STATE_WANT_CONNECT: - case NBIOCB::STATE_WANT_WRITE: - { - fd_event_poller.toggle( nbiocb->get_fd(), false, true ); - } - break; - - case NBIOCB::STATE_WANT_READ: - { - fd_event_poller.toggle( nbiocb->get_fd(), true, false ); - } - break; - - case NBIOCB::STATE_COMPLETE: - case NBIOCB::STATE_ERROR: - { - if ( nbiocb->get_timeout() != NBIOCB::TIMEOUT_INFINITE ) - { - bool found_nbiocb = false; - for - ( - TimerHeap::iterator nbiocb_i - = nbiocbs_with_timeouts.begin(); - nbiocb_i != nbiocbs_with_timeouts.end(); - ++nbiocb_i - ) - { - if ( nbiocb_i->second == nbiocb ) - { - found_nbiocb = true; - nbiocbs_with_timeouts.erase( nbiocb_i ); - break; - } - } - - if ( !found_nbiocb ) DebugBreak(); - } - - fd_event_poller.dissociate( nbiocb->get_fd() ); - - NBIOCB::dec_ref( *nbiocb ); - } - break; - } - } - } - } - else - { - if ( !nbiocbs_with_timeouts.empty() ) - { - NBIOCB* nbiocb = nbiocbs_with_timeouts.top().second; - nbiocbs_with_timeouts.pop(); - - fd_event_poller.dissociate( nbiocb->get_fd() ); - -#ifdef _WIN32 - nbiocb->onError( WSAETIMEDOUT ); -#else - nbiocb->onError( ETIMEDOUT ); -#endif - - NBIOCB::dec_ref( *nbiocb ); - } - -#ifdef _WIN32 - if ( fd_events_count < 0 ) -#else - if ( fd_events_count < 0 && errno != EINTR ) -#endif - { - cerr << "NBIOQueue::Thread: error on poll: " << - Exception() << "." << endl; - } - } - } - } - -private: - Thread( FDEventPoller& fd_event_poller, SocketPair& submit_pipe ) - : fd_event_poller( fd_event_poller ), submit_pipe( submit_pipe ) - { } - -private: - FDEventPoller& fd_event_poller; - SocketPair& submit_pipe; - TimerHeap nbiocbs_with_timeouts; -}; - - -NBIOQueue::NBIOQueue( const vector& threads ) - : threads( threads ) -{ } - -NBIOQueue::~NBIOQueue() -{ - while ( !threads.empty() ) - { - threads.back()->submit( NULL ); - threads.back()->join(); -#ifndef _WIN32 - Thread::nanosleep( 10 * Time::NS_IN_MS ); -#endif - Thread::dec_ref( *threads.back() ); - threads.pop_back(); - } -} - -NBIOQueue* NBIOQueue::create( int16_t thread_count ) -{ - if ( thread_count <= 0 ) - thread_count = ProcessorSet::getOnlineLogicalProcessorCount(); - - vector threads; - for ( int16_t thread_i = 0; thread_i < thread_count; thread_i++ ) - { - Thread& thread = Thread::create(); - thread.start(); - threads.push_back( &thread ); - } - - return new NBIOQueue( threads ); -} - -uint16_t NBIOQueue::get_thread_count() const -{ - return static_cast( threads.size() ); -} - -void NBIOQueue::submit( NBIOCB& nbiocb ) -{ - threads[nbiocb.get_fd() % threads.size()]->submit( &nbiocb ); -} - - -// option_parser.cpp -#include -using std::sort; - -/*! @file SimpleOpt.h - - Copyright (c) 2006-2007, Brodie Thiesfield - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY - CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE - SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - - -// Default the max arguments to a fixed value. If you want to be able to -// handle any number of arguments, then predefine this to 0 and it will -// use an internal dynamically allocated buffer instead. -#ifdef SO_MAX_ARGS -# define SO_STATICBUF SO_MAX_ARGS -#else -# include // malloc, free -# include // memcpy -# define SO_STATICBUF 50 -#endif - -//! Error values -typedef enum _ESOError -{ - //! No error - SO_SUCCESS = 0, - - /*! It looks like an option (it starts with a switch character), but - it isn't registered in the option table. */ - SO_OPT_INVALID = -1, - - /*! Multiple options matched the supplied option text. - Only returned when NOT using SO_O_EXACT. */ - SO_OPT_MULTIPLE = -2, - - /*! Option doesn't take an argument, but a combined argument was - supplied. */ - SO_ARG_INVALID = -3, - - /*! SO_REQ_CMB style-argument was supplied to a SO_REQ_SEP option - Only returned when using SO_O_PEDANTIC. */ - SO_ARG_INVALID_TYPE = -4, - - //! Required argument was not supplied - SO_ARG_MISSING = -5, - - /*! Option argument looks like another option. - Only returned when NOT using SO_O_NOERR. */ - SO_ARG_INVALID_DATA = -6 -} ESOError; - -//! Option flags -enum _ESOFlags -{ - /*! Disallow partial matching of option names */ - SO_O_EXACT = 0x0001, - - /*! Disallow use of slash as an option marker on Windows. - Un*x only ever recognizes a hyphen. */ - SO_O_NOSLASH = 0x0002, - - /*! Permit arguments on single letter options with no equals sign. - e.g. -oARG or -o[ARG] */ - SO_O_SHORTARG = 0x0004, - - /*! Permit single character options to be clumped into a single - option string. e.g. "-a -b -c" <==> "-abc" */ - SO_O_CLUMP = 0x0008, - - /*! Process the entire argv array for options, including the - argv[0] entry. */ - SO_O_USEALL = 0x0010, - - /*! Do not generate an error for invalid options. errors for missing - arguments will still be generated. invalid options will be - treated as files. invalid options in clumps will be silently - ignored. */ - SO_O_NOERR = 0x0020, - - /*! Validate argument type pedantically. Return an error when a - separated argument "-opt arg" is supplied by the user as a - combined argument "-opt=arg". By default this is not considered - an error. */ - SO_O_PEDANTIC = 0x0040, - - /*! Case-insensitive comparisons for short arguments */ - SO_O_ICASE_SHORT = 0x0100, - - /*! Case-insensitive comparisons for long arguments */ - SO_O_ICASE_LONG = 0x0200, - - /*! Case-insensitive comparisons for word arguments - i.e. arguments without any hyphens at the start. */ - SO_O_ICASE_WORD = 0x0400, - - /*! Case-insensitive comparisons for all arg types */ - SO_O_ICASE = 0x0700 -}; - -/*! Types of arguments that options may have. Note that some of the _ESOFlags - are not compatible with all argument types. SO_O_SHORTARG requires that - relevant options use either SO_REQ_CMB or SO_OPT. SO_O_CLUMP requires - that relevant options use only SO_NONE. - */ -typedef enum _ESOArgType { - /*! No argument. Just the option flags. - e.g. -o --opt */ - SO_NONE, - - /*! Required separate argument. - e.g. -o ARG --opt ARG */ - SO_REQ_SEP, - - /*! Required combined argument. - e.g. -oARG -o=ARG --opt=ARG */ - SO_REQ_CMB, - - /*! Optional combined argument. - e.g. -o[ARG] -o[=ARG] --opt[=ARG] */ - SO_OPT, - - /*! Multiple separate arguments. The actual number of arguments is - determined programatically at the time the argument is processed. - e.g. -o N ARG1 ARG2 ... ARGN --opt N ARG1 ARG2 ... ARGN */ - SO_MULTI -} ESOArgType; - -//! this option definition must be the last entry in the table -#define SO_END_OF_OPTIONS { -1, NULL, SO_NONE } - -#ifdef _DEBUG -# ifdef _MSC_VER -# include -# define SO_ASSERT(b) _ASSERTE(b) -# else -# include -# define SO_ASSERT(b) assert(b) -# endif -#else -# define SO_ASSERT(b) //!< assertion used to test input data -#endif - -// --------------------------------------------------------------------------- -// MAIN TEMPLATE CLASS -// --------------------------------------------------------------------------- - -/*! @brief Implementation of the SimpleOpt class */ -template -class CSimpleOptTempl -{ -public: - /*! @brief Structure used to define all known options. */ - struct SOption { - /*! ID to return for this flag. Optional but must be >= 0 */ - int nId; - - /*! arg string to search for, e.g. "open", "-", "-f", "--file" - Note that on Windows the slash option marker will be converted - to a hyphen so that "-f" will also match "/f". */ - const SOCHAR * pszArg; - - /*! type of argument accepted by this option */ - ESOArgType nArgType; - }; - - /*! @brief Initialize the class. Init() must be called later. */ - CSimpleOptTempl() - : m_rgShuffleBuf(NULL) - { - Init(0, NULL, NULL, 0); - } - - /*! @brief Initialize the class in preparation for use. */ - CSimpleOptTempl( - int argc, - SOCHAR * argv[], - const SOption * a_rgOptions, - int a_nFlags = 0 - ) - : m_rgShuffleBuf(NULL) - { - Init(argc, argv, a_rgOptions, a_nFlags); - } - -#ifndef SO_MAX_ARGS - /*! @brief Deallocate any allocated memory. */ - ~CSimpleOptTempl() { if (m_rgShuffleBuf) free(m_rgShuffleBuf); } -#endif - - /*! @brief Initialize the class in preparation for calling Next. - - The table of options pointed to by a_rgOptions does not need to be - valid at the time that Init() is called. However on every call to - Next() the table pointed to must be a valid options table with the - last valid entry set to SO_END_OF_OPTIONS. - - NOTE: the array pointed to by a_argv will be modified by this - class and must not be used or modified outside of member calls to - this class. - - @param a_argc Argument array size - @param a_argv Argument array - @param a_rgOptions Valid option array - @param a_nFlags Optional flags to modify the processing of - the arguments - - @return true Successful - @return false if SO_MAX_ARGC > 0: Too many arguments - if SO_MAX_ARGC == 0: Memory allocation failure - */ - bool Init( - int a_argc, - SOCHAR * a_argv[], - const SOption * a_rgOptions, - int a_nFlags = 0 - ); - - /*! @brief Change the current options table during option parsing. - - @param a_rgOptions Valid option array - */ - inline void SetOptions(const SOption * a_rgOptions) { - m_rgOptions = a_rgOptions; - } - - /*! @brief Change the current flags during option parsing. - - Note that changing the SO_O_USEALL flag here will have no affect. - It must be set using Init() or the constructor. - - @param a_nFlags Flags to modify the processing of the arguments - */ - inline void SetFlags(int a_nFlags) { m_nFlags = a_nFlags; } - - /*! @brief Query if a particular flag is set */ - inline bool HasFlag(int a_nFlag) const { - return (m_nFlags & a_nFlag) == a_nFlag; - } - - /*! @brief Advance to the next option if available. - - When all options have been processed it will return false. When true - has been returned, you must check for an invalid or unrecognized - option using the LastError() method. This will be return an error - value other than SO_SUCCESS on an error. All standard data - (e.g. OptionText(), OptionArg(), OptionId(), etc) will be available - depending on the error. - - After all options have been processed, the remaining files from the - command line can be processed in same order as they were passed to - the program. - - @return true option or error available for processing - @return false all options have been processed - */ - bool Next(); - - /*! Stops processing of the command line and returns all remaining - arguments as files. The next call to Next() will return false. - */ - void Stop(); - - /*! @brief Return the last error that occurred. - - This function must always be called before processing the current - option. This function is available only when Next() has returned true. - */ - inline ESOError LastError() const { return m_nLastError; } - - /*! @brief Return the nId value from the options array for the current - option. - - This function is available only when Next() has returned true. - */ - inline int OptionId() const { return m_nOptionId; } - - /*! @brief Return the pszArg from the options array for the current - option. - - This function is available only when Next() has returned true. - */ - inline const SOCHAR * OptionText() const { return m_pszOptionText; } - - /*! @brief Return the argument for the current option where one exists. - - If there is no argument for the option, this will return NULL. - This function is available only when Next() has returned true. - */ - inline SOCHAR * OptionArg() const { return m_pszOptionArg; } - - /*! @brief Validate and return the desired number of arguments. - - This is only valid when OptionId() has return the ID of an option - that is registered as SO_MULTI. It may be called multiple times - each time returning the desired number of arguments. Previously - returned argument pointers are remain valid. - - If an error occurs during processing, NULL will be returned and - the error will be available via LastError(). - - @param n Number of arguments to return. - */ - SOCHAR ** MultiArg(int n); - - /*! @brief Returned the number of entries in the Files() array. - - After Next() has returned false, this will be the list of files (or - otherwise unprocessed arguments). - */ - inline int FileCount() const { return m_argc - m_nLastArg; } - - /*! @brief Return the specified file argument. - - @param n Index of the file to return. This must be between 0 - and FileCount() - 1; - */ - inline SOCHAR * File(int n) const { - SO_ASSERT(n >= 0 && n < FileCount()); - return m_argv[m_nLastArg + n]; - } - - /*! @brief Return the array of files. */ - inline SOCHAR ** Files() const { return &m_argv[m_nLastArg]; } - -private: - CSimpleOptTempl(const CSimpleOptTempl &); // disabled - CSimpleOptTempl & operator=(const CSimpleOptTempl &); // disabled - - SOCHAR PrepareArg(SOCHAR * a_pszString) const; - bool NextClumped(); - void ShuffleArg(int a_nStartIdx, int a_nCount); - int LookupOption(const SOCHAR * a_pszOption) const; - int CalcMatch(const SOCHAR *a_pszSource, const SOCHAR *a_pszTest) const; - - // Find the '=' character within a string. - inline SOCHAR * FindEquals(SOCHAR *s) const { - while (*s && *s != (SOCHAR)'=') ++s; - return *s ? s : NULL; - } - bool IsEqual(SOCHAR a_cLeft, SOCHAR a_cRight, int a_nArgType) const; - - inline void Copy(SOCHAR ** ppDst, SOCHAR ** ppSrc, int nCount) const { -#ifdef SO_MAX_ARGS - // keep our promise of no CLIB usage - while (nCount-- > 0) *ppDst++ = *ppSrc++; -#else - memcpy(ppDst, ppSrc, nCount * sizeof(SOCHAR*)); -#endif - } - -private: - const SOption * m_rgOptions; //!< pointer to options table - int m_nFlags; //!< flags - int m_nOptionIdx; //!< current argv option index - int m_nOptionId; //!< id of current option (-1 = invalid) - int m_nNextOption; //!< index of next option - int m_nLastArg; //!< last argument, after this are files - int m_argc; //!< argc to process - SOCHAR ** m_argv; //!< argv - const SOCHAR * m_pszOptionText; //!< curr option text, e.g. "-f" - SOCHAR * m_pszOptionArg; //!< curr option arg, e.g. "c:\file.txt" - SOCHAR * m_pszClump; //!< clumped single character options - SOCHAR m_szShort[3]; //!< temp for clump and combined args - ESOError m_nLastError; //!< error status from the last call - SOCHAR ** m_rgShuffleBuf; //!< shuffle buffer for large argc -}; - -// --------------------------------------------------------------------------- -// IMPLEMENTATION -// --------------------------------------------------------------------------- - -template -bool -CSimpleOptTempl::Init( - int a_argc, - SOCHAR * a_argv[], - const SOption * a_rgOptions, - int a_nFlags - ) -{ - m_argc = a_argc; - m_nLastArg = a_argc; - m_argv = a_argv; - m_rgOptions = a_rgOptions; - m_nLastError = SO_SUCCESS; - m_nOptionIdx = 0; - m_nOptionId = -1; - m_pszOptionText = NULL; - m_pszOptionArg = NULL; - m_nNextOption = (a_nFlags & SO_O_USEALL) ? 0 : 1; - m_szShort[0] = (SOCHAR)'-'; - m_szShort[2] = (SOCHAR)'\0'; - m_nFlags = a_nFlags; - m_pszClump = NULL; - -#ifdef SO_MAX_ARGS - if (m_argc > SO_MAX_ARGS) { - m_nLastError = SO_ARG_INVALID_DATA; - m_nLastArg = 0; - return false; - } -#else - if (m_rgShuffleBuf) { - free(m_rgShuffleBuf); - } - if (m_argc > SO_STATICBUF) { - m_rgShuffleBuf = (SOCHAR**) malloc(sizeof(SOCHAR*) * m_argc); - if (!m_rgShuffleBuf) { - return false; - } - } -#endif - - return true; -} - -template -bool -CSimpleOptTempl::Next() -{ -#ifdef SO_MAX_ARGS - if (m_argc > SO_MAX_ARGS) { - SO_ASSERT(!"Too many args! Check the return value of Init()!"); - return false; - } -#endif - - // process a clumped option string if appropriate - if (m_pszClump && *m_pszClump) { - // silently discard invalid clumped option - bool bIsValid = NextClumped(); - while (*m_pszClump && !bIsValid && HasFlag(SO_O_NOERR)) { - bIsValid = NextClumped(); - } - - // return this option if valid or we are returning errors - if (bIsValid || !HasFlag(SO_O_NOERR)) { - return true; - } - } - SO_ASSERT(!m_pszClump || !*m_pszClump); - m_pszClump = NULL; - - // init for the next option - m_nOptionIdx = m_nNextOption; - m_nOptionId = -1; - m_pszOptionText = NULL; - m_pszOptionArg = NULL; - m_nLastError = SO_SUCCESS; - - // find the next option - SOCHAR cFirst; - int nTableIdx = -1; - int nOptIdx = m_nOptionIdx; - while (nTableIdx < 0 && nOptIdx < m_nLastArg) { - SOCHAR * pszArg = m_argv[nOptIdx]; - m_pszOptionArg = NULL; - - // find this option in the options table - cFirst = PrepareArg(pszArg); - if (pszArg[0] == (SOCHAR)'-') { - // find any combined argument string and remove equals sign - m_pszOptionArg = FindEquals(pszArg); - if (m_pszOptionArg) { - *m_pszOptionArg++ = (SOCHAR)'\0'; - } - } - nTableIdx = LookupOption(pszArg); - - // if we didn't find this option but if it is a short form - // option then we try the alternative forms - if (nTableIdx < 0 - && !m_pszOptionArg - && pszArg[0] == (SOCHAR)'-' - && pszArg[1] - && pszArg[1] != (SOCHAR)'-' - && pszArg[2]) - { - // test for a short-form with argument if appropriate - if (HasFlag(SO_O_SHORTARG)) { - m_szShort[1] = pszArg[1]; - int nIdx = LookupOption(m_szShort); - if (nIdx >= 0 - && (m_rgOptions[nIdx].nArgType == SO_REQ_CMB - || m_rgOptions[nIdx].nArgType == SO_OPT)) - { - m_pszOptionArg = &pszArg[2]; - pszArg = m_szShort; - nTableIdx = nIdx; - } - } - - // test for a clumped short-form option string and we didn't - // match on the short-form argument above - if (nTableIdx < 0 && HasFlag(SO_O_CLUMP)) { - m_pszClump = &pszArg[1]; - ++m_nNextOption; - if (nOptIdx > m_nOptionIdx) { - ShuffleArg(m_nOptionIdx, nOptIdx - m_nOptionIdx); - } - return Next(); - } - } - - // The option wasn't found. If it starts with a switch character - // and we are not suppressing errors for invalid options then it - // is reported as an error, otherwise it is data. - if (nTableIdx < 0) { - if (!HasFlag(SO_O_NOERR) && pszArg[0] == (SOCHAR)'-') { - m_pszOptionText = pszArg; - break; - } - - pszArg[0] = cFirst; - ++nOptIdx; - if (m_pszOptionArg) { - *(--m_pszOptionArg) = (SOCHAR)'='; - } - } - } - - // end of options - if (nOptIdx >= m_nLastArg) { - if (nOptIdx > m_nOptionIdx) { - ShuffleArg(m_nOptionIdx, nOptIdx - m_nOptionIdx); - } - return false; - } - ++m_nNextOption; - - // get the option id - ESOArgType nArgType = SO_NONE; - if (nTableIdx < 0) { - m_nLastError = (ESOError) nTableIdx; // error code - } - else { - m_nOptionId = m_rgOptions[nTableIdx].nId; - m_pszOptionText = m_rgOptions[nTableIdx].pszArg; - - // ensure that the arg type is valid - nArgType = m_rgOptions[nTableIdx].nArgType; - switch (nArgType) { - case SO_NONE: - if (m_pszOptionArg) { - m_nLastError = SO_ARG_INVALID; - } - break; - - case SO_REQ_SEP: - if (m_pszOptionArg) { - // they wanted separate args, but we got a combined one, - // unless we are pedantic, just accept it. - if (HasFlag(SO_O_PEDANTIC)) { - m_nLastError = SO_ARG_INVALID_TYPE; - } - } - // more processing after we shuffle - break; - - case SO_REQ_CMB: - if (!m_pszOptionArg) { - m_nLastError = SO_ARG_MISSING; - } - break; - - case SO_OPT: - // nothing to do - break; - - case SO_MULTI: - // nothing to do. Caller must now check for valid arguments - // using GetMultiArg() - break; - } - } - - // shuffle the files out of the way - if (nOptIdx > m_nOptionIdx) { - ShuffleArg(m_nOptionIdx, nOptIdx - m_nOptionIdx); - } - - // we need to return the separate arg if required, just re-use the - // multi-arg code because it all does the same thing - if ( nArgType == SO_REQ_SEP - && !m_pszOptionArg - && m_nLastError == SO_SUCCESS) - { - SOCHAR ** ppArgs = MultiArg(1); - if (ppArgs) { - m_pszOptionArg = *ppArgs; - } - } - - return true; -} - -template -void -CSimpleOptTempl::Stop() -{ - if (m_nNextOption < m_nLastArg) { - ShuffleArg(m_nNextOption, m_nLastArg - m_nNextOption); - } -} - -template -SOCHAR -CSimpleOptTempl::PrepareArg( - SOCHAR * a_pszString - ) const -{ -#ifdef _WIN32 - // On Windows we can accept the forward slash as a single character - // option delimiter, but it cannot replace the '-' option used to - // denote stdin. On Un*x paths may start with slash so it may not - // be used to start an option. - if (!HasFlag(SO_O_NOSLASH) - && a_pszString[0] == (SOCHAR)'/' - && a_pszString[1] - && a_pszString[1] != (SOCHAR)'-') - { - a_pszString[0] = (SOCHAR)'-'; - return (SOCHAR)'/'; - } -#endif - return a_pszString[0]; -} - -template -bool -CSimpleOptTempl::NextClumped() -{ - // prepare for the next clumped option - m_szShort[1] = *m_pszClump++; - m_nOptionId = -1; - m_pszOptionText = NULL; - m_pszOptionArg = NULL; - m_nLastError = SO_SUCCESS; - - // lookup this option, ensure that we are using exact matching - int nSavedFlags = m_nFlags; - m_nFlags = SO_O_EXACT; - int nTableIdx = LookupOption(m_szShort); - m_nFlags = nSavedFlags; - - // unknown option - if (nTableIdx < 0) { - m_nLastError = (ESOError) nTableIdx; // error code - return false; - } - - // valid option - m_pszOptionText = m_rgOptions[nTableIdx].pszArg; - ESOArgType nArgType = m_rgOptions[nTableIdx].nArgType; - if (nArgType == SO_NONE) { - m_nOptionId = m_rgOptions[nTableIdx].nId; - return true; - } - - if (nArgType == SO_REQ_CMB && *m_pszClump) { - m_nOptionId = m_rgOptions[nTableIdx].nId; - m_pszOptionArg = m_pszClump; - while (*m_pszClump) ++m_pszClump; // must point to an empty string - return true; - } - - // invalid option as it requires an argument - m_nLastError = SO_ARG_MISSING; - return true; -} - -// Shuffle arguments to the end of the argv array. -// -// For example: -// argv[] = { "0", "1", "2", "3", "4", "5", "6", "7", "8" }; -// -// ShuffleArg(1, 1) = { "0", "2", "3", "4", "5", "6", "7", "8", "1" }; -// ShuffleArg(5, 2) = { "0", "1", "2", "3", "4", "7", "8", "5", "6" }; -// ShuffleArg(2, 4) = { "0", "1", "6", "7", "8", "2", "3", "4", "5" }; -template -void -CSimpleOptTempl::ShuffleArg( - int a_nStartIdx, - int a_nCount - ) -{ - SOCHAR * staticBuf[SO_STATICBUF]; - SOCHAR ** buf = m_rgShuffleBuf ? m_rgShuffleBuf : staticBuf; - int nTail = m_argc - a_nStartIdx - a_nCount; - - // make a copy of the elements to be moved - Copy(buf, m_argv + a_nStartIdx, a_nCount); - - // move the tail down - Copy(m_argv + a_nStartIdx, m_argv + a_nStartIdx + a_nCount, nTail); - - // append the moved elements to the tail - Copy(m_argv + a_nStartIdx + nTail, buf, a_nCount); - - // update the index of the last unshuffled arg - m_nLastArg -= a_nCount; -} - -// match on the long format strings. partial matches will be -// accepted only if that feature is enabled. -template -int -CSimpleOptTempl::LookupOption( - const SOCHAR * a_pszOption - ) const -{ - int nBestMatch = -1; // index of best match so far - int nBestMatchLen = 0; // matching characters of best match - int nLastMatchLen = 0; // matching characters of last best match - - for (int n = 0; m_rgOptions[n].nId >= 0; ++n) { - // the option table must use hyphens as the option character, - // the slash character is converted to a hyphen for testing. - SO_ASSERT(m_rgOptions[n].pszArg[0] != (SOCHAR)'/'); - - int nMatchLen = CalcMatch(m_rgOptions[n].pszArg, a_pszOption); - if (nMatchLen == -1) { - return n; - } - if (nMatchLen > 0 && nMatchLen >= nBestMatchLen) { - nLastMatchLen = nBestMatchLen; - nBestMatchLen = nMatchLen; - nBestMatch = n; - } - } - - // only partial matches or no match gets to here, ensure that we - // don't return a partial match unless it is a clear winner - if (HasFlag(SO_O_EXACT) || nBestMatch == -1) { - return SO_OPT_INVALID; - } - return (nBestMatchLen > nLastMatchLen) ? nBestMatch : SO_OPT_MULTIPLE; -} - -// calculate the number of characters that match (case-sensitive) -// 0 = no match, > 0 == number of characters, -1 == perfect match -template -int -CSimpleOptTempl::CalcMatch( - const SOCHAR * a_pszSource, - const SOCHAR * a_pszTest - ) const -{ - if (!a_pszSource || !a_pszTest) { - return 0; - } - - // determine the argument type - int nArgType = SO_O_ICASE_LONG; - if (a_pszSource[0] != '-') { - nArgType = SO_O_ICASE_WORD; - } - else if (a_pszSource[1] != '-' && !a_pszSource[2]) { - nArgType = SO_O_ICASE_SHORT; - } - - // match and skip leading hyphens - while (*a_pszSource == (SOCHAR)'-' && *a_pszSource == *a_pszTest) { - ++a_pszSource; - ++a_pszTest; - } - if (*a_pszSource == (SOCHAR)'-' || *a_pszTest == (SOCHAR)'-') { - return 0; - } - - // find matching number of characters in the strings - int nLen = 0; - while (*a_pszSource && IsEqual(*a_pszSource, *a_pszTest, nArgType)) { - ++a_pszSource; - ++a_pszTest; - ++nLen; - } - - // if we have exhausted the source... - if (!*a_pszSource) { - // and the test strings, then it's a perfect match - if (!*a_pszTest) { - return -1; - } - - // otherwise the match failed as the test is longer than - // the source. i.e. "--mant" will not match the option "--man". - return 0; - } - - // if we haven't exhausted the test string then it is not a match - // i.e. "--mantle" will not best-fit match to "--mandate" at all. - if (*a_pszTest) { - return 0; - } - - // partial match to the current length of the test string - return nLen; -} - -template -bool -CSimpleOptTempl::IsEqual( - SOCHAR a_cLeft, - SOCHAR a_cRight, - int a_nArgType - ) const -{ - // if this matches then we are doing case-insensitive matching - if (m_nFlags & a_nArgType) { - if (a_cLeft >= 'A' && a_cLeft <= 'Z') a_cLeft += 'a' - 'A'; - if (a_cRight >= 'A' && a_cRight <= 'Z') a_cRight += 'a' - 'A'; - } - return a_cLeft == a_cRight; -} - -// calculate the number of characters that match (case-sensitive) -// 0 = no match, > 0 == number of characters, -1 == perfect match -template -SOCHAR ** -CSimpleOptTempl::MultiArg( - int a_nCount - ) -{ - // ensure we have enough arguments - if (m_nNextOption + a_nCount > m_nLastArg) { - m_nLastError = SO_ARG_MISSING; - return NULL; - } - - // our argument array - SOCHAR ** rgpszArg = &m_argv[m_nNextOption]; - - // Ensure that each of the following don't start with an switch character. - // Only make this check if we are returning errors for unknown arguments. - if (!HasFlag(SO_O_NOERR)) { - for (int n = 0; n < a_nCount; ++n) { - SOCHAR ch = PrepareArg(rgpszArg[n]); - if (rgpszArg[n][0] == (SOCHAR)'-') { - rgpszArg[n][0] = ch; - m_nLastError = SO_ARG_INVALID_DATA; - return NULL; - } - rgpszArg[n][0] = ch; - } - } - - // all good - m_nNextOption += a_nCount; - return rgpszArg; -} - - -// --------------------------------------------------------------------------- -// TYPE DEFINITIONS -// --------------------------------------------------------------------------- - -/*! @brief ASCII/MBCS version of CSimpleOpt */ -typedef CSimpleOptTempl CSimpleOptA; - -/*! @brief wchar_t version of CSimpleOpt */ -typedef CSimpleOptTempl CSimpleOptW; - -#if defined(_UNICODE) -/*! @brief TCHAR version dependent on if _UNICODE is defined */ -# define CSimpleOpt CSimpleOptW -#else -/*! @brief TCHAR version dependent on if _UNICODE is defined */ -# define CSimpleOpt CSimpleOptA -#endif - -/* end SimpleOpt.h */ - - -void -OptionParser::add_option -( - const string& option, - const string& help, - bool require_argument -) -{ - options.add( option, help, require_argument ); -} - -void OptionParser::add_option( const string& option, bool require_argument ) -{ - options.add( option, string(), require_argument ); -} - -void OptionParser::add_option( const Option& option ) -{ - options.add( option ); -} - -void OptionParser::add_options( const Options& options ) -{ - this->options.add( options ); -} - -void -OptionParser::parse_args -( - int argc, - char** argv, - vector& out_parsed_options, - vector& out_positional_arguments -) -{ - vector simpleopt_options; - - for - ( - vector

A=ILG@l 0ZW aψ7r&cr  -Sz p{ -E^5zOaz\PC l]P9$箥aonbbcV$^[ܬ/64ǭ[-lpߕqS/t!^%83ɗgV8[V0?y2/f59`; u9mJ. 8Ֆ}W}a)wB `69=,rd2 ZUTyM.S+)| X!5,uAt;!yp_8>0pBb[-R}XEC%_Ck!if)^M[:VfHuQĢXKaG=rebMqP kv -ӠC',X3),M{Q]0pk.`8FlGhG^ [qYGn"p`vn gvGUP^{ힼ '[T -61] }Ik MƵa -2 -K?n‘ VCahh)rl; 9fE*X10d W5װ)M~bߌ2m0_: Lj9DĆd(Sl#f =n[:q0Q +葱6RJ{ "[BD5vSoߟ}>roV7y} W9K:ed_[+`2Xp sꇁ5g0dj`1)?$˹3PTlHXPc#l`P=uN3` +*b<F5!tkbU.b9T{-^ȋN^}Wr'%_K+<_?p1?P6VP[|~C^rF/Yx_x9}?Cb/"/6Z*QߙK/(HO^28|dq, 5BIȋmktjn~!eWWgU4xM񽨄&0S\FX+r^n=$L8DL -ll+'%`US|f_s]_:iO^'0={.#c_ɒ!K_}Z&vkk,4"(ڢ5qm>_mJZtj'i8*0t1.DZQYI08{85%{}xxdY|5- &X1BoJuQčpZǍq0s1oM*s%D#aVhTW^+=y}"jqƄ5O|9&Z5h-r`؊_l5 5ضԵ->XUغj{J'XqE7 X*RZ%:G=E -E˫̫ Y;EO`:RVWXkJ+IT]~gӓvy -kQ%l4a#k'WRk^ƞ4ss `24;z'HrC94ۀ#cc/cce7dG1vi̽G6ӁآskQ^t l@+kՒXKnQ]¯f~޲6h3;&yjƮhC[1]-ҖShՙū'yʑ좋[ߴ1PǮMceyʬ\nuIW6+ -Raֿ?rx{ѯÔ ^WcjL1 N Md*|>lFgNq(^E2Np^WofPR**||8pU* iT.<]C* %VJ~+jYN0FY;VwݒkҚIKi6%d}yk^t&Ýe}qrQ[0j–TQb5gR! %<[~SV'_U7Eq;cb~|~Є% l'/zH /Wɸ]jqU\E`DZ\ JH6rP#Ulf`#;/L$9rRر0w.sM? L_v:D^89JK+d€\,_>+})|2ɷc -^-)o>'/-=:w^S9Sb'okuΌ{-!?/q֥x]:՛q'fSH\尫Tዻ1 fs*Fm;-nFnښlx\x-iMN \5K:5i\ *,4:D-_AoªKfikPA[}+mahk׮N2^_VVQ䄓m'>>`%.LtUL꿸jz: -N)cb,V Z=uْbӼ'\q*+6}' ֹn]q w^YEרԀ/,ݣ, rq>۸vY444j d5OV.Um[դ-#U5 P9Kr2䞱3UUeѸ2ֺ{ש=Ui(6RU.XkLPpyW,,9E֨Gk7j)+Hq,}ɚnDjZ9MB[F7IJk8? 9kކ W%o⪎Ch]\{$.W)}׸)LZz5>^^Gv˪Ukf\aKx5k jռ8W-'™lEIt= ?p-lVU,ϏPX@a/H{F pvk$0fv]M#=]l[_H += ői*iS5wŖgy Wc`"ʩt?N`:bËq 6S@,I D9HE9^r<\{ -k,t[ LXz qkHe5tԵCE4ӿ-a#)A -N`Eᘵ֦ۈ l?T r;Գ0f? -nm:3xGUŚ<$iU<&EXg63X`y1zX]{f沱1 kMcc5c[K3m%+Ƹ4֏oAC`N#'`j0~|~Ȑ 0,Xs\~16Nxrb"VGk@c~geWĪk6Co[Hڔ0G câWLa],b xʹ6Ol5o -BV `n7/k vpьa!^sWKj}ؚUq- FM?7T5 *d?V;[O7ʹ"ؚigi[Ikui[ՉK8a%1ό`LuduBHZqڪ+WQUwX%U d_AYSE -t>WkX7@/CVgn pCX\m=>UT˜hU [G"Vg .^"'Bc5-veIbʼƖMU{, -6^\("| b鋂[tۭ {hB*+Fs`a~p0쫯-_;}iфsɋ?+X_'ԥs9T}1XԘg1>??~S gGy/xd+.ç-t)T\j"lX5*'$R+seaCRY[ֳ]-kXrZeZqa{CFqF -ƣzvZ{\WE,7r "y_(Hj~O,ڥ*jSܶ8%s |*Hn4t0ms#MFZ޺4uao}z+4%| E3TlWn~v6G뎿,/SoNb.e6eupujyQ&}߀#5Fun߸}` - -X6CxΥ$e+/U->F`^ul>|16-C< A̧ȯ<'-?fxb9+ur`I.^Ig+CJEW[An 8|LQd{bZ&rn{~~\2cud1Ab3-ϰ1曙n8c>Ӆi`*-!91 !#rn4RC# YFsī ;oG <'[Dމ̧pd:ybsgX1Qḅb^vpZ<:D=]2 >E"tբ0ǫsX׸JaV8l+ؕPpq,X"DNCa! dbZk!0U[ء8.nLm?tahC†C- ;e79T:dBM[!rs !6;TdD2 DrAN>3O9U쁸5Ps -bGŐ'e|;!!n!DuTk~EqE'Q!f!>q$o$z}-q($-4vC|{iy(5N9)Y*"+)"w6%q[".$rؠ3FJ\)?)K"6=%B%q"aDD!֓ :) S;m+1 s RSm ۯf`"3A:24{< a8FSG'X1~_h㌪1 "$aMbA$8}t'KX\9Z `%p8p.yr!T -5̧"8}E6w\AV%Ȱ*aQ`Xey8cU-m9L9lUyu2;Z _I[&ֺnKPμK/p(ao^? !r9D-=Ӡds*054w>*f1av7KvE&ƄfI5az8zP]tCiQ8'VB\RqW -{Qa3lJBB0Sѻ?ATV uCً`ϫ(3 [ FF/ }Smxh_W`C,;CkU/GSKkhn {B4Bf tsb?PpJS -W9p1bTk.)*?c(dc -0^)UlWWe ^7enb[5tO_slS0 7_Uj /BJ-}jl^_7_lIj&g`E/}Oo4Zi -vTƇTX,[w,(YdB.`~/WZ&mTHX>G^ĸM$VMXY&#,bqWH 8.ӣPb"6k#_S#xͲκ&?6/T)^$@;Nkk슗76~n@+St@.ZuVg޸a{up͹?q%rjYY___ -/җUutځS*\.>8`YY# -b#ObQ\C3vW8L&\hz\'/BEy"ZU?Vjšwx,ў1`}ZIRۍ2…jXmzz;%+` ,u] AqZ3 N -RvƺQqo -Skްg#v)ZeϯK d -~87s!TЬw*20"60ٔ!`cnk -.,[_=27kF;樏=mN 8WnW_/-U\g+;K7Q^Ul,wklu>.7#?^}ydƛd,^ şz9"f.<}qS 35qD/֫@p$f y|MgRLŸs~Uxr;˼cGJ46eC%5oO]ER:7nc]ݏiqF^4\a^\?v>>!` UiVdbFI}DF6}(ڮ|[ -6%k @Tj=-,,xC9^]4|q5G{ ;'er8گNaiac}+ĊXGbT^Vq5GHc84~q x0B&VfP71q3 -c)! ڥbexRޟ}bW,wy_-E_+^p|m<)axVbg\GبUڙs:\" ph%`k LSH|` 4A1έ+)?jxËMŞ -__kX[񥄵ȋ -5TwE+3(|טv^y{޾c{5x1Bc - ] -k0dld"Koq  4pK=fMl-v/>i1p?EqlvŖdԲZ&7NqneW7.qtvWߦRtlM_Pǐ7ܥն3R(yp3R,~2O{޶g{hA_Z`ԗDEC%VPJ[6cc#XcXNO1 dGjK& G[ t/찄4!`.^biq :Eۭi`E< (iwX;zE=z##.aU/mX' -K -`xݽI +bc#nG&.a[FL}ցah%] {4W2+[@?+_q|"_p'"<})`Cqk׊/( w% 0lnO -Sq;@r+38BXr&yoa{?.` X l t >.!0[(e,s&cPⷊJzC3N1T`&僤82" );Υ<-^kh+ kAʚ W-|Y+e -k^3./Skz5VXx#U ҷt@'U%k6M+%+Ɠg%kā~n>da# DU3c$j%UVwj>_&eu-U#r{djfP -̤.譚=fuf)](w5 -o<3+ז 3)yi F^kaW@n:ԅ]qWsjjuiQȨ uaGK2t@)jLgðHJ82>po(ZqRk޴_0cָ?VCyq(^ϭ{†'#M׈v)g]Ա - __Xf-_(Pu'jG._r_QΓ-Z8 ]+щi4Z~}WVѴ5 "ZY!ARW_S5էxMձE𶋋0 -D~q\rQ#0mZ5;q(`i&`>޻7>OƐ:f XqȀNk,:j&t0d}[R bJ7̒렍 0q&}ũg+kW` -[RnsLKdyLmЅ]M1kt5Oȫ?L21}-5;_y}TϪ:I_W=n@,N]|eT5}87P.moZ,_Z|Ctսud ǕjZR XUw,Xe]ǕMG(p5]uv{j1AB֨YޮAZ=J^eCEi>@~hǵ\\)^KTie P6m.thP :Zgtyo^س1㧯r*?@Uڡ}v-w -˨U#S=q963]W1->k0sWlz^Q;&qĖx[$q tű崅{ !VIs̋KRbkdCZhUR-IJeyV ٓ)V+w1N\׀PCcaM.!d,{P%¾~n#l} zTELbo_VQ8BQ~KWoK䲴s0 kv .S-NִYiS {krٲkkNqM2{p<#Rwd4C8zOqK3L]^\P2;kWWq° ^,Fn8 .V<4ڙ -W}Qv}@55~l[װcPzkVClTu u#UV}t?ẗ -RVc M8p$<֩ "S#\v)һV #pDKLEY_~|!ך: i\kTOgJl -_k+A/RqƩ`jg3  C{σkybQPM j#p}K:Up-a0seC=0 n~s8@ a[==[R=zcTŦ/M92◞bi"ZyW* g-_(6:  } /'Ø ._^ :髃.~j9薂N-+}FwLD-_,h7 [<'VjlmWWo_Xǿ0V-l!̧a~ -wY}SXZ+c˫qvg4}<(lbFk|4591#ȇ,vbKXѰXr cx:ʍz^_i$c\;.`j=H W+bW?k@,ufS! a)bBWpn(]c_ u\'UC|j}Oz>4 l%IJUp~iZ{=m\:VKiMHnejZVډ_=PB.> ЅƥqIǺ !ۺf*YՖpuq=崵Xf=yl]fz!3#wRz|8 _0`Z8kZUQI <.2eTW6J9LZ=  endstream endobj 10 0 obj<>stream -HlQ$= z'"BsS5sFꩤSW˯ޮi^ױDmFD\۫u05sa__ky]_%f߿?~~eVW:nx9+{/?_?kr-1ʁ."# ˰=SqnYrQc˰vIJg]7\3db͛#ֺ}5ê[Îbm9.q7:m`1`W6q67B 0lB Akk3f`wkF{5Fh:cǕة>?ƾcĽ3SЭ% Q 1^1Eݧ"^#OYHlx m6Ex|>qKt{qq-~Cc'ېN)FR¿6|ڱ !`C `a풰% .b17El)bsHl2oX"懘F,bf 1".@YČbYVo{'%w=');Bqr|0=lTa-8UaϏ[$p#l|q0%I"aE^|2א1Kׁ<]2Ec=EDb.b; /D5fkY~UĐ0E Sc#>N#t$bV7112{ X[һO51c)~ 9"јX`&bnd+̬%HsBlq۶Z lJN`&˗/ 2O7-_c`̱ 61*bECˏ/_kFcK^͋22NOϛW -Zu„>.^ު*xeT^5'YR=y1dbg[EįݤKnak$^1+ 1QS!xE -8y(^XkWYXX3-_*{)`LوSf JIK\JX.sF:CccQ(a=5&`-OƜ`2,`U"bMv+mF bU keU6oNW_ŐyS3ua_ uJ"2{b"-dz~Wcsʮs% #y!$Yy<٪mC\_t]{YmWQc:<]pl%Sښ`+HEFڷ-WsXdPx|ÑJ}h00e"yp zb_M\l++m宴uX֎ո>([6氕,@-+qE'l=y1fѭȫc2LΘ^e?}~"b8܇DZo\ix1Xxz9,۵u<B--FJhnsV%lIceƦ!2Gb%lj@跰KXa:;\oaҔ:$,*}G_x0bqV 7`F C|Gº*-<36s}&Ƃo|!(Ϗ[k.{g -Z\ +g^ʗɗ[b*x_Za.hŌkj]o`YOPۯ??n:\|־1v7ʘVS֑\蕴q$8wv2G~YcD,+2V=ob"fv&[k<"!fob'$6L°GXy*YF0QG{ex UyB_ cEa3~#mYU031% |PYb XIObyN^۫G{SocusA11aZrs1rA#z7)}=u6COB -2ՊռU~w(bq$C,fba'E|ʜBfwLi*d{=F>O?eqI9p2y1U-H`ڒs>X$!F9&wH%1{3D64\E>,EA!{KaM+KRdvzl6;RP_"k_DNL ?\w<'g)VFmuhIW<6r[!lʸy2nw@v;3J.Tm걌B5<{vCxMʂs]H;e5e0aQB%͇r4GaHvٻ=eR+}dZ^oBT4^{-,ByѳmEX"5měw/ffK3Wi/1"ͰX> [H#j݆#Q"6IQ5臏?H7\dFn|3{ݸV:g4WD,Y߸:X:P0oD#i@x% !Q5Q=x,H6|ؑ~gwxb2A ڛ7p63 -kuLU^G*R9FK Ŏk6h_loFX %,%e -{+AL鸢FG!>WSb>P%#xⰏW_*mc,"Bӯ;"B)v; -ƖF6qx{0xC*>LTȋc|I BHP5`"<^ē|!$[ěĝĚh3x}{*eґZ*!OIcz'UAjfOO m-~zS#ήlEURkoSGj%J:He;uʃ+\1jvN*̯:vc+ ɑlV Xo_*,MIwףhݪ[}Q{ss1{:ȪO` ]N-.=|)1dU,ƴ:LYE.]^"Ҭ!a4Ui9*f 4ԆRǴ&2cuf"TV;;v8H\!#]5|ax25S>)!!qZ -ws(2kHiڮ<0Dx]Ue%)+)JgBG9Ŗ!`wmqQK">t{ bJ.ۻ K4\؞Ք=E"K -?Mmp=Qk)EU| XۏMyiVQ\6ϸŕvezU :ՆxݰT/Vؘ nA]u'[ $C18D9]=]!'1-:N"PىgTICGw kv5Jۚ5IQ|^7xV_s{SJ5N'<&'7QkS-࡚oooϵMz]a!ޜ,}bGV_T϶KP#v4Dw"q1xN۹q?`iKV?կ x=!% -IvWSϜXAKݧvi$Z-OEĤ;ًmNhb+^DŽN>^ْ:c'1˓sb4PM^kփ\Scꇜ]5r7,sG/ h~Xg[ᅞܑbܵ&f:_?lJאAOh H}J;wm;ps|US.j}jF>xŎ;mx -x0UvUgkkk`,`9AwαVnxtb#9. AIQJDVֺ?UT0Ю#.N6+I87aUI.$zǣ}șf<:wՏtVr4aDMx,TjV+9k 7icI@|셋n2J%j_΢'raێRUҢ"3$N}ȏwu3yγJc_N-(|j;rz #F 낳Xf尿<[ɑŤ֮saj?^7o0I) -z Sx/.ULoIWBEogG#WF,K7#bz b4fu -iuA;6Rm?b-8wPRۀ7z2 ~ݕ;š(+N^n]ݦq7M=; Ekvu/S+z/pmn' w}i&BߴFk>5%e >.+YeY9[koTP|iw \H8ɥj?V'ۗlgi%e%nㄲ/3ј8@P %09AIbXqۑ-6]o*׬Z FryIpqj0RiYjXD eyru]g DjĄx,͒ ff3/% FwX -K&?9|k~ywthklp9qZҰ\Ev9G\\.v51o~Wh6pŏPB0zӨvpB{{ocBv  m Y&Q.sq՜FJ -9҉ Me &펕aK"RM? 6+>Y)q^l?Dx'VVEl\8cn -Z=$zI<cg탦vyމ%r> 0 8'uh.`aNRC^`\G (Y'^lcky'vކv$%R -NÎmi'\ԍYt- 7ϣc>p18N6|3JܹT\I. -Ľ WF\"m3ݱs`^Lw ҂`=c?ZYIo,EݰqAX/ʊ ^ɜvBD6"w} 5k@Pl@q;>#})FԘE׌f?LsW0؝W:HL:VXMЭo >K;A j -;,|kk+(5\n2%G=˞W~՜ *zu-N79v |3^օZrJ(RHKKْh 6"s,% -5C>nc -y.HaTAdrh (,97_`pG8SnHXޫ&i #~g!;Ub&/ZN˟w9Nӻ8ڜ^g^ˠF2lMJZe&&-L2ʇws轀D$or2iha:Wk%"\t_12jnu ơ+M/2:+tiO̝YLbc{PQQ2dvTGhVM?'ULHiDx͗ (2r0Nӧ)R\)>OfF9:~<ל9¿Ox2h!!1X0~"ʻvhα fdt&*VМ+\/+c=W~ClrE7&w0 WѤU29G>vVVtc}l; -7kљM#k+3g D"=0CEmasWGJk}:LPcӲ]_DDɞD,;{+Vs3QuOspy'Ӳ)-w*jZ-T UI\C )[o9=׀wydD<\:;BIl{`QȇmwT΍>9Q+' -4Ah,Ac?olǵ>V&Mv&>$X' -|ŏz[%i>p"{Ҽ2ɪ>!:m=r>u(&\f#K&<4ŏ:574;gr"jc ӣ -X ay𹷎IS4jN^L{>nj~Ţ&XƂdln^%lۥ#/9)v9ƹ۽Vgs>-x Bg%=N^z1JH!^RwW]mI_FKO_9}ֳK'WYMU/`  -F&;gPH@+9-5C,nU -&ҧ7~2f­BB:4usrZ܎[G8^S&/&o6|Eu81;Q{)#EҫX6CNmҩy'|>ܗh+_|tgvj|={uR^mǛ}RcڥNs0C1;3f9~js^c8+|7wҮynw&g;lj_D?.bwlnwk_g訣0p*̭O!E'\-D|-l6 -z/WLSZmnn?8h~ஔ8ov4 ?'TӌwB饥8:|x@:o"ǣ9_5ں͚Lf5t6a0kc+#k4tO۪Nz_xżg̍kZi>/Ko6SZ'Rgc!K{#>mpz4)ڨ/JEΥ[hĝ];;0iLğFKsdxcQh -^z]DD*LZM7Ӥ:j2W}.O ذ+CaPgʚ]XV O9*;~}RKKvƦm-|IJ,|ӳFRɈNmbsn"gy]:(5ˀĈ `m};mW-¹'! |)mB"%[~&Ҡzͽ6q.d!rӸ?Z\j񸻰.ׇǺ- x+_c?.2Rᒝ`MۼzuVn{y= 3`<$Gr z@sW& C*g087 5pI:qTř[U!T(B詅( -8êrd֜YBα&vM<=EđqnEbSW<GDoLI/6c<޴fژD"2>'`V8tCAuwEf;M 7?_:>5)96q\t*jf,qNw.z%#FN^;oDGoTd'k9VLA&C`dYXK[=">$33;~ aҪ!w??!rݥ404ܲn !C-튌P !T-D? Y~.õ[XqƟT>!i-Ѳ("%h:E(*"Wl.{yh(n= '@pLl `JqpeBC-OqD*Fn>=|:e Ky8tj Z2ڙ+`f|W9_Iu؉m^=n`+KǝdAB ڴynl'v Mi]e,h(v~Cu0J͜b"?? -Ubg /[Kv]C|x @--E"TG$;O.ٞzuٗ3{B|}Iw(mށed1WSq -n7ыKDz*|673+Ot --U_ƅ.ͽ68bv찟z 7}K5Go wީn=cks(+cmTu;qXOx0L/ҽL3Mu'/7A|"lX]Q͓s4,Lj2P >!zp&=<_unv&l,O}8-qC9c#5zߔ$ru_\&w!m">&w2 Sii`m-i0E]Ɩe,4! k&`xp>G9n]5kڂW1-mYfIox}+,E+-  -u>ra02*1Gb[qD6V>hAm;_Mcg 7o87>kg]WJLz|:/zK%?ֽ󃝃+Fw1šprݦ@KbGi&ܬ~2˶O3o\7Mh3.p\l}7eI8jÝ -]HXt4x W~٢5VyB|ҩCkۖ:y u2*|[d"V_OwLɹ*@C'B"~'eTq}"u!6 V?뙠D"b.$΢d!`T5"#+M>Bgf>ZnU3- P ngvam% ;`P``d},{zTȳDc{9A 6M|ezL2U-{u݂15 0ؾR}2@2?W4ڭ>o'yQ}( -aG6PoLJkst'|Pb^/HؿAڷ$\AUzCʋb7ka2`0Oa%wΆ`_PS,?;rbq _?L1Q{5^9==;3lN N ~NŶ/z!>Il~QMc#n|o%Y|y><јԠH?w,-۱Xb!TKB e{CV8ɹ*@Á>-a -*kH\-"  bz m7 ..+&@lLO&MĺvNiH3) Q\׃}2YE3?:AK+^:nʂcVCy6Ql5݉=|w|[D(Hqk|{+Y;u՞[Xn? -g쿙>w·g6tkag5MDpv7`eGv2AwgN40?_c df-jn yW+a~=]W~)geP -?`3Z!8݀Pp&(1ِjHpUo/\l Ӏ(ETh_y N4 8R"8!*wX?} &q ۽њJ4!¥AA6H -a9u6'l1gHPg{!,}# Dfhnv`Ygբ᝝"+n1Ba]E@ƏLZ *{.bgsL:_?SK+#G_ AW}ZW -d!0;)ybE݁#NGkPd,M㦨7oňUC{?["{E|/ЅOu۩)|}: $'#__6}s_cۚ#w'C~YK;nw*8XEoGPH O9.R @ls/ endstream endobj 11 0 obj<>stream -HlA$ EOPw TZHJYm`loIFEde"E>_~{>OiÚmu`cuϏv?d?vp,cǐq{̶;cꣷCC?>~Qף:~49j[%'xQo~C\pFt,v >!@1I,þ?6;#/+>K1阁!Ac r|̏_Wx fQ ko{`6mJMknH͝|OwR}mq8Ă.|{jz\c'7-~Z~cG/~Xci'H+? H/̠?dž:'/«`>Id"Kl͍SBdl9 D zoJEFzl$ptGf"ӟlƀd8y-!;_z,x< )7y[f:bCg䏀'Ug5Z}ĸ--bMlcK29hcjɮͶ$;S76cFԞ/6 կ=wX%1~$< -_c+ $>V.ϐ7wˉoVV|d%ko60q?'97waһNYb[pϷ) IDR Wߦx4Cz7xޘR(t oBE93MHBNt _c$$qU] L U;fVڣ^/]Ʀ Df%> j+r%jǷ|;C@p\ACcl솄 hbSz[*#>r -# zGߠ4}nNqfA\YY1deMNrfIbt91C?-4lј [zeݑי[-u9Ix@-n!a@ z. z{7_<%N -fPד^B6?- ͧ2O2j#z Uħ#` JRW[35p<1yk߅oMlV7pS 4.fXgr1V8e p~ǤI~F|6Sh~ ٠`^eo%i'={ -h~jMzG»'/«`A _IlQ`n ҙd= {\FuP.ib,4ьge~ _.xa\m/P K7iѝqH<z*+w|aHpaW$zf+#!ˋ96!ͧ7k O[*aGznQ;Ƹn oYWgE >Y[,)/ k裸s 6Z{U5&p-5\+Šu (_/шNS2?&$A#&+Kj>$S_l/[珓ДO{U6 'CkoGOo'AjJ۽&@ҵ0q"3x$%[dBD:XwYFvhJڡ*{p :qB/Yr,Cct.-3;V#/9{zeX@{sKi.M_Z]^Fv;7ޅ,QǷ8 -0}RifuhN)~9[#zf~gtS?BN_/o߉j, 挍@~|lA{bDczKfiG0 N 8(՘|7#VPn[P .:Ύ uc"-HٹC BScd69m(1 _x.L_0ytXw5ToEi% ֽ3%M9g۶ˀ6is* er'P_ntD`(0c8EFC ;PMZ43<5y&t3k㙐(hu9:{'5ljEU\X#䬱FUjp5:} o)D -:49!cA W)>NOфWh#ùeRz]OGl s,!㬬%tzbzzÕ< uvvqnS@U}S325۩Y.-&h?BIfJY^^U - Y])=*FHsJ2vTHHw( S&!> -TϏ-Z_f ,y ^Ӂp1>fWDsi-H-exM qie&-q"-ee@G.Qkm\v]Q"bz\bM Uİb>`QN1-Le}sLfWGb#kӥwGC'1_'0 -h6BS>S:!{>?yP㛏^sB,.Z8#EbffĐ%Ӭ01W= ĬX8kmbN"ƒVnA{K!BMs1Ĝz)IH9.Fd7nf$ Lڗ4:7oLE4C9d: g2"T#d< 2j Oǎº 1L^^zvS x59HEĜ1C5#|C 1+9 L? $bREҒ %$(AMy%[T9 CIಇqY-sqY>v5~$≋Jkq`>ch5WE `v7-Zb u0-1*EAK9u#1\mr=Iue0,4񖘎nª$( -.K@]ZY*jZ<]Z]Ιϙ&.r- H\D3HG\EFTψ@$uRplO\xCPgްd,A)]_KDz؁dRej -xY~awGa,f/auUd7O_܍xĒO,#a_Uqe֦%|.*;R_D2R]yW^¼}\L 0QiS560P*Uk5,ȒdƓE4_Ý &NLEB8Et.1ZWLM23Tۏ3.2n/HdeL;Re,O{^fH}9n&d sF}M u赃XPNX0f L30$0& .ԓ J a$0r]0a^ck"~` 3O`| SRd7$c (cH00f~qJ1k Fd{m"Ý"f$jginH{˛9%1kŒD\nAėj͵I Bƌ Juu2_fhbk@f$323̴&3;R=6vF0S)}̴lK?dFpKY:Ob0f@BB |>{ KFb -sČRKc(*p:1"h4TMw%WL`zO`!0aUiiVhB;D a1ͦObZՓvLHb%f]b s}LOo^)yMon^Rd"{O\ZL}$.GX%EE=oX2~ Efj f(m|{~l-HŬ -1ˇDᚖe%B,Ɇt~t$e+lz@&@eᴢ"=? [׷v4~%T}иp.vUeێc^p88u#&R* /z8(F)Ryi^b3w$FÐk`ʲk`H-2x)nx@fP  \"d9Y>vl_Cg2(QD:vՁ:} H0=UH|u܇ڰ-W%kg=Ű9I:dv[x~Md+ uSY[cUY, 1~Ÿ 5|_#s#F|U+(Fe%8W RLK".V҃iBd8&M2pѦ_2[A VyExȻdG[@Ɠ 7aU &KNXPs ˴)&?ĸM(1')"s7ދR) nf_8YA fff9Vh+7M ^af1\gM/4fT_:2ƴ^fn - f\%RRq$/AdE2ӌfXk<zx0%48fjK{&f2 sQi9q?>?{hr9>SO 9afN8f) vL2g<:DϐafBv76O< __23WЌ Ǟ23 -sefuɜf?sk6*~@5N0HK}O IZ`FߏYNt9GM ef?K^r'zY eVyR/燗s2q>rKt(wvU[mi2 Ņ\A9cx ).3*nFG+U`(,v,%~s).,O .vo) .(PSøb;2 Fcxbfkwo}ΪVq~~,ʜV^·ht -s3yYaY^XKUZ9]! {ǸZQ9UiY׵PVXM!ВmZK܆4Vy2M^\<.\Fq chҥmǔQZ6dYb٥K {-.U#yKCsO.^n4d9'!5G{~~,Z,sLVC^.e8-WJ>eu;QW#ZՈnhViD: :ZTfTxT\\ٗ +idqʮ]WCƌXԇiUTTNѣB -g]ˊ] #+yO+9_p -KVXB,3Ovai/9nk5[jJTJbiJC ϯ YSfva14,S+ʳĸRȜ[XцT+jE#0Ll "-+h&df*eQyidWr9EƊ̼%]nK.3̄ 3f|_ -TQ6Р9浥[7,Wz~vYBao >>?: A2pYVu}f,y=L mU4A3*L햙3! WjFfJ3[9Gu-C)3ZfF -Qu2$Ĕak|kI7 -ͼhԄ&nf|W;2SMG> 3VfB^u-3 {W yO3VAO0Gə -L" Vs&L Af {&2ghk3hX(^;صC$*◰3ziRv2 F)bW F(T (|f(8jdGW7^by[O2~$*]q}m21QEd{x!c_@Mo,f+e qf̸ `O( ^eYԣm`8>k2zwEމ^4I6yi0[L/=q;oR$0- iR |.g \F; д;7/,hg楔V*ZELy}m!/^\K FTbelʧ4v G2.ILU!\qgȒ6 -N"2SL8 -0.bIQ*ҟa&;I04h 3!!Aۇ_</r -14V2@y!%dh́LfȰy_WLw-\;l,+li0'044/  k$KcNbN&ais9ȕ6])^+L'K*.n*Cs-hvS]u -Oh\ 4AQ ЌL 1=?Ȥ'Y@v؈\@fL/5%B nȰyȃVL)iM̄nt斠fJe"XA23'23;3ffG9=*b ٢4Ng -2Y02 CЉp2kQ]t a -'eޅ7!3Sg sgdq|Ōy%3g-f 읐/2Yм/Df Y <ȋq 0#ŋe3^n -9yikk], sDًfZyރ -r,ypY jg LyjH3ehIc '0}%0'4Qe|$1$1F4EHQeR-e(i 5v%E|D2 2*b8wKk$/R NUjЛ Nee7MJTE>kr$;ȋ&)^4L~0mux>2uUND7*Ox̺ S?kI)eZAuO;nbXҼ-Bv!"fۥ/~\_[HLNaܰ gJ{_ 99Y.Iٖd%bg( JK¸1t$(K&bhug-\_;E\Lqp1KS7!D5R0~$.;w1L"{􄍬E^e7.gᩋ/(ӿBQbleŧG_h%,Ჺ#E qYU(8Knat(5Ǣe$.m`nx\{S".;p)j9|=kQcRgb#i+[BӚWAhAjơ&dF -Fj5cZ(HLBB%JqBǏSJ]1P!?-bq*04uCjh*G1#/Y9 A$Afz75.R{23% -[Y $g :O30M:df֖騔&qV0P/zRzgC2z%v@xgY0g=4w37#KwG&1ry>nXV4x>0Qk -YVRsTgYT;{ȅX[YV$IV&4qet%#m XDnoh13ȹԑΗlqp&&q)=ತ/c언4.%u/qگf8 -`ײǦwV.CTB%Erwq73#-o1S痕xj$(}}]C1,=4h)e&hvhYвxl2'Zԫ6j~d vҎ씦 ,\$僗qx*uiSty\GZ f 0Rx&0vJHQQMkD -cK1Ts T W01#l5 0fjwq|z1 -_xQwTWoJ<&Rc0km 2ci?ƻL]vvk10%:Р}4Y( O4j@cUZ1546фi~/?g'4\_д+A-Y5Єgk5jPٱHul;ʄ:4e(u%3OV葷*T)ʂo;)Qsnr1&L{ d`AFK2HbꬺXy8yڜy5DwWqҺUCoԟQ~~ m4@w1,dD],fgqiPcsQ WmQLITV}d'@'.(K2 [C,*e2n+g(T< p޸eɱx_3Kk;v])N|h7q)Q-PW]Z$$*J^<f6ƽ?9QJ+WV+Ǔ}ZsTF1R sUtM=`EH5U*Un8695#^i΀ -z|v6ni)/3x&d/K+uv\SD/CKfێ[}ԃ;%W‚lP4D,ג|'|{Vδ\gɏ$#cKԥ!57bm$fGtZ}sv^uZ^g'0Q扎ã~>'C>-$uv - ̝{k~&o̝6}<{s]%Ʋ8,GHga_Hו~ոѝ^27R߃ὄnf^) +(cUo8CC Y9g_j_s }*p}s6P l.ڬ+8]; )m=$q^n,Kf,9n7{ 1?Uf:䑝; -Ae9>mGߐBO/%]{ZZՄ+y J̰/+$1Mz&txPUVr5Q@+NqN$f IlNEM4H-Cv -L,)3!`߀ж?AޥN2.7&,}RpFW˧?hu1J<{ -Zʂ%M>&`ߐBwz-~&tW6+z_>FoLy+1_Ka&􏀗Z)2+Y5;rzJb kG,WE7)ns?ΞSÖpRG>ݢ7dyy&ݕYh+-mƦ÷ >UKޘ_r-}^G ;o -BBm?[B3RЄG) L:BZ*=^㞯{эZz!&?#u.s.j}e&'>4oDG2~d Α-[M/>|\t7л.??t/3 UW.`΢ɲ%l'v%3:-KDǢt׻V=AsMQ)2#ςQ؛79˼?Ë -;7],*Qة0#6iԨA(uu IuJI)zc?BƢ -7=_)#`ʅ0#E&wcݗ 8;2w8.G}{]WBsw帷w|Æ/ c ck8:|yŢ2u]VlHj'[AIƯ'[zz,O48:t6b\ g=W"RCА?4ջ|/ |7ISlW[dIvl z\9x4d$~FvaAYlaa5/ Ӧ8ٮ^^ޡ%d5 Fi ٹotuۧe[w"{/Nu=E}S@V6>l[qJ#+Lʾ9aܭ@'yr=>Qea5spDORR)VSZEy1` ǒ(ʰNʣ( |TU*?w_$8{_S5|s@'i[ =8RIxI2YW8* H]+4-']0;H>ۖVxo?׈ئlZZ!? -"eu -']'.LZL$Q#>ՂJbkrbJy,mKֺ~ݬ'-IYJKB|> Ft?|5Um|xyNع,<#{h2hSDj/MǎXϓ6:H?` endstream endobj 12 0 obj<>stream -H\K#9 DOw "ŏtf׳#1BiumN OL G[q>֬ާ~GƧ=^o kztxzr؊[q_gٞX3 OgYEmGC'zcML2;qS7د]k/>yx{N뮳x}f1WDRx]aFi??;k7p }*x|8Ên.IYѯ[p >k'y ~d>=T$mW+~pg+^wkP'T^w*5(۽\K_^g6%4q8XZIJ%R9Wh 7_m#/>яzţ44!)ȼ"6q4, 5:|??)Ks+NNnLnЍH6 hMzI{Af+=k_F0ǜDzx:%_7L\GvI y[SI\fWy;xYjĕ6fly qyFI;:}o6yv[Z|{x򕳡z1 [R׶[Y/qUfonutҨB_0)-w`zUz_->nU7+ٙpItA\ ߝyN %|&;Lr)5 -j087[s(zۼ"fV@b1?@}wwt+b6L>ij5$ W>votW>G܎FA57dpTZ^VgStPs -CϮy1u[M 1Vqp:f ZUz\RD\6Y+eYZ%.œ0)S/s%:K+"'q_-Aa`qĵmU{k^>ǘ=,bUcUڋV_J rêFufWM XSjι-f {qy -a ^(q9Hר0Sr6夰+aau`W5QLyadM) _O'D{8=1gmp3-Dr{+b'*$8)2I ."qg -HbPuɖIX`"lLKTpᎺl~Ii4ݟΜLB_ -cYaՀ&ۀoX!ыN}cy&vBΕ_'v5?F㋖SSoh3‚5UI\\C:H* ؠ !ه'1bu 7AuUT{San~ւ2Z&!"({&$Hk&t;;Z%Q&`VZ"ܰ˦g:nZ%Zo۟E{qxCQ9ĊJ>u:5"+SЗL*}OS OAo"FEv#1q)6N9l򍥫W%䙂mo[' -ZjW+hC- EZ 8 P"ǜ?%:_^ZZK4 -tlS9:qZ:xWh['g E퀷ddk :Mr8>^dXF;vL`9JDŽz?7;*@l\cqy7|gS??@[>U`49S$z}Bk1_,d*^r#Y ~ee#G"C%넞㪴wQcMgqprJz%K9 c;|)đ9]Ho_])DfSBt.|$M4DN!|}9<ێF"B")tȊ*W$x#/xgb%B$!uxw2bMmEAy<>ꎊf3! \d mC\*8lch<٠I)kn,Ikj / -Lbbi~ 'V~8Hb달ěD :Zgȳ&ہ5I >D+k OǴKcȼT9ly+W"Άt 5`P"U:#Xf$4Gס8|}!+mq)> -ڿrb.0x?P_ +20 -"F_+fRr-}[*G<mY54kx/;aILXA32[%l^,Vֽ"UZ}_IY=ָE"WQ܉.<߷;&y!Pj͋tγ"y9L#P2 MA2 ]%ȴaI>:`IJڬ|w:3^e.oDRoFe~l\إ^Vu6}r4ָR*\6;GO8tx&7xiV5O3\iؿ޳`+ *^.ށ940gY sB7ZY-6AfTi2+XAXgaeR@ 6gDg9:+KwDe82]S?0&*P3 -&`O0AOt5xI$CxJ J r ٪ڒ2 ړIXZ%qE,}o$1\0`"f;LwAZ}ywbF"y}7Qi7;>e5ezpY9rV}\ۓj1py*l#v<:,UƐ0)9`aE`Bo -x6];T!'>\5?~\!N칻<J;Z3AF#%l76e앎N ʶ5Wr[\uNFQr؟l,V@vĂ/5H\%-F bQa%pȳ$ތB -%8P7хCa8+jU41vk~dE)nhƂ97Hln;m:Xэ:0RȜB`9`%@n]/Z<VB -nut8PMDZU ܼH*H\Cc/Д*RWZ`W]<~ g9mU8]LIpsm+lEWҕϊ^x&;RxvjeRix&/OgT KU uuo% FNЗ -:߀㛷bM@\-*oRVE;d,F(j7-&ӢeCBW"q牦d]ŋ%;ލF9q))k֥[],<7.cM23RTf6' -%\\ 0$pFxO\"6Ӹ~_W0*[uꕅcg>⍠ב0q;Yi!&=w+:م۝_}6'zʒ?qW.,T4u L'bwA͞/E02x!fvq -=Y50 v,14H4cj}!Ybo vU`>waͻa- -rWE;ṄSRZ˶=K> -K ,n ϣ<ҎRM}K^\Ca+Zx'qZH[.-L`A -yO@4oj[FBiӏի¬;ZvڴW#θI^*%i's9#cdpֳ>h l!~Sg$sy6k]i6Xxq&Z[,{kD: e}k%FGV~1 !&a\ެ݆3tUg6U"&IdO}]2t7'&ϒhQun`5o =s:F2Wp/ '341UCu(H: -w%Xy֯::g1W5oˋ!$yv$+)3RH`vёp8V*S)ɁBM۫`Ɍ^[Z;#O6of*ΰWy4J4jAEVw( aCp8LXL艖v7iBLD|ecpE AޞB%teׄ -`FgM q,t&Lh0=3zhƮ-"XĎd- yc8\9'mCdxܩ8G(P!WFzsP% L%0}oxcL2GS `9"YV9a/JONa,-$FNbN L$BsWrDd:}'+v ӥGp!-bM1^Bb4 C!FW#% < !pxS媘s$zY]Mc7+ -\Gސຒ#a5ҭyLv]gWHS목ނ@è0?A ZYAY!t/:G]4~3g2y\%I_|ȹ,ivkQc ٍSL;Pź F~CQvpB,[~s*jO#6p/q 'k$GgںX2w94p8;Bf\bHj5CB.S4oc{X`,ݡ^ɖ!-K.` e8Ow:eyנ b݌Jx]͉5%r7&Zx@N)Tf *f-yuxӵg;V9Rp)K1Oa!%.ֿ4. nT6>*Ql*e[o \-m QKAi0 g,t}c~wy -||3}j~55 -7x6,õoVg&61:!05^Gs/1[:+Ox#`;R̙ Sk-m hZ6m7pv/wg9W+0?֤R43٥ B<:;MQ`&3== 6f,ps ~:6x" ԝ2j@h/ywĜ4( jYu+ۻK>c*m)U`k Mq/on.N.xE`~x:_o[ ؋E4t'6>svX^ B>h*/r>k'A /=bHx+<8 W8b@ٴݯSCF .K6Q{;X7&%K{:%B@҄\Y @bP#;ʉf!b}rG<-&{yB@b' ǽKE`P7xGxRL8x M{C|fp94Sk0h|S[/Sk L1X*<O#K^`gCb&hQ~b;×g`<-oۅcvæ(o -Ӆ׿7#,?+T# z!ju!V7ND -M/Euo3DQC|;60:61D\}c!;?SS%A^'&S"v aGthrE9`IࡦJXA6~À4 Ё1DL/VnbOkDf(WS|M1=֩FIgnt2T~T2 -`ndgqsOЃ9 ސDaiFFs9@ x-#P^`-Crюk+*181Nqj:~sx8ˉGwuk.r ܅uq(7Pb:9X-djYg8'rpj;g~_qmoh7Qto &ڍ#xsߒx\&/ZtYR>SϜ!q*'l 9`pXZRWw>W4z˹(BX~w=>J&ɵZnܓrMTc .Ul8 $mq٦g=`m5'?CCGʜ"6c/Z N7?!I?^2B%dt6Ä}`z_ -D;5wD e(uG lL~:xdj^́N` > -//n -|lsc5nO=o#@wczU]35( 6)Zjh.;K_ZW,d4X0r7sqhSBڂ,S"1W'9&5kmSry/ׂ9x1qDciI*<Ѱk ccMF:?VKqЌ-p -҇0K׾>O^Iɍr*nɫK6 4i/`*a [紇w3;sz5y|&k-rc 2#EWkj˵BaXⰎ{WmZ =Vbc hsL=n&!&^ bޗu#fX.IbNڒ|?)fO^HŢWoG̡a}|8n,^OɭMԮo.Ka̗-`x.øqFhW bFn rQ^x,iJN8R,W:MC|˽G~὘.k'5f 16Nkz^8Q ~zØi-JDf!m;!d!">*“%ծڄgK~kKViNx~$|pW"kxB-^w8^GsՎY= Tr 3E("5q9Oe=mũ%ɦpS›MB|G_rJ3kճ|WA>5N 4 ͂C3I-ۯ'l~gV &qiq/H07?ruI(m$)Sp)H!gEy<^Z2 -(Q%iC 6BdLucMCHL1 ꏢTIs&Ҋ4w2ek y5{4vh4xBдr>=F#~eA=r Y\J,s2Ln|-'N͞:^5gaʏ3EA(PJs}ŧB#y9$RB_tU #F:j'bBD|m /[zfL|c~9&ԱFʿuНx}9MBt۩@9s`?lUZVd_|3Dv=dMd(org9$K\ӗk4|~2COj\Q]49ǚ Hfؘ*e٢E`7uFդ3.GϢ4nR TY8󓙼<¨Asw_uݨ~TVkWD2?g&w*OܧPY ˯/|⌎c!ބwߒ?b)1ݳwۈFm(M.L<_`U)|GMIoHB~z/Z}-|og 9bIb-F/HB uFO*=7>Jo`]W ?:ݻק$ICʢ'cj| '$7&bݖG.A?^DJdm 0'yH&Ge\9 ;nدHЩ/լ${; -ZTr ۹ -#Ÿ]Aþ?*Nh"PE @lL?@vC-eegu+Cl]Z ިDwۋ^h܇$TOW`PAE 8Ҋ 0&5\|s="lgM J{~ω2|ӍGh-L5jG}z?;_L_[bOpM]N3 ި7"6x:֕I}s)6qd+{T|G3 -|[6/Yk -F'uv Y#/b!"6>RW=xS/n$u/B/hgH'W;KdGɦlNo20 <&}:zM_F/7u4|}X/} zLQnw4(\Eϙ}F?r|bS˨~sކϫܘpޥ`1}f. Il ~,?ص)˹S,WA` :z}E|ma|#N$_?mb霹)ӹAo?r6qsi'$-j ,;{#v w>fFk}NG9- ]Gv6nn0xi1ϥEy {hV1A qfr2`"ۀn>9[o6&k@hLň9O;(Zi +oqWOY#sgm] >M.3R|'U"t8s|ۺA=>aLLx77:;d8N]M -fl)[;0 o~Sc"ze3z`|O v.l۾?]Ѕ0غ mooCNu994ta ]̨5,萁cqj{Nt:?c -{&7H o2LgO-%I[8}[/{ ~X-fme֍!?uI/)'k -̜$ }:f|mG D=n_ ?e d^AJ z{~ݲ]rŞ5ƈ&V.L'[u&};{"?r'f-E"ս;?5[#w‰[YS|sb7Rp7 kPּTO^AUJ Žcѐ>{4&'\S_7 xD+@DYF]ߥHSoa:Mg-4`rs1ǁcERq?yd\k2?PoS3+ wCk|5sqyu:W[Y!9L/]r_suSֻ srj,M 㖺6|ˮy51 xQ?Z|oQn9 s"*F+> ~2DcqrVN, (GDzf> ܷqd.NOLJwX0΂b߆ن?W/c!|ZC# Da-ܰK/q$/#?O k]YoO@֞^]qe;*V`v%a0@i4tT~Q+ɂw.q6o@)DL <0pa_؝;MMs|;*g\~CwF~/>6 NF,OyH9& !Xzhﭧbw;rf[Z6UW`aD7~g^t9$p?Hs~m#V]v.yh5ᘾhF~sοTl:ȯ\?L߬9)l?9*7M |=J| ͜ǁ/Ē g@v{sftJTDҺ-x\s!d"0MEli;CJ;g#"~6Mƣuia/@`;]bpL>0Skv)8?(sfXfɽ j?0tL{g,#C #x0M'-`VJ,7/[quۋJ1wSX8dK?PmۋFFS~3?qFzcdG$^Q:O|% nrDT{\Lұ&fی?JT琾iwa;4C͵v⟂X ) -MEa~$YG|A)γ߭.8I6|QSb.V{4z#Hfr#h;۳q n%Y͟f۪}1o8ζ0@7sd+S5ғ"o{j|:>)CRyCӖrt&w>to$ﵠ~:]vXi];?YSUwFt;0@4Fg --.}=~lly $!oˆ|lNݻ}ij@ n)'5P%p^yy#Y7Myh)`]y%VgfRوVWQꢗ)T-jUimuܥRSԠ.+]V3}1S] DnZiC^+Of-S3=[j:sU@0R -iݍyS*a -ol*1/m`Ra'JDZ*ģtRX^#ZM}'Z'('}cɕq&-,%8eOѲ8E -ViPə8G{֜,u>ў`.PVȕ筮G _(9.P}k_hN r굲[_M~}Sӫge%Y5 |ӗSf8XLYQ~F0ݓ?q> endstream endobj 13 0 obj<>stream -H\]#7 Ow y[ "yqwɪ_{ZoZuz_/歯on|s[Nc _^lz9/w}ow/U{KL?9Ho&ܡo:To=ϼ&;\_%b'Hk"=uыpwbUMTJZǬ 3 A3ެ=X÷w}sDO|$ɳϗ |S #AgA7ۆ--?s[57^M^Ê/;o tzpoғ[x"U1 L t|#8 -'>ԀJQs  !WYp*> -B&,XvNhmg) Z-կV*j[yPP^؊3t:n E;BMHPK 9%9~CZ}q O.TӦsV}W}H' _쵠Lk:hs7?J]oفt( Ӛ7[cocvҲ޵tf/"%˴Fg -M! 6;A#wA0䆋ёq=_}Й+t?QtnŷkWNړd^ -y6!NH֣Ϻ7nB_;؂TWJnipZT:VtCAGˋrNn'-|xO΁ɂ/de3U ! tJaUvAW̧xw[6㮝toq k݂>t2Ep4w&u2n1lXمB_Bc -nCvb/d2lV o-)2X08*|d iKl4۹u"x˘JǫԤܯ5"K"f*:~D -Hbؐn -,E/pRH7ހ6qZw|GS$ ~{as.@G GzgN f$M؝\vVoJY~6#e 2p Iӟ t.t; A7UyV4X릡*t= h#-=}. %E !-fvě[u? -l[-jz >0=Aݠ>ipU h~{=/h -;:yFt?pr(O4}uf3kl†ijAqj mz/(sݍi|Ib㾇)T||9uq"B U$jtO2N0IW|w5QA;f>  -@AV7c_TIU;;͏џfКrLFsV햘qG }5$AX|7*աN5_!O͇5XvC<4hLA :hOx5RAoj9;U޻3I~$r/$|35fqY%ݢgZT3]0sݍH5}>E_Ьt1 "60zP$:LhW;*97ݿJ57(!9$M[3/3l5ޕ9C:%|Bx<ÝeT;G@(w>W|5|i?[=uZ}e*wr ۦq~ҢÏȞ$dZ2V9cݞE7j̼f3"rCJ55.%:T|VZ~Jm c 'kmkoZ碛ڣ|[^R {|  be#^ONy}7[ l \vrWG -n!f gS<"֖ǂNA. -zkI?:m|*GAix<+}.!LwݻN!>',0 @C=4tCLCAbTq=-oRaоN6CL/Aa|C2&n-AC,h ~( m kNf,@G \vJUѢ $DxNiCZ0RUGTt ~Aw-N]EІR榫s!} `:t(1hP30pyȵQOe%ZRv] މ"+9)~B\7¥n4рhñ13%꧝Ħ~WP-s]FI J`BL-b"jo_IsF3[G9{/7C=jOzsRXrj1;[xE1{f0УC(\%AbԌB֍N gXlWR[O V:q\'>4aS ] [ –3^!wuIɁqD>b3>gI}}##wH'i!LZwc !SRH2:!:JT}]9 <(F!2|R3U{gF.Ƙ'b7@uzDܞm[hID4]iOgኯsFȩPMSq^hW[Ī%)G7>N\߀KAp;qZPhӜ:-u"g\YTUzjN*FWN.LjhGuq|jtͣ230b6S\j#DO󉶳8S)wŞ@V-yI$Yzjt}R|] ]b3Z%ҹBo6%̴ -`6Ϙ׉A聜-pL6r1@q?Q qNrT:fn,UaC3F(:]m.T$#jkpYPYooiN:TjШkq#e؈pLx}S*fЃ!B"N#΁,tEgm2DJ°a1'C4cs _gh|awg 0 ΤP 6ćs1o ~rwPEȠNeP6<0 -aeP%+WDG>=~_r~3(j]0k{A8I`呫^UGp<ة錏cDY7TOY f"u/F8&JS%5H'w1#ǐX vJr*qB! %"WtWmXc\W/t5+y܋ۙcAY}޿Ʀ-Vr߉am堚ȿM(:Ps!/7o(Mzr,@ Jk{ׇEJQk#Q*S"Œ0&`bIuHc2Y>?^UOvâb bQ(YRkU yR QB>kF\`a9:짤!LlT fLɥwdArjLn ցy ڳB1\LFZ$^ƪH$"Q(G@5zؕEC,rWO(%4.M͚haRĩ񒖢VlI Wm`ng/~ - 6Vۇ!M>CRsRF}gf7E멜T,U:a8~k8/j-))ڟtᕚP79gL5J-G0&6c\gDŽ9ڐ&MzOLAV>aa0\QEy1 Y Kl|tf̳I$ $l| I(ʳ#KBc}~ MTz~u5LCj,a0S;h -#G!2_`zܔ4ʇI% Liֆ3Wg򥅓mAсfhn|x6J VK#R7/.K˙bZT=g_l׬I߿@Pp~ٯ*L$9U{T` b8]/:(5SsQj7s>ZQGָdFIy{t22=0JiҬZ #"e*7f8=EM)ib7-hsa4w֚0^zN(5oL.dfo,iC {aʎffM4t8Iúq2e$egs)1ES&UCvkئp \ޣc}`D)>Z,3$`;؟z0_  -ZIy/ϋ">A3qq1hQՆ#[᧶8Jo&8$- -?PLGT`۟f84Q1VYÊtręx/?>л#*-g2Ē+||(~ſ - -pJT,,Mߙ1x#JL'!ՂV䖪+RV؞p0&nk//FfXąx ဳ< ;nE`=Q%Ab#ޜ.=nWCmM-nlj"Eq{ "peӒ.@eom+P8#]/KS-ݤml34XS> ?2p{ -*)Jt0S ވ;~5>b39g̜_& WF|~ WI$|A!_ྼgS9#,4@],HIE8D*eb/Z `p)m4>a>3nHذBg]Z&cHq7>10뾰tg]Clps?C_ք 9_n/8#ZiW3}'oc8:5xdYb2dNAD}_,XBӪp1B}\8 -U[g'&:6%h=B_nlq=Zpݼ]@09GmEu3®!ᇕpUkq7<'ΡXL pCB73p.qKU!JM73&!:}U]϶dV,!Ы 0{S^'K5O`7OXi%OUÄ1uxwQւu O8 竒Y>wxO >˖^-UllټU=ǧon-½"qV3KXZrl?X׏)eZ넀~Iy.?pN?@KxhcT/[[r#fw6a$ҟU>!.s Tt&-ĂwcM/3=-b"e\ JG40ΛMA?/.&Z ' 0 H8 o! 8L ɎioA, -RV" -géncG3[REB6.@leG]cZDl1Ys4܅Kq K,\Ezl(00tĹd/ 8l -KYְc_$hl4 O63¦q&0T0(%p :ҭeLnG]b֦kg4 ̋c8iRo ɞ6Kexkk9']b'8~֧}H K,bg[jգ+i $+/-qF}kAt/ۘ:2֔%{Z#N% k)Ff$}lU=.T k \6y_[ho`STVg ӳԮ&p W&A٣_r"\ D0߶;7:lgGNjgYǣWA4:poGUWӬa\ASS[&zﶦO&(OZpb|ilnLJ{Ӿ˱ƿr+i 9ٖnlb 2`QvE+iqІL38 %8#l:δ%fBC(n1p(WO;%ӝ3lvpu\Ey}iÒ'1| Cb\u^c:?I%$9(DKh'KW]8-cG՞Y6ٵXRVzS+χn\(2,}8*_0DbԭҘQV::Y6!w-|U41z~@ ߊ{'Y$bJ'77YW2CLtX< hhRXxb:* brU4,%գW[ϊ)g0);+kt3gʹ"N+vXVY:;MW nW0,cM&m_Ĵ`ʋbHRUpk}G9 3zWum,|0"4ླ\k K{_OG̘R,\ '񷓯K\j3pgm s۫_eIjxb@( -R`xQ:(I_2WwzeiCk+w(X B} y+ff>4KRԝҒcu'XY4O2}d5 -'@QjqLJ0fVA8\i" lDdS2(ƻlldK&Md/r |3D8`>q P -̸& Hؒ&QbiBG7t5i\%ms ,L$#nO|/nfQ0zdd -2W]+Ǡ0WG -ݡ5G-_[ L7Z[1u<"א6Z;vcz[$">)v@s\>rS,%er{K7(l!ͭQFqE ]7JBYTH;'ꈷ8f0>Qz#)SLITjoW<\-KsqB}%+ޟץy/x&­TwWl"cD1G ȔYBkcxS4I][[0|@8)1Pwv&8R8`֌34t/5G pb&z;Axc@q-+JB}EQ~_RX u`.'6?TCO22Pg4Ko2Gap(Ƹ>['e; `RZέax2GMċ+yD\{tsZUMw?()XX̴x -5@0p]}`vԄsAwȀр WǾlED#^3ʾ69D#(q3bsYDR -y1q -`Aݏ)O\1epkfC"ƠxGe%1q&*?1^\ZfbyUԒ'.gS_c.g^_cF{,Š;֮* QC-khL!bt@ F`w޺O+ ; -s -vS_Nl]k:3!| 7`bRvˡ<ƾ&<99U+WmjEL; i8Pm[OC͡j[=qVs6k6hJ-ńY\ %4~]!p/Uت vV`xd9DfE*=T[jo8"] lʡ%Fwn/OJC+_/.b=w| 鑍6K!|V,~ T9gh -y5u>5Lm( jqGlF272Tw+;/ -I:07^86qxH=)/uynԮSMвzťì -4Xxo#* x3Swqv͗sY-1P$@cn`~XRCΗ^:m`ko@m ҧfJI˩qmPYTу Vi,:dy8XUmbq\{ &-$mOAp'T !ܯlj_ zH ->ҩXJNfvI6q\Uo t8ŸIdS6OYzxZx#J endstream endobj 14 0 obj<>stream -HWK+dC kd9ۚ-X{C~Q_n~m{<62nOSy37|ضTM%; {Q_myCu#W}&nK~WԙhqjTM?;J#agurq2=!e& x?һ#=sX% ?_o׍]B=Dgz-_X . Qi .|w&#!Iz9C4H d|\i“@BG2DXJkqG+{u_mrMʒ"Ri8#2P^*~Lu&$1͕HlLf#0yExt7>5|kY͉v:yfB$֨Wt\4 +fjhH*CFae/#zd]j,wو_Ib4D:b ]KPd` j *٦d",F"J3-lmڱf΍Ѽ erg8.sGoxO*XMĩ-[ڤtu9ǦF+6Gf ]D׊P`X*?tʷZBV6J2ZnRiEjK CљH'Aj@wEX -`. cB8©ʑ@$\ -;2|acpތ(aNFD5$*zN1$3"mKx\vCS(ˡƨ}|A2gOA&rgr|K=OxHl8q&NR/GijHDSb~Wg[sh@ɢyδE[fӎ9 - Pe[Pg#[?b[᭸Y -ht- xUȈ2`g @OmsL*.qIMũ[al@a:\W ˥dn%냟 ͫC~&y#f=b -"'߸!jCN(_t]+]sT"D ِnj>|:Pq -$5)CvZÙ>FgA ҘZ>MdD\!)(DZ;_JKaj0 _ '_5K'_0ME\nvJR͉~J- S@Ǖv_N_P!'e>(a-%5}SOE\qklxKCRly:8_wlUlF +EvFJCKDeL_<46'GJ'FIGd>+(YY-WIHJ=aVև_ -ɥ㜪T7c, ٖ5lvؾY/+5"I=9>#ྱwԛ]|SU$C20 )UH$IY6÷uP ~lE"א(%\csY8)6gr%s\IGbHQq"GUn뮽~Mn|/JאJMu: y*HL-ݧ^l~8vTXih8Q:KP_β6߭w񧇈r~+f&m?jUč(ߏdD;Ydz%ۿa -HvO)2F=%'B!q{b3Ν66$)9Z61QOܺ"$2UbvH>~^>®fI׬oI"8iNkzdRg>w&\(_"qV`d[3T+|Fc\, bn*'$QSY@l0FD cBٶG*@IN7qNӐBdYv+Og9/sO( 6]@jwY89a7;3O >x)BdBW6Zs$'ʸEO#{J:[Ȕ>2Ufn=^' OzgfU~3z^%$i|SD&S_1EEF>C4=QR0UqK̊Z9%H弖bJ 2PX%֊<@pdf6*AX1KZwtHur}uEC?ڬ_mi9+oힼg G"+hF%eUVZpr@TF@FhKGH5Ne1mKna2Bi]KЌuQ -3vkU2tlᯁa dfte<.b&=8e7-K \of#MĴJ1.A&t3fGy*SW;ޝ^HkvN`q2^u¼Թm ULugEqaRFqQc+6SS՚{_ICP/v3.Dij6 9z;15a^p~L鵷Z''P]Rvp< I}\k8-K|z+o{s'5 bG S] -|;p;7%v2Gf83N,-62C7 }oȁ-Х|>YYt$^ -Q A dH'\Va!KPiB,ݎhgij|bh:HV'U=]1~RlqB l qggK |gll'I牧F7ҨhdX>$=$ɐN?&BC2AP ShR,;olmxe XB!z0#Lm|l{B$U3'crwPNSoTv;%nۮVE c\Zb<[[9ՙUfބD|?/:"W;@mPi}=kR _,.~*:jҠumBrZU(kRyu>fYοYʍlKk$U' z &ĺ8Kq@*0UG RԎP`]Q;)r.\Qq/0qq~böBڡ_V^4s ɫ{k[TT7#dtA>$Yu:!n1;R799kb,$@ё@ch+!%z 7(vbe!v_Zf -%^y'rpVKs$M"_˼H -e49&(+ kCMG3D ӄ(O}(6$^v\b;ߧOw ۠y|\'E0)GRp$pe`KiX+E{;Ş -Y#\gȌVVwan]XYZG<"./mG:[bw<j}hBx$'yאmHll4C.&[&lUiёZ"5H" RX9661< :RqFa0([L -YT$~#R٫GIU0 .B 9qL2|" [)mH53U!mͽ!0' f%`alC979{LcxWAZ'ҫL^jG D5FHr[tz',2a:W{&ޕHڎ :j\ _S 6[)h.\3ͬ _<'!^QLVMDl ri IknZt9bw/iܜqS -꠩ŷaio;6$[Vp 5| '&?gLi!G0YG0 -o+ m> u^蕿y0 I}~0C=2q1o xmAiTFWݰiן'SS'(y?7(wO+.eGȨs#2[ez¹WlgAJb:O}eկV.O1< =߁ۓҥIkZQ\4<.c׾é1Da&,k'ҍ؄[Vމƫ3徧+u'g}=f/*I>fA; 7Çcb~Fj܏}U4Ր|؅=N=:m}=h{NI3n,fm* lv4.yyCL12?8|}ױz|3—1~|uZ<~а8{^vϯo"b:=Ґ~C2xپ̶YL3 7S M:m;Pt$Qmo\Nm |'6? fA%SR$%6 iI.iGZ='J؂e@-݀_a2IgWd%۟!w6Jz "0Ie L*l"6YcθL= a` ^8u|A9s OIɩ2ouvJ> Q >8#'ņdrIoMR]#hjmr_d4=Yq>SXZ! W ƺHुs۞NE`GIO%dT2D&V -Uא=t9gΖ183l#a09R7op[È}~ )5*D"JvWCj19\ҜS zo[0 -6"N796+6XLv}T..͈} ꅷ2DtɃ-3$ zpKrfۨ(Fb| (fj -`D峐~Ri>}ٜ8AX8xR">%0i5-L!5Tz<jjM{_;;{zoynkMװJ%tf=篭M^_dZhb<?`H7F"rp\AcN1ADzYbLpIdR3V㬴DVhCBEfDr4D}k5Bxҳ7B}C?<%,n6~s}} vr6ב&_U$IxyKό"sfsMlƻ(]dtUWŶ֠ΰA550.N:^ˁ)I6.B?F ~ŧ@ h=Cj+$J?omzngTklTY%^dL Ll)# ԝmz #y(ARyOZ>5oh{) - -]4>aU#J[֐vjH\ >ܛ:>]\%yσoͯu36Kv&}GtJy/9a1 0ѽ-{7{K1/Ny;?2BcfDɋ(=y^gFh~#m1y#>:~{ލcحǹxN+6;+Z% 0gsV?җ;k,HR d@g \g\yZ(ĊQo1/ecɭCrDyA奢QDۓJ𖞤[F b)CHxm{㣯/ig܉ԜDTCڦ"ƙQ yN\l[1v8K\sՈR5y\naχZ!ħX*;d t\Y.BE'āaZ!4Q6sXCv(To$$ ~)}pւ` AP%T.P)L2UR_03! --=fw+G[<)_ ,rGw!m -)tLb6ǎMж"jp(4wY JkJB3Z;j r{= ouH&#E!Zו_+1sp!Rh O}~Sw^)|%? *)Gf%߀ct;}% 5_7< ν.k9^a}%!ZFP:}^du};{]epUl_~nuc{.-խ?t{';g,9\ =k}jϞ,}FO%WXks 9aJe>fau[ϭs(Zuϕ2:1`Է҇m$bŪ٤Rz4zYS;\c5h)84P7TaXٯWz o97׀G վcVm8Ve*@ۤ #m)f4ǰWgj\Y#2D%|ʬ*%ۥxவYZMpet҆ʕf*fxVØ{6_OmWR6e6uL u:7ӚJX-):*pʤ$Ql5hw > ݳm*x* kx>wEǼ%SMv{N  ( Ű gJ6&Y0{/{W@tM&zٸkgĖ0T/k!&~bUd;h$7]uQlOW.Fyc,s߇`g+deQ”]#Ca1ǚ_84o3&BJSVH7p^/j4BI8۳X۸9AQg7`.q[J*QS[reәr9 -Vߋ_iEf Wbj ^-.h*UCN?B`#[:^lm\oMl+%OrWGPaK< JBtq3Ӈ_3B=PMϋTԍN"+:,&6ZhŪ5f U :fcXrk{ɿ{moPۯ%n+~r5fл \T0·.h&4yz.wH~Jo">Z`\#*u'w)lBqQZH45O_=>/]Z蟛aYB}w60_τiHi[R&iј*s]f0PL>,LLay(fc&qbJKl,PY`hiAZ -vfc2w@xp3@\-FîŨM -?r5!+՗7e:"cÙ>[bkVS-h YZ@ɲ(N+paJgՒZ6Ш,q/L*Ίh/[QHV,%v4AzZd!4i9Jrɑ# |:@y -0v *?Rf=̦ UR"Hy(dCW\J~ByH8h0m Hc]iFb c:BߖnwE"F]U`Z`+#nҾr [Vk?y(,_/^cBU6URd/ -˫(8*`ԸaD -"7XS Dh3{ʴ$1Dəe`1*st뚚}`qpAǸ1ay{ф$zEW;.MEPE5$j=E%f;#"QE-%[J/]bJh?ؽV]9(KvxT -d"Bٯ\yfڜa YC8f,8Dʱ@lP,F#*JLn J0uvnk;e!k~.̱=p t3X' ׼{{P9`;㲸TD[潬]'ܶPWPRo||yZsr JV|l Oi4\Liٱm_N`8ϓ$04=#{^cvv   K6"D}+^!JTH k*f".t˶ JQ2wvCۃeZ\lVc-pW+y?7Z89.`=?P=x.S:_S9CB:n-ն, -b䊒V| -eь/!dJ`,! -壊1=Mg.9sZ0 N<ui<ʌ$9+],Jo|t$SlB:N1 OEONUi@~#j=f-ˎ.rŪ6:*FEd7*AH^O앿+䊗Rb^O|Znd+͢dv7ϗɞ;.>1A(T? m4m`]0gG~5TvAy}ASmaIK8 鐵W6MIq J:HIxzhL# 5tZeCh&(443+i_.W*J0Щ']QB zlnR))GȂHúJ cLg5AQ3`*X -_>QRaܜLh "Z)qFEAkܹ0Ƒ-c\ODGO -ctO O)1sn#Jk_,AEfqխ)Բ+e&%1CE25e{0v[8ok3WZws壖^Of:| -[p.Ե??**=DrTE G[ -[9lRO|i34l`qq1`,3|ux ؙcF}w8㗟?fdߟ=AM ;-* _ $]t;cZȹ-7!nG] =K;)O.l(uXdl9Sn];~Qل޴>PR9(6.9 # EAX$f!|%gXsnsK~h :hq&N&$! iGX:Uƥ^W~dF`kf!5{(/Ty} k/t YV,U\8} CM%'0"Op+R]jUҼԊFom_|nWx̮.~Q$s kkg>S;C]]sW_k ^+[W endstream endobj 15 0 obj<>stream -HWINGuZyA,'jH7#H9iz!J79 )wu x M1aH1EbHT2gʋm_^7>Crz!l9rřTD;Y/.5yx4!5X_}[?( .7ۉD A8c! ^2qNE+'R~X5p IlDt%\eb;I:JCL|rdR3͟[o6R8!ѶN%^` K a -9<~H-vTNig٠?r/aor\15҉4v֣RycAۙ5gs GΩap^BBIB[2ոo7LE+Cu";wrܷЪR57r-MI\:Z0("喬R9\s0swVLNX!XiF"X/,G9ԢW眹w *B^aSq֡a,1`V2P%juHБ+'ˉqc#!Ќ s\E d@ȳ6%&;K-!6R"F=4z|q!ܶ'_ H E$:UJ툍qôJV+=]'ĕ0o( $\Q @^lT4SJT\/=JYUJ[L;v-g3Qţ< #N S~QLGZɃ(ʪ spY7r8H?VFSOy&]){؟qFU"NU=#cUƐgf3E.zk\p>!VTŭH u%a$V=K>bQƋv!t j:n}a[މّNN'2J-~5,5;GdBPŜ* -3d&l5,1o4/Hɫ\7#$al.wd03:Xc|&+? Ex0+Vb7Yhg& W :5<<4ex\R2v1G|-'=0m^GZ#b9ҖS-Ys:~7Su!\GK3?CS\4{< _9 skNlqL`R+m+OwS?)TܳZB/W=][R.[LqI -559a^7żHMۂt|{Kg'V/s 6&з&!)!P3Ѭ3aRby왢d*[}kZH=+}AقK@#R֛B@%gS |'rjUfKM憍X,&K|"LC#+|iTL4֙nMFv{o;nri߸o뭩p) _U#{Nrzr:Wmu{OȶSMp]{R"a"#b9">_dH1go3ƒňg=g4s{=g$_Sʚ#n{2N2>HuEnW=a3IcD#'Ů$](2yF$e#N b*Մ*y<-ߨQH;vQȽsą&2O}(.o?M I Lj:>F<0rtSH;S-h┭e&[/+#B 5o͒em?.zxADl,4l;B6!v-q"-kUfYkeMݐC{9c|bJ@]s8w#07}C4iL* -3J?6}%ULb.k!<(]P<~e2ٙze%tWer x`$#M[͈]+ $SlMR* uqYAzCn~ȆBŃ8;ݒQ&ZlfI*%$Ħ>}"ht0S>Wjtu+]tl_\B5*䀏IeS)il^A9&BebѦ+j*#UGdWW[#\Wp׵+) |3='H=257 3RPk?^Η>݄H#a EC=Mvb%vC٨c$ۺ$ИLu">x/>0)x}9)m3BF9,k]lN?7uTjdM5)zg73 {Ipeqیv#wz/H -g5ODR'ҫQb\aT! C$e]1娆UtD)_8Yz-*߹~mFY0@0F7A$ Nw4y8brK[&qg'D(S%+'p} AH.)6р#}Ӎ<_kx܇JF -|2dғΝ -2}0@o#&* O !&pȆɇLa"#ǐlHR$FJA4*(n~G8G=qZ܏,n9tI@s8"HEw)I.o$! dx/$dI{ٿYu ]A=EDA -%CD٪{7R -S;t $VYGM|`8 Br#Aj3)b'Kn{f8ͿW2ͿV LB?.  mܖ裡jWBe7b(Y5w (YKdnGd Y3\6htn"K8mFaD"%RL"m!P~L}gH?sj!ȹxK1{j59T'/N1 ^y)QxSBNb䴓bD]2Z^?rna/2%`q7IniB+m3x>\u oiڤCFy*|eߩъ"aI.|Ά\ x%{ -ɣ*>mN?~M*c/D2d -.).˙1/rJⱤKI$mPҲ*#jMv;OhZt 2 -t^|+;?;ϙTMݧVW_Pk_4 UyTdZʜu )JD"AQԝeRv/*<=[^WB{-!YЌi9U9٦*ILJj&J@PwtkӽI+ye3tRsǚ6Yn#Hz!RYkhMLEܷ dVp 1wvMJdLi](c> 18J(M|hdƙYf7( L9E ]Q=v&À2cCz-Fl\_$U۸!:A-\ToyQGbvA&r[r" Z;7 -orJў2dNyaOߜ:hJPdc0U1D;CTŒ/wh:IB6۔ 7XlLu~b xmZ{n2w$Jxt^u0RIے5z)7«ڛW=ڑWk}ɐm\ YiC9&]ic;yJnϟay~jG34:U|+,V'pP\)oV:%+xlV?@rRF7υ9iüYFZ"jʯ4kG9{a%i|4)qoisSKAܗ)ZWVR*r >pcj|P -LuFYX.Ea_$ :9 J/e{N٧_ -Ta>%mzzp -Ò530SY >K+ectjX So'@=&:tT()Y''S'e{Y6a+S,ԁ1c7v|#4'jB'@H=5/OR[nB U_''`@U{ic96x[ ]ߜy |E݆vF$HF,K%Ȯ~_!Pe\uQ ҃Eu$"#r]@Կh="jK;btܖ#0z1w#6l񆳻? L~@n6=  -8'0^SėMS (8M:ujaz~F+H,"::藵84 ?>[wBVxD<N=|vϕ( WBefX/1HW"ć28#Җb> Q|6#wn:ىוׁc@MNG:ٞCGh]xP!&XKiLJnXCgy=M}n}nT/BΧ Ѿx{ e&KsϘQGZ.!W|Vl GųƋUW)iɇz`?9T[w *!%V  %h/ש'Pg̾ o[c5?eyhc\~ehg A,@@J^ȀH +UKDuT;@*u. -@ծ$4[^gy'|}5u:%;%,uD>ه,m) l4g ">6EO* -jnwH3c+NYTnNp~',Lv#̃>=g|^aY-{l,Hçά `_QP@AQqۘlJA6kW{j1tƒ>=3?xbof,d_S(BGТ+01?gT*Ji=qg!4nPT99X0Ⱥ#=-aYf0BZ6! -YD箪{c4wk"~E1M+O?#v#*cnWB( -Ra$UH%(TUhqjD[`# Ҍ鵡 b>FM+C2Uڧv[|-۞z7`P9EM$nݟu PD$6а= | ڳHlи!#f,1erwmP="(ORtuu 0|P+7t&Y_td܈#{O=xfl:uفeɍ5o [mBȝe -(Xg*1c6[ym1 : -8͈^Z|U{jMK?PPC'h0_B\NE6l7>ۅbb֞6((Gbw[] D#= :> fB֍PC@E ɦN)'t6k={9q ,j4Sr#z1Qy]S;#hM1C96+kLƏ}޽Q'p^K%yn4=wpy<"ш{@w`ۨ:AH1%t*Ԍ98նèo>Z6#@D͎>QhNzW) aO*M( X/SU4PZٽAl1 -#?=2,]-BT R kՠbł9*MexUW`p^}Z7Tnu||B [(-ԟ}ma qMKtG/<<]ApCqٔsObĐ8MI'F 6ݜWpNӵAf6]56sw# Y{#N?U,_ws07]%QY,FѮmJ%[՝+GdzЬеg j٨48jRe}ͨYPC,R,'g -vMAԖ':V[<rc2Z2rթBX BmlUt;Na*0]h0/ḋ7ki 'E?TS,R&DŽTĄkWo W#u|g9._ RuIh~g <߿];5BH~"֮Ube^/VE?ctq(KS@?zOH%[H)"m>4 LT (%bR/D> _ȚY@Vse:iO^;f> y#ܭM(ll̪*HGTu}K2Yo H׺~+C Jx#myg <;*&gׯ- ]IHk_)K}_) {9^ H&+>Bfk*6_+>\r?«[`01ز-B@@@HROOc'mYR81i#P{Ujpb3dfAcd(>y?͟@tcTp 'ThΚw;ΒXG0"V5q?}Bo͋UX.v֯yNh#TJY,+qEiw7^P<,!Ű(FŖ+:RߐO[Cc^ּ6FrK|xᣅB=BGd |^3끸U9\Z  HI1x4&b輀q*#I]ȚvMS ܽ9f䒙i0AHw@J=׬PW;l1W=QWӳst011[>Ydl>-Dڗ]}}0Cw6=]-lشY:?asü^GP)kOvpVmJjYf[LmZiap)C?qE[?5`5+W=<@\1cb|-ւ挀_NHA 7EK? 6-l$zUgDFwזK^. )W[i?-CKF#PK_DfrSmȠz"E92E#! Mmyym{)R"&sʷxJa6n0[BEGЁ2?MbUcҨʇ暾N#%'Z -Gx"A.̊{]匤53.u0T@1C$Yjy(v$!H#.vFRвl9Һk.N[e3KY,;/!kHî̻aG^s5U)ќkL߅Eh?紧^Ά@FiL@C&TRzA5no]S7-]6t!Ҩ0OX='CՓHI*4PHCt$Ҷ!Q+AD7DBZU(~de| -FzgY"-wAJ8u<_'D:4Mlrud dp$(*TI򜝈E ~j )vY-W}@`kHfqEv.oi4C]oŀ@Y-ChÅ6D#[Ҭ#>pAw0$da" - P fYt$ĀVM3##Y3A4!Wy"b@̥dvՑ% g"Ű\:l9j.tNgu8JjX]&T Wi/`~qdգf۩o\ο {r.²qtenYA-8\jypvec20`0\F0W?h95i{'՝ VKO"wR -,M;;W u -Z#̌͠j|Wᥬt4&!u^ٞ${>TyW,$nVuBzxlܻW,ziz(wu5#1}5+%NJRHDjN.sӽygJY:홓'C]6Y lױwx@E1PC^1e1xC|12 ^oJ p"5]WRܑ3*rI̬5͑>rnNn=Wޡ΀L4xug6ҚwqvIvM!A yxf`MˊۏÝOrCOa]1kpKG @M;RШ'ϯR>stream -HyTSwoɞc [5laQIBHADED2mtFOE.c}08׎8GNg9w߽'0 ֠Jb  - 2y.-;!KZ ^i"L0- @8(r;q7Ly&Qq4j|9 -V)gB0iW8#8wթ8_٥ʨQQj@&A)/g>'Kt;\ ӥ$պFZUn(4T%)뫔0C&Zi8bxEB;Pӓ̹A om?W= -x-[0}y)7ta>jT7@tܛ`q2ʀ&6ZLĄ?_yxg)˔zçLU*uSkSeO4?׸c. R ߁-25 S>ӣVd`rn~Y&+`;A4 A9=-tl`;~p Gp| [`L`< "A YA+Cb(R,*T2B- -ꇆnQt}MA0alSx k&^>0|>_',G!"F$H:R!zFQd?r 9\A&G rQ hE]a4zBgE#H *B=0HIpp0MxJ$D1D, VĭKĻYdE"EI2EBGt4MzNr!YK ?%_&#(0J:EAiQ(()ӔWT6U@P+!~mD eԴ!hӦh/']B/ҏӿ?a0nhF!X8܌kc&5S6lIa2cKMA!E#ƒdV(kel }}Cq9 -N')].uJr - wG xR^[oƜchg`>b$*~ :Eb~,m,-ݖ,Y¬*6X[ݱF=3뭷Y~dó ti zf6~`{v.Ng#{}}jc1X6fm;'_9 r:8q:˜O:ϸ8uJqnv=MmR 4 -n3ܣkGݯz=[==<=GTB(/S,]6*-W:#7*e^YDY}UjAyT`#D="b{ų+ʯ:!kJ4Gmt}uC%K7YVfFY .=b?SƕƩȺy چ k5%4m7lqlioZlG+Zz͹mzy]?uuw|"űNwW&e֥ﺱ*|j5kyݭǯg^ykEklD_p߶7Dmo꿻1ml{Mś nLl<9O[$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! -zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km endstream endobj 17 0 obj<>stream -Adobed     - -    $&&&$++++++++++   - - - -    l|" -  - s!1AQa"q2B#R3b$r%C4Scs5D'6Tdt& -EFVU(eufv7GWgw8HXhx)9IYiy*:JZjzm!1AQa"q2#BRbr3$4CS%cs5DT -&6E'dtU7()󄔤euFVfvGWgw8HXhx9IYiy*:JZjz ?9f]$$`;sjRܒ-?>'Wr>yN|R~.*MT%1H%aɆL=HDCjͨ(y.YAߌ`/L&h*IOq&S"bFbEiZNߺc -bgZn潺m6;#} -~aFJIagxx_cx+Z %P>I'{nlj6dGqYK= cv9)sT͛6nfTRheǨ:ӹPdHj'űeca3C!bш^رTvܓ%|zj(]la-ZnȒ(T'NB$)֘֋z 6FL)Z0͍UsfGl ms>7~vap:U'l7ͮql\wU=Gp|+:.#Hd4v dZݘp'QЄeœI~bI끰Pe#e Jx;dVu24-kHґˠ1D ]7V`!Ne;Ӻf)o&ҤR% -v.:q8n#J\K?N~.5m^GR/GzgFk-/_PI `` ["l\ yC-Y}G!Lbllb{q9~D+f \ l F8^c2K RJqE2S$(HC4QJ q)_l( "ҵkU+KnZ -*r;e"CPpa@1h#|=1@KSqظl Z< 0Smz%_HHjSPup -IGR|pIpkigނb|M %cJy&)]&hg$|00Sc1x H91ݶ ixrV8nXŹx;cǃf!Ihi`pӐ> rt*ܰ8|rsEI ED0ˊoh䵚[9~>y&­_ލOk鑍!durWI>@|KJ,SM\}b1-5śdI͕bce>׿\z^Wӆxk endstream endobj 18 0 obj<>stream -H OAg4 be2,u„yŘH2;Evy69^XgYILH\`c+$88(=}/=]7;ZN4n~E풪svJ6gY)Xx5735#"HkI!&I@?&&#*%,ሃ[a@ endstream endobj 19 0 obj<> endobj 20 0 obj<> endobj 21 0 obj<>stream -HOAߟP UӊaƜSscFQC -%~|/ʲͰINJfbd`gceaIANF#V4nAA2fbltMQϫ9 Y5sRg$O'DDd~a endstream endobj 22 0 obj<> endobj 23 0 obj<> endobj 24 0 obj<>stream -HOA߮a CVUrz^atk9B#}ġΡ_ȮĶF`S7:*OeEyGf1Q&aB  ӽޯyuEs$;u5+ e3 񌒑AO^GNKVCF͓ q bL endstream endobj 25 0 obj<> endobj 26 0 obj<> endobj 27 0 obj<>stream -HOA?IV-Lj:cZϕ#YG͛(kj*K-˳{'wmM$R I`g0b1AN=;ڷnh^Ӹn%U U3e#%E=y9#JcR*G$r b endstream endobj 28 0 obj<> endobj 29 0 obj<> endobj 30 0 obj<>stream -H7ڍ B*'[1G3mB kc endstream endobj 31 0 obj<> endobj 32 0 obj<> endobj 33 0 obj<>stream -Hڅ܉`oǍ7L"-їP` k endstream endobj 34 0 obj<> endobj 35 0 obj<> endobj 36 0 obj<>stream -Hs'qhcAߑ6|V@k endstream endobj 37 0 obj<> endobj 38 0 obj<> endobj 39 0 obj<>stream -H^s'h>c;چF)l6 endstream endobj 40 0 obj<> endobj 41 0 obj<> endobj 42 0 obj<>stream -HVX<: 7l endstream endobj 43 0 obj<> endobj 44 0 obj<> endobj 45 0 obj<>stream -H?߰߯ܭ۫۫٩ب֦եդҢѡПϞΜ̛˙ʘȗǖƔœÑ ~}{{ `3 endstream endobj 46 0 obj<> endobj 47 0 obj<> endobj 48 0 obj<>stream -H?߰߯ޮܬ۫٩با֦դԣҢѠϟΝΜ̛˙ɘȖǖƔĒѐ - }| `| endstream endobj 49 0 obj<> endobj 50 0 obj<> endobj 51 0 obj<>stream -H OAѯVSK{X+,knyyj,ZZ,X9cqQ'y9YziI: cF O o׼:yفlGQtAJSOXH2> endobj 53 0 obj<> endobj 54 0 obj<>stream -HK/2J2s`) MQILL4"̙{:"HHBR$2|Ģ˟oyy:5LK|2e=[Q(/0k!]x\?G - <4OisQ;l_)V VYx-gYϚ72Gi3uHe`;S zh:,a( endstream endobj 55 0 obj<> endobj 56 0 obj<> endobj 57 0 obj<>stream -H /BѯUS \M #ZXd ]nSݒe+ 3n2n0VT-SWY3xM9Ɠc0!ܞ=sD琛\qKOkKm.{<6np좴NIAΙM3k2eHF\.LEsڐY  Ga~ endstream endobj 58 0 obj<> endobj 59 0 obj<> endobj 60 0 obj<>stream -H O2d"+V9rsMƔ"z"<,;mMu8W~#B4WO?/c#7CC'O>йmeyGw jf&T ()kiȪTJ2 -җd$$.K=#,_|cb endstream endobj 61 0 obj<> endobj 62 0 obj<> endobj 63 0 obj<>stream -H OueE˵0Hss12WzK99)1!>_]]mMuU,}̼L=LL\]  >YZih|anJUϏ e %53y%9Gܓ#~K5 a1+" c endstream endobj 64 0 obj<> endobj 65 0 obj<> endobj 66 0 obj<>stream -H‰OAQs+esX/=ɕQ93RlIlDV1Q~~_XD -1 2 03120t3pws}>i?Ѳ|=;jVTn([0S2Q4R4PГ&#{E)-$5Hj$oJg -brr^Od 0&dQ endstream endobj 67 0 obj<> endobj 68 0 obj<> endobj 69 0 obj<>stream -HOм!bʔ%;R9E7BM<{¶ʶ¿̦̟ouqg'E=-if)7|%fr@39óA(SzaBtNh|DGKÓŅzHŁlFيdA2S:h`` / 0Jd endstream endobj 70 0 obj<> endobj 71 0 obj<> endobj 72 0 obj<>stream -HiSQFn Ck0ֶkD1nr6y..VOf#~c-b%JLxeg'4$8(0?{LGK÷{D{RdhJB.x?G=C=%k&cB1>A>F:B2 I" `meh endstream endobj 73 0 obj<> endobj 74 0 obj<> endobj 75 0 obj<>stream -HOqJ5bLˑur&W2W25ǾϞ;ssSI<8Hsl3lObd`*.XFyaafA&~>y/C8pws}A·Eli=R}GGQ|KIKQCAt"$*e endstream endobj 76 0 obj<> endobj 77 0 obj<> endobj 78 0 obj<>stream -HOqbVއy3u/T;ywBZgWcgjFuE\e" V+=;&YFiF)$8[:״h_Һf 3#,vJ/ cG<EÇq~EFq!;f| endstream endobj 79 0 obj<> endobj 80 0 obj<> endobj 81 0 obj<>stream -H SaRQ\Sc)wm, -I6vy:!a* -lo ^`'**we̓,gi -vd kW0K|Q(~}m734\4Nx?(;HlTxR`f endstream endobj 82 0 obj<> endobj 83 0 obj<> endobj 84 0 obj<>stream -H K1TQHT̃BGV(n>v2M\~S19tWXPWv/lٖ扵JcYdY`(,Oi{iSL|%g;~ʛuu0 J?B/LO  -%M? 5/5Í +g endstream endobj 85 0 obj<> endobj 86 0 obj<> endobj 87 0 obj<>stream -H…NBa_A2rhƝrҭĕs-s9q8J E5eafbd7O\\_>,C,< cg^O <]\t(;m+- -3M3G&jFz*:C_+h endstream endobj 88 0 obj<> endobj 89 0 obj<> endobj 90 0 obj<>stream -H‹O_VKl+L,eZbgg']tmVKT+1߾ƴDe2*3c/W_7ONvV8_1>Dޣ4oa^x |3TOЂhT<P?C9@rOCM~oƥ:3}9O$W ҦQ0M$Zע`1_7a endstream endobj 91 0 obj<> endobj 92 0 obj<> endobj 93 0 obj<>stream -H‰OA_&SiʬV+ṯ!{-ce\+s4߾IJBd.20-W$8(0 M?E?O^^_!>|xi{h=tӼqGW銚Nmx:%o%g!kY˘e&yʸ> endobj 95 0 obj<> endobj 96 0 obj<>stream -H /&gZ5b7Xbe,N%.]3-sCanÐy l&?&_|^L_-qOx-9S£̃!m]nq8{\rC3Ec˭Iu8z } -e*K-RE=ꂷ4?t*pa<;fƲG %4)TOdb| endstream endobj 97 0 obj<> endobj 98 0 obj<> endobj 99 0 obj<>stream -H KObJ.J@CEy0\0$%+Bh7ט?2S֘(U -2"}D7_ 4?"I|iҺ=L#D#[W?/7ԯ|hh> endobj 101 0 obj<> endobj 102 0 obj<>stream -H‹Oizk=T2j1S׹:ղ^XBZ߾P緆a^]aPГ,(x?Vf/)xJQRfccaMhAT(Q|^˙*NVldm/,Ms 3Yaqr 0c. endstream endobj 103 0 obj<> endobj 104 0 obj<> endobj 105 0 obj<>stream -H‰OA_X1r4cr_y5VˤDLaY|V;""u5U~*K̊L |12f3ŇH`= F z缞rJ(0O<yhi"yup!:;SQR9Oi. yF,˚"mPvTIS_i5c endstream endobj 106 0 obj<> endobj 107 0 obj<> endobj 108 0 obj<>stream -H‰OA_,^JQ,15xXQcm%5E6"%EV~,s,|gJ0312fA~^n^o. ';근:H7TyBQRdhFpγ )aT8QƵر:z 0c endstream endobj 109 0 obj<> endobj 110 0 obj<> endobj 111 0 obj<>stream -HOכ3DUJ09w^w.cyf 2k[fWb--)ɳβʰX,,)fIL_$>3DGKjܼߡݢPuQqQvR -ՁjGDQ352ҹ^<;L ct2*d8 endstream endobj 112 0 obj<> endobj 113 0 obj<> endobj 114 0 obj<>stream -H‰OA៴#a(9<=^sUαs,}C2{;;[MuUeEyYY?LbL# _Bt|?KCM#jvj|!ېT,-HH7͈&D#5Y-"9I]*ӄ,~q~`1d endstream endobj 115 0 obj<> endobj 116 0 obj<> endobj 117 0 obj<>stream -H‹k߰6^zt=ti#44Hv$-5+U 3J&F -򆫜^%ԂN^K:d endstream endobj 118 0 obj<> endobj 119 0 obj<> endobj 120 0 obj<>stream -H‡nA߁*ym%f.JVksѸFQ#ɹskk˛h endstream endobj 121 0 obj<> endobj 122 0 obj<> endobj 123 0 obj<>stream -H‡nAJQ#X!h{S\F;9*_(s/[kA^s?-)$v 8jmMT#*2"gcceau3r1r2~3p0ӷѳkcILLD(jRѣK` i endstream endobj 124 0 obj<> endobj 125 0 obj<> endobj 126 0 obj<>stream -H -@wc؊X(݁kw~ʧ"e^%%Eysgd9I`ۨDX*2(#gnj'cQv M- 0vi endstream endobj 127 0 obj<> endobj 128 0 obj<> endobj 129 0 obj<>stream -H`!*V{ -1jTh}c#vpOl`7ـ!pVf fy>p!FFIc#xUKQB܏U/T S j5 endstream endobj 130 0 obj<> endobj 131 0 obj<> endobj 132 0 obj<>stream -HiB9 0' 7ெw]vT8~a`7*+5pe\dk|C%Xpwyls:ff -`CR"zz s(O#`j endstream endobj 133 0 obj<> endobj 134 0 obj<> endobj 135 0 obj<>stream -H`bbOԨM{ooO~mjlh{CҮaW嵂U*qQ<ǜtzcK akK endstream endobj 136 0 obj<> endobj 137 0 obj<> endobj 138 0 obj<>stream -HWP(v4N,_A1*X{d" ќÙ:߄&>&c#C~ ˏlĥq58VPf}wEcZfJd;[RƱ1 k endstream endobj 139 0 obj<> endobj 140 0 obj<> endobj 141 0 obj<>stream -H,P]-v슁X ,$$k%163S~N8#!n}\{S-oؗUxvpKpd<2VV1Rl[ endstream endobj 142 0 obj<> endobj 143 0 obj<> endobj 144 0 obj<>stream -H,‰P_d%_ $;%ww5||朹H]|gQ 1F}~6=ܻE 7k/->7cZDXA6WxW歮%6 Vl endstream endobj 145 0 obj<> endobj 146 0 obj<> endobj 147 0 obj<>stream -H,‹B`/&ˡ! -SjB="#Hw8'_އ5+z]8TۼॉW_沊~a{mu endstream endobj 148 0 obj<> endobj 149 0 obj<> endobj 150 0 obj<>stream -HyKpZ]hL4osNF#5oLԒ\nةVa[ƦO"++<_Yfif)I& / c |J%zb7G {;BbvPl`04ѯ}h^K((gNPP9rCgea endstream endobj 151 0 obj<> endobj 152 0 obj<> endobj 153 0 obj<>stream -H{kAq{in!D6zpD؆Xj\\UXXPa_f+YX|//.rf0K3M1I?qc|EF0z=G};hOZM ՍfjblAydF6!)>n e endstream endobj 154 0 obj<> endobj 155 0 obj<> endobj 156 0 obj<>stream -H‰n_\qL}VMl A\A|rUƳI(pho_ʶ¦̦ĺȺ*2""<<,4a01e1B|y|МhoWg$;'Dၦf3 endstream endobj 157 0 obj<> endobj 158 0 obj<> endobj 159 0 obj<>stream -H o`3Ĥ2g0mW -܋s\\\t: -GpٗdW6yr2o}yYiI;#1D鿉0[4}4^0<nBw;> endobj 161 0 obj<> endobj 162 0 obj<>stream -H,‹N`KVl%oj5Ye5FEʿyv[ W*OW[nSCf# -߰fqż.1x;,a)OY>38D'hqJ~Fg endstream endobj 163 0 obj<> endobj 164 0 obj<> endobj 165 0 obj<>stream -H o`a1q!&s+ZFhʔO{=sVW98*X2]~;<šAb/࣎Yì^(av:*'.,3,4DO8Z -8"¼9C~><(d7 Tg} endstream endobj 166 0 obj<> endobj 167 0 obj<> endobj 168 0 obj<>stream -H, a2#{D\f㓧GW;m -/gS| (g endstream endobj 169 0 obj<> endobj 170 0 obj<> endobj 171 0 obj<>stream -H‡ -A_ B5" Dkm_ʻ!_u^5U -{{[kkKsScc}mBnrce00'G^n.wʞCvtlhV4liQMF~ )hQ endstream endobj 172 0 obj<> endobj 173 0 obj<> endobj 174 0 obj<>stream -H, o q HQUL8戫[hO[ak\;\nm<596[* -fSG廄Q(S*l9Vr$Yif|4$8.G1>>0,C-k~C{t/Hh endstream endobj 175 0 obj<> endobj 176 0 obj<> endobj 177 0 obj<>stream -H,‡ -ACff{F\#7.7~5 -2"<> endobj 179 0 obj<> endobj 180 0 obj<>stream -H,‹P#bB%&oP^ -Wt,KMs\?gH'\>1.#.C!>Çow9kZH-:`m endstream endobj 181 0 obj<> endobj 182 0 obj<> endobj 183 0 obj<>stream -H4‰B`/d$YAyTv3י#r7W}bb#B}y[665~g6xo5zxbqO~. n endstream endobj 184 0 obj<> endobj 185 0 obj<> endobj 186 0 obj<>stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|X]To endstream endobj 187 0 obj<> endobj 188 0 obj<> endobj 189 0 obj<>stream -HD03I>: r :(=e$%VQs<2}&/\RBѧQ~{զV16z%Uo endstream endobj 190 0 obj<> endobj 191 0 obj<> endobj 192 0 obj<>stream -HL0 QeЭ\N *%oN)>=[׈/٧'x|;xPm[3 hU> )Yp+ endstream endobj 193 0 obj<> endobj 194 0 obj<> endobj 195 0 obj<>stream -HT‡ @ʎ% `/ihǻljanw)̟s2;Mtc:F#Lp endstream endobj 196 0 obj<> endobj 197 0 obj<> endobj 198 0 obj<>stream -HT [ -8%pUˡj>cr`: \n2Yѵd"g -0qqH endstream endobj 199 0 obj<> endobj 200 0 obj<> endobj 201 0 obj<>stream -H\W P8e,B1 $oOS߳#䁸GWͯ[ צTy`q endstream endobj 202 0 obj<> endobj 203 0 obj<> endobj 204 0 obj<>stream -Hl @Ay5Bf'=7pwY5IQ(#s0BrY endstream endobj 205 0 obj<> endobj 206 0 obj<> endobj 207 0 obj<>stream -Ht ?M]P>e.w&NhN[jJr endstream endobj 208 0 obj<> endobj 209 0 obj<> endobj 210 0 obj<>stream -Hl н͢*Gav}󂅐n)ߵ^ʇ{k5éSI> rn endstream endobj 211 0 obj<> endobj 212 0 obj<> endobj 213 0 obj<>stream -H?].#пK0tŁ\~guł~NC0~ 5r endstream endobj 214 0 obj<> endobj 215 0 obj<> endobj 216 0 obj<>stream -H?].Et/s}~ÆDsX endstream endobj 217 0 obj<> endobj 218 0 obj<> endobj 219 0 obj<>stream -H?]!]FG.aX_џ DA9s endstream endobj 220 0 obj<> endobj 221 0 obj<> endobj 222 0 obj<>stream -H?2B:]$ -t7 endstream endobj 223 0 obj<> endobj 224 0 obj<> endobj 225 0 obj<>stream -H?.t^2%IXt endstream endobj 226 0 obj<> endobj 227 0 obj<> endobj 228 0 obj<>stream -H?~}zxvsqol j -h f c `^\YWTQ c endstream endobj 229 0 obj<> endobj 230 0 obj<> endobj 231 0 obj<>stream -H, -@w{X݁.ZhM:|VZA-({[k^^r2䐐8(\XY'^&nF.9tJŁb}+} =$;_m=-0i endstream endobj 232 0 obj<> endobj 233 0 obj<> endobj 234 0 obj<>stream -H, dwfENct0-&zwW]>k> endobj 236 0 obj<> endobj 237 0 obj<>stream -H,‹ -`&& 36ȝ22b?r:‚Cwxxkη:U.8e8%>88-`m7Ӽy)cyg LO> endobj 239 0 obj<> endobj 240 0 obj<>stream -H,`o"f=h46%iK?#1!Nvv6^ -?x4جÔqq¨̗E<98dx]o$J2Z ZVPCguj endstream endobj 241 0 obj<> endobj 242 0 obj<> endobj 243 0 obj<>stream -HP_ 5k/B̒ ד#,)``>{xu> endobj 245 0 obj<> endobj 246 0 obj<>stream -H,PŖڤ?jB|'7K壿;[i4xuj{U*.cE.j^L&߬eئ٤:)VUL. 0Gg9 3 1F~9` Lk endstream endobj 247 0 obj<> endobj 248 0 obj<> endobj 249 0 obj<>stream -H$QE?Cmg;(1ZYX;~wm=͖MUu5]eK<u,>]V 7iS\%Lpa5q4I'*Dl5 endstream endobj 250 0 obj<> endobj 251 0 obj<> endobj 252 0 obj<>stream -H,‰c_C -&ehZtΜll-WHHHdlsd9M9'?Eh{¯1?G!Joqԕ|h&:5Ux[fT 0Gl endstream endobj 253 0 obj<> endobj 254 0 obj<> endobj 255 0 obj<>stream -H,‰@} -%rT捹. [J,9DŽ&|C\Dg'Iqڼo!jrP:vU+elKFOc m endstream endobj 256 0 obj<> endobj 257 0 obj<> endobj 258 0 obj<>stream -H4PE8j -/ggd }>>Znr 7RsMOU=VLW+EEt5-Vˌ.Q7dY\$W}m endstream endobj 259 0 obj<> endobj 260 0 obj<> endobj 261 0 obj<>stream -H?]пKE9t: s endstream endobj 262 0 obj<> endobj 263 0 obj<> endobj 264 0 obj<>stream -H?2CIC..^ Bt endstream endobj 265 0 obj<> endobj 266 0 obj<> endobj 267 0 obj<>stream -H?.tLC :tx endstream endobj 268 0 obj<> endobj 269 0 obj<> endobj 270 0 obj<>stream -H?ީܧ٣ס֟Ӝљϗ͕˒ɏǍŋÉ|zxvsqomjhfda_ ] [ -X W U S P O M K H F E CA? 0Q endstream endobj 271 0 obj<> endobj 272 0 obj<> endobj 273 0 obj<>stream -H?ߪܧڤآנԝқИΖ͔ʑȎƌĊ‡~|ywurpnljhfca_ ] [ -X W U S P O M K I G E CA [TRn endstream endobj 274 0 obj<> endobj 275 0 obj<> endobj 276 0 obj<>stream -H?߫ݨۦ٣ס֟Ӝљϗ͕˒ɐǎŋÉ}{ywurpnljheca_ ] [ -X W U S Q O M K I G F D  6S endstream endobj 277 0 obj<> endobj 278 0 obj<> endobj 279 0 obj<>stream -H?ީܧڤآ֟ԝқИΖ͔ʑɏƌĊÈ}{xvtrpnljgeca_ ] [ -Y -W U S Q P N L J H F  S endstream endobj 280 0 obj<> endobj 281 0 obj<> endobj 282 0 obj<>stream -H?ߪݧۦأנԞӜљϗ͕˒ɐȎƌĊ‡~|zxvsqonligeca_ ] [ -Y -W V T R P N L J H  ٽT< endstream endobj 283 0 obj<> endobj 284 0 obj<> endobj 285 0 obj<>stream -H?߫ݨۦ٣ס֟ԝқИΖ͔ʑɏǍŋÉ~|zxvsqomkigeca_ ] [ -Y -W V T R P O M K  AT endstream endobj 286 0 obj<> endobj 287 0 obj<> endobj 288 0 obj<>stream -H?ީܧڤآנԞӜљϗ͕̓ɐȎƌĊÈ}{ywusqomljhfdb` ^ \ -Z -X W U S Q O N  )Uq endstream endobj 289 0 obj<> endobj 290 0 obj<> endobj 291 0 obj<>stream -H4@H 5>!Th ;g9}~SrK?_1sC]SCz_[}\y;b1k^ c~ZBiP?to_km endstream endobj 292 0 obj<> endobj 293 0 obj<> endobj 294 0 obj<>stream -H4D)(yUb$; +iAgD@kW~p/oi5rMoT+,e ^``no endstream endobj 295 0 obj<> endobj 296 0 obj<> endobj 297 0 obj<>stream -H<0# h5X@"G›gOfg+xj<%B634 -z' -iQ8G4Gdn endstream endobj 298 0 obj<> endobj 299 0 obj<> endobj 300 0 obj<>stream -HD BP31D%$Ւ}c==1=;X@/]ix់zFQx[KGn ya`oR endstream endobj 301 0 obj<> endobj 302 0 obj<> endobj 303 0 obj<>stream -HD… @ ?t !p;R|#pVϢK'6,nB5{[ZTq#o endstream endobj 304 0 obj<> endobj 305 0 obj<> endobj 306 0 obj<>stream -HD… R1ꮔpBk\sw^) G$ llW6_=ureƿ [v[VFO*p3 endstream endobj 307 0 obj<> endobj 308 0 obj<> endobj 309 0 obj<>stream -HT YnE)/zPŲYۏU҂9|h7|}H$p endstream endobj 310 0 obj<> endobj 311 0 obj<> endobj 312 0 obj<>stream -HT@0wkQAY@״峰[FS&TaQ؞HCuѾ\ c]q endstream endobj 313 0 obj<> endobj 314 0 obj<> endobj 315 0 obj<>stream -HT ذDaH_N;ugWǶ*<,cC+q/ӭ`s|Oq endstream endobj 316 0 obj<> endobj 317 0 obj<> endobj 318 0 obj<>stream -HdQPLTI`M8 ۿWx%}$s/ONq endstream endobj 319 0 obj<> endobj 320 0 obj<> endobj 321 0 obj<>stream -H?߫ݨۦ٣ס֟ԝқИΖ͔˒ɐȎƌĊ‡}{ywusqonljhfdb`^ \ -Z -X W U S Q P  XV endstream endobj 322 0 obj<> endobj 323 0 obj<> endobj 324 0 obj<>stream -H?ީܧڤآנ՞ӜҚИΖ͔ʑɏǍŋÉ}{ywusqonljhfdb`_ ] [ -Y -W V T R  V endstream endobj 325 0 obj<> endobj 326 0 obj<> endobj 327 0 obj<>stream -H?ߪݨۦ٣ס֟ԝӛљϗ͕̓ɐɏǍŋÉ}{ywusqpnljhgeca_ ] [ -Z -X W U  7WD endstream endobj 328 0 obj<> endobj 329 0 obj<> endobj 330 0 obj<>stream -H?ީܧڤآס֟ӜқИΖ͔˒ɐȎƌŋÉ}{ywvsrpnmkigedb`^ \ -Z -Y -W  ٔW endstream endobj 331 0 obj<> endobj 332 0 obj<> endobj 333 0 obj<>stream -H?ߪݨۦ٣آנԝӜҚИΖ͔ʑɐȎƌĊÉ}{yxvtrpomkjhfdba_ ] [ -Z - 2X endstream endobj 334 0 obj<> endobj 335 0 obj<> endobj 336 0 obj<>stream -H?ީܧڤ٣ס֟ԝӛљϗΕ͔ʑɏȎƌĊÉ}{zxvurqonljhgecb`^ \ - 1Y# endstream endobj 337 0 obj<> endobj 338 0 obj<> endobj 339 0 obj<>stream -H?ߪݨۦڤآנ֟Ӝқљϗ͕̓ʑɏȎƌĊÉ}|zxwusqpnmkihfdca_  `Y endstream endobj 340 0 obj<> endobj 341 0 obj<> endobj 342 0 obj<>stream -HJ@6R% B#ĈHth)**QjJ)E%! -[:2?*%.Ty?MLk,4χ<%h4> endobj 344 0 obj<> endobj 345 0 obj<>stream -HJ@||Q$"$QJ"Fɘ([FJij$FEHL0+wuz'wS>5>zH7MG-Y)I+A}hĨGPݥ607[׹Z -erA-9Y$uue"yFHҴUĄ=tV[ endstream endobj 346 0 obj<> endobj 347 0 obj<> endobj 348 0 obj<>stream -H kAϮ-2ɲ֚&<2l D-s2E/s2yfd"210 3 rtpuG׼_Qt9gOɝ>&eD҈xh@Г=>{v WK^̣MsC` \I endstream endobj 349 0 obj<> endobj 350 0 obj<> endobj 351 0 obj<>stream -H/яfVcceYf5cdiWRW.1iVVƚ'&cC yWs2tt/h|ӌ!ш.vkcajGTyQ9 .[oR@ s맰Fǵ*.,,Z 9Oƒ<<˙if"<)!b 0@$] endstream endobj 352 0 obj<> endobj 353 0 obj<> endobj 354 0 obj<>stream -HOA_,ee iѦ5Ŝ#y<{1 c9,%U"{~LLwr ''3G+.y9m/Oݴhp!; #9TlT-LG Փ9 f -]bj";U7-ſo] endstream endobj 355 0 obj<> endobj 356 0 obj<> endobj 357 0 obj<>stream -H /᷿lVV1MkYh;Cׇ[r"&K Sư|tna[|UHo* -/%e"O"mqI7m7\gZrIg+qN1h,Ǩ/PR26K9 aA~${^v=n -.v' ^W endstream endobj 358 0 obj<> endobj 359 0 obj<> endobj 360 0 obj<>stream -H OO4-cZ14b&Be45x]]: -"<Y~3,D~R|'ŘF3 #7;F zxEIANƓ5M 3+TL /ȝEԐVRP8#@8%vBT΃1a)# 0 _ endstream endobj 361 0 obj<> endobj 362 0 obj<> endobj 363 0 obj<>stream -HOߟmb&&3MiG^w71# ͳV5 }߾žζ_oUF-S:ϗJ3G4G ḅ"LLz0 @O4<_Qzr@#QQRtJތtx`B05ѓ>"uHRGBK_ endstream endobj 364 0 obj<> endobj 365 0 obj<> endobj 366 0 obj<>stream -H O3bŒ1L-S劐|Ṯ.YgWc'}fSf]bUeY~S3K0103 -1 2ѻ{ _^>=|\~EMEI󒆃oyQ=C8E8blLDH@^O-i Cj*Jb -r"2%E(>`q endstream endobj 367 0 obj<> endobj 368 0 obj<> endobj 369 0 obj<>stream -H O12a)[1b0D35BcCb9TTXP^`/6oMuUeEWQ#BLLL|0~fcM#v>iѰQjbldxC` ']KVC抷KjR*J -rb2bR"b"BUua' endstream endobj 370 0 obj<> endobj 371 0 obj<> endobj 372 0 obj<>stream -HOA߿N+dX#j9s2QX1WC&|ߡAb_Nd+WdS`gc72yYiI  ?~} <@//m7w\44|ynvCŊdAld͈x`@SQВא$&sAZEꜤSb'DDd$a endstream endobj 373 0 obj<> endobj 374 0 obj<> endobj 375 0 obj<>stream -H OsaV0Hs_9Qm#dʩ©_oC}}]4$8(,"BLLL}< 9:ih==;V-̼()xUAxEᒼ )q 11/" b endstream endobj 376 0 obj<> endobj 377 0 obj<> endobj 378 0 obj<>stream -HOA\hu0jēcO#!̕|TF*/cO7O$_/llqV,,"|>13 1 2 03120p3pw{c=;и튺%9Zgd4դT$$NNˉ;"* > endobj 380 0 obj<> endobj 381 0 obj<>stream -HOA/:13-/{Fc+KdvE -e+C`bU8Qa!fwLL| !dD2ӓ!j5dHF8 _c endstream endobj 382 0 obj<> endobj 383 0 obj<> endobj 384 0 obj<>stream -H‰OAIE9ZYG9r3˱}"}}]?m$kuUeE ?fL<~ŒB|ysuqvrдӰQRP5S1vCH@IOAGAtM^CNM -񂴒Wsgr'e?7d endstream endobj 385 0 obj<> endobj 386 0 obj<> endobj 387 0 obj<>stream -HOq&9b9j+u{T$r99 rgKmM+/&X%XED 31 2 03120t'\:8hӺianvKBLDHF0 둯)kiȪ\!.yW  q er endstream endobj 388 0 obj<> endobj 389 0 obj<> endobj 390 0 obj<>stream -HiS b"L*k(vȑsl9:X4VgWaWBPl ?: %2]M;W#(;>"ȷa7^1dpA?D/Hnw?3:>^ZpSwꤶLA΋dE )(:r 0f1 endstream endobj 391 0 obj<> endobj 392 0 obj<> endobj 393 0 obj<>stream -H Sabdr4GQE"ǢiIfiyvl+l_f#Q\=`0,-XaVL2M0ݠТ|Dx31: 2F _ѻ킎9.化XR=+((#`f endstream endobj 394 0 obj<> endobj 395 0 obj<> endobj 396 0 obj<>stream -H‡nQ"6AЊ+ߦjj=9*2/WI|y[kKKZOqNrJrLps ߬B,,,}|LL> endobj 398 0 obj<> endobj 399 0 obj<>stream -H Sa%9R;a*q*3ϩ©̱d.W7!>.+n3llY+ g$FiI820= ~>{;4ķՃz˗ kŇC_Qf6+e g, hW endstream endobj 400 0 obj<> endobj 401 0 obj<> endobj 402 0 obj<>stream -Ho 5⌳BTcTko68ɣ7_kM^Uo<9S1!>..6&!c|>ɏ(0KY1$cea2P9:*+䫕E̴h 0_i endstream endobj 403 0 obj<> endobj 404 0 obj<> endobj 405 0 obj<>stream -H -@wc؍(`Zݹau5wWgG{A咑4'ucC}Bbll"rf %NFj; @mogk=m=-ljih 04i endstream endobj 406 0 obj<> endobj 407 0 obj<> endobj 408 0 obj<>stream -HE@wA -).ŊK:ے|7x&Uyp/s+kkK1)1#4zC}BrcZ-bdd`gc337SQaQm ,o=j endstream endobj 409 0 obj<> endobj 410 0 obj<> endobj 411 0 obj<>stream -H?]ѿK"vv - CbG?OcG?N# r endstream endobj 412 0 obj<> endobj 413 0 obj<> endobj 414 0 obj<>stream -H?]пKxE9,7*u s endstream endobj 415 0 obj<> endobj 416 0 obj<> endobj 417 0 obj<>stream -H?.S]]ć .ltM endstream endobj 418 0 obj<> endobj 419 0 obj<> endobj 420 0 obj<>stream -H0J8 R]@Fmێ+|^88yX?n`ۏM?nͯhiO&.iT $-pG9DaDb͋T7T%DDL ;w߾ -U[PXyqr) endstream endobj 421 0 obj<> endobj 422 0 obj<> endobj 423 0 obj<>stream -H?߭ޫݩܨۧڦأע֡՟ԝӜћЙϘΖ͕̓ʒɐȏǎƍĊ É ˆ ~||zxw >` endstream endobj 424 0 obj<> endobj 425 0 obj<> endobj 426 0 obj<>stream -H?߫ުݨۧڦ٤أס֠՞ӜҜњИϗΖ̔˓ʒɐȎǍƌ Ċ É ‡ ~|{zx 2` endstream endobj 427 0 obj<> endobj 428 0 obj<> endobj 429 0 obj<>stream -H`DjWFc_Z &ij:=]:|k*[& Vq}" -P9,ޤyJ&Nc)c"X0RL4?kW endstream endobj 430 0 obj<> endobj 431 0 obj<> endobj 432 0 obj<>stream -H?ުݩܧۦڤ٣ءנ՟ԝӜҚљИϖἘ˒ʑȏȎǍƋ Ċ È ‡ ~~|{y Ia endstream endobj 433 0 obj<> endobj 434 0 obj<> endobj 435 0 obj<>stream -H‰`B Mm4b> endobj 437 0 obj<> endobj 438 0 obj<>stream -H /oihB_kƘKV-YZjZ}_+Z0ްʰ_?|eb=[(/aC<x<zxhrsIIcl\ns&gS]bldh`$o#Y0:֎VƓˢf"G&#SyIhn&TRRSȏf #xa= endstream endobj 439 0 obj<> endobj 440 0 obj<> endobj 441 0 obj<>stream -H,@E4=tt2f.32(G#~}| wyoof7uyT=/qWM>:U^Z^JK;I7!7_Ql endstream endobj 442 0 obj<> endobj 443 0 obj<> endobj 444 0 obj<>stream -H?ߩިܦۥڤ٣ءנ֞ԝӛӛҙИϖἘ˒ˑʐȎȍNj Ɗ -ĉ Ĉ Æ }| /?as endstream endobj 445 0 obj<> endobj 446 0 obj<> endobj 447 0 obj<>stream -H4@sD$* b!Oc1 R5*!%\s?|1# UgyGG/l>y]i6r-m endstream endobj 448 0 obj<> endobj 449 0 obj<> endobj 450 0 obj<>stream -H /Bѯ)SG~o X--LaJq+n鶲a194=-m  ~|_χ3^> endobj 452 0 obj<> endobj 453 0 obj<>stream -H4‹`(SdBFCPI7v3GݠPC">z'۳l\9|hjCEaxOS+,?kt`nQ endstream endobj 454 0 obj<> endobj 455 0 obj<> endobj 456 0 obj<>stream -H,‹B@$J^E,T_"wՓԃ*"hNqW/(#!􀷺ϦK#~|ۼ<]1o endstream endobj 457 0 obj<> endobj 458 0 obj<> endobj 459 0 obj<>stream -HD@0ȨУ"gngE Q-kL9ەGՁƽ7S huh`Ro endstream endobj 460 0 obj<> endobj 461 0 obj<> endobj 462 0 obj<>stream -HD HÆ]O w-qOVx+}J:J r\37%A?0G> endobj 464 0 obj<> endobj 465 0 obj<>stream -HT @ зu$D$2g@wپoVU¥ -8dx -sNqT endstream endobj 466 0 obj<> endobj 467 0 obj<> endobj 468 0 obj<>stream -H\ 1ph+ -~h7މq#=7<߇֕E,`r endstream endobj 469 0 obj<> endobj 470 0 obj<> endobj 471 0 obj<>stream -H /BobafhҢѰhcXVzܺw=%4ZZYΙ> endobj 473 0 obj<> endobj 474 0 obj<>stream -H OAOaSR-ZZ5rha$ J4gggO7OoCAq>b(o^/x9s)O'ixH>0=BԃR.@Oe{v7MN uE1q6)*UjyJ\Rm&a$,ڸY[¼dMXb endstream endobj 475 0 obj<> endobj 476 0 obj<> endobj 477 0 obj<>stream -H O7,J\ZZh)SF1$G4Y,V&Ʉ.W'waA~0!:-4/hv)/.N*'TyvP>tHΓ -<77qFrrd6 Qj]I4&NEQZ5^Z )K EHQ*b& endstream endobj 478 0 obj<> endobj 479 0 obj<> endobj 480 0 obj<>stream -H OA/VhTjԬEZ2hռ].dj12 svKEF"~sd0L1L0яҋ {I93ZA儦1u7G<x@EIu=**vwۡMƭMD̕IRؐgsƹAYWyAL.+:U\,FK^b\ endstream endobj 481 0 obj<> endobj 482 0 obj<> endobj 483 0 obj<>stream -H ‹/_&uXjX1)F-by5nI5y~3K?G^#Py?#^ty>Axq. ZmhlRߠΕK5j\p쿇2U7%ʋ\(8Mӹܬ9;3NO&GKbBu\TDf`hVb endstream endobj 484 0 obj<> endobj 485 0 obj<> endobj 486 0 obj<>stream -H OWKH՚4Y,DS +-5,w[-GSQzfbdK30 J?G ottNhy:! yrSߣˣ> endobj 488 0 obj<> endobj 489 0 obj<>stream -H ‰OAM)jRba-Ԩu,{!re4Zj $"8(~t/9 -/-cGiR;O]JNJw(nţ&9 Y3 &Rܭqk$*VaJ\V28]kU:0/{sb endstream endobj 490 0 obj<> endobj 491 0 obj<> endobj 492 0 obj<>stream -H Oᗆ2Yiֵs>+T:itϞa(}0!~|K9gvBZ44xNvnuכ7(S4S0Q073]#'Jj2 J#kbKZQɄiaa& )c( endstream endobj 493 0 obj<> endobj 494 0 obj<> endobj 495 0 obj<>stream -H‹/GY)V,b%h0XDݝӺVE$j]/CUQ$"4K:)$F#N;93ZQ|0Cxe.;TnQ">HyuJkܭrf2%r^E2dFݣ{Lu+ez圐6izRO 0cW endstream endobj 496 0 obj<> endobj 497 0 obj<> endobj 498 0 obj<>stream -H OW)*bb[d9J9rWd 왧% -řG3cax~5!zAzWнs>=ܴ\44Ψ.PQRP:h``$D@dY˓zq$ZIﬦZbk]ܔ -X0c endstream endobj 499 0 obj<> endobj 500 0 obj<> endobj 501 0 obj<>stream -H‰OA"!̑kc&yMRjDX۷|de!0Yi4;&)~nNd|(|y1ҿwN)o'Fx |D ihyipDr R[S=@!S٣KJBѼCy*m) c endstream endobj 502 0 obj<> endobj 503 0 obj<> endobj 504 0 obj<>stream -H OAab„ƒaVɔu:!ae1 \X{'6u5[i)fILoę\u88(" B b^]?/^|3Z.yJANFDZXx3S7Q:hԼV^$P`c endstream endobj 505 0 obj<> endobj 506 0 obj<> endobj 507 0 obj<>stream -H Oc#цkU}M۰ -{s3%&ؾyeUU(Gafbbd/120r3cbcc}MD󊆑OZaUCE%se%%EQ.:/y$d+ endstream endobj 508 0 obj<> endobj 509 0 obj<> endobj 510 0 obj<>stream -H Oqӈ4Tbja\SF6Rj2gw ykWa̮̾M#y,-S_IIqqJ%s-Wh 8j1B/wHTQtt>d/3Z|titq,;ipf+Sb6 0dd endstream endobj 511 0 obj<> endobj 512 0 obj<> endobj 513 0 obj<>stream -HO/B[ɣWL_$] sט>Hb,&'1QPoQ(a!A7k~|Z/ɍtŷ%]'_E>EZ6>M+ u@ c*G-̼xƽYd endstream endobj 514 0 obj<> endobj 515 0 obj<> endobj 516 0 obj<>stream -HSaB>䣖ֶCiwȑ3gqo]=.SWEysY _i{Z;qq> endobj 518 0 obj<> endobj 519 0 obj<>stream -HSaQܹR+Zl,!`D}yNe%Eyq._mW~ӬS_X%Y=| P1f{wDDkC|2 03xQ<\ 5]lېHW|^ҲкiCkqN( TTϨ`e# endstream endobj 520 0 obj<> endobj 521 0 obj<> endobj 522 0 obj<>stream -HWsQ -F"e6-yː9ܾkKKs5)I>~w6kUeL\DG1 3} 1 203xQ<šw{,l4-44Lԍb@ՀGQyDY]ea endstream endobj 523 0 obj<> endobj 524 0 obj<> endobj 525 0 obj<>stream -HiS0!!qK9u5"R\Te%ES`9`.%I6olr22gEX! 30I͋aȍC'?ҳ&߭tXP(&'e endstream endobj 526 0 obj<> endobj 527 0 obj<> endobj 528 0 obj<>stream -HƒQ ۵l mcq뿝oo̻īȳ >V^qn.q&v&6VFqhfhb`oѕjhhiIU44de endstream endobj 529 0 obj<> endobj 530 0 obj<> endobj 531 0 obj<>stream -H$N@v%{ʔ) - -"ETRV) ˻ X=ybav9[xŨaTW_^d"Zm=ڞ7-W)$je\XDY<0J% Or^) f+ endstream endobj 532 0 obj<> endobj 533 0 obj<> endobj 534 0 obj<>stream -H -'n1fn5[pے&|xUy*<2Z[XZ912ȉbbdw0m,tf:& "fa endstream endobj 535 0 obj<> endobj 536 0 obj<> endobj 537 0 obj<>stream -H‡P 6-BZQOPiBH=9)>x9G^.:jp۸p 4q®XCE `_]9d^XIXJJ"FFa`1f endstream endobj 538 0 obj<> endobj 539 0 obj<> endobj 540 0 obj<>stream -H,Wg=-8d(vm3wg,#^Cw']nKKsr8VU*s(c0(`ٻzV2Z-6)j\*1((0+gee@.}rS?:f endstream endobj 541 0 obj<> endobj 542 0 obj<> endobj 543 0 obj<>stream -H,@@w;IqbJ-5a1ߑ yx&Ͼzx]poK6qNZ\Ǣ<r۬d4+52!8vLH+bgOGg+ endstream endobj 544 0 obj<> endobj 545 0 obj<> endobj 546 0 obj<>stream -H,@#P,ذ{E}b Vl&[⻐xx8"M<&߆|𥏸N:jsh%79h Qg -O-S y_Uyu&R`Sgp endstream endobj 547 0 obj<> endobj 548 0 obj<> endobj 549 0 obj<>stream -H$U`o{lbXKzWn76c^Kd 0_Sg endstream endobj 550 0 obj<> endobj 551 0 obj<> endobj 552 0 obj<>stream -H$UPE3QݭKf"&v|cD.L?S}p/C0}kG/m&vYeK̢n 1svaiK%Y  gg endstream endobj 553 0 obj<> endobj 554 0 obj<> endobj 555 0 obj<>stream -H,WPe ؕ"{Ũ;7o2M&AsqrߖJ.||Ư)?]=sM8c߇|/}ipR|H@+s,h4 endstream endobj 556 0 obj<> endobj 557 0 obj<> endobj 558 0 obj<>stream -H,U6 c-bŇopW% o;ׄ1v xKO}zjvRu&k ;[mED6e-_h{ endstream endobj 559 0 obj<> endobj 560 0 obj<> endobj 561 0 obj<>stream -H?ؼպӶгΰ˭ɪƧģ}zwtqnlie}cz`x]uZr~Wo{TlxRjvNfrLdoIamF^jD\gAXd>Ua;S^9P[5LW2IU0GR-DO)@K&=H#:E 7B3>0;,7'1!) "  cVF endstream endobj 562 0 obj<> endobj 563 0 obj<> endobj 564 0 obj<>stream -H B09Չ10S>Au|' 'uG]$]Lte;!C8ꆚG4~A ppj&F()x?e0+I^QQ'IˆV-]tUuc;02˴˺W endstream endobj 565 0 obj<> endobj 566 0 obj<> endobj 567 0 obj<>stream -H?ީܧۦ٣ءנԞӜҚИϗ͕̓ʑɏǎƌĊÉ~|{ywvtrpomljigedb (Zj endstream endobj 568 0 obj<> endobj 569 0 obj<> endobj 570 0 obj<>stream -HJ@ыf(IF E(D!fKEQTLe#{#bhbDR2;g~`[ -2_E> |gey-@^DG-Њ<OAN?qm͏zDe%7} -{wɹ&EjI'W(kWy%QEM’)8`[ Z endstream endobj 571 0 obj<> endobj 572 0 obj<> endobj 573 0 obj<>stream -HJ@kS)HP$ ,K6T́23L[6iUG2oy)$ͣXa$3> endobj 575 0 obj<> endobj 576 0 obj<>stream -H /S1Y2L3fYʹfIi9Tsk}LQ3h.ӿG/eMsCG-uAC3GS"oA^TT|˓ܔ\mS"$ INjm5+ė,q> endobj 578 0 obj<> endobj 579 0 obj<>stream -H /W?ke̲˘1ej̬Ɩ%Uqn}PjƘV+e - [K3G-N7JG="/ǴC<y@cG=v)Pڦ&7.d7ȬqBz ;وZXMdZG&cpjr, -\D endstream endobj 580 0 obj<> endobj 581 0 obj<> endobj 582 0 obj<>stream -H kAo4mMd-ZdH1]=*-Ҕqa}][m?6E -|YXfXx=[8/1QfwLŒC  oyvrtp oۨYZ(_#)xh` '#{IFKZCJ̓^)J -YD.; -0/?\ endstream endobj 583 0 obj<> endobj 584 0 obj<> endobj 585 0 obj<>stream -HO/oZXZ5ZeZ2r].ՕLHѰZcF6I, IO jtnVih*4d~$"0U||F ^ -n^]y9"{H}R{$$$<۸pM6P׹\CYE^A5#,#,Z .?k -0Q]< endstream endobj 586 0 obj<> endobj 587 0 obj<> endobj 588 0 obj<>stream -HJ@[QFQXRTHa>f/I a9;6 k:?*" -_9ZY LS3͇ zSj q^cTNx9C(GqÎp -a`lclD@]Ba|d H>$/g9'Sr9] endstream endobj 589 0 obj<> endobj 590 0 obj<> endobj 591 0 obj<>stream -HTB R4*A{.kWT1OwZe]ιy|6/᳭-䄳1Cm"5hC=vI?th endstream endobj 592 0 obj<> endobj 593 0 obj<> endobj 594 0 obj<>stream -H4kBP3$G&p9}F?A}NN!>{ o]L`mI2yyAA)k|`i endstream endobj 595 0 obj<> endobj 596 0 obj<> endobj 597 0 obj<>stream -HLY0л JwAN|FO&I|՚ |}0/X\_2:q{#opXiG endstream endobj 598 0 obj<> endobj 599 0 obj<> endobj 600 0 obj<>stream -HLkBPo3A.*P)-~8>Z]-_gc7>LM1'bh3]y<!|@囯.RAi endstream endobj 601 0 obj<> endobj 602 0 obj<> endobj 603 0 obj<>stream -HD@ _ -.~&$vVԲ{gxKdH_h&_zx>8҆Z3_i endstream endobj 604 0 obj<> endobj 605 0 obj<> endobj 606 0 obj<>stream -HT0 0 -=&wȇ3jPϫ, |俻䛞k|RGC`>Υomhpj endstream endobj 607 0 obj<> endobj 608 0 obj<> endobj 609 0 obj<>stream -HTY@0 .)d7Yj~T߽h /4s9 -;H{ 0jV endstream endobj 610 0 obj<> endobj 611 0 obj<> endobj 612 0 obj<>stream -HL0 r9FK;k{XN5W+F -ǷtwZ`s~&TM̧GHC9xj endstream endobj 613 0 obj<> endobj 614 0 obj<> endobj 615 0 obj<>stream -Hl[SܩΜhп'r̞ϣn]ىj -#8j endstream endobj 616 0 obj<> endobj 617 0 obj<> endobj 618 0 obj<>stream -H7 ڍ܅@?v"Hh; -[y3 m``uk" endstream endobj 619 0 obj<> endobj 620 0 obj<> endobj 621 0 obj<>stream -HkAm emk-˹3 Bl9Bf߷W̏_Evllr|Y,X'řƘ|D{y>y}O뎦-u'7T\Qtth``%oLDHڀG%uF q Q5 -AIDAAx/^9 endstream endobj 622 0 obj<> endobj 623 0 obj<> endobj 624 0 obj<>stream -Hk-[hdQ&ҶmggEt[䑅Qhy|ʶƦ -Ey~r|gY%fi)& όEF8_1Qz|ѽsC0 ~T%7 \(NE;3Ȟ [y9F2248ɀQpq-1 {"^ endstream endobj 625 0 obj<> endobj 626 0 obj<> endobj 627 0 obj<>stream -H kWo-G!2լiMbȝ6PP_}]mUeEyY(0 #?C+?n.:/~u;5V*|)()j5jUdHߒ!$qM%!A) gxN8 -0_3 endstream endobj 628 0 obj<> endobj 629 0 obj<> endobj 630 0 obj<>stream -HOߟ¬&&3L+kGns<> endobj 632 0 obj<> endobj 633 0 obj<>stream -HkmEАXBFu;:ĥƐGf4Y &:* -M"?V2,_>%>Dif)L$$3K/J0AZ~>ԼT> endobj 635 0 obj<> endobj 636 0 obj<>stream -H O3XL5&b9fsڗ+ iVx}}]2O -ll -s,3,$'313$䞱7.NZѾuC5f&jWTT t)ג;%{1 )5)#JDeD%D<;` endstream endobj 637 0 obj<> endobj 638 0 obj<> endobj 639 0 obj<>stream - - - - - application/postscript - - - Adobe Illustrator CS2 - 2008-05-07T15:15:31+02:00 - 2008-05-13T12:05:55+02:00 - 2008-05-13T12:05:55+02:00 - - - - 256 - 108 - JPEG - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAbAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWP+ffO2k+SvK175h1MlobVaRQKaPNM20cSV 7se/Yb9sMY2USlQfFHnv8+/zH833Uvq6nLpmmOT6WmWDtDGErssjIVeX35mlegGZMYAONKZLz5Lm 4Sf6wkrrcBuYmDEPyO9eXWuSYPoTyt+bn5kflfdaXb+b7n9P+VdSRHgkeUS3cURAPKNmPqfCCPge q9lIyuUAW2MyOb6o0bWdM1rSrXVdLuFutPvIxLbXCfZZT89wR0IO4O2UEU5AKMwK7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+dP+cz7u4Xy35btFJ+rzXk8 sg7c4ogqfhK2XYmnNyfNl35F822eg/p6702WDTKrWaSiMBIeKMYmIkCMej8eJ8cutppA6J5f1vXb 0WWj2U19dEcjHCpbitacmPRVqep2xtQE787+TPOXl+LTrnzIGDXySLAkjMzx+g3BkcMBTxUrVWG4 JwApIL6I/wCcNvMs915b1zy9M5ZdMuIrm1BP2Uu1YOq+weHl82yrKG3EX0TlLc7FXYql/mC81Cy0 a7vNPgW5ureMypA5IDhd2ApvXjWnvlWeUowJjuQ3aeEZTEZGgUl/L7zwvmrT7iWSJLe8tZOMsCEs ODCqOK+NCPoyjR6rxQb5hyu0ND+XkADcSn+rarY6Tp0+oX0gitrdeTt3PgAO5J2AzJyZBCJkeTh4 sUskhGPMsW8ieddc803FxOdOjtNIhJVZyzM7v+yi9FqBux/rmHpNVPKSaAi5+v0WPAAOK5lmmZ7r HYq7FXYq7FXYq7FXYq7FXYq84/NT88fK/wCX4FpKjalrsic49MhYLxU/ZaaQhvTB7bE+1MNK87g/ Nn/nJPWV+u6P5Lhh09vihEtvMGZT0PKWaLn81UY0qa+S/wDnJWZteXy5+YOjny9qbusQuQskcIkc 0Alimq8Snaj8mHjQb40r3bArxDz5/wA5HSWfmKTyv5F0dvMWsxO0UkwDvEJU+0kcUPxy8f2m5KB7 4aVI5/zY/wCcldJhOo6r5Mgk05BzmVLebkqdz+7nkZKU3LKaDrjSvT/yn/N7QvzE02WS1iay1S0C /XtOkYOUDdHjcBeaGnWg9xiQrPMCuxV2KvGf+cjdPgvLv8vEuChgk8y2lvMkgBQpMw5cq7caLvlu Pq1ZOjA7vzXH+Z/5XazpcqwP5iRHng02CCSCSynt7xEhgeWZ2WZriFiaqF40evtXn1GPDvOQiPMr GBmKAsoXQNTT8n/yqF3JpqTa9fa59UvJpY3FLdU9T1EVzEX/AHalY9+HIt71jh1mHPKsc4y2vYi1 ljlAbhr88dT0zzp+Tul+cVeKS5sNVl0+3vIopIVuITzFVjkPOPmqKzKxbiwIBpvmTHY0wnuLQ/8A zhlcFfN3mC3ptJp6SE1/33MB0/2eDLyTh5vrXKG92KuxV2KvG3UeQfzOD7RaJqvc7IkUrb+w9KQf 8D880f8Ai+f+ifuP6nph/hek/wBsh+j9Y+1vVr3UPzK80JpWnM0XlywblNcUoD2MpB/abpGp+fjh ySlqsnDH6B+L/UjDCOhxccv72XT9H63qkFvpug6L6UEYhsNPhZuK9kQFmO/Unck+ObYCOOG3KIdB KUss7O8pFCeUfMf+ItI/Si2xtoJJXS3Vm5MyIePI0AAJau2Q02fxY8VU2avTeDPguzSdZkOK7FXY q7FXYq7FXYq7FUg8/ea4PKfk7VfMMwDfUIC0MbdHmYhIUP8ArSMoxV4V/wA43/l//iW/v/zJ81D9 IXc10404TgMrTg8pbkqRSqseMf8AKQdtloSr6UwK8Z/5yk8m2Oq/l7Lr4iH6T0N43jnUDm1vLIIp Iye6guH9qe5whU+/JbzDqfmP8nNOuTIW1WK3mshKx3MluWiiYt4lQhJ8cSrxv/nFbzH5Z0PzBrun a9JHYa5eeklpcXZEZPpM/rQcnpxcsVNK/FT2wlX1YrBgGU1U7gjoRkVeTeSPySvPK35par5uttQh XS9R+tBdLijZSiXEgkVa140Vl6DDavWcCuxV2KvHf+cnrAXvlLy7EZmtlHmG05XKU5xhoLhQV9y5 UD3wTyGEJSAuokoMeIgebvL+m6SyvepbwfWZp3upGjjjT9/LXnKAgADNyNTnlXamszZchMyd/u7v c7zHjjEUE3ltrH0Zo5YovRuK/WEZV4ycgFPMHZqjbfNbGc7BBNx5eXuZkXs8X/5yPhsYfJWg2VhI LW0sr10tNJgVIoCJY3Z5BEoBJRgACNhzPjnfeyuv1OWcoZCZxEbs7kG+V+e/Pu2dV2jgjGII2Nsc /wCcUfMEOkfmstlct6a6vZzWKBqgesGSdK+/7kqPnnZ5BYdbiNF9rZjOS7FXYq7FXiv5iazP501t dE0C2F5HpayytcoKlyq/vOLfybBR/M1PbNFrMpzz4YC+F6js7CNNj8TIa4q2/H4DKPyU1DTZvLEl nBEsV7ayn65T7UnqVMch+gcf9jmX2ZOJgQOYcDtvHIZeI/SRt+pf+cUOop5ea+g1SS0t4l9CWxjB pc+uyqQ7Bl2C124nvj2kJcFiVDu77R2PKPi8JjZO991IXQdF1Xyl5Lu9VuNXlmj/AEaXttOKlI7e aYBxQ82BPqNStBkMWKWHEZmR+nl3Es8+aGoziAiB69z3gfsS7yvpf5heaNBt559fm0qxXn6M6l3u JzyJLsweNgo+yPi7dO+V6fHmywsyMY/a36rLpsGQgQE5fYPvRNrqHmDzrqVyLDWH0by3YP6EU8T0 uLhlp8RaqtuN+tBUbE1wxnPPI1LhgPmWuWPHpYjihx5Zb+QVrK917yr5x03SrrWJNa0fWCyRvOfU ljlFAPiJY/aK96UPTJQnPFlETLijJjOGPUYJTEOCcO7ku1LWte81+ZrzRdH1L9D6Pph4Xt+hpLJK CQVQgqeoIFCOlT2GHJlnmyGEZcMY9UYsOPT4hknHjnLkOlIa9n17yVrGm3B16XWdHvp1t7qG7f1H j5U+JSWbtUilOlDkJyngkDx8UTzbIRx6qEhwCE4ixSK8/a35mPnXR9E8vTmO5aJpXTkRGS5O8oHU IsfKh+7J6zLk8WMIHf8AHNr7PwYvAnkyja/xXvtKvOdp5t8o29jrI8y3V/dS3IjltXLCFiVL/DFy ZePw0Ip3yrUxyYQJcZJtyNFPDqDKHhxiK59fmj9X8u+eX0G88wal5juLG/hge6GnWrNHBGEUv6R4 utWoONfH+bLMmHNwGcpkGrppw6nT+IMccYlEmrPP3/j7GG/ndrWqah/zj3YXd69bm8vIEuGoBzVH l4k08fTVjmdo5meME83Xa/FHHmlGPIPRfyKt4Lf8pPLKQABGtTI1Kfbkkd36f5THMkuGzvAryn/n JvXoNM/Ke/tWcLcatNBZ267Emkgmk2Pb04mFffCFRH/OPOnjRvyi0QXjrDJe+teAOQvwzSs0ZFad Y+J+nEq1+YX/ADj55E863smqt6umatNvLeWZXjKafaliYFWPutCe5xtXlut/lB+cf5aWM2seT/M8 t/plirTT2kZeJhGg5FjaSGWCQKK13r4DG1es/kZ+aU/5geVpbm/iSHWNOlEF8IgRG/JeUcqgk8eQ qCK9R4YlXpGBXYq7FXz5/wA5BfmFpWo+avLP5d2C/W70azYXOqOlSIv3gWOAU6uwk5N4Cnjtdjj1 ackujIb7yPr+mX3PSFeS2Y1MHNUdParkAr4b1/XnKdodhmRvGAQenc7bBrI169imOleWfMd7MEuo fqyr1d3EjkE1NCGcAfM/RmDpvZqZl+8PDHyr9Dbk18QPRuUr/Oz8p01b8u76W2YPqWjxtqFkwU8w 0K85EUj4m9SMEU8aHtnX6PT4sA4cceEff73UZpSnuTb5Q1fz7qF9qukazb20On6xpKxH69bLxeaa AgxzSeLDgOuZ9ONb7x/Lvzrp/nTyhp3mGyIH1qMC5gBqYbhNpYj3+Fuleooe+Y0hRcqJsMjyKXYq 80/M3ztdGceU9A5S6ndkRXTx9VD7ekp/mYfaPYfhqtdqjfhw5nn+p3nZmiFeNk+kcv1sm8h+TLXy vpAh2k1Cej3twO7Doi/5KV2+/MvSaYYo/wBI83B1+tOed/wjkGA3xPkP8zluwPT0XVql6bKqSt8f /IqT4v8AV+ea2X+D57/hP3fsdvD/AAvSV/HD9H6x9qdfnRdwta6Hpk0np217eepNLWgEcQCMSfAe tXMjtOW0Y9Cfx97i9iwNzmOcY/f/AGIj82dYtpPI6xafLHcR6jcxW8bQMrqQhLkKVqNmjAyXaGUe F6Tdlh2ThI1FyFcIJ3/Hmy0aXJa+WP0Xa7SQ2X1aEj+ZYuCn78y/DIxcI58NfY67xeLLxnrK/teS +QPK3kHV9JYavMYNXt5HW5heb0Txr8LBWptTY++afSYMM4+o1L3vRdoarUY5+gXA8trTnyxof5fy edBaaJbXF0+m0uG1ETcrdXQ7D/K+Lb3+WXYMWE5agCeHe72cbVZ9SMF5CBxbVW6SeTfK/lDUb7Vr HzLK0GsW904VHm9LknenL7RDAk+2UabBjkSMhqQLlazVZoRjLELgY91ppB5b/LY+bbTRdLt7jULj +9muYZw8MPD4vjO4NKb/ADA65aMGA5BCNy+Ljy1Oq8E5JkRHdW5Tjyv/ALk/zW8x6l9qLTo1s4+4 V6hDT6Yn+/MjB69ROXdt+hx9V+70eOP843+PmGvP/wDuS89+VNEG6pIbyZPFVblv/sYXwaz15oQ+ P4+S9n+jT5cnw/HzCZ/m5qX1LyRdoDxe8eO2T/ZNzYf8AjZd2jOsR82jsjHxZx5boDzz+Xkuv/lD L5UtwFv47OFrSpABurfjIASdh6jKVJ98ycEOGAHk4WoyceSUu8l5T+Q3506X5V01/IvnZpNLm06a RLO5nRuMYZizwTUqyMshYqSKUNNqCtxDS9d1b88fyp0yze6l8x2lwFG0No/1mVj2ASLkd/egxpXh creZv+cgvP8AbulvJp/knR3Kl2/YiYhnqwqpuJgBsuyinWlSeSs3/wCcpvJVzc+QdJvNItq2nlyQ rLbxD+6tHjWPkB14xmNAfAb9BgCpx+V//OQHkHU/K+n2usanDpGs2dvHBeQ3R9KNmjUJ6kcjfAVf jWlajp740qr+ZH/OQf5f6P5dvI9J1KHWdYuYXis7a0Pqxh3XiHlkAKBVrUitT0A8GlSj/nFHyXqe ieU9R1rUIWt316WFraJwQxt7cOEkKnoHaVqeI36EYlXuOBXYqwX85vzJt/IHkq51VSrarcf6NpMD b8rhx9sjusY+Nvu75KEbLGcqDxz/AJxY/Lo6nf3P5j+YW+t3sskv6JErc3aVmZZ7t/8AK58kWu9e Rp9k5bkl0asUer6baNGNWAJyhvbVFX7IpiqySS3oUkdKEUKsRuD2ocVfnf8Amd5Ubyn5+1vQeJWG 0uXNrXvby/vID/yLdcy4mw4khRZd+QH5xS+QPMJs9QZn8s6q6rfpufQk+ytyg9ujjuvuBkZxsMoT ovuSGaKaJJoXWSGRQ8ciEMrKwqGUjYgjMZyV2KpNpvk7y1pmoNqNlYrHfPy5XBZ3f4zVjV2bc9zm Pj0uOEuIDdycusyzjwyl6e5OcyHGS3W/Leh65HFHqtot0sBLRciwKltjQqVO9Mqy4IZPqF034NTk xXwGrU9T8qeXtUsLew1CzW4tbUBbdWZwyAALs4YP0G+++Rnp4SiIkbBOLV5McjKJonms/wAHeWvq djZmxU22muZLKLk9I3LcyftfF8W/xVwflcdAVtHkn85l4pS4t5c05zIcZjur/l75O1a7a7vtNR7l zWSVHkiLHuW9NkBJ8TvmNk0eKZsjdzcPaGfGOGMtvn96aaPoWkaNa/VdLtUtYSasEG7HxZjVmPzO W4sMYCoinHzZ55TczZQGueRvKuuT/WdS09JbmlDOrPE5oKDkY2XlT/KyvLpMczchu3YNdmxCoy2R Wh+WNB0KN00qyS1En22FWdqdi7lmI+nJYsEMf0imvPqsmU+s2qaXoWk6XJcyWFuIHvH9W5YFiXep NTyJ/mOHHhjC+Ec0Zc88lCRvh5OfQtJbV01l7cHUo4/SS5JaqpvsBXj+0e2Jwx4uOvUozz4OC/T3 KOtaf5d1SOKPVRDNHA4miWSTiA4FOWzLX6crzeFL6yPmyw5MuMkwsXsrvruhps+o2y16VmjH6zid ZhH8cf8ATBgMGQ/wn5MM84+Vvyc82P6/mCGxubpQF+txyGKeg6AyQsrsB2BqMh/KGAfxx+bMaTL/ ADSxO0/J7/nHeymFw6fWuJBWOa5uHWo/yUK8vka4D2ng/nhkNFm/ml6Jp3mz8vtLso7HTri3srOE Uit4IWjjUeyqgGR/lPT/AM77/wBTL+T83837ldvzA8mEFW1KMqdiCkhBB/2OH+UsH877D+pP8n5/ 5v3PN9d8gf8AOOOr3L3M1vFaXEhq72TXNuvWv90g9IfQuH+UsH877D+pf5Oz/wA37l/l7yV/zjno Nyl3bQw3N1GapLe/WLmhBqCEkBjqOx41w/ylh/nfYU/ybn/m/c9GX8wfJRUU1aAAjYEkfgRhGuw/ zmP8n5/5pV086+UHJA1qyBH808a/8SIywarEf4h82J0WYfwS+RTS1vbO7j9W1njuIzSjxOrruKjd SctjMS5G3HlCUTRFPj78/NYuPPnnXWTBeCPRvKfDTNOt/tvd6hK/F0gjH2naQUYitFQHMuAoOJM2 X09+Xvkmz8r+VtJ0wIv1iytYopWRRGplCD1X4KSKvJyZtzueuUylbdGNJnql/pAljE6m4khY0RBU A9+RJC/s9K1wC1lILo/MWnkgMskSU+2yfCP+BrgpfEC+70fT75fUGzMKrKhqDXofA4RIhJiC+c/+ csfIE36H07zeqBrmyddP1CVf24Hq0Ejf6j1Tx+IeGW45NWSL5y1LQtRsLe3uLm3kt0uI45UWQUPC UExuPFJOLcT7H6bbaiH1d/ziZ+Y0uteWbjylfy877Qgr2LMfiayc0C+J9F/h+TKMoyx6t+KW1PfM qbXYq7FXYqteSOMVdgg8WIH68hPJGAuRA96QCeSFl1nS4vtXKH/VPL/iNc1+TtnSQ55I/Df7rbRg meiDm816VH9n1JP9Vaf8SK5gZPafSR5cUvcP102x0cygZvO0S/3Vqze7OF/UGzDn7WQ/hxk+81+t tjoD1KBm88ahv6UES/63Jv1FcxJ+1OY/TGI+Z/U3R7Pj1JQM3nLXW+zKkf8Aqop/4lyzGl7Q6qXI ge4D9NtsdDj7kBN5m15+t7IP9Wi/8RAymXa+qlzmfu+5tGlxj+FATarqkn95eTv/AK0jn9Zyk6zN LnOR+Jbo4YDkB8kBNJJIau5c9asSevzysyJ5ltAAQ75IMwoPlgZBbHbXM7cYInlb+VFLH8MthCUu QtJkBzKOg8m+aLmnp6bMK9PUHpf8nCuZ2Ps/PLlA/d97TLW4o85D70wg/KvzTP8A3ggt69fUkqf+ SYfMzH2NnPOh8f1W0y7VwjlZTC3/ACZumobnU0j8RHEX/FmT9WZcOxJfxSHy/saZdsjpH7Uxt/yZ 0FafWb25lI68PTjB+9XP45lQ7GxjnIlol2zk6AJnb/lT5Kipzs3nI7yTSfqQoMyI9l4R0v4tEu1c 5618AmVv5G8nwU4aPatT/fkayf8AE+WXx0eIcohplrsx/jl80zttM021p9WtIYKdPTjVP+IgZdHF GPIAOPLLKXMksf8AzP8AOlt5N8jarr0rqs0ELJYoxAMl1IOMKAd/j3PsCctiLLVI0Hyv/wA4reVv 8QfmY2rXtZoNDha+JcluV1KfTiLV7jkz18Vy7IaDRiFl9h6td+jCIlNJJqgf6opyP4jKYhvkUht0 jklCBQscZoFpTfvthJak5EcfHiFHHwyDOlGxd7LU/qW/1e4BeJeoV6FjTwBAP04eix2NIT8yPLie ZPIWvaIRV7yylWD2mRecJ+iVVOGJospCw+B9CmudROqQ3k0k4/RkpVpGZyotFEsQFSaBfT4jwBzK cUMn/wCcevMj6D+begy8uMGoSnTrha0DLdj00B+UvBvoyMxYZYzRfeuYrlOxV2KuxVLtdsPrdi3E Vli+OP3p1H0jNL29oPzOnNfXDcfpHx++nI02Thl5FhbdM8tDt1F8sDIKL5MJUXywMgovkwybh0++ ujS2t5JvdFLD7xmXh02XJ9ETL3BEskY8zSYweSPME+7RJAD0Mrj9S8j+GbXD2DqZcwI+8/qtolr8 Y62mVv8Alqx3ur4DxWJK/wDDMf4Zs8Xs0f45/Ifj7nHl2n3RTO3/AC88uxU9VZbg9/Ueg/4Thmxx 9g6ePO5e8/qpol2jlPKgmlt5b0C2oYbCAEdGZAzfe1Tmfj0GCHKEfk48tTklzkUxVFRQqAKo6ACg zKAA5NBLeFXYq7FXYq7FXYq7FXzP/wA5gaP5r1K+8tx6daXd9pqRXLNFbRySqs4ZAWcRg0PBgFJ9 6d8P5nFi+uUY33kD72ueOUuQJRP/ADhjYCHSPNNw6lLh7q2t5FYEMPRSQ0NfeQ7Uy3KeTHF1e3eZ jLHe2Min4H5RsCNhUqfvP8MrinJzCyP0lV3pRqVqPbJEJVodSXYkcqdvc9MhSBJfD/pOpwPvyjJY sPDiR9xrkjyZcyneQZvzws7R7WTzDJAqhphNZWSkrGrLJLSQry49EWg+eZduJSA8n2V//jfQrWKN heNqNosKjrzM6BaH54SdkAbv0ezDcx2KuxV2KuxVhev2H1S+biKRS/HH7V6j6Dnl/b+g/L6g19E9 x+kfD7qdvpsnFHzCWJBNM3CKNpG/lUEn8M1eHDPIagDI+QtyDIDmmFv5U1WehdVgU93O/wBy1zfa b2b1WTeQEB5/qDRLWQHmmlt5Jslobmd5T4LRF/42Ob7T+y2KP1yMvdsP0uNLXy6Ck0tdB0i2oYrW PkOjMObfe1c3ODsvTYvpgPjv97jT1E5cylOo+fNLsdXudIisdQvrqyWJroWNpJcJH6ylo1Zk2BKi tMzwGlkFvdRTRxsDxeReXpPQOvSoZa7Fa0OKoPVtf0vS7H67cy8ofXgtR6X7xjNczJBEgC9zJIuK rdU8x6XppsRO7O2pTNb2iwr6hZ0hkuG2XsscDGv0YqirK/gu7W3uF5RfWUWRYZh6cq80D8HjPxK4 U7qemKq4miLcQ6lqlaVFeQFSPnTfFUFBrmn3Gt3mixMzX1hBBcXS8TxVLlpFiHLpyPosaYqvs9Vt bpJXXnCIZZIT66mIsYn9MunKnJC32WGx7YqivVi3+NdmCHcbMaUHz3xVpZoX48ZFbmOSUINQO4xV firsVQtzqmnW3MTXCK8dOcYPJxWlPgWrd/DMPUdoafDfHOII6Xv8ubZHFKXIMM1K6+vXktw67Psi t+yg+yOrfTTvXPMO1NedTnlk/h/h93T9Z83bYcfBGlLyemnaHr12Vi9JdcaISSrsvrxBlTkPF1bj y67KPl0vs32wdsGQ7fw/q/HVxtVpwfUOfVnV/YxXluYXPEgh43G5Vl6HO3BdbIWkl1a3FoGaRSYl 39RQSKe9MnYYHZC2ZM5KWSFyep4txB/ymIoMdmMTfJkWn2ItkLMeUrfaPgPAZAm20Bh2qaleTeYN QWO8mFvCY0iSKR0UViVm2QrvyJzgPaHtDPj1JjCcojbka6B2umxxMAaDzLWPyE/LvU71bs209rJ6 hlmSGd+EtTUowkL8V/4x8cxcHtXrIAgmMveOXyr7bYy0GIm6pNvL35TeQPL+tWWtabpfHUNPkEtt JJPcSAMBT7Luy9/DbBj9qdaJAylxR6io7/YyOhxdB973PPSXVuxV2KuxV2KqF1ZWt0EFxGJAh5KD Xr9GYmq0OLUV4keLhNhnDJKPJVihiiXhEixqP2VAA/DL8WKGMcMAIjy2YmRPNdliHYq7FXlek6bq 0fnDXLrUdD19ZdU1jlFf2V3BFZfVYljtreSRFu43ZRHDzasRahpQ9MKpJe/l35jg0nTdX0zQ0fzb LDrOoalNJIqSfWNQV1W0aVJEbpeOyhHC8kryBNSqkemflz5lsA4XyhNPpU19pct3pZOn23q2dglw WqkUro0vryIxWR2ZlCguSTRVN5Py780tY30FhpDaXp2oHVLiy0xZIibM6r9UsQlFdo0KQfWbhlQ8 V5cVqcVTK68gzwpHrj6bHaamddvNTn1KYqz2On2cE0dpRgXYLIlvb1RK9fiG2yqA/KOLTtT80aI9 ppkFnLoOjyy6tdwXMF213fXsixxzySwNJzLpHO6tIefxnam5SrL9HvfMGl+cPM1xdeWtSul1a/hW zvbc2Zt1tLe3jgjZjJcxygcxI5AjPXudsVYf/wAqs1fUfLGqfpnSFuNXfRoLPToZTG6xX9/LPdX9 wo5lecU939rr8B4nfdtU1/RXm+C4ezby7czW0fmOfWbu8EtqVuYLRGbT1iX1OfNjBbqS6rxI+5VO fys8napoN7qj6zZqly/F9NmikMkFtaXLNO+nQBiWUW87NVqDmCvhxVKvRMCoXVXaPS7yRGKskEjK ymhBCEggjMXXSIwTMdjwSr5M8Q9Q97A0ChBx2Wm2ePHm7xdgVSubeO4geFxVXFMnCZibCss8o63J qNi9vdGuo2JEd0aU5g19OQf64G/uDtSmeq9kdoDU4Qf4hzdRqMXBLyKe5tHHdirjuKYq8ttf+Otq i1rxlQV/55Lnm/tT/jZ9w+4O20f90Pj96Ozm3JdirJdC1/mFtLxvj2WGY1JbsFb/ACvfv8+vf9h+ 0Ay1hzbT5CX873+f3+/nrdRpq9UeSf51rhOxV2KuxV2KuxV2KuxVbM7Rwu6oZGVSyxggFiBWgLED f3OKvK/Kv5p+YbnT7u+vNJudTmlR9XisrP6qiWekOzi1LSvKvqSSrE5C/aJU9FpU0rLNB8/wa9r0 2naVpt1NY2yRPdaw3ppbIbi2S6ijAZ/UZykq8gq/D3wKxu//ADM8zDVZrS30eRozr6aTp6Q+i81x Fb2xuLz7cwQHlGVDHiFBFdwaGlXTfntoUVjDM2nTrdC3mu9QspJ7OGS3jt7iW2dQZZkWZzJbycFi qSBXaoq0rI/NPmTUli0Ox8vmMah5jnEdrdzxs8UFusDXEs7RgpyIjSiKSKsRXArEdP8APcPlq71W J7pfMEEf1RUtrOw+pai13dXRthH6fGGGZG6qwNdmG+FU2sfzMvZtQu7UaReXWptM0NvoUQthLCtp BDJdyPcGf0WVXukSvIfH8Kg7tjSp75A8w3vmPQH1q4jMMN1d3YsIXT05EtYZ3hiEi70ciPkfngVk mKuxV2KoTV3aPSr11NGSCVlPgQhOY2tmY4JkcxGX3M8QuQ97BE48Bx3FNs8dLvF2BXYqlmq6jqGh uNd0yOOW7t0ZHt5SVSaNt/TZlDFdwCGAND2PTN52DrjgzC/pPNqzY+OJDflj/nJf8rNZiCX18+g6 gp4zWWoxsnBhsw9VQ0VK+LA+wz1PgPTd0XiDqm+rfn3+UWmW7TTeZrWegqI7QtcufYCEP+OPhlTk DwH82P8AnKnVvMFtPo3k+GTSdLlDRz6jIQLyVDsQnEkQqR4Et7jLY465tUsl8mf/AJL26w+QdNIF OcSEj3KAn8TnlHtHMy1cvIvQ6cVjj7mdZom5TnuIIIzJM6xoOrMaDJQgZGgLKo+w8v6jqYpNG9lY ts7yjjM61IZUjPxL0+04HiAc6rsz2ayzkJ5fRHu6/scTLqox2G5ZznoDq3Yq7FXYq7FXYq7FXYqo 3tqLuzntTI8QnjeIyxkB15qV5ISGHIVqKjFWJXf5W6TLHHBaajfadZNp1vo9/aWrxKt1ZWiusMcj PE7oQJWBaJkNCR8jap/5f8t6doMF1BY8/Tu7l7uQOVNGcKoReIWiIiKijrQdTgVLtL8g6Vp2sJqc V1dSNFcX13DayvG0KTakVadhSMSH4lYryc05sOnEKqkT/kp5fD2zWup6nZhLWOyv/q80aNexRSNK GnYRchIXkbk8XA0JHfDasn8y+VLTXIbKlzPp19pk31nTdQtCglgk9NojQSLJGysjlWVlIIwKldr+ WmmR6sur3epX+oakbm1u5p7l4aSPZxTRQqUjijRIx9ZZ+KBfiofGrauP5a6fHdre2OqahYXxkvnu LuB4fUmj1GcXE0Ll4nAVXVRGUAdANmxtU/8ALuhWegaFYaLZM7WunwpbxPKQ0jBBTk5AUFm6tQDf FUwxV2KuxVbJHHLG0cih43BV0YVBUihBGCURIUdwUg0xq78h2Z5NYXc1mxpxQkSxrT/Jaj/8PnPa j2a08943H7R+v7XLhrZDnultz5P8zwNW1ura8jC1IkDQuSOwAEi/ewzV5vZI/wAEgfs/W3R1seoS a71GTTXEWr2sthKfs8wDGxoCeEiko1K70O2c9qux8+E1IOVDJGXIsX8x+ZGvwNO0uCS7uZvhit4V LyO3sB+voO+ZvZfZWScxsuTIICyxPSP+cQNb1WeTU/MutxaZLdyPPJp9nH9ZZPUYtwMzNElVrvRW GenY5CEREdBTz0oGUiT1ZPbf84a+Qlp9Z1rVZdvi9NreOp9uUUlMPilfBDr7/nDXyG8LCw1rVIJi p4vObedQ3YlUigJHtyx8Ur4QRnlK4ttAin8tahKIr3TJngYsCgcKaK6hqHi60ZfEHPL+3dHk8eUg HoMRuAruZRDdpdTra2FLy7cVSGIg0UEAu56IgqKsf10Ga3R9m5tRPhjH9iZzERZZfoPlmKwC3V7w udUNSZqfBFUU4QA/ZFDQt9pu+1FHpHZnZGLSx2Fz6ydXm1BmfJPM2rjuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVRvfqX1Sb696f1PifX9fj6XDvz5fDT55GdV6uSY3 e3NBaF/hn0ZP0D9S9HkPW+o+lx5U25eltX55HFwV6KryTPiv1c0zyxi7FXYqx/zL/gL1k/xJ+jPr Ppn0fr3oet6dTX0/U+Olf5e+UZfD/j4fi24+P+G1Xyx/g305v8NfUaUj+s/UfS5U+L0/V4fF/NTl 74cPh16K+CMnH/Fad5c1uxV//9k= - - - - - - uuid:E5FA3B3F1DD811DD86BDF21B8BE353A9 - uuid:9149C83E227611DD96FDE93621064FD0 - - uuid:E5FA3B3E1DD811DD86BDF21B8BE353A9 - uuid:C90DC6BE1DC111DD86BDF21B8BE353A9 - - - - - endstream endobj 640 0 obj<> endobj 641 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<>stream - - - - - uuid:5211b95b-20e8-11dd-bb5a-001451637df1 - adobe:docid:indd:3cfd1026-228b-11dd-8acb-e160abe3ef62 - proof:pdf - - - - ReferenceStream - 72.00 - 72.00 - Inches - - uuid:9149C83E227611DD96FDE93621064FD0 - uuid:E5FA3B3F1DD811DD86BDF21B8BE353A9 - - - - - - - 2008-05-13T14:30:06+02:00 - 2008-05-13T14:30:07+02:00 - 2008-05-13T14:30:07+02:00 - Adobe InDesign CS2 (4.0.1) - - - - JPEG - 256 - 256 - /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGSAAAAAAf/bAIQACgcHBwcHCgcHCg4JCQkOEQwLCwwRFBAQEBAQ FBEPEREREQ8RERcaGhoXER8hISEhHystLS0rMjIyMjIyMjIyMgELCQkODA4fFxcfKyMdIysyKysr KzIyMjIyMjIyMjIyMjIyMjIyPj4+Pj4yQEBAQEBAQEBAQEBAQEBAQEBAQEBA/8AAEQgAtQD/AwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7NirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVaxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KqF7fWenWst9fzJbW 0C8pJZCFVR7k4qwK8/PHyTaymOEXt6o/3ZBCoU/8j5YW/DFU+8sfmH5X82yfVtMuGS7oW+q3C+nK QOpXdlan+SxxVk1cVdirsVbxV2KuxV2KuxV2KuxV2KtYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXiH59axeNqmneXo3YWwgF48a9JJHkkiTkO/ERmnzxV5NNDNbyNDOjRSIaMjgqwPuD iqazahqlvZ6ZLHb/AFE2RJtr2NSkrODz/vBQ7V2yROzEAAvpXyRrzeZfK2n6vL/fzR8Lim372MmK Q0HSrLX6ciyT7FXYq3irsVdirsVdirsVdirsVaOKpLpus3L6pPo+qrHFdIA8HpcuMiUqT8ROYuHU SOQwnz6OdqNJAYRkx2Y9b6N6prrQXa6TpiLc6lJQ+m1QiL1LOR7Yc2p4ZcEd5I02iEoeJM1D7fgm sHrein1niZuI9T068eXfjy3pmRG635uJPh4jw8lTCxdirsVdirsVdiqA1vW9N8vadLqurTehaw0D NQsSWNFVVG5JOKsQ/wAQfmJ5kiS/8qafZWGmS/Fbz6mz+tMnZxGn2QfkfY4qtHnTzJ5Umgi/MO2t Y7O8f0odR08uyK/XjMjVPTeu3yOKsi82+bbDylpa6hdK08k7iG1gStZZWBZVqA1BtuaYqx8y/nLO /wBZjh0a2jO62sjSswH8rMvU+NDiqbeUvOB124vNG1K3FlrelHjewIS8R34843PUf574qyjFXYq8 t/MALbeerC/iSKa9/RjJZRSqGrIlxykIDUHIQPIVqeuRnkjjiZSNAKImRoJfD5SMvmoeaZbCB4ha 81sCeKG9SEhfhqwVDIopuaVzVn2j0QlXEfk5H5LJXJLPzBnudQ8n2k/mVIbHWIrz07dU/wB2RenW X4UMnwhzsT7fM5+m1uHUxuEraZYpYzuGY/khKH8ltGHEggvZkqK0FVikpuB/Pl7F6JirsVbxV2Ku xV2KuxV2KuxV2KtYqw7zvcR2V3YX1rJx1KEsVUCtYt929q/rOa3tGYhKMgfUHc9jYzkhOMh6D96Z +U9Phh09dSaQXN3fj1Zrg7nc/YqfA9ffL9DiAhxXZl1cbtTPKWXgqox2AQthqOpXvmWctbSrb2yL A0RkXjEz/F6jANQkhe1crxZsk9QdjQ29zbn0+LFpB6hZ3uufki7bzN9efjY2csyJKY5piQkUaA05 lz123oO2WQ1nGfTH4tOTs7wh65AbbDqWv8SzSRveWmmz3Gnx1LXPJFJC9WSNjyYY/myRxCJMe9P8 nRB4ZTAn3ftRN15gs4YLWSBXupb4VtoYh8bilamv2QK71yyeqjEAjfi5NWLQzlKQPpEeZLVlrby3 o03ULR7C7kQyRKzLIrqOvF074MeoJnwyFFc2jEcfHCXFHr0Q48zSXBuV07T5rs2kjpIwZUTin7QZ u5/lpXIDWGV8MSabT2cIcPHMR4gsXzW1xaG+sNOnuLeJeU8hKoEoKsFrUvTvTANbxR4oxJHVJ7ME J8M5gE8mF/mjKvmLU/J2gqWWy1a4FxMDsSjGJV+kJI+ZUJCcQR1cHJA45mJ6bPU440ijWKJQiRgK iqKAACgAGSYME/Og248h3QmpzM8Agr158wTT/YcsVXa/5PufN/kLSbJJvq+qWkFrcQSSEgessKqy uQCd6nfxxVLE87fmD5VtwPOHl5r62gFJNRsXUniP92SKnNfv4Yqy7yrfeWPMED+Z9AgiSW8JjuZv SVLjktKxzFamo27nFWQYq7FXm3nKcXfn/StPsDHLdwWM7zIftKGZHQcuxPH7sw+0tGdVhMRzbdPl GOdlHW+pSyt9XaIrODQpvWo/yabZxMuysvicIBJdtxQ4bJ2Y3+amiajP5ah1CZT9Ws7hJLgChcRv WOq/IvnUdidjS0dzkfURVOt1WqGXaI270F+S2u2ena5qHldLr17W9pPYyMpTlJGPjHE9GZP+I5uy 4o5PbMCXYq3irsVdirsVdirsVdirsVQGs6rBo9i95N8R+xEg6vIQeK/hlWozjDDiLkaTSy1GQRHx SnQNEmlE2q66vrXt6pXhIP7uJhx4U7VB+76cx9Lpybnk+ouXrtZGNY8W0Y/aVLy1M2k6jd+WbhjR GM1mzftI3xEfdv8AfkdHLwpnEfeGXaMRnxRzx90lPS9UtobDW74Sr9aaW4n9OvxKq/BFUfPBhzRE Mkr3sllqdNOWTFGvTUR+tEQ2M8Pkk29qh9aW25lVHxMZPjb5niaZMYyNJQ501yzRl2hxSOwl9yWI +lR6XEY9avZC0axrZQyLzLEBfTEfD6MoBxjGPXL3OWRmOY3ijz+oj7bXXFhbWGq2MF1eXGnW6WXC 3nDKrCTmzPGz8StaNjLHGGSIMjEcOyMeeWXDMxiJni3Hw5q0H1Fb+XUYLy71H9EwSyi4ldXgDMjL 6YIUEmhrtk48HGZCRlwjn0YT8Q4xAxjDjIFDn71eyJ0ryQ9w1RLLC8vLuWnJCH/hlyWI+FpL8vva 8w8ftADoDXy5rr5W0vyStuopLJBHFxHUvMRzH/DHDk/d6SvL70YD4/aF9LJ+TG/zQ0TVLa10DzJo kDXFx5akUyRxgsfSHptyIG5VTFQ07HMyEeGIDrcs+OZPeU5sfzX8jXlkl3JqS2rFQ0kEyuJENN1o EPKn+TXJMGK3dxc/m75jsoLG3lTyjpMvq3M8w4C5kXso9x8IHUAkmlaYqj/M3mLV/Jv5gwajqsly fKt7CsXwcmghk48SeC1HIMladaE0xVO9Q/NXyNaWMlymopeNxJS3hVmkkNPs0ZQBX/KpiqX/AJOa NqGm6Bd3t/AbMardG5t7YgjhFxAU8TuK9vYDFXoWKpJ5v8y2vlTQbnWLkgvGvC2jP+7J2B9NPv3P tXFWGfk/ohvLe688axIbrVdWeRFkk6rEGo1B25Mv0ACmKvSVjgYniASpofY4bKFDVbSy1LT7nSr0 r6N5E8DqadHBXb332wUm3yY4v9B1ZlR2tr7TZyoddmSWFqVHyK4q+mvInnC185aHHfR0S8gpFew/ yS0+0P8AJbqv3dsVZLireKuxV2KuxV2KuxV2KuxVZLDFMAJUWQKQyhgDQjuK98BiDzTGco8iuwoU zbwNKJ2iQyrsshUFgPZuvfBwi7pkJyAq9lps7QlyYIyZf7z4F+Levxbb4PDj3J8We252VQAoCqKA bADoBkmBNqAs7CKU3IghSU9ZQihv+CpXKzHHA2QA2eLkkOGzXcsuZtMlT07t4JE/kkKsPuNcoy63 SjaU4/MMscM0TcQVD6/okMJt1aJYehjRKr/wKrTKT2toYiuIU2fl9RI3RtSl1vRjH6DD1YhQcPTq tB0+FgBlU+3NFVXfwZx0Wou+R96hN5l0p1CPBJKqkEBkQio6EVbK5e0OmP8ADI/L9bZDs3ODzAU3 84W6/ZtpD8yB/XIH2jx9IlkOyJ/zkiuZ/KlzObqfy1ZTTMatJJHEWY9asfRNcB9oh0h9v7GY7GP8 77P2o9POa26LFb6ekUSCior0CjwAEYGP+iE/zPt/YzHYg/nfZ+1ZN5wF7G1rNpaXMcgo0TnmrexU oQcnHtyUuUPt/Yv8ixHOf2ftQtjDY29wt3YeTbeKUGqyxwKhH+q3oCn0ZkQ7Qzy5Yj+Pg1y7N08e eUfj4sii1fXpf+lGyjxa4jH/ABJRmRHUZz/k/taZaTTR/wAr/sSmNvPfyEevarAO/wC9DH/hVy+E pnmKcXJDHHlK/g8d/NS+fzT5ysvJtkWkNuqxqi/Z+t3HEl5D/LHFRvvyxqL1zTrCy8v6XbabZpSK 1jWGMftNxAFSfE9Th5oOzkurtyTFGnDc9x89640GHEVdGhvAY54wJF+0p3I91OPJkCJPEPzl8s22 neYLbWuXpW+qROJjxLVuLdRQfD0MilRXxqcQkpD+W+vz+VPONtC7n6lqLR21wDsGSahgl9uJdW+V cCQ+lsVbxV2KuxV2KuxV2KuxV2KtYq7FXYqk15f3sMzxcgvE7EKOnbrXOO7S7a12DPLHYFHu6fG3 YYNNinEGkBLe3b/ameh7A0H4ZrJ9qavJzyS+dfc5McGMdEI5LEljU+J375jmcpGybboilJqf5j3x DNSKk7AVPhSuWRBJ2ZXsqx6Zfz/3du5HiV4j72oMzMPZ2pycoFrlqsUOcgio/K2oSbyNHEO9TU/8 KP45sMXs/qZfUQGmfamIcrKLj8nwf8fFwzeIRQv/ABLlmdi9nID6pn4fgtEu15dIoqPyro6fajaT /WYj/iPHMuHYmlj0J+LTLtTOetIuLRdJh/u7SLboWUMfvauZUNBp4coBpnrM0ucijEjSMcY1CDwU AD8MyBER5NJkTzXYUOxVAa5qEmk6LqGqRR+tJZW01wsf8xjRnA/DFXif5NCbXPPl9rmot6tzHbzX JfYfvpnRCaf6rtir2m+fldeiTSiAjbxLDJR5MJGzTomSIcCR022wEMRsqqUa7jZKVAIJHcUrj0Z0 LYF+e1sk3lG2uP27e+jIPs8cqkfqwMnhuqO8V9GY6q8EVugalPjiijUn6GXCUAvra0la4tYJ3Xg0 saOy+BYAkYEq+KuxV2KuxV2KuxV2KuxVrFXYq7FUt1i35xC4X7Uezf6p/oc532n0PHiGUc47H3OZ ostS4e9KY7O5uD+6jZh49B95znNL2dqdR9ED7+nzc2eaEOZRcWgSNvPIE9lqT9+2brT+y2Q75Jge 7dx59oAcgjItDsI93VpT/lk0+4UzaYPZ7SY+YMvf+xonr8svJC/pzT7S9uLKO1aOGyYJdXfK2igi /dpOxf1LhJKKkgJIQ5s8WDHiFRiB7nHlOUuZRaa9okjRKmoWzNO/pxASpV3qF4r8W5qwH0jLGKEj 836HPZLfQXCyIxoyq8fJBxlk5SVcBV4Qsak9sVRK+YdDZXJv7ZTFtKpmjJRuXplG4sfiD/DTx2xV fJrWnrHZzQyi6j1GcW1u9uVkVnIkYnkrUooiavyxVptc0qO6eynuoYZ1kEKpJLGGdiIzRVDlusqj cDc+4xVUbWNIRBI99bKjIJFYzIAUYOVYHl0Iiah/yT4Yqi1ZXUOhDKwqrA1BB7jFXMyopZyFUdSd hkZzjAWTQSASlmo6hbyW728R9T1QUfY04nr1G9c0HbHbuKOExxSuR6jo5Wn0suK5DZj+kafpuka6 dXhiWA3MP1WcoOK7sjo7ADsVpXwOa/sHtiWOfh5DcTy8m/VacSFjmyy5tRNSRdpFFB7jwzsgXWEI JoJw4HpEsOhHT78lYYEb8kbbW/oj1JCOVKUHQDIk2zAph3mCyXzbYSafqE8i24nMsRg4qylC6pQ8 DXZu+cbqvaDV4NTIAigTsQ7OOkxygNmK2/5U6DGVa6uru64sGCu6hdj0oE74Je1WqJ2jH7f1oGgx h7DG3NFYftAH787DHMTiD3uvIor8kh2KuxV2KuxV2KuxV2KtHFXYq7FWtj1wEAq3hV2KuxVisWia TezXTrfw3KXdzJJJ+7iMhIcF4lm+0VCrwNO2KqV/5UsLq9/SMmrFBPcJKisVKeskjSoIquF5bqOl fgX5Yqpw+VNIurKBn1Y3NusMFpC6+kiehFHLHHHRRSrJcPyPevQYq1ruiDT106bTblfr+n/FbxzE 7kif1pSscM5PNpt/hoNjWuKo2LSoUtNDiGppHd6YhZXULIss0kDCSXiadVZ2B98VX2nl7TpzetDf NcS3E0UlxKnAlXjuGvlUUBAqHVf9UDFVBPIsf1eK3m1CV1gS1RAqIq0sR/ogYUaqo5LkftN7bYqy vFUFq4rYvvuChHv8QzWdvQ49FP8AHVv0hrKEjo3+dfDOB4JdxdnYaaPmpVhUEUI38MIhIHkU2Ez0 nU4xGLK9mVJ4yFjMjBTKp+yRypUjoc7vsTXnU4Kl9UXWarDwSscinGbVx0k8x+a9G8t2M11fzK8i D4LWIhppGPRVQGv09BiqRaNLLc6bBcyJ6bTr6pQknjzPKnTtXPOe0omWpmQOpdzChAe5HUb/ADr4 5icEu5lYTDTb2ZZEtSvqITTapKf2Z03s92hqRIYjEmHf3OHq8MCOLqnWdW4DsVdirsVdirsVdirs VaxV2KuxV2KuxV2KtGtDTr2rirD28kXwsG02DUIkjlhgEs7W5M5nt4+KOH9YAJ6o9QrTuwr8WKpt qnl5rjTLXTdLmSwSzWRIv3fMKHtp7RSArx/Z9bliqTaj+Xy3dwZILoQwMr24gpKqpbPBaW3Bfq9x BU0tj9qq/GdtsVTTWvLt3f3MtxYXEMH1u1js51uInmAWF5JYpI+E0XxK0rbHY7eG6qXHyG3oIn1t HlRpJS0kRYSSc7X0fV/eVZVhtvTYV3DHpiqf6Hpc2l284upUnuby5lu55Io/SQtIdgqF3Pwqqjdj iqZYq7FVC8tUvIGgdilaEMvUEGuY+s0sNViMJcizxZDjlYSaXRNSj3gmimA7OCh/DkM5zN7KSH0S Hx/Bc2OuieYQM7z2P+98LW46B/tIe321JH35qNX2PqdPzjt3uRjzQycixDzbDceaoDoWjQG7uZeN KbKgDA+pI3RVFOp+WbP2e0WWObi6NerlGOMg80HYfk15zW2WC48xC0ipT0IHnkQA9qViGde6tRuf yA1JYme11mGabqFlhaNSfd1klP4YqzLSLy2WxhgaRY5IFEciMaFWXYg755xrdPkjmlY6u75p9p+m tfATz8ktv2APhaUeNeoX9fy67zsb2fEgMmYe6P63E1Gq4dop5FFHCgjhQRovRVFAPuzqYQjAUBQc Akk2VTJIdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVaKhgVYAg 7EHocSLVbFDDAvCGNY168UAUfcMAiAKCSSV+FDWKoWbS9MuJfXns4JZf9+PEjNt/lFa5CWKEjZAZ DJICgUVk2LeKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kv/2Q== - - - - - - application/pdf - - - Adobe PDF Library 7.0 - False - - - - endstream endobj 3 0 obj<> endobj xref 0 4 0000000000 65535 f -0000285835 00000 n -0000285885 00000 n -0000298141 00000 n -trailer <> startxref 116 %%EOF \ No newline at end of file diff --git a/doc/dev-guide/xtreemfs_client.tex b/doc/dev-guide/xtreemfs_client.tex deleted file mode 100644 index 89e7dfb26434072f39ad712cc001f4d23ce3a49b..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_client.tex +++ /dev/null @@ -1,61 +0,0 @@ -The XtreemFS client connects applications to XtreemFS and acts as a gateway to the XtreemFS directory (DIR), metadata (MRC\index{MRC}), and object store (OSD\index{OSD}) servers. From a user's perspective, the client consists of a number of binary programs that reside on the user's machine. These programs and their functions are summarized in table \ref{xtreemfs_client/tables/command_line_tools}. - -\begin{table}[!h] -\begin{tabularx}{\linewidth}{|l|X|} -\hline -Command line tool & Function \\ -\hline -\texttt{xtfs\_lsvol} & list volumes on an XtreemFS MRC\index{MRC} server \\ -\texttt{xtfs\_mkvol} & create a volume on an XtreemFS MRC\index{MRC} server \\ -\texttt{xtfs\_mount} & mount an XtreemFS volume \\ -\texttt{xtfs\_rmvol} & delete a volume on an XtreemFS MRC\index{MRC} server \\ -\texttt{xtfs\_send} & send arbitrary RPCs to an XtreemFS server \\ -\texttt{xtfs\_stat} & print statistics on an XtreemFS file or directory \\ -\hline -\end{tabularx} -\caption{XtreemFS client command line tools} -\label{xtreemfs_client/tables/command_line_tools} -\end{table} - -\subsection{Architecture} - -The client is structured as a network of message-processing \textit{stages} connected by queues. These stages are similar to those in the XtreemFS servers, and are designed with the same intent: to increase concurrency while avoiding data races (see \cite{SEDA} and previous deliverables for an explanation of stages). Unlike the XtreemFS servers, which is implemented in Java and uses a custom-built set of classes for managing stages, the client is implemented in C++ and relies on a third party platform, Yield \footnote{\url{http://yield.googlecode.com/}} for much of its low-level functionality, including concurrency control in the form of stages as well as platform-specific primitives such as files and sockets. - -The stage architecture of the XtreemFS client is depicted in figure \ref{xtreemfs_client/figures/xtreemfs_client_stages}. Note that this particular configuration of stages is specific to \texttt{xtfs\_mount}, which consists of a set of FUSE\index{FUSE} entry points and proxy stages for the various XtreemFS servers with which \texttt{xtfs\_mount} communicates: the directory server (\texttt{DIRProxy}), the metadata server (\texttt{MRCProxy}), and one or more object stores (\texttt{OSDProxy}). - -\begin{figure}[htbp] -\centering -\includegraphics[width=.80\columnwidth]{images/xtreemfs_client_stages} -\caption{Client stages} -\label{xtreemfs_client/figures/xtreemfs_client_stages} -\end{figure} - -\subsubsection{FUSE\index{FUSE}} - -\texttt{xtfs\_mount} provides a file system interface to applications via FUSE\index{FUSE} \footnote{\url{http://fuse.sourceforge.net/}}, a library for implementing file systems in userspace. Applications make POSIX\index{POSIX} system calls such as \texttt{open} and \texttt{read} into the operating system kernel. A FUSE\index{FUSE} kernel module translates these calls into messages (i.e. Remote Procedure Calls), which are then passed to a FUSE\index{FUSE} file system via a pipe. The file system runs as a daemon in an infinite loop, reading and processing messages from the pipe and sending responses back into the kernel. The userspace part of the FUSE\index{FUSE} library handles most of the nitty gritty details of kernel-userspace communication, so that the file system implementator can concentrate on implementing file system logic. This is typically done by implementing a set of FUSE\index{FUSE} callbacks, each of which corresponds to a POSIX\index{POSIX} system call (and thus a message on the FUSE\index{FUSE} pipe as well). The FUSE\index{FUSE} library translates messages to calls on the callbacks supplied by the file system developer and translates return values from the callbacks back into messages for the FUSE\index{FUSE} kernel module. These FUSE\index{FUSE} callbacks are the main entry points into \texttt{xtfs\_mount}. - -From a FUSE\index{FUSE} callback such as \texttt{mkdir} the client makes a series of requests (messages) through the various stages shown in figure \ref{xtreemfs_client/figures/xtreemfs_client_stages}. The primary stages in the client are proxies for the servers the \texttt{xtfs\_mount} instance is connected to: typically a single DIR server and a single MRC\index{MRC} server and multiple OSD\index{OSD} servers. In the case of \texttt{mkdir} the client would send a request to the \texttt{MRCProxy} to create the specified directory. Because the FUSE\index{FUSE} callbacks are synchronous the initial request from a callback to a stage must be synchronous, i.e. the sender must wait for the response before doing any further processing. However, this does not mean that the whole system is synchronous: only the FUSE\index{FUSE} callback blocks synchronously on a request, allowing the stages in the client to communicate asynchronously (and thus improve performance). Furthermore, since the FUSE\index{FUSE} callbacks may be multithreaded and reentrant a stage (such as e.g. the \texttt{MRCProxy}) can process requests from multiple FUSE\index{FUSE} callbacks simultaneously. In other words, the concurrency of the client is not limited by the FUSE\index{FUSE} front end and the number of threads processing FUSE\index{FUSE} messages. - -\subsection{Implementation} - -The XtreemFS client is implemented entirely in C++. Aside from the essential components listed above (FUSE\index{FUSE} callbacks, server proxies) \texttt{xtfs\_mount} consists of a few support classes such as \texttt{Path} (which wraps XtreemFS \texttt{volume\/file} global paths) and XtreemOS integration code such as a pluggable module for retrieving user credentials from an XtreemOS AMS server. Most of this code is shared between the XtreemFS command line tools listed in table \ref{xtreemfs_client/tables/command_line_tools}. As mentioned previously, the XtreemFS client also relies heavily on Yield for many low-level classes, such as platform-specific file paths and sockets. The ONC-RPC \cite{RFC1831} protocol implementation used to communicate with the XtreemFS servers is also a part of Yield. - -\subsubsection{Generated interfaces} - -The synchronous request-response messages exchanges between FUSE\index{FUSE} callbacks and stages such as the \texttt{MRCProxy} are hidden underneath a function call interface. The latter is generated from the same IDL\index{IDL} interfaces used by the server. When one of the interface operations is called synchronously on the \texttt{MRCProxy} a request is created and filled with the function parameters; the request is sent to the \texttt{MRCProxy} stage, where it is processed asynchronously; and the caller blocks waiting for the response, which, when it is received, is unpacked and returned as a normal function return value. The extra level of abstraction allows the FUSE\index{FUSE} callback interface to be fully agnostic of message sending and receiving, and simply treat the MRCProxy as if it were making synchronous remote procedure calls. The FUSE\index{FUSE} callback for \texttt{mkdir} is shown in figure \ref{xtreemfs_client/figures/xtreemfs_client_mkdir_code}. - -\begin{figure}[h!] -\begin{verbatim} -bool Volume::mkdir( const YIELD::Path& path, mode_t mode ) -{ - mrc_proxy.mkdir( Path( this->name, path ), mode ); - return true; -} -\end{verbatim} -\caption{FUSE\index{FUSE} callback for mkdir} -\label{xtreemfs_client/figures/xtreemfs_client_mkdir_code} -\end{figure} - -\subsubsection{Lines of code} - -With much of its low-level functionality in Yield and other libraries the code base for the XtreemFS client is quite minimal, with approximately 2800 lines of hand-written C++ and 4800 lines of C++ automatically generated from the XtreemFS IDL\index{IDL} interfaces. \ No newline at end of file diff --git a/doc/dev-guide/xtreemfs_dir.tex b/doc/dev-guide/xtreemfs_dir.tex deleted file mode 100644 index fb3ec8ce64421459226c77845d5d37cf9a8d589a..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_dir.tex +++ /dev/null @@ -1,5 +0,0 @@ -The Directory Service (DIR) is the central service registry of XtreemFS. All services register and regularly update their registration at the DIR. In addition, it keeps all address mappings which the services need to translate UUIDs to hostname and port. The directory service is also used by the MRCs and OSDs to synchronize their clocks. - -Currently, the directory service is a single instance. In the future, this service will be replicated and and divided into a hierarchy of DIR services. - -Persistent data is stored in BabuDB\footnote{\url{http://babudb.googlecode.com}}, a non-transactional key-value-store. The service and address mapping records are stored in their XDR representation. This means that the DIR database must be deleted or converted if data structures change. \ No newline at end of file diff --git a/doc/dev-guide/xtreemfs_intro.tex b/doc/dev-guide/xtreemfs_intro.tex deleted file mode 100644 index 4d2607b389a335bd20fe3c6509e2cb22b889a16a..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_intro.tex +++ /dev/null @@ -1,11 +0,0 @@ -XtreemFS \cite{XtreemFS} is an object-based \cite{objStore,mesnier03objectbased} file system designed for Grid environments. It is the main distributed file system in the XtreemOS operating system, which relies on XtreemFS for replicated and low-latency file storage between Grid machines. - -From a user's perspective, XtreemFS offers a global view on files. Files and directory trees are arranged into volumes. A volume can be mounted at any Grid node where a sufficiently authorized job can access and modify files on the volume. Applications access directories and files on XtreemFS volumes through normal POSIX\index{POSIX} interfaces (\texttt{open}, \texttt{read}, etc.) and thus do not require re-compilation in order to work with XtreemFS. This stands in marked contrast with earlier Grid file systems such as GFarm \cite{gfarm2}, which often forced users to rewrite parts of their applications in order to access files across the Grid via special non-POSIX\index{POSIX} APIs or to adapt to a non-POSIX\index{POSIX} file system semantics. - -From an administrator's perspective, an XtreemFS installation consists of file system clients running on each user's machine and network-based services for storing and retrieving file metadata and data. The former services are known as Metadata and Replica Services (MRCs\index{MRC}), while the latter are called Object Storage Services (OSDs\index{OSD}). These services are complemented by the Replica Management Service (RMS), which is responsible for creating replicas on demand in response to changing user access patterns as well as eliminating redundant replicas; and the Object Sharing Service (OSS\index{OSS}), which provides transaction-based sharing of volatile memory objects and supports memory-mapped files for XtreemFS. - -This deliverable is intended to serve as a developer guide. Its focus is on the current design and implementation of the XtreemFS client and servers, network protocols used between clients and servers, and test suites for XtreemFS. - -\subsection{Document Structure} - -The report is structured as follows. Sections \ref{sec:xtreemfs_mrc}, \ref{sec:xtreemfs_servers}, \ref{sec:xtreemfs_dir}, \ref{sec:xtreemfs_osd} describe the XtreemFS directory, metadata, and object store services. In section \ref{sec:xtreemfs_client} we introduce the new XtreemFS client, which was designed from the ground up to take advantage of the new binary protocol and to remedy numerous performance and scalability problems in the previous revision of the client. Section \ref{sec:xtreemfs_rms} concerns the XtreemFS Replica Management Service. We conclude with a discussion of recent testing efforts in section \ref{sec:xtreemfs_test}. Finally, section \ref{sec:xtreemfs_proto} documents the new binary client-server and server-server protocol, a more efficient and easily-maintained replacement for the text-based protocol of previous releases. diff --git a/doc/dev-guide/xtreemfs_mrc.tex b/doc/dev-guide/xtreemfs_mrc.tex deleted file mode 100644 index 6ef54d1755432e81695cc4973b0e1cecb6c0f7e7..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_mrc.tex +++ /dev/null @@ -1,390 +0,0 @@ -The Metadata and Replica Catalog (MRC)\index{MRC} is responsible for the management of all metadata in an XtreemFS installation. Core tasks of the MRC are the management of volumes and directory trees, storage of file and directory metadata and access control enforcement. - -\subsubsection {Architecture} - -Aside from the ONC RPC\index{ONC RPC} server that listens for incoming client requests, the MRC\index{MRC} architecture comprises two core components: the processing stage and the database backend. Each request received by the ONC RPC\index{ONC RPC} server is parsed and forwarded to the processing stage, which executes the respective file system logic. Any data that needs to be retrieved or modified during file system logic execution is stored in a database backend. - -\subsubsection{Processing Stage} - -The MRC\index{MRC} interface consists of multiple so-called \emph{operations}. Each operation relates to an implementation of the logic for the execution of a certain request. There are operations e.g.\ for opening files, reading directory content, creating volumes, and the like. Operations are named and parametrized similar to their corresponding POSIX\index{POSIX} calls. To circumvent locking issues in the underlying database, operation execution is serialized for each volume, i.e.\ no more than one thread may execute operations on a certain volume at the same time. - -All operations have a similar composition. First, authorization checks are performed, in order to find out whether the user on behalf of whom the request was sent has sufficient permissions to execute the operation. In case of a positive result, the operation logic is executed. Operation logic execution may involve an arbitrary number of accesses to the underlying database backend. A \texttt{readdir} request will e.g.\ result in a database lookup for the content of a directory, a \texttt{setxattr} request will cause an extended attribute of a file to be added in the database. - -A detailed description of the interface to the MRC\index{MRC} including all operations is given in Sec.\ \ref{sec:mrc_interface}. - -\subsubsection{Database Backend} - -\newenvironment{mappingTable}[1]{\fontfamily{pcr}\begin{center}\begin{footnotesize}\begin{tabular}{|l|} \hline \textnormal{\textbf{\small{#1}}} \\ \hline \hline \\}{\end{tabular}\end{footnotesize}\end{center}\fontfamily{default}} - -\newenvironment{internalMappingTable}[1]{\tabularx{13.3cm}{|m{2.5cm}|m{1.5cm}|X|} \multicolumn{3}{l}{\textnormal{\textbf{\small{#1}}}} \\ \multicolumn{3}{l}{} \vspace{-0.3cm} \\ \hline \textnormal{\textbf{Element}} & \textnormal{\textbf{\# Bytes}} & \textnormal{\textbf{Description}} \\ \hline }{\endtabularx} - -The database backend is accessed at record level, i.e.\ at a granularity of single key-value pairs. The creation of a new file could e.g.\ require several record modifications, since a file metadata object needs to be inserted in the database, a link to the parent directory needs to be established, time stamps of parent directories need to be updated, and so forth. Multiple such records can be combined in an insert group, which causes the insertion of a new set of records to take place in a single step, i.e.\ atomically. - -The database backend implementation is decoupled from the remaining MRC\index{MRC} code via an interface, which gives developers the opportunity to implement their own database bindings. The currently used implementation is based on BabuDB. A BabuDB instance may comprise multiple databases, which may in turn comprise multiple indices. Databases are identified by name strings, whereas indices of a database are serially numbered. Lookups and insertions are directed to single indices of a database; besides normal value lookups for keys, BabuDB supports queries for key prefixes, which provides the basis for an efficient lookup of consecutive key-value pairs. - -A range of different indices are used to store XtreemFS metadata. How XtreemFS metadata is mapped to BabuDB indices will be described in the following. - -\paragraph{Metadata for Volume Management} - -Volume metadata is stored in a database named \texttt{V}. It is arranged in the following indices: - -\begin{footnotesize} -\begin{center} -\begin{tabularx}{\linewidth}{|r|l|X|} -\hline -\textbf{\#} & \textbf{Name} & \textbf{Description} \\ -\hline -0 & Volume ID Index & Maps a volume UUID to a volume metadata entity. \\ -\hline -1 & Volume Name Index & Maps a volume name to a volume ID. \\ -\hline -\end{tabularx} -\end{center} -\end{footnotesize} - -\begin{mappingTable}{Volume ID Index} - -\begin{internalMappingTable}{key} -volumeID & var & the volume ID string \\ -\hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value} -fileAccPolID & 2 & the file access policy ID for the volume \\ \hdashline -osdPolID & 2 & the OSD selection policy ID for the volume \\ \hdashline -offsVolName & 2 & the offset position of the 'volName' element, relative to the offset of the buffer's first byte\\ \hdashline -offsPolArgs & 2 & the offset position of the 'osdPolArgs' element, relative to the offset of the buffer's first byte\\ \hdashline -volID & var & the volume's UUID string\\ \hdashline -volName & var & the volume's name string\\ \hdashline -osdPolArgs & var & the volume's OSD selection policy argument string\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - -\begin{mappingTable}{Volume Name Index} - -\begin{internalMappingTable}{key} -volName & var & the volume name string \\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value} -volId & var & the volume's UUID string \\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - -\paragraph{Metadata for Files and Directories} - -File system metadata of a volume is stored in a BabuDB database with a name equal to the volume's UUID. Various indices are used to manage metadata pertaining to files and directories, which will be described in the following tables. Indices have been designed with the following goals in mind: -\begin{itemize} - \item Lookups performed by frequently invoked operations should be as fast as possible, like metadata lookups for a given directory path. - \item Database records that are frequently updated should include as little unchanged data as possible. - \item Frequently performed database updates should be fast, i.e.\ involve as little index insertions as possible. - \item Indices should contain as little redundancy as possible, in order to minimize database size and memory footprint. -\end{itemize} - -With the aforementioned goals in mind, we decided to have a primary index for the primary metadata of files, which maps a key essentially consisting of a parent directory ID and a file name hash to a value that contains a metadata record. This way, BabuDB prefix lookups for parent directory IDs can be used to efficiently retrieve contents of a directory, while normal lookups can be used to retrieve metadata for a single file. Since POSIX\index{POSIX} requires support for hard links, i.e.\ different directory entries pointing to the same metadata, and some operations require a retrieval of file metadata by means of file IDs, we decided to maintain a secondary index that allows a retrieval of metadata by means of a file ID. Other indices are used to store extended attributes and access control lists. - -\begin{footnotesize} -\begin{center} -\begin{tabularx}{\linewidth}{|r|l|X|} -\hline -\textbf{\#} & \textbf{Name} & \textbf{Description} \\ -\hline -0 & File Index & Stores primary metadata for a directory entry. Values in the index may be of different kinds: -\begin{itemize} - \item \emph{frequently changed metadata} - encapsulates all metadata that is frequently modified, such as time stamps or file sizes - \item \emph{rarely changed metadata} - encapsulates all metadata that is infrequently changed, such as file names, access modes, or ownership of a file - \item \emph{replica location metadata} - encapsulates X-Location lists of files - \item \emph{hard link targets} - in case additional hard links exist for one file, the value is a hard link target, i.e.\ a key in the File ID index. Lookups to file metadata will then be performed in two steps: first, a lookup in the File Index will be performed, in order to retrieve the hard link target; then, metadata will be looked up in the File ID Index. -\end{itemize} -\\ -\hline -1 & XAttr Index & Contains any extended attributes of files and directories. This includes Softlink targets and default striping policies, since they are mapped to extended attributes.\\ -\hline -2 & ACL Index & Contains access control list entries of all files.\\ -\hline -3 & File ID Index & The file ID index is used to retrieve file metadata by means of its ID. If no hard links have been created to a file, the file ID will be mapped to a key in the file index, for which the metadata will have to be retrieved with a second lookup. Such a mapping is necessary for some operations that are based on file IDs instead of path names. If hard links have been created, the file ID will be directly mapped to the three different types of primary file metadata (i.e.\ rarely and frequently changed metadata, as well as replica locations). In this case, the file's entries in the file index point to the corresponding prefix key in the file ID index.\\ -\hline -4 & Last ID Index & Contains a single key-value pair that maps a static key to the last file ID that has been assigned to a file. The index ensures that new file IDs are assigned to newly created files or directories.\\ -\hline -\end{tabularx} -\end{center} -\end{footnotesize} - - -\begin{mappingTable}{File Index} - -\begin{internalMappingTable}{key} -parentID & 8 & file ID of the parent directory \\ \hdashline -fileNameHash & 4 & a hash value of the file name \\ \hdashline -type & 1 & type of metadata (0=frequently changed metadata, 1=rarely changed metadata, 2=replica locations, 3=hard link targets)\\ \hdashline -collCount & 2 & counter that is incremented with each collision of file name hashes - will be omitted unless multiple file names in the directory have the same hash values\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value, type = 0} -fcMetadata & 20\slash12\slash8 & frequently changed metadata associated with the file (see 'fcMetadata' definition), 20 bytes for files \& symlinks, 12 for directories, 8 for hard link targets\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value, type = 1} -rcMetadata & var & rarely changed metadata associated with the file (see 'rcMetadata' definition)\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value, type = 2} -xLocList & var\slash8 & the replica location list associated with the file (see 'xLocList' definition), variable length for files \& directories, 8 for hard link targets\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - - -\begin{mappingTable}{XAttr Index} - -\begin{internalMappingTable}{key} -fileID & 8 & the ID of the file to which the extended attribute has been assigned\\ \hdashline -ownerHash & 4 & a hash value of the attribute's owner\\ \hdashline -attrNameHash & 4 & a hash value of the attribute name\\ \hdashline -collCount & 2 & counter that is incremented with each collision of (ownerHash, attrNameHash) pairs - will be omitted unless different attributes are hashed to the same such pair\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value} -offsKey & 2 & the offset position of the 'attrKey' element, relative to the offset of the buffer's first byte\\ \hdashline -offsValue & 2 & the offset position of the 'attrValue' element, relative to the offset of the buffer's first byte\\ \hdashline -attrOwner & var & the user ID of the attribute's owner\\ \hdashline -attrKey & var & the attribute key\\ \hdashline -attrValue & var & the attribute value\\ -\hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - - -\begin{mappingTable}{ACL Index} - -\begin{internalMappingTable}{key} -fileID & 8 & the ID of the file to which the extended attribute has been assigned\\ \hdashline -entityName & var & the name of the entity associated with the ACL entry\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value} -rights & 2 & the access rights for the entity\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - - -\begin{mappingTable}{File ID Index} - -\begin{internalMappingTable}{key} -fileID & 8 & the ID of the file\\ \hdashline -type & 1 & type of metadata (0=frequently changed metadata, 1=rarely changed metadata, 2=replica locations, 3=hard link targets)\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value, type = 0} -fcMetadata & 20\slash12 & frequently changed metadata associated with the file (see 'fcMetadata' definition), 20 bytes for files \& symlinks, 12 for directories\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value, type = 1} -rcMetadata & var & rarely changed metadata associated with the file (see 'rcMetadata' definition)\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value, type = 2} -xLocList & var & the replica location list associated with the file (see 'xLocList' definition)\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value, type = 3} -parentID & 8 & the ID of the parent directory in which the metadata for the file is stored\\ \hdashline -fileName & var & the file name in the parent directory\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - - -\begin{mappingTable}{Last ID Index} - -\begin{internalMappingTable}{key} -'*' & 1 & the only key in the table\\ -\hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{value} -lastFileID & 8 & the last ID that has been previously assigned to a file or directory\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - - -Data types referenced in the index descriptions above are listed in the following: - -\begin{mappingTable}{frequentlyChangedMetadata} - -\begin{internalMappingTable}{files} -atime & 4 & file access time stamp in seconds since 1970\\ \hdashline -ctime & 4 & file metadata change time stamp in seconds since 1970\\ \hdashline -mtime & 4 & file content modification time stamp in seconds since 1970\\ \hdashline -size & 8 & file size in bytes\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{directories} -atime & 4 & file access time stamp in seconds since 1970\\ \hdashline -ctime & 4 & file metadata change time stamp in seconds since 1970\\ \hdashline -mtime & 4 & file content modification time stamp in seconds since 1970\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - - -\begin{mappingTable}{rarelyChangedMetadata} - -\begin{internalMappingTable}{files} -type & 1 & the type of the entry (0=file, 1=directory)\\ \hdashline -id & 8 & file ID\\ \hdashline -mode & 4 & POSIX\index{POSIX} access mode\\ \hdashline -linkCount & 2 & number of hard links to the file\\ \hdashline -w32attrs & 8 & Win32-specific attributes\\ \hdashline -epoch & 4 & current truncate epoch\\ \hdashline -issEpoch & 4 & last truncate epoch that has been issued\\ \hdashline -readOnly & 1 & a flag indicating whether the file is suitable for read-only replication\\ \hdashline -offsOwner & 2 & offset position of the 'owner' element, relative to the offset of the buffer's first byte\\ \hdashline -offsGroup & 2 & offset position of the 'group' element, relative to the offset of the buffer's first byte\\ \hdashline -fileName & var & name of the file\\ \hdashline -owner & var & user ID of the file's owner\\ \hdashline -group & var & group ID of the file's owner\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{directories} -type & 1 & the type of the entry (0=file, 1=directory)\\ \hdashline -id & 8 & file ID\\ \hdashline -mode & 4 & POSIX\index{POSIX} access mode\\ \hdashline -linkCount & 2 & number of hard links to the file\\ \hdashline -w32attrs & 8 & Win32-specific attributes\\ \hdashline -offsOwner & 2 & offset position of the 'owner' element, relative to the offset of the buffer's first byte\\ \hdashline -offsGroup & 2 & offset position of the 'group' element, relative to the offset of the buffer's first byte\\ \hdashline -fileName & var & name of the directory\\ \hdashline -owner & var & user ID of the directory's owner\\ \hdashline -group & var & group ID of the directory's owner\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} - - -\begin{mappingTable}{xLocList} - -\begin{internalMappingTable}{xLocList} -version & 4 & version of the X-Locations list\\ \hdashline -replCount & 4 & number of replicas in the list\\ \hdashline -offsUpdPol & 4 & offset position of the 'updPol' element, relative to the offset of the buffer's first byte\\ \hdashline -offs1 \linebreak \dots \linebreak offsN & 4 \linebreak \dots \linebreak 4 & offset positions for all replicas, relative to the offset of the buffer's first byte\\ \hdashline -xLoc1 \linebreak \dots \linebreak xLocN& var \linebreak \dots \linebreak var & replicas in the X-Locations list\\ \hdashline -updPol & var & update policy string that describes how replica updates will be propagated\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{xLoc} -offsOsdList & 2 & offset position of the 'osdList' element, relative to the offset of the buffer's first byte\\ \hdashline -strPol & var & striping policy associated with the replica\\ \hdashline -osdList & var & list of all OSDs\index{OSD} for the replica\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{strPol} -stripeSize & 4 & size of a single stripe (=object) in kB\\ \hdashline -width & 4 & number of OSDs\index{OSD} for the striping\\ \hdashline -pattern & var & string containing the striping pattern\\ \hline -\end{internalMappingTable} - -\\ -\\ - -\begin{internalMappingTable}{osdList} -osdCount & 2 & number of OSDs\index{OSD} in the list\\ \hdashline -offsOSD1 \linebreak \dots \linebreak offsOSDn & 2 \linebreak \dots \linebreak 2 & offset positions for all OSD UUIDs, relative to the offset of the buffer's first byte\\ \hdashline -osdUUID1 \linebreak \dots \linebreak osdUUIDn & var \linebreak \dots \linebreak var & UUIDs of all OSDs in the list\\ \hline -\end{internalMappingTable} - -\\ -\\ -\hline - -\end{mappingTable} diff --git a/doc/dev-guide/xtreemfs_osd.tex b/doc/dev-guide/xtreemfs_osd.tex deleted file mode 100644 index f008ffc802f32c0cb1bdbab91292075964729f47..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_osd.tex +++ /dev/null @@ -1,31 +0,0 @@ -The Object Storage Device (OSD)\index{OSD} is responsible for reading and writing objects from/to disk. In addition, it also implements the replication (which is transparent to clients). In this section, we first describe the stages and components of the OSD\index{OSD}. We then describe the interaction between OSDs\index{OSD} for striped files and for read-only replication. - -\begin{itemize} - \item \textbf{\texttt{StorageStage} and \texttt{StorageThread}}\\ - The StorageStage distributes the request onto a pool of StorageThreads. The allocation of requests is based on the fileID to ensure that all requests for a single file are handled by the same thread. This is necessary to avoid sharing of file metadata across multiple threads. - -The StorageThread implements the actual file I/O to access objects on disk. It uses a StorageLayout which is responsible for arranging the objects into files and directories in the underlying file system. - - \item \textbf{\texttt{PreprocStage}}\\ -Analyzes the incoming RPC requests and starts the matching Operation for the requests. It also parses the request arguments (RPC message) based on the Operation. In addition, it parses and validates the signed capability and ensures that the client is authorized to execute the operation. To enhance performance, the PreprocStage keeps a cache of validated Capabilities and XLocation lists. -The PreprocStage also keeps a list of open files which is updated whenever a file (i.e. a file's object) is accessed. The list is regularly checked ( approx. every mminute) for last access times and files which have timed out will be closed. This close event is sent to the other stages, to allow them to clean their caches. As POSIX\index{POSIX} requires that a file which is deleted while still opened can still be read or written to, the close event is also used to finally remove data of deleted files. - - \item \textbf{\texttt{DeletionStage}}\\ -This stage is removing the objects on disk for files which have been deleted. This is done directly when the unlink RPC is received or when the file is closed (see PreprocStage). - - \item \textbf{\texttt{VivaldiStage}}\\ -Implements the OSD's\index{OSD} Vivaldi component and regularly updates its coordinates. See Sec. \ref{sec:xtreemfs_rms} for details on Vivaldi. - - \item \textbf{\texttt{ReplicationStage}}\\ -Fetches data from remote OSDs\index{OSD} for files which are replicated. For more details about the read-only replication see Sec. \ref{sec:xtreemfs_ronly_replication}. - - \item \textbf{\texttt{CleanupThread}}\\ -This is not a regular stage, but a background task to scan for orphaned files. If a file is deleted on the MRC\index{MRC} but the client fails to delete the file at the OSD\index{OSD}, we get so called zombies. To remove them, the OSD\index{OSD} has to scan its file system from time to time and check the files at the MRC\index{MRC}. How often and when these cleanup operations should be executed depends on the usage pattern of the system (e.g. client's often disconnecting during operations). -\end{itemize} - -\subsubsection{Striping} -XtreemFS allows files to be striped (distributed) over several OSDs\index{OSD}. To ensure correct POSIX\index{POSIX} semantics in this distributed case, OSDs\index{OSD} need to exchange additional information on some write and read operations. We use additional UDP\index{UDP} datagrams on write to disseminate file size update hints among OSDs\index{OSD}. See \cite{StripingLasco} for a detailed description of the algorithms used in XtreemFS. - -\subsubsection{Read-only replication} -\label{sec:xtreemfs_ronly_replication} -The read-only replication allows users to replicate their immutable files with very low overhead. Users can set a file to read-only which means that it cannot be modified anymore. This allows users to add replicas on other OSDs\index{OSD} which can either be a ``full'' or a ``lazy'' replica. For a ``full'' replica the OSD\index{OSD} will automatically fetch all objects of that file. For a ``lazy'' replica the OSD\index{OSD} only fetches the objects when a client tries to read them. Additional prefetching for ``lazy'' replicas will be added. diff --git a/doc/dev-guide/xtreemfs_proto.tex b/doc/dev-guide/xtreemfs_proto.tex deleted file mode 100644 index b3cc8c678575be6a8c6df450e93b7dd5b6fabc86..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_proto.tex +++ /dev/null @@ -1,1061 +0,0 @@ - - - - - - -XtreemFS uses ONC RPC\cite{RFC1831}\index{ONC RPC} for executing remote operations. Interfaces and records are defined in a subset of CORBA IDL\index{IDL}. Yidl\footnote{http://code.google.com/p/yield/} is used to generate the code for the interfaces and records in C++ and Java. - -To build the Java classes from the interfaces: -\begin{enumerate} - \item export \texttt{PYTHONPATH} to point to your yidl source directory:\\ - \texttt{export PYTHONPATH=/home/user/yidl/src} - \item execute \texttt{bin/generate\_xtreemfs\_java.py} -\end{enumerate} - - -\makeatletter -\renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}% - {-3.25ex\@plus -1ex \@minus -.2ex}% - {0.1ex \@plus .0ex}% - {\normalfont\normalsize\bfseries}} -\makeatother - -\subsection{Constants} -\label{sec:xtreemfs_proto_const} - -Globally shared constants are defined in \texttt{in\-ter\-faces/const\-ants.idl}. - -\begin{description} - \item[\texttt{ACCESS\_CONTROL\_POLICY\_NULL}] don't use any access policy (on the MRC\index{MRC}). This will allow all users to do everything on the volume. - - \item[\texttt{ACCESS\_CONTROL\_POLICY\_POSIX}] use standard POSIX\index{POSIX} permissions (user, group, others) on the volume. - - \item[\texttt{ACCESS\_CONTROL\_POLICY\_VOLUME}] similar to POSIX\index{POSIX} permissions but the permission for the root (/) is used for the entire volume. - - \item[\texttt{ACCESS\_CONTROL\_POLICY\_DEFAULT}] the policy to use in e.g. mkvol if nothing is specified. - - \item[\texttt{ONCRPC\_SCHEME}] scheme for URLs. - - \item[\texttt{ONCRPCS\_SCHEME}] scheme for URLs when using SSL. - - \item[\texttt{ONCRPC\_AUTH\_FLAVOR}] constant to use for ONC RPC\index{ONC RPC} auth\_flavor to indicate XtreemFS auth. If present, a UserCredentials record is sent in auth\_opaque - - \item[\texttt{OSD\_SELECTION\_POLICY\_SIMPLE}] only OSDs which are alive and which have more than 2GB free space are used. - - \item[\texttt{OSD\_SELECTION\_POLICY\_DEFAULT}] the policy to use in e.g. mkvol if nothing is specified. - - \item[\texttt{REPL\_UPDATE\_PC\_NONE}] no replication is used - - \item[\texttt{REPL\_UPDATE\_PC\_RONLY}] read-only replication - - \item[\texttt{SERVICE\_TYPE\_MRC}] for DIR\index{DIR} service registry, service is an MRC\index{MRC} - - \item[\texttt{SERVICE\_TYPE\_OSD}] for DIR\index{DIR} service registry, service is an OSD\index{OSD} - - \item[\texttt{SERVICE\_TYPE\_VOLUME}] for DIR\index{DIR} service registry, service is a volume - - \item[\texttt{STRIPING\_POLICY\_RAID0}] RAID0 (striping) - - \item[\texttt{STRIPING\_POLICY\_DEFAULT}] the policy to use in e.g. mkvol if nothing is specified. - - \item[\texttt{STRIPING\_POLICY\_STRIPE\_SIZE\_DEFAULT}] default stripe size in KB to use if nothing is specified. - - \item[\texttt{STRIPING\_POLICY\_WIDTH\_DEFAULT}] default striping width (number of OSDs\index{OSD}) to use if nothing is specified. - - \item[\texttt{SYSTEM\_V\_FCNTL\_H\_O\_...}] POSIX\index{POSIX} constants - -\end{description} - -\subsection{Types} - -\subsubsection{Globally Shared Types} - -Globally shared data structures are defined in \texttt{inter\-faces/types.idl}. - -\paragraph{\texttt{struct UserCredentials}} - -User information sent in the ONC RPC\index{ONC RPC} \texttt{opaque\_auth} body if XtreemFS authentication is used. How the userID and groupIDs look like depends on the policy used in the client which translates the local uid/gid. - -\begin{tabularx}{\textwidth}{lX} - \texttt{user\_id} & globally unique userID\\ - \texttt{group\_ids} & list of globally unique groupIDs (must contain at least one entry)\\ - \texttt{password} & admin password (in cleartext) required for some operations (e.g. mkvol) -\end{tabularx} - -\paragraph{\texttt{struct VivaldiCoordinates}} - -Structure used to exchange Vivaldi coordinates between components, also used in UDP\index{UDP} packets for measuring latency between XtreemFS clients and OSDs\index{OSD}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{x\_coordinate} & x coordinate\\ - \texttt{y\_coordinate} & y coordinate\\ - \texttt{local\_error} & confidence in correctness of x/y coordinates -\end{tabularx} - - -\subsubsection{Types Shared between MRC\index{MRC} and OSD\index{OSD}} - -Types that are mainly shared between MRC\index{MRC} and OSD\index{OSD} are defined in \texttt{inter\-faces/mrc\_osd\_\-types.idl}. - -\paragraph{\texttt{struct NewFileSize}} -Sent by the OSD\index{OSD} in response to a file modification operation if the file size has changed. A client may cache these updates and send them to the MRC\index{MRC} when renewing a capability, on fsync/flush and close. The client needs only to send the most recent record it received from the OSD\index{OSD} for a given file. Most recent means that: \texttt{ -(size\_in\_bytes' $>$ size\_in\_bytes} \texttt{AND} \texttt{truncate\_epoch' == truncate\_epoch) -OR} \texttt{(truncate\_epoch' $>$ truncate\_epoch)} - -The client should update its local file size cache with the NewFileSize records received from the OSD\index{OSD}. The client should use the \textit{locally cached} file size on stat rather than the result from the MRC\index{MRC} to ensure that local processes see their own modifications. - -\begin{tabularx}{\textwidth}{lX} - \texttt{size\_in\_bytes} & the new file size in bytes\\ - \texttt{truncate\_epoch} & truncate epoch in which this operation was executed (used by the MRC\index{MRC} for ordering updates) -\end{tabularx} - - -\paragraph{\texttt{struct OSDtoMRCData}} -Data sent by the OSD\index{OSD} to the client which is expected to pass it on to the MRC\index{MRC}. When the data should be passed to the MRC\index{MRC} depends on the \texttt{caching\_policy}. This feature is currently not used. - -\begin{tabularx}{\textwidth}{lX} - \texttt{caching\_policy} & describes how the client is allowed to cache the data (when to send it to the MRC\index{MRC})\\ - \texttt{data} & opaque data -\end{tabularx} - -\paragraph{\texttt{struct OSDWriteResponse}} -Record containing file size updates and/or OSDtoMRCData. Returned from all data-modifying operations. - -\begin{tabularx}{\textwidth}{lX} - \texttt{new\_file\_size} & contains no record or at most one record if the file size changed\\ - \texttt{opaque\_data} & contains 0 or more records -\end{tabularx} - - -\paragraph{\texttt{struct StripingPolicy}} -Describes how a replica (one copy of the file) is split into objects. - -\begin{tabularx}{\textwidth}{lX} - \texttt{policy} & describes the scheme to use for distributing the objects among the OSDs\index{OSD}, e.g. RAID0 for simple round robin striping.\\ - \texttt{stripe\_size} & the size of the objects in kilobytes, must be $>= 4$\\ - \texttt{width} & the number of OSDs\index{OSD} to use for striping, must be $>= 1$. -\end{tabularx} - - -\paragraph{\texttt{struct Replica}} -Describes a single copy of a file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{striping\_policy} & the striping policy to use for this replica.\\ - \texttt{replication\_flags} & value depends on the replication policy, e.g. to indicate a full or lazy replica.\\ - \texttt{osd\_uuids} & ordered (!) list of OSDs\index{OSD} holding objects of the file. -\end{tabularx} - - - -\paragraph{\texttt{struct XLocSet}} -Describes a complete file together with all replicas (copies) and how they are kept consistent. - -\begin{tabularx}{\textwidth}{lX} - \texttt{replicas} & list of the file's replicas (i.e. list of Replica structs)\\ - \texttt{version} & incremented by the MRC\index{MRC} on each modification of the list. Used by the OSD\index{OSD} to reject clients working with outdated lists.\\ - \texttt{repUpdatePolicy} & the policy used for keeping replicas in sync. \\ - \texttt{read\_only\_file\_size} & the size of the file in bytes, used only for read-only replication. -\end{tabularx} - - -\paragraph{\texttt{struct XCap}} -Security token which is issued by the MRC\index{MRC} and authorizes a client to execute operations on a file at the OSDs\index{OSD}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_id} & file for which the capability can be used\\ - \texttt{access\_mode} & POSIX\index{POSIX} access mode for which client is authorized (e.g. read only, delete, write, truncate).\\ - \texttt{expires\_s} & absolute timestamp when the capability becomes invalid (seconds since epoch). \\ - \texttt{client\_identity} & the client identity set by the MRC\index{MRC}, currently the client's IP address. \\ - \texttt{truncate\_epoch} & the file's current truncate epoch. \\ - \texttt{server\_signature} & the MRC's\index{MRC} signature for the capability which is used by the OSD\index{OSD} to validate the XCap. Signature is created using shared secret specified in the MRC\index{MRC} and OSD\index{OSD} configuration. \\ -\end{tabularx} - - - -\paragraph{\texttt{struct FileCredentials}} -A record containing the XLocSet and XCap for a file. Required for most OSD\index{OSD} operations. - -\begin{tabularx}{\textwidth}{lX} - \texttt{xlocs} & the XLocSet\\ - \texttt{xcap} & the capability\\ -\end{tabularx} - - -\paragraph{\texttt{sequence FileCredentialsSet}} -Used by the MRC\index{MRC} to return no or at most one FileCredentials record. - - - - - -% %%%%%%%%%%%%%%%%%%%%%%%%%% EXCEPTIONS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsubsection{Exceptions} - -Exceptions that may be thrown in connection with an RPC are defined in \texttt{interfaces/exceptions.idl}. - -\paragraph{\texttt{exception ProtocolException}} -Thrown on ONC RPC\index{ONC RPC} errors (e.g. GARBAGE\_ARGS) - -\begin{tabularx}{\textwidth}{lX} - \texttt{accept\_stat} & ONC RPC\index{ONC RPC} \texttt{accept\_stat} value\\ - \texttt{error\_code} & POSIX\index{POSIX} errno, if available\\ - \texttt{stack\_trace} & optional, for debugging only -\end{tabularx} - - -\paragraph{\texttt{exception errnoException}} -Thrown by the MRC\index{MRC} to indicate a POSIX\index{POSIX} error. - -\begin{tabularx}{\textwidth}{lX} - \texttt{error\_code} & POSIX\index{POSIX} errno, if available\\ - \texttt{error\_message} & optional text message\\ - \texttt{stack\_trace} & optional, for debugging only -\end{tabularx} - - -\paragraph{\texttt{exception RedirectException}} -Thrown by the DIR\index{DIR},MRC\index{MRC} and OSD\index{OSD} to redirect the client to another service. Use e.g. for master slave replication to direct the client to the current master. - -\begin{tabularx}{\textwidth}{lX} - \texttt{to\_uuid} & service to contact\\ -\end{tabularx} - - -\paragraph{\texttt{exception ConcurrentModificationException}} -Thrown by the DIR\index{DIR} if a record was modified by another service on the meantime. - -\begin{tabularx}{\textwidth}{lX} - \texttt{stack\_trace} & optional, for debugging only -\end{tabularx} - - -\paragraph{\texttt{exception InvalidArgumentException}} -Thrown by the DIR\index{DIR} if an input value is not acceptable. - -\begin{tabularx}{\textwidth}{lX} - \texttt{error\_message} & error message describing the correct values. -\end{tabularx} - - -% %%%%%%%%%%%%%%%%%%%%%%%%%% DIR INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{Directory Service Interface} - -The Directory Service interface is defined in \texttt{interfaces/dir\_interface.idl}. - -\paragraph{\texttt{struct AddressMapping}} -Maps a service UUID to protocol, hostname/IP and port. A service can have multiple mappings for different networks (e.g. inside a cluster with private IP addresses). At the moment only ``*'' is supported for \texttt{match\_network} which indicates a match for all networks. - -\begin{tabularx}{\textwidth}{lX} - \texttt{uuid} & the service UUID\\ - \texttt{version} & the record's version, used by the DIR\index{DIR} to detect concurrent modifications\\ - \texttt{protocol} & the protocol used by the service\\ - \texttt{address} & resolvable hostname or IP address in text form\\ - \texttt{port} & port on which the service listens\\ - \texttt{match\_network} & for future use, must be \texttt{*}\\ - \texttt{ttl\_s} & time to live in seconds, indicates how long this record can be cached before it is re-fetched from the DIR\index{DIR}\\ -\end{tabularx} - -\paragraph{\texttt{sequence AddressMappingSet}} -Future releases of XtreemFS will support multi-network setups to ease the usage of XtreemFS in shared public/private network environments often found in clusters. - - -\paragraph{\texttt{struct Service}} -Information on a service registered at the DIR\index{DIR}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{uuid} & the service UUID\\ - \texttt{version} & the record's version, used by the DIR\index{DIR} to detect concurrent modifications\\ - \texttt{type} & service type (see \ref{sec:xtreemfs_proto_const})\\ - \texttt{name} & human readable name of the service; for volumes: the unique volume name\\ - \texttt{last\_updated\_s} & timestamp of the last time (in seconds since epoch) the service updated its entry at the DIR\index{DIR}. Used as a coarse-grained heartbeat-signal.\\ - \texttt{data} & a map of additional data which depends on the service (e.g. MRC\index{MRC} of a volume or free space of an OSD\index{OSD})\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_address\_mappings\_get( string uuid, out AddressMappingSet address\_mappings~)}} -Get an address mapping for the service specified by \texttt{uuid}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{uuid} & the service UUID\\ - \texttt{out address\_mappings} & empty, if no mapping exists, one (or more) records otherwise\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_address\_mappings\_remove( string uuid~)}} -Remove an address mapping from the DIR\index{DIR}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{uuid} & the service UUID\\ -\end{tabularx} - - -\paragraph{\texttt{uint64\_t xtreemfs\_address\_mappings\_set( AddressMappingSet address\_mappings~)}} -Updates the address mappings for a service. - -\begin{tabularx}{\textwidth}{lX} - \texttt{address\_mappings} & the new mappings. The UUID in all records must be the same. The version must be 0 for a new mapping or the version obtained with the last read from the DIR\index{DIR}.\\ - returns & the new version of the mapping\\ - throws & ConcurrentModificationException if the record was updated (version incremented by DIR\index{DIR}) between reading and updating the record. -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_checkpoint()}} -Forces the DIR\index{DIR} to create a BabuDB checkpoint. This operation does not block, the checkpoint is created asynchronously. The admin password must be sent via the XtreemFS authentication. - - -\paragraph{\texttt{uint64\_t xtreemfs\_global\_time\_s\_get()}} -Returns the current system time on the DIR\index{DIR} in seconds since epoch. Used to synchronize MRCs\index{MRC} and OSDs\index{OSD} to the global XtreemFS system time. The DIR\index{DIR} system should be synchronized with a precise clock using e.g. ntp. - -\begin{tabularx}{\textwidth}{lX} - returns & system time in seconds since UNIX epoch. -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_service\_get\_by\_type( uint16\_t type, out ServiceSet services~)}} -Get all services of a specific type registered at the DIR\index{DIR}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{type} & the service type to return\\ - \texttt{out services} & all matching services\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_service\_get\_by\_uuid( string uuid, out ServiceSet services~)}} -Get the service information for a service with a specific UUID. - -\begin{tabularx}{\textwidth}{lX} - \texttt{uuid} & the service uuid\\ - \texttt{out services} & one record, if the service is registered, empty list otherwise\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_service\_get\_by\_name( string name, out ServiceSet services~)}} -Get the service information for a service with a specific name. - -\begin{tabularx}{\textwidth}{lX} - \texttt{name} & the service's name\\ - \texttt{out services} & one record, if the service is registered, empty list otherwise\\ -\end{tabularx} - - - -\paragraph{\texttt{uint64\_t xtreemfs\_service\_register( Service service~)}} -Update a service registration at the DIR\index{DIR}. Updates the \texttt{last\_update\_s} field of the service. - -\begin{tabularx}{\textwidth}{lX} - \texttt{service} & the service's data. The UUID must be the service's UUID, the version must be 0 for a new service or the version obtained with the last read from the DIR\index{DIR}.\\ - returns & the new version of the mapping\\ - throws & ConcurrentModificationException if the record was updated (version incremented by DIR\index{DIR}) between reading and updating the record.\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_service\_deregister( string uuid~)}} -Removes the service registry entry for the service from the DIR\index{DIR}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{uuid} & the service uuid\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_service\_offline( string uuid~)}} -Sets the \texttt{last\_update\_s} field to 0 which indicates that the service was taken offline. - -\begin{tabularx}{\textwidth}{lX} - \texttt{uuid} & the service uuid\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_shutdown()}} -Shuts down the DIR\index{DIR} service, does not force a checkpoint of the database. The admin password must be sent via the XtreemFS authentication. - - - - -% %%%%%%%%%%%%%%%%%%%%%%%%%% MRC INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{Metadata and Replica Catalog Interface} -\label{sec:mrc_interface} - -The MRC\index{MRC} interface is defined in \texttt{interfaces/mrc\_interface.idl}. - -\paragraph{\texttt{struct Stat}} -Contains information about a file, directory or symbolic link that is sent to the client in response to a \texttt{getattr} request. - -\begin{tabularx}{\textwidth}{lX} - \texttt{mode} & the file's current access mode\\ - \texttt{nlink} & the number of hard links to the file\\ - \texttt{uid} & the numeric UID of the file's owner (just for compatibility reasons, will not be filled)\\ - \texttt{gid} & the numeric GID of the file's owner (just for compatibility reasons, will not be filled)\\ - \texttt{unused\_dev} & (just for compatibility reasons, will not be filled)\\ - \texttt{size} & the current file size in bytes\\ - \texttt{atime\_ns} & the file's atime in nanos\\ - \texttt{mtime\_ns} & the file's mtime in nanos\\ - \texttt{ctime\_ns} & the file's ctime in nanos\\ - \texttt{user\_id} & the XtreemFS user ID string of the file's owner\\ - \texttt{group\_id} & the XtreemFS group ID string of the file's owner\\ - \texttt{file\_id} & the XtreemFS file ID\\ - \texttt{link\_target} & the target path for symbolic links\\ - \texttt{truncate\_epoch} & the file's current truncate epoch\\ - \texttt{attributes} & a set of Win32 specific file attributes\\ -\end{tabularx} - -\paragraph{\texttt{struct DirectoryEntry}} -Contains information about a directory entry that is sent to the client in response to a \texttt{readdir} request. - -\begin{tabularx}{\textwidth}{lX} - \texttt{name} & the name of the directory entry\\ - \texttt{stbuf} & a buffer of type \texttt{struct Stat} that contains information about the file\\ -\end{tabularx} - -\paragraph{\texttt{struct StatVFS}} -Contains information about a mounted XtreemFS volume, which is sent to the client in response to a \texttt{statvfs} request. - -\begin{tabularx}{\textwidth}{lX} - \texttt{bsize} & the file system's block size (1024)\\ - \texttt{bfree} & the number of free blocks\\ - \texttt{fsid} & the file system ID (volume ID)\\ - \texttt{namelen} & maximum file name length (1024)\\ -\end{tabularx} - -\paragraph{\texttt{struct Volume}} -Contains information about a volume. - -\begin{tabularx}{\textwidth}{lX} - \texttt{name} & the volume name\\ - \texttt{mode} & the access mode for the volume's parent directory\\ - \texttt{osd\_selection\_policy} & the ID of the OSD\index{OSD} selection policy for the volume\\ - \texttt{default\_striping\_policy} & the ID of the default striping policy for the volume\\ - \texttt{id} & the volume UUID\\ - \texttt{owner\_user\_id} & the XtreemFS user ID of the volume's owner\\ - \texttt{owner\_group\_id} & the XtreemFS group ID of the volume's owner\\ -\end{tabularx} - -\paragraph{\texttt{const DEFAULT\_ONCRPC\_PORT}} -Constant defining the default MRC\index{MRC} ONC RPC\index{ONC RPC} port. - -\paragraph{\texttt{const DEFAULT\_ONCRPCS\_PORT}} -Constant defining the default MRC\index{MRC} ONC RPC\index{ONC RPC} port for SSL. - -\paragraph{\texttt{const DEFAULT\_HTTP\_PORT}} -Constant defining the default MRC\index{MRC} HTTP port. - -\paragraph{\texttt{exception MRCException}} -Thrown by all MRC\index{MRC} operations. - -\paragraph{\texttt{boolean access( string path, uint32\_t mode )}} -Checks access to a file or directory. Responds with \texttt{true} if access is granted, \texttt{false}, otherwise. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{mode} & the access flags to check\\ -\end{tabularx} - -\paragraph{\texttt{void chmod( string path, uint32\_t mode )}} -Changes the access mode of a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{mode} & the new access mode\\ -\end{tabularx} - -\paragraph{\texttt{void chown( string path, string user\_id, string group\_id )}} -Changes the owner of a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{user\_id} & the new owner ID\\ - \texttt{group\_id} & the new owning group ID\\ -\end{tabularx} - -\paragraph{\texttt{void create( string path, string user\_id, string group\_id )}} -Creates a new file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the new file\\ - \texttt{mode} & the initial access mode for the new file\\ -\end{tabularx} - -\paragraph{\texttt{void ftruncate( XCap write\_xcap, out XCap truncate\_xcap )}} -Issues a new truncate capability for an open file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{write\_xcap} & a valid Capability with write permissions to the file\\ - \texttt{out truncate\_xcap} & a new capability with write and truncate permissions, which has to be used for subsequent operations\\ -\end{tabularx} - -\paragraph{\texttt{void getattr( string path, out Stat stbuf )}} -Returns information on a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{out stbuf} & a buffer containing information on the file or directory\\ -\end{tabularx} - -\paragraph{\texttt{void getxattr( string path, string name, out string value )}} -Returns the value of an extended attribute of a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{name} & the name of the attribute\\ - \texttt{out value} & the attribute value\\ -\end{tabularx} - -\paragraph{\texttt{void link( string target\_path, string link\_path )}} -Creates a new hard link to an existing file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{target\_path} & the path to the existing file\\ - \texttt{link\_path} & the path defining where the new hard link shall be created\\ -\end{tabularx} - -\paragraph{\texttt{void listxattr( string path, out StringSet names )}} -Returns the set of extended attributes assigned to a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{names} & the list of attribute names assigned to the file or directory\\ -\end{tabularx} - -\paragraph{\texttt{mkdir( string path, uint32\_t mode )}} -Creates a new directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the new directory\\ - \texttt{mode} & the initial access mode for the new directory\\ -\end{tabularx} - -\paragraph{\texttt{open( string path, uint32\_t flags, uint32\_t mode, out FileCredentials file\_credentials )}} -Opens a file by performing an access check and issuing a new Capability for OSD\index{OSD} access in case of success. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file\\ - \texttt{flags} & a set of flags specifying the kind of access that is requested\\ - \texttt{mode} & initial access mode for a newly created file in case \texttt{flags} contains \texttt{O\_CREAT}\\ - \texttt{out file\_credentials} & a set of file credentials containing the file's X-Locations list and the newly issued Capability\\ -\end{tabularx} - -\paragraph{\texttt{readdir( string path, out DirectoryEntrySet directory\_entries )}} -Lists the content of a directory, including all file metadata. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the directory\\ - \texttt{out directory\_entries} & a list containing all nested directory entries for the given directory\\ -\end{tabularx} - -\paragraph{\texttt{void removexattr( string path, string name )}} -Removes an extended attribute from a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{name} & the name of the attribute to remove\\ -\end{tabularx} - -\paragraph{\texttt{void rename( string source\_path, string target\_path, out FileCredentialsSet file\_credentials )}} -Renames a path. - -\begin{tabularx}{\textwidth}{lX} - \texttt{source\_path} & the former path to the file or directory\\ - \texttt{target\_path} & the new path to the file or directory\\ - \texttt{out file\_credentials} & contains an X-Locations list and deletion Capability in case the target path was overwritten\\ -\end{tabularx} - -\paragraph{\texttt{rmdir( string path )}} -Removes an empty directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the directory\\ -\end{tabularx} - -\paragraph{\texttt{void setattr( string path, Stat stbuf )}} -Sets metadata of a file or directory. Currently, this call is only used to set the file's Win32 attributes. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{stbuf} & a buffer containing the metadata to set\\ -\end{tabularx} - -\paragraph{\texttt{void setxattr( string path, string name, string value, int flags~)}} -Sets an extended attribute of a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{name} & the name of the attribute\\ - \texttt{value} & the new value for the attribute\\ - \texttt{flags} & a set of system flags associated with the attribute (currently ignored)\\ -\end{tabularx} - -\paragraph{\texttt{void statvfs( string volume\_name, out StatVFS stbuf~)}} -Returns information about a volume. - -\begin{tabularx}{\textwidth}{lX} - \texttt{volume\_name} & the volume name\\ - \texttt{stbuf} & a buffer containing information about the volume\\ -\end{tabularx} - -\paragraph{\texttt{void symlink( string target\_path, string link\_path~)}} -Creates a symbolic link. - -\begin{tabularx}{\textwidth}{lX} - \texttt{target\_path} & the target path\\ - \texttt{link\_path} & the path for the new symbolic link\\ -\end{tabularx} - -\paragraph{\texttt{void unlink( string path, out FileCredentialsSet file\_credentials~)}} -Unlinks a file from a directory. If no more links to the file exist, file metadata will be deleted. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file\\ - \texttt{out file\_credentials} & a set of file credentials containing a deletion Capability and X-Locations list in case file metadata needs to be deleted.\\ -\end{tabularx} - -\paragraph{\texttt{void utimens( string path, uint64\_t atime\_ns, uint64\_t mtime\_ns, uint64\_t ctime\_ns )}} -Sets the POSIX\index{POSIX} time stamps of a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{atime\_ns} & the new access time stamp in nanos (will be ignored if set to 0)\\ - \texttt{mtime\_ns} & the new modification time stamp in nanos (will be ignored if set to 0)\\ - \texttt{ctime\_ns} & the new change time stamp in nanos (will be ignored if set to 0)\\ -\end{tabularx} - -\paragraph{\texttt{void utimens( string path, uint64\_t atime\_ns, uint64\_t mtime\_ns, uint64\_t ctime\_ns )}} -Sets the POSIX\index{POSIX} time stamps of a file or directory. - -\begin{tabularx}{\textwidth}{lX} - \texttt{path} & the path to the file or directory\\ - \texttt{atime\_ns} & the new access time stamp in nanos (will be ignored if set to 0)\\ - \texttt{mtime\_ns} & the new modification time stamp in nanos (will be ignored if set to 0)\\ - \texttt{ctime\_ns} & the new change time stamp in nanos (will be ignored if set to 0)\\ -\end{tabularx} - -\paragraph{\texttt{xtreemfs\_checkpoint()}} -Enforces the creation of a new database checkpoint. The call blocks until checkpoint creation has completed. - -\paragraph{\texttt{void xtreemfs\_check\_file\_exists( string volume\_id, StringSet file\_ids, out string bitmap )}} -Checks for a set of file IDs whether the given files exist in the given volume. This call is necessary for cleanup purposes. - -\begin{tabularx}{\textwidth}{lX} - \texttt{volume\_id} & the volume's UUID\\ - \texttt{file\_ids} & a list of file IDs to check\\ - \texttt{out bitmap} & a string containing '1's for each file in \texttt{file\_ids} that exists, and '0's for each file that does not exist, in the same order as the file IDs given in \texttt{file\_ids}\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_dump\_database( string dump\_file )}} -Creates an XML dump of the MRC\index{MRC} database on the server. - -\begin{tabularx}{\textwidth}{lX} - \texttt{dump\_file} & the path at which to store XML dump file on the MRC's\index{MRC} local file system\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_get\_suitable\_osds( string file\_id, out StringSet osd\_uuids~)}} -Returns a list of suitable OSDs\index{OSD} for the given file. The call can be used to find OSDs\index{OSD} that are suitable for new replicas of a file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_id} & the file ID\\ - \texttt{out osd\_uuids} & a list of OSD\index{OSD} UUIDs that can be used for the file\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_lsvol( out VolumeSet volumes )}} -Returns a list of all volumes stored on the MRC\index{MRC}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{out volumes} & a list containing information on each volume stored on the MRC\index{MRC}\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_mkvol( Volume volume )}} -Creates a new volume. - -\begin{tabularx}{\textwidth}{lX} - \texttt{volume} & information about the volume to create\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_renew\_capability( in XCap old\_xcap, out XCap renewed\_xcap~)}} -Extends the validity of a capability. The capability must be valid in order to be renewed. - -\begin{tabularx}{\textwidth}{lX} - \texttt{old\_xcap} & the capability to be renewed\\ - \texttt{renewed\_xcap} & a new capability with the same properties except for an extended validity period\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_replica\_add( string file\_id, Replica new\_replica )}} -Adds a new replica to a file. The file's read-only flag must be set to \texttt{true}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_id} & the file ID\\ - \texttt{new\_replica} & the new replica to be added\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_replica\_list( string file\_id, out ReplicaSet replicas~)}} -Returns the list of replicas of a file. Information on each of the replicas in the list includes the striping policy and X-Loc list. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_id} & the file ID\\ - \texttt{out replicas} & the list of replicas\\ -\end{tabularx} - -\paragraph{\texttt{xtreemfs\_replica\_remove( string file\_id, string osd\_uuid, out XCap delete\_xcap )}} -Removes a replica from a file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_id} & the file ID\\ - \texttt{osd\_uuid} & the UUID of the head OSD\index{OSD}\\ - \texttt{delete\_xcap} & a capability for deleting the data associated with the replica on the OSD\index{OSD}\\ -\end{tabularx} - -\paragraph{\texttt{xtreemfs\_restore\_database( string dump\_file )}} -Restores the MRC\index{MRC} database from an XML dump. When the operation is invoked, no volumes may exist in the current database. - -\begin{tabularx}{\textwidth}{lX} - \texttt{dump\_file} & the path to the XML dump file on the MRC's\index{MRC} local file system -\end{tabularx} - -\paragraph{\texttt{xtreemfs\_restore\_file( string file\_path, string file\_id, uint64\_t file\_size, string osd\_uuid, int32\_t stripe\_size )}} -Restores a file from the given metadata. - -\begin{tabularx}{\textwidth}{lX} - \texttt{dump\_file\_path} & the path associated with the restored file\\ - \texttt{file\_id} & the ID associated with the restored file\\ - \texttt{file\_size} & the size associated with the restored file\\ - \texttt{osd\_uuid} & the OSD\index{OSD} on which the file content is stored\\ - \texttt{stripe\_size} & the stripe size associated with the restored file\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_rmvol( string volume\_name )}} -Deletes a volume, including the metadata of all nested files and directories. - -\begin{tabularx}{\textwidth}{lX} - \texttt{volume\_name} & the name of the volume to delete\\ -\end{tabularx} - -\paragraph{\texttt{void xtreemfs\_shutdown( )}} -Gracefully terminates the MRC\index{MRC} with all its sub-components. - -\paragraph{\texttt{void xtreemfs\_update\_file\_size( XCap xcap, OSDWriteResponse osd\_write\_response~)}} -Updates the size of a file in response to an OSD\index{OSD} write operation. - -\begin{tabularx}{\textwidth}{lX} - \texttt{osd\_write\_response} & the response from the OSD\index{OSD}, which may contain a new file size\\ -\end{tabularx} - - - -% %%%%%%%%%%%%%%%%%%%%%%%%%% OSD INTERFACE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{Object Storage Device Interface} - -The OSD\index{OSD} interface is defined in \texttt{interfaces/osd\_interface.idl}. - -\paragraph{\texttt{struct InternalGmax}} -Sent by OSDs\index{OSD} to determine the actual file size of a striped file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{epoch} & the file's latest truncate epoch the OSD\index{OSD} knows\\ - \texttt{last\_object\_id} & last object number known by the OSD\index{OSD}\\ - \texttt{file\_size} & locally known file size in bytes\\ -\end{tabularx} - - -\paragraph{\texttt{struct ObjectData}} -Sent by OSDs\index{OSD} to determine the actual file size of a striped file. - -\begin{tabularx}{\textwidth}{lX} - \texttt{data} & object data (file content)\\ - \texttt{checksum} & checksum for data\\ - \texttt{zero\_padding} & zeros to append to data (padding objects, POSIX\index{POSIX} sparse file semantics)\\ - \texttt{invalid\_checksum\_on\_osd} & true if the OSD\index{OSD} detected corrupted on-disk data\\ -\end{tabularx} - - -\paragraph{\texttt{exception OSDException}} -Thrown by all OSD\index{OSD} operations. - -\begin{tabularx}{\textwidth}{lX} - \texttt{error\_code} & see class \texttt{org.xtreemfs.osd.ErrorCodes} for a list of error codes\\ - \texttt{error\_message} & optional, human readable error message\\ - \texttt{stack\_trace} & optional, for debugging only\\ -\end{tabularx} - - - - -\paragraph{\texttt{void read( FileCredentials file\_credentials, string file\_id, uint64\_t object\_number, uint64\_t object\_version, uint32\_t offset, uint32\_t length, out ObjectData object\_data~)}} -Reads on object. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - \texttt{object\_number} & the object requested (first object is 0)\\ - \texttt{object\_version} & for future use\\ - \texttt{offset} & offset within object\\ - \texttt{length} & number of bytes to read (offset+length must be < object size)\\ - \texttt{out object\_data} & the object data read from disk. If less data (data + zero padding) is returned, this indicates an EOF.\\ -\end{tabularx} - - -\paragraph{\texttt{void truncate( FileCredentials file\_credentials, string file\_id, uint64\_t new\_file\_size, out OSDWriteResponse osd\_write\_response~)}} -Truncates a file to the specified length. The client must have a capability valid for truncating. For files which are striped over more than one OSD\index{OSD}, this operation must be executed at the \textit{head OSD\index{OSD}} which is the first OSD\index{OSD} in the replica's OSD\index{OSD} list. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - \texttt{new\_file\_size} & the new size of the file in bytes to which the file is truncated\\ - \texttt{out osd\_write\_response} & information which should be passed to the MRC\index{MRC}.\\ -\end{tabularx} - - - -\paragraph{\texttt{void unlink( FileCredentials file\_credentials, string file\_id~)}} -Deletes all objects of the file. If the file is currently open (in use) the objects will be deleted on close. This operation returns immediately, the objects are deleted by the OSD\index{OSD} asynchronously. The client must have a capability valid for deleting. For files which are striped over more than one OSD\index{OSD}, this operation must be executed at the \textit{head OSD\index{OSD}} which is the first OSD\index{OSD} in the replica's OSD\index{OSD} list. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ -\end{tabularx} - - - -\paragraph{\texttt{void write( FileCredentials file\_credentials, string file\_id, uint64\_t object\_number, uint64\_t object\_version, uint32\_t offset, uint64\_t lease\_timeout, ObjectData object\_data, out OSDWriteResponse osd\_write\_response~)}} -Writes an object. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - \texttt{object\_number} & the object to write (first object is 0)\\ - \texttt{object\_version} & for future use\\ - \texttt{offset} & offset within object\\ - \texttt{lease\_timeout} & for future use (timestamp of client lease timeout in seconds since epoch)\\ - \texttt{object\_data} & the object data to write into the object; \texttt{zero\_padding} is ignored.\\ -\end{tabularx} - - -\paragraph{\texttt{ObjectData xtreemfs\_check\_object( FileCredentials file\_credentials, string file\_id, uint64\_t object\_number, uint64\_t object\_version~)}} -Similar to read. The OSD\index{OSD} reads the object and validates the checksum but doesn't send the actual data. Used by the file system scrubber to check data integrity. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - \texttt{object\_number} & the object requested (first object is 0)\\ - \texttt{object\_version} & for future use\\ - returns & the size of the object in \texttt{zero\_padding} and wether the data is corrupted\\ -\end{tabularx} - - -\paragraph{\texttt{InternalGmax xtreemfs\_internal\_get\_gmax( FileCredentials file\_credentials, string file\_id~)}} -Returns the locally know truncate epoch, number of objects and file size for a file. Used by an OSD\index{OSD} to determine the file size for a file which is striped over more than one OSD\index{OSD}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - returns & OSD-local file size information\\ -\end{tabularx} - - - -\paragraph{\texttt{uint64\_t xtreemfs\_internal\_get\_file\_size( FileCredentials file\_credentials, string file\_id~)}} -Returns the actual file size on the OSD(s)\index{OSD}. For files which are striped over more than one OSD\index{OSD}, this operation must be executed at the \textit{head OSD\index{OSD}} which is the first OSD\index{OSD} in the replica's OSD\index{OSD} list. Used by file system scrubber tools. Should be used to update file size before marking a file read-only. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - returns & the actual file size of the file\\ -\end{tabularx} - - - -\paragraph{\texttt{void xtreemfs\_internal\_truncate( FileCredentials file\_credentials, string file\_id, uint64\_t new\_file\_size,\\out OSDWriteResponse osd\_write\_response~)}} -Used by the head OSD\index{OSD} to truncate the file on all OSDs for a file which is striped across more than one OSD\index{OSD}. May only be used by OSDs\index{OSD}. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - \texttt{new\_file\_size} & the new size of the file in bytes to which the file is truncated\\ - \texttt{out osd\_write\_response} & information which should be passed to the MRC\index{MRC}.\\ -\end{tabularx} - - - -\paragraph{\texttt{InternalReadLocalResponse xtreemfs\_internal\_read\_local( FileCredentials file\_credentials, string file\_id, uint64\_t object\_number, uint64\_t object\_version, uint64\_t offset, uint64\_t length~)}} -Used by OSDs\index{OSD} to fetch objects from other OSDs\index{OSD} for replicated files. May only be used by OSDs\index{OSD}. This method does not follow POSIX\index{POSIX} semantics by add padding data but sends the raw object data from disk. - -\begin{tabularx}{\textwidth}{lX} - \texttt{file\_credentials} & XLocSet and Capability for the file\\ - \texttt{file\_id} & the file's file Id\\ - \texttt{object\_number} & the object requested (first object is 0)\\ - \texttt{object\_version} & for future use\\ - \texttt{offset} & offset within object\\ - \texttt{length} & number of bytes to read\\ - returns & raw object data from disk\\ -\end{tabularx} - - - -\paragraph{\texttt{void xtreemfs\_cleanup\_start(boolean remove\_zombies,\\boolean remove\_unavail\_volume, boolean lost\_and\_found~)}} -Starts the cleanup process on an OSD\index{OSD}. The cleanup process will check for all files on the OSD's\index{OSD} disk if they still exist in the MRC\index{MRC}. Requires an admin password in the XtreemFS authentication data. - -\begin{tabularx}{\textwidth}{lX} - \texttt{remove\_zombies} & delete files which have been deleted on the MRC\index{MRC}\\ - \texttt{remove\_unavail\_volume} & delete files if the MRC\index{MRC} holding the volume is not available (DANGEROUS!)\\ - \texttt{lost\_and\_found} & do not delete files but re-create them in a lost+found directory\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_cleanup\_stop()}} -Aborts the OSD\index{OSD} cleanup process. Requires an admin password in the XtreemFS authentication data. - - -\paragraph{\texttt{void xtreemfs\_cleanup\_status( out string status~)}} -Returns a human readable status string from the cleanup process. Requires an admin password in the XtreemFS authentication data. - -\begin{tabularx}{\textwidth}{lX} - \texttt{out status} & human readable status text (in English)\\ -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_cleanup\_is\_running( out boolean is\_running~)}} -Check if the cleanup process is running. Requires an admin password in the XtreemFS authentication data. - -\begin{tabularx}{\textwidth}{lX} - \texttt{out is\_running} & true, if the process is running -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_cleanup\_get\_results( out StringSet results~)}} -Returns a list of messages from the cleanup process. Requires an admin password in the XtreemFS authentication data. - -\begin{tabularx}{\textwidth}{lX} - \texttt{out results} & list of messages -\end{tabularx} - - -\paragraph{\texttt{void xtreemfs\_cleanup\_shutdown()}} -Shuts down the OSD\index{OSD}. Requires an admin password in the XtreemFS authentication data. - - -\subsection{Interactions} - -This section illustrates the interactions between XtreemFS clients and servers. - -\paragraph{delete} - -Files are deleted as described in the following (see Fig.\ \ref{fig:interactions_delete}): - -\begin{enumerate} - \item The client receives a delete request from the VFS. It removes the file on the MRC\index{MRC} via the unlink operation and receives the file credentials, which contain the globally unique XtreemFS fileID, a deletion capability and the replica locations list. - \item The client initiates the deletion of file content by invoking the \texttt{unlink} operation on the head OSD\index{OSD} (i.e.\ the first OSD\index{OSD} of a stripe). - \item The head OSD\index{OSD} delays the deletion until all clients have closed the file, i.e.\ all capabilities known to the head OSD\index{OSD} have timed out. In turn, the head OSD\index{OSD} initiates the deletion of file objects on the remaining OSDs\index{OSD} via \texttt{unlink}. -\end{enumerate} - -\begin{figure}[h!] -\centering -\resizebox{0.8\width}{0.8\height}{\includegraphics{images/interactions_delete.pdf}} -\caption{Deleting a file} -\label{fig:interactions_delete} -\end{figure} - -\paragraph{read} - -Files are read as described in the following (see Fig.\ \ref{fig:interactions_read}): - -\begin{enumerate} - \item The client receives an \texttt{open} request from the VFS. It opens the file on the MRC\index{MRC} for reading, and receives the file credentials, which contain the globally unique XtreemFS fileID, a read capability and the replica locations list. - \item The client sends a request for reading Y bytes of data from the offset Z of the file identified by the fileID. The OSD\index{OSD} returns a buffer containing object data, as well as additional information like checksum failure notifications or padding flags. - \item If multiple read requests are send, the client has to ensure that the capability is renewed before it times out, in order to keep the file open. - \item The client reads more data from the file, e.g.\ another object. - \item The client receives a \texttt{close} call. There is no need to explicitly close the file on the servers; this is implicitly done when the capabilities in the OSD\index{OSD} cache time out. -\end{enumerate} - -\begin{figure}[h!] -\centering -\resizebox{0.8\width}{0.8\height}{\includegraphics{images/interactions_read.pdf}} -\caption{Reading a file} -\label{fig:interactions_read} -\end{figure} - -\paragraph{write} - -Files are written as described in the following (see Fig.\ \ref{fig:interactions_write}): - -\begin{enumerate} - \item The client receives an \texttt{open} request from the VFS. It opens the file on the MRC\index{MRC} for writing, and receives the file credentials, which contain the globally unique XtreemFS fileID, a write capability and the replica locations list. - \item The client sends a buffer containing the data to the OSD\index{OSD} on which the object is stored. In return, the OSD\index{OSD} sends an \texttt{OSDWriteResponse}, which must be cached and sent to the MRC\index{MRC} when the file is closed or fsync is called. The client can also decide to send pending filesize updates from time to time between capability renewals, as the lifetime of a capability can be in the range of tens of minutes. - \item If multiple write requests are send, the client has to ensure that the capability is renewed before it times out, in order to keep the file open. - \item The client appends data to the file by sending more \texttt{write} requests, each being answered with an \texttt{OSDWriteResponse}. - \item The client receives a \texttt{close} call. It sends any pending \texttt{OSDWriteResponse}s to the MRC\index{MRC}, in order to update the file size. There is no need to explicitly close the file on the servers; this is implicitly done when the capabilities in the OSD\index{OSD} cache time out. -\end{enumerate} - -\begin{figure}[h!] -\centering -\resizebox{0.8\width}{0.8\height}{\includegraphics{images/interactions_write.pdf}} -\caption{Writing a file} -\label{fig:interactions_write} -\end{figure} - -\paragraph{fsync} - -Files are fsync'ed as described in the following (see Fig.\ \ref{fig:interactions_fsync}): - -\begin{enumerate} - \item The file was opened and modified. - \item The client receives a \texttt{fsync} request from the VFS. If the file is opened all pending data will be written to the OSD\index{OSD}. - \item The client sends any pending \texttt{OSDWriteResponse}s to the MRC\index{MRC}, in order to update the file size. - \item The file is further modified or closed. -\end{enumerate} - -\begin{figure}[h!] -\centering -\resizebox{0.8\width}{0.8\height}{\includegraphics{images/interactions_fsync.pdf}} -\caption{Synchronizing data with the underlying device} -\label{fig:interactions_fsync} -\end{figure} - -\paragraph{mkvol} - -New volumes are created as described in the following (see Fig.\ \ref{fig:interactions_mkvol}): - -\begin{enumerate} - \item The client receives an \texttt{mkvol} request. In response, it creates the volume on the MRC\index{MRC}. - \item The MRC\index{MRC} registers the volume at the DIR\index{DIR}. - \item If no problems occur, the MRC\index{MRC} responds to the client with an acknowledgment. -\end{enumerate} - -\begin{figure}[h!] -\centering -\resizebox{0.8\width}{0.8\height}{\includegraphics{images/interactions_mkvol.pdf}} -\caption{Creating a new volume} -\label{fig:interactions_mkvol} -\end{figure} - -\paragraph{rmvol} - -Volumes are deleted as described in the following (see Fig.\ \ref{fig:interactions_rmvol}): - -\begin{enumerate} - \item The client receives a \texttt{rmvol} request from the console. In response, it removes the volume on the MRC\index{MRC}. - \item The MRC\index{MRC} deregisters the volume at the DIR\index{DIR}. - \item If no problems occur, the MRC\index{MRC} responds to the client with an acknowledgment. -\end{enumerate} - -\begin{figure}[h!] -\centering -\resizebox{0.8\width}{0.8\height}{\includegraphics{images/interactions_rmvol.pdf}} -\caption{Deleting an existing volume} -\label{fig:interactions_rmvol} -\end{figure} - -\paragraph{removeReplica} - -Single replicas of a file are deleted as described in the following (see Fig.\ \ref{fig:interactions_rmrepl}): - -\begin{enumerate} - \item The client receives a \texttt{removeReplica} request from the console. It sends a request to the MRC\index{MRC} to remove the replica with a matching head OSD\index{OSD}. In response, it receives the file credentials, which contain the globally unique XtreemFS fileID, a deletion capability and the list of replica locations. - \item The client initiates the deletion of the replica's file content by invoking the \texttt{unlink} operation on the head OSD\index{OSD} (i.e.\ the first OSD\index{OSD} of a stripe). - \item The head OSD\index{OSD} delays the deletion until all clients have closed the file, i.e.\ all capabilities known to the head OSD\index{OSD} have timed out. In turn, the head OSD\index{OSD} initiates the deletion of file objects on the remaining OSDs via \texttt{unlink}. - \item If a client finds out that its replica locations list for the file is outdated, it has to retrieve the new replica locations list from the MRC\index{MRC}. -\end{enumerate} - -\begin{figure}[h!] -\centering -\resizebox{0.8\width}{0.8\height}{\includegraphics{images/interactions_rmrepl.pdf}} -\caption{Deleting a replica of a file} -\label{fig:interactions_rmrepl} -\end{figure} \ No newline at end of file diff --git a/doc/dev-guide/xtreemfs_rms.tex b/doc/dev-guide/xtreemfs_rms.tex deleted file mode 100644 index c31b14a652d0e0a26c1dfbe6364d440a582fde4b..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_rms.tex +++ /dev/null @@ -1,359 +0,0 @@ - -One of the most important mechanisms in XtreemFS is the possibility to have -several replicas of a file distributed over the Grid. This feature affords -data-intensive applications achieving better performance as long as: there is no -single access point for the data and mechanisms for parallel access can be -exploited. Besides, replication also provides reliability and availability to -the filesystem, which is of vital importance for a distributed environment. - -However, the usage of Grid resources such as network (where data is transfered -across) or storage (where data is stored) are finite, shared, and non-free. -Furthermore, the synchronization of the replicas of any given file involves -additional overheads, so that mechanisms that keep the tradeoff between the -benefits and the extra costs are needed. - -For aiming at all of these purposes, we are working on the implementation of the -Replica Management Service. This service concerns about: selecting the best -replicas for the applications, creating and deleting replicas automatically -taking account of how and from where they are accessed and evaluating the -maximum number of replicas of any given file. - - -\subsection{Choosing the best replica} -\label{RMS_Choosing_Replicas} - -When a given client (or an OSD) has to access a file, the question is: which -replica should it access? It should be able to detect which replica will provide -better performance. The idea to solve this problem is to build a virtual 2D -space and locate all replicas, OSDs, and clients in it. The distance -between two different objects (i.e replica, OSD, or client) is an indicator of -the distance (performance wise) of these two objects. Once a client wants to -access a file, it just needs to compute the euclidian distance between itself -and all replicas and choose the closer one. - -\subsubsection{Vivaldi Algorithm} - -Vivaldi is a light-weight algorithm developed by MIT \cite{dabek2004vdn} -that allows assigning a position in a coordinate space to every node in a network, -so the distance between the coordinates of two nodes predicts the real communication -latency between them. - -In order to generate a valid coordinate system, it is necessary to determine -which space will be used and which formula will be used to calculate the -distance between two given points. In our case, it is been proved that -implementing a 2-D space, where the Euclidean distance between two coordinates -accurately predicts the latency between their corresponding nodes, generates -valid results with a really small error probability. - -For the algorithm to work correctly, it is also necessary that the nodes of the -system keep contacting themselves randomly and indefinitely to re-adjust their -position, so any possible change in the network may be reflected. In each -re-adjustment, a node contacts a different neighbor, gets its coordinates and -modifies its own coordinates, so eventually the Euclidean distance is as similar -as possible to the measured round trip time. - -On the other hand, once a group of nodes have established a valid coordinate -system, it is necessary to use some mechanism that helps to reduce the impact of -introducing new nodes, so we avoid them to alter the already stabilized system. -That is why Vivaldi keeps in every node, besides the coordinates, a local error -that informs about how sure a node is about its position. This way, a node with -a steadier position will have a smaller local error and will influence more the -rest of nodes when they contact it to readjust their position (figure -\ref{rms1}). - -\begin{figure}[t] -\begin{center} -\includegraphics[width=0.60\textwidth]{images/rms1.png} -\caption{Nodes keep recalculating their position} -\label{rms1} -\end{center} -\end{figure} - -Once the system is adjusted, any node of the network can determine which nodes -are the closest ones with a really simple calculation, in a very short period of -time and without generating extra traffic. - -Some already developed implementations of Vivaldi can be found in p2psim and in -Chord. You might also be interested in Ledlie et al.'s work \cite{ledlie2007ncw}. - -\subsubsection{Vivaldi in XtreemFS} - -As we have different kinds of nodes in our architecture, not all of them work in -the same way to integrate Vivaldi. While the clients usually execute during -shorter periods of time, the servers are up and running , so the -idea is to let the OSDs (at this moment they are the only -servers that implement Vivaldi) establish a permanent coordinate system where a -client can move through, to find its position. - -\subsubsection{Vivaldi in the OSDs} - -An OSD has an independent stage responsible of managing Vivaldi on its side and -of providing to the rest of components a couple of valid coordinates that define -the position of the node in the current coordinate system. - -The stage keeps running indefinitely and periodically contacts a different OSD -to ask it for its coordinates and its local error. With that data and the -coordinates of the own OSD is possible to compute the Euclidean distance and to -compare it with the real RTT measured against the contacted node. - -The frequency an OSD readjusts its position is defined by the parameters -MIN\_\-TIMEOUT\_\-RECALCULATE and MAX\-\_TIMEOUT\_\-RECALCULATE. Just after performing a -readjustment, the stage typically calculates a random number included in the -interval of time defined by those two parameters and sleeps during that number -of seconds until the next iteration. This way we try to avoid generating traffic -peaks where all the nodes send a request at the same time and to distribute the -net use in time. - -Larger periods will reduce the overhead in the network but will make the nodes -to adjust more slowly to the possible changes in the environment, while smaller -ones will require more traffic but will produce a more reactive system. - -In each iteration, the introduced stage chooses a node to contact to from a list -of available OSDs, which is filled with the information contained in the -Directory Service. This list must be updated somehow so the stage can always -notice a node going offline. - -\subsubsection{Vivaldi in clients} - -In our system, the clients usually execute during a much shorter period of time, -so they have to be able to determine their position faster. This can be done -because they do not influence the rest of the nodes and they just take some -needed info from the already placed OSDs to locate themselves. - -In Vivaldi, each node is responsible for its own coordinates and typically has to -recalculate them at least a small number of times before they represent the real -position in the coordinate system. Even if the set of OSDs is``adjusted'', a -client will need to recalculate its position (against one single node each time) -several times before having an accurate approximation of its real location. -Vivaldi requires that the nodes of the net generate traffic and communicate -among themselves. - -As in the case of the OSDs, a client also has the parameters -MIN\_\-TIMEOUT\_\-RECALCULATE and MAX\_\-TIMEOUT\_\-RECALCULATE that allow defining the -recalculation period. Although the analogue parameters in the OSDs have the same -names, they are different parameters and therefore they all must be defined in -different files. - -Finally, it is important to emphasize that after the first boot of the client, -it keeps its coordinates and preserves them among executions, so it remains well -located though it mounts and unmounts a lot of different volumes or opens and -closes a lot of files. The coordinates are not reinitialized until the client -node is rebooted. - -\subsubsection{Replica Selection with Vivaldi} - -Until this point we have introduced a mechanism able of establishing a -coordinate system where all the nodes of a network have a pair of coordinates -that allows them predicting the round trip time to the rest of neighbors. Now it -is time to analyze how to take advantage of that information and to describe the -current applications of Vivaldi in XtreemFS. - -Sometimes during the execution of certain operations, the client has to choose -which replica access, among several replicas stored in different nodes of the -system. The ideal solution proposes to select always the replica that is stored -in the closest node, so the accesses can be made within the minimum time. But -the problem is that most of the times measuring the RTT against every OSD, for -each selection, is not computationally feasible. - -Using the coordinates provided by Vivaldi, a client can calculate which replica -is the closest one with a practically insignificant delay. At this point the -only remaining problem seems to be how to gather all the coordinates so they can -be available in the exact moment of the replica selection. - -As mentioned earlier, in Vivaldi the coordinates are managed -independently by the node they belong to and remain distributed among the -different nodes of the network. In order to let the client take advantage of -them, it is necessary to collect them in the MRC, so they can be included in -every list of x-locations. - -\begin{figure}[t] -\begin{center} -\includegraphics[width=0.60\textwidth]{images/rms2.png} -\caption{Collecting the coordinates} -\label{rms2} -\end{center} -\end{figure} - -In figure \ref{rms2} we show the following process: - -\begin{enumerate} -\item HeartbeatThread is a component of the OSDs that periodically registers the -OSD in the Directory Service. The information that is uploaded each time is -determined by the function getServiceData, which is defined in the main -constructor of the class OSDRequestDispatcher. -\item OSDStatusManager is a component of the MRC that regularly queries the -Directory Service for available OSDs. -\item During an open operation, the MRC sends to a client a list of x-locations, -so it can locate the different replicas associated to a certain file. The -x-locations include the corresponding coordinates, so the client can use them to -predict the closest replica. -\end{enumerate} - - -\subsection{Replica creation} -\label{RMS_Replica_Creation} - -Another important issue regarding replicas is to decide when and where to create -a replica. For this functionality we have three different mechanisms. The first -one is an explicit request from the user. In this scenario, the RMS will not -take any action. The second one is a reactive replica creation. The system will -detect that a replica is needed at a given location and will start a replica -creation. Finally, in the third case, the system will predict the usage of a -file in a location where no replicas are nearby and thus will try to create the -replica before it is used. We call to this third mechanism proactive replica -creation. - -In both cases reactive and proactive, we plan to provide a mechanism able to -study the access pattern of files and use it to decide if only a part of the -file needs to be replicated (partial replication). This partial replicas will -speedup the process of replication because only part of the data will need to be -copied to the new location. Nevertheless if we miss-predict the parts of the -replica that will be used, we will always be able to populate the missing parts -on-demand (done directly by the OSDs). - -%TODO: We could increase the level of detail in following subsubsections -\subsubsection{Reactive replica creation with Vivaldi} - -In this scenario it is detected when replicas are currently needed in other -parts of the Grid. Then, using the distance mechanisms we just described in -Section \ref{RMS_Choosing_Replicas}, we will detect if clients request a replica -from large distances. So in this case Vivaldi could be used to decide a better -location for a replica and create it. - -\subsubsection{Proactive replica creation with Oraculo} - -We have implemented a service called Oraculo that carries out data mining on -multi-order context models to analyze the file-access patterns and to compute -future accesses. For the implementation of such multi-order context models, -Oraculo keeps a trie (or prefix tree) as Kroeger et al. did \cite{kroeger1996pfs, -kroeger2001dai} for centralized environments, where they proved that such structures -where effective. - -Thus, each file access is modeled as a symbol (i.e. the file path) and it is -recorded as a node of the prefix tree with an associated value that represents -how many times the chain pattern from root to that node has ocurred. - -Then, in order to interact with Oraculo, it provides a basic interface for: -\begin{enumerate} - \item Adding an event to the trie, given a sequence of the last events seen. - \item Getting a prediction from the trie, given a sequence of the last events -seen. -\end{enumerate} - -So that when a file access is produced, it can be noticed to Oraculo which -computes which parts of the trie must be modified, adding the new event to the -corresponding branches or simply increasing the counter of the pattern if it is -already present. - -Notice that in order to keep the trie scalable Oraculo can prune it in two ways. -First, keeping a predefined maximum number of nodes per branch. Thus, whenever a -new event goes to a full branch all its nodes divide their corresponding value -by two and nodes with a value lower than 1 are deleted from the trie. In the -case that no node has been cleaned, the new event is not added. But, obviously -the nodes in the branch keep the new value (after the division by two) so in the -near future it will be eventually possible to add new events in that branch. - -On the other hand, Oraculo also has a maximum of root-branches (also called -partitions) to keep the horizontal scalability of the trie. Here we apply a -LRU-based algorithm among the partitions taking account of their usage as well. - -Finally, Oraculo can predict future file accesses by applying basic data-mining -on the trie. It only needs to know some previous accesses to look for patterns -based on them. Then, an OSD could eventually use this information to replicate -data in advance. - -Furthermore, we will propose a decoupled and off-line aggregation of the tries. -Once in a while (still to be determined), OSDs could contact other OSDs (only a -small subset) to exchange their trie information and build an aggregated one -that has the information of all. This mechanism will allow all OSDs to have a -more or less global view because what is learned by one OSD will be propagated -though several aggregations. We have done some preliminary tests using this -mechanism and seems to work very well with environments of many thousands of -nodes. - -Regarding the information of the access pattern of files, in most cases the -information kept by a single OSD will be enough. Nevertheless, whenever we need -the full information of the pattern, we can contact all OSDs that have a replica -and aggregate the learned behavior. As we do not expect to keep many replicas of -a file, this procedure seems reasonable and scalable. - -\subsubsection{Integration of Oraculo with OSDs} - -Unfortunately, the integration of Oraculo with OSDs could not be done yet -because we are still evaluating it by using GridSim (a well-known Grid -simulator). Once we get significant results with the simulations we will -evaluate them and port Oraculo to the OSDs. - - -%%WARNING: This subsection is copy pasted from D3.4.4 -%\subsection{Automatic setting of the number of replicas} -%\label{RMS_replica_limitation} - -%The problem of having many replicas is that updates imply that a coordination -%mechanisms has to be started. This coordination will reduce performance and the -%magnitude clearly depends on the number of replicas available. For this reason -%we have decided to set a limit in the number of replicas a file will have. - -%On the other hand, it is clear that the overhead this coordination will imply -%also depend on the frequency at which files are modified. For instance, if a -%file is only modified once a month (and only small modification are done) we -%could keep many more replicas than for a file that is constantly modified. - -%The objective of this mechanism is to detect the access pattern of files and -%find the ratio between reads and writes. With this information the RMS will -%decide the maximum number of replicas that obtains a good tradeoff between the -%benefit of multiple replicas in read operations and the penalty of coordination -%in write operations. - - -%%WARNING: This subsection is copy pasted from D3.4.4 -\subsection{Replica deletion} -\label{RMS_Replica_Deletion} - -On the one hand, if we want to be able to replicate files whenever needed but -still maintain the maximum number for replicas per file, it would be interesting -to keep the number of replicas a bit smaller than the maximum. This difference -between the maximum and the real number of replicas would allow the system to -create replicas whenever needed. On the other hand, if replicas are not used, it -would also be nice to have them removed automatically to reduce disk usage in a -given node and/or center. - -To tackle these two issues we will implement a mechanism that automatically -deletes the less important replicas. To know what replicas are less important we -will use similar mechanisms than the ones used to create replicas. We will -predict future usage using the same kind of tries. In addition we will perform -some kind of preventive removal of replicas, which means that whenever a node -decides to remove a replica it will inform other OSDs that have it to react -accordingly. - - -%%WARNING: This subsection is copy pasted from D3.4.4 -\subsection{Interaction with the Application Execution Management} -\label{RMS_AEM_interaction} - -The last mechanisms that we will implement to manage replicas consists of an -interaction with the application execution management system (AEM). This -interaction will be done in two steps. - -Firstly, AEM analyzes the JSDL of the application and asks to XtreemFS -for the locations (coordinates X,Y) of its files' references. Thus AEM computes -an optimal coordinate around where the job should be executed. This coordinate -is used for AEM to send a request to Resource Selection Service (RSS) for a set -of nodes close to it. Of course, RSS also considers other requirements, such as -CPU or memory, to decide the resulting set of nodes. - -In the second step, the AEM will inform XtreemFS on the final destination of a -given job and the files it will use. With this information, the RMS will decide -if new replicas need to be created to improve the I/O performance of this job. -In addition, and in some cases, it might be that the RMS decides to advance this -step from the information obtained in step 1. For instance, this may happen when -the list is made of nodes that are close among themselves and one or two -replicas could do the job. - -Although this mechanism is very good in the sense that no prediction needs to be -done, it has a couple of limitations. The first one is that the AEM might not -know the files used by a job (it is not a requirement in the job description). -The second one is that there might not be enough time from the moment XtreemFS -receives the execution location of a job (and the files it uses) and the moment -the job starts running. To solve these two cases we have proposed the previous -prediction mechanisms (\ref{RMS_Replica_Creation}). diff --git a/doc/dev-guide/xtreemfs_servers.tex b/doc/dev-guide/xtreemfs_servers.tex deleted file mode 100644 index c340a39c0f0ff6b40c257c107ea1904488f9d265..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_servers.tex +++ /dev/null @@ -1,11 +0,0 @@ -All XtreemFS servers (DIR\index{DIR}, MRC\index{MRC} and OSD\index{OSD}) are written in Java and employ an event-based staged design. In addition to the common architecture, they also share the basic libraries like RPC server and client or memory management. - -In our design, a stage has one or more threads to do the work. Usually, a stage is used for processing which is blocking (e.g. I/O operations) or consumes larger amounts of CPU time (e.g. checking signatures). Each stage receives requests (events), processes them asynchronously and passes the result to a callback. Operations are the ``glue'' between the stages. For each client request or internal event, there is an Operation class which implements the logic of the call. - -All servers also use a custom method of memory management. To avoid excessive data copying to and from the Java VM, we use direct ByteBuffers which represent raw memory on the heap. These direct ByteBuffers are not managed by the Java garbage collector and excessive allocation and freeing of them causes severe performance problems. To overcome this problem and to reduce overall memory consumption, we use a concurrent BufferPool to allocate ByteBuffers. In addition, we use a wrapper class (called ReusableBuffer) which implements reference counting. It also ensures that ReusableBuffers which have been returned to the pool cannot be used anymore. - -The ReusableBuffers must be freed (i.e. returned to the BufferPool) after using them. Failing to do so will cause an error message to be printed on finalization which should help to detect memory leaks. Setting \texttt{Buffer\-Pool.record\-Stack\-Traces} to \texttt{true} will add a full stack trace of the allocation to the error message which is useful to locate memory leaks. This option is only for debugging and should not be used for production due to the performance penalty of recording stack traces on each allocation. - -The ONC RPC\index{ONC RPC} server and client are used by all three servers as well. Both are implemented using Java's non-blocking network IO NIO and can be used with or without SSL. - -The DIR\index{DIR} and MRC\index{MRC} also use an external key-value store called BabuDB (see http://babudb.googlecode.com) to persistently store information. How it is used and how the data is stored in BabuDB is described in the DIR\index{DIR} and MRC\index{MRC} sections, respectivly. \ No newline at end of file diff --git a/doc/dev-guide/xtreemfs_test.tex b/doc/dev-guide/xtreemfs_test.tex deleted file mode 100644 index 86f6cb436349cba709382767ad1245180659e2d2..0000000000000000000000000000000000000000 --- a/doc/dev-guide/xtreemfs_test.tex +++ /dev/null @@ -1,167 +0,0 @@ -Regular and extensive testing is of vital importance for any file -system, in order to improve its reliability, scalability, code -quality, stability, performance, etc. Therefore, a new activity -inside the WP3.4 has been created, which is focused on all the -aspects of testing. The goal of this task is to evaluate -functionality and performance of XtreemFS, by exploiting some -existing file system test suites. - -Nowadays, from a software viewpoint, there are some available tools -that are mainly designed for testing local file systems, but there -are no ready-made tools available for testing Grid File Systems. -Thus, in order to test XtreemFS, either some ad-hoc tools must be -developed or some existing distributed testing tools must be -extended. - -Currently, there are two main guidelines leading the tests performed -on XtreemFS: the first one is aimed at evaluating the POSIX -compliance of XtreemFS and consequently its functionality; the -second one addresses the performance evaluation by stressing -XtreemFS with a set of tests and benchmarks (in the following we -refer to such kind of tests as regression tests). - -In the next subsections we will describe both such activities, the -tools used and the results obtained. - -\subsection{Testing POSIX compliance of XtreemFS} -One of the goals of XtreemFS is providing a POSIX-compliant -filesystem. In order to evaluate the correctness of functionalities, -we initially evaluated some available test suites aimed at the POSIX -compliance testing. Firstly, we evaluated the "Open Posix Tests -Suite" (https://sourceforge.net/projects/posixtest/); it resulted -not very suitable for our tests, because it performs only AIO tests -but nothing else related to the file system; moreover, we -encountered some difficulties during the installation and in -particular during the execution of the tests, and for such reasons -we discarded it. A second tool that we evaluated was the NTFS-3G -suite (http://www.ntfs-3g.org), that is a test suite available for -the most important operating systems; it includes a POSIX filesystem -test environment, the Pawel Jakub Dawidek's POSIX filesystem test -suite, that immediately seemed more suitable for our purposes than -the first one. For such a reason, we chose to exploit the PJD's -POSIX filesystem test suite (PJD-fstest) and to run it over -XtreemFS. The test suite is available on the Web under a BSD license -and we got it from http://www.ntfs-3g.org/pjd-fstest.html. -PJD-fstest performs almost 3700 regression tests that exhaustively -check a wide amount of different scenarios for the following system -calls: -\begin{itemize} -\item \textit{chmod}: changes the permissions of a files or directories -\item \textit{chown}: changes the owner of files or directories -\item \textit{link}: creates hard link -\item \textit{mkdir}: creates directories -\item \textit{mkfifo}: creates fifo named pipes -\item \textit{open}: opens a file -\item \textit{rename}: renames files or directories -\item \textit{rmdir}: removes directories -\item \textit{symlink}: creates symbolic links -\item \textit{truncate}: truncates files -\item \textit{unlink}: removes files -\end{itemize} - -For each system call, the suite contemplates the execution of a set -of scripts. Each script performs a set of basic operations, like the -creation of a directory, the change of its access rights, the change -of its owner, etc., and for each operation it evaluates its return -value. If such a value is different than that expected, an error is -pointed out. Obviously, the scripts performing the tests for a -particular system call are composed of operations targeted for the -evaluation of the (hopefully correct) behaviour of that system call. -Our work consists in the automatic execution of the scripts and in -the evaluation of the failure events. Then, for each failure, we -need to interpret the cause of the problem and reproduce manually -the scenario (the sequence of operations) causing it. After this -step (that some time hides some difficulties) the problem is pointed -out in a bug tracker, in order to be scheduled for a solution. - -\subsubsection{How to execute the tests} - -After downloading the tarball of the PJD-fstest, we can simply extract its contents: - -\verb"tar xvzf " - -The most significant contents of the tarball are: - -\begin{itemize} -\item \textit{fstest.c}: the source code -of the main program. It provides an implementation of all the syscalls commented before. -\item \textit{Makefile}: the Makefile that we can use to compile the program. -\item \textit{tests}: a directory that contains one subdirectory for every syscall. -For each of this subdirectories, there is a set of scripts that conform the tests for the corresponding syscall. -\end{itemize} - -Afterwards, we can compile the fstest.c file by executing \textbf{\textit{make}}. - -To execute the tests, we have implemented a tool that basically -automatizes all the process of updating, compiling, and installing -XtreemFS, running a basic scenario with one Directory Service, one -MRC and an OSD, and creating a volume and mounting it on a specific -directory. - -Once this scenario is up and running, we enter the mount-point where -the volume is mounted and execute the tests by using the command -\textbf{\textit{prove}} as follows: - -\verb"sudo prove -r /tests" - -The flag \textit{-r} specifies that \textit{prove} should traverse -all the directories recursively (so all the tests are executed). -Notice that we need root privileges so we also need to edit -\textit{/etc/fuse.conf} and add the following line: - -\verb"user_allow_other" - -This line allows non-root users to specify the option -\textit{allow\_other} (or \textit{allow\_root}) among the mounting -options of fuse. - - -\subsubsection{Results} - -At the moment, XtreemFS does not support fifos, so mkfifo tests are being ignored. - -The tests corresponding to the rest of the syscalls were executed -completely and the only errors encountered were due to the lack of -implementation of sticky bits on files and directories. - -We plan to work on it in next XtreemFS versions, although it is not -a very important feature and currently we have to spend our efforts -on other more significant issues. - - -\subsection{Regression Tests} -We use a set of regular file system test tools and custom made tests to automatically check the XtreemFS development version (the svn trunk) every night. This test environment can also be used to manually run these tests. - -The main test script is \texttt{trunk/bin/xtfs\_test} and can be executed to run all tests automatically or to start/stop a test environment. - -To start a test environment with all XtreemFS servers and clients, run - -\begin{verbatim} - > trunk/bin/xtfs_test --start -\end{verbatim} - -This script will put all data and logfiles in the current working directory. - -After setting up the test environement, the tests in \texttt{trunk/tests/} can be executed individually by calling the test scripts in the mounted XtreemFS volume. - -\begin{verbatim} - > python trunk/tests/01_simple_metadata.sh -\end{verbatim} - -To shutdown all servers and unmount the clients after testing, execute - -\begin{verbatim} - > trunk/bin/xtfs_test --stop -\end{verbatim} - -To clean up all data and logfiles use - -\begin{verbatim} - > trunk/bin/xtfs_test --clean -\end{verbatim} - -If you want to run all tests automatically, run the test script in auto mode - -\begin{verbatim} - > trunk/bin/xtfs_test --autotest -\end{verbatim} diff --git a/doc/eclipse_code_formatter_conventions.xml b/doc/eclipse_code_formatter_conventions.xml deleted file mode 100755 index 8ba5d4dd26fbfce5695b624e108536d44eb7b778..0000000000000000000000000000000000000000 --- a/doc/eclipse_code_formatter_conventions.xml +++ /dev/null @@ -1,267 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/doc/eclipse_code_templates.xml b/doc/eclipse_code_templates.xml deleted file mode 100755 index ac2468499e999d853305b8a246d5c776f448f59a..0000000000000000000000000000000000000000 --- a/doc/eclipse_code_templates.xml +++ /dev/null @@ -1,54 +0,0 @@ - \ No newline at end of file diff --git a/doc/howto_create_test_certs.txt b/doc/howto_create_test_certs.txt deleted file mode 100644 index 8525ce4917183e4ddb4ebec0f03f99e8f599f005..0000000000000000000000000000000000000000 --- a/doc/howto_create_test_certs.txt +++ /dev/null @@ -1,70 +0,0 @@ -(parts taken from http://marc.info/?l=tomcat-user&m=106293430225790&w=2) - -use "passphrase" for all passwords! - -SETTING UP YOUR CA ------------------------------------ - -Step 1. Go to www.openssl.org and download the source code. Even Windows -users need to build it, so you'll need access to a C compiler. You may be -able to get hold of prebuilt binaries on the web and you can certainly get -hold of the GNU C compiler or you can use Borland and Microsoft compilers. -There are good build instructions included with the source distribution, so -I won't go into build details. - -Step 2. Create directories to hold your CA keys, your server keys and, if -you want to use SSL client authentication, your client keys. For the sake -of argument let's assume that these directories are called "ca", -"server" and "client". - -Step 3. Create a private key and certificate request for your own CA: -openssl req -new -newkey rsa:1024 -nodes -out ca/ca.csr -keyout -ca/ca.key - -Step 4. Create your CA's self-signed certificate (note lasts one year - -increase the days setting to whatever you want): -openssl x509 -trustout -signkey ca/ca.key -days 365 -req -in ca/ca.csr -out ca/ca.pem - - -Step 5. Import the CA certificate into the JDK certificate authorities -keystore: -keytool -import -keystore trust.jks -file ca/ca.pem -alias ca - -Step 6. Create a file to hold your CA's serial numbers. This file starts -with the number "2": -echo "02" > ca/ca.srl - - -SETTING UP THE CLIENT CERT ------------------------------------- - -keytool -genkey -alias client -keyalg RSA -keysize 1024 -keystore client.jsk -storetype JKS - -keytool -certreq -keyalg RSA -alias client -file client/client.csr -keystore client.jks - -openssl x509 -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/ca.srl -req -in client/client.csr -out client/client.crt -days 365 - -keytool -import -alias ca -keystore client.jsk -trustcacerts -file ca/ca.pem - -keytool -import -alias client -keystore client.jsk -trustcacerts -file client/client.crt - - -SETTING UP THE SERVER CERT ---------------------------------------- - -openssl req -new -newkey rsa:1024 -nodes -out server/server.req -keyout server/server.key - -openssl x509 -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/ca.srl -req -in server/server.req -out server/server.pem -days 365 - -openssl pkcs12 -export -in server/server.pem -inkey server/server.key -out server/server.p12 -name "server" -(SET export passphrase to "passphrase"!) - -SETTING UP THE XtreemFS AL client Cert ---------------------------------------- - -openssl req -new -newkey rsa:1024 -nodes -out al/al.req -keyout al/al.key - -openssl x509 -CA ca/ca.pem -CAkey ca/ca.key -CAserial ca/ca.srl -req -in al/al.req -out al/al.pem -days 365 - -openssl pkcs12 -export -in al/al.pem -inkey al/al.key -out al/al.p12 -name "al" -(SET export passphrase to "passphrase"!) \ No newline at end of file diff --git a/doc/idl_conventions.txt b/doc/idl_conventions.txt deleted file mode 100644 index 6e0f93e63cce75239e0b0d875e123056dc66501f..0000000000000000000000000000000000000000 --- a/doc/idl_conventions.txt +++ /dev/null @@ -1,66 +0,0 @@ -Alphabetical order! for operation names within an interface, variable names within an operation, - field names within a struct, constants within an enum, etc. - Exceptions: -- constructs taken from system headers (struct Stat, POSIX functions) -- when there is a good reason to change order (e.g. putting the data buffer last in struct ObjectData) -- when a type includes another type and thus must be declared after the first type (e.g. FileCredentials including XCap) -- input parameters before output parameters - -Capitalize constants: -- ONCRPC_SCHEME - -Complex types should usually end with a suffix indicating their IDL type: -- ServiceDataMap -- sequences are "xSet" by earlier convention -- Exception: when names are adapted from system types (struct Stat) - -Default constants should end with _DEFAULT -- ONCRPC_PORT_DEFAULT -- Similar: _MAX, _MIN (end with _MAX instead of starting with it, to distinguish variable names) - -Flag constants and enums: -- Enum type names should end with "Type": -- Should have a common prefix when they are defined by us: REPL_FLAG_IS_COMPLETE, REPL_FLAG_FULL_REPLICA -- Decimal values are preferable to other bases, except where copying from a system header -- Use system header values from the most common systems (typically System V derivatives, including Windows) -- Exception: errno constants from Linux - -Operation names: -- For operations used by the client (e.g. symlink, read), prefer POSIX names, then FUSE names. -- All other operation names should be prefixed by xtreemfs_ (e.g. xtreemfs_shutdown). -- Similar operations should be grouped with a prefix: xtreemfs_service_get_by_type, xtreemfs_service_get_by_uuid, etc. - -Operation parameters: -- all input parameters before all input parameters -- only a single output parameter; Java can't handle multiple output parameters -- prefer output parameters with descriptive names (renewed_xcap) to return values - -Place types in the most fine-grained .idl they are used. -- e.g. only types shared by all interfaces should be in types.idl. - -Spaces instead of tabs! -- 2 space indentation after { -- 1 space padding on function parameters func( int y, int z ); - -Tag numbers: -- Whenever types, operations, etc. are MODIFIED (not added or removed) you MUST change the tag number on module xtreemfs to the - current date + hour: module xtreemfs # 2009082618 -- Interface tag numbers stay the same -- When adding a construct use the highest tag number of [operations|types|...] + 1 instead of reusing numbers, even if there is a gap -- Observe intentional gaps between tag number ranges, e.g. between exceptions and operations -- Tag numbers must be unique within a given scope (module or interface), e.g. exception and operation tag numbers must not conflict - -Time variables should have units as suffix: -- atime_ns, last_update_s -- xtreemfs_global_time_s_get() - -Use C++/Java naming conventions for types, interfaces: -- DirService, DIRInterface - -Use C naming conventions for operations and variable names (vs. C++, Java, etc.): -- all lower case, words separated by _ -- setattr instead of setAttr (Java) or SetAttr (C++) -- file_id instead of fileId (Java) - -Use sized/stdint types instead of C types: -- uint32_t instead of unsigned int, uint64_t instead of unsigned long long, etc. \ No newline at end of file diff --git a/doc/xtreemfs-userguide/garamond.sty b/doc/xtreemfs-userguide/garamond.sty deleted file mode 100644 index a31baab57725aa37155aee57841c185b1cb51b8f..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/garamond.sty +++ /dev/null @@ -1,17 +0,0 @@ -%% -%% This is file `garamond.sty` -%% -%% This file is under the public domain. -%% Original author: Gael Varoquaux -%% gael dot varoquaux at normalesup dot org -\pdfmapfile{=ugm.map} -\let\rmdefault@garamond\rmdefault% - -\newcommand{\garamond}{% -\renewcommand{\rmdefault}{ugm}\normalfont% -} - -\newcommand{\ungaramond}{% -\renewcommand{\rmdefault}{\rmdefault@garamond}\normalfont% -} - diff --git a/doc/xtreemfs-userguide/images/architecture.pdf b/doc/xtreemfs-userguide/images/architecture.pdf deleted file mode 100644 index bf380d64ce851a884aad89401eb93c4b29e258b2..0000000000000000000000000000000000000000 Binary files a/doc/xtreemfs-userguide/images/architecture.pdf and /dev/null differ diff --git a/doc/xtreemfs-userguide/images/architecture.svg b/doc/xtreemfs-userguide/images/architecture.svg deleted file mode 100644 index d2288c07da7bc08663852190569e5a0cacf9b3ed..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/images/architecture.svg +++ /dev/null @@ -1,1122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - metadata - contents - Metadata andReplica Catalog (MRC) - client - - - - parallel read/write - metadata operations,object locations,authorization(e.g. open, rename) - - - - - - - README.txt1365 bytes - - - object - - - - object - - - object - Object Storage Devices(OSDs) - - - object - - - 101101011101101010100111100101011110101110010101001100010010011100100101011101 - - - - - - - XtreemFSClient - - FUSE - - Linux VFS - - - - UserProcess - - UserProcess - - diff --git a/doc/xtreemfs-userguide/images/cluster_setup.png b/doc/xtreemfs-userguide/images/cluster_setup.png deleted file mode 100644 index f64867556c11f92bc1820957881f71d26f4249b5..0000000000000000000000000000000000000000 Binary files a/doc/xtreemfs-userguide/images/cluster_setup.png and /dev/null differ diff --git a/doc/xtreemfs-userguide/images/final_logo.pdf b/doc/xtreemfs-userguide/images/final_logo.pdf deleted file mode 100644 index 6bfee3ee881435b599c3bd8e093990131ab9a5c2..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/images/final_logo.pdf +++ /dev/null @@ -1,1029 +0,0 @@ -%PDF-1.4 -% -3 0 obj -<< - /Type /Catalog - /Pages 2 0 R ->> -endobj -4 0 obj -<< - /Type /Page - /Parent 2 0 R - /MediaBox [ 0 0 192 56 ] - /Resources 5 0 R - /Contents 6 0 R - /Group - << /Type /Group - /S /Transparency - /CS /DeviceRGB - >> ->> -endobj -6 0 obj -<< - /Length 7 0 R ->> -stream -0.8 0 0 -0.8 0 56 cm -q -1 0 0 1 0 0 cm -q -1 0 0 1 -100.84152 -759.30717 cm -q -0.441941 0 0 0.441941 154.35506 536.04966 cm -q -0.19215687 0.30588236 0.49411765 rg -264.85608 638.39467 m -266.91831 634.0015 272.84253 633.23285 277.09198 634.0065 c -280.66651 634.82514 285.36589 637.66102 283.65362 641.98533 c -281.55389 646.15328 275.94213 646.89343 271.80517 646.25189 c -268.16815 645.52936 263.2313 642.85196 264.85608 638.39467 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -290.04028 643.06431 m -292.06501 639.10833 297.26433 637.95848 301.3263 638.54215 c -304.62586 639.17957 308.45036 641.72461 306.73809 645.53574 c -304.68836 649.2535 299.7765 650.33636 295.86451 649.92328 c -292.48996 649.4151 288.40299 647.04091 290.04028 643.06431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.24986 646.23389 m -314.17461 642.79822 318.54904 641.30279 322.29854 641.69636 c -325.33565 642.1748 328.02279 644.51774 326.38551 647.71807 c -324.44826 650.93003 320.3238 652.30237 316.74927 652.10172 c -313.63718 651.7795 310.68757 649.60545 312.24986 646.23389 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.44613 613.61667 m -247.69583 608.90854 253.84503 608.16489 258.38193 609.2585 c -262.4439 610.44584 267.0433 613.98663 265.30602 618.75225 c -263.13131 623.43664 257.05711 624.19779 252.5577 623.17917 c -248.39574 622.03432 243.62137 618.49103 245.44613 613.61667 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -272.26761 620.45203 m -274.34234 615.94012 280.11658 614.97774 284.516 615.94262 c -288.39049 616.99498 292.58994 620.29205 290.99015 624.77521 c -288.97792 629.19463 283.36615 630.18075 279.04172 629.35461 c -275.04225 628.38724 270.59283 625.09517 272.26761 620.45203 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -297.33932 626.15753 m -299.20158 622.03557 304.27591 620.75199 308.38787 621.56813 c -311.9999 622.48051 315.41195 625.54386 313.94964 629.55833 c -312.12488 633.53906 307.26302 634.82764 303.25104 634.19397 c -299.47654 633.40283 295.82702 630.34823 297.33932 626.15753 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -319.44892 630.60944 m -321.0987 626.99367 325.33565 625.36888 329.09765 626.03129 c -332.39722 626.80619 334.8344 629.67832 333.50957 633.11287 c -331.87229 636.57241 327.83532 638.15095 324.1858 637.70226 c -320.72375 637.08234 318.11159 634.20647 319.44892 630.60944 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.85753 594.66791 m -256.18222 590.166 262.09394 589.49359 266.51836 590.63969 c -270.49284 591.87328 274.81728 595.40781 273.105 600.02846 c -270.93029 604.6416 264.95607 605.36526 260.51915 604.2729 c -256.43219 603.05431 251.92028 599.40854 253.85753 594.66791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -279.84162 601.87321 m -281.84135 597.48004 287.40312 596.67015 291.61507 597.74626 c -295.45207 598.9286 299.43904 602.32441 297.98923 606.75382 c -296.13948 611.17074 290.6277 612.06438 286.44075 611.10075 c -282.42878 609.97215 278.20433 606.46886 279.84162 601.87321 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -304.16342 608.38361 m -305.8382 604.3004 310.71257 603.20554 314.63705 604.18791 c -318.24908 605.29527 321.54864 608.53359 320.3363 612.58181 c -318.76151 616.61503 314.01213 617.79987 310.13764 616.97373 c -306.32564 615.95512 302.8136 612.60931 304.16342 608.38361 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.6981 613.94913 m -327.07292 610.31586 331.13489 608.86605 334.72191 609.74343 c -338.04648 610.7583 340.49616 613.84164 339.45879 617.38993 c -338.13397 620.92571 334.23448 622.43927 330.70994 621.75186 c -327.1854 620.85447 324.58574 617.65364 325.6981 613.94913 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -343.93321 618.48603 m -345.07056 615.37519 348.30763 613.57168 351.54471 614.33658 c -354.53182 615.25146 356.11911 618.19857 355.20673 621.19068 c -354.09437 624.19029 350.99478 626.00005 347.83269 625.45137 c -344.64561 624.68147 343.00833 621.59438 343.93321 618.48603 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -262.35641 576.93274 m -264.63111 572.80703 270.24288 572.44958 274.31734 573.56068 c -277.94187 574.72928 282.19131 577.9751 280.59152 582.28703 c -278.51679 586.62647 272.73005 587.03391 268.63059 585.95155 c -264.88108 584.77421 260.40667 581.35716 262.35641 576.93274 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -286.97818 584.18679 m -288.84044 580.07607 294.13974 579.65863 297.96424 580.74724 c -301.53877 581.94458 305.47575 585.15416 304.22592 589.36736 c -302.56363 593.5993 297.22683 594.12673 293.37734 593.11061 c -289.65283 591.93577 285.45338 588.55996 286.97818 584.18679 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -310.11264 591.15462 m -311.56245 587.25263 316.24934 586.59522 319.79887 587.64133 c -323.21093 588.83368 326.54799 591.97076 325.58561 595.9065 c -324.28578 599.83598 319.67389 600.64588 316.11186 599.7085 c -312.51233 598.56365 308.9503 595.26408 310.11264 591.15462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -330.74744 597.50629 m -331.87229 593.96675 335.75928 592.95064 339.03385 593.94301 c -342.20843 595.10035 344.79559 598.13995 344.03319 601.67699 c -343.02083 605.17153 339.25882 606.35013 335.98425 605.49649 c -332.62219 604.41038 329.87255 601.2008 330.74744 597.50629 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -348.38262 603.05431 m -349.24501 599.97971 352.3321 598.55115 355.30671 599.48478 c -358.18134 600.58338 360.0186 603.513 359.39368 606.58885 c -358.56879 609.57845 355.63167 611.137 352.68206 610.3721 c -349.60746 609.36598 347.70771 606.25014 348.38262 603.05431 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.93071 607.73869 m -363.61812 605.17153 365.96781 603.34427 368.64246 604.21041 c -371.19213 605.23652 372.31698 608.05365 371.77955 610.65081 c -371.10464 613.12424 368.86743 615.01774 366.23028 614.34658 c -363.50564 613.43295 362.38079 610.40709 362.93071 607.73869 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.57918 611.58694 m -375.14161 609.51596 376.90388 607.35625 379.27857 608.14489 c -381.49078 609.09102 382.00321 611.79691 381.50328 613.93288 c -380.94085 615.92512 379.25357 618.07234 376.94137 617.49741 c -374.56669 616.68252 374.11675 613.74291 374.57918 611.58694 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -247.29589 554.86438 m -249.83305 551.43108 255.03237 551.26735 258.80688 552.23098 c -261.88147 553.15086 266.08092 555.86925 264.19367 559.59876 c -261.83148 563.36202 256.28221 563.48325 252.44521 562.48713 c -249.29562 561.51976 244.98369 558.60764 247.29589 554.86438 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.30537 561.38228 m -272.46758 557.72151 277.72939 557.7665 281.31642 558.77637 c -284.47851 559.80748 288.76544 562.62087 287.31564 566.5241 c -285.39089 570.46234 279.86661 570.42859 276.24209 569.42747 c -273.01751 568.37886 268.44311 565.37175 270.30537 561.38228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -293.27735 568.39261 m -294.97713 564.6631 300.00147 564.73059 303.33853 565.74795 c -306.51312 566.87031 310.48759 569.73118 309.45023 573.61692 c -307.98792 577.53641 302.8386 577.56265 299.47654 576.58278 c -296.20197 575.46418 291.90253 572.41708 293.27735 568.39261 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -314.987 575.46043 m -316.22434 571.83341 320.73625 571.72967 323.81085 572.73829 c -326.92294 573.91938 330.33499 576.78151 329.62258 580.48852 c -328.57272 584.20928 324.07331 584.48425 320.97372 583.53437 c -317.72414 582.37202 314.03713 579.32867 314.987 575.46043 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -334.52194 582.22329 m -335.40932 578.85374 339.20883 578.42004 342.04595 579.41616 c -344.99557 580.61725 347.73271 583.44688 347.25777 586.85893 c -346.49537 590.23474 342.82085 590.88716 339.94623 589.97103 c -336.83414 588.79993 333.89702 585.78908 334.52194 582.22329 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.43222 588.42998 m -352.05714 585.43662 355.05675 584.57048 357.6814 585.55536 c -360.39355 586.74395 362.46827 589.50984 362.10582 592.55944 c -361.56839 595.4928 358.71877 596.58516 356.06911 595.70402 c -353.19449 594.55917 351.00728 591.60456 351.43222 588.42998 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.56787 593.93926 m -366.01781 591.39709 368.26751 590.06351 370.6797 591.03214 c -373.10438 592.18449 374.55419 594.86288 374.26673 597.52254 c -373.84178 599.97096 371.74206 601.49826 369.31738 600.65712 c -366.73021 599.56602 365.25541 596.68265 365.56787 593.93926 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.04136 598.70613 m -377.37882 596.6414 379.0036 594.86538 381.20332 595.80526 c -383.31554 596.90387 384.21542 599.47978 383.94046 601.75323 c -383.603 603.72047 382.0907 605.62522 379.91598 604.83908 c -377.65378 603.81546 376.7789 601.01958 377.04136 598.70613 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -256.10723 542.52975 m -258.51941 539.61513 263.29379 539.76886 266.61835 540.59126 c -269.11802 541.30616 273.47995 543.51462 271.71768 546.7592 c -269.50547 550.01752 264.31865 549.76505 260.96909 548.91391 c -258.41943 548.16151 253.90752 545.76183 256.10723 542.52975 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -277.36694 548.38523 m -279.35418 545.2194 284.26604 545.63809 287.35313 546.51673 c -289.99028 547.37412 294.35221 549.72756 293.06488 553.1721 c -291.34011 556.64665 286.10329 556.18171 283.0037 555.30308 c -280.34155 554.43194 275.64217 551.88352 277.36694 548.38523 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -298.60165 554.94687 m -300.10146 551.64731 304.87583 552.16849 307.68796 553.06462 c -310.4376 554.05699 314.43708 556.51042 313.61218 560.00246 c -312.37485 563.53824 307.4005 563.05831 304.57587 562.17967 c -301.78874 561.1873 297.40181 558.5464 298.60165 554.94687 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -318.77401 561.82222 m -319.81137 558.53015 324.1858 558.96509 326.74796 559.86623 c -329.5101 560.96608 332.98464 563.4795 332.5097 566.87906 c -331.69731 570.31611 327.28539 570.01989 324.68573 569.14376 c -321.83611 568.0489 318.0366 565.35926 318.77401 561.82222 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -337.1466 568.65757 m -337.80901 565.51299 341.55852 565.68546 343.92071 566.59659 c -346.60785 567.76519 349.46998 570.29861 349.23251 573.49944 c -348.73258 576.69527 345.07056 576.74526 342.64587 575.86413 c -339.84624 574.70303 336.74665 571.99838 337.1466 568.65757 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.24448 575.17172 m -353.64443 572.30209 356.64404 572.07088 358.86875 573.0045 c -361.38092 574.2031 363.64312 576.72027 363.54313 579.65238 c -363.23067 582.49451 360.39355 582.99569 358.10635 582.10456 c -355.46919 580.91721 353.05701 578.22507 353.24448 575.17172 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.90519 581.17718 m -367.14266 578.67876 369.39237 577.9601 371.49209 578.92123 c -373.76679 580.11857 375.46657 582.587 375.42907 585.21415 c -375.2291 587.63133 373.15437 588.6262 371.00465 587.72632 c -368.59247 586.54773 366.8177 583.89682 366.90519 581.17718 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.16621 586.57272 m -378.31619 584.49924 379.90349 583.27441 381.86573 584.25678 c -383.89046 585.43037 385.09031 587.82256 385.05281 590.13725 c -384.90283 592.10075 383.47802 593.5718 381.49078 592.67442 c -379.34106 591.52957 378.12872 588.94616 378.16621 586.57272 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.24002 591.32585 m -387.35251 589.68856 388.40237 587.99379 390.20213 588.98116 c -391.95191 590.11476 392.7268 592.41196 392.66431 594.42294 c -392.53933 595.95024 391.57695 597.8275 389.78969 596.95261 c -387.93993 595.85775 387.19003 593.36433 387.24002 591.32585 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -245.27115 528.66657 m -247.80832 526.53685 251.84529 526.56185 254.91989 527.13677 c -256.71965 527.53672 260.85661 529.10151 258.85687 531.53869 c -256.43219 533.97712 251.97027 533.8134 248.85818 533.18723 c -246.95843 532.73854 242.89646 531.01751 245.27115 528.66657 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -263.88121 532.72479 m -266.13091 530.29886 270.48034 530.70005 273.37996 531.38746 c -275.32971 531.91739 279.81662 533.68591 278.22933 536.44305 c -276.19209 539.20144 271.39272 538.65276 268.5056 537.9441 c -266.55586 537.39293 261.84398 535.43943 263.88121 532.72479 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -283.40365 537.89661 m -285.21591 535.21321 289.75282 535.91812 292.38997 536.65802 c -294.53969 537.34293 298.92661 539.27643 297.82676 542.25104 c -296.28946 545.24565 291.3651 544.437 288.76544 543.6971 c -286.64072 543.01219 281.86635 540.88497 283.40365 537.89661 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -302.91359 543.89082 m -304.23841 541.0337 308.75032 541.90858 311.08752 542.66348 c -313.41221 543.50712 317.42418 545.5656 316.79927 548.63895 c -315.7619 551.74979 310.97503 550.85491 308.66283 550.11126 c -306.35064 549.27387 301.91372 547.03291 302.91359 543.89082 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -321.58614 550.37372 m -322.43603 547.45286 326.68547 548.32899 328.7602 549.08639 c -331.18488 550.07001 334.67192 552.21973 334.40946 555.27183 c -333.80953 558.37142 329.46011 557.57903 327.36038 556.82788 c -324.9107 555.848 321.04871 553.53331 321.58614 550.37372 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -338.75888 557.02035 m -339.22132 554.15323 342.97083 554.85438 344.87058 555.62678 c -347.28277 556.71539 350.20738 558.92385 350.19488 561.85722 c -349.90742 564.81933 346.22041 564.30064 344.25816 563.52825 c -341.77099 562.43839 338.57141 560.0737 338.75888 557.02035 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -354.00688 563.55324 m -354.20686 560.85485 357.29395 561.22355 359.09372 562.03219 c -361.40591 563.18704 363.7806 565.4205 363.90559 568.16639 c -363.8181 570.87853 360.89348 570.7698 359.00623 569.95865 c -356.60654 568.7988 354.04438 566.41162 354.00688 563.55324 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -367.15516 569.76118 m -367.20515 567.3365 369.55484 567.25276 371.29212 568.11764 c -373.44183 569.30249 375.31659 571.52595 375.49156 574.04437 c -375.50406 576.41406 373.35435 576.804 371.52958 575.94287 c -369.29238 574.75302 367.29264 572.37459 367.15516 569.76118 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -378.19121 575.50792 m -378.16621 573.43445 379.816 572.83078 381.51577 573.7569 c -383.44052 574.94425 384.86533 577.12646 385.02781 579.40241 c -385.07781 581.37465 383.6155 582.28828 381.86573 581.38215 c -379.84099 580.19231 378.36619 577.85262 378.19121 575.50792 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.22752 580.71974 m -387.19003 579.03871 388.26489 577.91136 389.86468 578.88873 c -391.56446 580.05858 392.60182 582.17205 392.7268 584.20178 c -392.7643 585.76283 391.83942 587.16764 390.20213 586.23652 c -388.42737 585.06917 387.37751 582.79572 387.22752 580.71974 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -394.47657 585.37413 m -394.45158 584.0818 395.08899 582.48701 396.5638 583.48938 c -398.00111 584.61423 398.75101 586.66146 398.80101 588.44998 c -398.826 589.63107 398.23858 591.42958 396.78877 590.50721 c -395.26397 589.37735 394.57656 587.19514 394.47657 585.37413 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -253.44508 521.71248 m -255.79477 519.98771 259.4193 520.17518 262.15644 520.65012 c -263.45627 520.91259 267.7682 522.12493 265.95594 524.11217 c -263.70623 526.11191 259.65676 525.74945 256.93212 525.24952 c -255.5573 524.96206 251.25787 523.59974 253.44508 521.71248 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -270.56783 525.12454 m -272.63006 523.1373 276.57954 523.69972 279.09171 524.27465 c -280.57902 524.6496 285.10343 526.07441 283.71611 528.35911 c -281.86635 530.65631 277.45443 529.91016 274.97975 529.32648 c -273.52994 528.94153 268.74307 527.33675 270.56783 525.12454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -288.45299 529.64269 m -290.07777 527.39924 294.27722 528.29287 296.50193 528.90654 c -298.2267 529.43772 302.58863 531.02001 301.67625 533.53968 c -300.32643 536.0706 295.70203 535.03448 293.55232 534.42706 c -291.90253 533.90838 287.11566 532.13112 288.45299 529.64269 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -306.35064 535.02699 m -307.48799 532.59855 311.76243 533.70591 313.67468 534.32333 c -315.63692 535.02199 319.5864 536.72676 319.13646 539.38891 c -318.29907 542.06606 313.69967 540.88497 311.83742 540.28005 c -309.93767 539.59889 305.52575 537.71288 306.35064 535.02699 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -323.57338 541.0037 m -324.24829 538.46778 328.37275 539.64763 330.03503 540.2588 c -332.14725 541.11494 335.5843 542.92345 335.50931 545.61935 c -335.09687 548.34774 330.80993 547.18914 329.16014 546.58172 c -327.07292 545.73558 323.22342 543.77084 323.57338 541.0037 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.58378 547.28913 m -339.87124 544.73696 343.62075 545.83182 345.10805 546.44924 c -347.27027 547.43411 350.19488 549.32511 350.36986 551.96601 c -350.26987 554.64441 346.52037 553.67079 344.99557 553.04212 c -342.80835 552.05475 339.58378 550.02627 339.58378 547.28913 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -353.99439 553.62705 m -354.00688 551.15362 357.19397 552.00601 358.59378 552.65842 c -360.7185 553.73578 363.14319 555.68178 363.45564 558.20269 c -363.56813 560.72986 360.50603 560.08995 359.01873 559.41129 c -356.85651 558.32268 354.20686 556.2467 353.99439 553.62705 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -366.59273 559.80373 m -366.46775 557.50529 368.96742 557.98022 370.35474 558.69763 c -372.35448 559.83123 374.32922 561.80097 374.70417 564.16066 c -374.90414 566.44411 372.59195 566.25164 371.11714 565.50174 c -369.04241 564.35064 366.93019 562.25216 366.59273 559.80373 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -377.35382 565.66672 m -377.15385 563.62823 378.97861 563.62698 380.36593 564.42813 c -382.20318 565.58798 383.77798 567.54772 384.14043 569.72493 c -384.3529 571.69217 382.75311 572.01463 381.27831 571.18474 c -379.37855 570.00615 377.71627 567.91642 377.35382 565.66672 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -386.34014 571.116 m -386.14017 569.39873 387.34001 568.87379 388.71483 569.76118 c -390.35211 570.92353 391.57695 572.84577 391.88941 574.83176 c -392.07689 576.4378 391.07702 577.28644 389.63971 576.38781 c -387.93993 575.20546 386.6776 573.15448 386.34014 571.116 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -393.67668 576.0966 m -393.5142 574.72928 394.21411 573.69191 395.53893 574.64929 c -396.95125 575.78414 397.91362 577.66389 398.12609 579.45491 c -398.28857 580.70224 397.70115 582.01332 396.36383 581.08094 c -394.87652 579.9161 393.95164 577.93136 393.67668 576.0966 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -260.48166 516.47567 m -262.65637 515.10085 265.89345 515.40081 268.31813 515.77576 c -269.2555 515.93824 273.56744 516.92561 271.99265 518.48791 c -269.91792 520.11269 266.2809 519.62526 263.86871 519.22531 c -262.90634 519.03783 258.56941 517.92548 260.48166 516.47567 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -276.22959 519.35029 m -278.11684 517.738 281.66638 518.38792 283.87859 518.86286 c -284.99094 519.12532 289.45285 520.30017 288.26551 522.13743 c -286.59073 524.03718 282.56626 523.17479 280.44154 522.69985 c -279.39167 522.43739 274.6548 521.07507 276.22959 519.35029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -292.60244 523.26228 m -294.06475 521.41252 297.92674 522.39989 299.814 522.91233 c -301.20131 523.31227 305.46325 524.6246 304.72585 526.71183 c -303.5635 528.8228 299.22657 527.6617 297.43931 527.17427 c -296.17697 526.78682 291.46509 525.28701 292.60244 523.26228 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -309.01279 528.0454 m -309.98766 526.01192 314.02463 527.24926 315.59942 527.73669 c -317.24921 528.31287 321.0862 529.71893 320.79874 531.99363 c -320.13633 534.24959 315.72441 532.91351 314.2371 532.43233 c -312.6998 531.8899 308.37537 530.30011 309.01279 528.0454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -324.9107 533.47094 m -325.41064 531.31872 329.42261 532.66605 330.73494 533.14598 c -332.5722 533.88089 335.92176 535.38444 335.99675 537.73913 c -335.75928 540.07632 331.53483 538.70275 330.26 538.23032 c -328.48523 537.51416 324.71073 535.86188 324.9107 533.47094 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.80875 539.30018 m -339.94623 537.09047 343.68324 538.42154 344.82059 538.89648 c -346.75784 539.77261 349.61996 541.36865 349.94492 543.71835 c -350.01991 546.06929 346.2329 544.79695 345.07056 544.31077 c -343.14581 543.43713 339.95873 541.71986 339.80875 539.30018 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -353.38197 545.30439 m -353.25698 543.10468 356.53155 544.28452 357.59391 544.78321 c -359.53116 545.76808 361.94334 547.44036 362.41828 549.72131 c -362.68075 552.00976 359.50616 550.97614 358.36881 550.44621 c -356.40657 549.44759 353.75692 547.66783 353.38197 545.30439 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -365.44288 551.28485 m -365.15542 549.17013 367.83007 550.06876 368.87993 550.62619 c -370.75469 551.68605 372.76692 553.40707 373.29185 555.58054 c -373.65431 557.72276 371.16713 557.05035 370.01728 556.44543 c -368.10503 555.36182 365.93032 553.53581 365.44288 551.28485 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -375.89151 557.08284 m -375.54156 555.1331 377.56629 555.63678 378.66615 556.28295 c -380.40342 557.38655 382.0657 559.12757 382.59063 561.16856 c -382.96558 563.08705 381.16582 562.86958 379.96598 562.16967 c -378.17871 561.03607 376.41644 559.19256 375.89151 557.08284 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -384.77785 562.58462 m -384.42789 560.87234 385.81521 560.90234 386.96506 561.65099 c -388.53985 562.77584 389.87718 564.50687 390.36461 566.40412 c -390.68957 568.03515 389.52722 568.32512 388.30238 567.52647 c -386.6776 566.37037 385.27778 564.53686 384.77785 562.58462 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -392.16438 567.71645 m -391.87691 566.29163 392.7143 565.8167 393.86415 566.66658 c -395.25147 567.77894 396.36383 569.49121 396.73878 571.23598 c -397.02624 572.55456 396.33883 573.33071 395.15149 572.46207 c -393.70168 571.30473 392.61432 569.50871 392.16438 567.71645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -295.9895 518.40042 m -297.30182 516.88812 300.83886 517.90048 302.47615 518.32543 c -303.576 518.62539 307.70046 519.72524 307.11304 521.43752 c -306.11317 523.17479 302.0637 521.97495 300.5764 521.575 c -299.60152 521.30004 295.06462 519.98771 295.9895 518.40042 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -311.06252 522.61236 m -311.88741 520.93758 315.69941 522.19992 316.99924 522.61236 c -318.38656 523.0748 322.08607 524.23715 321.92359 526.1619 c -321.41116 528.02041 317.19921 526.63684 316.01187 526.26189 c -314.76203 525.83694 310.57508 524.48712 311.06252 522.61236 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -325.7231 527.49922 m -326.09805 525.71196 329.97254 527.11177 331.0099 527.47423 c -332.63469 528.10664 335.83427 529.34648 336.03424 531.38746 c -335.93426 533.33346 331.8223 531.88365 330.83492 531.5237 c -329.31012 530.92127 325.6731 529.53771 325.7231 527.49922 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -339.59627 532.82602 m -339.60877 530.97252 343.30829 532.39608 344.17067 532.75353 c -345.92045 533.52718 348.67008 534.86076 349.13252 536.93174 c -349.32 538.92772 345.54549 537.51416 344.68311 537.15171 c -342.95833 536.38306 339.88374 534.9445 339.59627 532.82602 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -352.3821 538.42029 m -352.13213 536.53054 355.45669 537.87911 356.24409 538.24781 c -358.01886 539.13895 360.38105 540.56001 360.98097 542.60349 c -361.36842 544.60198 358.10635 543.33715 357.25646 542.9397 c -355.46919 542.03732 352.88203 540.52751 352.3821 538.42029 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -363.88059 544.0958 m -363.46814 542.22104 366.28027 543.38214 367.06767 543.79709 c -368.80494 544.77321 370.81718 546.26426 371.46709 548.239 c -371.95453 550.18 369.30488 549.17513 368.42999 548.71269 c -366.65522 547.71032 364.49301 546.13928 363.88059 544.0958 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -374.00426 549.70131 m -373.51682 547.90405 375.74153 548.77143 376.57892 549.26387 c -378.22871 550.29873 379.91598 551.82978 380.5659 553.71578 c -381.07833 555.52555 379.07859 554.88313 378.14122 554.32945 c -376.45394 553.25959 374.65417 551.64731 374.00426 549.70131 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -382.74061 555.1181 m -382.26568 553.46832 383.87796 553.94575 384.77785 554.54193 c -386.30265 555.61053 387.71496 557.15658 388.32738 558.93635 c -388.78982 560.54739 387.415 560.34616 386.41513 559.68375 c -384.86533 558.5764 383.37803 556.95036 382.74061 555.1181 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -390.15214 560.25992 m -389.7272 558.82011 390.77706 558.84761 391.73943 559.55627 c -393.08926 560.62738 394.3016 562.17467 394.81403 563.84195 c -395.22648 565.20428 394.36409 565.46549 393.33922 564.70934 c -391.93941 563.58574 390.72707 561.9722 390.15214 560.25992 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -312.61232 518.43791 m -313.31222 517.07559 316.89925 518.31293 317.98661 518.63789 c -319.17395 519.01284 322.69849 519.97521 322.6485 521.6 c -322.26105 523.0998 318.24908 521.74998 317.2867 521.46252 c -316.26184 521.11256 312.24986 519.96271 312.61232 518.43791 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -326.17304 522.79984 m -326.423 521.35003 330.16001 522.71235 330.97241 522.99981 c -332.42222 523.53724 335.45932 524.54961 335.75928 526.31188 c -335.75928 527.88667 331.7848 526.46186 331.0224 526.19939 c -329.69757 525.68696 326.22303 524.53711 326.17304 522.79984 c -f -Q -q -0.44313726 0.76862746 0.88235295 rg -339.08384 527.62421 m -339.00885 526.1244 342.62088 527.52422 343.28329 527.79918 c -344.87058 528.48034 347.48274 529.58395 348.03267 531.40246 c -348.30763 533.0285 344.60812 531.61243 343.9582 531.34122 c -342.4209 530.66881 339.48379 529.47521 339.08384 527.62421 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -351.10726 532.78103 m -350.79481 531.22373 354.09437 532.5973 354.6818 532.86977 c -356.33158 533.67216 358.58128 534.87076 359.28119 536.68677 c -359.74363 538.36405 356.46906 537.02047 355.84414 536.72676 c -354.20686 535.91437 351.71968 534.64829 351.10726 532.78103 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -362.05583 538.09283 m -361.58089 536.49679 364.44301 537.76663 365.03044 538.07034 c -366.65522 538.96522 368.61747 540.24505 369.36737 542.02482 c -369.94229 543.7146 367.19265 542.53225 366.54274 542.1873 c -364.89296 541.26867 362.78073 539.92759 362.05583 538.09283 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -371.82955 543.42213 m -371.26712 541.83234 373.61681 542.9072 374.25423 543.2734 c -375.81652 544.23328 377.5038 545.57185 378.2537 547.29288 c -378.86612 548.93641 376.69141 548.01278 375.979 547.59034 c -374.37921 546.59672 372.59195 545.1969 371.82955 543.42213 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -380.39092 548.65645 m -379.816 547.1304 381.62826 547.91779 382.32817 548.37273 c -383.77798 549.37635 385.22779 550.74867 385.95269 552.39596 c -386.52762 553.92826 384.94033 553.35208 384.15293 552.82965 c -382.65313 551.78604 381.14082 550.35123 380.39092 548.65645 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg -387.77745 553.70454 m -387.24002 552.30472 388.50236 552.72716 389.27726 553.28959 c -390.60208 554.30696 391.87691 555.69802 392.50183 557.26532 c -393.03926 558.62514 391.95191 558.44766 391.11451 557.82649 c -389.7397 556.75413 388.47736 555.31057 387.77745 553.70454 c -f -Q -q -0.19215687 0.30588236 0.49411765 rg --87.686408 585.51161 m --101.65891 605.54773 l --85.394209 605.54773 l --78.571354 592.40446 l --71.231067 605.54773 l --53.874595 605.54773 l --67.956497 585.51161 l --54.856966 566.49286 l --70.629896 566.49286 l --76.880326 578.01385 l --82.692064 566.49286 l --99.966797 566.49286 l --87.686408 585.51161 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --12.796235 566.49286 m --52.887224 566.49286 l --52.887224 578.01385 l --40.100152 578.01385 l --40.100152 605.54773 l --25.579558 605.54773 l --25.579558 578.01385 l --12.796235 578.01385 l --12.796235 566.49286 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg --8.4293081 605.54773 m -6.1012853 605.54773 l -6.1012853 592.23073 l -9.4570949 592.23073 l -10.420718 592.23073 11.258109 592.34072 11.966766 592.56069 c -12.675423 592.81815 13.247848 593.37558 13.68529 594.23547 c -14.030245 594.80289 14.312708 595.57154 14.530179 596.54266 c -14.712655 597.53128 14.858886 598.5824 14.966372 599.6985 c -15.130101 600.77836 15.266333 601.84947 15.376318 602.91183 c -15.485054 603.9192 15.612537 604.79783 15.758768 605.54773 c -31.336724 605.54773 l -30.661812 603.56424 30.174376 601.27079 29.874416 598.66988 c -29.524462 596.06773 28.812055 593.70179 27.749695 591.57207 c -27.09978 590.49846 26.274888 589.60607 25.262521 588.89617 c -24.262652 588.15127 22.959073 587.64133 21.368032 587.36887 c -21.368032 587.25888 l -24.100173 586.58397 26.299885 585.42537 27.949668 583.78434 c -29.561957 582.14205 30.37435 579.84486 30.411845 576.89024 c -30.37435 573.16823 29.087019 570.48733 26.549852 568.84505 c -23.950193 567.27775 20.365664 566.49286 15.778765 566.49286 c --8.4293081 566.49286 l --8.4293081 605.54773 l -h -5.4388722 575.16047 m -9.7695539 575.16047 l -11.40184 575.12422 12.835402 575.35294 14.07024 575.84913 c -15.247585 576.32657 15.855005 577.45517 15.8925 579.23494 c -15.8925 580.17231 15.731272 580.91471 15.408814 581.46589 c -15.066359 582.07206 14.582672 582.53075 13.955255 582.84321 c -12.684171 583.35564 11.213114 583.59436 9.5420838 583.55812 c -5.4388722 583.55812 l -5.4388722 575.16047 l -f* -Q -q -0.19215687 0.30588236 0.49411765 rg -36.948488 605.54773 m -70.094138 605.54773 l -70.094138 596.15272 l -51.134126 596.15272 l -51.134126 590.83216 l -68.894296 590.83216 l -68.894296 581.43215 l -51.134126 581.43215 l -51.134126 575.88787 l -69.719187 575.88787 l -69.719187 566.49286 l -36.948488 566.49286 l -36.948488 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -76.380813 605.54773 m -109.52646 605.54773 l -109.52646 596.15272 l -90.566452 596.15272 l -90.566452 590.83216 l -108.32662 590.83216 l -108.32662 581.43215 l -90.566452 581.43215 l -90.566452 575.88787 l -109.15151 575.88787 l -109.15151 566.49286 l -76.380813 566.49286 l -76.380813 605.54773 l -f -Q -q -0.19215687 0.30588236 0.49411765 rg -116.26308 605.54773 m -128.61146 605.54773 l -128.77394 574.82426 l -129.01141 574.82426 l -136.21046 605.54773 l -148.32137 605.54773 l -155.7329 574.82426 l -155.84539 574.82426 l -156.08286 605.54773 l -169.01866 605.54773 l -169.01866 566.49286 l -147.62147 566.49286 l -142.7596 587.83506 l -142.64712 587.83506 l -137.71027 566.49286 l -116.26308 566.49286 l -116.26308 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -180.8921 605.54773 m -190.8283 605.54773 l -190.8283 589.88104 l -202.62675 589.88104 l -202.62675 582.16455 l -190.8283 582.16455 l -190.8283 574.20934 l -203.17668 574.20934 l -203.17668 566.49286 l -180.8921 566.49286 l -180.8921 605.54773 l -f -Q -q -0.44313726 0.76862746 0.88235295 rg -209.28837 604.69284 m -210.31324 604.96531 211.70056 605.26527 213.46283 605.59273 c -215.1876 605.97393 217.19984 606.18265 219.52453 606.21889 c -224.11143 606.21889 227.76095 605.11779 230.4481 602.91433 c -233.17274 600.74711 234.56006 597.54253 234.59755 593.30184 c -234.59755 591.84453 234.44757 590.5697 234.14761 589.47734 c -233.83515 588.43873 233.36021 587.52885 232.7478 586.74645 c -231.51046 585.21665 229.99816 584.0968 228.21089 583.38564 c -223.574 581.25592 l -221.88672 580.50977 220.72437 579.81861 220.09946 579.18119 c -219.47454 578.56127 219.16208 577.76013 219.16208 576.77776 c -219.19957 574.35558 220.87435 573.12574 224.19892 573.09074 c -225.67372 573.09074 227.13603 573.28197 228.57334 573.66442 c -229.94816 574.06436 231.08551 574.5293 231.9854 575.05673 c -232.43534 567.37899 l -230.84804 566.72283 229.19826 566.29538 227.49848 566.09541 c -225.79871 565.91293 224.19892 565.8217 222.68662 565.8217 c -218.53716 565.8217 215.1876 566.81406 212.65043 568.80005 c -210.02578 570.80479 208.70095 573.67316 208.66346 577.40767 c -208.62596 580.12232 209.25088 582.39952 210.51321 584.23803 c -211.73805 586.09778 213.91277 587.66383 217.03736 588.93866 c -219.32456 589.84104 l -220.11195 590.09601 220.79936 590.35098 221.41178 590.60594 c -222.0492 590.87966 222.54913 591.17962 222.91159 591.50707 c -223.69898 592.14449 224.08643 593.07437 224.08643 594.29546 c -224.08643 595.53405 223.69898 596.52642 222.91159 597.27257 c -222.08669 598.09371 220.69938 598.50366 218.72464 598.50366 c -217.83725 598.50366 216.91237 598.39367 215.975 598.17495 c -215.07511 597.97498 214.22523 597.765 213.40033 597.54628 c -211.80054 596.98261 210.6382 596.51767 209.88829 596.15272 c -209.28837 604.69284 l -f -Q -Q -Q -Q -endstream -endobj -7 0 obj -31868 -endobj -5 0 obj -<< - /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] ->> -endobj -1 0 obj -<< - /Title(final_logo.pdf) - /Author(Björn Kolbeck) - /Creator(www.inkscape.org) - /Producer(Inkscape inkscape 0.45.1) - /CreationDate(D:20070525075700Z) ->> -endobj -2 0 obj -<< - /Type /Pages - /Count 1 - /Kids [ - 4 0 R - ] ->> -endobj -xref -0 8 -0000000000 65535 f -0000032269 00000 n -0000032443 00000 n -0000000015 00000 n -0000000068 00000 n -0000032200 00000 n -0000000257 00000 n -0000032179 00000 n -trailer -<< - /Size 7 - /Root 3 0 R - /Info 1 0 R ->> -startxref -32514 -%%EOF diff --git a/doc/xtreemfs-userguide/images/screenshot_status.png b/doc/xtreemfs-userguide/images/screenshot_status.png deleted file mode 100644 index 3901051e184e1953a9da6eb4e782a8f8b7ec778a..0000000000000000000000000000000000000000 Binary files a/doc/xtreemfs-userguide/images/screenshot_status.png and /dev/null differ diff --git a/doc/xtreemfs-userguide/images/xtfs_logo.pdf b/doc/xtreemfs-userguide/images/xtfs_logo.pdf deleted file mode 100644 index 25ff4be9b008c8b4fe532016ab9fadc1482046f8..0000000000000000000000000000000000000000 Binary files a/doc/xtreemfs-userguide/images/xtfs_logo.pdf and /dev/null differ diff --git a/doc/xtreemfs-userguide/images/xtreemos_neu_logo.pdf b/doc/xtreemfs-userguide/images/xtreemos_neu_logo.pdf deleted file mode 100644 index c0b4d96fa35aa9a2a62c9c24c39d35f65df6ba12..0000000000000000000000000000000000000000 --- a/doc/xtreemfs-userguide/images/xtreemos_neu_logo.pdf +++ /dev/null @@ -1,1557 +0,0 @@ -%PDF-1.4 % -4 0 obj <> endobj xref 4 639 0000000016 00000 n -0000013841 00000 n -0000013936 00000 n -0000017156 00000 n -0000017189 00000 n -0000034277 00000 n -0000051452 00000 n -0000067268 00000 n -0000083517 00000 n -0000099049 00000 n -0000113408 00000 n -0000126904 00000 n -0000140237 00000 n -0000142884 00000 n -0000145053 00000 n -0000145446 00000 n -0000145540 00000 n -0000145681 00000 n -0000146074 00000 n -0000146168 00000 n -0000146309 00000 n -0000146702 00000 n -0000146796 00000 n -0000146937 00000 n -0000147330 00000 n -0000147424 00000 n -0000147565 00000 n -0000147833 00000 n -0000147927 00000 n -0000148068 00000 n -0000148328 00000 n -0000148422 00000 n -0000148563 00000 n -0000148813 00000 n -0000148907 00000 n -0000149048 00000 n -0000149292 00000 n -0000149386 00000 n -0000149527 00000 n -0000149763 00000 n -0000149857 00000 n -0000149998 00000 n -0000150416 00000 n -0000150510 00000 n -0000150651 00000 n -0000151069 00000 n -0000151163 00000 n -0000151304 00000 n -0000151720 00000 n -0000151814 00000 n -0000151955 00000 n -0000152367 00000 n -0000152461 00000 n -0000152602 00000 n -0000153014 00000 n -0000153108 00000 n -0000153249 00000 n -0000153639 00000 n -0000153733 00000 n -0000153874 00000 n -0000154262 00000 n -0000154356 00000 n -0000154497 00000 n -0000154886 00000 n -0000154980 00000 n -0000155121 00000 n -0000155510 00000 n -0000155604 00000 n -0000155745 00000 n -0000156133 00000 n -0000156227 00000 n -0000156368 00000 n -0000156750 00000 n -0000156844 00000 n -0000156985 00000 n -0000157366 00000 n -0000157460 00000 n -0000157601 00000 n -0000157983 00000 n -0000158077 00000 n -0000158218 00000 n -0000158592 00000 n -0000158686 00000 n -0000158827 00000 n -0000159200 00000 n -0000159294 00000 n -0000159435 00000 n -0000159846 00000 n -0000159940 00000 n -0000160081 00000 n -0000160489 00000 n -0000160583 00000 n -0000160724 00000 n -0000161134 00000 n -0000161228 00000 n -0000161369 00000 n -0000161775 00000 n -0000161870 00000 n -0000162013 00000 n -0000162421 00000 n -0000162517 00000 n -0000162660 00000 n -0000163062 00000 n -0000163158 00000 n -0000163301 00000 n -0000163698 00000 n -0000163794 00000 n -0000163937 00000 n -0000164336 00000 n -0000164432 00000 n -0000164575 00000 n -0000164969 00000 n -0000165065 00000 n -0000165208 00000 n -0000165596 00000 n -0000165692 00000 n -0000165835 00000 n -0000166205 00000 n -0000166301 00000 n -0000166444 00000 n -0000166808 00000 n -0000166904 00000 n -0000167047 00000 n -0000167400 00000 n -0000167496 00000 n -0000167639 00000 n -0000167993 00000 n -0000168089 00000 n -0000168232 00000 n -0000168581 00000 n -0000168677 00000 n -0000168820 00000 n -0000169168 00000 n -0000169264 00000 n -0000169407 00000 n -0000169749 00000 n -0000169845 00000 n -0000169988 00000 n -0000170325 00000 n -0000170421 00000 n -0000170564 00000 n -0000170900 00000 n -0000170996 00000 n -0000171139 00000 n -0000171463 00000 n -0000171559 00000 n -0000171702 00000 n -0000172092 00000 n -0000172188 00000 n -0000172331 00000 n -0000172710 00000 n -0000172806 00000 n -0000172949 00000 n -0000173331 00000 n -0000173427 00000 n -0000173570 00000 n -0000173946 00000 n -0000174042 00000 n -0000174185 00000 n -0000174566 00000 n -0000174662 00000 n -0000174805 00000 n -0000175180 00000 n -0000175276 00000 n -0000175419 00000 n -0000175780 00000 n -0000175876 00000 n -0000176019 00000 n -0000176380 00000 n -0000176476 00000 n -0000176619 00000 n -0000176982 00000 n -0000177078 00000 n -0000177221 00000 n -0000177572 00000 n -0000177668 00000 n -0000177811 00000 n -0000178132 00000 n -0000178228 00000 n -0000178371 00000 n -0000178685 00000 n -0000178781 00000 n -0000178924 00000 n -0000179232 00000 n -0000179328 00000 n -0000179471 00000 n -0000179771 00000 n -0000179867 00000 n -0000180010 00000 n -0000180303 00000 n -0000180399 00000 n -0000180542 00000 n -0000180828 00000 n -0000180924 00000 n -0000181067 00000 n -0000181353 00000 n -0000181449 00000 n -0000181592 00000 n -0000181872 00000 n -0000181968 00000 n -0000182111 00000 n -0000182382 00000 n -0000182478 00000 n -0000182621 00000 n -0000182887 00000 n -0000182983 00000 n -0000183126 00000 n -0000183401 00000 n -0000183497 00000 n -0000183640 00000 n -0000183909 00000 n -0000184005 00000 n -0000184148 00000 n -0000184406 00000 n -0000184502 00000 n -0000184645 00000 n -0000184900 00000 n -0000184996 00000 n -0000185139 00000 n -0000185383 00000 n -0000185479 00000 n -0000185622 00000 n -0000185860 00000 n -0000185956 00000 n -0000186099 00000 n -0000186518 00000 n -0000186614 00000 n -0000186757 00000 n -0000187106 00000 n -0000187202 00000 n -0000187345 00000 n -0000187697 00000 n -0000187793 00000 n -0000187936 00000 n -0000188284 00000 n -0000188380 00000 n -0000188523 00000 n -0000188872 00000 n -0000188968 00000 n -0000189111 00000 n -0000189457 00000 n -0000189553 00000 n -0000189696 00000 n -0000190036 00000 n -0000190132 00000 n -0000190275 00000 n -0000190606 00000 n -0000190702 00000 n -0000190845 00000 n -0000191174 00000 n -0000191270 00000 n -0000191413 00000 n -0000191744 00000 n -0000191840 00000 n -0000191983 00000 n -0000192313 00000 n -0000192409 00000 n -0000192552 00000 n -0000192807 00000 n -0000192903 00000 n -0000193046 00000 n -0000193291 00000 n -0000193387 00000 n -0000193530 00000 n -0000193768 00000 n -0000193864 00000 n -0000194007 00000 n -0000194426 00000 n -0000194522 00000 n -0000194665 00000 n -0000195084 00000 n -0000195180 00000 n -0000195323 00000 n -0000195742 00000 n -0000195838 00000 n -0000195981 00000 n -0000196400 00000 n -0000196496 00000 n -0000196639 00000 n -0000197058 00000 n -0000197154 00000 n -0000197297 00000 n -0000197716 00000 n -0000197812 00000 n -0000197955 00000 n -0000198374 00000 n -0000198470 00000 n -0000198613 00000 n -0000198937 00000 n -0000199033 00000 n -0000199176 00000 n -0000199493 00000 n -0000199589 00000 n -0000199732 00000 n -0000200049 00000 n -0000200145 00000 n -0000200288 00000 n -0000200597 00000 n -0000200693 00000 n -0000200836 00000 n -0000201134 00000 n -0000201230 00000 n -0000201373 00000 n -0000201671 00000 n -0000201767 00000 n -0000201910 00000 n -0000202200 00000 n -0000202296 00000 n -0000202439 00000 n -0000202725 00000 n -0000202821 00000 n -0000202964 00000 n -0000203249 00000 n -0000203345 00000 n -0000203488 00000 n -0000203766 00000 n -0000203862 00000 n -0000204005 00000 n -0000204424 00000 n -0000204520 00000 n -0000204663 00000 n -0000205082 00000 n -0000205178 00000 n -0000205321 00000 n -0000205740 00000 n -0000205836 00000 n -0000205979 00000 n -0000206398 00000 n -0000206494 00000 n -0000206637 00000 n -0000207056 00000 n -0000207152 00000 n -0000207295 00000 n -0000207714 00000 n -0000207810 00000 n -0000207953 00000 n -0000208372 00000 n -0000208468 00000 n -0000208611 00000 n -0000209027 00000 n -0000209123 00000 n -0000209266 00000 n -0000209680 00000 n -0000209776 00000 n -0000209919 00000 n -0000210328 00000 n -0000210424 00000 n -0000210567 00000 n -0000210976 00000 n -0000211072 00000 n -0000211215 00000 n -0000211621 00000 n -0000211717 00000 n -0000211860 00000 n -0000212265 00000 n -0000212361 00000 n -0000212504 00000 n -0000212902 00000 n -0000212998 00000 n -0000213141 00000 n -0000213540 00000 n -0000213636 00000 n -0000213779 00000 n -0000214174 00000 n -0000214270 00000 n -0000214413 00000 n -0000214806 00000 n -0000214902 00000 n -0000215045 00000 n -0000215439 00000 n -0000215535 00000 n -0000215678 00000 n -0000216070 00000 n -0000216166 00000 n -0000216309 00000 n -0000216701 00000 n -0000216797 00000 n -0000216940 00000 n -0000217332 00000 n -0000217428 00000 n -0000217571 00000 n -0000217962 00000 n -0000218058 00000 n -0000218201 00000 n -0000218586 00000 n -0000218682 00000 n -0000218825 00000 n -0000219210 00000 n -0000219306 00000 n -0000219449 00000 n -0000219831 00000 n -0000219927 00000 n -0000220070 00000 n -0000220442 00000 n -0000220538 00000 n -0000220681 00000 n -0000221056 00000 n -0000221152 00000 n -0000221295 00000 n -0000221663 00000 n -0000221759 00000 n -0000221902 00000 n -0000222257 00000 n -0000222353 00000 n -0000222496 00000 n -0000222848 00000 n -0000222944 00000 n -0000223087 00000 n -0000223350 00000 n -0000223446 00000 n -0000223589 00000 n -0000223843 00000 n -0000223939 00000 n -0000224082 00000 n -0000224323 00000 n -0000224419 00000 n -0000224562 00000 n -0000224934 00000 n -0000225030 00000 n -0000225183 00000 n -0000225602 00000 n -0000225698 00000 n -0000225841 00000 n -0000226260 00000 n -0000226356 00000 n -0000226499 00000 n -0000226844 00000 n -0000226940 00000 n -0000227083 00000 n -0000227502 00000 n -0000227598 00000 n -0000227741 00000 n -0000228081 00000 n -0000228177 00000 n -0000228320 00000 n -0000228737 00000 n -0000228833 00000 n -0000228976 00000 n -0000229306 00000 n -0000229402 00000 n -0000229545 00000 n -0000229964 00000 n -0000230060 00000 n -0000230203 00000 n -0000230528 00000 n -0000230624 00000 n -0000230767 00000 n -0000231184 00000 n -0000231280 00000 n -0000231423 00000 n -0000231739 00000 n -0000231835 00000 n -0000231978 00000 n -0000232286 00000 n -0000232382 00000 n -0000232525 00000 n -0000232821 00000 n -0000232917 00000 n -0000233060 00000 n -0000233351 00000 n -0000233447 00000 n -0000233590 00000 n -0000233873 00000 n -0000233969 00000 n -0000234112 00000 n -0000234387 00000 n -0000234483 00000 n -0000234626 00000 n -0000235040 00000 n -0000235136 00000 n -0000235279 00000 n -0000235692 00000 n -0000235788 00000 n -0000235931 00000 n -0000236343 00000 n -0000236439 00000 n -0000236582 00000 n -0000236992 00000 n -0000237088 00000 n -0000237231 00000 n -0000237641 00000 n -0000237737 00000 n -0000237880 00000 n -0000238287 00000 n -0000238383 00000 n -0000238526 00000 n -0000238933 00000 n -0000239029 00000 n -0000239172 00000 n -0000239576 00000 n -0000239672 00000 n -0000239815 00000 n -0000240221 00000 n -0000240317 00000 n -0000240460 00000 n -0000240859 00000 n -0000240955 00000 n -0000241098 00000 n -0000241496 00000 n -0000241592 00000 n -0000241735 00000 n -0000242123 00000 n -0000242219 00000 n -0000242362 00000 n -0000242749 00000 n -0000242845 00000 n -0000242988 00000 n -0000243373 00000 n -0000243469 00000 n -0000243612 00000 n -0000243999 00000 n -0000244095 00000 n -0000244238 00000 n -0000244619 00000 n -0000244715 00000 n -0000244858 00000 n -0000245237 00000 n -0000245333 00000 n -0000245476 00000 n -0000245849 00000 n -0000245945 00000 n -0000246088 00000 n -0000246452 00000 n -0000246548 00000 n -0000246691 00000 n -0000247049 00000 n -0000247145 00000 n -0000247288 00000 n -0000247651 00000 n -0000247747 00000 n -0000247890 00000 n -0000248241 00000 n -0000248337 00000 n -0000248480 00000 n -0000248827 00000 n -0000248923 00000 n -0000249066 00000 n -0000249414 00000 n -0000249510 00000 n -0000249653 00000 n -0000249994 00000 n -0000250090 00000 n -0000250233 00000 n -0000250571 00000 n -0000250667 00000 n -0000250810 00000 n -0000251145 00000 n -0000251241 00000 n -0000251384 00000 n -0000251715 00000 n -0000251811 00000 n -0000251954 00000 n -0000252280 00000 n -0000252376 00000 n -0000252519 00000 n -0000252842 00000 n -0000252938 00000 n -0000253081 00000 n -0000253500 00000 n -0000253596 00000 n -0000253749 00000 n -0000254126 00000 n -0000254222 00000 n -0000254365 00000 n -0000254784 00000 n -0000254880 00000 n -0000255023 00000 n -0000255438 00000 n -0000255534 00000 n -0000255677 00000 n -0000256091 00000 n -0000256187 00000 n -0000256330 00000 n -0000256743 00000 n -0000256839 00000 n -0000256982 00000 n -0000257394 00000 n -0000257490 00000 n -0000257633 00000 n -0000258036 00000 n -0000258132 00000 n -0000258275 00000 n -0000258683 00000 n -0000258779 00000 n -0000258922 00000 n -0000259329 00000 n -0000259425 00000 n -0000259568 00000 n -0000259890 00000 n -0000259986 00000 n -0000260129 00000 n -0000260440 00000 n -0000260536 00000 n -0000260679 00000 n -0000260992 00000 n -0000261088 00000 n -0000261231 00000 n -0000261538 00000 n -0000261634 00000 n -0000261777 00000 n -0000262069 00000 n -0000262165 00000 n -0000262308 00000 n -0000262599 00000 n -0000262695 00000 n -0000262838 00000 n -0000263126 00000 n -0000263222 00000 n -0000263365 00000 n -0000263650 00000 n -0000263746 00000 n -0000263889 00000 n -0000264170 00000 n -0000264266 00000 n -0000264409 00000 n -0000264682 00000 n -0000264778 00000 n -0000264921 00000 n -0000265322 00000 n -0000265418 00000 n -0000265561 00000 n -0000265962 00000 n -0000266058 00000 n -0000266201 00000 n -0000266598 00000 n -0000266694 00000 n -0000266837 00000 n -0000267236 00000 n -0000267332 00000 n -0000267475 00000 n -0000267872 00000 n -0000267968 00000 n -0000268111 00000 n -0000268506 00000 n -0000268602 00000 n -0000268745 00000 n -0000285611 00000 n -0000285724 00000 n -0000013076 00000 n -trailer <<520BF7E020E811DDBB5A001451637DF1>]>> startxref 0 %%EOF 642 0 obj<>stream -xڬMHq֬|Y Fٛn!H:b$ -_TtC"*bZ&]AsD~Inz~(9$~ I,D~L;?Z%`mrIz-#WG%)5+btHhti3.{M*|.a}> p  8\~J 'OX 2#Y_vBttUNw9];%#ZnM jPW5ps8^i[aN8YGW;)N^{;~CCURv{#`_'78;;0Y? ;?^43+ lƥ.p kh׀}4:W9ypsָ 4o69  :r؛>F< \X=Oa)6'=w1ym _qr]H*" 1KGyHp/,08k<{@:fN%rlyl04q݋ Y(׸5xu|{gyA*(Yw%9Yn68^'+ӑbJ'-R endstream endobj 5 0 obj<>/Metadata 2 0 R/Pages 1 0 R/Type/Catalog>> endobj 6 0 obj<>/Shading<>/ColorSpace<>/ProcSet[/PDF/ImageC]/Properties<>>>/ExtGState<>>>/Type/Page>> endobj 7 0 obj[/ICCBased 16 0 R] endobj 8 0 obj<>stream -HlWۮ]I  Vn M ΙdSRޫ})O~_~|׷ӟ>|=W]ەZ߮_[W篟>5\ϟW[;Jߡu|k_O~|/8ϟIzhN\֮Xɮj/Ty*I25Uێon֗SYRcxKoܢԤ|SDanܚo<43lbp7 .4|kl 3<X`S͠QkXPZ -(wⲺ\t#di 9wrCP,SC;klÊ.?=eVP!)WF_Xrrn%%.|c/qJ4OSv* #& Ѯy@2O(sb@aT*,Sb U #h$$59rb1'Iyr[F /,P "A(8UT\|wMh%6toN=![5WcT2H;b1O'eU[0g"-@O&7pd -7ƑM~ mHQe ?#UE x X^;yUlqY?<#ʚ\5SFbq[ -e^ IE -t5s 4&H 6H@4cwhҍ iwɡqt^zM- Ã6a]dc`PR@5ʞ $SZ FR 10BC^,uAd !K땘G|՝c'G"z69$xcDCJ R49x$v|neGe7OXP9aw^)O~ÙJs(ސѭDpb9TvGsY,}!e`k5(\(#udL&?tU-߬ep4-؁B'=+kn1nh[MU٥$!%Т2 bzh=_\1-;vY-sK[jӡZ~T#ؑ+5DQ:Z[I/DŽ=sA }0!t; a%jAPlo A -ZvF"N]ـo=}۩H y/ ?Dx0NN_ ]3W]x]ZwL>_sxlqZϖaWtliPy5"åaθpDGb܏:% VqdA"m/ %ˌ4hF7@K$|(W-,#e12FF01C% =k6ޱq4)p!~CJiB;6~U./Y0v&}_"PcjrCmloi# iW& Q< nషl%՗!k[GWp`95`|p;JFmQR-:"Iܹ^5H;e~ -P.,I,oIF신+\en)P~kculjC&8T/ݯͭ˝zgnr]k<%OacYEVTj=I>~ZtMHfe" &kSLcZ V뜵pO+g1 A9NH°ΖMp|v INgj|ؔd -!!_z/}uR.J)r:>*n0- -gwL}I 'EItE> `[a@ #4>Dt5 VfqU6 ܄/t;2`BAL|{+ښd4Bp}N5wKf7 -暔5>i^rX2 )Ï}ba Y2$ -V[FDd8e6aƮ2u~klZc>z$_q+1뙝Z:ľakH` 2=x_ߙW~x|Tu ~dp *~.N&rЃ8K,r8+}Gmq~1k(~cm FSY"n_qV;7^ݽa5ԴJ6z ގ6$sA =ƽn۷M[=P÷P -;8ƨGfC ^S?Mԥy)b%9G1U& jsRx=!cF2;־pkR񥄕><,Ւg/#KnCjPexl{`TDݣ*2Cr6D"AtTxnBQڈ ^"4P#܊~"z4Bͷ@؋jz#B3m @pDbnAAxУxήys -bc͈NV -3l;J -)VT8t\h/M|Ʀ҃+:5^nbRki79l/ ߮iphAqծ]ԾA]rCY`,ci۝!$ ]E.J@L<qrIݩVEMrC_?_Pm( in]X-Eڑئ6YbJ[ݣѰع`CqMk$`eiah,\YˣFJ%_ Z)Ͳ1ȢOFJXlcBm}jʌcߴ~bAI|Te8`UdjQ"XLoӎ%g"aZ7)s)굯/>8`NOJ)dZ6. *1b-|ll=-o7ƝXKGT` f;t -A7ݐ1@ѩ>3 -xL@$}BD*Ȇ}Sف4*q< 4OM?K "EӬ@g9c"co4) k~hף$q.mX"EdcдQPP\ciCa&+GW)# \l}{ }<XrV8ѩ<ݝVe]=1 - Iͽ= -c Ş#/ЉdJA'zkQv 䶷 %}oDlD,sZC^D$0)>{h@_1!jI@`*&]S>/򥏊Kc$/.䡾@nH(uC<$F[t14ԧߡp#6}(4/3Lu {%&F=œ>d0F1qW5ًh&&*'t*-g1qm_ -ëRqTlDY_)zd^4Lml -6N0<XC1v3LVlr҈-DTTB -(b#$knY;[}ǷR&VSV68%SVFfEE;;1P5-淋XOKS1{ds_P]; WA\gE~:o;U>H庪<{I sϕI/1'A1+$HΦ 3Dzyrg8n[h ->ڪn( 9"CLdN 5Ųݚ! ]QT~ `[!}GV/:7@f>ּNZbTФQ]SU*USoVb˺8zkx+Ƣ\<ێԼ^M1O_q0T)h{ - -Ͽlt(n͏#^ϛ~r Kt*|:P\(dd sI_ ϜipENyhz.FLuKD z⍽1k `>14KtAI (˃R?/0K:]h[Q+Z.~ִ=| -F³W9Z{uD8 -y/ "esza}/2Q\c Rع;0<,S vqk]f^xi#94жIQĝEMZ'̡hupޕBA1)ŠiHe)|̳\-|<2սk]6M*nr?5a4ty4lQ1aϣ[<:Yl#. !0ݐm|BW]_hHцޠhlK^Q!L׬dܚƆH &_Ku=:i5n8!vDEZfX4/;5_8NVx1KJ-;KHyi*tx%M: 0^:m^'Quܴإ? q-h 1Xx/uw͑l蛲UT`VaLdpr׿^ǟ5n{V4OXDgLhLĺ*:A9D䐲 o>45{96j@cbU!vZ.2%AW;35xz.XF) r=x|ݭ!`|oO\x2Yޥw/bYbMVmO&jj~5ܽ1i;d1_t7!/P7C#'. -^m#k9*i/ICRgi$/K'S]M_,E┪&ӿ1*N5fW݃nqw6xoI{jI#CƖOWSƛe-Y0ʃëлeģ"d8<_^6d@ &hڏf#:+W )#).\|R1_A/*[|-)m;-K1~V?qt[%VqM-׿E7G~wU?}߾GݘY^Oi  Tj__/O)eQs- -QjmnP=\8а %߁Tq[0-Kq,QbAoi8&]669{j6؞2EC0,u -Fj"#5D@eLxƅ9ǒEzjhzƎd8 e~MFxJ''. W9{(!8$0V-ބi8Z.\(Y <<^%Zsf6iIR}v#ZZCver".%{v=ZN\p;…6'iO.Ҹ'.zJLsx߬',Mf g&Dr2O7'>!WLއџ>X];ռ)^a\!en G#Y=F -7[9,RB'.q[1nT;DoO+u 22.uEN bvav5hLZh[㎰m$e2K5K[F}|$*NL#bd 8#aځVwnX^\^ޝ9C\Nčgp'O5ju-%ao#X]bp?gv@S <ӹQq>_e)y[jwgyKK5aܞz -O<#EOUTђŻm ܧK |}0~qAvsRy?Ov+D=Jh"aGb/]^+'jz-g6{4jj*L]U?~1D+ᗴVpL{'p0*ʺ'pheʈ wIj>Oh {%qowZΑmZIIZjFKSXBL ÷֬p5~]c˻x9FD U-{zKIoiͻpw'k'םqM'k -Lxo3R%"næ5z?1~uS($bZ!1lX9NNXI.Y%`w0Ϩ^mZcގ~fÓvx$UNp;ZV4Fزk5doKI#pn"=24Z(z؛8Xk>zضlo# IeFBbF0<ɕ7Nq'C(2XKnN5omrun^"g;&v -+i Ӱ.#[\M|^f]OnUUО*\=1}R$R[ݦ6:v\֒x[g?3 |,_fbq ٫k?fIӆ L7|곙=^+wnڨ9lFؚ5A[r^#$`Helu*wNw4ʖZIwz)WOy,~x+&.n<.xkV[uEuU -X/1`Aw%ܡXlmkF ڥq{9\[ -ŠfY:;ꍁBekT65Bѹ ?c\Cep9AK!=:Xt{W`eڦ;zˑ^yr'4ϧ^F;7V=g3_ -*:.Nw2M^ĕ0k[qu&GAS2<vPW4_MVy~˸s[OţlƢz=]Vqz%;Dr=|Tn=s=_C(QFUnW;yJ;Awܢmd j2̉qu،XWYE:jRQ~79] ->j ]pOsWTC.t|mĭw _z>[y՜WK 3pq c"1gɋox?OUrRckVY^pT+(>oh07V!A "jnU\VoT7jfI)񇧂o%/>Ԇnvr]nzwH"x7N1__\RnNxG0o͋Ϗi(šaf,B=I wʖ9y9C`xʏmQeVCoJL9DIN)A1}v NN@ ܭaQ[}C+'h`F&XT6ՐaZ;eX:ZQw 14Wu>v7nͣVr{ًpqcƒlۋ#1ox9|CwS UûAl;bo780DlzfbƒE`EHm~p7cci-2.i'=s8Ol<W mJm8޾ Ypq5mr#To'ipSMbqi}bMK9? ƝB$:>6㌃ -Z.zgҳ1o%5YX}\JX~PZø:Ԟѷl `["Ǹ52ctPxOVl_ffuznYo0xb{ Vk[fѳNDCdIHX楰#gh` qږ=i:in:$ZvvքU69:׸s ¼]}x[XӼ˼Ųmn7mTnYwr5spZ&?gޮE43'.ǎg6܅&1p >ر/ɓuYsoVK;D(Б]=L-m;̘WkJÙx0p~Ku=MW:o\Kҟ[O5 9maR؂2_]n`gX %Jct^Q -ݚӤwq֥y՟'C¼e{x{1X&/y)j=t5`=Nb8A˃kb7y,7Bk-X xKB$5Tl'Mv:/ny 6V^6χwyHküe*xG(awE^tr}^`Zy~QTvo}Z6o%vR36%[mOį7y';+G{:scغl}*.M~&pTmm1Hֽxa/jA;B1,i:€PNG:#ߖsjMHĎP7ßĭ?Opp$&\aG23WcKY~*z0hںXblAkh&bes16zỵ_:ϧ|4/#Ƃ|qU"Nl@g9v0 D˲5," -<]kv}}VևM _"hJUA->T=u빖;\ߜv(e}vAY;Էbrɹ춁 -zwH@dύ 8@aUQ~9"YI!F:v]!'`o;c+)@Ǭ3@:ŵ;j(AIf7w^ԜqcILlߧ.@BQsٯ%L#}nʉpL6~-zE=ǘ3ir1:|؜ /bC -Sp.J>y,svo.fOj'׏ih -ac+Rx?$ZѴK{TWd6ߡXO$] -i@0tHL׃|6 ax|Q|HpMɗ&B#Rx ge=;׉Lw -j]'ܨvpϩnox%c?\l]ao6[lb5o躏KwƉ4b54NMCN>)> m1!ކP]x 3%vqZUmA:dcyNe]YoO \ěF?aleL9d!ߚfގ-­^/`/( OGOPFZ}Ij@=TA6TZfEǔ飓nb5Fh=}hgYHbCfMwm]eF/:NH]ݖ -˲\;7YW/@:smKTG\:EWͤ!jh]95fum<1 u`c_ ^‹A:U ޢ8t-jRh-Kr-kC__c;;+*}JR9 Z&;{o0Y]|:wٌ[/QV2\'6X#KE\vBû5\k~F޶JATYv^Q%BnWMWpyHXNy9454APRLTehm 3+p(5O|L"1ٕG)!WJ\q;A5eq쬿WVL Loj -2cV{`peRaS( KdsPSkmMFvn6GgMgjupp#5͠7/[{|>n^:}]UVK0k]]np$>zN+QR>,>!koÂxfx|:T6|}'{wFɯxGr|[J_(6'LX:48OVD}٘{^lQ - -vO 6;f_kwU^>,ҸxF}!w`k8Up}rS .piF>d0ӊᓄbxrpmY%lӤl]YGUS/NfzŌ/=F+f)$\ -UD Hsݟp#xc@߇.AP|6(|G|1$eΉCYx6 3S<[2IxnK96c~hDLNeu̒QG̶Y0ߛ@۲tD -+4+IDWc=O)f0Y4;g8ZyJGdO5eLd) ∾:t8^fAz=;=8Se/'3hXH#t5)]'ّ0@p?tce9]*+KO p oǴ)[–PVE,.zjF?@CYmHVZ`zj[V+ OYUxns߶^}b, o<_s>~|~zl\mЅتh|BbbE{R-Z*Zinݥ@' ^G6kIՐlqVqm ]4ߵ'œ \g :75HD`+fͧ5G:Ik ¾j?2v׌닋O_lp{{lvR5Oԟ_Qy( ԚLjWX|ә#p lj* 1M6F76FUNjr#aUw/XI` tk /:敺Z]qs]qu`vm+ p ?P ͻ+r[8ĕVk.[LشU5K.Ukׅ.^c EZTbrIZoHkbQwҚg_Z Va-KOZa%-i=Dk˪~EiU\ZgWNF֑-l}3Uq~6Ǝ-/a/9/}V;ָ'5^_K5|h% #`|qkխժ G{ϭ{ҫonkŜ_&f }`_5q$fuj^<雭c|xL<0xʾq >tM jNӅ -ssN^z;clǮBA]j*WK\vFBjS230SSM]ͺxu \Xo`xj\47D5PƏLMYr -[pyµjSI`eXU-?7 Lo[[&b*p5S{ol#m<8c3t`q\ߗW5]_llpPF_xxn)hUE\_}">k0/aK5J3/" )./(ha2*מ7kwP -A7!έ] -]uYd[l]6>+O^Z|ϭ{W 'Z]~~~fV #ϊ -^^W|F4IFZþ 1g6L~4W`fx^s'|Q!^m9f*˾Z'}k*5x`A+ :[#t2L'0GlCBw^t5uu6J誊]lN]K uڳj^n\\XGY??~C\xZXmgiL s['Ξqp -|ĵKq.`'.,-7Y9~k`zct5q펛wpwDZ5w՞8zԌV\_ypvu若oqg/K oiT8ކE0vM -+kSQ5+\s0K - Mfɴpgl5*>a|eZK8ۯV_Z>v+bⱯδ֕Wa{ ` V{#Q o ll3,~ja| -;Xe+G5kf{]#4J/vNnwX*OZ,8zV06sٜ7~U6v s+fkl iq }o_zN8Ev b,=я &Q :}¾o`rOfwl+1.mWoǨaa֝*&a^h8V>cغqVSGG|lz~}홾+U8>)eqs{ ak\Iai|דJ 0Aay ֖`瞟&=G"1RI:+aFo . n>od}бP8lK4V3O <,ʦQ-e}FdQjD1e,MLMת8HdI Q#4Ul} d/P̊X"֧TC&D -|p܈9,ϔxhS6.ZM,@h(~sQ{E ݙ4jllA_!5j*m VXX=SJbL3 Ɩ:qYmy1Kϱ`*+T6ʮSpYJ'sa)0&^隱ßmèv(nQ+[Խ} bяp+f qsU;bC;خM*٣E}TPkOb: K{s 4@n[QfPBAZ*x Nʖ0>FxG-Lw.^Ut푍ep\Ըl~קu<6u SMUp]F5@4JteBTDAU[R=ޞ񔭲W` -\ KO\K!l{*=7(W>bj=&=k a<;0B|9XC^h{"H*rgnCD)UH Rx*^5iU)ϰrPFmwapf4ʲ9"+;VðZחn)+[_ZmsV kI,OcޮvM6]U|uY: xĉv<5L p[]5TBW!#1ݫuzߍpd{MNY`%˰D6mr1s+FV'%FbL\s W;Ws:V-Ur[?ܸo> endstream endobj 9 0 obj<>stream -HlM =x刔HJY@A' CʾjP~O$|jt_Gӆ??~imxg}枃D l5L'\R\1 jđX.0W -0dlaaF)lXu\Y)oaY -busŅ%K$.]tQ -PWp5%U7e( yqXQz͋3O^+ϵ{,¾%/E$]/V.F3[mE3lk}a Dž/k1k{&y5f s @L⥚w=}5Frپ%j2UzY}a}">+qem1fZLAwKc D4ilIhĴ1"p1"VOb\_m~.ߓXͱH!s~B cZCp/+obieL/ư/ʐmfLcT0el0Xi 9ǧ`\/b.&;I2ظ$vnJ9$.ظg(S46XA8kTƤU&f>,NcMkXIa<r1i=1Y[Âv޳Ocі5M~,ߓX~/֬c?n`Crdu3$6{)+a"&s5QB35XvW8 -OcִUT1Ҡ/hLr|"Ƹʒ14UMcbiLcI2lML+K -MbN? ,|1Wx l XItޤebE" BwC',*f9V8Q6cԳpkRAL{&xOa9x]>}aIX~%ſ=0"ӘF*A'Ǚ|h ] ~&ֿ!,Gs -MrƬ 5F Ie$9X"VF@3- l l~eIH`3+/;Y%0-@:<禰lnVX+*u;z&$NbI+Iƪj@L_J`XJf' O`󌓅i^X:7GsN*uO=,,c=+ *_9oxz*bLl+5x A'^|JWH,s8,j+x1kfdV(E^y?{ +Our<PA9+QeV,pUkȶw`KwYeaAg\-wi_ -XoWۂ˕Z?嶎Ct*@zMpPw}KV+%q8FW,4vwΘV WY]WlDžjOW~^rnD7oWl{r%&Q>Ӆ kc|Ȋ_di:b?!ɇCΙBWAZZY86;bO|cqj#3}gg%;bq;`.U~u#qV5'lu3W̵6~}T!:2sWY3{*UEW?3^1sb0>D))v!K?{pl +GSi!:^}&ag / [乞"(T4K kPRjfbZ gFH3CX/c+V2 q+y߼G)C9HZn^Ó. վJ8؇tO]@]\UtX(FI]}p+5 NH]j6G-˽Qэa葉jqʤx|-,yF&3 X!kDM^NwRJd?^Aa[ -ycWP˼F\^TZ{=sCv@Ke\_}q}5