qlandkartegt-1.7.5/CMakeLists.txt.user000600 001750 000144 00000065532 12225261330 020712 0ustar00oeichlerusers000000 000000 ProjectExplorer.Project.ActiveTarget 0 ProjectExplorer.Project.EditorSettings true false true Cpp CppGlobal QmlJS QmlJSGlobal 2 UTF-8 false 4 false true 1 true 0 true 0 8 true 1 true true true false ProjectExplorer.Project.PluginSettings ProjectExplorer.Project.Target.0 Desktop Desktop {ed617c1e-2cb0-4d35-9b80-b40801d9e89b} 0 0 5 /home/oeichler/dateien/cpp/build_QLandkarteGT false -j4 false false true Make CMakeProjectManager.MakeStep 1 Build ProjectExplorer.BuildSteps.Build clean true false true Make CMakeProjectManager.MakeStep 1 Bereinigen ProjectExplorer.BuildSteps.Clean 2 false all CMakeProjectManager.CMakeBuildConfiguration 1 0 Deployment ProjectExplorer.BuildSteps.Deploy 1 Lokales Deployment ProjectExplorer.DefaultDeployConfiguration 1 true false false false false true 0.01 10 true 25 true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 map2gcm false map2gcm CMakeProjectManager.CMakeRunConfiguration.map2gcm 3768 true false false true true false false false false true 0.01 10 true 25 true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 map2rmap false map2rmap CMakeProjectManager.CMakeRunConfiguration.map2rmap 3768 true false false true true false false false false true 0.01 10 true 25 true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 map2rmp false map2rmp CMakeProjectManager.CMakeRunConfiguration.map2rmp 3768 true false false true true false false false false true 0.01 10 true 25 true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 map2jnx false map2jnx CMakeProjectManager.CMakeRunConfiguration.map2jnx 3768 true false false true true false false false false true 0.01 10 true 25 true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 cache2gtiff false cache2gtiff CMakeProjectManager.CMakeRunConfiguration.cache2gtiff 3768 true false false true true false false false false true 0.01 10 true 25 true valgrind 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 2 qlandkartegt -d false qlandkartegt CMakeProjectManager.CMakeRunConfiguration.qlandkartegt 3768 true false false true 6 ProjectExplorer.Project.TargetCount 1 ProjectExplorer.Project.Updater.EnvironmentId {3538f4e4-656b-4105-8481-890e8b511229} ProjectExplorer.Project.Updater.FileVersion 12 qlandkartegt-1.7.5/config.h.cmake000644 001750 000144 00000001547 12225261330 017676 0ustar00oeichlerusers000000 000000 #cmakedefine PACKAGE ${APPLICATION_NAME} #cmakedefine VERSION ${APPLICATION_VERSION} #cmakedefine LOCALEDIR ${LOCALE_INSTALL_DIR} #cmakedefine DATADIR ${SHARE_INSTALL_PREFIX} #cmakedefine LIBDIR ${LIB_INSTALL_DIR} #cmakedefine PLUGINDIR ${PLUGINDIR} #cmakedefine SYSCONFDIR ${SYSCONFDIR} #cmakedefine BINARYDIR ${BINARYDIR} #cmakedefine SOURCEDIR ${SOURCEDIR} /* always quote the config dir, as it *will* contain spaces on Mac OS X */ #cmakedefine CONFIGDIR "${CONFIGDIR}" #cmakedefine SHARED_LIB_EXT ${SHARED_LIB_EXT} #cmakedefine HAVE_STDINT_H 1 #cmakedefine HAVE_INTTYPES_H 1 #cmakedefine HAVE_BYTESWAP_H 1 #cmakedefine HAVE_BIGENDIAN 1 #cmakedefine HAVE_ARC4RANDOM 1 /* build with native file dialogs */ #define FILE_DIALOG_FLAGS ${FILEDIALOGFLAGS} /* TODO add a check */ #define CAN_UNALIGNED 1 /* are we on a 64 bit system? */ #cmakedefine HOST_IS_64_BIT 1 qlandkartegt-1.7.5/calculate_completion.sh000644 001750 000144 00000001321 12225261330 021711 0ustar00oeichlerusers000000 000000 #!/bin/bash # # This script was written to get some data on how far the various translations are # compared to each other # # This script is donated to the public domain # # Klaas van Gend, 2008 printf "\n translation file %%ready (unfinished/(total-obsolete))\n" printf '=============================================================\n' for I in `ls -1 *.ts`; do UNFINISHED=`grep 'type="unfinished"' $I | wc -l`; OBSOLETE=`grep 'obsolete' $I | wc -l`; MSGLINES=`grep '' $I | wc -l`; let "REALLINES=$MSGLINES-$OBSOLETE"; let "PERCENT=(100*$UNFINISHED)/$REALLINES"; let "FINISHED=100-$PERCENT"; printf "% 18s : % 4d%% %d/(%d-%d)\n" $I $FINISHED $UNFINISHED $MSGLINES $OBSOLETE ; done printf "\n" qlandkartegt-1.7.5/cmake_uninstall.cmake.in000644 001750 000144 00000001654 12225261330 021760 0ustar00oeichlerusers000000 000000 IF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") MESSAGE(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"") ENDIF(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt") FILE(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files) STRING(REGEX REPLACE "\n" ";" files "${files}") FOREACH(file ${files}) MESSAGE(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") IF(EXISTS "$ENV{DESTDIR}${file}") EXEC_PROGRAM( "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF(NOT "${rm_retval}" STREQUAL 0) MESSAGE(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") ENDIF(NOT "${rm_retval}" STREQUAL 0) ELSE(EXISTS "$ENV{DESTDIR}${file}") MESSAGE(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") ENDIF(EXISTS "$ENV{DESTDIR}${file}") ENDFOREACH(file) qlandkartegt-1.7.5/bcpp.config000644 001750 000144 00000013062 12225261330 017307 0ustar00oeichlerusers000000 000000 ; This file contains configuration parameters that are used ; within the bcpp program. ; There are two types of parameter types : Boolean, and Integer. ; Boolean types can have only two valid values [On, Yes, or Off, No]. ; Integer types can have a valid range of 0 - 5000. ;------------------------------------------------------------------------ ; This parameter specifies how many lines separate between two ; functions. ;------------------------------------------------------------------------ function_spacing = 2 ; Integer ;------------------------------------------------------------------------ ; Specifies whether to use tabs in indenting code. ;------------------------------------------------------------------------ use_tabs = no ; Boolean ;------------------------------------------------------------------------ ; Specifies how many spaces to indent. This parameter is also used ; for tab indenting, as 1 tab may be worth 8 spaces if so desired. ; This parameter is used to position comments in TAB mode, and expanding ; of tabs within code! ;------------------------------------------------------------------------ indent_spacing = 4 ; Integer ;------------------------------------------------------------------------ ; Specifies whether to indent preprocessor controls to match the code ;------------------------------------------------------------------------ indent_preprocessor = no ; Boolean ;------------------------------------------------------------------------ ; Specifies whether to indent embedded SQL statements ;------------------------------------------------------------------------ indent_exec_sql = yes ; Boolean ;------------------------------------------------------------------------ ; Defines at what start position comments that have code on the ; same line to be placed. ;------------------------------------------------------------------------ comments_with_code = 33 ; Integer ;------------------------------------------------------------------------ ; Defines at what start position comments with no code start. ;------------------------------------------------------------------------ comments_with_nocode = 0 ; Integer ;------------------------------------------------------------------------ ; Set this option to ON turns off setting indentation position of parameter ; "comments_with_nocode". Indentation is then set according to code ; position. ;------------------------------------------------------------------------ leave_comments_nocode = yes ; Boolean ;------------------------------------------------------------------------ ; Use this option is used to change non-ascii (non-printable) chars to ; octal notation if they lie within quotes. Either ; Ascii_Chars_Only, XOR Leave_Graphic_Chars parameters need to be set ; as a True value for this parameter to take effect. ;------------------------------------------------------------------------ NonAscii_Quotes_to_Octal = yes ; Boolean ;------------------------------------------------------------------------ ; Setting this parameter to yes will strip non-printable characters ; from the source files, but leave any character that are IBM ; graphics alone. Any non-printable characters that lie within ; quotes will be transformed into octal/character notation, if ; NonAscii_Quotes_To_Octal parameter is set to True. ;------------------------------------------------------------------------ ; leave_graphic_chars = no ; Boolean ;------------------------------------------------------------------------ ; Setting this parameter to yes will strip any non-printable, ; non-ascii characters from the input file. Any non-printable ; octal/character notation if NonAscii_Quotes_To_Octal is set to ; True. Comment out this parameter if you are using ; Leave_Graphic_Chars parameter, as this parameter will override ; it. ;------------------------------------------------------------------------ ascii_chars_only = yes ; Boolean ;------------------------------------------------------------------------ ; This parameter will place open braces on a new line after it's ; associated code if set on/yes. Else the brace will be place on ; next above line if possible, with it's code. ;------------------------------------------------------------------------ place_brace_on_new_line = yes ; Boolean ;------------------------------------------------------------------------ ; This parameter will stop output from the program corrupting output ; that may exit from the program via the standard output. ; If this parameter is set to off/no then no output is generated from ; the program, unless an error is encountered ;------------------------------------------------------------------------ program_output = yes ; Boolean ;------------------------------------------------------------------------ ; Specifies what the internal memory requirements will be in size of the ; line processing buffer. This essentially is used only for open brace ; relocation in kernighan/ritchie style. ;------------------------------------------------------------------------ Queue_Buffer = 1000 ; Integer ;------------------------------------------------------------------------ ; If this option is set to true then the input file will be backup into a ; another file with a ".bac" extension added to the end of the file ; name. ;------------------------------------------------------------------------ Backup_File = yes ; Boolean qlandkartegt-1.7.5/qlandkartegt.1000644 001750 000144 00000003621 12225261330 017737 0ustar00oeichlerusers000000 000000 .TH QLandkarteGT 1 "Dec 2009" "" "" .SH NAME QLandkarteGT \- GPS mapping (GeoTiff and vector) and GPSr management .SH SYNOPSIS .B qlandkartegt [ .B \-d | .B \-\-debug ] [ .B \-h | .B \-\-help ] .BI \fB\-m \ FD | .BI \-\-monitor= FD ] [ .B \-n | .B \-\-no-splash ] [ .IR files ... ] .SH DESCRIPTION \fIQLandkarteGT\fR is a versatile tool for GPS maps in GeoTiff format as well as Garmin's img vector map format. \fIQLandkarteGT\fR is the successor of \fIQLandkarte\fR. Among various improvements (e.g. 2D/3D map rendering and reduced resource demands) the major difference is its device-independent architecture, which is not limited to Garmin devices anymore. .PP Additionally, \fIQLandkarteGT\fR serves as a frontend to the GDAL tools, to make georeferencing of scanned maps feasible for users. In contrast to similar tools (e.g. QGis) its straightforward interface is especially suited for non-scientific users. .SH OPTIONS \fIQLandkarteGT\fR currently understands the following options. Note that long options must be specified in full (by now). .TP .B \-d .TP .B \-\-debug Enable additional debugging messages to standard output. .TP .B \-h .TP .B \-\-help Print a short option summary, and exit. .TP .BI \-m \ FD .TP .BI \-\-monitor= FD Monitor the file descriptor \fIFD\fR for activity. If any new data arrives on the descriptor, a single byte is read from it, all currently active data are discarded, and the geo data files that have been specified at the end of the command-line when starting \fIQLandkarteGT\fR are read and evaluated again. .TP .B \-n .TP .B \-\-no-splash Do not display the splash screen on startup. .PP All remaining positional arguments are considered names of geo data files to be read and evaluated upon startup. .SH SEE ALSO \fIQLandkarteGT\fR Homepage: \fBhttp://www.qlandkarte.org\fR .SH AUTHOR \fIQLandkarteGT\fR was written and is currently maintained by Oliver Eichler \fB\fR. qlandkartegt-1.7.5/copying000644 001750 000144 00000043131 12225261330 016567 0ustar00oeichlerusers000000 000000 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. qlandkartegt-1.7.5/CPackConfig.cmake000644 001750 000144 00000001754 12225261330 020312 0ustar00oeichlerusers000000 000000 include(InstallRequiredSystemLibraries) # For help take a look at: # http://www.cmake.org/Wiki/CMake:CPackConfiguration ### general settings string(TOLOWER ${APPLICATION_NAME} CPACK_PACKAGE_NAME) set(CPACK_PACKAGE_VENDOR "QLandkarte") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "GPS Map, Route, Waypoint and Tracking Tool") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENSE") ### versions # set(CPACK_PACKAGE_VERSION_MAJOR "0") # set(CPACK_PACKAGE_VERSION_MINOR "9") # set(CPACK_PACKAGE_VERSION_PATCH "3") set(CPACK_PACKAGE_VERSION "${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}") set(CPACK_GENERATOR "TGZ") set(CPACK_PACKAGE_INSTALL_DIRECTORY "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") ### source package settings set(CPACK_SOURCE_GENERATOR "TGZ") set(CPACK_SOURCE_IGNORE_FILES "~$;[.]swp$;/[.]svn/;/[.]git/;.gitignore;/build/;tags;cscope.*") set(CPACK_SOURCE_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") include(CPack)qlandkartegt-1.7.5/MacOSX/map2gcm-libs.sh000755 001750 000144 00000000476 12225261330 021107 0ustar00oeichlerusers000000 000000 #!/bin/sh # $Id:$ if [ -z "$1" ] ; then echo "usage: $0 " exit 1 fi MAP2GCM=$1/Contents/Resources/map2gcm QTLIBS=$(otool -L "$MAP2GCM" | sed -n -e 's/^[[:space:]]*\(Qt[^ ]*\).*$/\1/p') for l in $QTLIBS ; do install_name_tool -change "$l" "@executable_path/../Frameworks/$l" "$MAP2GCM" done qlandkartegt-1.7.5/MacOSX/qlandkartegt-loc.icns000644 001750 000144 00000103457 12225261330 022410 0ustar00oeichlerusers000000 000000 icns/is320q ӯÒ+ ɮF 8c\6+ %5V6`  ৼ q Ծϣ+ \ tcN\ il ý׿ خ زq ұ+ Ѳa ߐӣXEj L] ޷s8mkil32$:3ɂ>ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  Ӏ߁ WWaW WaW WW WjWW܄ Wja؂aWWsa$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű ۀ WWaas WaWW WWWs WzWW WjaWsWWsz$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ   WWW WW WWh WW WjWsWsWjl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it328Iȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡΈjrjۅӏjrrWrWrWWWzWzWjWWWWWWWWjWWzWWW΀WWWӀWWӀWWWWaWWWaWӀWWӀWWWʀWW۟WaWW jWWaWWjW߀ӀWzWʀWarۗWaWŁWΗWsjWsWzȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬ﱶʆjjrňjrrʘWWjۅWׅWjWWrWaWہWzWjWWrWrWzWʁΘWWr߀WWۀWWWrWWa WWrWWaWWrWWWWrWWWWrWWWWrWWWWrWWWWrWWWWrŀWWWzŀWWWzWWWWWaWۀWaWrӅWWW؅WWaWt8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (" exit 1 fi if [ ! -f "$1" ] ; then echo "bad input file: $1" exit 2 fi TMPFILE=$(mktemp /tmp/qlgt.plist.XXXXXXXXXX) || exit 3 ( cat "$1" | \ tr '\n' '#' | \ sed -e 's;\(CFBundleSignature[^<]*\)....\(\);\1QLGT\2;' -e 's;###$;;' | \ tr '#' '\n' read -r -d '' TYPES <<-'EOF' gpx:GPS exchange data qlb:QLandkarte data tcx:TrainingsCenterExchange data gdb:MapSource data kml:Google Earth (Keyhole) data loc:Geocaching.com - EasyGPS data plt:OziExplorer track rte:OziExplorer route wpt:OziExplorer waypoint EOF echo -e '\tCFBundleDocumentTypes\n\t' IFS=' ' for n in $TYPES ; do echo -e '\t\t' EXT=${n%%:*} NAME=${n##*:} echo -e "\t\t\tCFBundleTypeExtensions\n\t\t\t\n\t\t\t\t$EXT\n\t\t\t" echo -e "\t\t\tCFBundleTypeName\n\t\t\t$NAME" echo -e "\t\t\tCFBundleTypeIconFile\n\t\t\tqlandkartegt-${EXT}.icns" echo -e '\t\t' done unset IFS echo -e '\t\n\n' ) > "$TMPFILE" rm -f "$1" cp "$TMPFILE" "$1" rm -f "$TMPFILE" qlandkartegt-1.7.5/MacOSX/qlandkartegt.icns000644 001750 000144 00000141600 12225261330 021625 0ustar00oeichlerusers000000 000000 icnsÀics#H????is32V*sm*mf l_ D᾽@]8=xӭ8.CH?Xrl[aU7LGIfT- -;OD R^e2 :]ulJ#;a[]A *xFdhB?WxqpkBwe[C R} ڈ#>B>J5CU֐& 6 nz]C}lomf˓}zcJ4P|nZ^rUCDPt~kdVdWWj{kgIŽŬf y CyUӸٱ ùRþĸMzr}t^K-RK[ֆL+-B=)I*+J/ "hp̀̄ځՅ䚂 ܹٚs8mkHH!!!!HHEH!!!!HHICN#????????????????il325HUUF4 5vٯp5*{s.EˎG QԂ{U G|ǃΤ_I1nܹv^6eBȳ0f>Uw߼²@S@^0/Z{Ǣie &Z(W\`iqM&m ?e"JZadgmzI/44."  [AJN=[cglp-7EMQ1 -``cghW\> ":cPdUR6 )V]^`ceR  /eV,>RK@  OYXYZZW  gl]fI BS R]YXW PvlGf9 $g2jda_] _2?s2g-#rzvpmjhggj^:l S}Dji~zwuutvxMQhq.?}=Ҏ3Y-QƾMb`MN*ܒѳ* 7`fSKMBLd9 @HLKC7(OetugU3 MϗZ"!Zޒ o[/.006ٴ܃DUZZVL?3,F]2C3&Ɂ*4d,25.013dSS]Ёm-2-',32.kޭo-3323623-oy,3/L N033+Sǁ+3307܃ V.31M-30;t *0D@.V鰁K-F 5({>%r⍂$ IŃU͌위xoƂ̏Αőoں굂 mXVKZ~ۺUl8mk 7xد6``''::::''``76x x76``''::::''``6د6 ich#H????????ih32 )5;;5) 6iǰg8XصYN֬R~鹑~!3݃ƅ9<ـւՆhB4u͆ӰG:ZňΔ2"Vżۻ`:SuN已ĺ+lW%!PȩѰŽ;_d sϨ̽Bga!&2,[׶~$)>r02b`m?>n?ZR]`dguə a; Yp) "+^ZZ^afils][mv{}}{ul\E(3"H2JZ^^bfjnqvX   #/!>ZaadhkowV   - 0I 0>pB_`cehkrQ"#*.  ?hM<Dk Y_^`bdfjkkma ),Hfv>\BDn  H\\^_`ab $bZ`"K~A>s  K[Z[\\]`3 `joY% \91 (RXWXXY\A  Kmr[W+"+`[YXWYD .hqxYY})Ke_][ZZY[J@^uxP#=kpP$gjfdb`_^__'57r|gq'<@yrvqmkigfeddeeiR#6lm87 8)~zwtqpnmop(Uxdvy am~{yxwvwx{\MhN92]Hp̻DZ#S"vN- ~ 10 8Ā6 0Ԁ /OWzN[~R2#"<1' 1BU[\VF9! NչZ- "u޾8 fx)(άD@]K޳g@ȹќ_%⿎Iփւܝ/eсπx%wxpBuaVÿǾýxHJq}v̵݀ \@D?p:L_xxٶj=8<<:Ci~S㰥 g:9:=>;`X:?LB<:UM8f>>FbH>?>>BCCD CJwIyHLPD\JEJJIFF[egnsJ IPKY^UjSKOIcUNO JsupSQUSglRU QokeoJWZW[WZ Xmpkf9^`z]` \ýX(jefcef eeK}jkjhjkjtÚox1mqw}oq ȫmoonМIuwwtvwvͯtwtcz{x|ʭ˶w{w8tɡӿɢ‚= eڐȂz ̚΂+ $ԀD ?܂X H _ AW'@ gu%!w¹́5RҀŲX* 3DV^^XH=;AH4ἃ i.332,-Ughv43 1?6QYHćd-3(\@13 ({~ȃd-30Zχe-3 +m_Qǃi.3+3؆*3 .]_Ti1322w-32)ɶ:23,v/3 /1tP/30+030Kـ:Nm|}*31CUc,334~|+//-旃 o-33+03.Nv-3.XZ-/OW#/'/(xҹ,-ȁ XKۗwg8̨u6ϙB젉tÙ쬖tY~͝Ӝ\6$$==#?9UԧbӼ˹u u|rxssx{h8mk "!!"'\o% oo nn##UUTTTTUU##nn oo'%\o""!!!!""\o'%No nn##UUTTTTUU##nn oo %oo%"!!"it32W  +DZm mXF+ DhhD*VǼY* PƱS ,s ѱu.5~Ȟ5,}ؤ1o ݞxsJ ҏpT ~ vl"C ܑfrL e  keo {߇ߓ t_r "~{܈ܘ^f..w{ی ٚ ԃ]a85sxׂؑ֜kT`zE5rnڊӀӄҜ ME`vD/p^щ؀ځΞ;2\p7 "pV{͉͞ ׽#%Xu. mG`ʊǠ հUx kM>džǀƠ ԓT eiP!ĆġjTsAkY ѿ; YNr^TɅ ū,h$`$݀úz@zKc?Â!7TUkPB"޲Ѹ .f,nZ ߂ԼUIu-+a:C ټĺ !`3(tQ Ȧƭƺ QEv4[,& ~˦˦ӾյL_4GrI tЬǻʪGFu.+Z&M,<ߺ а4!d0,utHHdcaͩȬ}O}w,]%%fI Xdb_wۺT-k+SHJE!Ia`bdbh˧x% ]T*h,HCd^_acdedvո@Bx)(S 5](+^_`acehghȤH m''Z:I[[)1_]_`bdfhjikζ|E^['gIZXYN[\\^_acefhjlkn}Őy:D~T<[WX[ZZ\]^`bcegikmo wē oA#%uD8!9[WWXYZ[\]_`bdegikmoqrrs|ǘ |c> jD1jw!WXWWXXYZ[\^_abdfgikmoprtuuv{yus^A& )Wk k,9`XWXXYZ[]^_abdfgiklnprtuwx -0BSbpw{ ~yvl]L<)BA(e`6+V\\YWWXYYZ\]^_abdfgijlnpqsuvxy}p )*&:5+*+`db$=Q[[YXYZ[\]^`abdegijlmoprsuvw~kW {++Eai? #?T][ZZ[\]_`abdeghjklnoqrsuv}h AG F-eE[~hV !.L[][[\]__abcefgijlmnpqrst{_ ]<;V5-[pyf! !BX_]\]^_`bcdeghiklmnopqry^EJ@J[j =]9tuuM> 3 Y  6_[\]^__`abcdeefghhi oroonqrqpnm* <2  a  <[[ZZ[\\]^^__`_ab`ad1  .cddf`kqv=G' eL  c %T[YZZ[[\]^_`_^cD (aedfimoroG rg f  !TZYYZZ[\\]\]]^^]^^]]`I  '`edfilmox|5 GGq :\XYYZ[\]X  ]fegikmpvPQq M}{  CZWXYYZ[Z^1  Ehegikmpx\(qYM NlkmoqsuyywwB(F W_\[ZZYXXWZD >llmoqtvyx|\Y(^  .c_^]\[[ZZYYXWZF 'Unmnprtwy_3%\w Kfa`_^]\\[[ZZYX\G#&Sk\koqsuwz|vK_cJd ^gcba`__^]\\[ZYZ]I!>oe1Isrtvxz}} 'n|WId?50lgfedcba`__^^]]\[\]['"7pJ,stuwy{~{  |ŷ?\ Oojihfeddcbaa`__^]^^bNc4 jwvxz|~~ø+nomljihgfeedcbba`_`ad1GOZ{wy{}2U31nsYJmuqpomlkjihggfeeddccbcgW_!I}y{} c˾T!f*|zvusrqonmlkjjihhggffedefgk5DG 9{||~κ!!s}{yxwutsqponmmlkkjjiihghijm[#N3x~ 1ȸNSZ}{zywvutsrqoonnmlkjkllmnq6EaKzllԂՖǸp#-k/$,+'<JScvY*DgiD +DWm nYE+  ""##$$!  &E`zɀ{gJ0 !0_݃ϱg= "!  ?sԱ}K#!#! )lٵx<"$"  ?қQ!"%"  KܪZ"$&" >߭W&& %ϽޚB#'#  aȹz)'' 'ݼH'(" Wɴr##)% ط1")'  ſựC *( / U *) =˽ a!)* Fǻ 㰪m ** Eĺ ܛn"+*=ú ڎa",) -» ~W",( ù ޡ q~F%-#  Ǹ߁ ޠ g4(- ̷~ ܢ a)+, SԸt ڡ ތ_y#-( #޺uم ٢ r`P&. t؄Ԣ ܮ]d0,- _ʹ]قԐҌ փVr$.' ܸ_рϐҍ ռbWI(/°u^̈̍ ԑS`(.+8ӴNׁȅˏ ]Px`'/弨`O\Àˏ ˋRRU.-,CβKOLWρ ώɅLPQKoa&0伟SHRTIRƀILNMLM..+%7ϲvAYzECѽ ʿŷnDJKJJKDn^'0#潞KHe>j¸ƾ¡YAGHGFK)/' ճr8q>PзG@E>wG*0gĠHCYe࿱\;@B>O'0߹y2e;Bϲm@9>? >:ݺ2.*3ϪM3o36q ߼ rD5:<5aV)0!pʼn58o8zέ nB26985A(1߸`-5ߨh7/25/ݹ3/($ե>/0 ଡ gD8:1ݹ2/& Դ|9p#²P1669;=<;::9::;<=>:SV9><<>DA=> 9QZ*0 +Vű>>=9=JhìL:@?;??@@=BEAs'2pI?B"A?CS|=B@>ABB;k'1俴_=D C@>Hg¤N?DCCDCRq>DC>DWCDD=r-1@FGFEAE^PBGFFEBEGB]aK]ZJVDEAb\BF>ߪ10!޲SEI HDDY O>BAABFKcRGIGHKIFDBPMFCzƁAEA~ܷ50$ ݟKJKJGET xxw^GKJKHN]BHDŐHLs8/' ڠMLMLEqGMKH|Boqqep:/' ۢPNOJLNOMLoCħLԇq:/' ۣRPQ O]ROQPK~nAyçYFҤx:/' ۤSQRSOQu]PRM{sf]PIOи:/' ۥVTUTP\QUO{NLoOSн:/' ܧYWX UTtUWXWRugTRcSWп:/'ߨZYZYSpYUvTXbbT7/&_Z[TlY[!\XgmWTPW޷50#c[]\ZX][Wt 11 h\_[aZ_!\nif,1ms^bab`b!]i'2Rс`deacdcaɀ p'22ُ`femgef#cejŽW+0bheigh%ef{§ol`wh>-*崒jhkij#h{khqlaη1/#|rjlkrmkl$kǼskkgkljzs)0N׆jnkknjp Ǻtmn olilhfm'1 jp ooppmpopowjwɼvop ntH,. trspxzqnpsomrʽxrso0/$ iՉqu rvtut|~o̿ztuo'1 *rwtĀswso |vw vvP*/ wyx}{xyxxxyv0/&aܟv{xx{wȓƁz{uz&0Ȁ|}z|}{Ā|Ȃ|} |~E+/ݢz~ }~}||Ϸÿ{ ~z(/$4˄~/ӨxͽV(0ߪ/Ɏ|~+.("AԎ€Â%љМ_&0ỄĀÀŒ€ѐ-.)!6ƀŁċÀĀ*ןW'/$ҏǁƊŁƀ*'.(!缊ʀɁȈǁȀ*B(/!_檌̀˂ʄɃʀ)v$."ޜπ΀͍̀*.,, &ҖрЀϊ΁*H&. XȓӀ҂фЂр)p#-%րՀԊӁ)',+ ؀ׂքՂր'1)- ۀځى؀ـ%A%-2݀܀ڈۀ܀$O#,%D߁އ݀ހ$^!,'E^!+) F#^ +) F"] **7#O *( ">!*'  ߓ.")%  \ m"$)! . C'(   g Ӭ u' '& )ٺ ؗ>$' ) Aͺܼ ݩQ &%  KƼŽاZ"$&   ?ſ͘N "% )lÿְu8"$  ?vŁӱ|K"!# 0_߁вf;!"!    &E`wzeK0 #  ""##$$!     p_ }ar²i{0 Ͳ~J  ˫~? ܵt亝c݈湛0ܭ^ ˡuރ豚4ǜKЂܤXނߒ믛c܈ܖd، ؚaׁ֑֜ҹś]ӉҀԅҝ׻tɀŜQѬщلΞظD@Ɉ͉ކ͞ ׸ skʉ߆Ơ խTGdžǀƠ ԒUkЀ2Ćـġ iWޠE$~ӿ :e˝ =L Ƭpnƻ }꣡Błż =Aϝ E贵뾷 [ր \붶ɵ _ PĵɴưǶlb3 լִ˿ `袢 ˞ڭӄ଺ѿǰ\ ba( %(ⷮΰ𶭌Z裢>և˫́ïIkR'_ h巧 뿲4&ᠣ ;Ъj$"/ 2'TjК꺥D"%>Ϟfr#-șժ])"' &L A f4#)+* + l8&--ڪ f8'+.-);Ҟb {"1߀ k0*-0& E-. gCC303(w ,1,dH2-/,]u+3.IƞE ~%+b}fO;0-/23*d*314ڠb %) {,KXft}obSE51..13-R:/3&줣| / T$-.0239AHJR OHF>731/-.023((3/13 (yO*K T)332210//./0123+Y`*3104?923 ,Q  01.(.G~H)3 *2133.7=,Ǝ+3 05Ȟ>ȀB.32.(/VD*3 )kt(3,5S*31-233(wӟPd(32,';wE*31041N)32)3T3 (}ݡ`'230(0^D+320+03*_h;^X9P-1*dY,2%椣mG-31**U? '%$&-8cE030283-+&B;.*&-'즣u4032,(HÒ ͙X,3 123/:X"/' .5v󨣁603${(30*u ts\m603*,23 0,u /m603/Oǜ8131'oA u603-0~H.32(w[G/".6031'C*32%%#c(/603-*w-23&wR+'I*16031$i213)u'/EE(};03!\,3,PV*$*즣r@/3.*Ș&3-'c涝䣣j~F.31'6&3,VIAܡ[zW,314ٚ-23'C܌ҟKup*3(.23/+ąƟ5e'3.E4032)1 9G'3(}503+.cΆ A:"lR3313+4031,b 5.B7!뤣t{@.3.D4032.xA00'02.P@wןYpf*3)uh)3)7h @033134/(.'#Þ7W&30/22)313.H}!D@03 2/: 513+AF-$c~'3("1lj@03,W꣣z x^+3)i쿡8/3/FL"@03&ϞT c'3*X~'3'{@03 11#@.3/=ܨ803.K0l@03,Q꣢w&3(z(3&ǚp̀@03&˝TY903+b-23+>1>03 05'321ȫ:*--)'J͊!ƀG()*03(kܟvj703)tYEPUjĀ㼉bB23/4: '313ҭMK")'㡢 oE-33*je.ΆbVK /)23,GJ䡢 md(3*m`K (;.0:ܞ e(2)? |p&15ʝx PI+)l碡# o5-.Y#*([ƝJӀ%)ڟ# fꤠLu󬞢k# >I*N1ZAX󵛠BI講2Bӿ٣)3}Ŝo^定l [kȠM7|֊{=,Ess܂ݞޓ۫%)aq1*21.BB'(&*--Eқ=(!o䶛Y6tޖQ-',./322113+/322=DH[l βI Er ©t<'X{³S/TuwQ' ;Xo pU5 6IXbkvxwwxxyvkbXG3t8mk@qlandkartegt-1.7.5/MacOSX/mklocversion.sh000755 001750 000144 00000002304 12225261330 021335 0ustar00oeichlerusers000000 000000 #!/bin/sh # # Creates the .lproj/locversion.plist files needed by Mac OS X as to translate # the standard mac menu items. See # # for details. # # Written by (c) Albrecht Dre\3 2010; released under the # terms of the GPL v. 2 as usual. if test -z "$2" ; then echo "usage: $0 [ ...]" exit 1 fi BUNDLE=$1 shift for n in "$@" ; do loc=$(echo "$n" | sed -e 's/^.*qlandkartegt_\(..\).*$/\1/') echo "Mac locale $loc..." rm -rf "$BUNDLE/Contents/Resources/$loc.lproj" mkdir -p "$BUNDLE/Contents/Resources/$loc.lproj" cat > "$BUNDLE/Contents/Resources/$loc.lproj/locversion.plist" < LprojCompatibleVersion 123 LprojLocale $loc LprojRevisionLevel 1 LprojVersion 123 EOF done qlandkartegt-1.7.5/MacOSX/qlandkartegt-kml.icns000644 001750 000144 00000103702 12225261330 022407 0ustar00oeichlerusers000000 000000 icnsis32"q ӯÒ+ ɮF 8c\6+ %5V6`  ӏ̖ اq Ծϣ+ \ tcN\ il ý׿ q ұ+ Ѳa ߐӣXEj L] z ̉s8mkil32}$:3ɂ>ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  WsƢWWW sWWa WWsa sWasؖa ja؜Wja$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű ϏWaWWϜ ӖsWWӢ WWzϢ ӢWjWϢ ӜjjϧWj$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ  aWWWσ jWWWjӃ WszzzjӃ jWzjӃ Wzszaal8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it329ȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡ۱ ۱ۜWW΀WWW߁WWW WWWWWrWWWWWWWzWa WaWWWWWWWWWWWWWۈWWׁWjWWWWWaWWWWWWaWWWWWWWzWWzWWWWWWWWWWWWWWrWʱWWWWWWۧWWWW WWWWWWzWWWW WWWWWWWWWʀW WWWWWWWaWWWWWWΖWWӀƀWWWWWWӖȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬ʶ 㱱ﱶʂ 㱶ʶjWWW΁WWjWWΜ zWWWWӁWӀWzWWӜzWWWWӁW WaWWzWWӜzWWWWӂWWzWWӜzWWaWWӂWWzWWӜzWWaWWӂWaWWWjrWWzWWӜzWWWW WWWzWWӜzWWzWŁWWWWWWzWWzWWӜzWWzW߀WW΁W zzWWzWWӜzWWWWWW zWWzWWלzWWۀWrWWW zWWzWW߁ۗzWWWWWWWrWWzWWWWWWWWWt8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  WWÉWWW saW WWzWs sWW jsWja؁$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű WzWWzW ӢWaW WWaWs܂ ӢjaW ӖaaWja$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ  saWW aW WWWW ӉW WWWjl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it327ȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡ۱߀߱۱WWaWaWaWWaWjaazWjaz WWjWWrWWӂWW WWWWrWWӂWW WWWWrWWӂWWWW׈WrWWӂWzW߄rWWӂWWWaaWWrWWӂWWۚWWWrWWӂWWWWWrWWӂWW WWrWWarWWӂWWWWWrWWӂWΘWW؀W܁zWW܂Wؘȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬ʁʇʃәjWjWjWzWWaWaajaWjaWzWjaaWzWWӀWӂWzWWӞ zWWrWWӂWzWWӞ zWWjWWۂWzWWמzWWrWWjWzWWazzWrWzWzWWjWWzWWzWW΀W߃WzWWמ zWWWWaWzWWמzWWWWzWW߀ߙzWWWŁWzWWWzWWWt8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  jjzWzWW菷 WjWW jWWW WWWW WsWaƏz$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű WWjjWW WjW ʧWWW sWaz zWjsWʁ$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ  WasWzW aƀj䜜WW܂ WsWaW jjsa WjWjjWl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it328ȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡ zjrz۱ ߱ӘWWj׀WWWʘW jWWWaaWWWWWWWjWWWWWW߆ WWWWjWWWWW WWWWaWrjWWWWWӁWWWׁWraWjWWWWWj΁WWWz WWWWWךWʀ WWWWӅWWjWWaaW WWWWӄWWۀWWWWӃWWrWWWWӃWWWȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬 rjrzʁʶ뱱WjWWۀWWW aWzWWaaW aWWrWW׀Wr zWWӀW΀WaWrWzWWWWWWjWWjWW zWWzWWWW߇zWW珀W߀WaWzWWrW߁WWzWzӂWśjWW WWzWW׃WW WWzWWaWr߀WW WWzWWWWWיΆWzWWWWjWWaWWWsWs܀Wt8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  jjzWWWW؁ W aWWa؁ jaaWjW WWaWW WsWWjWWaWρ$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű WWWWW  WaW ʢWWW sWWaWρ zWjsWaaWaa$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ  WazzWϢWsz aƀjz WjaaW jjW WjWzaWWWl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it328ȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡ ׏jjr۱rWWWWjWWWjWjWWWjWWW׀WߗWWWrWWWWWWWW΀WӀWWW WWjjWWrWWaWWWӀWjWWWWWWjWWہrWWWW WWWWWjrWWWW WWWWjʀW arWWWۧWWW۶WWWaWחzWjWsWȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬 ňjrrﱂʂׅWjΆWjWטہWzWjӀWaaWzWWaWrzWŁ WWrʁW zWWWWaۀWWWrӀW zWWWWjWWWrWWrzWWWWWWWWr WWrzWWzWWWWWrWWrzWřWW WWjWWr WWrzWWʶWŀW WWrWWrWWzWWaWWΗW WWrWWzʀW zWWzWWWWWrWWaӏWzzWWסWŗWrӆWzWaW؄WςWat8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  ssWWWW؁ WjWa؁ asjWjW WjW WjWzaaWaWρW$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű WzjWWW WWaW jWWW zWWaWρ zaWjWjWWaa܂s$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ  WWWWsz jWjz WWjaW sWjW WsWWjaWWjl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it328ȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡrjjzכWӀWWaWWWWaWWWjW WWjWWW΀WW WWjWWWWjWWW WWrzWWjWWWWWWzWWW׃WWWWۚjWWWWWWWaסWWWjWWWWWr׀WʀW߁ʀWWWWrWΘjWWW߀WWaΈWaWzWaWzWWsWj؂WasWʲȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬rrjʂﱶʃﱁWjWWj΄WWrWWWrӀWaWיۀWŀWWWr WWjWWWWaWWWr WWWWjWWWWWrWWWWzWWWWrWWazWWaӚWzWWWWrӃWzWzWWWWrWWӈWәjWWWWWr WWWWjWWaWWWzWWۀWWjWWWa WWrWWaӆWӅWӅWW؅W؃WsʚjWjzWƮt8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  WsWW jWӀWj jWW jWW jWjWjs$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű WWzWƁ WWW WWWʂ WWsW WWsWj$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ   zWazWW jjjW jW jWjz jWszWӁl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it327ȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡ zjrzӁױWWrWWWajaajWaWWjWWWWWWjWWWWWWjW߆WzWWWWjWWWӚWWjjWWrWWWjWW׉΀WWWjjWWrWWWjWWzWzWWjWņWW΀WWWjaW㧈aWWzWWWjWaWWWWWzWaWWWȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬 rjrzﱶŶΉWWWWWWaajWjaWWWWrWaWW׀Wz rWWjWWәWWWWaۀWaWWWjWWWWWWWWWWWכWWWۈWjWWjWWWWWWWWʡWWWW ׏WWWzWWΆWzWWŀWWWWjWWʁWWat8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{  WWWW saWW WasWW jWW sWjaW$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű WWWzW ӢWWa WWWW ӖWW ӜWjaa$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ  sazaa a aW  Wjl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it327Tȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡ۱߀۱ۂ߱WjWWWaWWaaWWWWaWjaazWWjWWWWrWWӝWWWWjWWrWWӝWWWWWWrWWӝWWWWWrWWӝWrWWrWWӝWjWWrWWӝWWWWrWWӝWWӄWWrWWӝWWӄWWrWWӝWWӄW΁rWWӝWWӄWӁzWWܝȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬ʁʶʇיjWjWW΂jWzWWaaWzWWӂaajaWjaWzWWӀWzWWӆWzWWWWzWWӆWzWWzWWzWWӆWzWW珀WzWWӆWzWzWWӆWzWzӀzWWӆWzWWzWWӆWzWWzWW׆WzWWzWW߁ہWzWWzWWWWWWt8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 (ß9¼9Ͷ? ѭĴ@ ۟ȝs?{˼nHnx?vʱXNlT? X/ȶFUB@YmhoojY>=54S`a* 8%"P\[V+ @Cb/ CSSW= S_`B @aZWXKE|O#th(luokjmBQ}rBv_dzɶؕ ꙿ˚ us{   W輫WWWs sWʏsaj؂ WzWasjς sWWjjς Wsjӂ$:3ɂ>ß9¼9Ͷ? ѲĴ@ ۧԲ?ՌˎYox?܉}cl柉s ytȭlM}txcD-+npT{dKH@;9GSTodFFjrGLIZsWY\XY_gmihx㊇е ٬ ̲ Ű  WWzWWW WjӢWW jWWW WWӖW jWӜW$:3ɂ>ß9¼9Ͷ? ȴ@ Ѽ?ƪurx?߽̱}lʗDZv zˢV2ӡĀ }tbD% ЇWqC=1,+CXX}\$&lـ'/*Pd**5€ *,<ѱ|%< 20EC հ\ڕц  ӟ    WjsaszW jzjܖaj sƧaWj WWʀj Wjπjl8mk(_ccccccccccco`oItXtYtXtWtXtUt$titotmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmtmoj3yy4it328ȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]߽j7$jĹZ5tV0 !7GV`aa`VH8" Nrǽ'7ӆL $IppJ$ J¸;tJͼ~Miǿ'gbӳ_Y <Daܶ\;0 6֡t7 uˀ E fـ€lc=ɁEҁׄр͑_ ?݁ B+~х̅͟Xy/?ـǣB,ṽƀƇǀ ɒFs4@܁ ˣF,bƄ ƃ1m1E ϣDLÀ jr!C߆ӣ@zжLz٣hAN翳"!oܣ@;U)®>?@ ksu㸫Mgk*e2/լ$h͇t] ༞ڽkYt+h( ̧Ŀ ^&jڈX:( XӷF^NR%FC]\Ǥx&2QNj 0V[]\kʲ}>yx(<JEI[[_absÿu? U(yZQCWTVWY]`cderõyU13QN4zrHTSUVX[^acfhin|z xfK,  yň cYWTTUWY[^`dgimnnsq%!6DRZae_XPB2 * r Ĉ%fI 9LWXVXY[]`cfhkmot\(" \$ˈ n>b' "@TZYZ\^abegjlnu\  @ %6"4=n"3O@7S\[\^`bcegikrT -" (K\ /0N39_1QZ[]_abceghnQ % O]z+2]99j 6\XZ[]^`abcdhb[\abj)+O1]uw3M2g99k #TYXYZ[]^``abccdccf= 6Q SlgvA"}Gh99l CYXXYZ[\]^^_aM  2bW??@AABCoĹZ5wY96OcuwfS=&Y{ǽ' ԈN3c׀(ıl?'W¸;u%cʿk4*tǿ j+|´~:)h <DyϺ|/K0GìV%ˀ E Ӳ.QʁE&ʺށ݀ـ @R݁ B7÷݅څQRڀǣB8ڃׇֹׁVU݁ ˣF7ׄہԈՀԀ ԮU[ ϣD$Յ ӎ ՟zG[ӣ’ӁϋЂҌw8٣̕΀̍̀r{ŕ5ܣ@H͢yLJDžͯ]gX krĂІʇ^= z̄pĿہÿʾʆºYwɏ:҇*t&ũWUιѻ½ƺORI+wITNܽƶ JHDrǑ6߈JoMހ˳ƶ tACDBJFNcoS[ٺY:?@:xzeDwR]ȩh=7:7N0x/˂5Q״e<04545QZbT-̎ t\J(/1+n{f47:ǔ nS<.-L=13.Qġ.͈H]WK_lu|{ti[NA723676>j876675@:ˈ,DZB`D1669;<:9679:;6kc6;86CB:;;:8OΈnKήg99:HfG:>=>ABB@=@YI>@?>AB>tgGmW;IoJ9lzQ9sUCFCBSzQKLOTfREFGMG@XFWj@p҈W9PHIGA mEIHHqSvspГV9TJLIl ILILbϓV9WNP NaROPOM{}_WgДV9\RTRS{bRTQy`WRzįԓV:taVXWQuUXUr[[v։W4_iY[XcX[]ySoIv\_]|]_[ne*ш^canbcb`mūN҈bgcegeljlkǾ:ψ5hjkijirfhior.҈\awkm kmizjmk}ƒjmmljjyhz-ӕmq nupq p~zćnqnOtuvsrvvutɋsvq0Maݍvyyxzſ|xxvų͍txyyxyi)ʻz||z|~ʧϥ}|xD~Ȗ6w%ɅηJ|嫂€Ƕ;ۋpޛāÁ<BJБɆe\Ď͆6ō꾲ф9G(ՁԀGaI<ڄVaE;߀ހ݀S\F>U[I+F^I 4_Oa-I°Ӌ6]Ö r.ĸþùόB0 ~'kÿزr9/ۙT7muC*aX:UmpZB)auDEFHyҡ۱aWWWWW硄WjWΖWWۀW WaWWaaWjaajWaWזWWWWWWjWWWWjWWaWWWWWWWjWWjjWWWaWWWWWWWWjWWWWaWWWjWWWWWjWWWWW׈WWrWWjWWrWWWaWWjWWjjWWWWWWjWjWrWWӇWWj΀WrWWWӇWWjWʀWۀWWӇWWjsWWWWWӇWWzȼ M¾aſNOP»ǾOüʾNƾʾUǾʾUɿʾUʽUùʽUŻʽWȼʽXɿʽWʽX ¶ʽV ķʽ\ ĸʽ] źʽY ƺʽY ǻʽ^ Ǽʽ[Ⱦzyʽ^ ʿ~xspooqtuz~ʾ\~ywv y{~]ֲ(ĹZ5䷬ĺǽ'$̽¸ܺ$Ӹǿ볏ڻ <Ҥ׷0迊ͦˀ 飗ڀۻρ뢜Ђр̟݁ ꠥ̄̅ګ߀ǣ꟥ƃ Ƈǀ óⰦ ˣ꣥·π沬 ϣ颜艹 gh欬ӣ~ѶGbިƆ٣ԍX sў؆ܣ Eǰ  ]rȭN+稾 6౪ͽyϣ/܏ƥͧվv"3߱Ⱥä m |џ/z3ڍɥȪ X-̉JZⷝ?!"Dz=VhΣY(!%L,[Њ춚^2%)*)*ĉm+̍ߙ rdT%-/&ʵ:=ԍᒗ lQ:,)[C,0)`؟ۓOq[BZgpx}|wodWG:0,,.0-=0/0-.0,?ޞ>rߌB%,,/010.,./0)z(0,(A=.00/- z((+Bz>+101-F>*T|r*.)/( +011-(/]=).--,)/1)y9X$>}?#uȫO*10*)LH;>CKnH.103?1&S1Qo(vѭ@-1,!v(10-0FŅzs׭B-1*u(1/*1XݑحB-1,V5/10)ۚO?ZٮB-1*1P,10* I6.vخF-1/!w)1)o뷛78hүO,1)EΌ(1/6Ҁ|ɭ_*1-ݍ+1%Xˆx'1,N.01.'KՁޕ'1'-01,B̂ <=>s./100/ď8.1-IČ f(+.=iB٠F,1,1#U'1,^k d*11/(+ͷ{(1(kǤБ?-1,T|Jd*1,Lȉ-01+S)110.z]Ёd*1( ^*11/2Ŗ:-/'Mʗ_&/10/˷ڢ+11)wU,6WȄ ~H40(cъe*09Әg2=դ3(pTȋ"VڪԨT"ƌ3@Ĵޓ#إȝxю贶׭˓T ߯wU$nef{ގժ#׎R) $&'(EL@(,SM0sճƜ̖fG4.&#%((#%,.Bi˰ΰöӳĴô忬ʀ׀뱻ʁWWWzWWjWΉWrWWW WzWWaaWWaajWjaWWW aWzWWӀW΁WWWWWWWzWWWWWWWWj߁WWrzWWzWWʁWWrWWWaWWjWzWW珀W߁WWWWΕWWWaWzWWWWWrWߧWWWWzWzӃWWW΁WzzWWWWrWzWzWWWWWjWۀzWWWW΀WWzWWWWWWWWWWWt8mk@#056777777777777777777777777777777777777777777777777640'  !ӆ> /= 9_Bq#Ja&M`(O_(O`(O^(O_(O`(O_(O`(O`(O`(N_(N`(N_(Ma(M`(M_(M^(L^(L^(L\(L\(L[(LZ(KZ(KA(K+(J! (JC(J#(I1(I< (IC(IH"(IK$(IM&(IM&(HM'(HM'(HM'(HM'(GM'(GM((GM((GM((GL((GL((GL((GL((GL((GL((GL((FL((FL((FL((FK((FK((FK((FK((FJ((FJ((FJ((FJ((FJ((FJ((FI((FI((FI((FI((FI((FI((FI((EI((EI((EI((EH((EH((EH((EH((EH((EH((EH((EG((EG((DG((DG((DG((DG((DG((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((DF((CF((CF((CF((CF((CF((CE((CE((CE((CE((CE((CE((CE(&AC&#<=#3Mapz{qbN4 ( CFBundleDevelopmentRegion English CFBundleExecutable ${MACOSX_BUNDLE_EXECUTABLE_NAME} CFBundleGetInfoString ${MACOSX_BUNDLE_INFO_STRING} CFBundleIconFile ${MACOSX_BUNDLE_ICON_FILE} CFBundleIdentifier ${MACOSX_BUNDLE_GUI_IDENTIFIER} CFBundleInfoDictionaryVersion 6.0 CFBundleLongVersionString ${MACOSX_BUNDLE_LONG_VERSION_STRING} CFBundleName ${MACOSX_BUNDLE_BUNDLE_NAME} CFBundlePackageType APPL CFBundleShortVersionString ${MACOSX_BUNDLE_SHORT_VERSION_STRING} CFBundleSignature QLGT CFBundleVersion ${MACOSX_BUNDLE_BUNDLE_VERSION} CSResourcesFileMapped LSRequiresCarbon NSHumanReadableCopyright ${MACOSX_BUNDLE_COPYRIGHT} CFBundleDocumentTypes CFBundleTypeExtensions gpx CFBundleTypeName GPS exchange data CFBundleTypeIconFile qlandkartegt-gpx.icns CFBundleTypeRole Viewer CFBundleTypeExtensions qlb CFBundleTypeName QLandkarte data CFBundleTypeIconFile qlandkartegt-qlb.icns CFBundleTypeRole Viewer CFBundleTypeExtensions tcx CFBundleTypeName TrainingsCenterExchange data CFBundleTypeIconFile qlandkartegt-tcx.icns CFBundleTypeRole Viewer CFBundleTypeExtensions gdb CFBundleTypeName MapSource data CFBundleTypeIconFile qlandkartegt-gdb.icns CFBundleTypeRole Viewer CFBundleTypeExtensions kml CFBundleTypeName Google Earth (Keyhole) data CFBundleTypeIconFile qlandkartegt-kml.icns CFBundleTypeRole Viewer CFBundleTypeExtensions loc CFBundleTypeName Geocaching.com - EasyGPS data CFBundleTypeIconFile qlandkartegt-loc.icns CFBundleTypeRole Viewer CFBundleTypeExtensions plt CFBundleTypeName OziExplorer track CFBundleTypeIconFile qlandkartegt-plt.icns CFBundleTypeRole Viewer CFBundleTypeExtensions rte CFBundleTypeName OziExplorer route CFBundleTypeIconFile qlandkartegt-rte.icns CFBundleTypeRole Viewer CFBundleTypeExtensions wpt CFBundleTypeName OziExplorer waypoint CFBundleTypeIconFile qlandkartegt-wpt.icns CFBundleTypeRole Viewer qlandkartegt-1.7.5/CMakeLists.txt000644 001750 000144 00000006740 12225261330 017741 0ustar00oeichlerusers000000 000000 project(QLandkarteGT) # Required cmake version cmake_minimum_required(VERSION 2.6.0) set(APPLICATION_NAME ${PROJECT_NAME}) set(APPLICATION_VERSION_MAJOR "1") set(APPLICATION_VERSION_MINOR "7") set(APPLICATION_VERSION_PATCH "5") add_definitions(-DVER_MAJOR=${APPLICATION_VERSION_MAJOR} -DVER_MINOR=${APPLICATION_VERSION_MINOR} -DVER_STEP=${APPLICATION_VERSION_PATCH}) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin) if (APPLE) set(PROGNAME "QLandkarte GT") set(CONFIGDIR "Library/Application Support/${PROGNAME}/") set(MAC_BUNDLE_PATH ${EXECUTABLE_OUTPUT_PATH}/${PROGNAME}.app) set(MAC_ICON_FILE qlandkartegt.icns) set(MACOSX_BUNDLE_SHORT_VERSION_STRING ${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}.${APPLICATION_VERSION_PATCH}) set(MACOSX_BUNDLE_ICON_FILE ${MAC_ICON_FILE}) set(MACOSX_BUNDLE_BUNDLE_NAME ${PROGNAME}) set(MACOSX_BUNDLE_BUNDLE_VERSION ${APPLICATION_VERSION_MAJOR}.${APPLICATION_VERSION_MINOR}) set(MACOSX_BUNDLE_GUI_IDENTIFIER org.qlandkarte.QLandkarteGT) else(APPLE) set(PROGNAME qlandkartegt) set(CONFIGDIR ".config/QLandkarteGT/") endif(APPLE) if(MSVC) # Add link-time code generation to improve performance set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /GL") set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS_RELEASE} /LTCG") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /LTCG") endif(MSVC) # where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules ) # add definitions include(DefineCMakeDefaults) include(DefineCompilerFlags) include(DefineInstallationPaths) include(CPackConfig.cmake) # config.h generation if (NOT WIN32) SET (NATIVE_FILE_DIALOG ON CACHE BOOL "Use OS native file dialog") else (NOT WIN32) SET (NATIVE_FILE_DIALOG OFF CACHE BOOL "Use OS native file dialog") endif (NOT WIN32) if(NATIVE_FILE_DIALOG) set(FILEDIALOGFLAGS "0") else(NATIVE_FILE_DIALOG) set(FILEDIALOGFLAGS "QFileDialog::DontUseNativeDialog") endif(NATIVE_FILE_DIALOG) include(ConfigureChecks.cmake) configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h) option(WITH_PROFILING "BUILD WITH PROFILING" OFF) add_subdirectory(3rdparty/SerialPort) add_subdirectory(3rdparty/QMKToolBox) add_subdirectory(3rdparty/QZip) add_subdirectory(3rdparty/QTextHtmlExporter) add_subdirectory(3rdparty/getopt) add_subdirectory(3rdparty/map2gcm) add_subdirectory(3rdparty/map2rmap) add_subdirectory(3rdparty/map2rmp) add_subdirectory(3rdparty/map2jnx) add_subdirectory(3rdparty/cache2gtiff) add_subdirectory(3rdparty/tzone) find_package(QtSoap) if (NOT QTSOAP_FOUND) add_subdirectory(3rdparty/qtsoap) endif() if(WITH_PROFILING) add_definitions(-DDO_PROFILING) add_subdirectory(3rdparty/conan) endif(WITH_PROFILING) add_subdirectory(src) if (UNIX AND NOT WIN32 AND NOT APPLE) install( FILES qlandkartegt.desktop DESTINATION ${XDG_APPS_DIR} ) install( FILES src/icons/qlandkartegt.png DESTINATION ${DATA_INSTALL_PREFIX}/pixmaps ) install( FILES qlandkartegt.1 DESTINATION ${MAN_INSTALL_DIR}/man1 ) endif (UNIX AND NOT WIN32 AND NOT APPLE) CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake") qlandkartegt-1.7.5/INSTALL000644 001750 000144 00000004331 12225261330 016224 0ustar00oeichlerusers000000 000000 To compile the code make sure you meet the following dependencies: * cmake - a make file generator (>= Version 2.6) * QT 4 / Qtopia 4 - the famous GUI tool kit, (>= Version 4.6) * GDAL - Geospatial Data Abstraction Library (> Version 1.5.0, 1.5.0 is buggy) * Proj4 - Cartographic Projections Library (>= Version 4.6) Optional you might want to use: * libexif - to create wayoints from geotagged images * libdmtx - to summarize waypoints as 2D barcode * libgpsd - to use gpsd support You can download the latest release as source code on SourceForge.There will be a win32 binary, too. For the bleeding edge of development you have to use the SVN repository. For initial checkout: svn co https://qlandkartegt.svn.sourceforge.net/svnroot/qlandkartegt/QLandkarteGT/trunk QLandkarteGT To build (out of source build, start one level above source root directory)1: mkdir build_QLandkarteGT cd build_QLandkarteGT ccmake ../QLandkarteGT CCmake can be controlled by keys. Watch out for key hints at the bottom. Especially the"c" and"g" key. Next you do: make The binary will be placed in ./bin. To catch up latest changes (in the source root directory): svn up To send a patch (in the source root directory): svn diff > patchname.diff As user you might want to do a sudo make install to copy all stuff into your system. Building on Mac OS X -------------------- If you build on Mac OS X, the result of running "make" will be an application bundle in the bin folder. The bundle can be double-clicked in the Finder as usual. Note that the bundle does not contain the non-standard libraries, i.e. it is not possible to copy it to an other box. If you want to create a deployable bundle which can be transferred to an other Mac without the need to install Qt and all other libraries separately, run make mac-deploy after "make" which willl copy all non-standard resources into the bundle. Note: If you now change any sources and re-run make, the newly built application will complain about a mixture of the system-wide Qt frameworks and those in the bundle from "make mac-deploy". Simple fix: erase the bundle before running "make". You should not use "make install" on Mac OS X. qlandkartegt-1.7.5/nsi/GTinstaller.nsi000644 001750 000144 00000022175 12225261330 020735 0ustar00oeichlerusers000000 000000 ;NSIS Installer Script for QLandkarte GT ;NSIS References/Documentation ;http://nsis.sourceforge.net/Docs/Modern%20UI%202/Readme.html ;http://nsis.sourceforge.net/Docs/Modern%20UI/Readme.html ;http://nsis.sourceforge.net/Docs/Chapter4.html ;http://nsis.sourceforge.net/Many_Icons_Many_shortcuts ;Revision Log ; 01-Jun-2010 Rework Installer - create batch file to set FWTools environment correctly ; 24-Jun-2010 Copy all translation files ; 23-Oct-2010 Rework installation of Microsoft Runtime Libraries, pass through parameters in start script, add german translation ; 02-Nov-2011 Replace FWTools by GDAL ;=================== BEGIN SCRIPT ==================== ; Include for nice Setup UI !include MUI2.nsh ;------------------------------------------------------------------------ ; Modern UI2 definition - ;------------------------------------------------------------------------ ; Description Name "QLandkarte GT" ;Default installation folder InstallDir "$PROGRAMFILES\QLandkarteGT" ;Get installation folder from registry if available InstallDirRegKey HKCU "Software\QLandkarteGT" "" ;Request application privileges for Windows Vista RequestExecutionLevel admin ; The file to write OutFile "QLandkarteGT.exe" ;------------------------------------------------------------------------ ; Modern UI definition - ;------------------------------------------------------------------------ ;!define MUI_COMPONENTSPAGE_SMALLDESC ;No value !define MUI_INSTFILESPAGE_COLORS "FFFFFF 000000" ;Two colors !define MUI_HEADERIMAGE !define MUI_HEADERIMAGE_BITMAP "logo_small.bmp" !define MUI_WELCOMEFINISHPAGE_BITMAP "logo_big.bmp" ; Page welcome description !define MUI_WELCOMEPAGE_TITLE "QLandkarte GT" !define MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_WELCOMEPAGE_TEXT "This is a GeoTiff viewer for the PC. Next to displaying maps it is able to visualize data acquired by a GPSr on the map. With QLandkarte GT you are able to produce smaller map subsets to be used by mobile devices." !define MUI_LICENSEPAGE_CHECKBOX ;------------------------------------------------------------------------ ; Pages definition order - ;------------------------------------------------------------------------ !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "License.rtf" !insertmacro MUI_PAGE_COMPONENTS !insertmacro MUI_PAGE_DIRECTORY Var StartMenuFolder !insertmacro MUI_PAGE_STARTMENU "Application" $StartMenuFolder !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH ;------------------------------------------------------------------------ ;------------------------------------------------------------------------ ;Uninstaller - ;------------------------------------------------------------------------ !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ; Language settings !insertmacro MUI_LANGUAGE "English" !insertmacro MUI_LANGUAGE "German" ;------------------------------------------------------------------------ ; Component add - ;------------------------------------------------------------------------ ;Components description Section "MSVC++ 2008 SP1 Runtime" MSVC SetOutPath $INSTDIR File Files\vcredist_x86.exe ExecWait '"$INSTDIR\vcredist_x86.exe"' Delete "$INSTDIR\vcredist_x86.exe" SectionEnd LangString DESC_MSVC ${LANG_ENGLISH} "Microsoft Visual C++ 2008 SP1 Runtime Libraries. Typically already installed on your PC. You only need to install them if it doesn't work without ;-)." LangString DESC_MSVC ${LANG_GERMAN} "Microsoft Visual C++ 2008 SP1 Laufzeitbibliotheken. Diese sind meist bereits auf dem Rechner installiert. Versuchen Sie die Installation zunchst einmal ohne dies." Section "QLandkarte GT" QLandkarteGT ;Install for all users SetShellVarContext all ;BEGIN QLandkarte GT Files SetOutPath $INSTDIR File Files\qlandkartegt.exe File Files\map2gcm.exe File Files\map2rmap.exe File Files\cache2gtiff.exe File Files\map2rmp.exe File Files\map2jnx.exe File Files\*.ico File Files\qlandkartegt_*.qm File Files\qt_??.qm ;END QLandkarte GT Files ;BEGIN Qt Files SetOutPath $INSTDIR File Files\QtCore4.dll File Files\QtGui4.dll File Files\QtNetwork4.dll File Files\QtSvg4.dll File Files\QtXml4.dll File Files\QtOpenGL4.dll File Files\QtSql4.dll File Files\QtWebKit4.dll File Files\phonon4.dll File Files\QtScript4.dll SetOutPath "$INSTDIR\imageformats\" File Files\imageformats\qgif4.dll File Files\imageformats\qjpeg4.dll File Files\imageformats\qmng4.dll File Files\imageformats\qsvg4.dll File Files\imageformats\qtiff4.dll File Files\imageformats\qico4.dll File Files\imageformats\qtga4.dll SetOutPath "$INSTDIR\sqldrivers\" File Files\sqldrivers\qsqlite4.dll ;END Qt Files ;BEGIN GDAL Files SetOutPath $INSTDIR File /r Files\gdal_bin\*.* ;END GDAL Files ;BEGIN additional Files SetOutPath $INSTDIR File Files\3rdparty.txt File Files\libexif-12.dll ;END additional Files ;the last "SetOutPath" will be the default directory SetOutPath $INSTDIR WriteUninstaller "$INSTDIR\Uninstall.exe" SectionEnd LangString DESC_QLandkarteGT ${LANG_ENGLISH} "View GeoTiff and Garmin Maps. Visualize and analyze GPX files and much more!" LangString DESC_QLandkarteGT ${LANG_GERMAN} "Landkarten im GeoTiff und Garmin Format betrachten. GPX Dateien visualisieren und analysieren und vieles mehr!" Section "StartMenue" StartMenue ;create batch file for a GDAL shell fileOpen $0 "$INSTDIR\gdal.bat" w fileWrite $0 "cd /D $\"$INSTDIR\gdal\apps$\"$\r$\n" fileWrite $0 "SET PATH=$INSTDIR;$INSTDIR\gdal\python\osgeo;$INSTDIR\proj\apps;$INSTDIR\gdal\apps;$INSTDIR\curl;%PATH%$\r$\n" fileWrite $0 "SET GDAL_DATA=$INSTDIR\gdal-data$\r$\n" fileWrite $0 "SET GDAL_DRIVER_PATH=$INSTDIR\gdal\plugins$\r$\n" fileWrite $0 "SET PYTHONPATH=$INSTDIR\gdal\python;%PYTHONPATH%$\r$\n" fileWrite $0 "SET PROJ_LIB=$INSTDIR\proj\SHARE$\r$\n" fileClose $0 !insertmacro MUI_STARTMENU_WRITE_BEGIN Application ;Create shortcuts CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\QLandkarteGT.lnk" "$INSTDIR\qlandkartegt.exe" "" "$INSTDIR\GlobeWin.ico" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\qlandkarte.org.lnk" "http://www.qlandkarte.org/" "" "$INSTDIR\kfm_home.ico" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Help.lnk" "https://sourceforge.net/apps/mediawiki/qlandkartegt/index.php?title=Help_for_QLandkarte_GT" "" "$INSTDIR\khelpcenter.ico" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\Download.lnk" "http://sourceforge.net/projects/qlandkartegt/" "" "$INSTDIR\kget.ico" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\GDAL.lnk" %COMSPEC% "/k $\"$INSTDIR\gdal.bat$\"" !insertmacro MUI_STARTMENU_WRITE_END ;Create registry entries WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\QLandkarte GT" "DisplayName" "QLandkarte GT (remove only)" WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\QLandkarte GT" "UninstallString" "$INSTDIR\Uninstall.exe" SectionEnd LangString DESC_StartMenue ${LANG_ENGLISH} "Create Start Menue (deselect if you want install QLandkarte GT as portable app)" LangString DESC_StartMenue ${LANG_GERMAN} "Erzeuge Start Men (weglassen, wenn QLandkarte GT als portable app installiert werden soll)" !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN !insertmacro MUI_DESCRIPTION_TEXT ${QLandkarteGT} $(DESC_QLandkarteGT) !insertmacro MUI_DESCRIPTION_TEXT ${StartMenue} $(DESC_StartMenue) !insertmacro MUI_DESCRIPTION_TEXT ${MSVC} $(DESC_MSVC) !insertmacro MUI_FUNCTION_DESCRIPTION_END ;------------------------------------------------------------------------ ;Uninstaller Sections - ;------------------------------------------------------------------------ Section "Uninstall" ;Install for all users SetShellVarContext all Delete "$INSTDIR\Uninstall.exe" SetOutPath $TEMP RMDir /r $INSTDIR !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder Delete "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\QLandkarteGT.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\qlandkarte.org.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Help.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\Download.lnk" Delete "$SMPROGRAMS\$StartMenuFolder\GDAL.lnk" RMDir "$SMPROGRAMS\$StartMenuFolder" DeleteRegKey /ifempty HKCU "Software\QLandkarteGT" DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\QLandkarte GT" SectionEnd Function .onInit # set section 'MSVC' as unselected SectionSetFlags ${MSVC} 0 FunctionEnd qlandkartegt-1.7.5/nsi/logo_small.bmp000644 001750 000144 00000160252 12225261330 020621 0ustar00oeichlerusers000000 000000 BM6(Ut^xݪퟵz⠴ݠdxF`pܤ뙸墽큘3Lnyڣ윰锬塼袺蟹螹웺횹뛺nk䦿롼蜻蝽蟼螺㠹r衹瞸眶嚵᜶ޡܫݶغetp%40ɸòĽʾ˩ƿʯ˽ϴĽҷk{tiyrɹ˾ozͺǻȼɼɿϾνɿ;Ϳ;ʾ̽Ǽ˶ƿѿɽť(4..<6žýÿɽȼ͇ɹǸƾ̼ȹɸٵȿ`qh:IAhumdulNaXο|ɽ댧`yީ림}֝ۥÀ+DXߜ라隹梽멿XsfNh}ã쪾ힸ枹壻韹蝸뚹욹뚹쟽쟼蝷ߟG`睻Ꝼꝺ硼裼y枷᡺䝷ߛڟ٪ܵ޾ҋ/>:Ѱǿ;һѱSc\\leϷƿ.>7žɹĺżk}vĿ̳¶öùƼɺɷŽʽɺƾ˾˼˾Ϳ̾Ͷ]kg1?;&40~̽ͅ˼ʿͻǸļƻŸͻɾսm|t.=57D<3B::IAhyp͌6Ocݡ㥼xy슝+AZLeuר砷飽痶㞹좼좹颼ᗲԨ囵ڥ뤺鞻磻韹蝸뚹욹뚹잼ܰf}-Fnߝ으횸磽룼{䟸ࣿ⢾ݡ٧ٳٻJXTںχͿʼԹźʸǿûȿӿڷżɽʽɼξѺƟUn̤樿튢v왭Xk֬֩ר蝳蘹暷꠺褾ॿ祼젶ꢺ柼裻韹蜷ꚹ웺뙸띻꡾ꤾ擬/FlȞߥ颼랶y⡻ߨޱڷԺпʹƼZie ]lh˾ɺٴöû_oh'70m}vaqjCSLVf_ѴĽ@PI{z̹ƻȽʽʽʽʿ̻ʸƼȽǹŹŽʼɸŻȸŷĶõ·ùŻżN]U*82BPJs~{ӼΆνҸƺԽʾ˽ɺƽʿǿʾʿ˾˽ʼʿ;ά셟q렷{|Vi۠ױ䞸֢뗴硼뜸៼㛸ߡ杷核靺皸霹웺훸랺隳o(?eq蟸䜸癹ꟺ왲uݦܯ߻ػйȼſUd`BQMɷԻȸѳž̓@UMz@PIǎ);4Vhaʷ£žȸ˪(81˾yм˽̿ѿͿ˾ͼɾ˽ʻȺǹƻǼȾȿɽUd\v~ʻ̹Ŵ˺ý;ʄμоʽн̿ξ͢ǻʿBZn٭ᗭЄbxޞ㟺枹헸枿퟽잻虶㟻꛹薴囹Ꞽ띻꛽虽噽圽꛹꙲꣺%:gThǤ☳ء垻瘹痼掰嘹硿k׳ٺϤVea0?;'51ƽϴƿԧu]ne;é>ME»8IE¾ĺǻȿ̵¸Źƭº̗2=:ƹxȼ˳¸Ǽ˽̼˻п˾ʽɿμȿԾƩ)!ͽмչŹѿɹҹôǾ˻ǿ˿˿˾ʽɻǺƹŽ˼ʾ՘˿^tϢѲpjڟ褿헷ܛ꡼웹꠻럽蓴◸曾䢾ܫ1CrǛة꛵ݜ㘷䚻씹돰ޟ`|ӽʞ0<6ƾϽιÞο̿˿˾ʾʾ̻ɻɾ̼̾ʻɽ˷ѾʻŽ;͌vzܥdz`v㨿ޡꞺ痸垿잻蠺颼ꗳ❸꡼痳⠺$7]էᢷݢ㠸格뙶ꋮ쥿|ҽЪ .(ʮ{bwnh}tͤCTKгº^ngڲÿѳغ˿ѻʷƻ?GF}͵ž[phͲIJòôŹȺɻȹƶ¸ĺƹŷö¸ĺƱƽĸĶºƻǺƽоԹ}$3+ȿغԺį¹ϿиĿ˷úƈѿɻ˹λ̾ȺļɍUj߶yvۛߡ矷坷啰ܡ꛹❻䟸⤻觾를꡹確꠻훶靷ퟷ۫矶֞(Gܟܠ䤻럽ܛ㡺䘮ҞϤȷѷƿȕYg\Q^VɹſǷſFVOHZSh}th}tRg^lvϾ˺ָּںпξ͓jrqxʼn{ξͻʸɸɻʾ;Ϳ̽ʽɾʾʽɺƹŹźƳȿŹŸĻǹŶ¸İúʠնŽ^meFWNƽԳȿζºͷǾi~ubxlͿξʾ˽ǿ̼Ľəͼƽǿwk؂h|Ψ٫䝷ߦ梼窿婽楻䤺䢺䣺瞵㢺袹颼띵쩾e{@Wqӑ7Ocqݤ➴䝵랶㙮ԡՓˡºXfZ+7+WcWĺý~gvnTe\ʫG\T̸ü˶ǾͳѺ˳ѼͽζӼβĿѾ\gerzyp}κɾͿϿͺƿ˾ʾ̼ȸĻξƾȽDULUf]ȿνɾʼȺƻſ̼ƱĻżͿϿԿH]Tku;ƣ̿Ǽ̿ɿ`wim뤺ݱ띳ק䡺ڦݫߪݪޫ飻塸줻﫹Zof|փg~]p֣䠵露익ꜳࢵࡴڪܥΛ'7>,:9)!@NCÇgtlļ\kc̾˴йͺ־ϮĿʲõƽκ˶Ǻ˴żλͬþѹws~fqoVkcαɿ˽̾ͽ̼̽˿̿Ͼ̾νոǿ пӾȨƽоʿ˿˿˿˽˽˼ʼʿ;̽˻ɽξϛ0EWɥ֧_uLc}\sZrMc|K`vNcyOdzK_xJ]xRgeyt馾衹㢹』nYozPgo|q䩺埶䫾룴ߤܙRa{5EVYhqׯgwl|KWQ͏Q^Vo~v~׽ʼ߸ȼͻԿ־԰йʴŻκ͹̺͊OdalwuҾɽZogκɺɹȸȸȺɺɼ˻ȹƹźƻǽɾʿ˿˽ɿ˾ʿξʽʽן#ػٺЗͿοͿͿо̾Ͽͳȿ^sjr~dznʼӣ÷kwQf{yK`uvbxF^p˽՝̃͢awsϱ৿㭻Sb|]syaw|ct꠯磵쟽욷㣺瞱ޜarNM~̿˶ýʺ˹ʻ͹ͷ˺ξй˺ػ̿нՆg|yavsh~|ȻWedvпβļҿξ̽ɼȻǼȽɾͽɺƼͽɸļȼȽǿȿƾř 1(μƷп}ȿګ[pgټʼ˽ƐͶʾӿ挨]wLfwB[oSnWopx\mz|\qsScsۢذיּ띳ꜻڙ Li|z䦺{ٻޱļҹʰ·ɼйͶʶȺ̳ŭĿбѻK^[߿儒vλʶŹҹʼ̿ο˿ͽɺչü͂λɼʼʺȺȽ˾̾ҜԽ˽Ѵʾԝ䄠ٴڥ̡ɓ¤`r޸쯻뮻ឱܒ͡؜&?g6Mz䨻橾䠵uѴ޿׿ۿҼϻλʶƾҹ˲ijŽϾζƾҷž̹AROܘm}|ZkhĹtп̻ȵ¶׿ѲøŽ̾ʼ) ո΋Ƚѿ;οͽ˼ʻɽѾϻŽדt~McWh~rWh]_peω爥݃䈢̤lN`q៫VdO_@Sx]tQjKf&=cЦ楻䤺ޖiݹѾھؗOdakzӾӾ;μͼӳŽϴįƾͳǫGUSXfe\lk\nmOdbpauvuWgfevrþ˸źǻȸŵĶŷɹʲǿ»ǽɽɽɽɽɽɾʿ˿˿˾ʾʿ˾Ў ͕Ͽ;̼ʻɿͼȻԿ˽Ҹ;Ƚ˽ˆQg[Vl`ϕJ[P˸ݻbxK\wz違@TsPeI^}qީ茣Ɏǥg}ϹشϲȴǩN`_Wij9OM5JGп̾˻ҽʹӿѶпղYeeammؽdvwug{|HXWk|yj{wнȼѽ̰ĿչƺƻǽɾʼȸĴǽɾʿ˾ʾʾʿ˸ƻʮ!0(ZiaϿ˿п˛̽ǿ̽ǺĤDZNͬ¶޸ɾEVKQbWź̿ˠRhsF\h¢lRe›͟՝ר䃛Xn0Gg[rν۷ۻYliYklh}~\qo~п̻ȷúͻȵ·Ƽͧ¹ɯļå[eevZgiкϨl~l|{Pa^DURľѾֻ;ʾν̿˿˿˺ȼʿpwJYQ~ͼƽϽɟӿͽ̽ٿɏ=SGʹʾϻӥEVKм۔ۄxzdyó⦲ڭ㬿䩿`vi~'<[mTj|޺պξm|xk~uڼ̶ĵ¶»ȰӶô:IE~R][U]]V``vHTV׽Ufc}Ufbپͷپ̨ ŽIZQǾԼѶĝλɺȹǻɺɹȻʾѿͺȽϦQg[¶ѿݾĨ^odO`Uֽо]wqA\Y:T[jޫ娹䗭Бįހ{־˹Sa[FQI|WmkNcdavwbwu̿ʺŶҳúɺdtm}ٿPZZ}־ԳǺsٺyҼι˻Υ+ ϩTc[Ӳͽοоʶ÷ľϼԺϾʙv~ٜؒhynIZQܿΎ-Qc֫ퟷ᝷e{zU`|ՀԾԾآPZM޿ܹުʭЩɆf~vǶʾϻֵh{rܿݲϽ׷ɺֺپt־ֿs<^TVrlѻ˹ɿ˺Ǿһͽʸ½ѻѫ'SdWlzoڀryvݨͿѽϽl{s̩CWJخĿIZQalbnnhMSR޼߾ؼڻܿ{ּՎ[loӿŸ˼ʺͺñǻķҹǾɿǼŷ¿̹ƽʾYkdK\SрXe]\f`^cdݜѿӿιɼɧS`X,7/}ý̿ȿɼȷÃ̙`sjѐctk瘷]roÓ_t꩹觶䅜o|˄#0>:NOGUSdppi~ܾܼ޼ϲo}{xJWYaouew~Shfwڹھܾ‍lx|k~{ȾƷʻѾԼ˷ʽйȺʿϿйɈ$ gvrm|x|YegUacϳ™Ҽξx{GUJϻǗyyk~uI\SbulǾ᜶FO\CSjҫ/R=RqVbnz֢ۋUpctFTZXjkࡱBY[㆗_nqTaiSepK_`Ua[dmjovysҹٽ޼޻غּ|߽ꆜkzǶ¶ʻμֿ;ؽڀQcb׭aqp,;=کhyuֆͿʽɽɾ̾ͿϿϿѾ;̾̿οξξӹɾeshЌrv{ͲǾ]pgH[RζITjvǩݙЃӞΈ^lܟك7TcuLeigټGVNWdfBU]ܷڼٽպѻyٹڿєE]U¿ӺɼȶºŽѼެN`_嘭H][ovđõͿμͼμкѻϼʺǻȼ˽̼˽̾ͽʻȺƺƻǺƾҵƹZk^ֵ̿ƹĵְżؼȽ޷׽宿y*7W܆k~q|o{Te6Ga{Á،Qnwڿռuݼ䩻wyf|ٻڹҺҿxܿڷԽڳܻѴݼ׷Ƽ΀Peg=RTqÿ˴ξųξ¿ϼ͸ŧj{x`xp{|ӾҾԽξͿοͽɾоʽǽ͎ScX̼ʽϽɑٺݷܻ֪¶ιζʼ˼зۻܾۆOlsI^sGYvĥWn*VLͺѸǽͨżƸ̸gϰίΨɫʵө¦żʰ̿˴øͼձиےH\WɺƷ̽˻ʽһµźZj_s{Ǿպ˶ŽͻǚVd`y}ü¹ƾ˾οϾϽоѽѿξɺź÷ĽĽŽ»ɥGUOͺƲȼú|ˮźͷлɼʿѸݽͳҭʳǨĖwĩ¤ͬͰͷѥ:HTUfBSh=JdkqДQ\jvn{}ѿ̶Æjy{L_bIW]AQXrʓVZrJOdq{9MXǷ˲ƫMhdžƲͨŪĢ\jd^laμƷý9GIZ]afuiiygptYqe/[ZaOiwPavMRqBDbLQfBJaiyrpSctY^s53Ixvilz~4?G]BMgOQeXYeidmv{}m~]eQrWG[N$2.ENR.@? >,:_U)DH%9-/GMRadv}\~T?84QN)ROeuoGMX)I8nUzjQdg4=F1:=hks?6K3QLMng[vsOYc$'6:=K(37#?24XB4T+:(^/B 37:A:OOOL]PNqVJY5|J)kA&Z<.C;>AIPOYWaaSycGZ8yK,n=+`9/S;@MKNUXarifmQvV"N'*V/,X1'L,+L10M63P92R9/R7'Q.(K06KC:MJJgWU}aT]QWHtM>cCIaOM\TdknĵͳΩ°y]hKnS:ZA3O;7QDWnjez|t~t\lElR;`F-P6 -36NE@")&\c`ĻãƺZg_2=5=E>ALDQ^V_nfkzrѿBdZꏛy^|įx~LP/1+-&)'.$""{(y$kw%$/4(U.ARGWw_6B,(3$-%!,"/ "% /(0}3Tp_|it\a/=(#y%TU!c&~ #}*'k4:%1(/Q97mBp)y&",)n1"BKO"++F6/x2~yi!0^A5+ 8G?ZhgQn_:xH+}4slc!![$?](})ng(]+ (":Q;,Y.e! d cW#7'*./?=C@NC0c7i' f _W!P*/K8NgYHkP;i?%_(TVTOOOO!P!PPI8)-%B*N'NSOE4,=2GPSgpy|Wf%Y1BIC 62U:GgV\zoxtJsX&R.C8 :/ D!-O1?\CHaMTgVfwjv{лƼȾʿɺųͽ|`|e0M4!?&0 '% & ),-E-5K3!4'9(#0"%1%9KRM   -5.5@8&3+MZRúB\V9]Lkyak38((  $   {1!Z9EdUT]%#        Z}^O],1  sz }#AA!F%q)~ )# + ($Az{ ##"`,*" 9"\|iXhd ~o uytxp !o(% ";->_<&_ j q ue<'.'3100D-` j jf_[#8gAWa-f3Z[ d c f _] [[ ZY [ S?)- C#LHPN H)J(=QDQ]_is}Ġλq QF F9 DE?@jG_ks^k1]9 =6;8 E; 9 2 A8V9+4*[dZ¶    (0)"*#%0(TaY}Ļ0`CO_,7 zG<$;\NGO    %o͔lœBN   ")!(9 /[#'' | H/" BpB} )p13 =&# 2g?*z5 }yt}r ~hE(-G7=d7%f v} c 5) ,!Ef uund#^+DrNZd]\ flad ` ^ ^ ^ ^^^V 2!BP N XUM?.E7IUYkuͳ.p<A S FMG : *R)X}]xx=pD B < CA= 81@ 6 +8#=% &816DBQ_^m}|]mlj{xÿƾ÷ӺEmJ+#&%&'$"$% +!% ."/!:F:1<21<2õ  EPHkxpzQke󨸷œJ_     z7<18ME>yF"0!$"&("$"!%);RxXz  ,(o6`%q.1C< X#"" #C8E=EPF7e7y k'5'I> 6!$p0v~:L!w }t@%5D6:b2ixxu g =#-[ rtqc['6aFZuent[ ] mgS 4xA)f:#a1aX^d[W56_@ C Y ]PR A1F=FPWenwǷͭS U NGH %I6J7DSKfyp}bgDJA= ? 29!> 21 32-C0M^Z'+dnx˻iwuu|psEtF05-*" "' )(*   +:H=:G?"/' $N[Sv~Ŀʾ˾̽˻͑.< !   B1%1?=6lA OM+n0MRnpݓ췕ر̜ % 2A-s>#m1o  (%%!`( / *52LVP;d> !o"7 ;0-[D-5{ w aA'4*s+xq94A17a2izzw oN@ Fftt q_!U0?`Rkz%d&]__d2t@5mD/k;!l( b ce[X('*P4M W[XV> 7/BKU]cnɩ NRLHE #?!6?NlO>d@"L#)(!   %(4.fsk˼ #%4,O^Vt|¼Ľƿݿkm Y##  _2,<;3aD& > ;-;iV_x|հϾިRb$($} &' i)  #2<<7>A*P4%%q7 *AnMw' w5'#!411k;nv  p<3G03_8f"x zy w c^ `n qohQ"L-JfYk}rBP fb u bd#n$!n$qeee\ W ,(;!ORW YO F&1,>GTQUgnyHLKJC8,74CINcoopy!U%HMEAB 5( 2?&M +O#$D!*D,8MDYhj #Xhaƿȿʵмch15(7 . 1->OAcvervpsln#!!!  - 1A6MYS   -"2?7R_Wv|¼CB\F{'!-43777E #|& ;2EB7dI-B)@HFhh_|̼JT    #~5!3+n0 " /.*+8:.x# -w 8* BnJr z*A097CM,_=h r{~r@4I34`;e%vz{{ no o qq j \ >:'Lb]uyu/Ag[Y a \ _ d ^`c[ V)%31; H T Z XI3 ',9ADK\ZcpotrFLLM C1 0)9BER`^hs >>DJ H ?? 4;; 97 025N@Na^BRXuqyr{&A-=5,1&( %  (,?0 &#%&$  K\O`ogtzx~ryj{ny}  "0%1>6N[Sr~x߿׹ѻݙն#% &BB(!a=<\m}k|,  (-D8PF?mI !:'9@Nifo˽ɐ٫^}Lj1F*& *L;1MN_.1  17#$9 v 3}4#=&P{Zs|b!`@3EP$3<#W2hv||r: 7(3b;et{tvwpo h#[(;!*'CQW_nq}yib/0xDY WZ` [`b V P'A48GC=_@HY [WO 0 11.:FPJV`Tdjbyt[jFLMM B - )+979KDWw_ ?EHH=57 7 > 86 8 38@^Kbzri}~>ORç^odʄDTMȴA!,)A/&5):-'5*BRG"$ $&  "`peerj    $5@8S]WsyЫ̡ŏƴڌʹ 3:);4&KC?haqmw( '*J?XJDvL >/=O  )v25OA_o%,  q#k=!@9/J@['o }}n+1c9cr|swxmlj2f6.M8!10AKUit|wsy7{LPcIW/n6)k*i ] _ a UO@ZLTe\feM WUU W NN$2-C>CUVOda`zl^hHMMLB / ' 3*1G;HhOP L PD8M ? @>7 >?5BLmXb}s1EFժ\mb5E> .5 8!" + 7!->11>6L\Q   & #n~sy~   (&1)CNF]gaw{u{{|ƽ½+ +C*87;JMKVZiiotpaV0&  ''SJeUNT    J8E7Sb^u̼٣otNU?H-2IOFR>Jy"'6kb9\f"]>v'  yfX v p(Z0Qqll%.  b =6h8nx }i$4e9ft{}vios mpi-k/8`=2J@Vehfr|uvbbLF$o! d#GNGO=}B+r)` ] a\ZYyaqw{wT WTXWX R 6 %H.MjZclVyWUTK POLF 8 /4$;UEHhO3f::BBMIKIL:r=V@ C82,V3iwxSgh8LGM`WDXLî˴ . /,21&7 $6)8H=HXM" ""%"  VgZl{sx~ '(3)CND[f^ux6S%$=9,97DIHb]_aqYH:) -((_(XscXb"L9E1Sa_~@H"!88R[EQ'0.Iz^aw&}-  ~&w.ev|)9 |  }0x+.v)}|}i('9f;fv{vjZa hj t fg1i4=cEprv2`5"add [,w-NUBI.y-a \b d i!nw}{Y [[^TV QE.Z1Zbdi$NH MSQNLB88$?ZFXx_bj EC=<4l9joOS!Z#;=1>Wa~xAUPͿǾɹ׾"G%&1)-%.H0#6%*;.5F9;N?WjYRiSVrUHgHC^DB\D>TAH[LZk^fvkw|qt  #* 3>4GRJcnfq{uǾ9M p:M9+G3;K9DPD=a=)&  xDuCiuq !S=O>Xjk{s˅   BTp{"w%  } |?KRgcc1#~/w   | zsy{ zt( 1"=f@)q+s xwi J U4*k>`i o f bC}C}Wa\ r j fd[ a ` _`_^ HU[QOhUUS H EntD N ROUQFD F2QnWpw~H~S?; G8 9 9 7= A/=mI²»бm}Ѳ͹?dB+ 5).++I,-D.#7$4G6=P?8L9?W?9U85T54O5,F/@VC=RCI[Nhynuzpum}rj{nWhZ , -8.=H@KVNZd^gqkyûXl % ~+%yC"]++Y+.Y4)k0  :6]^}  "&!Y$D[MayyZn!    &2Jd}̱(v/ %;BW(:{  /78qJ.UEƸUh-3w~u ss~|vo.S-$8%W~Xd!mrv a/^D+ID1YNC`m+[qd_!\gǢ\`O `r`a ` [cZW+DsŻڹ H\VR ,8gONHHxNI D T XSQQF B7pvxãM\;. ?:< >75 2e@¨⤸WihĂ/*' 3 '#C$;X>:T<4K54K59O77P6* #A$!<"*D,.D1@VDbuf^pcqwm~qgxk`qcO`R)'3'(4(/:0;F>PZTT^Xjvp~բ **'4%}1x.*  $*JNntҩ#.l>Uqkj}zџOm(;'*.(Gy4.YQ~~9Vkώ͘Ǿ-nAu$0vDCsukAa"q8t. t,es˥[~th|ЭŴ̚٭K` e&s4h- Ǟð¹ֿ̾ۼݦɻ߼Tifһÿɽ˶Իz~, & 6,%'(%!& )8T=  .>7RcZЋ܍)/ 5.TQ塥ٴqپ(   ӱĭϳڽP^tWkEEu}1IgezЪwZiyۧ3KQVpwĔFYk'htr f`z7eOU n y qa.8POZ|ӑޞ藷ۏсI`v[m~swy־۽мٷּ߸ڿ޵кҵε֯ǾMjg~:j@S*B@ٸϹƽؿDz޿n̶ֹϵռ$M-**)*!0#!DcH   rz?OH}ҘԨxؑ9J,8* +#1-?@Yfߦн߿/D !+(*5AԴػPchטe[ނ7`ywJdrUtե萴ܖܦ䅛rMab˹(g=$d6[""x*h(Ovxj\B e) ik*Z0/AÔҚۚޘڟߦ褳䉝o}uرԻӅڽѻ߽Ӿ׵޿id}ձϼۿgVVꉡ/@<ѽοͿ;̾̾̾̾̾ξ̽οͽ˺Ƚ˿ͿӿξӍʿپտκ뎣2FG_vx_y㚷ޭ줿碌oPcÅȥ꠺⢼ᗭфٟ̟ʮ׮w^rwNbm´ܦաָ壻韹蠷皱ߜܯ菢"4SڝԞդTiШ䥿䙴ٞܗЭߢK\oJ]e`szݸٷڼ۾ӰMee璪atqֽοͿͿͿо̻ɻɽ˾̻ɾν˼ʽ˿Ϳͼο˾ԌԿнղᛵ0JJfz{b{}vެޣܠ핦 E䔬֗ڗܬ䔩σꞯʱڷ߭ԧ6LQ׽CWb`s^rϨܓϘٝ⚴❷坶➶\qTh~ #Aڤڧ]r⦽㝶ޙܡ䥿䞴עևEYd\nuعض׷غٺؽٽٿ۲`||Hbb.A>ϼʻɼʼʾʿ˿˾ʼȽɂվБѽ㒬TnnF``d~~׊2GHJce]t䥾㨻ឰ\oڟ梺䞴p1T;MlizBYh>Xd7煟uB\\񏧧Nff璮F]s䧾ެ㠵;NiP^qgxpzWmyh~٬嚪cr@Vhꌣt楻ޞ۪욳ߚ㞸盷曵䛵䛵㛵㜵ᛳᘯߛ᥺疩ԚQe✴ޜ䝹蓱♹꘶唱ޜ哯ҢE_pݰL^istؽۿ߾ݿ޾ߵ߾ָ1LI{ڹ͓=PMӻɽ;szʾƻơ[kdzϪ9IB׽LffTnn˴菫m|NZl޸9M_Rh㩼߬_nJZwVj{޻߻Qgʪ⡵ީ뚳ߠ颼뚵癴更更更暴㚱ᘯߟ鑧ۙߢ㦷K]ݙۊќ旵䘹ᒰ١⠻Pi}yqZnsڿվؿ7ROãܷ’@SPؾַޱĻϯQ`X`oggyr}O_Xͮ6F?;ܷн뀟Xqݵ噮k|FTgr|lvYk|ezӪ۫gvrp|ߺlVmꦼ样ݥ홴癴眴蜵矶蝴暱㘮◮朰韱柰ᡱTe{Mfrܑߗ◷חؚJezUfoUgnܻ؄]yyuΥCVSмտ;ϾѾֺήS`Xmzraph}̽k{tP`YǺٻʾvNkzѻ瞳L[nMXlbi|W_pVcs>PaרѮet]j=Kbɉw߾߹ۿRk{٢棺礼ꦽ饾靸ꜷ鞷鞷頷韶杴䛲䘯硸ᕩ٦dv.Wb|dڝ钲ݡꖴםpuhzغA]^ޠ?ROѻѿ;̾ν˻ɻɼʽпͼʿжؽБqxJYQy0@9Ͼ˾턤hiܥM\ot}ot@FYyzܤȩϏuzn`uԵۙᠺ隴윸磽졻ꟹ螸砷砸桸柶曳霴ꕪݛݥTg$;anЗᎫؖߚᗴ٠ڒYq⚪{Vkmܾܿ嫿eycxѽ~ڸ⠶Qda־пͽ˿Ϳ;̾̾̾̽˽˿ͺȺ϶ϘS`X;ƒ>LFP^XͿϿĹkPjxycl~JZjRbr`sCSdiwbsͲ獤I^sޚݞ阴㝹蛷朹書垻製롻鞸朷㞷㟸䠷䟸䖯ᙲ䜴➴ޠNb`xZtĝ䚷䛷朸癳᣼枺ٖJbx⟯pG\^ٿپڼڼݼݿH[hJ`k޷͟ӡޏq~оܦctk|l{sfumQ\TkvnλԘ-;5¼ַӼ̻ܧ뚴Mdt~_ayloU]ns~|^o|zjw^kyO\j\o|F^j@Tfʺ妻ړ֥朻蜻蚺唱ݞ碽頼埸➷ᠸ⠹ᡷᗴᕲߛޛث^s]s>U{ĝ嗱䙲䙰♲ޟܝD\tQcjkԾܿݽ޼ݿ裳Wjy\r~ڼ؛AYW\miӷUf]dsk؇!dogbjc#o}w>JDr~xռιͯƾسÿᐰ윳DVgײϾعBO]O_l\mzpƃBO_]l|brJaq־ۼ۾䟶Wlի٨ݤ阶嗶㜹嚷픰٠堼埻䟻䠹㡻㡺⟹ޞߝ晶⤾暴٢Ulۙՠ᝶┮ܟ螷陰⥻럶㝸ړKc{@SZbwyҿ߾CUfPcxOdz=UU㜲߾ط]ql̾ͽ̾Ͽͽ˽ѿ;]keſ-93lxrcoi?MG/?8qzYibyҼɼɿμҼqf}pոںڣØӓoUfyyPavȭրDXqYloL_bSk}׮᥻ޗ䕱ک익ߜߩ웶ܚ隴ܦ嚴ܞ嘵៸➷ߟXoޘۜ㙳ᕱ⣻鞵⒨қ؛ףKd~Pfkc}}޿ؿRhz硲ٙRfߔz㏦qϿѼλϽͼ̻˼˼ѺϾ̿˾ͻű-;7Yhdը}OiuPjxXr~RjvUkwOeqTix]raueyӱٛ0G\mɫ~y:KN[op^trf~u識ۢޘᓲߩߡ⩿렸⣻镯ݟꙶ㙴ᔮӜޛ◴䞷᡺Yr䙴ᓯޱ晱ߡavɢޤJb~⋤qEaa߷F\nנߩz9QiTnuۉݿܕZkgҼѾнӾ̾ϻԉ1?=IWUه̽̽̽ѬϷtL`qڴ1BWCSj˄|߼׶OiwNfx`vۦڦࡼ螽ꞹ뜵ݖբ⚲ܨ蝺癶▲۞ॿ㤾㛸䙶⟺根㣼Zs嚵ី玪ٍء钫פRc0CX~%4Tk{H[㝸ݠd{Rh7Oy甭٣vϞᛸ壾꣼棻Yq枹培衽왵䞸曳ݜׯ楸ݤᘱӦKbxcz㣷ڟٟ0Ed߻ۦǑE^Z]wq|^{h׷ѽԽԻϾҽͻʻ;˺Ǻ󎧫ᡷAW\j}/EKFYfN`wASpҘ̡ڞ➹墺䠸⠶ߟޛۖآ睸䜵ߟࣹܪvŨ⢻壻e}젼럻Ꞹ枷㞴ݠٟמ۝t`wMeq*CW߄\q׼ݭ΢qڻȹȐj}Xt{߅߽׾ڻϽϾ;˽ʿ땱Θc|Yly݈-?\װ娻ᢹ栺衺核⡷ᠸ⟷᜵ᠺ蚴◰ܤ㧽ki~ۚᦿ룼Tmݢ韻ꟻꟻꟻ꣼裻姼⦻痯ӀF]s}gay&;[ƴҸ߼AXPԾȲǿϺˆF]YܹꢼYszࡽۿؿо𓯰磿I\kڱ9Kj:MnԞۢ蠺衹瞷㟶㢹棺確藱ߟ靸䣾㚰cxl螷᣼䥼⦽Qjޚᚶ噷蛹ꞹ롻飼覼妼围ܢޖPg}߿޾B\lʔi~=Pk]qξZogG\TH]Uսdyv}ꉡ|Իӿʝ蒮ʯTgvƫئ:Nqtꟷ垸矶朴❴⟷塹矹蕱薱ݞࡷ^sMazצ瞵۝٧Ul☳ߙ䘶癶陶霸睷執៷ᠹ៷[sm޾߼߼߾߾߸t@]lӓÚi}Pfl机Mb_Wmk{󒭷ںԼӾҾϿν囹Ȧ߸7LTsatԝ^rbxݚ⚶圶嚴✴➶䜶嘳嘳噷摮۝ᢻcyz`v٤ާॸOeߞ㜸皸阷ꗶ陷蚶坵㞵◯٘4LjJ`yk}E^r|?SXݿ䉤œqAWUa|uӺѼнϽ̺ɺힼڥu1EPzcvخZpVmޙ⚵睶蛵䝴䜶噴敳䙷薴㗴ᢿ朵p`u¬㫿⦺Ndݡ曷斵蔴铳蔳旵朶垷㠸酜j⡻ayDWlWgw|j|Phh_xzaoܾ׾ѿμ˼x¯FYnޫJ`czߗ☶皵癴更杶蚵疳杺풰ᔱޠ䥾\nh|᣶׬Ylݡ䘴㓲吰吰呰㕳䜶執墺䝵٢٨Pgw䐨=QR]snkzsԀފ܍}򌪫,DJbx~lZpvZrxVntOio_yUrwPorVuxܻܕ[nuxatPcxߧm8Ou䗴癴昳嚳囶蛶阵蔳斶矼阵ܜׯGYp@TwܞҰ[n۟⚶唳摱捯䑰啳䚵矹盳ݪ樿ߧNeuxܾݼݽ߿ڽ|m覻rG__axz싨Lgkh߾ꗺqlandkartegt-1.7.5/nsi/License.rtf000644 001750 000144 00000047373 12225261330 020100 0ustar00oeichlerusers000000 000000 {\rtf1\ansi\ansicpg1252\deff0\deflang1036{\fonttbl{\f0\fswiss\fcharset0 Arial;}} {\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\f0\fs20 GNU GENERAL PUBLIC LICENSE\par \par You may use, distribute and copy the QLandkarte GT under the terms\par of GNU General Public License version 2, which is displayed below.\par \par -------------------------------------------------------------------------\par \par \tab\tab GNU GENERAL PUBLIC LICENSE\par \tab\tab Version 2, June 1991\par \par Copyright (C) 1989, 1991 Free Software Foundation, Inc.\par 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\par Everyone is permitted to copy and distribute verbatim copies\par of this license document, but changing it is not allowed.\par \par \tab\tab\tab Preamble\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 gratis 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 redistributors 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 verbatim 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 verbatim 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 noncommercial 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, sublicense, or distribute the Program\par except as expressly provided under this License. Any attempt\par otherwise to copy, modify, sublicense 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 licensor 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 unenforceable 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/donor 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 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 Gnomovision version 69, Copyright (C) year name of author\par Gnomovision 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 Yoyodyne, Inc., hereby disclaims all copyright interest in the program\par `Gnomovision' (which makes passes at compilers) written by James Hacker.\par \par , 1 April 1989\par Ty 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 \par \par } qlandkartegt-1.7.5/nsi/konsole.ico000644 001750 000144 00000035356 12225261330 020145 0ustar00oeichlerusers000000 000000   6 h00 %F( @ 1=;;;;;;;;;;;;;;;;;;;;;;;;;=633457856868878979:99:9:;9;<9:;99;99:79:789688567467466345345234123012011/01.01./0-.//00:w{|?@Ay|>@AAy|~cdakldkmdnnfooiqrkrsmttnuvpvwqwwrwwrwwqvvqtupstnrrlpqjnoglmdkldjkdijcnolABBAx{}fgh $$,,88 BAJI!OO'TS-VV1WW1VV0RR,ML%FF>>44))"!BBCAx{}jll--..00,,66EELLRR%UU+XX-YY-WW,TT)OO"II@@7711//--))''BCDAwz|ikl)) 22 xxd))<< ??CCFFFFEEBB== 8833//..++))&&##CEEAvy{gij##%%ffS--33446666554411////,,++((%%"" DEFAuxzfhi7733**00,,""((////--,,))''%%## EGGAtwydfi$$ƽ~""``Dy99 %%**((%%##!! EGGArtwcdf,, ##ddM}++""""  FGHAqsvadfZZJ !!TT>wwo!!  GHHAoruace ssj{{m  ccRWWN  GHIAmpsacd770¾}::)** HIIAmor`bc ,,& MM@44) HIIAjmp_ab777\\R;;2 IJKAilo\_a999SSL   IKKAgjm\]_RRP JKKAehl[^_&&&///DDE JKKAcgj\^^888+++===00/777666,,+ KLMAbfi[]^+**FFFCCCDDD]]]PPP@@@CCCCCCCCCEEEEEFBBB777+++ KLMA`cg[^_655SSSPPPOOOJJJMMMPPPPPPPPPPPPPPPPPPPPPRRRTTTSSSRRRMMMEEE???;;;888999KLMA_bf[\]FFEgggcccccccccccccccccccccccccccccccccccccccccccddeeeggggggggghhhmmm433JLLA]adY[\'&%BAA?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>?>>BAAIKLA[_cjorkqtlqulqulqulqulqulqulqulqtlqtlqtlqtlqtlqtlqtlqtlqtlqtlqtlqtlqtjpsty|HIJ589;344&&((>>@ggijiljjkkkmllmmmnnnoopqqpqqrssstusvuuwwvwwwxxxyzyz{{{|}}}}~~偂邃ꄅ~UUU#(  @|$&&н,./˲kmj**66DD!YY9__CaaF^]BST6FG&:; 0/DD>245ʯRULHH'OO*10EEFFCC99,,$$('567ʭLOJ<<-11//--%%,,,,((--578ʩGHHFE5{&&XXE## ((568ʥMPN ``U #"578ʢCFH33$PPH  578ʟ;>@zyx!!TTP 578ʛ<@Ahhg??: 588ʖMPQ>>? 678ʑ\_`655UUUSSS???JJJDDD888++,!!!%&&578ʏZ\]FCCIIHGFFNNMONNPOOQQPRQQPPOMMLJHHCBB588̍nruuz}ty|ty|ty|ty{ty{ty|ux|uz}sx{|/13SUYϜb(0` %(++++++++++++++++++++++++++++++++++++++++(X[NNOWYZVYZWY[XZ\Y[\Z[][\][]^]^_]_`^_a^`b^`a]_a]^`]^_\]^[]^Z\]Z\]Y[\XZ[WYZVYZVXYUWXTVWTUWSUVRTUQSTQRSPQROQQOQQNPQMPQMOPLNOKMNJLMKMM777+XYZY\\-WXX\__-UVW]_`-UVW^`b-UUV`bc-TUV $# ('++..1143 66#88%:9';:(;;);;);;)::'98&76$54!22//,,)(%% !!bdd-STU ,,--//1144::CCJJQQ"VV)\\0aa6dd:hh>iiAkkCkkCjjBii?ff=bb8^^2YY+SS$LLEE== 662200..++))'' cde-SST **++--//00//33;; DDHHNN"RR'UU+WW.YY1[[1[[1ZZ1XX/VV-SS(OO#KKFF??993300//..++))''%% def-RST (())++,,..::??::88??CCGGJJMM!OO#PP$PP$OO$MM"LLHHEEAA;; 662200//--,,**((%%$$ dfg-QRS %%''))))##**4488<< >>AACCDDDDCCBB@@== 99663300////,,++))''&&##!! fgh-PQR ##%%!!--2233446677888888665533220000//--,,**((''%%##!! fhi-OOQ << suuh.. ((11001111111111111100////..,,****((''$$##!! gij-OOQ88((....00(($$--......--,,++**((''%%$$## hjj-NNPuub ****++~~leeT'' ))++**))((''&&$$##!! hjk-MMO..xxf11!!44$$''""÷rrg$$&&''&&$$##"" hkl-LLN tCC.%%vii^!!""!!jkl-KKM--22##"" II1__Tjll-JJL 88'Ľ !! <<$|~klm-IIK!!QQ=QQA  kln-HHJ YYPJJ:++ssh77& lmn-GGI33/ddZ ddW,,  lnn-FFH-- lno-EDG ++  mop-DCF ##  mpp-BCE PPP__^!! npp-ABD~222bb_ opq-@@C}''''''EEEOOO opq-?@B| 111000000'''%%%@@@+++)))111111++* oqr->?A{~999888888888///---66699988899999:;;;778---!! prs-=>@z}~CCCBBBBBBBBBAAAMMMUUUNNNBBBBBBBBBBBBBBBBBBBBBBBBDDDEEEAAA888,,,!!! prs-;x{|VVVTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTUUUUUUWWWXXXYYYWWWVVVUUUTTTUUUUUUprs-::=xy{aaa^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^______``````~prs-89;twyhhheeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffff{~nqr-89;                                   noq+679ﭸkmnv#))+‡UVWO((*G9:=jlm===++.H**,88:;;=<;>==>>>?>>@@?AA@AA@BBBCCCDEDEEEFGFGGGHIIJJIKKJLLKMMLMNMNONOPOPQPQRQRSSSTTTUUUWVWWWWXWXYYYZZZ\\\]]]^^^^^^_^^STTHGHu qlandkartegt-1.7.5/nsi/khelpcenter.ico000644 001750 000144 00000035356 12225261330 020777 0ustar00oeichlerusers000000 000000   6 h00 %F( @ )4;=<6, > *38;;70 &k< E2P00fLIwke}u{zyqb]B@r*+aE }>.()UCAwwʸӿԿԿ¿óoh44k##G _$$A*+i[U̺Ҿ̹˷̺̻̻˸ʷκ>;,-]"j&&D00r# °нϾɷ¸33f&e%%C//rJDĵ33dM,M22l YV..T %,,X##w/W-C75r$"0/Z"$XngZQffvjJHx ,%&aƼºed HH%%!!44}y==HH {Ȼ¶mf/7..k᪛ѽBBs%KBkKuuȶ7<32p }T<q Aξ<;10o⭜ssB"d ;5)+jTT0)  {ӿv4&$&ewmm=MxѾ_Y ')+cBTOu > 'R--:8s^11`%%n//mg=/9/TTuA22`&'`HRN%%&&44 fKNp))RR==@@Ƹ31rQ44d44c"#fso``rrvv]]WS +44d44d22_##j^^// II== ?44d44d11a11^ &&lCCrr||//A44d44d11b11a55`..ga ee{.X44d44d11b11a33c11f00bm~22Ԏ~~%%;q 44d44d11b11a33c00g..g//h""agN""w00HHTTSSDD,,k 8K (  @  %t k   $$IVQw}t}ye_1/V t/MIҿȶnfA 8!D> G"eyML'*-,S/+))YZ31b\Wƴ34cckkVV33MMccqq45_[znep-E}]\ jaZkddd TO!#kk{p1/iOWTل@:_1[*d`uu))ZZ88qPPWWBC,,[((]Y,,OO5533PP:9;++\++X`O mm**8++\++Z++ag%%pWWځff((T()Z*+b*+b76hGErZV|f`kdkega\W|JGt77j+,c*+c))\; a7 YB+,_+,c98l]W|ʹϽѿҿϽ˺b\=`Y/0d [**Vh*+kC>&&AA2-22k:n**\65tϼϼCBYYNNXX  II``?? 64оѼѿ̹HEy!"J{%)*aMIͻʶ̻NN22RRslc&d D33PP:;Ǵ̹f`#$U*''d`Zнɵ  h ( Xʸɶyp"$[+&'gibѽɷ k4bccξǴ{$%a+%&gjcл˹oo zm NNǴĿ}$%a(%&fc\̸ν55\[iȵþv !]x$&(dSNȴ##L`}Qɷҿoh Vi+,b{97~//Pu&ub˸ʸUQJU/0bC**vSSiL s22λ86z9<44e $&kyo,E*Hyyӿ))o!*+cp86ô:: X1+\ y))ͺXROC 11` pz&&55## A gXWd> ~!!UU>>yy$%s% +,cs86Ƚ%%HH-- [IHW }11aaLLPKQ5 44d"#iRO##\\zzUU==::OOqqMM00tmd V11b &&qXTGE}} HH``KJTO++u411`2u;;TT**44~@22b>%%vyy4400PP$$tt&& z""F33b$))o==QQ $$m ?l33f--h&&`.8 11e)))lOOnn##c!!FT 11e'h}|99__kkCC##~_##KO //h ((e:gpnz!!$$$$##zla VTA qlandkartegt-1.7.5/nsi/logo_big.bmp000644 001750 000144 00001243566 12225261330 020265 0ustar00oeichlerusers000000 000000 BMvG6(@G$FHP?KOWhkQUZøɹ˧uRdk¢ĬıɪĭʫʫʫʫʫʪɪɦŬ˭̨ǦŪɫʦǛŸšǦʩ̨̭ͪͩǣ ¨éīƮɱ̱̮ɱ̯ʮɯʱ̲ͰˮɬɦŤũǬȩǮʫȬǩīĩĬūƮ˲ϹԹڱ~;HJݾھ߳лm $43sѰФ3EFdzʫªɪůʧ¨äűάưz   !}}ȱǥŪåǹжͪ¬¤ͦ ׼̿o/.0BAڿܾڿ۵ϳͺٽѽѿތZ]ektxQ`cHKPɪWgn«Ŧ¤åħƨǪɫʡƩȦťĪɭ̨ɟÝàƣɦʥɤǤǭ̦şĪŭȰ˱̱̳ζѵЯʨæŮɯʭʪˤǣĢŨɩ̨̫ɬ˪ʫɪʭ˭̱αХȰզȹ׽HTZ ޽޻ܺغH^\ !tִ÷ƭŠ01ŭȨ䩓±}N`gpyaouGSWFRV $ HQTϫϟ÷̴ɩǮcut ܠԿm ޽ڽؽlr׫ϼɗkz}nty! :BI[kr©ģ¦ŨǩȩȬ˩Ȥã¥ģ›ƞğŤʥɠĝ¨ǣžªƫǪƯʯʲ͵гΰ˵оٴϬǣƬǩƬΨ̦ʩͬЯҭЫΩʩʩʫ̭ͱѴԳգɟǢƽ޹ٕܻdzx 64~۵ɨ©̴ASTİ˫ƦȰˬŬŦíƣdžn̰ƼұŰĨɠajm ŷǤˬȳƨǵȾ);:10ݿ޿޾޷葮d~ܼпڀuݽڽڿ'76򏧥Ӵ̽禳Ǯs~LPUpz˾ү\nuèţ¥ĦŲѰϩȡƜžĤʥɝǤàŪƮɬǮɰˬǨð˾ٯʨãĬǨâʨʩʭαұҮϫʪɪɪȬʮ̱ϴѱҰզͯҰ%17),3EFޥ̰ȷϦļդ9JMȨĥϷӯʮɪæĭƱ˨ŨŦçŦƪѷɵǯʏ_jn̮¨űëǻ̦('m߿޿޾߾߿޿4OL߶վd|z׼ؽݼr݀oyy''ҟ;JMgz}ɫ=FJftz̲ȴ\ovŨ®ȣƦŤâ¤éȦŠơęɥɜɧơ塸ӪŦĮɮɦäçƬɰͰͫȧìȫǫǬǭȰ˲ͱ̮ϟϫȹԯطɴFUWCUVǃdxy2AC5DFεͳˬƧִسȲŬ6GJͪƣ˰̣ǫİȪũīġƟ¬ƨ¯ȤİƤȝçĩƬĭïŰī؛%76߾߼ݽܾ˹̰42 ߸ҺݽߺԽٺݽݮʺֹջܺԻxAQPYkj4B@4<;?GGLTTAIP4?C,/Ȭ}ålǯ̭ʩİ˩ȟĭ̥ĢɯήͥĞŧơƧͨΞěàÜǦţ¢ǰ˨ß§¥ŮɤIJ˰ȮƯdz˰ƭïŲȳȯīȮɱʰɲɷھo~ '53v'(  +-.9=]hlϿմͰɰ˿ܴڼӺнѭ9JMبĭǯɭǠϱˬƬůȰɮǫIJδѰˤĮȬƳ˯Ǭīíïî¬ͱɮƭƭȬǦ¯űűŷƳ]ml(=;ܺК^po !uּݵ۽ټػ׺ֺ׸վݷֵںM]\'&%32 ~_travtm~$$Վ ;CJǾҰԫ)59rҭȦñnƩȨǨŲϧƠȲѩȥĪɫʮͩȥĥĩȪɦşŧͨΡǟášĞġťŪŤ©ĩħ¥­ȳͮŨıǮĬٰîź˽˻Б$!7FHzøָήǮǮɵҬǸѱʴʷͬ>ORܻթéçȭǮȫŪĭDz̳ϴΰ̮˲ϱ̩Ĩ®ȰʬƳ˰ȭŮƱdzɳɲȯȬǬǬɮ˫ʦáɦéĴ͹е̱dzε-,Vki۹ӹXhg fxwھڽټغֹոԸԷԯ̲ܷݷԺ޾brq('&%r뭿GWV?IIKPQcipЉYeirՓ ):=ԵΧ¶ӯtɤţħƳҧƣ®͵ԭ̨Ǫɨǭ̭̭̭̬ˬ˫ʨɡŦ̩ϥˣǤȣơĤÞ©ťǨç¨æŬǫƩĦ¬Dz̲ɭIJįİòîĶȪȽ˘(%$355BDεԺʱűDz˲˰˰˦ʫIJȷͱO^aϵͫèǸҪǩƨŪǯ̰ϳгШŮɰˮɰʳͱˬƲ˰ɮǰɴ˸ϸϷήɬʭˬ̨̭ɢÝȦæŲȲȯĮԮ ܽoyy烑u#"Sedټؼػ׺ֹոԷӽپڸةƿ޶7ED|=II=IIӾy07:"-47RX_RX_+48+6:6EH¾P\` gx{բȬɪ}vͥƤåıΪɧƯγҪɨǬ˩ȩȭ̰ϰϬ˫ʬ˭ΣǦ̪Щϧ˥ɥȤǩȢŭɨ̦ëƧ¢±̪ŪũĨç¨éĬƮũðưƳɹͮ¬ĪЛ3<9p֦x_np )+ѿͫиʴƴȷͷήǥȨȫµ˼зbqt¯îĮƢôΰͬɨţĤŦʫϯУëƯʳʹίɪij̰ɮǯȳʷηγ̶ҲЯͪʧƢáǩƨçȷʶw apr(44Ͼs/.Pbaھڿ۾ڽټغֹշӻ׹ݶҼm~9GFQ_^]kjؼͷ.::bllR[^!*-14<(+3Ydh#$(ͧ¦‚bzШǦäƭ̪ɮͬˣ§ƯάˤêɯίΪɨǪɬͦʦ̩ϪЩͥɥȧʯΨǢ«ǮʪƥĮɬǨëƳάǭȯʰ˱̯ʬǩĮȪĪĮȯɮDZʸЯǯǭŬ«îĭħ^lk %&'(')APRǹԱ̸̶̴ʲʱʰɬŧ®ǩ®Ǫ´̺иn}÷˩̫ʢÛȩѲ֥ĥǰʰʫŨ²ͮɫƪŭƮǭƫĴбͫǤ¡¨ŢƴɱĬ#--P`_}/=<=߂P\\#--]gg"+.򖢤ëpv{ܟBKOĤK^e̩ĨåʨǫʦŝįΫʢǬ˭̩ȦŧƧȫϧͨΪШ̣ǤǪͯΫʦťĩūǫǪƥïʯʫƭȲͲͲͳζѸӶѲͮɲѮήΰЭ̨ǩƯ̰Ͱͯ˭ɪƫǮʱʹα˯ɮȱ˳ͳ̳̪¹ѵ˴ʶ̮ijةpdvwdvwsԦԲů¯«ëĮƮǭƫĩ¨ĩĦɲȱo~̰ĨţĞšœŤϯڹЩĤìƫũéòͭȩħ¨ĩæůʬéù̾Ͼaii޼ܘݯ¬ezx8NLwv+)%$v ,+bwu^jj$..Ycc+55BNP ΨLPU,27"AEJë2DK¤éȤÜĭ̦ťĨǫʬ˫ʨǦţįӨΧͨΦʠģƫΦŧƦŤå«ǯ˲ͫƨëƭȫƬǰ˵б̮ɮɱ̴ϳΰϯѭѯӲ֭ѦʧɬίаѯЬͩȩȭ̲ѦɣƢäŪǯʯʮɭǫڮʬǺתdz̶̽ӾӾӻж˲ŮïĴɶ˶˷̴ݿڼչҶϱʪ¤ǰƲȪ˯ŭqîïïǧƦ̦ϧҩذ߸Φ¨§ìȰˬǧ¦ɪp}FRRMWWaiickk[ccܽԽۺc~{DZX6DCiuuAWU!!LVV -/>MO #+"%-[afAGL /2:ȨƤÍ$4;¦ǧğĭʣǫȭʮ˯̬ɩƤôխΪ˫̦Ǡî͝¤ƴ;ر̧§«ŪĬƯɴέǥǯʮ˨ʩͮҳװԪΫͲԯЮѯЪͦɦǫΰӫΨ˦ɫ̲϶ӸӷҷҾحʮʪȝʱάúϽҴɳʻҷΪĭijʯǵٺ޶ҩŧðʸҹӷеζϷЮƸѰȬsǻʨͲͣĨ̯ذ߭ۨƥ§§İ˯ʩƥ¤¨ìŨ¡ƣWdf&&pvuhjjٻ׾d|,<;/, 虥$..*44my{ эLW_oy(.3',5ظҜŧ£;JSŢİʭǦŬƥ§ŧéŧƘíĥǩŤ§âʴѬɦèūȮ˧ƦçƯεӳ԰Ыɯͱϲί˰̶Ҽرͼ׵ѯʴϫȦòܽԲ˭ƯʳγгЬɱαίʳλԾ׼׷ӵҳгзֹػڼٽۭȸҵв̶zѶ̲ɲɴʹкٲֶ߲䨽ߡ¤ƫçǟƵ˴̧ØƠ1BE"$VXXMNLtؿؿڿwUca7HD"30ڤITXcnrq}XdnMX\'-2 %+6ʭʡĮɫFU^ƣǦťĮʭǨĤ©åʴǩçãǧƮȮȫťéǫɫɭȮɯʮɭȯʲ͵ЫƵб̬DZ̬Ǩò͹ԴϬɨŨŪǫˬ̫˯ϱάɭʳздϷӱέʯ̷ֻںٶիȫȦõѰͭɴЊdz׸џƼ׵ѭ̱յ֩ŬİƪŤğ®Ưǚȉc{ lpqjjj732ٿվ׿սӾ׿ֿٸֶּ햡%0-q{'#Ч?HLz_ku!.6+6:آ'-8¦Ť˳ZirʣǥĨǬɭ˭ʫɩƧŦÞ¥ħžã©Īæ˲˫ĠªƬȩŨĨīǬȬȬȤȫǩūǩŧîʯˮʬȩťåèƪȬɯ̮˨ũ®ǮǫĵήǪîǷѼֹӳͳͭǴνֱˮDZʘ׮ıǻҴϬ˰ԵЪñưƴ̪šĪʡÙʥƗ$6=,3gmrNRShfe  ڿ׽վݾؿٿڽ׻ռ־ؿٽ׺Թ׿ڑ޿׻szw=HEֆ #,/ǻtn{ouz( &1©àʣǷn}ФΫ̫ͬͮΪ̩ȢĝauBP*4!  ",6AQ\r{¦Üíƪĭ}kxȨëģʰǣ©ǧţîʪƦ¢ĪƨĤèħæ£éƪǫȩŤ¤¦ĨƧīȩƣªæëñȳʳʳʰǫķзЩ­ƬŖѱƫİŭƵҬвܷ柽柾ީĪ˿ծƢĨǣ£©ȰЫ˥Ĺأ bmu(.3suvtttܾڽٽٿݾݿ޾߿ݼۼۿ޾ݽܺز⛰5IJ !۵ѯͯ傇:A>뀍 LUX uϥ_jn jpu#%/ʡɢƸzШ­ɥĭϪЬЪЭШ΁BR               "N_ƥʍ(0,@(79ֹݽ؁QWV,52确{FF=CB&$ۿ޿{*,Ƚɾʴ%'ӞctqN_[eytս dpr·n}Q^f6@Gu{Ybf .:@M[a.4EU[ґwTb                                8;hws+<8޽4CF!-/ֲdsv|BLSnwzGҳ̧̦ᕥ"lzT`xغMbxᠵĪɥ|&0 ,0btᡸئ߭蚶Եќ²ѭƝ{~  (tzö͝ü˹ƹ[a`BJJ#56WdfDz)+s`nmWdb7EAguq꫿,A>%"ept м]loӹȕ”:ILٹҶӾy++8Fcp~̵͹ѲʶS`p )epR\tr{ThԯϬɹЮS_a  .7@;DM2ϲ᣸׸گܞĬɭŶԩ /04ţɦɸȴҋCHI멻)+ũ%46Veg޴ tzy6=:ϩ2@>'53frt䛡'*kz|Ӥx~"Obgfpw !(AGN ح&,-;A                                    v osyǪƣ"* -5FS[zƠŦã̝ǩƦçĥ¤̳Ю˯̵Դ֩ʹԹ֯ȹۤ$062FXESeZgw;HVӻӽեлտ1=O}`i!BSnͬմشԴ~ ӂ|ߟ՞԰ܣŦӐ*52ѿѪƲ̵ϻԹϲijӬ)-.ҾҺХvsuwxxuqogyxs?NP)+bqsETVCRT,9;APR%' 1@BM_`CUV4FG=NQ4EHP\^  $% 897wzxGNKKTQ$"R][\adTW\15:=IK U n             6&'-8?@@@JKI6;9-41Ya`RWZILQR[^crtιWbfMSXstpv{ uy~MY] _n           C !#$(*%),',/(.0).1(-0',/&+-#-(M{             ΰǦŜͻҵ?HQ ŷɞÙĝĥªƦ¥ƬȫǬȭˣĥƧĢŹ_hq_isiyӶνػϷ˧~3@Nan~IUmګɴͩEOVw}`et+3=UEQmXf}ftAK\7AK?GN$+. *44UacwbnngutWdfSbdn~yv´¬'//|DQS(*Vbd jvxzLTTacdwww%(&t|{sx{%(,W`ccrtkvz>JLUjlԪHKPʼɸr~!$m         I #&*.3/5928>;CH=EKAIOCLRDMSBKPAJN?HL=EI7=A.36Q          A $  biqñͪʞƿ@EN!&/Şèá®ɧ›ı̴ϱϳԤŦëĨî]fo(5̇>NeӸ㬹ݝpft]jzLXj0EKbMTh,4EW_lW^g  ),q{{cnlr~~ÔW]t$= 3R]snx#)6  LSV奴ЭξѸιϷк̺˹^hhn|{־޻ܼ۾󦯲 rŶ̧_fi+79YfhuUZ[#*',52bmj_lj*(݂|ixzƠƗFNU\gkatw!%*"%-è`pq         ( $(,+153:@DLSKT[LV^WbjZfn_ktanw`mu\irYfmWbkT`fQZaNV[AGL5K=        JMQ`djpu|^emR[e̢қīȮɵϨ՞ ɪǤãƠȪ¡ò˪ġŪǣï̱Ϫǻڞ̮^eh_chFLS 3JV(0Wfh^nmUed #JOdjn+1H *;#1|Եѫ 栭ÃGTn.7Knv˻ѹڱţfqu7BF9CJQ\`bnp:GI+* ",,臎%(^jlЭĦՠѴ`gjT`b5FIcprS]]䰻v4BAHXWKZ\!,09BFIJfuwϯ)3: ĥcu        !!*/24;??GMLV\Wai]hpfrzp}o|vzxwyzvtit{^hnU]cCWO        1G:V^ct~͵Ӯϧȣijҹֹ՟hq~HQ^Ҩ˺שʧʱ֯Һ׫÷͵ȵԴɮƜwqn|{mspwhrchq(*4 88>TUYlkmTUYhlq{?IZ ) -elu֧ 3==2>@]fsԅ8!>BMkYNavϱŵȩǡťǪѺ䑨ն妲á]b`.43=BC,12  ! )./  3<9gpmxݸܿٿ&),59ڷ˹ѫƧħĵҧ©FRT7DF0CH=NQ.=@Sci~oTdj(8>ɩ[mlȫŦowt}|ʩ,9A%-ΫHV       B "%,14?FJOX]_iokw~r~u|vozepvHR0?HNbm.CRAVkOc|aoU]j -/:9:D%&*}햠-;N.AHY"sx*22U_f  :AUHJb ,ho⠳أܪޣΫǰū˥ȟĤͪڭ啲٧좬.23:?B3788=>`de~aih]hfؿԶڿٿܽ ^gk˽ڦªȤĺةĴͮĸhuww% s}$*ݶ̭½`rqjx[dqksmvvԫ3>F ny2<       !#-25?FJQZ_dovt{ykv}      i5;>QY^q{ȭǤťwaku9CM%/9LV`GQ[GS]Vgpk|mezezps~ܬҴ߻ܵ籾䲾'"4kxŽdmp!! "$"(*7_mn~%5R'^oǾ&7*29ڬ8CQ.3L⧼ש̯DZǫ˦ǡŸțȥۭ頼ߤ,6@žͳȶêűu~((֫ܿ뫸 R[_DzȶϩşǸ֠Ȩū"$q~ޛ)8; #;JM} ʣi{zɟ;IUȹ̽ы3@HDQYׄ  Ș")      R!+/2>EIV_eht{w}SQٿھؽݴ䡮 MVZƭɝʰΟBOQ9FH篻2?A!-/8EGͰl|ە?MYӦgt|)4<$X_henwР      /$(*4:>JSXgsyʩƟ¡ħĭʩţU}h       )03CNP^hmky{γŶŤ)26Ӳԫé©ǷИӟȏ˜[q)HbդϨͰˮŽоеɼվߊ]sg}顷۬ڿܹҺڬ¦clyfp櫾ߣ頺⥼ܳ޼׹ӴϨǡǻչسֳگܦڨܫO_* 3hvƫȱέʥ§¨ñڦǥIJƷu s(@@Ҵμؼ۾ݿۼغֹսݼָ\hj ²ʨªƩǦħ¥Ȣjwy1==ѾKWW$..Ũ¾^qnΦ&2>>GTWbjwό=DMͦ       !+02@HL]gm|ķԷӫȢԶӪǕ|xs;MX@R]K]hWhs`q{cs}Uqk       %'(>CDW]_{ðĪ>IM!%AJNCLP2;?Zeiơƞ› 38 (0 ':Xo蘲׷ޘ¸ھڮĻέٷָۭ钬У쟲ݺ٬ѵԳέƱتìjt~S]n碻塾띻ퟹީ߯ڬЬˮ̰ͮ˰ɽֳϩȯ԰׬׵q *cpڴݽѷܟīγֳԩʢíʮȰʫij̳ɷv  ܾڽݿ bkn֬ V_byx.::%(.::4>>+77 $$ĥλ˻Oc^ѩ3?I &1(.9lu~˪05>Ư        #%4:=QY^kv}zpufxfx_q|SepN`kTfq\ny^p{z      "$%7;=NUXnw{ϩȤfpw5?FAKR8BI NX_İŒƤÖ`koQahrju觾樼㧺՟ĜĮŮêúغܖŎΖߟ֦ʫ˶Ѳͳ˧y\jvޥ٪衿⥿ݩѩ˭̱ϳίȱʪĢîͱӰ*D+GէҫѭаӰѩʧȭ̱ͳͭǯDZɲȼt"%꠸!;;困CWX'35÷ǞŏBNR $ )-:GIXcg`moEQS0=?P\^ɚϸǹSh`ǤFOY  %-4=FdmvĴIJ#49B       %#%4:>LU[TahO^gAQ[5FP:LWTfqbtgyäƫȨŪǵҿ߷ԹֶֹӮˢ       !#168RY\pzôΟ˖Ծӫɴit|&%-Wcm`m}˦>FWPVc|":EI˳棺윲橿魯昫ĴdzƧ´ԵᢽޜƤǮ͙ĬwRaj᩿ۥݜֱҮ̬ȷЯȱɰȪô͸ө-ET#.)18ŴԸ⣼ߤ㦻۰ݨ̙ȰÞ˭ʬץ뙷맿훴޽՝š{JZ`߮ݟݝ攵㘶碿۴ٮή˫ų̩´ʪԛ$4@/ئ֣ӷ碽ѡͣƢªǯȮŬ 䏝 K_`s򋠡%& "#*>? yөóɮǮȦͯǯǥóǪĪƩéêĪĪê÷Щڽӱıƽkwȥøίz{qx',5eluT[d      X(,.CJNblrŮˮˬɩƨť¢ƫȪǬɰͪǴѵҪǥ]m        ",14IQVgsyŮͩʣǫΰԯҭѭЩ͢ůѲөɥijѵҳл؂|Ƽݯ͠ûͫî͵ݭ衻㜸珪ܥ䒪ΧĤϸРדΦ쌪Ӡ蝷綠祿ܛĆ>MPԵߣܨաصۭ˨ŠƑLY[%!*{٭ܡћͭݜˣͣ㬬IJ 𦸷H\]nPgiꉡ4IJEI[djuæã«ȭʫȩƬɮˬɨģ'/       { ^:QG_krxĭЬΡǮҵ۱ժҪЩѥ˘ ĤƳյմԷ٥̪ԭرܹݫέ˼ֱȣ˨ѣԭ枿ݟ뛺畲ߠѬϬ˭̨ƦűУʦعدЙ·НHWYʬѭޤݤ秽ղᤴŮƠ eqw̯ѹ᥽Ӧְ֦ˣˡ۳gtr3B>ѺܱͧŷͶͩ²˯Ȟì±ƥĥǩɨʨǤŦäÜǾٸӺӽpzUelmxahqzƺڞ S]       V8>BS\bo{ßæÞǥ§ĭʪt           !)_~q}ĦǞεױӨ̥˧̦̦ͧͦʣǥǢğ̪ڬ߬ܦҤʹآӨ̢ϴܦ鉩ғڨ㗲עݨݰݠǪͯϨȰγҰԪӯݸֵߣݭ螴ϡqӤĴܝ̥ٲ离ۍvƛLZly£ѣ%24ۧ£˙ƪڪױޟɡŢ·۸ěUc]/=9)73չ۬Ѽ^km),o~ʲƻүƳʮǝì²ǥɧȣ«ɹԼڼֹѳ˸λmw#39ɹȹĬřͥ'2:dmv{        +H3NV[it{èŨŨşħĠȣȠ             HZNWeցۦŦΝɦӝǪӞƟªħµˬ˽к˾Թ_oh+%hvr߾KZ]ƹ΢ðǢƫž«ĬDzɲڿӷ̶ɵɸʹȻg~p)9?"(̮̞æɆ ^ip        3Z=Ycip|§ĩŬɯ̝¤§Ħâʤ$,               )1w¨äš¡ƧƩЗØɡٛؑ̔ʚǦ߯Ű۫ˣɳ飶ܨߴ禼ժҚųͣk~9KVDVg ARny %ɘӜҭϳبЮ֢ɲإȟȫȪŨç§«ŮȬƭǺӶϯȰɯȺϸŸº̓1?;ٿ׽ӼKZ]8FL­¦Ǧ§ƯůťӾѷɾϽ̻ʺȹǹŹŹĶ;bykr$06+.6̮ȯȝȯU`h BL         -x5hwywĮˠƫǨħèŭʦt                  4;t~äŤīĞјɫࣹҭϸѱİ׹݁:Ngfxy7Ck6Ci;Giiv!1}"/7LYa/@=(>lx>]k+A9EWɥ,}Xfe¾cru  εer7DTբÍ&-A+1Dԝ"$ޠΪ̱ԨεۭѷۧȤïϬ̩ɨȫʮͰϰϤ٭˭ˮҷ˾ƽśBPL!1==dqs޾)/wβǦƤưŰȼ˼ɱƽ˿ºø˼`whĺЏ.8?=BKȱ͢žȺε1?D          <%$\so                                                FPS_krvţƥțťȢţƨ˦ɤȢɐĖأ杺ߗҴ䁚"\aj]afJT-7>r}Ϋ}FPZFQeTbyꛫРלֱۧʴЖ.=@.@A̫ʥĪɯ̬ǭdz˧ԾѻʹǰêįȯȪػιտۻ띱@SP)<91DA$!.A>l|Лʋ|Ḷ̌izw ȺԼйϺӼ׷ӭȬŪ±DzDZĶȿѹȹƺƺƼĻúĿǹ\leƛakur{JRY06;mtwPUXAFGLT[JU                                  P ? m         ).0BJN^jpy¨ɪ˫̪˧ȦǧȨɩȯ˼ڲԝŝͤܤ䛴ֳ矲 n{} 6uۭ*N,;[,Ofv7HQUel˷yz׮׹蝰ѓ˕Ϫ⛹Ҿjyըҧl|䥸ݨ蟹ݬޤϧǿu˪Ɵɯʲ̯š½ниʸʽгƩȴʹͤǻϺͻҿ͸ƲϾӟɭBTM %%  1-GVR+( # ('ʼֽϻ͸˷˷Ϲѵΰɱȫŷ˸ʸʻ̽ʽʽɽɿǿǿƾƿǿȾbtm@QZẈ̂!*1:)18=ELՠ"%) $)7=AMS[=L                                S , z        !%':@DV`esǫʩȨǩȨǧƧƩɥŭϭΪͪңѠת礸6HY1@IֵŻ˷Sdg4DKTdpcsʈuzxϗ˥ܬ&/Uhpݣҧ۵ꤼ闷ܷۙ}ŏɸαȟ{Zo~6Jʱ夽嚶ߕ٦צq ĭƢ­ʫȪĩƼϸʵǷɼϲŧű˱ˣ»ξѹ˻лɴµεºڋk|qӱoxkys̗yyǽϽ̻;չѱɯǸտҾпοοͿ̾nyJ[d()8A΄*2R[dNX_zCIN|"(-@HNOW_}Ey\                              : !%&(-.,24):0      m "$8=AR\an{ũȤáŧƤäçǜ̴ҹֱҜřͫ椷⦺ᛰܫ١註ִޮҳ֕+@H,7§γᠸ֑ϩ䛽蘻󉟱ѬʺӯǦĝϬעծ䠺⡸ؿ߈ɪï˱Χğøʺ̷ɷɺ̶ɰçêĥϿҵǶѸеͳƽٷǼǾּƳŴϾͰùʡشûʽ̹ȸȽпطͯŮĸվҼλϿο;vٖ $YeoΝZgoLZ`AOUBPV)5;3?Eɡ;EL#GRYpLkl!                          i  "$*/15<>?GIEMP@SJ      K!#7<@QY^jv}ĦÝèţũͰҭʩ¤ɩب->Q.>KͽТʴ̡׭޴딮ҥޫ޸{e{q颻ϲ杸ڰ얷ݐذѹ֤êijҦɹ㗱ɴ훵ݟ쓴⢽頺޴܉ ʪɳϫɤӿѹ˹ʾҶȴǰūëŨ̽й˺Ͼ͹νɬ˳ƷɿóƷ̿ſſͿ˾ʵ´ìаǿİȾȾ·ĴľͰĨÿʻи̶ȵŻ˻˻ɺȻǼȾʿѽs˷&2<:FPǫ\ls#*$*ȳbrxųǼEQWERZftybtRc{/dH                     j -  %)+179?FILUXWad]hk=xG     #"%9>BPY^gsz~ġ™ĠʱΠƓĚԭ왮ԂI]vN\hO_fʳ̢¯ӵ᝴γ盲߫ܱ윱ਾ߬˫Ϙާߤ㜸᜹枽ꙺ眺{˶ب°ȧԡ³ۤћ̨ߪެ䌛 ƳȣͳѲֺͫ˽ػͽϼϷ̯ǬŮDZ˪ñŶʻϾҾϹʻʼȹżͻDzȼӲǸϻ˽ȻȻؿЮʧش÷ưȾȼɻ̾dzŭIJǻϿӼкʻ˷ǷǷŶķøĺƻչo|)5?=ISǗEX]hzݳcu|gyɬï+3&.S_eap|Ҋvg|TfCQg+T@p                v J !&)+25;CGHQVU`dhvzqs)1     p #'*8>CPY_iu|¡į̯̥˜§ƣ˦ʕЗ~qĠʠЧ࠶ߛ棿좾ޫЧǪDzεЮ̦ǨШت榿飾ꢿꦽさ䡸ǯΰɴ̫ìŭɭϭկܮᒱިޡ{ή´άɭȲ߼ѿонкϷͲʮǫĦǶ̱ŲƿضͼνǼŽȺҾ̼˻̲û͹̶˶˷ͷ͵˲Ȯĩóµøķõͽ̼̾¯òƳż̷ǰҼʷŴ´ϼȷˮûYnf&0EQ[ƪȜyew~ɪ¼Ѡ  09Bgovep}ҍǀxlYlHVnB6:=5:<068)/2+15.49-3906>06A3;I8AQ=GZDQdJYmSfy]smwgswW_fMTZMSZV_ekv~~Ǫɬ˩ȪɨǤáǬ͡ĥʩ̪ͩʭɮ˧Ȥ͖ǐɟ٤ߤګ۞Ȣȥɧ˧ˣɡʞ˫ݦޢᢾ袻߭ݫԩǧŦ̥Ԩڪ䦺tlީΤçëîŭǮʯήϫԥ헴ۚޤ㥻޳/?V$6Ϡ֥ɠھѶȺ˾ϷƺɾѿѻͶɲƷͮƯŶ̶̰ƳȽԼѽշ׼ҺкؼҮıdzɰƫòֿѽ̾ɻĻμȼͺļƶǽŹƽ̺з_mg4AINYaʮɪŢ.4? ikuLR]٧՗ΎˋΊ̓{/M+0Qٍ˴嗥bdk ğ˞՘ڑߎ㍰傦م՗ܤߝϖǞƙ¦æå¢ƣȞǧʦǥƦŨūǫǫŧʤצ߫ߧ֡ɟǦèɪѫګߩ䦼槾ݨڧԨϫήήͬ˪ɩɫͮ٘Xk잸擰ݙ۩ήͷмӷЯȪũɩϥҤצެVi >᤼Ш΢éƦī˪̩ʧƤèŲνؾӾӸӴԭͪɯθֹ׵Эưȶ˾νɹźǸźɿκȺȿ̿ɿǽļüü¿ȿ¨˦˕Ѿȸ̿PXN.3*۵ºȫ÷ɼ³Ϳ˽öʺοǼftiTdj-3ϥƸͲάҨۥۨ                                         ʖæåäƦ̠ɚ¤ɢŞŸ£ĤğƧ̛ĥƤŢâĬɯ̮ʧʝͤڮڡ˞§ư͠ĤʦҨ٩⩿菉주褾ߪޫۤΫбҮΨţéʰכTh㝸䗴ᖳ⨾ЪʵϹдʮƩĩȪΨӧاݩ䭿虬 .̜Ω̧ʧƨǫɯ̳۽ؽڹִгϹպֹҵε̸οѽ˾;Ѿƾسìв˰˛Κ֜Vg^1>6ʸ¾˰ȾɿŴ²ʾķǻ_mbN^d$4:Ȧ̼ѰʤȤդ㟿                                         ¦ȩͪТ˝ĢɠơŞġßâĢĥǨʩˣŝǬΡġ¡ŸŨɦǢâŮ˰ͭɥǞ˥֭ݬۨӧͪΰҢŢ˦өۨ륾西ܝʡʧʦƤ¢ƮОQeן✹昵✷ګϯ̮ũ©©Ȫ̩Ѫ֨٧ާ-@e0Cdߩֶ៳ūЪΦȣťǪ˯̮ʬ־ҾҿӿٷгηѸҶиҷϸξҿ˺׿ҷα̢ŰίͶ϶ιq'<4Ykd̻ͺǶŻ˳úʷƷĽʻƵźǿ½Xh][kq'-ɶ̩ĞŸРߞ䡾㉗                                         p~Ƭϭѧ͡ş£ƩʤǠÜƩ̦ɪˬͧȡŭΩ̧̩ʤš¤êɰϪɧƦŨǮˮ˫ǣàʠͣҦի٬٪ԨϦȣĢâáǤΦԤܣ憎즽㦽ݠѝȞ ¦¡ơPc~͞ࡾ뛷書嘴ݩةʢêƫȬͫѩԦף׼Ug#պ眯ĥʣšŬ˲ͰʬźѾӿѻ̺ɶǾԸγʵʹͱʷзημڽӷͷλִм۳ҨƲͩK`^0EBֻܵӸʿѷɾмͼͽͽ^ofƳàСޢ昵ܦfy(=                                         N]obq{~̭ΧȢÝŬΩˠÛŨΣȧ̩ΧʢĠ¤ŨʩέѯѬ˦ŧĬɲϧƩȫʫʭʫȩŧţǜƜȠШ٫ުأЪѧ̧ȤƤǦ̦Хףߢ碌袹ߩߤҟȡĦŦŸUh}Ɲܥ웷暸琭ڤߨʝīŪĪǫ˩ͦϡв暭'L6Hmڦج۩֢ǡíȱ˰ɭIJǹѿ̺Ƶü˾лεȳȵ˱ɫIJʳ˶̸ͻпԿض̻˟ubx~K_d%'(<=ЫյǽϹɹ;й˿ѾϿfyp'-Yio¢¦ǡΞע⤿n '+7N                                         4?NFSdcrrƫƤȩɢŞÜŝƝǟȢˤˡɟǞĞģɬҳ׳Ӯ˨Ĩīţīʬ˪ɩƫȭʧȤɤΥթݫޫתӪͪ˪̫Ϋѩ֧릻ݪ֪Щʨť]oÝإ虵䘶疴㟻ਿϥ¥ŭêèȤɠˣԲ揣#H-PL_ε⣸Ǥìîî½ʽƺƻɺʸɴƶ˹ϴʪIJDzǰŴȾ˼ϾͳŹ˹ۆRfkӴƺԱ±ú˶ƽͼ˾dwn(8?,SK.5ˬž«ɭ˭Ǫ¬ɯҨמҝӃmy                                         $(1?CObapHU] !%o~̲׮إԪޭ奷৺嘲痲͕äøѵ\bo  ǥƣĪˠȥ˥়֦椻袼ܫѨʣ¤ȫզء٢ޤ榾짾磼ا̨ʳаnѡӛ٠埼랸ݟխܳ٪̱ɺιϰƪïͱԮ֤Ѡаv(=Xϛȟ˟ɤ̝šȞ ġãħĭɼ޶ѷҳЮ̧ŤæŰͶӝ­Ʃ±Į˽ŻѿѾĿĿǹʼĽȽɿŻĻŹŹŶøŷƭпηŶ­ƸĵôξʾʫŷɾϤϼdz»M_X;KR0@GͻњʪʫêƳӬ֢ҧؓ"<5AZ                                         !'/<@L_aoAN[ BNX*6erЯڱ媻⧹⤻雳ᖰߗᏬٜ٣ʗz} n~ȣƢťǞťàУߥ项皵ښŦʩȤƬҦҢӠ֣ߥ祽륽륽룻奼ۥѥ̪˪»vΠ͝ӝۦ꠾롻㚲֩ߵ媽ұζжѯ̩Ȩ˦΢ͩעԬt/F`ݡըܩݮ⤹ا٦֫۬٪ըӪԵݼݫҭӨΡǙ¦̮Қ¦ťç«ĮƮİüһƷοżֿѾо̿ǿ̾ùʷǫQ[e#-4AIr޽̸ͯƷѿȺIJ̾ĺ˸̸ӵQb^s =MSƥũɮƫˮӨ՛ʢ\k5cnfqT]m3:B##&            &.;AL_fr\h{"an~נ5H]!"?BOowֳ杶ڰ鱹|}" hny̨’Þɦ̤ি鞸擰ݦݙȠǪʪǫǦȣɢ̤Ӧܨ㦿礽駿砸⤼ާף͡ş|̥ʥҢ֩鞺㚴ܧܬЬΪ̤ɟǜȚȗɬߨܤج⩾AWs^t㧼ܧܮ᥻ףդӤӠϛ˗ǙǛȣϦШЦ̥ȤŦƩƨȾҽ˹ĺľƼѿ̿dzò±ûͿǼgqx#-)%2Bm|_ruĭұŹͽ÷οƸ´óþвöЫJYU/58HN˞ɳʮ§ͫ՚Ɵɤ\j"9!+26,25+14(.0,12,11,12-24+05(-4(.7(/:'.9(-8%)4   ,/3+.2+/3-15*/3&,/       !'/;BL_^i%<)=ڬ״妼؂l{[j;Ml >4-L%8Y8Klh}ݭ㣹ݣکSQgQQ_ŧ˟ġ̣ꜹ搯ܗؚĢŭɧ ¥ȩѭۮ壽夾졻靷埸⥾ڡМĢîɄ¢ЧԦܩ蠽䗴椽餼碶ϞȚŘȚ̛Ѡעۣީ✵ծ匡1½ݣ䢻壻碸⤺䨾詿觽礻᣿ާ⡽ܟ؞֨߫ݩ٤ӠͣͧϪ˯˶Ѽ;̿̿ɻ͏4?G gt۹≛*5$5>'7=.0ͽ˿˿ͺɪѺp~zؑ%zʚŲȮǨΪҘsiyq]iw8DLP[cBMSALQHRVCMOENNIPQFMNJPSIPVAIS?HVAL]@K]AK]HQcOcuyx}uqtwu}~'7-ZdrQ\h1=I`lv~       !,1;HO^12ӥ蠾핳䞵壷椹楻奻壺੿ݠժޫߺ$-H]^z]`u)1B6FSߣɲضڱҥŷҲϫѫ٫렽ꗷ蜻훸ݦ϶غ׵ѮȪǩʬԬܩ㞸ࣽ륾靸䢿ޝѡʦȚͪǦϛۣ͟隹朷꣺꠹៶ݚ۝ڞ Cꩿ럾럻ꙵ䚶壿럸ꣽ좾蠺裾꠻癵ޞ楼ܮ߲ܤ͟ŤīDzɵǹɻ˽̽ξνͱüL`[41,AB圶ڠ䡾ꢾ㣷֦2BI -+($'$*'ISSs|LUY dqoç+7AɫŪũçĖѝŕ#3MFTsߝMYsՓʂĄljʇƋƐ‡&FMZPWb8@Iw       -0405= #.;fuͤܘ٦椻諿餽堺⠺⡻㟼ꗰڦ妹6?M$-HǯݮqTl@[od̹߰ӱҷ״ϩƥ˯޳럸ꙴ앲뚹Ҭݞįι׹׳ѯҰذ姽磻颼렾훿ެ׮ѢzףĵҨŦǢ˞ҔϘܝ嚴㜶䞹奾癯Ӯ奼ܡدHa"9_훵㟼菉좼ꣽ勵Ꜷ哯ޚ嗳ܤ윹坼ݠܤޜДªȾɲƺ4=:.972ACf{}㚷ܜ餻~÷ɼz%6- FRTݲuƨ+7CұɬƧĦäŤŢƠƞƞŰؘgw&5NȻJUs੾֟ƕĚٗޏڋ؏ܒڗמլ&8CJX_dl         >DJV`j%51F^ޞ確䧽蠼场㜹囻ޏڐٝOYk &⨻Бϳ׵׵֫˰˨Ũ̯ܲ럸Ꜷ씯蜹ጬݝ⎰ǟʩ̯Ϯͬʮ͵ٺ੼⡸培螼훿웿ܭӢzߨζբʔˠ՘ؘߨԦ홳۫颻ۧݸ5Sm㟹砺製륿죽룽좼ꣽ靷㚴⣾롽柼얳ڡ袿䠼ޥ߭ݮׯϟŪȽ5<7GNK䡿须ߪۧмƷο˿׼̡Zopʹ$0<ɽӳͭȦæèɪ˥ɢƞĚ⩺͟Û-DQkHTul}㚲¤Ƣ¤×əף盶䕲✺욷癳ߨ%7`hu       '),TX\2BV6Ke٢閲ᖴ圶䢻磾꠽電旹䘹暻蓴ᙺ衿ꥼ5Gp_g沿띰ݨꣽԟɝéɮͣŦŧˬذ椽餾휷ꢿ옶嗷՝ɣƩɫˬɭ̳շݨߠ䛹蚻옼욾ݪԞxѸԙ &^uʜؙޛ瞶옲j8`#;_*L4Mmxs%>``5W+Eiӝ蜶䣽뢼꡻韹瞸柹硻飽룽룽뤾줾쥿롻頺蝷嚵᜶䡼蠹嚳ݟܘ֩碽ߛظܷ>Qr,>]2E`/Zl}\hlyѴ¾ֲϸοξʹŷżǾɿʐF[\&2`lxܥǤħȤŞϫ˧ūȹԯȟ0cqdwRf졻˨̫Ǯǰɭʩ˪ѭٔƘѤꚸ雹ꗴ᡻㥼 %         !#(3crО㝻씵皻픳昸電욻옹ꔸ蕹闻ᒰᔮݠfuy窾ힵߩҤƣãŸÞŢΩڬ桻ߢ☱ۙޙࢽ餽џǣƫ̮̩ť¥DZۣ۫ܝޚ◵擲哱٤ޝpϢӚ ֘͢嚳垷Tj?Uy줼ॽ㋦˜ܱߖ۞砺蠺衻颼ꢼ꡻鞸朶䢼ꣽ륿죽뢼꡻靶⥾褽靶़ាګꢹ٫쟴N^@Nr%5Y - >{{ 7'8MBRc-9z޴ؼ埽ߵֱ˭Ⱦ¸ĺĺļżdž4IG³#/tҩá ̢ǦϰĤ 1L\yxC[㞺ܫݧЦǦëũƥǦ̫գΙʟ֟ޑە䞾睺㥷Ɗ        "(/juʜ۠陸돯虺윽혹ꖷ藸陻雼⨸橽敱蒲ݝ٠ơ̧ƥğã˨ԣәͧߵ塺暲ࣽ㢼̙¤¢̯Ӫդؠܞ㚶啲唯ឺ鞿qΣύ:<=Dz՚Ω랸磺꠵ @tج裿᜶䡻鞸柹砺製륿럹皴⠺製뢼ꢼꣾꦿ雴ޝ꛴tXrSm*Bf*@c+AdOdŻ#@7Ffm|rhzȽH\{DUpبѾϯŬ飽ᢾݬխDzƽ̺ñŸώ0ECЙ'0ͦ£ÙȯŲıckr $z:Tx䝻ަګѩȥ¤ãŤʧΪϢ̜ΗҔٗ䛺휻׫Ւ        LTZdp}Ȓ֒ߕ蕷읿뜼퟿횻阹皸盺癶㟹痰ܠힱާ顲㚮ޛ⡻ꙷ땶ӡũʨɨɥƥǪΧΔ|{ӷ쥼頸椽衻̩̔ạ̇Ҥۣ䣻靶蘳夾홹nФ÷kmgTOPʧƙ˩蠸ey2Dcߩ឵ۭߡꟾ뙸꠺螸栺製뤾좼Ꞹ柹磽롻颼ꤿ뢻剢zuZs0Iq"Ǚæƌ̤ɧ?EJ)3➴8Rv垾坼ݿޯӦţ¨ǩ˧ɨȪϝʙϢ⟼蔴嘹둲䕶ۘ        !/57HQWUbq|•ؠ웺횻퓴曼꠿쟼螹垹塺䛳ݮ禹ߨ윮ת砾Ρ曻왷掩Փճ覼Μ¨̫̪˫̯ѧˈez*>W'B@UuѪ주䜴ʓũʦ¨ȥģͨ٪ꤻ랸碾鍮hϣJJDuopٰ옯ܪnޮ椻휶䛹螿坻霶䜶䠺褾쥿랸棽롻颼삛:S{+SB[ܼ枯ʝƼ۰ޮߡץ웷暳ݖկ堾ѧг׵ϽٸͶ÷½ŻՠOdaˢ̘ͬİҠìFMP%Un֓٣ͣȬ̦Þ˧īˡɕŖӣꕷ➿ߨ        !*02ISZ\jwr‰ȝ圷鐮ߤ뜹ࡻ㢼؝ڮ즹܎:Kl,=^+Lw茨וᕶ璱䞻ॽѫӬϯҵֲԱӼާau)>^*AgQj˥졸ҩ֠ȟˤǰͱի֦ڭ롻颿뙹Igл٧+*&pkmlk{RWp>Poҵڝ䢾횸으ힼ뜺頽ꢼꢼꢼꢼꢼꢼꢼꞸ桻餾죽롻頺衻餿룼䥿꥿磽⠺ީ৻ڷꌘR]sGRh*8Ohw꧿ݤᛸߣ띻䝹۟רٲز̼ݽӳ梾ܲݺݻտѿʵϿ㘩La^cpx&£ҫʪʤĚʳէɧǥ§¬for _y蜻❺ឺݴݟ­ʟĠĒɝߟ떷蛼꛼       $%*03MV]ao|_pƝևʙ߫ꤿ䟹ݦت፠BQq*7Wjx,:W+Πꏯڍڗ읾晸ힺ줽ߟɚ§˭Ϭ̭Ͱѻ޴⃘CY}4Y#X} KMX?Mq*4Da׹vǝܪ꡼잻휺鞽须须须须须须须霶䞸桻頺蟹矹碼젽䠽⡾塾堼堼埻䡻VfovƟMRk:Fb᫾㢺䦽혱㘳圵砸梻ֳҹӺдǮĸ㞽䝻ެ۬϶ойȽۍJ^Y`mu@PW͢ӫŪůʮΰҶ۹߶ܶܢȬϦķӡ-;ARbnt뗴ۗܟ޷ګɩƦÞǧɜ×ĝѢ왺癹㝺ޞ֘njs~[dkCKO8>B18:>EHENQ]hnn|ߞϭᨸzUjLaI^z (br3>\+6TԷޞƭ:Ec,IΝ퟿뛽薷䕶痶떵ꞹ횴⣼ښɜũͱѱέɨƵز۰d8H^ܥƸԮĶɱ¿Էѵոޥҩݪ夾➷Ja`hu'H{ޡ矹잼ힼ휺鞼蠺蠺蠺蠺蠺蠺蠺蛵㞸栺蟹睷垸梼䟼㟼㜺㜺㜺㝺査䢻멼/LCL`ݼ(Fݬ瞷须꥾ڰԳҵʹưŽ䤿ݬԳҺѷǾ؊K`XGbңڐϣ꠿옺嗹䘸᛺᡻㢻㤸ᢸۦڮڴٷһ˿ʼȲĹ䛾柾뛸ݲڵկǵȻz@UL7CIʡĠȲԤɩѼ妼ΫЭϫʲ:MRERTь=PeӦUkSH!=VZu|m|ۜàåǦȤȔ7K       $Vsc5?E.7?5@F3?E"'7DG(1%,= ,FXuǡկOa7WfBPt&6Z׵쨻{r禽柽鞾윽ꝿꞾ隺嚹ݪԮͬäŚ̞ۓܚ뙶靶⥻ꥷܡїVdw #u¾»ťƩ˔ЭI\}hv5CZ ԗڮESoHRd険뢹颼렼뜺鞼줾줾줾줾줾줾줾줾쥿졻鞸枸梼ᚺ㚼盾꛽뚼ꚻ隹栻盵ڶ܅ &=  R`vͼ蠽야㒹ߏܒݘ⠸➸ݡٮ߸޸ӺȶƹѾ䘼碾ݱ۷ش͸λ{CXOвȲ˰ɝRelYipEU\Samjzqꦻ߬ί̭ǴN[]LTTʃ!0@ܪ-Cg ,   +7ShÞð̴ͥ$,         ' &.5ox~GRU&(Ů;BQBH[swMUr{ݨݨ=dtZkar䤶߫꠸╬ٝ㜲⣺ꦽ흶螹뢽蛹ꟿ앶䚹韽囶ؠӪԪˢţ¥˨ի㙴يϦդ4AO".4ȤȯWio~2>Z 8ɬ⤾땨'A Wbv죺꠷뢹颼뢼랺鞼Ꞹ枸梼⚺囼鞿윺隹笻Ik     (3qz)/        &z "HMPŷt~x"6Y]tㄙ!5^(BbqzEU     N" %-7xqyKR]V^g    T/68hopEIJZ^ailsә磻ٛܨ晱ߡ曳ᝳꜳ㤺ꦽ饼융皵眷靸ꝸꝸꜷ霷闲䡼蜷㠹㡻࠺ޡܧݭ矼줼=No&@穻̡ǚŰʱɱ˫ƶ]qTf}⫻߸rK^i|ʹ圵ី椾룽룽뤾줾쥿꠺西럹硻饿菉젺袽韺枸栺衾롻餽雳ݛة憕gw맻ڪꢻ㠹㣿蝺書䞻硾ꣾꢽ顼ۮֱҴͳƳòijɵм⡼젽陷ܡܭְg|;QVʴΰʢȮȰø[ah#NS\AJTѻ#>@Vodr3?Kթ4DK     ;FE%+1X`lhr~ ;E   z Y_ay}Z_d>FPџЍț衸꥾哪ܖߞꚴ㢹飽좹颼똳嚵盶蝸ꝸꝸ꛶蛶蘳墽졼ꤿ뙵ޛݝܢ蛹☹斷獣 +r䨾רإҩԴִϣoG\rܲ惡߳ߔ֞⤼ꤾ줾죽롻须뤾줾쥿꡻餾죽랸ꟹ硻饿럹碽頻瞸柹砽꡾렽ꟹܚկ飸ؙҩ颾硽査䠼壿릿頼줾楽᩿۫׭ѬɲȲȯéȿ䡾㞺㠻睺暸᝻gz=SYγͲ͡ä`hou|LUbgtן{%<\-K$ `hoFTDQ\j !%)8?DU]bw͞ؠ럺蚸雹蛹蛹蚸癸嘷䛶蝸ꟺ젻ힹ랹랹렻ퟺ잹랹랹랹띸ꜷ頻휺뚸陷虹꛻읽흽엷蕵枾쎮ߢެ'Dܞ味ޛ矻٦ٵ饽٣א6Loݡ뙷蚺락꡾륿꠺须饿윶䞸栺蟹盵㙳ᚴ✶䣽뢼꡻韹瞸枸朹朹敱蟽웹蘶嘸雹꘶垻螻矺査䠼墾禿ꣽ뢼䟹ᢼ䥿碿桾Ꜽ癹䚺堽ꣾ꠻矹ᛵڥޯ۸پٿӶν߾iyL]p§£êñȰǬæ頽䚷䚸眸皷䤽ۮƒ      ($+068AMMXmixIaq&*,$'*.26=CJJS_T_pQmm H %*8@FMV^mwϞܜ眼홵랺뗴皷꠾띻잼랼랼뜺雺皸睸ꞹ럺젻ퟺ잹띸ꜷ韺쟺잹랹랹랹띸ꝸꟺ젻휺뚸陷蜼휼횺뙹꘸闸闸ꗸ㥶 6떷䞿㦿߫棻ߧᚲ>Vz딯۞뗷蛼ꝿ흾뢿쥿勵롻餾젺뢼꥿좼ꟹ硻飽뢼ꟹ睷培硻颼ꢼꢼ꡻頺蟹瞸朹敲ߝ蠼뚸瘶皺뛺홹Ꜻ鞻蝺睺格墾祾ꢼꢼ䟹᣽裿衾Ꜽ癹䚺㟼蠽顼螹嚳ݡ੿ݱ۸ںֲѴٹ袿줼L\y\m祤ª埼㗶㖶痵昳垸穿ۜ"*-     #"',2:COO[ppƒ8N\ '+-).07=BLT[^hvhuOh  "'.:CLJV_fu~Нޚ斵蘵蜹쟻얳擱▴嚸頾퟽읻꛹蚸矺쟺쟺쟺쟺잹뜷零螹럺쟺잹띸ꜷ靸ꝸꟺ쟺젻흻윺뚸陷蠾횷ꕴ申斵蘷ꚺ똶塿ꗵ䚵᣺ॶ<Ω❶ꔱݢ覾頹B[⦿陴磿똹眽줾죽뤾쟹祿ꤾ줾줾좼꠺衻飽륿좼꡻餾꠼롾뢿죾꡼蟺杸䚵៼顾뚸瘶眺라휺雺睺睺格塽楿祿砺须㝹⡽颿럿Ᵹ蚺㚻➼堾碽顼蛴ࡹ㤺㤺ިڰݳڮԧԱ睽᝺榿띯حXh"2Iũƨãƫܦុ☶啵斳昳更桸ڜV`f    4 &,1>GQT`tl}|+= N')-0/47@FKYajozx2AQ#%,5>HSTanl|~Ԟ♷蓲嘶盹Ꝼ웹ꗵ斴㘶盹蠾ힼ뜺陷昶墽ힹ랹럺잹뜷陴杸ꞹ렻ힹ뜷零蜷鞹랹랹랹랹뜺뛹ꚸ隸鞼휺뚷꘵藴痴癶隸镳⟾뚺둯ޛ⥾曮 7ȶꦿ햳ߨ령A[ۥ읺磿웹螿죽룽뤾줾쥿ꤾ勵좼꡻頺衻飽륿좼ꢼ꥿蟻ꢾ좽顺柸⡺읺皶囹Ꞽ흻웹蛺睺瞻砼塽椾椾柹᥿蟻䝹⟼랾靽蛻䛼㞼埽梽飾ꟷ壺磺砶ߤުڣԨ۳으ߚt,=^+HP`wƧƫȫȩĢȬ˫ȪŮȫɬҹ颻ݞ⛷旵斳晴直朴▯֥P[g  Y%*.?GOdnm|,$@+,0459>HNTclu{u  u '"+)1=BM]duzĚ؞暷ꔳ旵䜹枻螻蝺瞻蠼퟼韼韻ꟻꝹ蛷晵䗳⤿휷霷韺쟺윷陴曶螹렻ퟺ웶虴曶螹뜺뛹ꝸꜷ霷霷霷霷零蜷鞹랹띸꛶虴旳⡾&C/=Z㍥ϧHe٣ힺ菉줾죽룽룽뤾줾쥿菉좼꡻须韹硻颼꠺螸柹磽眺顽줽颺䠹᤼젻眶䜸睹虷曹蛺瞻螻砼墻壼䣼䞸ा鞺㚷㝼ힿ욻蚼睽蝽柼衼褽饾ꤻ觾를頸⢸ᨿᢾܢڦޱ᜻梷,?Zjz˫ʭʬɫƧġį̃ǣʰߠ۟㞻虷虶靸렷陳⎪ٯݮIVe.  AJWĆ'90-169>COU\kt|.8 ~ 81$.")50:IETgqΜݞ蛷혴ꚷ䜺㞻矼蠽颿睺瞺鞺霸盷晵䗳⤿욵盶蟺졼뚵皵瞹롼욵瘳囶蟺웹ꚸ霷零蛶蛶蜷靸꛶蝸ꟺ주ퟹ蛴昲ᢻ埽즿u!-I-;X韶Yvڟ㢽颼룿ꣽ룽뤾줾줾줾줾勵룽륿ퟹ硻须韹眶䝷塻飿陹ꟻ꡾뤽飼梻㠹ᠹ꣼柸䞸枸晶㚹曺瞻砻碻墼䢻㢻㟹᥿霹嘷䚻靾읾얷噺矾뢼ꤽ餽馾맿项㟸⤽馿뢻壽ᠻݡܪ墾䜱 :n}˫ʫȪǭȬɧʭҫʦêŧĠƣҞע䣽랹랹좽욳启䔵㞹޶es{^ 1%=@bx~ +34.27<@FTYamv~9B|->@$*5!(3)1?8DXK\uqǙ՞⟻꛷혴ꜹ柼㟻䠼墾磾ꤿ뤿럹砺衻须须ꟹ螷靶褿똳嚵矺좽웶虴枹뢽왴斱㚵矺웹ꚸ陷蘶皵盶螸矹衻꡻꡻꣺ꢹ项砷矷圳埿▶痲޽t9ԛԚښޜߩa~۞⢾社硻飽륿뢼製ힸ梼ꣽ뢼ꟹ眶䝷塻飿阸靹蝺硺桺䡺⣺բߨ夽塺䢽顼蜹暹曺瞻硼裼梼䡺⠺ߠ霹嗶㙺蛼횻쒲㘹죻餼棼褾柹᜷㝺睸ꚴ㟸⣽쟻ݧHXoo~ɪɩƪŮɳΣħʥƥ±αϦɣ̢Ө飻颼ꏮ嗸꛹m~i- y`A,09J@MeRej~͚ܡ砽ꝸ뙴栻硻㟼㟻䠼堻矹睺矼頽꡾뢿졽죽졻ꞹ뤿ꗲ嗴瞻ꖳ朹젽헴璱䖵ꞻ陷蚵癴晴暵瞸矹菉頷矶核梹饼꣺痲ޕ⓳Wdz !cq 6^q蛮ۥꣻت]z۟枻袾쟼쥿읷堺뛵㠺鞸枸梼隸陷書坸䟸⡺⢻㐦ϛڤ㤽壼줿롼蜹坺栻硽棼桻㠺⟹᡻윹嗶㘹皻욻镰ܟ尿ꣻ壼䠺ߣ㢼䛷ᚶ噴瓮ޥ蠼ޤߴ흹ץչL]wħƪǩƨŦ©ĨŦëɱѰϨȬЬլ۪ᦼ桻Ꜹ陷衼蘲֏&UB5V :+NcԪ塻ߕטۢꢼ뚳單▰ߣ硿⠿枼営ᔴݢ۸`piw©äťğƫɫΩ֧ߢ场뛺뙳ᛴ۩8KdPg18FGRi[koȓڛ圹䝺榿롹矹硽좾흻ꙷ枼ퟷᡷ멿靵߫姿ퟹ盵ꚶ琪؟皶卩؝꛹혷ꓲ厮㖶뜻ꝸ㡺䧿y 2~&=蠷ݵ쥻堷]uzæ頻홷裾뢼ꣽ隴◱ߚ⟹碼꡾뚷䙸圻蝼韼靺皷䘵⢼ꢼꤼꤼꤼꤼꤼꤼꞹ垻砽韼螹垹塽꘴ݝࢻ塻㤽碼䙳ۜYjᮽ1/L룼枸垽䞾⟽杺攴ߒݞCVqnä§ĩīȦƞ åȨȦŧħǩʧҥڡ➻蝻좽꠸核J^x~1<)/9?I[Q`{j’ؚ䝺坺桻馾젺蝺矻꠼띻꛹虷栽ꞻ砼Ic,Dhƭ鬿⟲פܨ襹⣹⟵ޥ圲ܭ᥽ߖ唲뒳埿߭L_tdt`m}1?Uhz즾衹㣺lr姿椽駾ݚ᝸잼럽졿뢼ꢼꣽ뤾줾쟹皴♳᜶䟹砺螻蜹暹曺眻蝺睺眹書垸栺褼꥽륽뤼ꣻ頺蜹柼頽꠽韺柺桽榿闰گܭ㛳Wlk|,cr7Incvީ뒫ל䐯ܘ᝼㟼蜹哲ߑݚI_x[oǨŧĨũƫȥ§ƥǞĠŦ˪̪ʦçƨȦϣ՟ݞ㞻裾稿祿`t}+4"(/7@OKYpfz}Ә᜹坺砺须ퟻ꛹蜺靻ꝻꜺ㘵ܳ!C!.-OZxц:He 6 6$Dkzֿ੺۔{sz_waxګ혱ۛ❺碾호钳䓴晷蜳㦼p#4A!/A&@敮ֲ碌襼g^t騾우٪ꟷvǴ앭כޭ랼럽젾ꣽ뤾줾죽롻鞸朶䠺螸杷垸桻颼ꟹ皷䝺盺盺眻螻螻螻蝺盵㝷墺裻餼ꢺ蠸杷圸睻꡽졾렺蠻磼槿韵ީ䪽~pݧQfl)F (ܤ$4Y+R}憎퓴╶㓶ޚ㜼瘷䕱ߛ⟼㟾ߴSlg~ɫȫȫȬɬɞģɝƜƣ˧̧ɪǪǪɨ̣ҟמݝ⥿髿m|Ѹ馼إ04ȍScԫ良闱ߕߘ푳ޘ固疵╱䟹砼唲ի^zgȬɬɬɫȩɞ¥̧ѢϠ͢ϥͤɮή˭ʨˤΠӝםܨmʏju[dl3[<b! pz  $,2:HJVkcvz͓ܚ㝸꠸젻뛻으흽읾잽ꞽꟽ嘱11Hb汿o{_Xhس*@d0T{ס飾ꟻꢼꢼꢼꢼꢼ꡻须飽롻韹硻餾줾좼ꝺ相固睼韾롾렽ꟼ鞻袼ꢼꤼꣻ飻颺衹瞸盶蝻좽꣼觽窾r > Ze檿۴Yn&G/RYl롳ܝۦ랻蚹摳ޘ固畳▲ᠺ駿뗲ר]ztƫȬɫȪǧǤ˫װުڥפԦҦ̲ұί̫ɦˢΟҜת쟷夻鞳g|ޜxp{\dmKRW5;>/46(,-')+!! %/= O cz %+56>NJWogx{̑ژ㝸롹陹Ꜽힾ퟾랾韻䡼᝷ۖZn٥Թݧ٥rBStUf͵뫹ЮM[r,vӚ>Lc-D$2I&=;I_[i7FY"4l|GWdVfv>Rd+Ay좻㦿먼xCSw/>^Zg@ar룶ۭ';^3Fk̫衺梽饿꡻须飽럹瞸桻餾줾졾뚷䚹枽꠿럼靺쥽뤼ꣻ飻须꛶蟺죾뤻詽欿br2Ab2=Y"DPl稿ߩ޶퓩̜ձ흱ڨ姽禾훳ᔮܤ듳ޚ坺疳᣽bǫȬɭʮˬέ٦أؤڡםңѬԤưܯ̫̜ͤɚΝܠ✲ܩ}Ob䤵Ӓq}aksV_cMTWEJM@DF58:,0715>)-8(,8',8,2='.8,3;-49)03+23*13,27*06'-5',5*0<3:I@J^S`}mϑۙ䞹죽훺흽ힽ꛻ܬp"❰ՠߩ먾磹⢶ߡޯ髿s!"4D[1?VESj"8~NZl/9J$.?;DR6Lam5G^4O쥾ަ㡻ߩ꘰ګPdț /Pp~-<\\mۥ夸1V;Nsަ硺靻윸砺袼ꣽ룽뢼꠺蟹硻飽륿좼꡻飽휹朻蜻蚹暷䚷䞻袿윶䞸椼ꦾ줼ꟷ圴✴┮ݫڣ飺7Jojw⇎ 1#4Uѭ暰ԫꢼᛵڦ줼ꢹ椻襺֠琬՞咫׭˪ܟߤMmx¤آڞٞڢޣݡԞ˥ʴҧãͮШϞ̠ۧ䣹⩿訾}AU~㟱ՠϐzq|fptbloU^_[adBIM =BONSdMTfFM`DL_BK\>IWMYcDPW?KOCOUFP[CL[@IY>GY@I]GPhP\x`nrÎԖ蟺ퟹ흼흻ꟼu!ְߠឺ餾럹蛵㚴㝵㥽뢺蠸梺襾ꦿ뤽飻짾ް倕J^}?Qn,=X%4N+er +?P\n˹ҭt|-1<0樺ٸ`w1W !GچETtjwú2?_#2Rԓʜծ駽q.Ciױ桺䢻靻잺须须颼ꢼꢼ꡻頺蠺製륿좼꡻飽固眻蛺皷䛸垻袿젺衻餼꥽裻ꜲܣƃZi 7,7Utߡࢽ棽裻嗬ٜܛۥ㛴ܥw:˫㙵ؠܲDenĥ¤ģמۜۛܣ桻ٕūѲҥɧçĭϟɛѧ䦽㧽憜7Ly㘪Ҭ៯̋z|guwmy|ox~QYa#/$(.B6=SEMfVayfrgvpyVhrbsbp]j[gZeZe^idqn~zٜ̔基럺훷횶왵랻횸鞺颿젻z{ҩܤ잾땴锳整隷ꝺ훸뙷虷蜺띻인ꚶ嚷㏭֯ꦻ]o&7RXhᨳOYk5̰⋚&5UBQq,Mۿ#HOb뢹߸+AjҰ쟸⣼西Ꞽ롽좼꡻頺蠺衻颼ꢼꟹ碼ꤾ줾졻须飽㚹朻蛺相圹柼褼ߩ桶dyfyr5Bb 6#A\gx+=b¯蔱آ韵߫鮿\r~ئn؞㝶࠻ࢾHgpèŪǧ̤۟ߝ᜻⠿桼ޜПɤİ̶ΝϱЊڪ㣻ߦ唩7Kz䗪֯驻ݗÖ|uZap7=S2* 6o~nrxvvttuw~ŌЕۚ➺韺잺枻똵蝸ꣿ偔o⥹ܢ햵엶호ힽ뜹잻횸靽蒱ޛ⠹㜵ݘԯ斪ɴ5oz>F]jr˞ӧcy%>^'B]7Rlyu #F^vKZz1$3SܵDTxBUxې&9_r顺Ia߲렻磽뤾좿졾랼렾퟽륿롻頺蟹砺袼ꣽ럹碼ꤾ죽롻须飽♸圻蛺眹朹柼ퟹ噱ߠ椼꡸娽WjQd٫ᢵֱ㨹ڮjy&DSsԧ릿럼㛸ߟ㜹띰ۈ~L^}&9Zj̨靶ߝ⢼䞸ܛӬJirãɤߠ塾꠿으瘸ᢾ䠵˥ȱͤϊawبޥޤ㞳8N~ٜ߫祶ԙ– ;-@_ңمÆÈȊɇɆȆɈˍϏҔוܗߘ垼柺뙴睸ꣿެ![lޞ뙸웹ꞹ렻쟺인ꙸ碾뢹樾ղ߼r~^jftlyGTtTas'iϮy 6OWh5@^2@];Jk袵{l~Ӷ혳~Ŧ袿좾퟽읻ꝻꞼ좼꠺蠺蠺袼ꣽ렺袼ꤾ죽렺蟹硻颿옵♸圻蜻蝺眹柼顾뜶噱ߟ好먾o\n-J3^p۽兩٬엪CWzJ^餽砼墾砼囷࠹옱ٕ֢თWk"4]4s$֭᜵םܦꝶآسYuĥ¤§Ģʡߟ顿甴ߠڮҩƥsL]fnƮܦ٩ܣ>T~Ť馸歾橼ޞʗj|&G;Qt]s؍ŔӔהْבؐה٘ܙܚݘݘߙ垼衹웶靸뢻횱᣺)N5Hk᩼ᠺ陸횹일ힺ雷朶坷墺褼ꢺ螸梽蟽噳樽㬿ꤵփqpg{㦺*[i.H2ϧav $co޶0o|,=^֣ܮ㞶ࢸ⨾詿餻蝷젼룿훹蚸砼륿뢼꡻须须颼꡻餾쥿렺螸柹砽ꙶ㚹杼靼靺眹杺矼鞸栺裻餼ꣻ饽gyAPjyw?Pk2'D]oϬdzH^ܯ쥿瞺㠽颿뚶ߣ륽禿㊠kk{랹룽砹堸⢺䨾驿觽礻项ꥻ僗ݿrBQq'4T 5]nե!5G 2>J^iwBPb1 3T̬FTp !*0GOYqALhPm!n죽❷ߨꣿ꛻朹焜ƍ͙׫ϳq $&-A=H^'5K,\tꗴ٧癯؜ҋHbnƩƫȯʹҰژә䙷蚺랼ힸ暳۸শDz΁+1Ϣȭٙǭ឴ׯ͓՛ޞޠ뜺陷虴砸쟷띷ퟹ읶裼ॼ눛L\矶䢹禽즾觽險Ωޮ姺j|&6Zz@MmZgܲ߶㪷>Ii*KᢼڧԂcsƚ+PFYܙۣVhBQrMXts~ڮ)Lϩ杵ߣ蜵᜶꒰᛹Ꝼ럻훷晵䟻꡽줾勵렺螸槿랸晶㚷䛸囸䝽蟾럾뛹蘶嘶噷禽䋢ϐҦM_|+&6Mp߾`uTk꠻ࣿԕܭ茶k~ATwougw矸➻砺kxvI^t/I垸{)>d -%+QbueyΧķԱѲա˥եݡޠ⥿뙴碼륽ʼt(;B¬ƪͲڬ֬ٞͨ}Ɉɥ蔰ۢ롽좽蠺ꣿ鞺ٞ靵秺#F&Jߤߤ㬿ꢷ䡼蜹榺㮾htdou]iGNbV]qGRnFSsO^)I0;WOXs"9AJe޵޶㣮&G\l맾䟸ڴꥹ\k{I\Meܚߙ݁ү+>c㤻ܢ勵菉Ꞹ皵矺ꢺ褼ꦿ맾왶㕳⚻렾珯ڜ瘹좻ATz}囯sdyDYue{嚸᛺癹褾+7Oɐѡ葳ᗾVg|K\q~_n)CFZsJb%3JϾm +P\h$. ͬɪȟ΢Ԣۨꣽ웶韺횴㥾ꤾ&6ƭŪʩͦɬќ˜KZrVgdxqғ٠蟹矸ꤽ茶ޱ㪾眰cusHZVg*7W둛 *p{߆ ?"tئ嫼Q^;QZnRXkߧ*6RakqxEQm骵2*5Uͦڬᨻܙϊ°쏱ߜܫ주䤻᧽᪽EX{鎢kOhƐڨ죽죽죽죽죽죽죽젺頺頺须ꣽ쥿餻馽럼螺霺電윽뜹柼⑮۩㤿s0Ek6Hm9 =|塵ԋ⡻ۡ꛸䙶auBShESjڝ.=^%IL_'Lw얰բ쐩ɊڙXh!.H6D`娼۟ӥ۝BXt(*7GŜ¦§̡ΝѢࣾꟻꣾ'=OZnyϱɨƤŢ«˜5@RCPfVgi|П睷咬۝榾yףگ扛<%.9U!*EתFPh`i@Nkᡷ۬䘨7Ce7B`Ta{O\r"65F]#3J 6!*?Zħޣ햼斸拪ݚ硺~i|0Ox˫8Gg'°헰ؤ铭۠頺頺頺頺頺頺頺饿롻꡻ꢼ뤾䙵럺졻ꤼꦾ韺栻闵䜺롽졹琦ʽٲ롵k{6/r㜶۠㢻آ眴ؤޛv #s,>]⟸웳ױ䪹O]p,*H`,Δ +~chtTf뮿P`0`o:sޤ䧺ݛ(F>Kkչܾ}S^t8Ng}b{-H/.I˩㛺۞e{!B9r⡰)<] !DԵ蠺蠺頺頺頺頺頺頺勵뢼롻꡻꠻핰㗴矺롻ꤼꦾ쥾꣼蠻碽ힻ藶㠻ꢸrZmݲ鞴أܧܱQa~FXu~zxꞺ딭ճ_sEZznavfp #'2FVeasާ蛶Ө硷ڈ/>X#6|ТӤ٩㨿嘰ڔ٘ޟ垵單ܤ꙲ޝޥݫ=Soy⥹ʬɥŢÓȞ֙ڔ۠Ꞹ柸䦽㫿 6{£¨ &019JHTmgvӛЛު앮7Mvԥ皲ܬ흳ݪZl'HͬZf#ǖ +#}~9NtJ^ѱp0ChMmYi2-Jࣲ򆙺)DZ~餽塺䡻须꡻꡻꡻꡻꡻꡻ꣽ줾졻ꟻ꛶蝻줿좼ꣽ렻砻碽餿죾ꟺ暷䜵৻N]~ *KZz/NI^}N`u-Fpj},K:LkҏÓķp~8CTo¨ٲ㠳ַ{%D5EbȰߩܢ֔͗ԥ砹啯ݏٛ墼꥽뗰ܣ啮֤ުޢG\wٲԢдѦʫ֮ޥ쥿詿j~ ;«ˢçŤ0>PQaq{(  !     !"%#,(/<8ATMZucs{֢蒩D]c}裹5^h~ॽ矷ᦾ覼槽>R{?vݾs9Ffan$$Dz}Pc08G:CUHSjZgvzޞUn+DnܨPc&:c۶ڞݱWl7ߗu5ˊإ硺曳ᛳꣽ띹⠳pfyŕң㜲۪㫺ۼ줷ڵd}Of6EeclCH] ;DRr|KThpt੭/qxӵ%A6蕫J`'OTmꢺ西頺飽죽잸勵랼랼럽쟽젾좿죽뛵㣼褽ܧ隳۳뢵{ۧn|"> 58FbWk0Ggդࢸܩ+9U9L^}:{{G]^qfs*6N0#au睵ߥ땬ܚ៶螷陴昳嚸砽阶ߗٔѐȐ-AL|ݯֳӪƶа˧ȮҫՠНӜٯ:Ou4Xشާ͝ϩïɡ9tL i"! (!'107C,3@'/=BIZGNaAJ`=G]:D[HQfFM`!(8'%,;?FVDN_DOaBObCNbDPdHTjO\uZggwݫ>V͜ި젳DW}@T}ܦ嘮׫Pe$Hcr,;[wgp혴㢽옲ᙳᗰܞ흷售ݞ䢸⠶ᘲסڤڬ瘮ة럵߱夯mtt}k{zPh1Gj +!>;;M# $* 56Pwzu|掜gzw`x׬폥Φ袺褾頺饿餾랼랼럽쟽젾좿㣼蒫צ覿矸xl~tšׯ杫ds."'H`vߣ⦼夺㢺䦼倕tڑFQl7Sa~⍡đ̥swy0tHRj (r鞶ۡ쟹啯基훸됮ݔݢ蔲ՖЕʗĘ>RSힻ毿ܧͦŲΰͨǩʦ̠ʠΥ٥v@z٨뫿آȣǯΦ ":1!&/"'1)1>5@PJViDPe3=Talep^j\kfubq_liufo",B&=kv^n_parbseuiypzʀk&=i顷(@jG_дEVjASx(m~-2K49Rᨽ햵ꕲ啮ࡹ禾蟸⟸⦿뤼꘯ݷ㨾稹ڸ桷Tj7Jopr}$sw *MOgܫ %3ܘ;?\PUdahy HTl]k6Ghڢݥ䟷ᛳݰNf 2f~褾꡻죽줾ꞽꟾ럾띾띾렾㝵ߜۚٷ4Cdßէ޵ꢳGWt8Jgخެ땫Իr!F❩)6P:He祸ۥݬ坰ֹ񉜿!u{뚰ڜᘱ㥾ꑬ䘵蛷攱ݘڤӡЦάͯ˱ȴųúǹMa\ꓱ⟸秺ۜǣĭ˯ͨţ¤Ģơɨґ4f|ޘ۳ף˧ˣžIWo -3=)/9,3@8ASLZqctjy;Jhq|n|ux~vGSr)8Zorx{}͏ϟ᧾:S~H_ߣ單ؤ䛳ݙۖd}Ld敭ۦx]u\rlͬ䢱NSl.ťߣ៸䧽韸ި裶ۯ쨼ퟮΆBQrI[Nf 5{JRoʞۮNXvvbmqx %"9DZsm矲םئay+Cmɠ褾ꢼꢼ룽쥿ꟿꟾ럾띾띾럽쟽열፪ץ짿頶ߧFSs!橽ࢶ٬◪_qo׫墻㢻墽飹ڹ#4U :-;XͦNZvwࢴӴ螱ԯ;'u올Ϟجꥻ䟵ߞॺ쓰㑭ܘݥڧѪϳѹѾϿʿǻTg^등❷饻ޘȡǪʭͧŠģíi3㡽좼ߠ͟ǧƚ (U6-3=.4?6?NITjZlq2Cdbq~ˏ{̏Ɗˌ@NyÊʎ΍͓̍ҙ٠⠸g~0Gt周ժ꠷䧾ߚ㍧֥럸䡹㞴ާ䠵۵cj "۬⣹ܯ몺䋛xXjy#A/n{oZѯٱޯ柸䘰ޠ餾잸砺ꢼ뤾菉럼颿靿ꝿꝾ띾뜽뜽라鏨д;Ns3B\ <.#D۞۔թ꣹㦹߲z$3T%3HUuETuz秺ݯw[f#.J$bП啴䋮ߖ蠾꡺离Ꙭޣ맸쟷蝶䜵⛵ۖר1KsNg즻蟳rScSbrTebr攦dv}oo{tcqfrwTYr~\lGQo[cdl; .Jl}jy'I,6T;?Jf|Ydݨꛯ،…=Ie,Lߠ|1C`:Ket̫螻흶ࡸi|=Mj"<)A":+9UVhæ墻ꤾ띷枸祿뤾젺霹靿ꜿ뛾꛽뜽솛!FN`ftdrs䙲ޝ嗳♵䞵塸枳Na]l֍ 4%E֦ݲTf*K! 16>\ӫ߮朵ݚߔދؑ⚺뛹ꓮߝ桹睸ݢݫݷַкξͻ͸̴ƶc{s떶ߙݦݠУΤȣǷʧM`gVm|ܥ䠿웵֜&@.)/63H`}磷=Jjq}EWv-O昺~ͯߩ띺桿蛻brlz7D^,8T*8U((K䧿飼覾죻鞶䞶䣽죽뤾띹蚷띿Ꜿ웽뛽뜽똵✷䞴ݝ+@f; 8=Md±ۏ1De٠ᦿ#FSbާCRs~4Gl01>^r}ź盬ͨޤܛد쑮ۡ얲ᙴ杹藱࠸杶ޠԷܵӾԺ̮ûȾƽɽɺɹȷɷɪľg~y욷䘷䘹敶㔶ئޢϢ·ͷɾ͞5HPtߜ۟蒯⟼ᛶ f*043a˰랴ޥ娼嬿`p2@\0$;㡴ڟس쫿⃖!:Liװ竽蟻ޝݣ墻围ࣻ餼꣺袹梸➲ۜצݾԺжʵǵƹȺǺǻǻȻȼɽʻʻʻȹXmeû㞺㝺盼ꙻ阼⡸Ҷv}a^phyO`աݖ՝ܦ螴᜵ᠶ⌢̕ԧ䜯BS{4HpԵ맾ꝸ格hUhɉ %*8Tݦڬn&s\jtm.?YYjZh{(&,C͸uNYo $*6Rs#2SScி~~֥西蜶坷桻ꢼ랷闲圷睽癶^z߯߰M]'|uBUz|姽昱١䠼墽顾뢿롻飻枴ݤ衺⠵զI]|exȰ鬾똨!;â~@Ri8au߬嬿44rЫऺ흺暸᛹⟻䜷㗰ܔٕ٠ࢶߤިݦ٤ԬܽлȸŶõ·ĹƺǸŸŸŸŸŹƹƹƷ³žQc\٥墾睺眺霽ꎴޛγ׀%.@JQzͳٛ˒̕פ䟽젼룾 ~~~~~~~~}}}||||||||{{{{ĕ ETf阰ަ훴윻蘷La'MPbRc}%4N 3˯㨶଼术 =?Mi搛IWjӶ}pr~暴ꚳ~! )gw_nDUvN_FY|tδॺ颾瞺㠼壿螹喱ݡ须頺韹蟹螸睶蛶陴졼蠾휹噷\x碌註蟯ݸ,M- 98 ?Lc⥶ATot *h{E]&:cL_lÀަꦾ윶䞸睹蚳堺頻瞺㝹➺뢽霷㞸桻飽졻ꝷ曵䝶蠹뚴꠼颾흺杹Yr枵⡵䧹諻:Mndvˠ΀)7[%#3WǬ㞶ڞܨ柹ݫ꠹妾v"/Pl}?OsDV{j}1Gk>Twۨ⣶۬㖦ʆଽ޳珣Sh3#2N䡱վQa~өܞטڞ售䚴ꗯ㡸裺蛲ߛ۠ݞהʓėàɫϬͪǫƴ̸ɹƸŷĶ÷ĹƺǸŸŷķĶööö˶Pb[ͪा㝶㚷䐲ݞ]l,:M½ԡƬ՛͑ɠޝ᡾뗵暷꠻젹]~~~~~~~~}}}}}||||||{{{{{{{{zzzIVt <{؛ܦ죾瘯Sfyl~pִMQ\9DZ,憘Qc>PoUiu囹ꕳ䝼떵ꝼ줿좽鞹垸柹睷墼꥿뜶噳✶塺왳顼褾졽梼Qk֢좴㡴߮饻߻du -8Ij᣷֛χЬ笾w4mzӎ)3Yꛭ_o/>_1@a,L+Lv䒫͇ʬЮ۹Ze࠳ئ唬ژ䚳랷ᠴ㛰ݎ͌ƑǒËҬϴԾپֺϹͿ;˼ɻȺǺǺǼɼɼɼɻȻȻȻȽȰ»I[Tơդࣻ壻頺鑮ڔڧ埴,ky֞ ƔƜۡꗵ杹~~~~~~}~~}}|}||||||{{{{{{zzzzzGQf5:IdŖע硺럸꡼⓰㟷립藪]pRe *z䩼⥺27F&ω##Ds朱װ䙴矸꠹릿꛶霷ꝺ퍬ߞ롼蝸䖱ݒ٘ࣽ랸桻餾ꝷ暴㝷根뛶頻裾ꦿ饿Ha~띴⣹駽ӯ穼ߤگ=Pq)HEWv^muv[k3A^ 7" -+OJZ~zӰ篼ܹ'2Plw':]Ͱ頸☮r8KpVe㡯Sb9j~蓫ϣޝ֫ߤ}.9Yȵ젶৾읶蜶왲Ꞷ앪ךӗϓȗǟ̦ͧʺظӽտϾο̽ʼɻȿ̿ϵOaZę̠ܥ磺ꟹ衼螻e{$6SʢƮΨśǪӗĕŜ֞㡼ꕮ▮^~~~~}}}}}||||||||{{{{{{zzzzzyyy)$[gn|ϗۚ䚵砻X}i핬ڣ鞵娿ꗱ٩꡸ޭ飹ݭz6Ij ?3  2,8TDPlitCNl @ ;`m׬յܨ'CEQm_j령᣾꠻LdvXkWeiy +ܯ桷ڤ٢<'G覷޲ޖ᡹㚲њʟ̨ҰֵؾԺλͿϿμʼͿ̾˾˿׼WibȒǚآ坶藱ղ "FޥΟģĦơɞÕʏĚܩ喯䖭ۑNe}}}}|||||||||{{{{{{{{zzzyyyyy.T_vapÔӖ۞ꚵ盶雵띸訿睲ߵ7$9_餺㤽xShAI`'Gǻ%4TDOkۙԣ藲䘵衻뤿埾휶䛵䡻餾쟹瞸椾좼롻ꟹ蟹蟹蟹蝷朵確쟷夽8Rw]v塸ꞷ颾ꙶ⢻禾螶࠹뜳٫页؍zyӶ߻⩴cn:#9y#)4Oڰߣ䕲ޥ֨ۮx )BOiݸ1?[v䣸ص鬾ݟ(3Q!v㝰ݐ֕ឹ옱㛵䢺蜳٨ק̸̪׻ֶθϾֿ̿̿;˾ԸUg`ןԐϘݟꣽ읶ހCE\߹֢Φ̣ğƣɞǕNjȡ裾藲畯ߎȅ`x o||||||||||{{{{z{{zzzyyyyyyy-3AKUjdrוܚ朷꡼랷蝵맿❴p]s˸DY\icpk٨8C_ku慨袼뜸狥Ӫ栺ꝺ훻웻웻웻왺똹ꙹ隳圶墼륿띷枸睷杷桻꥿잷阰䠸옰ޜߗ֧Kbu䛲䜴虴睻젾혶塻ꢹ颹饽롹㛴ܩꢺޭ߭奮ɂpyW`{lwꪵ?Jeןڭ등陷書w/GRhUayޡ}N^{4 Sa휲╭ᑫᖱ䡻ꤽ頷ݜУDZͽ׻϶ȸǾʻǼƻŻǻǼɾͿεºǾ˾˻ȹƻȽʿ̿̿̿̿̿̿̿˯\ngĽ֟ԑόЌԪ)MH^꠶ߥޠʢǥťŤţƤʣϖΚڠ蛶蓯䔮ߒӇCQ]0L@_(e p t w{{{{{{{z{zzzzyyyyxxxx 3:HHShdr}֕ܛ盶顼잷鞶垵榽蜵᤼꧿텏'/Lٖ̾ݧ馿桼졽잽Ꞽ랽ꝻꝻꢽ陲䛴桺쥿랸睷曵䛵䞸碼뤾럸꘲衹홳⠹㝷ܧOfy圳坵隵螻砻져좻蜷㜸᡽暴ܢ⣿➺ݪ妴ѿblak㬶&A '(4P䰻ٴ顼可ߥq}ENbƪR_y+#$%7V{嚲新攰晴桺棺࠵ԜƬɵ˽нϹʵõ»ĻĹø¸Ĺƺǻȵ¹ƼɼɺǸźǼɻȻȻȻȻȻȻȻȿʮ\ngĽ˜Χ᜸ۂŠzħ硸妾袼囶ʣ̫̫ɦťƫϰئ֗Лݡ锯ޕڊĐ_pFRaGP];BP06C%)6"'1"*%$"!!    #  & >GWT`whvؓݛ皵蠻졸져睵驿棻蜶西렼矵`h)6Vé䥾根樂夾죽룾ꢼ꠽頽꠽꠹뛳瘰䚲核줽ퟸꜶ嚴㙳⛵䟹袼룽렻헳霸桼製夾Tl|垵矷뜷꠽靼ꚷ䢿윷㣿蠽⅐$<$,CfnҷݭO]z.$AKYvmyŶ厧ϐآsTaw{lt5$1Q`qǨݒצ阴ꚵ蝷培ޠ̠֟¸Ϲ˻˺ɸŶ´ʾɽźĸ··øĵ·ĺǻȹƸŸŹƶöööööööýȭ_qjžϡ̬ߠ؄᧺#Fbv矷嚴⛸߰֨ҬϬ˫ȫʲҵٲܞΚӠ♶㓱ᕰݐҒvTcx\h|R\pHRe;CV8@Q19E-5A*2>(0<'0=(0<)1<+1<',5 !*.8+0;%+8,1=*.8-1:16?+0:,R\pTa|nڕ阳枹인롹韷욲柸ퟹ癶鎬㙷뚱﮽@Ij)JƴѪ颹騿碌好뤼ꣻ颻砺蠻砺衻霵癱嘰䛳砸죻랷靷朶圶培製ꖴ떳柼馿须Zrv栵衹ힹ젿ꜻ䡾웲Qc4@\GRmHRj #'?y宽q!B&?Kg}榿⡽鉘iq 5Ziܽ띲ؠߩꗲ䛶零霶䛵ݜաϦֿ̭ϹȸǺɻȸĵʽɻǹø¸¸¹ö÷ĹƺǹƸŸŸŵµµµµµµµ¼ǭcunЬܛ̢ӯGY瞸ޤکͫʯ̱ϱѯжڨҚ͚ؠ瘷䒯ޛ☯։_rzm|guZfT`xJVkGReBOc@Mc?Lc@McANbEOaEM\ +.4BAIYAJ]FQfDNbJQaMSa:@O) 7BXcpgwyȖ圹땲圷ꞹ졹흸Ꞹ똳杶飸롳LWw'8Yɣ䛶⛵㘲柹줾쟹硻頺螸杷垵執堷硸蚲晱癱眴꠸좺젹령렺頺须餾됮瓲癷棿蟹bzh硷碻ퟺꚼ枺铭ۜ阱{*K񘡼`g&/J 4ԴېSd1?\!=(2JСזӭᮿٶّ/:N /O̾䟲ؚכݟ䡻頺閱㜶圴⚳ۚӝϥϯҹкɺɾϽ;ʻɻɻǼȹƹƺǻȼɻȹƸŸŸŸŸŸŸŸŸŽȯj|uëƟĨΕ"1RYk쌩ܜިϨȯ̱ЮϪʲѭќʔΠ⚺啳៼ꗰ܎[p~sk}ixds_p[nYlYk[l]lep8@Tiser\jTfbr]h})1D# -Q\vwrzŋі䘳蝺쓰㛶韺ퟷ띸ꝶ甯⛶隳뗯뜴럻릾螵웯߾@KiDWxܛ㓰ݚ⛸飽롻须꠺鞸眶围朵砷韸꙱皲蜴Ꞷ졹꡺죽좼뢼ꣽ申ꔲ㡼衻mVm桷碻ퟺ皻훼옷ꙹꞼ碿엱ߟw(7W6A_=Hd6Da䤶ۯ㧲 !.2Eүڲ檿n>OiAOe"4CSpڠ奼죸妼ꑭ܍ؖߛۛԞϥЮԷٿϽʽѿοξ˽ʼɾ˿̼̿ɹƽʽʽʽʽʽʽʽʿʳžq|Υۖ'4N%4UљޤҨʩȬʮϭͮȫȞǓȒӗ✺韽헲NdъNjƂ~}vspopuWe+p}wtndz&B %>IdxŠȏՎ٘虵ꝺ풯⚵蟺ힶꢻꞻ蜷零頺흷.;ܝ䠽ꕴᚶ嚸矻ꟻꣾ뜷霷ꝸ롹蜳랶졹矸ꢼ뢼렺螸栺螼훻꘷៼{H_좷䠶椻졿䝸ꟺ젻읶蜶坹蠽ꚷ쌦;Ns.O +Ifo[dq}vޠۭ쮹,CCSڲԗDUp ! "30:Liwұ᛹ऺꤻ땱蠼령嚰ٜԞϨӱٹݸں̿̿οͼɿ̿̿̿̿̿̿̿ͷx)9?ЭĖ/8F]闲哲ޥ٪ͥŦĭ̵ӨĤƖÉØ٥읺社Ldڙژٍϔ։ɇDŽɂʁɃɆƊ6Gf:JfȈf{#8]:ωӌʚ؆Ɯݘݝ睸랻ᙴ梻휴袻Ꜹ眷隵횵㛶따杹져颸裹+H(Ƭ蜺뚺隹웺흺ퟻ鞶져㜵硻꡻ꝷ暴⛵䙷윻ᠽ@V롶㠶棺졺죾㝶袹饼졻ꟶ曵㜶䟺搬եꣽ壽奾ܱ#0p癱ۘڢ娾礹ߧ߲+2F19P95Faޤϻޑٝ䡹靶蕱ݤ荨ʚΛʤʱӿ߻ٶͿ̼̽̽ξտҿϾ˿̿̿̿̿̿̿Ϻ}E[g !,0;!1=(6BVeuʞϠۦ꡹핱畳꠿檿՝ƴЮɥ¨ȮΨΕͩ藯٩D\Ӭ靱vNy>[#4%~x y {mu#GY5fQWm|gu/:\6ȕΘޒߟ鑨Ѭ=Jm\k⧼ޠ럺휶웶零霶읷ힸ룼榼짹⮾O\|;Fd䢺䗵摰꘷ꜻ뛶零霷鞹졼疵ꗴ磾다@X蝵㠺颽꘶皸飻綠綠㟹᜶ޫꟷ۴蒡)4R0;Yrꜷ٫眶ڏΜܨ잺㢿띺皷䝺ꧼ↜H^w$@'HI\䟼㠽䡿褿롻雵㕮융瞹夿ߟӜǖƽӼ;п̽ʻʺɺѿμ˻ʺǸϿͽ˼Ȼǿ˿̹}rj{|ϧϣԢۢ䠷癳阳뚹ޢ˩ʵвͪȧȫɩʠēȝؚר?W{Mo~yxxxxxxxxwwvvvZKpg *~ٓꇦը㧶NXvA页嗯㘳椾靸랹쟺ퟺힹ인뜷꛶隵虴瘳昳晴皵蛶褻뢻ퟻ覻謽䓢&1OU`~ص喵꘷Ꜽꜷ霷靸ꟺ졼뛸똳埻ꣽLe蝷塻顼陶靺홴盳睸꘴㛷椿룼睵٭ft '&-H9ӡު蚸ᑮږ⟽읻Ꜻ韻ꣽ줾뢻꘵ԏ̠ܳ珫ژ閷薷蘺蝻꡻韶㛲ꜷꞸ柹៻ڡէЩ̯ʷͿѿνǹûû;˼ɼɼɼͿ̿̿̾ͽ˽̾̾̽˻ɻǹſ˾ʿɿɿͻÁƠĮγЯ˯Ͱԭڧ۟ܞ⟸ꚶ얲褿稻֪γѴѬ̦Ʀèɧ˞ɗɐ̥Aa+Fxxxxxxxxwxwwvvvvvvv$.6HOV]yՑ׃ϔ۟֜JRo?Fg֠ᘰ囶蛶霷ꝸ띸뜷꛶零霷꛶隵蚵蚵蚵蛶霷餻롺쟺윸򀍭 'Vgꚴ⢿蝸꠽띸ꝸꞹ럺졼쟺젻杹衻\u衺桻飽럺웶蛸롾렻흹虳☳ߜߦgxN\yйۼ6=X <ݯ⡶֢ܫ蚳ݰ顽좽ꝶ螷頺蜹ޞܥ蝵㘴㚸锵璳唴囶衸ꢶ栴䛳ᠹ墼䠻ݞӡάӶ׶з̷ɶźĻ̾˽ʼɻȼɽʾ˿̿̽ʽʽʾ˿̾ͷŷƹǹǹǸƸķÿ˾ʾȽǽǾ˺ȣǬ˹ԻլɲԱ٧לӝܥ렻헲壾⣺뫿ާүӱѫʦĥǧˢϚГХ xxxxxwwxwwwvvvvvvvvuvus G0s?Xj|S^|fmMUsꗰ◴癷螼휷ꜷꝸ띸띸띸뜷ꜷ꡼꠹뛹ꚶ외홷穾o~4&^l⢽蛺靸ꢽힹ랹럺쟺젻럺쟺쟺젻蟻ꣽfߠ夾줾인ꚵ睺죾㕰ܝॾ槾䆙'8Y߽(r}(4P1)J꪿졹禽刺蘰䛳顺엲ޝ᥾桹㛰ݖ۞억蒱䑱⚳垵夵棶㞴ݟܤܦ٧ԪӲԹֹ϶Ȳ¼̿̾˼ɻȺǺǻȼɹƸŷĶöö÷ĶųµöĶĶķö¾ʽɽǼƻŻžƿƷȻ}֥ɢͽ֯ɱΰҦМ͟ا西횵矹ꩼ᤹թԪΥç©ĤãɢϢ٠ey xxxxwwwwwvvvvvvuuuuuuutu8qPs*L#7XL&=8 jsrrrrr^*/9AREPd\f}3=T 7~KTfcl~nx~nzp}lyYhR`%j7rqrqqm-1=CJ\ALc"; /5AYߟ蔯眶윷ꜷꝸ띸띸랹잹쟺ퟺퟺퟺퟺퟺퟺퟺ혵虶隷ꙶ霷ꞹ쟺ힹ뢽ꜷꚵJ]Yh뤹ߕחۢ蜶坸ꝸꝸ꠻ퟺ욵痲䘳噴暵盶蜷霷零蛶蜹젽롻k߫睷垹럺䛹蜻蠽꡾룽줻룹顷硸蠷砷矹蟺읻꛻윺顽阶砿ޛꟽꜸᘵܠ϶ȼ˿οѵ͡Đࢼ䝸䝷埸ࢺުܯضиʸʸʹɹɸȸȸǴ÷ļɾ˺ǻ͹ƷĹƼɸŲǿǿżɽʽʼɻȹƷij¶ĵĶĶĶĶĸĸķ÷úĻżƽǿȳw暱Х̩ΨΧͬбկըМț͝ՠ蘷ꖳ씲풰閶땵捰ۍu ttttt0 ")-1>@FYQ[rkvw9Fc 1=F]6AU&=33A_mqNuxqqqqqo',7;CTP\sCRj>I`w(2OP`钪랹잹잹잹잹잹잹젻ퟺힹ잹쟺ퟺ相뛸뙶零頻흸꡼ꢻ휷飺Vi/BQqޤڬ蠴ݏȌà԰矺좽㖱㘳嚵眷韺졼렽죿螸i׫韹砻ힹ뢿螼랽꠽꠽ꤻ뢹颸衷砷矶杶蝸Ꝼ으홺똸雴柶蜵ޙ隷ꑮᔱ䚸飿웶☱ۤؿҩƐϖ؟覿䠴ݤնֹйлкϹι̸ʺ˶ǹȾ˿̼ɼο̿νʷĹƿ̻ȻȻȻȹƷĵ²ɿĹǹǶĵȿ÷ùúĺĺĽŽŽ®rx맽تҥͣͩѮԭѩϧΨѝʗ̟ݡꙸ땱헴뒲琴㑴 xtttst  &*5Y%Fʭ흺웷훷휸Ꞻ霷ꣾ褻렷碌띷 -M{ީQd"FʽAQJ֒COI|{%{LXRU_Yѹý& ׮jtnϴ!p|vϓ͚ܜ嗵䘶۝ݶєͪqrrrrqqqqqqqqqqpppppoppooooooonnnnnnnnmmmmml*/:"0Y`v̘զ뎘6'HEX}헶阷꠾줻♨dpnj @(8]㟵ߦ윷顼妴05Ngx藵ةᖵ⤾져⟺젻헵撰ݙ敳䗲䘶瞹띻윷间痴㥾ꪺߗ5Cgݪ젷奼꠼외똵薳書롾朷隶噵䝷梼륿젺闲ޖԤոٮș̠ڣ锳昵⠻ߴۺԻ˿ȻžϿڧɐ®ٵݿͻֽɿɾͺɼϼʱɿü~Qc\۹ӯ .(ý۶¼NZTȪΕ|[e_Ա!+%νĵQ]Wןܙޗᚹ柾㛷⠺ߤ㞸qqqqqqqqqqppppppopooooooooonnnnnnnnnnmmmmlll$*45K4\FUuFWxGZ}dwΫ를雲ߗ⢼렴׳fk5@^䠻盹꠹롼ꕲ囶藱嘱ݶ~ުޚٯ寮槿폮㜼根n~;hq$/J"-Kڳ꘬ա垶䕰ܧާkں߭ꣽ◴ۣ꫼-=IݺܻڰחƝԠ➻蠺頷眴✴ޟؤԩϴнӽϺ˹ʸ̹Ͳվͻſ̿˾˾˿̼ǿʹASL[kdTb\-93¼ψѺt}x~ƿҿȞn~w{Ԭ|晳雵뛸띻읻욵虳陵띺흹ꙵ뚶蕯ooooooooooooonnonnnnnnnmmmmmlmlllllllklkkkkk',3BKUjdr!= 5M]Sf$3T~rATyH]â暴✶垸盵䘲᤺㴿9@Ydo&5V!F+@fcyک硻-ߡ䜸硸ꢻ퟿ꗲ塺줾8Lu"H-RRdi{?RwFY~}ꛯؠ۲-PL[{amx"?|ԣپ騿ysyh|q!5XUhPcL_臜vЭ窼ᤵֵTdq'7=xͰŲ̶ӡˣڠ⢻硸蝴暲ݞئհԺԽѹʴúǿ̼йƻǽɼƾȿɽǼȺƹŹźǺǻȴӛ 2+t0>8We_ýn|v̺Ѿɿʾۣ횵횵훷훸뚷꙳雵뛷휸옴꘴꘳蒬ooooooooooonnnnnnnnnnnmmmmmlllllllkkkkkkkkkk#-/8HHTjky{4%A؊&L>NrᮾWg'Ly\q{㚲♴柺앲呮䳿(F^mܥꐬۓ࠾쪾y|#.Iߢ䞸桷磺ꟽ읾인ꙴ摫ڙ߉ͯ;Ox /ZlUe 0 *-Q"5X9߬띶ӫUj&^n?Ol.>[иѵ摥`r4Fe&Eo!1NXhz#?ʌ&Bps 5L_*=`-=aP^sʛYfn&(!κЛПڡ㠸曳癲䙳ᚸ۩߬ٴԽԿмǽ̾;ɸ÷þ˺ĹøĶµ·ķĿ̹Ƽɻp{0B;-;5:HB+93 ѿ̲ƾȵ½̵ԿΥ¶õϛz욵훶횴꘲蜶쟸ꖱ閱镯撬ᆞvbtNZt9BT)/<#,%"! !!!   !   !"! !!""!%",%,:8BVKZtet$>'.Iӭ唨Ѩޭ߭%6W,Oށs휻 ?6y碻矹眸瘶瓳䓲唳揮㚴톓"#7mv়堸样堸柼鞼랺靷榽袹.T"5Z㜫̇甥v覹ޝڠݫLcD6LpٮYln#bobou(7Q-:T6|*BU`vNYoow(3G%=gv-9[ +kt#+BzozMZX*$ѱʟğӠݠ図痱痲䘶ߥӨͷɽɾɻźʻŸ¸¶˿·ķӽ̹͑Ϸפu~ɸǟƾëº̺ɹɻʧöƽ̨ƾ͹Ƥp{울꒭嘲螸햱镰蕰蓮啯剢{j}ZgHSi:BT17F,2@)/<'.;'.;'/<'/=&.<&-;*1>(-9*/:)-7*.7  &)004<%&*2.2;-19-1:'+4 +/9-2=(.9)/;*1=&-;'.<*1?'.=(/>(/=/6C18G2;MFRiWgu`g';Fdާॸۧٵ"2VI\GY~y⥿읺뚮קݿn# C|ߛݢ禽ퟺ윷Ꜹ瞷Vd{#)<ϭߦ桹矵埶枻蟼頺頸棺琦Юz 3I\嫻ዛ"x㤷ڪॹTj,;Qz떯ק\qo :9Gc$@MXsOYq0;Q_h|9BV *pyBK_|HSi#-E{4@\ 5čgsu*75ȟȢ֡晱癱囶⠽ܗʞİξƼʻƽǻŮúĸķö¶·ĸŹƼɳžǺӴĽб˶¼ɼȯļ˱ƾ̻ȶ²ǿɽ̼ѲĽ晵눧ܚꜺꚵ蚵蛶雵뜶윶웵ꜵ钫څwgyYhLZsFQgCLbENdCNc>Ka?Mb>Lb>KaBNcBK_EM`?FWHM]*/= #(3FLY@J[?J]=H[@J]AJ]@I[%6!*;KTfFPbBL_?J]?K_AMbAMc@Mc>IbCNgEOfCMbHRfWbwfqmzz6D\ '&^j㡴ױk}%7\+HO_hs_o\nUfYj^ndsFSpQ_{escq_o_n^n^n\m\l]jam^jconzbmEQg8DZ| ,}z@Mmڱl~ᘫОנ۔-CmQi闱ߢ觾{L_PaZk멻꫿梁먻l~,?ǧأޤ꘭䜶줿띴⩼笺ޫز.=d0[ۦ㟶䥻媽㇗$4QUd~׭}&퐧աj} E&6[妶ڥڶgu%>\bu!%8pv%,@.4K^g_n짿7tuVWluz:D\sҮ³¾Ⱥ~lctmh|WnWo]ug}mkyxeqqcpnlzvixts~dsoZie`ok\mij{w\miduqj{wo|rpo~vzdtmpyvlztw~v|lxrjvpx~p{qs~tz{vw~}y]gaݟ蕳䏮ጬጫ잹쟺ퟺퟺퟺ휷闱㑪ڋчʂ|x~vuonv]hv#*C9@WQZon|use|pv~sxz||ywtu~xu_l$>$9C[:6Ef~dysk]uk~es .CFbPSo ) 47C_sasGY`VgdYi^izlL`TTifEX`9La7Hi4GmAS|DW}9NmH`t\r}kt}}y¬λȹƿԽѾٿܾۯې╴雸띸띸랹잹잹잹잹윷꙳售ܒُՋЉˍȒ̌ʊɋˆĆKYy" 2&/L#Yc}Xc{Ƃuφ͇ˊˎ͇Ōʐϐϋ͈̉͌ΓҌGU~,Q+KkuഽЛ1搛',&&Lѷ䣵ڨߩu;+>a闶㟾뛹ꗶ陸뛺띴⧺H[~?Qnܠءߪ䕲ߡ餻룶ᮺܔ%0P Dβ쟯ݨ覶䨹魽cq)nzx| /ܓǪܭ]g3:Skriq~:A\Zaz",D&AOZuEQmAOlJYy(H"3Tx]ottvr[b##,Nͣҕäַͷѿ٪ΥԮ䪼᩼ߙɮ־˼Ͼ˽ӿϾжݻͦӼ̽׽ʽо͵ÿ̳̿ϼȬĸȹ͸¸¹ýǭ÷ҌZo˙᝹ڙ零零隵蚵蚵蚵蚵蜷ꚵ痱㕯ᖰᕯߓۑדјӓӕ֚ٓИ̨8Cb)HOXw$-M5>]fsnܒ憢ז售Քېؒ֕٘ەّ׏דښߜߑu܂*Flv؋'"ՁWj8(:_ر壴վ#Cu"0M6A_|眾闹䙻斷䖷䜽ꕶ㑲ޔᘶ垼렾ힺ韷娼:KlO^~䨸ݢݣ%0L!A٦௿ꡲݣބz~1?\#:sktin-2G(:EaDQqM\}bnYf.6S:A\!&?;AXKPi",;Fb@Kf1=Y.aoժٰ⪻ܰ戛+Nۤڼ^mlxV_*3X9DjמӨ޲̴ۨϼаǿʸڤƚŲ㦷آѮپӼ̺ͻٯϿ̴øʾں޷ɽϴ߿ϱѮɿʾϴŹվҵʽŮewvBYQk뛸뚵蚵虴癴癴癴瘳昳枹웶蘲䕯ᖰᔮޑُ՘֚֓Ә؛ْ͔Ƨ-8ULVt쐛ǵjx\m㔰冢׏ޑ݈ҖݒٗږٔؑՏՑזۛݗؙؖѡذ)E5mymx,7Wݨex 5Eiݫڸ㡬 (}al;r}:Jgѥ雺ᐱ؜퟿萰٫飽奿样ݟ٫:Ggt騴ظ塴׌{u|ITt (al]lWg\lDUJZEU7HoL\#1N9E]gr7?V(/H_jĦؙΛϭݑy_f7>Y8)GYdN[{*8U*G-MVgߧߢڭ橾䟴 3Wjl2%6W 0T @etӲ좵ۥݳ碸ѪӺݬطŲǾМѢΥЯնպѸʸǽɼǺǽʼҽʬܾͧ˰Ŀŏspŏ}xŻo~IaWIaWԍfypz]neVe]yl{sDNH=GAؘ]sh阶眷ꜷ꛶零隵蚵蚵虴矺klkkkkkkkkkkkjkjjjjjiiiiiiiiiihhhhhhhhhhhgfgС֐2+Raš#3XBTy梷ݲ멻Pa0XcOZvIRm'0K:C^6A\#?{N^{մ؎Ł˧ӳݫѬ2;VBHeRZx>FdLVt6B^9F`$4K,C5D^ZhbpFSsNZ|ׂϜܗת璣)F (%A#1Nbqݷ椹楸㨺ビvܕÉݷ歾߰稽㤺잵⥼駿饻[o6 E\o!kܕͪ쭿蛭֚ӳ얫ƛȹВֱʡĨ̻۸ҷͻ̾˹Ÿ¸¹ľͺɹȔSd`4EA!2.-),((737FBUd`ļr}-?87G@#ƿs|hvp5C=HTNFRLzUh_@SJЛ\kcþqyr   קޠऽ韻ꑯ잹잹인띸뜷ꜷ꛶韺kkkkkkkkkkjjjjiiiiiiiiiiiihhhhhhhhhhhggfgfffz}€(NG[h{atͪ꡷ᨾ祸ޥkw[czumxj|0O@VrЧۍčz~7Kj*G ()06,$ͪϘ793&("24.qsm|~x " fjew{v%FȜۚߠ韺인띸띸뜷ꜷ꛶零隵瘲kkkjkjjjjiijiiiiiiiiiihiihhhhhhhhhggggffffffhvhxk{_qEX~J\❴᥼頶׺߬#+Belcj~`j>Jf)J`sq'=a 3T-LZnK_~4FeASr9Hh &-,7R8BZ1CJ^U[r=Ecz$,I!7alfr(?䦻裸埶䞴䜳嚲曳鞶ꝶ蟶棺楼疯ᕰ㛷~g~奻嘰ޗ똳塸埵ޚܝ⢼ꞹ롽駺֗Ѳت옳ت痪Ϥۭbp&2TAPp"ܰ,B=Ż̽؊ٴڸ½ϼ͹ʻAPL ׃?FA½y{qup=>:VZU̿pvq cidtxsnrm+,(21--,(LKG݅TUQ'7[ʫ럸䓭ۚ囶零零霷ꜷꝸ띸뜷鐪jjjjjjjiiiiiiiiiihihiihhhhhhhghggfgfffffffffNZqWd~drn}ӭ螳፤ѓՇqgugr"*A %=DXV^u=HcLZwn~owtڗͫ᥸ٷ騷6Ee#AͱӢLPl#MWyδ䛨'A #%5RFUu样睶蜵皵蚴꛴욵零衻餿릿饾꧿蘳斲虷遙d{褻虳▱䙷砸梹梻砺蝹蜷雹ꜹ蜴➴ޢߧॼ♺욼֪֚CPp#у'D@Pm7LIҽᤰ 0;?ûƻ̴ؾͽμ;Ηq|x!/+ł bidףx~yű%)$AB>͘ Ʋ,2-EKFƲ-.*!"|}y 540651u㢹晱ߜ囷晴癴皵蛶霷ꝸ랹윷鐪ijiiiiiiiiiiiiihhhhhhhhhhhggggggfffffffffeee7>N=EXEPhLXvRaK[Z ,H=KgӶ9NKͿiuu1:=vu\igͼ˻˾JYU'#s}1<9߷¿KYS mto hoj#}!ipm'.+RYVszw296TXSvws~앭۔ܥ零零零零霷ꜷꚴ攭iiiiiiiihiihhhhhhhhhhhgggggggfffffffffeeeeee$, 4(2N2>`FU{hxĚآࢹ楽뤾즵8"?ݤ顸娾諽恓 :٪֮ڬܨٹ妾螵嗯㝷횵䏫ڛ뛷혶헵열혵떵蘸霽夻駾뙴杴䠷啨]o䩼祼꛴暶쒮䟺줾菉흹蚶囶蝹蛶蝷朶圶坷堸桹砺蝾똺喳إ੻v 'clӫ~/;WR_yxQanSgbГP[Xy̺Ѻɺʿտл̽ڃSa]p{xNYVv~¾˲ĽASL:JC_ohO_X¾ڙ 3?9eqk/;5r}zYda-85%0-GUQWfbBPLP[XU\WpvqY_ZQXSڞ眸睹蠼띸띸뜷꛶隵蚵虴痱㓬iiihihihihhhhhhhghhhhgggfgffffffffffeeeeeeed$-38FMVjisͣ৺椹梷䟷ꝷ夽雳ݒϪ⩼ᗪ5+PĮ騾矵ޤ頻퟽㘬՞%I%isJW}O_雴閴휻뗸揬٘ਿ蠸ꗶ頽왴왴융횵햯疲蛵뜹쟽㤻騿勵ꚳ坵㢷䟱Ufߨ㩾략囸듯基읹螸砺餾젺霶䚴㜶培衻꠺雷旲䕱ߑַEQmgq^e~ 9#ju٥Ͱճ$19ͶŽZc`N\VӺʿԾϺ˽,(n|x⧲drnۼԼ˦۷9IB?OHʻ˼ޱ!-)վͳ¸ɹȸŸ|㢽윸瑭ܜꜷꜷ꛶隵虴癴疰⌦hhhhhhhhhhhhhhggggggffffffffffffeeeeeeeeeddd!%/18GJSi]j{ȍВٟ榽왷蟽흸ꓯޛ㚲ꆜ/X 27Jp띳ܣॺYfAKi木?OtJ\۰㜶쒳딸욼㥽썫◷읾익띵띵딬♱執롼䣺覽꛴架䡸妸I\ܡި훴朸相뙴晳➸祿霵᡹硹瞸睷晴斳敲唲㤼ꜰٜ>IgdjƵՀ )ضٓ+4>BNP˿ܻſ}tyw!(%Q]WѪºƼʹͼνϼλ̺˾Ϳiws4=:ĸȻժȖ}0)ewpκBQM+'ҷȳŻحĿʦ闵査ꑭܘ昳晴皵蛶零霷꛵猦ևzduLYr7AS'.;!*% !!   bfffffeec'    $"+'.;6>QGSnds{ђޚ韻ꊩܔ暹陸휻AU~ .Xe䢼Ꝼꚵ᜵ݫ⃓(5OjtӼ尿ʁÈϙ⤿랻蜺뛻쐱ޞ葪ܢ퍨颽져쟷롷뢸죺윳埶梹须頺衼矸ꞹ잹인뜷Ꞹ硹穼?S|ؙ٥열盺ꔳ晴杷栺飻餻衸垶ࡸ埸䜶䙵䖴唳擳薳普ۚXa%BSTn35M2^e~lx>NkӔDRe6BNV_cĽǼKSL   ҸѴƲƻϸ̷ɶȹʼͿξ͡drn 0;8=FCesoҭļϽϲǿϻr}Vhat}_ohw}{ݥ r}ͷƽݼԼй؊r⓰㙴璭ߙ⤾헮ޘߚᛴ杶蠹뢻阮ܖׇl|Ta|BLb2*2@,5E4=PALdUcl}z֟〉ᙷ헷쒲헲䖰ެ(;\|瞻眶ި㋟ (9F`=No5Ilݵ♵ޞ鞼퓳䓴圽랽ꙶ㜶姼裼㟺젹령럸ꢹ룺쥼碌줻랸睵㝷壾ꜷꜶ욶웷ힹ젹뢺詿:NwӖ֤꘳圻쐯䙷衼젷垳ߡڜޟ䠺螺陷蓲喰߲%.P>Cb͉HVz⩼$6S:H[ٽ̲żerjdkhʹʿηƿйʳijĸɽνξ͘izvּɺѿβ˺ۤ &# {OZWĺǬؾ͵ƺ̾Ϻ̼̕mޜ㜳㗮ޡ螲꨻楺秾릿똯܇fxJ[4Bf1>\4AZ1=R-8K+5G+4F,6H0:M4>R9BW?H[FNaJRdHPbBJ[ %JP_;VJd eeeeeeeeeC (%,8/8G6AS;G[>I^?K`>J_>J`?LcFSlQ`}`qvʐژ杷윸핷왺으휷锯ᖯᙴ斱䤿韹DX{l{&8Wիfzmش߾⒫ם䣽뚷䜹敱䞹윸땴镵꘷꡾뚵蜴蟷룻料띶蜵眷韸ꝸ꘳唯᣻잷顸橼H[ʠݦ蚴♶陸틪ߢٟ꙯ܥ֕Рߢ䣼횵ᕫgq(-F)/FDOeuOb@Sy߫윬FVz!9LXbɷESMT,Br,[;NyTel}Зޟ堷壸䤹⨺ᠳؐ~vx~yvtuxyy{,NQ`eeeddddddccccaP(=H\N]u[lexmppqsv|Ŏԓܗ㚵眷ꝸ랹윹왻땴瘴㗱ۚ᡺앰㞺웶蜶׆.O$(/HŽLUiۢɋ{8D`&A?F_*5P 3Vw頶㥾ꟷ囵㠼럻ꚷꕴ瓲疵꛻ꞹ젻흸뜷ꞹ윷ꙴ皵螹쟺ힹ윷꠸쟹ꞶYnŨ晶隹쟺쟸ꢼ땬ܐզs>M`͟٩㥼e|%8[#<!4`i}IZtWkӝ١ۣ֥֮)1`mk;ˮû˨Uc]6F?-%˵Ž͹շ"+%\le5G@ż˳ּθʸȷǴðǿþ˶ööŷƸǶŵĵհŽоҴ%Q_Yʺ÷¹ºüŽƿɹĈvZqtǁNjфʠ㪾꛲䓪ڡ硹桹䘱ۏьϒכރǃƃǃDŽȆʉ͊ͅ’| jeddddcdcdcccccccdKbncsoy}ŇˊΌҎ֖䚴曶霷ꝸ랹윹웻ꔱ䕰▭ݕܜ夼쐫ݝ⦼掖uy-/Anq IPaKUm|۪>DaEW|˰ᜳ㘲⡽젻휹욷ꗶ뚹쟺ퟺퟺퟺힹ인띸랹웶陴皵螹졼ퟷ렸젺ꞵWmv㣻锲ᐯ䖵蝴䧾슡AX"7d0ErVinϟ׭릺zAW{$>cu֖ΙѲ穸٫.:FP\`μɱƾ؛5G@]rjܼӻlvp 딤#3,Ѹֺʼ̾οϼ˸ǹƼɽʻȺɽ̸̽ǷƹȬӹע:A<̽ƻͯž˺ùĻĹļźŽƻƷ†v楺훰㙰㜳囱埵饻왱啰╳╳ᑱߎݎݐޏݒߑܐݐݒߓߖߜukeddcccdccccccccbbb dCn_m~x~Njђٔݔޓޛ眷零零零霷ꞹ읺횹閱䘱㘯ߗݝ榾啱甯⡹磹㬾㬵᪫MNc !#8 A'.O7]a~T[|ঽꞵ⡸埸䘲基쟺읺ힻ뚵蚵蜷ꞹ젻뛶陴盶韺ퟸ꠸쟹띶褻Vnaw⟹葱⎭䖵蠷L_Fcx⣹㙭ָڡװ䩼GZ{5gwhvܠةষp~-9Q[ctnxҽ̼˻ۧԷƻʺ)0+PWRqz"2+ʫоһʹȽݿ̽݀%fpjͿտ̾ɼɾɻȼǹƺŷĸ÷»Ƌz䢸蠶景ߢꚱ㘱㖱䕭ᕫߞ稽옶瘸镶电敵陸ꏭ♳ꗲ疱旲皵ꝸퟹퟹꊲmccdccccb] ccccbbbbbbbb)n:i}v~Βژ┮ޞ랹윷꛶隵蜷ꝸ럺혴ꕲ嚳埶螴䛰㞴襽ꓮ犧薱䢹颸⬼ux/ # "^c|;Egz׍XdENp 1=ݛߘܠ띷柹螹랹뜹쟼꘳昳暵螹졼陴癴眷꠻ힶꢹ뢹렸윸륽_vVm꡽앴琲蜻ֱ;_pl˴ƿ͸Ǵ÷ƻʹƻȽƻͿǴ¼ʽŶľͭ"ٽȫļûƹƶŵij±ƾŽ׎ )0+ԳĴijõźʴĵŷǹɹɹɸȹΒꗯ㟴}6Gn>!)7TŶ覵ܧ㛮ل^s̓ҕޕ噵뛷홵ꗳbbbbbbaB  "*.9EJZ]dygp\d~ISk9SS_````_______P_z_pdxmҔߚ枹ힹ옳埸ꧾ꡽BNp4Gh㘩kzizsbzȢ韾떷嚻隻頽꠽ꝶ螷霴褼蝵雳磻睵頸좺인띸뚵螹인똳柺➹젻욵蘳晲䟵塷硹ퟻ엳陳✳`vؚګ馼_k9Dd֦֫莟8Fb֪Ά:(:Y8Klooɥ룸웮{:Fh )py}܇amahyu_pmٴƿȶƩǽɽƽʿȽƳضľbpjO*1>)0=/7F?I]Wc{tN\yKZybk!2:YR[zal~v_lJVm)Z=] ^^^^]",/7GDQhev~ɑۙ堻坺홹꛻읻ꚸ瘴㖱㘳晶鐬⟺\k9@Q塵ޯӆȭ৸㝱ߎ욹砽䟹磽鞶Ꞷꟷ럷랶ꞶꞶ꡼䛶飾ꜷ꛶隵蛶鞹젻륻룹靵闳镲똶흹TcU`~5A]?Kg*5S3o觼鞵垷霶农 1;!+C 7!9fv͝ឺ韺옳播뗬ߨ雬ӑ 5AMќ/6/ӡ_mgְǿ˺ǽν̶Ʋƺ̽tz CMGٵϽƷ´ɾ˼ɸǷƷƹȻʼᣪӴԺǸżɻȺǺǻȼɾ˿ܐ져젻ꕰ㛷헶뙴잹㘬ܦ✬(7WZXauꏥz]n}밾衱ܝᕫߣ휺昴ꓭ㟹西쟷랶ꝵ靵靵鞶Ꞷꚵ蛶頻ꓮᚵ袽렻ꙴ皵蟺읶裷磷砶ꝷ횸ꣶᢲ&3S$B&1M:Fb4B^ޢ礽vh{ӅZby 1|瑬ؘ㚶墼랷闰⣻앫ߩޠo(Tai̮[cY}261Tb\Ƽʪ¸˷öƼȶƹѼήϹ_lderjƾƾ̮ʼɸǴòµĹȾ˹ƾ̮PWRعչźƽɺȼȼȽɿݙ㝷曳᝷壻陳➹쐭롻꡹핮pH_}衸嘰ޢ饾閮☰曳陳镮㐩_AbfvP^|BMe>H_DOhSa~evxk1Gk枴ܤ夽妼Sh!+G{zak}ajyPYe#^.[\\$+61;LDRj[lvϚߟ矸ꟺ뙳阳旲䘴㚶圸硹碳ު} !喥BOoרثݦݧ⪿쟵執렺땱璬⒭㚵蝸뜷ꖱ䑬ߜꞹ젻꘳斱䣾훶零靸랹인뜷ꚵ蜷ꝸ뜷ꚵ蜷ꣾٲ䟺퟾ޫ9Gk0Ӱٲ߶禼ߥ甮ܤ푫ڨDX԰۽}音ܟ碾햰ޛា䡸衸Ꟶ隲旯㔫ۭۙ戝Т  l|uڻë˾ɻճǻ½Ȥ`th#7+ Ϭʿ˻ǾЩǿҷҮǼt|&2, dogiynϻúĸ¶¼ȸŸĻǿ̻Ǹՙ䞸皴➸梼꛵䞹뙴矺囶闲倛΂К璭睸뗲喰昱雴웴엯撪Gml}[jP]zP\yXffvvĘz,Ei㟼袿잻社꠹Rh/& )  ""1DKZ9YJ ]\.7G7BVIYr]pxЛޞ䞷靸렺흴윴蛴晵䙵䜶䠸ⲿ娯pq !67Ϊ߆43>Z =5Se䞷韹땱瘲薱䕰㗲嚵蛶阳数㙴盶靸럺ힹ인뛶零零阳斱䞹쟺ힹ욵藲嗲囶飺쪹꯾ꚹ쐯❸ꓬز,9_ ij୿ާܩ直ᛵ㛵;S}(#G&4Q".JCOkFX}럹䝶❴᝴❳㝴朴蚵藲售ܖ(:E^jjҹµݾɍbsjӷ˾˾˼ͽƽź´ȼɽƺ:PDv~ĹǗ{yǽʧȻȷĸíIWQAKE{ŷ¸, ]naƷ˾ȺƸͿͿͿøõʾÇ睸ꙴ枹뢽睸럺뗲噴眷ꖱ䞹잹옳搫ޑߙ眷ꙴ癳霶잸镮␧نrgxaqcsl~wǏҠݍ)@jԥퟻꤿ瓭ܶQd3Dc?Mh9D\AJ`0 &KVhOal`&:FZ>LcUfcw|ҙߝ杶蛶霶쟶흵霵皶嚶坷堸⫸9A_1bm롶֮P[v>IeR_6GhXkޕڝ䝶蝷ퟹ헲ꕱ矹薱䕰㗲嚵蚵虴瘳晴盶靸렻훶隵蛶零陴疱䝸띸뜷ꙴ疱䖱䙴瞶꧹뛱垹욹쓳䡽EP\ҧd|R{s C櫽⏡Vh竺۫ +I >ܤس쥼靷柺잸睷坵㜴⛲⚳図癴璯⓯ޑӫdx t}L]Z_roPc`ȷʿҷʹ̻зоؿ͸Ƹ087 sxwftpʹľվiwqO[Ukrm% ӪҺȣøǺɸǵö¹Žɹz痷앵꘺픰数㏪ݖ▱䚵虴皵蛶阳斱䚵蠻잸뚴陲痰㏦؋ҋьӐٔߗ䜳楹^rl횵r?bq, b] cp)>VhO^w0wvonwĊђۙ㝶眵痲哮ᔬ▮䙱眴蜷꠺飻驽~ 3 $dkǟtLZwT`|zIXy:Lq墸⢺蝶蝵雵뛵뙴욵휵흷횵虴癴眷ꞹ인뙴異㢽흸뚵蘳旲坸뛶隵蛶鞹잹웶阳흸뙵룽ꢽn(;`鬸ylz,Mcr呠 :~CPpanܣڣូ홵䜶䟷執垵囵䙲䖱䕲堼듬֛ҪAQ] P_[M^[4DCl~}ζ׶ʭмѿͷĽӼemm %&񽼾5:9ʥN^W E`u驼ݣΨӼ]nPc睵㟸ꜷ꛵뛵뛵띷ힸ阳斱䗲嚵蜷꛶陴砻흸뙴異㒭흸뜷ꝸ럺ퟺ훶阳잹쟺ퟺ훶閲衻熙ybq{=Iq⠳٪Wf >:0?ǣڳ줺䡹璭ߠ曷朶䜶䝵㚴㙲䖱䚷ꎩ۟挤Ȭٻ".8[gi߿ȺSb^GUTИշʸ̵ɱûнɜq}룰djiیԚ&4. =ICء ꔛIPKQ_Yͼǿ̪̽ǿ˸ȷƶźǼɾɽڑ⚶喳書라虴眷ꜷꝸ뜷꒭螹쟺ퟺ뎩ܘ曶靸뜷ꙴ疱䗲䗲r,\\],yB`Ҕ؝ۤ䉠lڑr.[[[[[[Z[[ZZXHoit{ԏ۔䜷꛶闲哮ᙱ皲虳陳陳隳囲ߠ٨ &J[|Q`ʉ꒩֌ՠ띸뜶웵뜶읷왴瓮ᒭ㚵蝸띸띸랹젻똳支␫ޚ虴癴睸롼인뚵蘳暵螹젻웵뚵I[zxΡ텎CNt笿emyM\}쪽㚰ڛᚴ㡼؞뜸盵㙳ᚲ⚳噴疳撰៹痱֑ĵ-:JLX^ָǿԺбdqo*(Tc_ÿ͸ǺܨTc_(62 )&?DBM[U wӰdnhZd^,60DKFdkfy{,&&81ҪºӾλʻ׎ᢼ蟺옳晴癴盶霷ꞹ쟺뜷꛶零隵蚵蚵蚵裾옳斱䘳曶隵g\\\\\&s9}̓Κՙe}+{@[[[[[[[ZZZZYYZ cn}Аܔ㘴霷ꝸ띸랹욲梺镯囵뤻箺ܹ.7R%Ashw᯾ߕנ培蝶蝸랺꘲虴盶靸뜷ꚵ虴盶鞹졼뛶隵蛶霷ꝸ랹젻陴磾瘳旲嘳朷꠻휷젵 /I/;Sbgls>Gi婺ix!=(/JX_z‘͚Ҝڞ㞸睸꛸뚷ꐮߖᛵ㚴☰ޕޘ㙴矼ޓދΫ䓦&[!).O38@]x| ,3##E՜ڜ឵囶蚵藳镲咰ᕳ♶㚴♱ߕݕ喳~Аߛ㣺(D*8JͯĿ6=6KRKqzpƺ˾Ȼɼļ»þƾƻ÷˿w|ɾƁhpfż  ̽ѳֹſ\hb ƺǸѾκʼ̽җ^s룹㜳ਿ옰ޛ晴癴皵蚵虴癴癴皵蛶霷ꝸ띸뛶陴瘳暵瘳嗲䙴朷靸y\[[[[e$O\vTcevmE]iZZZZZYYYYYYYYXYX7[M]kdv~ϒ蛷잹쟺쥾ꚳ랹ڪߦ">KXrJWw% ;:Mp*O}_u|椾훶零隶웷흷흷흷휶욵蜷ꞹ인뚵虴盶靸띸띸띸띸띸랹잹쟺퓮᜷꡼蓮ᗲ基ꚵ虴盶韺ퟺ흸뜵眰ߧ埲 ? 8~Zf~AKc߯BDc(+J-6W(HZa|fmӜɥߠ➵嚵虴畱畯呮ᓳ䕶䚷䘵◲ޖޕ䕲儣ؑ᝷昰ڨK\}%7CO'++-oyysxv)/*#ĹǸɼ̽Ĺʽ˽ſɽͼַt}sΦպ͸۱Uc]]mf׷õʴѿλʺɽɼȾєTi㞵➷靸띸띸뜷ꚵ虴瘳晴盶靸랹인뜷ꙴ痲嚵痲䔯ᖱ㚵眷@`[[[[['V<;FZEQh[jcs|*WZZZZYYYYYYYYYYXXXXY#KUi\ltōڔ嚶띺ퟺ딯疱꡺韯ݵꈕ7ʬ׼穴ԋԗNaвښ盶零陵뙵뜶읷ힸ랹쟺䝸杸뤿윷ꚵ蛶鞹잹윷ꝴex3V+L"4Q: 25;XORq68Zu|>ں粼ک19VntouiqU_ϧ㡷睵阴ꗳ镱畯咯▵蕶瘶噶㙴ޕ♶阷앱睸꒪ش6Fc.=P1?K%7>9|z˿ſſǾƹ¶̾Ŀ˸ʺʽ*5+ »;ǽ֯ɴĽ}n~w͸Ҷ¯ǽƴúҹȹǺƹŽžԔߜޜࡹ基젻흸뚵虴皵蛶霷ꝸ띸뛶陴瘳杸꘳哮䚵e[[Z[\.:E09HSK9PHTkcɻиȲϻƸӪĶþʶľ}{旲䜺뜺띻왷薱䚲朴蝵霴蚲斮⒭ࢺ욵藲嗱癳霶잸噴睸뢽勵8SYYYYY9(!'2,4CALb_np|mYXXXXD&'$ +#)5(.='::WWVVVVR 8?KMYngw|Вᕴ藶뚷꠼䟺椹줴 7vتۊ&$ @3Gf3Hhߋϫ頺윷ꞹ젻훶陴盶靸뛶韺뢿螹쐫sϠ떲藴眷꠹렺颹槺qQl͟웸壺睯ؽ?+٬蜳㘩, - 5$HНۢ霷ꗲꓱ蔲阴ꝷ흺혷씵畳䘴㞸栻睷嘳嘷욹蛹䢹랲՝㠷ݴ>Rd ˿̻O_Xp{[lhڸվҺϻٻͿ٪;HF璧|ѴøҭŽ͵Ҽȹźǿ̶»}}塿ퟴ럵頶꡷롹띵雳防蘱阳뛶윴꛳晴 r.YYYYX0*"(409JERj\ntOuXXXXY "(2 *#/'/=4=O>J^BSaVVVVVVH QKYubtx@_XXWWV#(4 &2)0?6AUFTlRd}OmsVVVVVU3  %'-:FOa}͆Ȓ凯鋴랺靴᜷閵蔳桻?Nn +F㞯ЈYn*J2%5 8Pd蛴웷흺휺뗷薶瘸靻옳晴眷ꞹ쟺ퟺ휷ꟺ휷ꚵ蜷ꝺ훹뗵旱噶陸霶姽3Fk5JXt~iyIXx䬶5>_2wbu`s]j_n`p!D E 3w䟷噳៻ꗲ䗴癵둮瓮疰朳埶䢷䡸桸蕰➽䓳蝺픯ᚴ㜶図顶颵-=T $̹Ⱥ¶ɾ׺ϼξγ¼˾ɵʻѸ[a\  AHCt~xBNH9GAؿȿкǶźɶżɺǹƼw⛵랶쟷럷럷랶ꞷ靶螷靶蛴昳晴盶靷ퟹ꙲꙳闱擭Z XXXXX&,'-;9CVQ_{fyz2|KWWWVL%%*7(.=4>QFTmXie{N|qVVUUUT %-Gޙ茲쐶ꟹ蚹㌬᣿=No *F䬿o090FiĴ∝t䓨ߚꤿ왷횹옸閶皷ꜹ옳晴眷ꞹ젻인랹읺ꙷ蟹蠺靸ꙶ铲猫騽㟲Ղ3A] )%Bnz52iyh~eu -$DLR˽̾θɾδƿ̿ǻ½˽ͱҺ̘йľ;B=?IC  ѾͷIJƸǺƸķùŽѿn|v琫ގچҖ⡹핰㗲嚵蛸럺흺ힹ랹뜷零蚵癴晴曶蝸ꞹ연蘱隳뙴攮Y XXXWX0'(/<I`Rcezr0wHUVUUU@% %.,2?DM]1;N!T_畮ߏꕼ읻외.RITr褶ێcy՞ڧۺ횳ՐҦ훵똶훺호閶癶雸랹젻ퟺힻ虷袼뤾ힺ阳啲왯؀^nxgv =*+7[dwez旱٬Paޣү㋞ew'+9CVQ_zewzcVVVU&77(/=4=PHVq^rr)t>UUTT W"52!,"(4/9HKWk\i#@9خ쟺퓳蝼蘸숛/Ѷ姺ݴbvRe偛ʤ៻閵웺훺홸떵蘴ꙵ뜷ꜷꝸ띸뜷꛶陴瘳棾ퟺ윻ꕲ嘶碻읷嗯ݛZpm녒GRp١Ҷ\kЛӰug}ꚭ|ة؞аn4Gmڥ䛳ݟ㝵㘰ޢ럺엲ꗲꚲ朳㜲✳ᚱᘱ㘳曷퐯䔱䗳⢻ׯ߭(2Q[[bme|}Q_YAROسȿƻʿϹȼɸܿSa[Ȱǭګ5E>ͷľ͹ɲ´ĴƲĸǵûùοοºººº¼Ľ| ";-HHZw㟶ܛ♴昵蘷왷땴떴뗵엶똷욷ꚶ웶윷嗲(u;VVVVVVUW 5]PUopzY VVUU(09*0>6@SKZuau1uLTTTT]+;A$*6 &2(0?6CVO_xoNVw ,fn娾흻짿镥 ()⣴Ւ]o}ewp<8k❶疵ꝺힼ훸똵藳阴ꖱ䗲噴盶零零零隵裾랹졼횷ꙸ햶뙶霺뤽쟷囲߮BU{|}juU`|frպ)Fp៰׮딫ثnߞM^zFWx0@d"E 1M`姽暲ܡ㡺朵ᦾ윶嘲薲虱囲✲✳ᛲ☱㒭葰㗵晳᡹鑡řU\kiqp081!+9D:esmESOҽӽ̻ʽӈ Եýϻ˹µϪ֩¶ſϷǬǾǹ˳Ŵŷù·˽Ⱥ˽ɹ¸Ϳ¼lzt%|j|⧾䡺✵ᗱᒮ䐭斳앳혵혶횶젺霶ᕯFfVVVVVUUUUUVUUUUUUUUUUTUTSTSS TJ7),5F?MdYlj~ϟ+AҦ斮ܞ뚹젿穴$+D$*A˼靭 >'90@W\nZlK]Qd٠陱疱䚵蟺잼훸똴ꗲ꘳땯喱䙴睸럺휷ꝸ렻왶陸홸흺퟽뢹栶٩5Ei7 +U`~KVrz稷4Ccbqॹ⢹暴➺酡k玠 A(9Z ?+N=PsmYl[p맽晱ۥ祾꠹妾엱휶익霳㛱ᘯݖݓލۓ启◵攮ܚٞ|5 &^ehITJuvanfΟӻʾ͸ǿԿɜ.<6͵ýɹ¾ɽʳӷľͳ¾ͶгŪżʽϲƳĹŸ³ɽ÷ȼӹø¶˿ʾ˿_mg  Zkt -t߱石ܗ٨ꔬ搬陵䛷㒭埵䜷ۗoVVVUUUUUUUUUUUUUUTTTTSSTSSSSSSS3DNfꥴo~uᅓiwtUc⤵栵袹릿꛶鞸픭嗱瓮ᓮᙴ碽땰㞹쟺웶间盺霹쓱❸ޞݧ࠳֤boHSqLWuۼ온̱Ud)}鞴ޫ눦Tnq D֧ު⣶dw2Xñ慨蠷䠷䣻餼ꝷ喰ߗ痱瘰䚱ᜲ➵㞵圷鞻뗴盶蘱ݥx )ougujx{+#AOKٻҾ͸κO]W uyٷý¦пν̿ٻк̱ð¶ȸʴĹǺƹźƻǾϼȹŷøļȾʻǺUdm5B\΢ݠ㛰䐦䏨昴왭ݫ饺িޚЕg!UUUUUUUUUUTUUTTTTTSSSSSSSSSSRR2Kk 4?[/Af BIXyhv̙Zgٞ䝳㞶䝷圶围曳隱问揩ߙ硼씯⒭뚵蚵蚵蚵蔱䞻㝷枵i}ATw_p>kz%4Tu4Fk&2T釟ɢ웼꘸雼⏭1Kzߪ虬ןߞ┫؝▯ۢ蠸ᖲᘲᚶ垹랺隵疱㗲噱嚱㚱㜲❴䜵眷ꕱ畴癴朴⚮ת|ƿǸǾۭ[kdÿеŻ˺ۍ+5/uy6B4@J ܾ-=On驹ލ䓡,9O%7,5C!(7,$(;bixӿҺ5FR/>P{Ep^YSSSSSSSRRRRRRRRRRRRRQRQQQQ!+.7HETkk|tͭ'K9Ԩ롽왴暴㡷IY}%8স݇Jd衸塹쌦ퟺ죾젳졵잹젻인띸띸띸랹젻啳䜹어嗳⛴ 2CSwt٣l!Cڸ꫿蟺蚺띻Ꞹ9QѤ硸桻Ꞻ阳听۠阶疳攱䓰㑮Ꭽތܞ잶ꞵ盲䛱ᙰ㓰㐬♶韺쟸䞱ׯ~ξٻʟ]rj%70׶̺ɮǽƾm}vS_Y·q{ugsmþ˾Ϳμ˹ȷƹȻʺǸźǾ˽ʶòǿƽȼʾ¹ùúĻżƽǼƹø¹ücqkDž]njFXQWh{iyࢮE,1:>AP-0?TZe %}vdqVbENg4 HP "(51;KGUjdr$)M䓱朷霴➲hq|헯ݡݗ郢Վ扬䚹땴죾曯枳꘰䜷ꢽ띸럺ힹ쟺웶陴瞷霵碽相⧻k~Tafu쏩ׯ!A9*4.'1+ʱͻļɺɻȷĴºǾϻȺǿ̾ɳĽͿ˽˽˽Ϳ¸õýƼŸÿSc\|[pn&<:e}{;MT6BNKTbxcm 2$5PzǸep~?O[BYh*@ĉƒtk|UdIUt=Ha8BV1:I.5B,3?*1=)/;&-8 '.9+1=*1=+2>)1=)1=#*7(0<)0=$+8'.:%,8")5*1>.6E;DVZexs{; 8Ĭ瘳坷朳সݿ謲SWj$;Ω瑰畴闳靹엲ꕳꚵ휷욶욷ꝸ럺ퟷ뒭줿휷ꟺퟺ횵蘳暵蜷ꟺ嚲敯啰蚸Zmp}`i*1J,7R٧߮NYy$Aӯ砷䜶陳⤼ꥼMcx根뢽렻夿ꙴ睺퟼菬ߋ۠략盰㚯⚯㛱嚲桾嘶眸癱ߟ៰ۑ)3D۸Ƿº{|}iyr/?8P\Vism>JDYgaȲǿϾͼ˹ȸǹȺɻʼ˺ɷƵĶöźǼɷúƼʼʸǵĵĶų·ƻѾȼɱ¹aslls'(Fetڴ沽/8F *܌˓փevaq[hVcHTjKWkITgCMaEOcHRe 3.8KDOb?J]BM`:EXAK_EPcEPc?J^=J^K^=I[?I[BM_Q[nepANi!izت頹댣мј:=R aiץ碽쑯蔳ꙵ뙴砻뙴癴眷ꞹ인뛶零霷ꞹ쟺ힹ인땰㟺윷ꞹ쟺훶霷ꝸ럺餼IZJQj^e~ݐջALj5Ҩߡ㣻钫ݶ⦽ꪽPcp瘱㙴瘳数㘳枹웶钭횵蚵蜷ꚵ蕰㖱䜷雷暷䛲⛱ᛰ㝲埵韷딱䐯♹꛹ꓭܙ੺뮺v|ޫ5B:   Sa[ݺľ#\f`m{uҽ̬û̼˼˻ʼ˼˽̾;ͼ˹ȷƷƸǺɼ˿Ϳ̺ɶƴƸʼҰ˷ǽžoxԹ礲#-7#+<޿쩹ݲ5?PNW`㋚".buۨןӜԌƂ|k{pneu`p_ods_o,HAOiapYg]l[hcqcq^l\kXkPdM_{Sc|\j`njvYd~;Loݡ╬ڠ롸裷௿㉔!>W_|ѥ㣺Ꜹ딳ꙷ뚵衼욵蚵蜷ꞹ윷ꚵ蛶霷ꞹ쟺ퟺힹ잹인뚵蠻뛶靸랹윷꠻쥽Vg4>\$+D=AYnuPb{8MVq꫽⠵杳㧾몽Sfcy롹甭ߔ┯⓮ᕰ㚵蘳播瘳晴癴甯⒭ᖳߗߚ㠶棺주옵虷蛶蜳㤺ﰻᝢ +DFPbhm*14))  #cnf}룭_ic'3- 1A:tŲʺɻʽ̿пν̻ʻʼ˾ͿϽʶų´ļӽՆ۽鞵+0+7AܫѳܪzɁv讼O]s"2H5F`y٠˜Dž}~w~z.>^EVuvpjzwv}qnobrWe~LYrHUo%Fƭ蜱ޥꏦԫ񍙻0 2kv⭿觾햴딳꘶ힺ읶衼웶零靸랹윷ꙴ皵蝸럺윷ꝸ랹쟺흸뜷ꝸ랹인롼摪✷&1O,3N祰%7\t]f榽螵娿쨾諿[nVl꡹瘱㗲嘳昳暵蜷ꜷ꛶陴疱䖱䘳斱䖱䞹ߔݖݙ⠸棺꣼왷蕱᧹覵㠩z{  3>IVʕN]h+9D$`nfukyetN[x>Kh|1>Y*! LFO]WyӾ睭վͳ¾Ϳоͼ˺пξ;;Ϳ;˻Ⱥǽиõک0<6  KQL۽ݶ舤Ofh)0 &!3#7AI`Ċ !]hpcmw5=Jio|jp}٦%)(*&(#/1oz~x09J0:N$: KUjwENg+3L7A[BKg9 %ANmj}\q8Lm"@ &N[u~tԮ檾檾筿訹8Df(J囲⌧ڗ럽꘶ힺ잷鞷韺흸뜷ꝸ렻웶阳杸뢽阳暵螹젻零頻ힹ젻ힹ인띸뜷ꝸ랹잹ጦܧ㙰ާ৴񎗲fq|q턏T_{%1S-Ne碹駾죸夷tH]훲⛴旲嘳曶隵藲噴砻얱䔯❸룾헲呯䕹ᘸᚸ᜸᝹❷圹曹螼똴㙲ު诸ޯfgu++1ѿɶձü\lejzsѹŸ͝ѭº־;;;ͼ˻ʹȸǾͽ̼̽˼˻ʼ˾Ͽ;ɽ㦴#/)CMG7;6Ãgur} &JKYDFP$(-x}|CKJNYWԑ$'4NQ]ƌ'+<QUiԻי-1K)'A_jЭճߧ٠֦ܟ֑m|;0;[̘֢덪ݐ旸어랺虴眷ꜷ꛶零鞹졼휷꘳枹좽藲噴瞹잹옳晴碽젻ힹ잹쟺瓭ꙴ痮ܥॴhs%@bnScgz詼ᬷ8.Er흸ꟺ줻를ꟴᠶG\ߝ藲嘳朷ꙴ瓮ᗲ堻闲噴矺薱䕳䔷㔷☸㛹❹➺㞸杺땰ܢ뚦ltZ^vмǵ~\ngGYRgyrgwp8HA0>8:HB^lfýƹɺúչƼɻʿλʺɹȸǸǸǹȹȹȹȹȹȸǸǷƹƼʼǾɼ˵ý7C=coi}|\b]T[Vݾ|) !OOOOOOOOOOONONNNNNNNNNNNNNMMMMMoyw@Ll37`kֻꗴ牨ߞ혶ꙵ뢽撱昷웶隵蛶鞹좽뗲垹죾薱䙴瞹인떱䘳棾瘳搬⛷폫ᢽCSw;MYu1?[ =ǒ̮嬷հo}Zq雲ߟߊE\ݡ욵蛶韺훶锯☳梽嘳杸렻蔯◲垻㒴╶㘷䜹垻矼韼靻꘵☴ݩ栱Vb~% "ХRd]esmГ-=6׾ǴƿƿʽʰŽѷƶŵĴõĸǺɼ˶ŶŶŶŶŵĵĶõ»Ĺ¶ƿž³卙 ]ic߸¼ýLj LTa!':%&;qrOOOOOONONNNNNNNNNNNNMMMNMMMMMLL- # $$B|ʯ䪼壺硺윻쑯蚹인ꜷ霷ꗶ땳앳씰晴皵蘳斱䘳杸룾ힹ쟺웶靸띸띸띸띸띸띸랹젻인랹졼疲蛷ힻ룻꧹ޡTddtl5Hmblo䥾ࣺ磸埶Kbߞ礽웶陴痲喱䏪ݓᗲ嗲唯⓮ᔯ╲咱昸횹엵䚷䡾뢿웺痵䌩֠㞴ן%4Pb[ }αԼ%70"ξɾ˿̾˼ɼӿιȷƹȼ˽̼˶ŹȺɸǵijµĹƬü¸øþƺգ O[Unxr$.54;D'WVjVUiONNNNNONNNNNNNNMMNMMMMMMLMLLLLL # ) *]e럹虶阷띸럸Ꞹ瞷霷꘶픴ꜷꞹ잹윷ꝸ롼윷꛶靸럺ퟺ휷꘳朷ꜷꜷꝸ띸랹잹잹졼인띸렻뜸核1Dg2"4S(I,OЯ0;Y@Pt잺棾⣺襺砷Ofߟ꠻인뛶陴瘳旲喱䙴眷꛶阳数㕰㕱瓰阵햴噵䟼鞽ꙷ暸相܄`ir٭O\T]jb-80і`rkuʸżξ˼ɼɾн̹ȸǺɼ˼˺ɹȻʼ˻ʸǶŸǺɵºŽȿɿ *60ƾıkys䗦 ,\\j-/>NNNNNNNNNNNNNMMNMMMLLLLLLLLLLLLFIRikuxzst!3ry족ֻꕴ閵외蟶核样眷꘶픶蛶韺ퟺ꛶陴盶靸띸뙴疱䙴皵蛶霷ꞹ잹쟺ퟺ똳旲圷ꢽ㏬ߓ㜹욷ꔰߜtG[~gz–ɗtȿ;t옳圸椿䤻饼꣺Ulݡ잹인뜷꛶零隵蚵蚵蜷ꟺ훶阳旲嘲薱ꚴ혳暳圸皸疴囻울矸⦼~jt{֦LXRͻď׵ĺνʺǺǾͼ˺ɺɽ̾ͼ˹ȻʾϾͻʺɼ˾;Ϳ̾Ͻ .(˹^piݗRMVQMX(JP\NNNNNNNNMMMMMMMLLLLLLLLLLKLKKKK<@GADL=@K8;H $5/5L뚭؞圷헵왷잵埶䠷堷眷ꙸ헸䗲囶靸띸뜷ꚵ虴瞹윷꛶霷ꞹ잹욵薱䗲嘳暵蝸랹쟺ퟺퟺ흸롼ꕰ㔯✷ꤿ藴癶雸띻젼良⨾̱ٙ䣸רٜ3«ޥ椻립를\tܤ零隵蚵蚵蛶霷ꝸ뜷ꝸ랹잹윷ꚵ虴癳隲웳횳뚲暴㛵䘳啳䓲哱☰ީ㍞FPWֿѾнβ^me p{qGSM~ؾޮŽʿνʽʽʾͽ̽̿ѿλʽ̿оͽ̿ѾͺɽʽO]WнOaZڽ޸ֿꃒRSW_bg!$,NNMNMMMLLMLMLLLLLLLLLLLLKKKKKKK  19AY|ϛڪ슧ڠ읶螵埶䠷堷瞷雸뚸䗲嚵蝸럺흸뚵藲塼ힹ쟺꘳斱䘳暵蝸랹쟺ힹ잹왴睸렻ꖱ䖱䞹ꝺ혵萭㠼렺薯٦秿䦻ۤןҩܼ{ 6٩椻맾즾c{ץ虴瘳昳晴眷ꞹ쟺햱䗲嘳暵蜷ꜷ꛶陳靳훲꛳靴杵㙳ᖲᕲ卬ᘴꢻ蚩 ('1Һ̵ȲҿЀpzJ[RpuϻʻҾμ˼ҿξͿѾͼ˿Ͼ;Ӿκʼ̾5C=ٶQc\߽ܽ޷ӷְϹ׹{%%;CC[jrMMMLMLLMLLLLLLLLLLLKKKKKKKKKKKK!(38BBJ[mxԕڛ䗲䚵隳埶样塸样瞸眷雸뛷훶零靸렻욵裾뙴疱䘳曶靸랹잹인뜷꘳朷ꞹ인뚵蚵蟺㗴由䏭ޖ᡾룽뚶߫운٢ܬ她صGRp5⣹㟶杺훶塼袹駾짿jҦ虴瘳旲噴盶鞹젻⓮ᔯ◲囶霷꛶雳破휱蜳埶枷㘳ߖᗴ痵인䦴-7O vɽǸǹɹ̶ɽлޠҷǶҿѿϻ˹ȺԾͽ̾ҿθǻʾ;ͼ˼˿Ӿмξң 7IBѼɸ_qjۼپݬͶտ۽LMLLLLLLLLLLLKKKLKKKKKKKKKKJJJJ$(03;IERgi}tՅښݱ혴ꙵ뛷휹인ꜵ矹衸蠷砷砷瞸睶蝶蝸뜷ꜷꞹ좽훶顼ힹ잹젻훶闲嗲噴眷ꞹ잹인뛶陴盶靸럺ퟺힹ잹잹잹읺훺뚷䢼ᢼ覹ڥ؟m~ +7Dd뤻띺휷흶衸覾짾nͤ虴痲嗲嘳曶鞹젻斱䖱䘳朷ꝸ뚵虱塷뜱䜲⡸堹㙴⚷ꜹ䘭ૺu0 P]Uȵ´ù̸˲DZƵɱǷƶ¾Ⱥº·üɸDz±÷ɸʺʸȷƷƽκɹȸǻʿпν̴÷ƺɺɹȹȼ˾η˸̺̼̼˿aqjmxԻguoֿOce &χ/IF̼We_߽ݼܼܼܿ߿߿$#>'KKKKKKB !"-%-83;I8?OAGWADUORb*15AIM[KQaEL_ENcIRf9EXDObBNa@L_CObHUjP_uYiex{ǔך䟹砺蟻ꓲ哲嗴癷蘴㗱㢹顺읶蘲薱閳앳ꗵ억ꖵꗶ뚶웷흺ힻ흺ힺ씰搬♴棽쥿靷柹蠺鞸웹꘶癶雺풭器$,I (ڞĭ়ܻ朴ޒ՛⡿풪ؕۤ뚳塼똶gzl|栵鏧ݘ䓬ޤޓ⠽栻祽㚳ߤ鐧כ㟻ꖵ⍫ڜ険藸敳⒰ߕ☳垷騼tR]a޽չӿͿѿοϾѼͻ̺˹ʽξϺ˸ɹʷȳĿк˳Ųķɺ˺ɺǻS^[̻ƽWe_ݼܻۻ۽OXKKKJKJ9#%"($+2&/;@K[Tcu\nj|xrRaCRq{{i{wwvtsu|ÈȌђؖᙵ㛷杹螺霺땴睼䔰ߜ磽졸蜵直晴盵뛶쐭斳엵외훺ꙶ엲嗲囶顺졺잷霸砼렺隴㙳❷栺靷昴㛷査ꢾ잺隸鑱⎬۰w%@BMcޞ蔫ۓ㐰Ꮽܡ饼ev^j喯ᠺ⟽울零鑫᡹퓪ܦl֤搩Ռӣ썪֞ꗸ啶㕴ᔳᖴ㚶堹tAMWͼ̿ѾͿϾҽοҼҿмͻ̺˺˶ȽϹ˵ƿһȵ^lh t~ÿR`Z޿ݹٻۿ_JJJIJJ (*    ! &Tdu}{ǀDžiD[ͅőֆ͍~Ň͆˅ˈ͌ҏ֑ٓ܍ِݔ▴嘶瘶瘶瘶畴瞽斱㝸ꣽ쟹蟸ꞷ霷Ꞹ퓰间혷ힹ윷ꚵ衾옳昳杶裺ꥼꣻ韹衻ꟹ虳◳❹蠺霶奿젺螸枸桻餾\k %s諿蟺ߠޯ槽棹㔫ؖݝꙶ響曵tR^땩ب㑬؋l♶㥿䙮ᜰ\o_rM`rTf0CiWiޓդ砾皺咴ߔᖸ㗹䗸啶㕴ᘵܕ$:^mvѾп˼н̾ϾѽοԿҽξһչLZVN\VLIJJJII !(-;EK`hq:EO*;H{ՀǤp>Y咨ْݔ♴犧גޒޒޓߖ☳䙵暶蒯ᓰ╲嗴瘵藵旴疳斵蜻ꚵ盶蟹螸硺쟸ꜷꞹ젺욷ힹ인뜷꛶间皷ꟺ줻飸塶㢺衻ꟹ蛵䜶埻꠺雵䍧֑٘塺桸垵⛴ާ읷ߤ⥻ޞѽ죵Sg祽᤾㘲ק槿{oɬ陮ۋҠힻ|…P`'ISužD^>;X}VsƝ⧿蝱ᦺ1Clbu߳_o"G靹⑮ړޔ☹暻蚻闸擴┱ݪ^n6DJ̿ʾͽɿоͷѿν̽̿пѾϽνξϿӼ;ֻԽ˪"հÿM[Uڹ׽۽ۺؽݾ޼ܺںںںڻۼܾ޿ Q IIIIII' 6=BZch)9@2HY㚴ߔ㍪ܓ8T뚲阴昷瘵囵曵眶蜶蝸ꞹ럺열昵蚶웷홸헶閵ꕴ瘵虷蝻젾왴暳垷顺잷雴朴蟷랸훵띻뜷鞷鞷霷ꕲ囷颷䦸ᨺ㣺礼ꢺ蝷堺餾꙳襻墸⠶߰㥹ܱ橼ݑň(H0S져ܤRh&9Z$5V1Rgz뚲呰㕴瓱ₛǖx%#?ޮRl /k虳۠噰ޝ਽x E̷#1UPcݬ뙲ܕܘ䙷昹発蘹ꖷ蔵敳⤽x+="..ɻƽп˺ƾӿν̹̽Ȳ˽̼̽˻ʻʾпнλ̻̻̻̹ʷȺ˻ֿзȺֽѽڶU^[  4HCƼ˳P^X߿߿߿ݾٴж`IIIIIH>_hl)3Sjؤ웴8` 垴裻睻Ꝺ蠺頹랹령랹랹렻흺ힺ엶뙶閴囹㖯ិ頹뜵瘱㘱㛴枷頶꛶顽ힷ靷柶柹蟸꛸렼뛲ܩꥻ䥽礻衹礼꘲iBZ/Eo-Cl;OxGZx,=^ :ܫ㍡ .l{1HZ堹喱㕴璱䞼홲޲맴9 %àդ.L'B]դ᜶۟ᦽ뙰ޣ杰j~ըܞ-:Zߜۭ雹ꚷꖵ薵蕶藶隸颻祻߱xýŸùƿϽɸĸǾоͽ̿μ˵ĸǻʽ̻ʸǷƼѻ̷ȷȺ˺˷ȲöǷȽӼͳĶҸ̵ǽ֘#*'=DA)41KZVĿܲѽTb\ݹ*r1HHHHHHD 158#),`ggRdi1C֬䨽㧽+Nw㟵塹瘳ߦ뢻碻碽颺製杹Ꝼ잼휺뚵皵瞹뢽렷馽㚯⣼ާ풩נ埶ᢽ߲҇wꅛYqwӝ圶邙e}Tj)R7I\ 7>ԜѰuyشn~2ΰݾDSt$~撮ݣᔲ㣻驼ᝫ0:R +@Mg۽jŢۢࡹ㥽뜳㟵唫ٞr7 *frꬽ䝰۝ਿ휸왵떵꘴ꗵ椽鎦l|S[[ƿĻƸŹƹȼȼȺɻʼ˽̻ʷƴñѷƯƾ´õľͻ̺˸ɷȷȸɹʺ˹ʴŶǶǺҽγĶҹƷ¿HOLY`]ҿɿ̾ϼι˸ʻIWQGTHHHHHI4$(*JPSPX[Uo띶⠷皱㗰⓪ڠ~>(I쓣ȋƧ竿᝵靷ퟹ흸ꝷ裼ܼcqzֲľƻȸǸǺɾͻʽ̾ͿξͻʸǵĽкɵĺɸǴúɸɷȶǶǶǷȸɹʸɱµƼ͸ɵƵƳĻ̻ʭGRO  ̿ʾͼκ̴ȲƵǺLZTmHGJT#C(#&'  PWZgquHSXq5AON\ocq衭ѷ꫺᧵߆$}+P:Ыۡ`q#˝㝸늦ܖ䗮ޡޚ5B\zKVq޿7JeЛڠ圶單╰㔭ߧ=s+;e+;iޭ楼좹頸柸䟷៸ۼn{ \bažȽ̻͸ʺѾϾͼ˸ϾͽѼ˴÷ƶǶǶǶǶǷȹʺ˽βóļʹŮĿʻ{9GC%0-!*'Ⱦ˻̹˴ȰĮ°²ÿIWQޜŴ g&N\`vpGRT7=?5:<057 $+0wy.4&~6D`=2BSv޲:Rd+_w➵ۜޟ䡸蠶Ꜵ꡵ퟺ잻更梸諿{@Իw%l|~4?]+6Q.9T8D`69Lo防䟹ꢸ᪾GPk!:W_|mxկ榷ެ䡱 A 1~枱ܵcs1m|Wh:Ԣ癵뜷웱#@p'3UM[DTx/Cfuᘯߤ萪ؘߝgzWgo֞ᔫٌѓחٛؠקٮܶ箺,21SZSƾֻҸ͸ʾӼѾͻпκɿξϾϿѵƹʶѿЊ5:8бεǴƲıñòijŵƾHVPݿݿݾܾܾܼ۴FFFFFFVadbko +5B؍.?R8F\&B;Q]›6Kq\i';눟#;M,E[qӪ祻垵㣸렶꡵ퟺ쟺쟼BPz°誺߹瀋et盳꣹ΦƑdr#~頹壽잸矹砺蛴ࣻꘪdnfu1Dg끔 D A秽s9Is5EiGXyꣽ왴珫ᚵ襾ꞵ+J\nʌij뢵ۣ޷垶䎧٦인ᓯ؟証쑧כӗئܾԸл۹ݒ ּԸҸϻ;ѽѼ˹ȿξͻӽԺ˿лҳ`okRNMح˴ȲIJĴƷɸʹP^X޿ݿݿݽ޼ܼܶFFFFFF_lq{Yaj sҷz'5PANnֳ\ޟ䜻甶Ԯ㚤Y_v莚$m횴Wm8Kp JVnt=/SMem󆙺*_vޚҚѫݽۨ禽I`w衹ॽ雳盵ݠ឴䝲姼ꌣӑס㙳׺߿ԺɶͿȼѷЮX_X\jd׻ӴβλϿοοοοξ;ͺϼ˺ϿλѿԸӺ˿мm{wMEEձ׼Һηɵǹʻ̺̺R`Z߾޻ۻۼܷܿ׶ֻڵFEEEEEWdho{{IZuᛯ̳楸ذ樸⪾꙱ۥLeٞ֨)A L^h޾z #x睲ߣ饻흷昴㘳嚸霹웸똵蟺⦽먻訹쭹gp (@Jh噰ݜ울杷hu5@[}$6[Ϊࡻꓭ=U/FtҚ՞ݜܖ֟ު埴0Ee&Jُܡ꠴䬿꠵۱裹ܦ㥽甮ݣޠQjm㙰ަ랷㦿럹田ߡ졼直暴㏪֕؟⛴ߠ䙱۬յ߷Գɳö¼ɬ½μgngaoiոͰȲ̿̾;ͽ̼̽˼˼˼˶;˾ϻѾϼճѶǿ▤'ھԷٿӻ͹ʻ̽λ̻L\U߿߾ۼٹֳЬEEEEEEKXYbprn}P_f+ϚКٖڔەܓӪfzӟږq7Ii.J^n׼1GR+CW裹➵夿롼옳喱㜷韺인ꞹ뜷頹룽윳㓪ڛ`i(,I㨺ߟߧퟺ훵똳뜵ퟶퟴf|YpZprԟ塻ꣽ좽뚵瘳晴砸쥽ꝺ晹䜺6He&:Y㙶✺靶覽ힷ㠹㞻⠽䗳ܝ痲䛶锯⢻[te뜹坺枻相䛸䜻蠼뚸瞹뤿皴㛶∣ȗԪٴԸһ̽μζɱĴĿϦNUP !+%пιʷȶǷƻȺɺɶƴôöŸǸŶøžɱüҾԶʷڼֻпϸǺvzu &!ٿϺεɷǻʿ̾˺ǹƽDSOEEEEEEEEEEDEEEEDDDDDDDDDDDDCDC J V'i:>x`{':M1FMf~(:ު韹虶険쏰☶磾镰◲䟺죾ꞹ뢽錄뙴曶詾=&)Eع޵Ȍæ㨿죺ꝵ靵띵霹梿霷靸띸랸ힿ윻虺蜻蝹⥽,=XHZw⚸睸柼蜼埿薵➼뙷螻㞸礻ff횼畷☺固痶㖵♸嚸甲ᓱ圸癵䗳⛷Ϧ۶ձ˺ոӷıþΏ$ ~ʾɻƷķķƺɼ˸ȴIJ¶ŹȻȺǭ¿Ҹǿ϶Ųǿڿ̯ļ¾͸lpk˺̰¸ǾͿʾɾFUQEEEEDEEDEDDDDDDDDDDDDDDDDCCCCBCBBBB)h5:LVh~~p*@럼픯ᕰ⟺颽/9[/5RYi2Ek㧾룺ꞷ雵띶훶蜹栽ꢿ읹蘴㞹䚵矺떲蛺흿휽뚻웼ꢽ靴ګ%@CSp꡻蠽鞾꘷䠾휺雴桸ue엸唵㗸暸閳擰㕲圷陴晵䛵㖰ޒ٘ݦִо;ֿѵҒ  NXRϾɽȻƸŹƹȻʼ̸Ǵñż˽ȾɿȷͶľǹƺɯļ׽Ƨг¶㯶&ϴøǽ;˾˿̹@PIEEDDDDDDDDDDDDDDCCCCCCCCCCBCBBBBBBBB J 7^L*=BĹϵ(7*?Zꤻ疷陷褿옳嚵砻룾꠻hv:yܕ'L 4Sk롻ꜷ霷ꟹ씯ᙶ㟼韼陵䖲᝸䛶蟺锱䜻ힿ휽뜳ٳ*;V"2Oڠߩ矼靽똷䠾훹흶袹_z엷蕴癸띹딯痱矺痰ؒРݵݺ̽ߺ(4. bnh޼Ϳ̾˻ʺɺʼ̽ͼ˸dz²ż˽˿ȾƼ;˿Ҙ?OH:HBwUg`ѶüǺ`nh /A:׼ɷļǿʿ̿̾˼ɼɮ7H=DDDDDDDDDDCDDDCCCCCCBCCBBBBBBBBBBBAAAE5-@S`$;s颹㚺럽휷靸ꢽ顼ꖱ㚵[l5EiJ]Qdcz~ť꠺霷靸뢺뤿젼렻ퟺ윷靸ꞹ쟺ퟺ흸뛶阵蜽좿좿젾흽ꟺ桸Uf0͞ڤ眶夾홵䜹曻枾閵➼똶Vq헵웹뜳룻圳ݡڤڰ߼ܿ˩GPMMYSŹϿνͽͽѿ̺Ǹżǿʿʾɵžʼɥރ 8D>졯\ngͷijžEUNGUOôĽ¸úźǼɺɸǹŷ˿=OBʽDDCCDDDDDDCCBCCCCBBBBBBBBBBBBAAAAAAAAA? &4= .u롵㨿陴柺壾疱㙴栻ힸ柵޹ڠݕ֪梼꠺蝹螹룼익零蝹蛷晵䛷査ꜷ閱㞹랹랹잹잹잹잹읺훽ꟼ飽롾뜺隹먿妸6Gbة운㢻혴㛸嚺坽蕴᝻꘵蜹쟷ꕭPj인꠶ꧾ֊ƙϲۻ뫰NQO (81ݼпϽϿп˽ͽέqzxvܦNZTWc]yȶĹȼѥʼĺõµĸǺɹȺL^QCDCCCCCCCCBBBBBBBBBBBBBABBBAAAAAAAAAA@A%>6IVe~ޒժ蔴啶䛹꠻ퟺ웶蜷頻ퟺ왴椿인꠻띸ꢼꣽ鞻蝺矻ꤾ읶蟺줿꛶蝸ꚵ瓮靸ꟺ젻휻ꝺ碻磼枹囷{"&C̢礽坺眼矿ꗶ㟽윹엳阰楽ퟷᙰQk蘳뜶융睴䡸חȥѻڵϺԻ͹˾݅#! Tb\žбüοϿпқYib/(еž׸¼# _mgӹ˾˿Ѹʹnztt{vʽƶõĹȼ̾ͿM^SCCBCBCBBBBBBBBBBBBBABBAAAAAAAAAA@AAA@@@#Q,V`ony~Ĕؠ韺젾堻꘳嚵睸ꜷ飾롼뜷颾ک玫׬靺睺矼餾Ꞹ瓮줿뛶蠻왴朷顼혽雸墻㤻៸ܢݵsm鞸瞷馾頼랽撪ࢺ陱ۜUnꔮ䖱㚴⛴ޜۢ۽۹ܾۻӷ̷λɹȻȼ˾ܹÓV_\ CGBҴƿճηƸǹɼ̾п|Td]-=6,%ξǡYc]  옦_ohɾ͸̶ʾοʘ"ʺŶŻʿѹBSJBBBBBBBBBBBABBBBAAAAAAAAAAAAAA@A@@?@???H;CQ]h~p}Й䜶藵敵暻餿띸ꞹ띸ꚵ痲䚵瓮욵磾ݙ曹螽Ꜿ鞽ꜻ蛺盺盺睼塻ꗲ䤿훶웶蘳嗲䘳啴铹ᠿ䞲պXi'1@`߳զ뢺㞶잶꡷硸娿Wp랹땯ޚݠࣿ޳ֶѹϷ̿Ծг˿ӻƻͤ8@?_fa˳λȺٵּչοNJܬu~ݾBRKIYR+;4 :F@gqk $2, ְ߽Y`[#ݺź׸ϼ0?;ܽثǗcrsGRS2::%++##BBAAAA   !!"   <@??????D/6BJUianw̚㝺뙷當䙷뛶蜷閱㡼ꤿᛶ蝻읾웾ꚻ蘹旸嘹曺睼韼ힸ製옳塼졼똳垹랹랹띸ꜷ零虴攳蚿֮妷حBRv0?_떮ؠힹ랺霻蝼鞼퟼襽읳㚱ޠRl՝⠹߱ܶڹؼϺǻƼǺżƹûȺ:@?(/,r{xϾϲǿҦļ˴ϵĵ־ˆbpj'5/'!޴¼1A:ϟ!1*cun8F@,82|ðǿǷ͵ǹҶ^d_ 5<7ԾӺ9GE߾ڰ͞pWeeEPP9BB3;<AAAAAA ##%++/45'-/ &+2,1:,1<(-9+2=(/:,3=!'1%-1::?????>@).9=FWWd~nƛ㠼휺ꗵ䘶쟺윷餿枹럽혼ꖸ敶䖷嚸瞺韻Ꜷ䟹盵㣽랸楿퟼颾훶螹잹윷ꝸ렻ꗲ䘳嚵睹蟻ꟻꝹ蛷整甶鄒Zi&6Z(FY|ϳ욵瘴㖵☷䛹ꝺ覽횰ܟQhۨ޳Բ̯ǺͻʷùļǿӱĻ͋8?<ͼǼѾɷĺǸӴϽϚºӿ}dpj tzٴ¼v~бֽƗ%%:2vHVPjxrǹѽ̳ɮĸʴLSNR^Xֿ̼Q_^߾޽֫Ɣp`ooVcdP]]AAAAAA#()2::@IIISTPZ])1>>> %/5>NQ^ui{ݞ꛹隸盹錄롼헻锶䓴◵䜸瞺须Ꜷ䝷圶䟹瞸柼韼頼렻뛶零頻왴曶蛶蜸睹蝹蜸眸癷槿颵6Da>(K`sԢ⦾열ꚵ痵䗵䙷蚷꛷폪➵횲蝳㠷䣹Nfۮ޵ۺֻѵ̸r|vdkh&#оɵ¹ȽʸòĽǿʛyH]UCUNO[UȽ>>>>>@ )4=KN[qgy~֙嚸蜺롿인ꞹ롼졼햺蓵㔵㙷査꡻ꢹ飺ꢹ飺Ꞹ砺霸睹蚸磾쟹錄ꣾ蚶噶㚷䝺矻ꋦس"1Q (bpɢݶ衹㥽盲ߖܚ瞻흻Ꜻ陷蘵蝹ᙰ薮䟴秾줺G]ݴ۴ֹʼɿktq"[gaϱѵĴ̴ƿ̊t N^WӹΫ'!=ICӐ GWPvvͿ˰̹µž̸òǿаǿ¬ǾþͽʷpztLXR͵¹ƺRa]ϭȥ@@@???""*00@IJYggtJZc vvuvt3C_-=F>>>>>=@!)2;HLYndvyЖᘵ坻꛶蚵眷韺졼ힹ럺퟽혺蕶䘶埻ꤾ롸訿良褾횶场阶碽陵䘵⛸堽꥿1@a 't٥霶嚵磽좺蚱ޣ져뛸뙵뢽矶垳楼Ꟶ>UuzݼݹֱιGKL EML^gditq|۾ŷϻёt}]mfϪ+$r{S]WqxsߒR^XݱlztBRK.'۽Ⱦ˲ҳž¸δĽǿʽʵ°ǿ˼˳³÷ǸȶŻȿȸ 1;5̮ʺǹEVMۼٹֱέȪ??????"'(199KVWizyĐ1}͊Ɋ̊̍4Dd>==>=<  '-6BIWjauxЗ㝸꡼隵皵眷頻흸뜺랿혻疷囹젶頾ꜷꚴꟹ윷顼Ꝺ螻蠽悔㔣+FOj檾擲鞻碹椼ꢹ韷ퟷힹ쟺읻Ꝼꝺ휸먿꛰㟶䞴DYxzݹް&)-66<ռӻֹ̻ϕgwpu~ FTNm{u &0*z~ EQK>>>>)00>>>>>/76BLL^lk~䧷|ߤꬾUe`sV!<<<<<A $!&04>MN^ug}{Ӕ㛸ꢺힷ鞵睶衺주룼颸쪿쬿졼鞼외뚹쟼略簹9@g[mߞ۝䖳書횻霻螺鞺饾억꘷웺唳晷횵᜸᤽偘rзĿιӾؿ04.ظžѵv7IB±ü#GUO yݺ :HBſߖݾֺףpּѻ͹ͻֽ׿ռһӻӼԿشʴ۶ʹ၆6:;+10ղĵƺ0<6ݲ͝dtsJUU:CB;DDLXXettTfq*;N᫿nTf/TM/kB?<;@$.(/=8DWSek~Š֓㛸꠺ꜹ曵㚷䝺矼頽꠽퟾라靼頿ퟸ꡺릻꡻꥿횸睺砽ꢾ퟽읻읻쟽菉쥾ꦽ尿ꦾ왳HOp*&@̠ۦ뛶霷ꚸ盷杷榽훸뗶똷옸풲畴痵格뚴✸苡cv}ο̵¾̮¹ҽٳBIF   ѯҲĽl~w к%)92eun%5.4D=Yibgwp.>7QaZһ̺˼ھֺ˷Ⱦѻվк̽սԿҽммнѿտԮڳ Ժ̼7C=دʜoYgfLXXN[Z]kkq -Pd}0@\M^s[t*W? H#:6'.=4=OCPh_qsɌ֑ᕲ䖲蘳格랻眹朹坺砽颿雺眼흼颾인ꢻ须꠺颼韻䝸䠺衽졽잼ힼ홲ڧ䓩ayè앲ަ粽\c|&1G6x䡹㕭ᛶ횷ꙷ暶囵䦽먼립뢼랹뚷ꗵ억쑱攵瓰㛷昲ޥ擩YltমMUT#+* ѼoxXhaHXQӕbrk{ »Ͽȗr{oz፟ `rkмԸó´ź˿нιʽֽѽεƳĺ˽κԻͶȹҹ˿ѾмϻλμϾѿѹɲپвևLQPMVSַķǽ:HBٱ͢~nfvvhxxtǼٵu"sѡ:Gb?LbzkSc|FRj;E[5@VCOhO^|k~ϕۗ☶噷虷衽졾렼렽꠼뢿霸矼菉ힻ西띹蟺줿鞺须飾壾㠹塻颾東%7T8 %EԠ蠼MUfISdVdwSd~靳݊ԛ횳홷虵䚴⦻註椻褼ꢻ휹어듲鏯䓴揬ߗ◲ޗڤ㘭M`hƪ#()DPRӤ6D>\jdlzt Q_Yý텓9GAȉ.C;ʵͶn{+$o|ƿ׶ǾѺ˷Ȼ̶̻ǰĴųĶǻ̸̻ɽϷɳŵǼοѺʵż̼̻ͺʺʻ˼̸̼Խ̸ɹ>IGRXW ӲǾƽ:HBڳϡ¹׶Yr})e|ۡҬfs2>RUhqhz_nTbLXwVd]mzƖԞޡ製륿룽륿꡻须餼꧿룼죾ꝷ坹裾잼좿䢻磽죾|-1Kԡ矻29Bjs3CZަ䓩ݙ뙲뛶蛵㤺䦹䣺礼꡼햵ꐰ可䖵菭ޙᛴޘգޟSdmګQ]]%//49:eji&*+~u}-;5ESMۏlztݘaoiGWPK]Vyٿ̲ǿսʱƾh}uԾͷĽѳĴſоϲëþ¶ǻ̽λ̷ȷɵdzŴƷɸʶƴĺʺʹɹȹȹƺɻɹλȸ\jh W\Z;B?̸¸ǻ5C=ʦi}?}L*j2YK>A M J?&X@fraj|0AVxvo~dsn|r̜Ӣؤޥ霵ߢ䦾觿饽磻妼樾裹㦼橿髾骽詼穼窾륾杶✶䢽楽릿꥾WbvGQb6H_ʚ۬䖢3:=n|:H_ݪ蟴蚰꘱흸Ꞹ硸堷䡹碼뢽鐯䓲坻엱ߠ妻ឲզܨo[gg ('  #+*o}|p|vz yKWQͥӾӽ̿Ѵúɲҽξϼ͸ɸɻ̹ʴųIJõƻ̿оϺ˶ǶȸʹʸɶŵķƸǹǹǺȺƺƺŹŻŻÿǵЕT_]!(%йɽŵº.<6ظԸӸӦſ_nY ;;;;;;;;;::::NAgR+;~yǕɝ͡΢ϠНЛӚ՜Ӣ٨ߪ᧾ަۦۧܦګ߰䮿ૼݭ߰誽➴ݞ⣽줿럼衽륻MTe"/Eʢީ8DJEMLGUa_m뢵ݙ陱흵ퟹ蝷杷垸砻琭西흶⧽䦵֮ۯҊ'11ktq,82͏r~3A=7C=ۿ늖kwqɴ{!-' ϽԺ׷ԾͬûݱؿмͿм͵ƸԿл̺˾ҾϹʶǵǺ̾ϻ̶ŴøǼ˹ǹǹŹŹĹĹĻȾƳüפVdb퉑,30ɵƽ÷ʼɴǾ(81iz D ;;;;:;:;;:::9:99: D,C: '7Cʏŋ°`k)B,?,<->2D./E+= #5 !3'9/A3E!5G#7I"5(9L*= 32AT6EX"1D5CYcpŻ랺롾뙷蜻׻y)ps9@T  'kx㟲ߤ젴훹ꙶ隷ꖵ虶霺띹蘲ࡸ姻쭸ֆox-6?(( ]hf䞱px#4+Q`\p|vϸľHTNlxrQ]WѿݾԽͿһ̿ҽλ̾ӳŽϽλ̾͸Dzд½ѶɹĽɻٮ#63&96Wb`U^[ϸŽƯŹ˽µȿ-=60o8;;;:;::::::999999999:E&q~Ơ̢ҟ]i &WewůӋaxK`hRgoF[c7JR9LTCT]L]f_pyWfoSbkbnxdpzUak7CO-3창!'>ZZjCCQmq6r~񤱹 ܨ럵휶져졼坽ꗶ랽闳☱ݢ䟳ܡؕan",J!OX[xvfwnWg`xHTNx~".(Vb\gsmݸѿ׽Ҽ̽ҾϼͼͽξԾ͸Ǿͯǽоʳ˿ƼȾ͡.A> !ތFQO̻ù̱˾Ǿ+=6ϽN:::99:::999999999998998 8 .;Hky…`o~gu{$'2CF,?DIXh#cs꨻ޛ԰뤻룺꡺좼뤾 (,,83=U&9AO[,:P׫䧻ꢹ뜴蜶읶흵롷럺푱闸꠾ߞ㦼姺姶Ta)3Q:D\PWfu~ѹշÿϿǿǏ9E?bpjESM ¼s{7E?ſڿοѿϾνͼ̿Ͽϻ˻к˻̽ѿпоϼ͹ҽѼ̾ڣ"0/&;9̻Ǵ/A:O99999999999999988988888887^@;GM,9E ( ) %|2EHXlqqBUZ4DJ?MS*4;NZ`p!Wg~ݲ뫿褺䠷䢹眶䠻렷p5?Q%'1sw+n +䜯ڧ엱蜷ꝷ흶Ꜽ흺瘱ۨ塴ُqP]};*5U³͹ҾջѺηɶŷķôʾܵý}Yga ԓUc]|o}w&4.'!ٿμ̻˽пϺʵż̼̻˹ɺʼ̽ͽ͹ʺ˻̾ҽμҾϺϽࣸavn"61]opݽ%$;IGӷĸż9KD1p999999999999898888888888887;c{pkxvUkq':AASZ2BIhx7BJ-8@)6> +K]n۰櫾㩾ft:GU,27EMTX`g^gp򡲻.;_p꧸㪾핬ܛ枺雹蝸럹袿즿藪N]} )1+Oesϫͻ޹ѽҴIJž̾˸ùϒdtmCSLȅ߾͠;KDλʹȻʿοκɴý̻ʺɺɺɹȺɼ˼ͼͼͽνξϾϾӽιʺ˾ѽθϾͼпοЛ[nk8KH(%$748JI\km&43ٶҹBTMº~9999999898888888888888877877Pyƽcv} !%-2: m}Ȳ־⟴ФԷHXhKYeu ,4DXj޸Էݧ皹曶蟷뤹횹씵暸硽]k. 42AbƩ瘬۬atնǼֻ;|2B;ӺλʸǺɽ̾ͼ˸ǾͺɸǺɹȶŷƻʿпнμͺ˹ʸɷȽκ˸ɸɻ̾Ѷžͼ˻ܢ N`_ݿz ԹƿοEWPû!^'9899889< >-88888  % 6 987776766<\Co||Ҿ妺߾_rw5GN'0(4 -=*8J:I\IZoXh_oZjiy`p #3,):1Ȃ#㫾鎣֫㖶ᗳ⛳硶젷隸閷基栺߱炒 ;jtÖʪ袸蔬gvᨽٞɽݿٽн׹μԾɰŽ;Խο̼ɻȽʿϻȹƽʼɷķĽʿпнλ̸ɶǵƴŻ̻̺˷ȶǷȻ̿зľ˻ʹȿοTfeջѾٷտ۴ھ뛬 n|{۵·Ѿ?QJ˷8888888A$ 78878  )%>5666666J]igtֳؽZjqFJ]d 52cx橾䡸基열盼퓵ݒܗ礷ꤵ蟳㤾졽榼夷ڣDPl.7R稷ץܨ硷確`xr޼кɾͼӾջϾ;˺ɺɼйȷƻ˹ɳóúʽϼλͺ˸ɶǴŴŻ̼ͼ͸ɲıöȼδýʹȵĺɺɾevsۿ޹ٹٴӸMZ\˹:JCdu888888A ""%+++3277777!&&-444<=8@A%H+7666666EWOett|ͽꕮݛ嗽햿胦Λ࠷䤷䬾শ뛱կ㮹AIg 3gs꒫׏ڗ蚶쟻me}朲۫ӽպ̸ٷʼۼҷɹָҷԿӽѶ̺мҵͮƮƸڿӼζȶƹȼ˿̿̽ʻʺɸȵDzƱŰijöŸмɿʹ¾ɔ Ӽݓ~0>:@NJɹƾGTL:xD77777 D$$ !'',33;DDEOP76666###()/77BLLP\\VccTab%Q-555555&K,Tabsĺ蕱*+D`aЁk|嘴ݝ䝴԰『zϪHPm. &C-6Wْ֜뛽䜲rKd塷մӽֻͼκӾٹпڽɴӼνϻͺ̹ͻϻѼҼҼԻӶήȮȵϼּҺθʷɼ˾Ϳ̻ȹȸǵǴƱůůԸDZʸù¼͢]mfewpgyrȾ^ig)&%0-^ifKWQALDZ#77776;##"''.56@JKS``^mm66666'---45>HHVddjz{uvaqq E55555EGQRixymݿpIbd졷O((/B"6Vdziw6AU.7Klt&0H폯䝼v0Gm㡶ܿ߶кͳֵ̽髼eunRcZ(90K^U׼ʾλ͸ʶȶȺ̿Լи̷˷˸κнѻϺ̻ο̺ǸǸǵǵdzDZDzƹ˶ǿοHSP;IEKYU.*$ '""3/Uca''AMMnzz?KK"/-4A?LZV#8B< B66666 -%!&',22?IIVcdk|}u66565-445>>JUVdtt/^:55555 @:CDZhix鞷cxy鑦m엪页دCUl>O[\k{|555553;;:CDR^_l}}Jk]44444;3;;P]]nƿɾ/8L>E`驷Ӗ%3F"0㥫ckkUag 2C);͕ɞגҟ䥿ꟹ鏥3S؟Ҿ޹ַ̿ιįǻĻϚ9IH &'hz{Vdb! %.+CLIϹƻϿӾͺȻϼιͻ;ҿλʽ̼̼̻̽̽ͻͻαۯ#,)U^[aokBOQ$21㙨#2.O^Z5D@8?:ܸ=666551!)00>GH[jjz555555===FFVcdoǤTql444446.55ITTfvw*ݒ@L^qx{#&.3CO#5F/$RȨ߮蘴֝ݶI_8Ms}올!6RŮϲ̼ƫѺ9GF"0/Sef-.tgsudsuaih =EDĽľμʹǹǻɿͻɸƹϹ˶ʸʺн̺ɽ̼̻̽̽̽˻˻Р"߳\lk,.fsu]kj,<;5CBAQPWecxm{y,(.*yX_ZK55555>+22BMMbqr554554<=>HHWeeoIJϲZvu443334*11AKL`ooϿ?KQ $0< %ipyXanj{ΠԤڜԩ埾ߠ㚺ݢ䡻Rd<~ӿ!41-,ܳœ9LII\Ydxs r{xELI*f2555554?#CMMbrr444445=>=GGXefnȷռYzt433335'..:DD]kk~̼𪺹rbrx6?M zۘڦ뚲ܵ霾鐲ݙ雴Vi`o@He#-E@Nax?Sl׽з˾HHR``wżٺ333229)//IG}'$"ؿ+63r}z\jfܸۻٻݎ44444444 ? 6g?fv443432::=GGSaaxĻپs22222< )//yI21111=+11?II^ll~߸ڸm~ NYW,75alp$0<'Ϫ曳ݣ祷좶骿脗m~Я੾I[znϷȿɏyEUT׷ݹݲ2BA (95/,#&747KFK^[z˶ԻӼ̽Ѽ̷ǽջյ̳IUO q}ܩ0@?o߿ۿھٿڿٿڽ׹Ѷε͸оJ[X٪;rE322322222222222+11:CDVcdzƹD11111 5&-44DNNcqrߺֺ֖7E?䘥⧽榻襹袶楹駻s5Gl?Pqcs )x뤾擬ԮYliܪ·ͺǾλ%$`usպêcut.+ȳĮŽԺ̶еļ8D>ڷٻںٸ׷ԷԸչֿۼظԷӹӾ߶8MJΚ&^-22222222222221&,,9AAVddz̺ؖ11111= (..088ISTiyyԲ޹ݹ놕 ң樿졸坲߫鐢ScܠZkK`{-Ddۡ棼觺ng}ŴʳɳǼۻĪ*53Zlkٿ۾ݶպٷֻھ޹@RQ,<;տγôĺ̹˷ɿѾӱ Wec.-,<;׾ڼڽܿ޿޽ܻغ׽ڿݾڼؼ /=;#+*A=<_mkֵεϸҵѱ𥴶 "$r{~Zcf;BE}ַǶȺ̼Ѿ˹q}w%*30!/.|p 윫:LMvݹյݽ۾F]Y޹ܾܿݹ׳ϚQt^ @11111111111 %%8@@VcdzԼ$\+0000.';-/66bge=NKۼҿعz hpp|շķۆz|5;6EUT,9;FUW$%ܿݼ۹ؿڼAXTݸԧ|`ro2Y;C111101110"'':BBXedxɽٸoJ//G5<<8??HRRaooPhf1.$ץ蜿ܮ듧ʡґERl".F%3J7F`tު먾闪h{m|)-vֽJUY!ﱸ`ec ԳʾؽҾ׹ػۿR^^T_]LRM*.)\b]ͪx~yae`COO ߽ڽڽۿܿNdbڵЦ}fwvS`_9MB"E(B < 852/0'--?HH\jj|ȼػױ~3W>L9UA?GGDLLV``q{Rjjjѱﭼckr6>E-Aǡ颿졼蠹at롷ۭ죻쨽㟲]n  /43ຽPV[ v;E? >CBflk޽շн״ָݾǺ˭þ욪*(mnj5629=8172 KUOۣƜ[_Zőbom̹3??3A@ڿپؾؿI]^޷Ҩo]llNZZCMM7??-54)//%++$**(..4<;ITTettʹռضΌ9IIr^iiPZZT__gtt߿钯#-7+1<_ds1* )|푯ޙ주烙 =:Iio}Ÿɭڽ﫾㍣̪꟱gv",v"('FKIz~৳tٶԱְӷۿֳv"׋=LH \jfQ\Y5@=&#*53:ECFQO՜+77-99ٻӵѷռܲҿڿٿپؾؽ׽׼ֻռֿڿٿH\]ݸӬŞ~ocrqUbbKVVDON@JJ>HH@JJITTZhgs͹ֿ۽צ3EE}xiwwn}}|ش򆎥iwj~ݯᓦ4Gj *)F 8-24?.Tè圶򌞽^mm{3<9 XadhwzETVGX[  .JKӾܶնڿټ׸پe|x$3/%#"k|y܇$83 nywdom$/-Q\Z1==ʿݾݸڶַӹӻս׿ݻոҵϷѽ׿ټֻNbc޻׳ڞzngwvcrqapoappgvvrȸԾCWW߼ݿݽ񕧮߽鎧Ӳl~ʢ͎UdQd "F &Nբ쒰ߚ▩η#:Wdl۪}},EGDaeݾڻٿΫ¾ѿԾЬ,88n{y(&OZX,88ֵͼ־ܾݷٴַӹӻռ־ܺԶдηѼ־ؼֺQef޼صϬťŹkʰʿ޺ۼ߹ߺ,3BIRfkx֐̢~M]uΖ믾zw열ꖤbqٽ 6;/4389UVߴfsu 6A?ؒ'&ξ^jjZlk߳ϰεֵٱӿھؽ׼ֻջչӸҸҺԼ־ؾؿK_`޼ظӵϭƥʸ휳ҸϺѶۿؿІCLY "1Kͤt3Dkr,8T2>Z䚦>Jf/;WR`}ۛ̏í䠵ۥ䠶ߟھ1㚰߷㘵ݶҽۼؽݽЯLTSw~brq&$ҿ޿ߵھؼֺԺԹӼ־ؾؾؾG[\ڷҶѾؼ׶нپՒٿ׽ŨȻώ+>qꢼ'=aJX|DOj:FQl'2M#/K <>Liɔƴ謻۳ .@K[gս޾w77ܼٽؽ݁ۗ};A@EMLʹ#54(><Ǿݸٷټ޾ڿٿٿٿٿٺԾܿپFZ[ܾ۬؏Lac(;@ Wiy9ӽ嗢 ,~:F^gr%2L(3N-8S!"<ڵٽCP`u߽ܸܽ':=߷Ҹ׿ڼ2EH /2&)IQQu{zYdb ;PNԾԼֹ׺ټݿݽCWXŻڤu:IR (2:7KVRerdsѲ롼胝1VU^yxAMe9D_p|BNj}q| "}js !W^r\iw#5<$%үΆeus\hn "ٻܻظոջM^a P[_ ਲ਼ z˦ڿ۾ڽ۽ܿܽ>RSӖKUgzɵߵି⬾硷UgXbCLg8CYWc{+G! )m{fq+5M)1H QWjp|Xppܽ׼ֱݾ֛Zeb*;8^rsj+AM%8G ,!$!/$.BMU(1;KT^#0ٯݺӺӺӻ־ۿھٿJY\߭>GJ:DD ۪ܽ۽ܿܿڻտBVW۔𗪱 窿ޥޮ螴䢼魶⃊ny`rХٺ쥷ʐ/7NGNb28K&4%8KPݩ$#u}}"36 3;Siu*\qߥξ寻ӝ4=J/7Ddkz09GͽԸϼ֦޸ѷζϻݿڹ߲ߚ1> .$:^옳ߗ᜷㜵ߥ棺૿⤷*8T@GZ𦳻K^aXdfN[]s}pty36>FMV#-⇜ߡۯꬾ笽䦶ڹ務"4")=ci$-A:GUڿ۽۽ۻٿݽܯ˷ѽ׽ػаȷ϶зѺԼ־׿ֽ۾ؾںԻռּֽ׾ؿٿٻ12됢 $뚻霺똶喳둱զ֫۬զХ֋G]ɚ疶䟼颻好禹7@T=CNUij]jl(14 Xir޺#&3C蠷ק䩿饹蘬ۨ覹ߨ3E\0AT1CR!$2[cjmx| (֯읺햱㛶⩿L^{͛=Vvު익㞲᪻թ4BY yh{xߵڻ)=>->A2DKm\otl樽܀ 5=J&GMdHSnޠ֢د?M_^ks޺ں޵ٷݱպ޷۾ܵٽܽ߾پCUTӧ¿ִʧ"!iyx8MK:PN*;D!.NTn~_ov9LQPbm߬ݱ堵v"G]hn}6@Jsx;AXOZu۵樿7Lb&6CQܽٻݹغ׺׻ؾҳ5GF۽ƩUki " Rhflzy9IH(87 3@웪/Xj{+B7Ll᥽뤼꣼G\{GXs|æ枽ԸIYi 3AG &,𗩰4DKVaiں38ڴzG\kuˤF[p#Tdq޴ž۽ݽپ۸ӹݿڽܾܽݿ߽%54߿gw-+ Եj|{'%DRQYgfz9EE쎦&;J٧۷k)4Ȫ秿韷󆞼4- ,6Ns搰Ԥ,K #,:Lr)0K^a/;E|)3vfu~bku>GP٪02Vks觺ϽBSm2Dߺmu &v coq ڿܽٻտ׾Կָδʺ׺пռҼٿռ۾ؽپݾյѺݼھ߻CSR̎Ż53iyxWihcqpdppŬ!!挤 5D(>Z/Dc螴ݤݴᣲ̔,2OISk -G+!A^{ꞹ ">]kq|$,P_b䵾IR_&/<=IS*9B,5hwBHSOT]R\cx)/$.?R_m[i .钞+4Bԡ'2RelzIW]&7:޾ڽQ_^~i}}F[YQfd=KJɬꜬdnn,88앭$3Ǡ秺ߨ瞵իn蓛@Hfes5Ih1Jl^z䢽⢻\nBPgܝ"/AIV$,98@Mpxz+5JZa0@G󜩱&_dmDNUߔHXh);*<"+T]j"1: &۱/69(+9JM8GJĜ{zw !# /1 (&}5??o~v߸誼­固ᢾᦿ檼檽⤻5/CPjMUsǫضާࢳy$&4'bts擝 r{-6@"29gw~)9?ACM]_iISZܡævwmNem !'L_dTeh:ILNWZMTWLSV!,0^or-/)+4ACKXZXgiUghOabbvwkgf~~eff`~_|ymf}yv{ĝz ,.9HJq53g|zr||s{{JTT7CCt߫[uu߽뙩ب᜸۪㝱Ե쥷ܮAXr4Tiö䫾ߨߪ䤻ᨽ谽団qy[hppS[bnzuM`e05&+CTWZhn=IM=GNJRY.0: !$x嗥ovo~ 23y\ik)68x䇐:CL )P[_C1DLo{/@C瀒'54亮𧳳jxwo|/ 3 &&&&%%%%%%%%%%%L!O[ϴVppԬLW[bm{;Ni#8W6JcL]p 0"?M^Tg`u^wnczq{Ό͑ӞJUq+6J7DF5=='&jzy٥PYb"%(14ܼվ(2 &%5E(>P@Wmjs*5Cֺ߿޾ݽ߿޿޿޿ٷؾ޿ڽ㢻Шǰ(7:APSع,<;򌜛ףw>PO`lJ%%%%%%%%%%%%%%%%%%%%$:kBƲ˿vݳ͡rb}yJeaIa_^sth{~m{epx$/7#.<䇕'3?8좼룾ꞷ㟴ᦷ⯽󅎯 $0BA :DD힬btuݷԬݲ'69 VkmۼH]_%htŢɒô֪*6Nn{Իӿ۾ݶ߶ܱղջ޿ܼा̳٫KZc$)(YgfM]\$#ۧw=nD%%%%%%%%%%%%%$%$%$$$$$$$'O}Y♳ӣgQkkRll]ww_yyXrrxܸ԰ζ*FPWnx(ꔯ۠圹࠺⥻맿颻垻矾랽ꚷ䜴⤷9~޾ѷʢ핤Qbe򏥫"-*:J):"0B;I\u Qdg31꡺⡺⡶ܓ%?ֽܿ۾ڽ߿ݽܼܿ޿ݾݽܿܽ޲شܳڰִּܴжӮ%0^q*8KM\eVfl~1?>)(&%ŭ7%%%%%%%%%%$%$$$$$$$$$$$$$##HȺٯ|ЬƔzt_yyny~ëŭǵALZ $6%(6*.3JRRѵ#6ɩ餼柷뢿雵㥸Wb~д1DIޣ)4M]jdsVdzgw;Jd#6DW_߫9JMx۵ܿܺo}'9"@~⠸⇚*յѹѸڳϺֻ׼ؼؽ׼ֺԹܿݽܼܿ۽ڻڿܼܽܿ۾ۻڽڻڵٸ޻޸ںٹდDPb鉒&1Gfv|aqpo~z|'$%$%$$$$$$$$$$$$$$$$$$$$##### 2 iuϷuܷϮƨyy5;FHJTIOT}*y蠺ߝޜ㟼霽떶癵䠹훪+9P'4B,>E)7C.>Kռ왪"߾߽'IY䛴ޝ4Gb5FYۼ۽ܲѯԻѺٿڷպڻغԻ׿'5A);Xkn%$$$$$$$$$$$$$$$$$$#$###"###"#"",kun}|ֿθɬ~{ݽ۾&/<#.D:He(̫ޘՙЕdž:HdZm+@fͦ뜸瞾ݠ헯ݏ"?29CQ]ALZmy;Md2MޒΞݟDN`Zcm˚(7J:Li閳ڤ뜺㝺攪 7#Q_k\iqjy{Яҽ̺ɽϻԾ̹ͮ˺ڻɿۿԾ/DBG\]Eʾ֚=QRB$$$##$#####""###""#"""""""""""""""" 9Q`Iaq}xm}VhsAQ]\nyM]i&11AMv$3C*:Gںڵλ?ST\j#####"##"""&.+ $ #%* / /$""!"!!!!!!!:`BvARPZkj޼ z韰ۣ稾ޙ৾Vdꛩ (0✶䌪ٜ颹餷❭Ѿ9IV0FS&ERb]o骽㩿씮ݨܩ랲۳阧tJXk%.ܻռ3?C=GQͪӭ឴̋͢Rg|.C)- "7,A1F)2G۞ƮIWm*6պ޺DXY+#""""""""/ %  &&'--+11+11*00)..%/+60 !!!!!!!!!,csoNa_I^[ʷϽ+0+S޿ݵ얥 'ݗ٤襽ޫӐƔʠ֪·ͥۦܣغ잫5DW4IQܼݻJ^_ھdr""""""""*" $$&..4<EE!B&)!!!     +Q2TdbJ^\o÷⢹襷ࣶZj˂epqݝߝ⥹褵]k's~1;EƂVWl ",>Q_q/9Chs{$0㡨myݥޟޚ٫㥼ꖭߡ럴z ޴ܺࡱ,9Oͫ撧۞꘱ݞޣ夾栻ܔԏўީ嗭֠٥֧(9OTٻڽݽܺ۽RfgB"""!""!,  "&&-33:AAJRRV``_jjhssr~~qtuusrro||amm^iiOYY8L@0        4 JXV;LK/n٬虴衷ǔs}Ykѩ蘭ڥ箿;Kh 3 KU_քkxȊ!4WVj LQ`t}+4Yhq-3Ѿ:JWXbsٓht褸עܫ랻ߞ褾ߞ۠x*ۼWfvQ]u㬻顶헱砺흷卨Ԑء衻铮ڣ뙴ۗޜ䝸䝷墹瞬ܫ톝޾Ymn״΍bw!"!!!!!)'++6<sû~ͱ䥽ݦ윷ꤽ棶U`|hpr~I[xѦឱܥ妷땧"4Ko谼)5?.7" ("2&0Bmsx{GPZ=MS9JM@PV;JZhtޡ+CNnث枻ڢꔱޖᙵ䤾혱ݞۨޔ .LZ`.3{+8Zd|夼敱ܑܘ㟻ꟻꜸ皶噵䕱桽젼략u)/߿پݾ޺]qr̫Šzrnukz!!!!!!!(*//;BBQZZeqqwéĭŪvCeL?!+54fusڹH^i5ڳᑬߢ墺U_}")Bt}AUx姺竾飶ܪޙXk5AKΨ}5EU+=FTʓ0QV,;K#-K @ߜgإ꘵⚸鎩ۣ䣺ࡶզ%8Gޞ@LRGW]hvnyݜ➸盵䘲ᙳ❷柹蠺鞸睷曵䚴㜶培蟹蚴㙯߰כּ%4C`dڽڿ۽غغپbvw߼ڱϜqm|IzR! !! !/(--=DDT^^kwwƹλйѼֻպԺԼֽ׻չҵΰȩ~>8)00Zedܾؼ@Va&?陰⓭ܝ槼┠=oNc',R9Lycv՚أۮSamؒO_k ! &M^a/-%5Ͱ 3)?X%H`|陳ᢽꜴ♰֭Qaq&ݺϙGJRemt~qz%3Oޝޢ眶䙳♳ᛵ䝷圶嚴❷曵㙳⛵㝷杷噳☯ݠޮq5AջؽٽؼոӸֻ\pq¯Ͷ(W0 !!    /"&&7==Q[[lzz¸ϿؼָѰȥFpQ0 '-,LVUſԿ杷吭ڤ\v:Pz@Pu-Q-@a}nTkbxauģ蛲ߘףݷ׸n~CT]m~wׯ@R]&t^i.J[|CWp.Mߡࢹ犡Ӡ웲ڝƗ+7AK*6Jb '߶.;U,7R#.Iu]nNUh /7Dܾ鞨}ݕْٕٔܜ᜺㝹♷ۖݙޖݖ۔ۙޞߵSd#4ݻ׷ҶѸվdxy&"+22GRRgwvȽ$))Ua`񈛢 Ů䮾땫ԣ즾쥼웴闱ꕰ␶ܚꋤ܍┲顾립ꞮOUl#?BP+1<2;D*8>ٳ郏P_hެ-2#tct}HXd )Scs 2CJ]r٢ϫq}".@/9J[ev3=NR]kܺ.9Gu(:ue|LSf%.;޷AL`"0Mꕲޒݔݕ䚺嚷㕵ܓޗߔݓޚ㢼~ ֹܺռZno޸4&-54KWVk||ǿjyyu#%**KWVtݱ슜>Qw/Bg睿靽虸홸ힼힸ奯uz]dx|j}阩  zᛴTmo16'.m"4E̮֑' -=~IT\:FRs jgs%3?m}(ޖڛ◴✹嚹斵⒱ސܓޕߓޔߚ奿砲ײ2G7JWۻۿOde"N)/.55KWWn~ļJUUZhgv䒻+"''&..@JJ#0FZdN_&1QWcͫ휴꛻㖶旵暸靹蟹矸䝵ߝܥ器1>N'޿ּ餼&8kxkw7COզ!-3@Nح); $es3EDnH 2/66LWWn~û5==GRRcrrʼؿbr 0 %)),22CNN-9QT^w9JkMVwXfޤ럷奿헱ߚ䝺癷暸睽호闵昶睹蟼顼衺䠸➶壽띳ݭ1>T,8޴0E~ ޸禰& #נgs%1 @TO=PMgw}:FRy6=L ^l:MZi|ᨼ:L]u얬Ֆ֤袺薰ߓޓ噸啴ᗴꦿ飹⧺߼\q +ݳֲܹ9RTap,.55JVUl}|߿'--;DCTaasʳ J'0%))188BMM+A`mޜй(H0Cfꗱߖݟ桼蛸堼昶皸韻꡾룾꥾裼梻社왳᣸鑞58EUٽ`tO]yEQ[Veh޽(駴QY'硴׌ATzdw׵ޟ隶埻Ꞻ镴Ꭽڔݟ8NZ #(ܶ>?JJ(오0Dg䞻硼襾西禿餿롻雷暶嚸隸霺렼뢾줿뤿뜹뀒 :*F/F"%׾&3do+=q+;:crux\d{媲:'߶dw~㜯Ҵ흱ڔbt2Bfm噱ۜᒬڞ暷䔱ގڕޞ砼嚶ߘݞߝֿ ]sxڱԱ;WX28AKJ`ooϽ +00@GGFڶ;TVFtQ"7C?Yffzͻ .  .44GPP2??ز$7{╨Zl裾ꧾ䞶碾휺뜺띻잼퟽쟽졽᣷%G)>J\ ATW!4A]p}-4BX]>GP blv뵾\ey  Һ'2Hv梵ت⠴וij~#.EYd+=ᢵڢߝ᣼覿맾䫹 & 4lyܭꕮ֣梽雸啲ߗ枻癶虮γ܇AQ^ܖ@UWه@!P\[rɻ$##4::PYY&44}ҿڽ۸.?vղ>Nk &ߜۦꚷܷݡաת项㙳ᙵ䛹꛹ꙸ뚹욹욺뚺뜺顽砲^lOZxVdp16.6DYa,2萟HTX%OZbxlwBOeLXpLYi ư1;;GSUBMU .9F\ԭޜӟڧ}!)󕪲 sۢ呩ם厬ՙՏ !5>Y㭼H[|;Quܘۛ㖳ߔ杼霺陹ꓱॾ蘮ѳo}KYl޿t )08/6#(J[^ٯI% 2ITSjzyĸ(%**>EE^ii$33!/A逖%0;[۩ޫ枸ܥ}fxnѴ量杶蛹꘷꘷꘷꘷꘸阸闲o{CNnճ/?F397LM MY_'4<#- 0<$7F"7F5IT`nl4@B1:DQ[lֺ᧷Ԧףך\naq 1>':BUhw0妷⣴噮᤻띺揮խnzNVm錗 .9Pv}ѝ䠽鞽ꜻ薵⍮ܔ杼ԗԣՊ 0bt)>V``{l}}Ymmo|(\r13Q^w5GR&7LԠٮ榾욷ޭ퀛&+@ĽYd{댥͐բ隷㝼鐯ܙ嚸瓲玭␪ْ֜ի߇n{ &,0Kſ1@ICZ\ٱt'P-VpdMXX;DD7???IIR^^k|{,11FNNeqq`uuCPX,ힴat-8^ij歷憖l ,Rb)Lvힼ뛹꘶疴嗵晷蛹ꞹ뛳祼檼뇙\k%*4߹ؾ߻ݼ~(8E(4 &0FKf| t娴޳כּ잯⒬MRg9Ea$ʫ枹咯ۙ喵✻虷摰㕲叩؝ᠴݩ懚UjTdu=YZܷҩ•ybqpR__NZYUbbettz&&,,GsCY D1HZy%Fk~?V|Öݥ울痵䖴嘶嚸矻ꗲ図蟳④Sd&3CѾڼݿ߿ںL_fIZg몸կ৳ݧ◨ӣޫ査oHNe,$C䚯ՠ⛷ᖳߘ䖵◶㕳♶零钬ۢ椸ᨻᤷݠ۠ݭ靳ע֢$3FVrs޹ְʢym}}jzzqǻڲ͞bqqFQQ299%++$#!! !!!!#"#((+00:AAR\\mzzh~~Xht -Cޜࢼ䪻~߬LfKcz#UhܒӐפ젽ꝺ皷䙵䛸坺硻꙱坵旮ۗOa,9Gz!)+4dvm۲ؾ޶ֽ۾ؽֿڻߩm뫹Ћĸꢲ׋g|Rg18Q~ +1Deգ椿렽ꟼ镴ᔳޕ❸ꜵ癰ݗף⛱ڛܐӭПڗ-r߼ٷҭǝλܵФqXfeGRR;DD6??4<<2::2::2::2::2::3;;4<<6>=7??;DDENNT__ivv{DWd!8헸ߜ㒧Ԯ老飸쟻گ5Gf#DӤޯ윴ަ颽韼鞻蜹朹朹柹砺韷렸져왳╮ڟWi$/=T^e&BR_$6G*;)6$/#ܬԺڼZqs$)ϣRbs .%2L%Bʥ(<[C6EX&@۬场㝹ꤼ椼桸嚳ߚߜ䚴⚴♳ᖰޔܔޚ⟸⡴ڤcv Bsڔ֮虶❺昳ߗަ몿ERl¯ʺ۽ٶҹյҤɲͮɷѹҨйϷϵ϶Ϸҿ01|4;>8ADq$89 IT\5>Kر꥿魯읻ꜻ虺眸眸硺잶ꝺ桽$.6Sdsԡ㧻꨾衸ި堸⤽铫٥Ylq޺岽".J HZy̦䟻ݵ'B5CZ )@Ob؛ޓܖ꠺製롻霶䜶䠺虳ᛵ㙳ᓭۓۗߕݒԝӪّ&-?Ttؘՙ؝ߠힻ蕳☶瓭۬6Hgżڿ\qrȪxBOQ ,6OXf쩿꡷롺잼랼뛼ꜷ雷椾먾eq`st략好듯أ꠿fĬ碴ޱޭ홵Ԯ䈜 /3BR@RY*>KUUivv{t,;=ZyxK`a"$ cuv&6z玮ٜ똵螹롺좼룽좼령띶蛴왷~+F嘶ߚ雿蠾떷䜽`}D^᭿ޠԱꦼ*3(/޾ݽ޺ݽ޼񇛠 )0-5 , #3gܥ坸䙳ᙳ᜶䛵㔮ܓۖޣ뗱ߖޡ韹珩׈ГҶr}`n,C0]qțϤ۵זէ⪻3Ed޾*00?GGZeegvvgwx|ܗv ሧp𘭮^jln{};JL&'(8r旷룻颺蠷瞵睴퓲ߙ✶n2H]|–։ըꜶۚڦ3S/J*:Q3AWhu᧹ؕlgy%%,ܾھڽܼ޼߽ߺݹܼ޹ݺޱzTik7C :K햰Υ㢻囵㙳᜶䛵㗱ߗߛ㣽똲ՍՐ؄c}J`/>akkr~FVV+,*,?LN율 ۻWqq𔣥}r &3dy꛼훵졽죽뗰ܦ렺蛷朻6Ee8Zş /BǪ3E\ey[pޥி4FeҠ##3::Waa{-.n򭺼&(߾!$;DG|׸EZ[ 5GHs'<=Zrr%2]p棽噸WjpWhtښڵߖꚴ㠻_q %NWrlyhx諽ܗ9GZ|&&24:GI$'ܼ߻;Qc^v֛טۖޘᛵ㜶䝷垸朶䜶䛵㛵㛵㜶䜶䠸⫾㚫sfw[j #8I^ܩ"9'B枴חԥ碸᫾2DcIaa6NN0EF##6==T__|iz{󡮯cprټr멵 {etv&89L`a̦}EYZl"2>Xi|馿盹>Sy7/=Y 0,ۖء⢹蝴☯ߟ䤶(4V!asԓ*D>JTڄ_tv߼޿0F䠷ݚߘᚴ⛵㜶䚴⛵㝷坷圶䚴☲ݢᬿ䓦6Ji* 5rz;Pl塹ݡ▯۟੼0Ba~z34$%##7>>T^^s *+S_a\hj_jl׻L_`[axj$A.=M޾냘3飹⢻瞸朶䙳ᗱߕݕݕݚ⚴⚴⚴⚴♳ᙳᘲݛܡޘϛΉ!5Nt㛴ܚߗ߬狀-?^z8RR)*#89ջٿdyz_tu(8>GWh~":EW^&;vܨ靶vbs쬺֯楴1?[jum߂Ŝ曱3V 3=N[]px`p(;!1H :(=]ҩ蘰ڤ頺蝷噳ᗱߖޕݖޚ♳ᖰޕݖޚ❷堺蛷敯ݟ⨿娾Ꭳ[pg|"8Tצ떳뜶䦺*<[w>XXF[\qź􇟟Xpp%5;,;K߮ck FUe,~%&8ybl}-;QAPjUfbs -Ѡ螳 "H~gw"6A06߻㭿&HXo⩿虱ۖ۞朶䚴♳ᙳᛵ㝷培眶䙳ᖰޔܖޛ㠺袾톤Սܦ뜳ٰn#;W'<[ꗱ١ꏭܘ턠Ϧ);Zt| 슟ꞹKeeO^a%5驺堶糺-5<>GD!09!4ݵylwx%,>FM1=I .yEZu'A=Uqᢾࢽ⦿-@f9JW6NTߺ޵ݴar:I\᥸㞳ࢹ棻韹睷囵㚴⛵㝷堺袼Ꜷ䛵㚴♳ᚴ✶䞸杹股ԙ쐮ݐٖذզޗθ瓯ؚ捭ޙݧ);Zs^rs hyyqZtt *ޙׄQc\'3=ҳ޶K^s*6BSbr0G斮̈ꢽߪ蝴ډĈaqyڼ(83;;5<<5=<4<;4<;5=<5<<3;;3;;3;;4;;3;;3::2::3::3;:3::4;;4<<4=<8AAEPPWeen;UU޾FW`)F,?߲柹賿󉘸IYv4˭Rb㮽޹,=R#6E 3ޫ嗳♷暹时㔲ᖴ㜷頻ힸ磽뢼꛵㛵㡻颼Ꜷ䠺蠺蠺蠺蟹瞸枸杷基枹坷圶䜶䜶䝷杷擭ܗ噲䖯ᖯᙲ䞵姿4Kqq       !%%4;:HRQZgeixwtzyusw{~|zxxxyz}zxwy{}zzzz|ڼVpp@SXXqڴ߾mt '‹)0)0.3:M Vawܲݡөڬԡő谻֍䧳_j1?U0޻޻䢵)9JI[r៱ڞ㤻휷顿⎯ܗ埽웹虴更暴㡻飽랸柹蘲ޡ防ॿ홳ᠺ蚴⟺柺栺蠺蟹眶䚴㘲ᗱ◰◰◰◰♰़=Tzw       */.AIH]igv±͵{{4Dͼ,3Lۑy #&*B.6M'2F! ls߶սq|[hx (޾孿.7(K^sʽآ眵痴瞾䏰ޗ埽잺雵䛵䟹社줾젺衻뢼ꟹ㡻霶䝸䞹垸柹瞸朶䚴㙳◱◰◰◰◰♰*?ej}       ! /43JTQlxvĿѼ̲ŮŮȲ̳ͳͱˮȬƮȭǭǮȰʲ̴εϸеͯɭǮɵл.GQ(ֲHTl%8hq~表^hyuߡwykpypz_ip'0:BLV_is7BJ,7?#)둞O[e`qzڳֶٿݾܿ߿q졹ᕳ䝽摲枽ꞻ蜶䜶䠺袼꠺蜶䝷墼꥿塻隴➸曵㚵ᛶ✶䜶䜶䜶䛵䚴㘲ᘲᘱ㘱㘱㘱㘱㚱᣹-Bhs߽       #"398PZYu³Ƭ»ټռؾڿۿ۾ڽټغ׻׼ؽپڿۿ޾ڻ׻ؾɀG]h/~׼Zj&6 +9%.B,--頦䐙[dhZcg?KM+79%'&24숕-6!/; )x޾߽,3;LY䖮ң⟸⤿땲ߡꗸ攵㙷枻螻螸朶䝷圶䙳ᖰޖޚ❷垸椾졻鞸昲ᗱߚ⚴♴⛵㛵㜶䜶圶噳♳♲䙲䙲䙲䙲䛲⠶7Lr       ##5<;Va_yʽӹкѾ޽ݼh}~bqz T_s۴ҨϦϕ⚨ %Zbi*0=9?L  Xad􋗡,;M^8Q[׹پۼ߼޻޺ݻ޼߾ؕے۝蛺皸癷曷杺硻韺朷㟹盵㘲ߖޗߚ➸桻韹皴♳ᖰޛ㜶䟹癴ᚴ⛵㜶䜶坷曵䛵䛴更更更更杴䠳2Ek}        $$6>>Wddzݺ_tueq{圷Ҡ֝ӹ쯻 +AHPa{+׶טGWc(I[b0::+55/8PW Ӯ֨ߞ挮ҡ瓰כࢽ飽뜶䜶䡼袾眸᤾윹枸棽뢽隵ᛴ࠹垷㠻痲ޡ铰ݞ镳⚸瞻蝺盷暶嚶坷枷韸ꝶ蝶蝶蝶蝶蝷杷样䬿0Bg߾       +11@II^lmkf?S^%kӵڐRcv';L6KZ\q᫼ݷr|"&B59Rպ޸桽摮ոfz(*jvz`nt+1.?H.:߱뜺韾띺砽闳ܚߞ᣼梻塺根埸䠹㡺䠼坺琯܏ٝ栺ߢ㟹ᛷ⚸瘹ꕸꔷ隺뙷攲㑯圷Ꞷꚲ架꛴昱㙲䝷栺衼裼䠳2Bf~ҢdssGRR6>>0888@@KVVgwvZyz17  2.8VR\zgrq|wwryIXh.;(4$5>):C'9@':B(~࠶٣਻el"'@`io}۱ݝ׻=NhHZk%32`moCQWEU[\orzۺl}!Ԩڦ蘶坹蜹椾운⟸䠹夽磼梺䡹㟸⠹㠹㟺曺痶㚷㠽颼䣽塻ݔݏޒ䕸꙼阹瘶痵昵蛶雳瘰䟷뛴昱㗱ᚴ☳ߙڱ@Qrè޷ҦtYggIUTEPOKVV]kjuOnoݥqRbs-=M"2 ' ' '!)0CJoVhsi}ꎗ2HVs!5T٨櫿M_v-Oi虴㝸硺枷㦿餽碻堹㟸⟸⟸❹⚷㛸䞻瞻瘳ߓ؜皶ߞ혵⋨Ԡ埻䡼裾꡻霶坷梻휵直朶垺뢼䪽8Ij޹ֲͧô]|}$1#䯻 7 ')0@LK\v᩾䠹᥾椽뛴ޝ❶⣼袻硺根埸䠹塺䢻堸▰ؑԔٙ⚷䙸固盹衾뤿띹☲ښ٧桸؜آ᤽坶៹퟽윺霺靼雺當㗳ܭ9Jk޿ۻ׻ֳίɲͻ]rz->յ.9U뮺4IVlUf{)Uel>HOEUT^rs~AT\ (ڬ楸ݢܬ隲ܞ㣼蠺蟹瞸杷垹基梻礼楻䝴ژٜߝ䚷䘶噺綠矹ޞءؤץؙʙΩ蠹㟺뚻険蘹當㘴ݲ=Noݼؿݺ熥(7G8BZʰ֤ERhiv&5Hfy޻ڽ#)=IOIWVBY[銜̓}О֟գٯ晲ڠힸ枸杷坷垹堻磼覾䦼ࣺࣼ䟺昴㗵暺痴ិ᤻᝱ԅn\oUhcx윽랿9Jk㘷^|}札[dx(筹 &4J # m{zˋ'5kyx+;X$G6!BpUhG\{ۥ꥿햳ߠꣽ뙳ᙴ袶ُџ䈤Ӣ蜼핳⛵㙱۳L`brߧ :9Ml꧿埾읾ꚵឲ:KlܙMijޠwgp~q!6Uf{7EX޸۾鞬nvvWgfީ3@N-9KSdUcWYJY\䤻˜ ߸ҶݾmDYZf{xMb_Shfbnt Իbo2IWs"CӖئ락盷杺瞹垴*JHSqm|BTy1Wͪޗݣ韶㩿쎡WdL_6՘ݝ蔳꠾훹蚶垸確裹@Qr~c|~0=E KTacp~{(8DT`jܿ mv𒞶hoىĨꞸ杹螼ힾ엵䕱㦼p~/:V|x䣺瑩ד٣颺N\}ߵϹֺݱx=LN*,,6G^i}Ze{+s{n{6瞸査ꚸ阸隺뙷敱ߡ*5Q`kfuB睴ᙰݘޝ㢺觿좷띩͍ݣ⥾蔯ۜ蕳❾ꞵ塷稼뭾ARsȍp,2%ãn~ !EZ[г㔪CSZ!2`i}sn۲ޜ䚶哯ޒݚ䞻蛸噳ᝳݧٵࢯ`o{԰롷ᠷ䥾꠸敭ۛ䟹藱㩺᱿㦷ؙͧަ㦽ꤾ어㞿뜶墹穿IZ{툝`v{咫).JZaXkpPfks)谽݈.5Iݱݮ㠸ܨꓰܑݠퟻꟹ祾ꤼ朴ޛݡ䣻鞷졷ॻꢺ䥽禿뙲ޡ眶䚴⛵㛵㚴⛵㠹姽桵صBUj"2IǪ婿隻욾뚹杹⤽߫߰5Gf«v雷Eab̌Ykr-4 ${.>' (ܩܒН⠽鏰ޝ蓱榾覼堶ߟޢ䡹皴⢼꙳ី棽럹碼꥿횴⛵㙳ᘲᚴ⚴✶䠹嚲ܩRerCSdJWq虺뗽햽꘹曺᥾ޫݱ3Ed_tu4PQͤ{,Ӯ;Eg ⟹៻呯ޟ祽秽棹⡷ᡸ圶䗱嗱ߜ䡻鞸桻飽뜶䜶䜶䜶䛵㜶䞸栺袻磼䟶>Tf{IVp뙬ٜ嘸闻뗻阹机㥾ݱ1Cb~Vkl5QR愚%6ۮr &*m裼ߝ磼襽磻塸垶䗳⓯ޛ㚴✶䟹瞸枸枸曵㠺製뢼ꟹ瞸桻须頹坶ޅ-csUcyؤ䗸旹畹瘹睺棽ᪿޯ0Ba}ez{k=YZޗ!0հ딧CWv k}꥾旲ތ٧⠺衺棺礻衹皴㕰┯᝷栺蟹瞸枸曵㘲៹社좼꛵㙳᝷囵㗰ܠu^p{Wfy診㟸䘷䖷喸昹睺硻㦼߭0BaWoo(DE ߮윲ܨt '2§䔭י㞼뜺럻ꝷ執墺螸痲䓰㕲囷椾졻鞸柹癳ᕯݚ◱ߞ杷售ܒڗߕݍҧe}*s(8Hܡ⛸䗶㖷嚸靹蟸⠸ܨ/A`Phh۸67޼߹޸߻ݾҗ𢮲ꤺ䗮۠l{eu⡺䞻薴㝻젼뜶圳㠷睷斱㔰晶阴㥿ꝷ塻雵㕯ݞ撬ڜ䝷哭ےښ☲՞Yn6B~ s㥽᝺ᙶ◵䙷蜷靶❴ڦ-?^߿OggB^_߾ܺں (14Ͼ"|ء睺掭Ԥߓꚴ⚶哱⡼䙳❷曶蕰㕱眸ा졻靷壽띷嘲ࣽ듭۞栺蘲᣽뢼꙲ޱ^s'3Obj ȩ࠼ߛ㛶蛶蚴⛱ڥ,>]f~~i޳ڴ۹k{'26?FIckkT`l5F[͙᛺珲ک焒DRn顷凢ԟ䜵眵瘳斱䕱疲蟻Ꜷ䘲᜶䝷噳ᔮܙᛵ㝷哭۝培碼ꚳ߭z*LX"6@G?Wc '?햰ޚ}Xdޘ嗳锲锰暵衸ꢸ衵䟳⠴䟵垶䝷垸枸朶䛵㜶䞸枸旱ߛ㛵㣽뚴⚴♰ࢰ埮ܹ(.m !1y㟹ᓰݗ0Ba~TnnVgp09[ludu~du~Yjs-6,5*;D#4=%.&/7>`fk\bgJSW*59r~򣴷%8; "02fӬn(3zWij[t~3랷㞷枧2(FŦ럺픲鍫⏫ᗯ㝴枴䞲៲ߠᠴ㡹睷囵㛵㜶䜶䚴☲新ޛ㞸㛵㜳㡮械"9A>TR0?1H^ᢼ䒯۔먽/A`qlandkartegt-1.7.5/nsi/3rdparty.txt000644 001750 000144 00000005372 12225261330 020303 0ustar00oeichlerusers000000 000000 QLandkarte GT for Windows (short: QLGT) depends on the 3rd party software listed below See the Wiki on compile instructions: https://sourceforge.net/apps/mediawiki/qlandkartegt/index.php?title=Compiling_QLandkarte_GT_on_Windows 1.) Microsoft Visual C++ 2008 SP1 Redistributable Package The installer vcredist_x86.exe (ca 4MB size) as downloaded from http://www.microsoft.com/downloads/en/details.aspx?familyid=A5C84275-3B97-4AB7-A40D-3802B2AF5FC2&displaylang=en is contained in the QLGT Installer package and may be executed if selected by the user. Note: Those runtime libraries are already contained in Windows Vista or Windows 7 installations. Therefore they typically need only be installed on some Windows XP machines. 2.) Qt runtime libraries The Qt DLL's are deployed in the QLGT installation directory. They are part of the "Qt libraries for Windows (VS 2008)" package. This can be retrieved from http://qt.nokia.com/downloads/windows-cpp-vs2008. 3.) The GDAL SDK packaged by Tamas Szekeres. This be obtained from http://www.gisinternals.com/sdk/. 4.) libjpeg The libjpeg.lib and header files are needed to compile the helper program map2gcm.exe The source code can be downloaded as jpegsr8b.zip from http://www.ijg.org/ 5.) stdint.h The stdint.h is needed to compile the helper program map2gcm.exe stdint.h can be downloaded from http://msinttypes.googlecode.com/svn/trunk/stdint.h as referenced in http://en.wikipedia.org/wiki/Stdint.h 6.) Icons for the Windows Start Menu a) GlobeWin.ico has been provided by Roland Hahn b) kfm_home.ico, kget.ico, khelpcenter.ico, konsole.ico, xmag.ico have been created from the Nuvola 1.0 icon set (http://www.icon-king.com/projects/nuvola/) 7.) Optional at run-time: libexif The libexif-12.dll is only needed to extract location information from pictures (jpg, maybe others). The source code can be downloaded at http://libexif.sourceforge.net/ As a convenience for the user, it is deployed in the QLGT installation directory. As a convenience for the QLGT windows build manager, the libexif-12.dll binary was not compiled from scratch but copied from a GIMP 2.6.8 installation (download at http://www.gimp.org/windows/). 8.) Optional at run-time: gpsbabel To be able to load geodata from file types other than .gpx, gpsbabel.exe must be available in the search path. GPSBabel can be downloaded at http://www.gpsbabel.org/. 9.) Optional at compile time: libdmtx libdmtx can be downloaded at http://www.libdmtx.org/ In the QLGT windows binaries, libdmtx 0.7.2 is statically linked. To create a static .lib, the configuration type of libdmtx in libdmtx-0.7.2\project\visualc9\libdmtx.vcproj has been changed accordingly (with the VS2008 GUI) from dynamic lib to static lib. qlandkartegt-1.7.5/nsi/kget.ico000644 001750 000144 00000035356 12225261330 017425 0ustar00oeichlerusers000000 000000   6 h00 %F( @ 0 4h+R",#BAd]s05(NDgoU[ 4 <EiDs({~rN` : M  X&|Jـ9ȆshaGdC+Ud*KߋGКǍ|qfXP>fI2bv/MUҞȐwl`UH?1gHBj!|/P_Ԡȏ{qf\PD9/"b JO y% 60TpӞƎ}tj`VJ?4(z`Jc(1.F5Vx͕‡|tlcYOD9/$}u p [Hp+79]4]tNj}xqjc[QH>3)yq i aSF1F @k6c$r}vtqmgaZQI@7-"|v n e[TID3 K ` f:q/qvpkhfb]WPH@7.%~xp h `YPG=<5" 07M>A>C]\XTOLG>7/&ys l d ZJE>:6<h#,65/.-:MUWWNA85/'zt n f ^S537657_{32+0/0,Y`>ZvvwuiD'{t n h `YO4C3?'.2/0*I320,%;7fg,t qo h aZSI0&  *3J32*('C3gUxa]ZTMD-, +S4)%&%C/jǝ×ƝVkODA=*, <'"##!C*mͨǞǟǟǟǟǟǟǟɡͨƞquH&!3 J:fΕ~m[F1p F..! \FeLjvj\K9%xj [A<F7:[^[QF;*}p \LD8'95 ͠4 Pj^@!zr gQ),ӳ74W1"'e}Lu]SFNP 012 )qʠĚǝF[;V-+ !{״̨ͩͪұӲȡwNW  ﬈ֺ׻׻ֻؼT U 嘄sM \(&&&&') %e  (0` % EmpMd,FFW&[$"h.OSTQc+d)(8PRJSXP|6j.  0<OTVwR[ N<s9'CB̺N_cÇxolOcN?!C<UF۹Mdtɐ~umeaNfOI1LT%hKLw.ʓ{skdZUIlPLH RU%vLK{3ʔ͖ÉyqibYPJApPOL![#"p0JKڈF̘̖Ō}vnf^VNF>8qQNb*c) '~5JJVѝ̖Ǝˆyrjc[SKC;4-sOLs0k1  .6HNZҞ˕ǎÈ{unf_XPH@81)"oOJ7 t9 >;˴BWtѝʓƍÈ}wpib[TLD=5.&}o PH; }B;T<ײ@`yКǏċ‡|wqkd]VPH@91*"}xu jQF=1IOg>?c!˓ʇ{vqke_YRKD<5.'|wr m f OD@5QRu><i)Ŋ}yupkf`ZSMF@81)#~yt o i d]LB@G\%"k'=<w7}}|{xvrnid`ZTNHA;3,%|wr l f `ZUIAAb$d* %x+;?ރBxxuutspnjfb^YSNHB<6/( }yt o i c^WRLD@?p(j- .8AFrnmmmlkhfc_[WSMHB<60*#{vq k f `ZUOIC=<=~,_39IJojklkfdca_\XTPLFA<71*${xs m h c]YTMG@:69:x(y%7ޭ8]s1o.p/p/o/|9\]ZYVSPLJE@;60*%|xt p j e `YHCA=;86685c672////*F SSQQPMHCA>:50+% }yu q l f a\U8456677770. 33r100110JN\ejmlfXB31.)%}yu q m h b]XQ82x%̍,0000/q#1-F ^}{zzz{{tR0"!|yu q m h c^YUN5,-, *B `vI~xxu q m h d_ZUPJ2* .) )?`m2rll h d`[VQMF0( .( (<`f/e_^[WRMHB.' .& &9`ƛ̗jx+[POMID>+% .$ $5`ʤśśśśśśśśśśśśśƜɢƜ}KXD<<9*$ ." !2`ϬɢɢɢɢɢɢɢɢɢɢɢɢɢɢɢʣͨϪnwBL7'" . /`ӳͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩͩϬԱү˧m@ . +bػѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѰѯѰܼ{Q . (fԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶԶ{Q . $jٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽٽ}T .  l~W . o[ . s^ . vb  + ~e y"ʛ i?O* } T ?R+P(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(O(Q*9 ] (   / w  ڍ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ڌ ی ۋ }{1qlandkartegt-1.7.5/nsi/copyfiles.bat000644 001750 000144 00000005503 12225261330 020453 0ustar00oeichlerusers000000 000000 rem Batch file to copy the necessary files for the Windows Installer rem Please adapt environment variables in section 1) to your system rem useful links rem http://technet.microsoft.com/en-us/library/bb491035.aspx rem http://vlaurie.com/computers2/Articles/environment.htm rem Section 1.) Define path to Qt, MSVC, .... installations set QLGTI_QT_PATH=C:\Qt\4.8.3 set QLGTI_VCREDIST_PATH="E:\qlgt\tools\vcredist_VS2008SP1" set QLGTI_LIBEXIF_PATH="E:\qlgt\tools\libexif" set QLGTI_GDAL_PATH="%CD%\..\Win32\gdal\bin" rem Section 2.) Copy Files del /s/q Files mkdir Files cd Files rem Section 2.1) Copy Qt files copy %QLGTI_QT_PATH%\bin\QtCore4.dll copy %QLGTI_QT_PATH%\bin\QtGui4.dll copy %QLGTI_QT_PATH%\bin\QtNetwork4.dll copy %QLGTI_QT_PATH%\bin\QtOpenGL4.dll copy %QLGTI_QT_PATH%\bin\QtSql4.dll copy %QLGTI_QT_PATH%\bin\QtSvg4.dll copy %QLGTI_QT_PATH%\bin\QtWebKit4.dll copy %QLGTI_QT_PATH%\bin\phonon4.dll copy %QLGTI_QT_PATH%\bin\QtXml4.dll copy %QLGTI_QT_PATH%\bin\QtScript4.dll mkdir imageformats cd imageformats copy %QLGTI_QT_PATH%\plugins\imageformats\qgif4.dll copy %QLGTI_QT_PATH%\plugins\imageformats\qjpeg4.dll copy %QLGTI_QT_PATH%\plugins\imageformats\qmng4.dll copy %QLGTI_QT_PATH%\plugins\imageformats\qsvg4.dll copy %QLGTI_QT_PATH%\plugins\imageformats\qtiff4.dll copy %QLGTI_QT_PATH%\plugins\imageformats\qico4.dll copy %QLGTI_QT_PATH%\plugins\imageformats\qtga4.dll cd .. mkdir sqldrivers cd sqldrivers copy %QLGTI_QT_PATH%\plugins\sqldrivers\qsqlite4.dll cd .. rem The qt_??.qm files must have been created before by rem opening a qt shell, going to the translations directory and running rem for %f in (qt_??.ts) do lrelease %f copy %QLGTI_QT_PATH%\translations\qt_??.qm rem section 2.2) Copy GDAL Files mkdir gdal_bin cd gdal_bin xcopy %QLGTI_GDAL_PATH%\curl curl /s /i xcopy %QLGTI_GDAL_PATH%\debug debug /s /i mkdir gdal cd gdal xcopy %QLGTI_GDAL_PATH%\gdal\apps apps /s /i xcopy %QLGTI_GDAL_PATH%\gdal\plugins plugins /s /i xcopy %QLGTI_GDAL_PATH%\gdal\plugins-optional plugins-optional /s /i xcopy %QLGTI_GDAL_PATH%\gdal\python python /s /i cd .. xcopy %QLGTI_GDAL_PATH%\gdal-data gdal-data /s /i xcopy %QLGTI_GDAL_PATH%\proj proj /s /i copy %QLGTI_GDAL_PATH%\*.dll cd .. rem section 2.3) Copy MSVC Redist Files copy %QLGTI_VCREDIST_PATH%\vcredist_x86.exe rem section 2.4) Copy libexif Files copy %QLGTI_LIBEXIF_PATH%\libexif-12.dll rem section 2.5) Copy QLandkarte GT Files copy ..\..\build\bin\Release\qlandkartegt.exe copy ..\..\build\bin\Release\map2gcm.exe copy ..\..\build\bin\Release\map2rmap.exe copy ..\..\build\bin\Release\cache2gtiff.exe copy ..\..\build\bin\Release\map2rmp.exe copy ..\..\build\bin\Release\map2jnx.exe copy ..\..\build\src\*.qm copy ..\..\src\icons\GlobeWin.ico copy ..\*.ico rem section 2.6) 3rd party SW description copy ..\3rdparty.txt pauseqlandkartegt-1.7.5/nsi/kfm_home.ico000644 001750 000144 00000035356 12225261330 020260 0ustar00oeichlerusers000000 000000   6 h00 %F( @ ,8+ " X3XA"hC':${V!:nn4Gh; `># Q;hIfa7? 5(:1@10@(9.3A2!3/@-*:(:($':jbg''EJDHM2`.-/;"9%0+:1*3%9/)3 6&1*92&/#2'[,hd]x%$+gBC4./$01D 1*4-B!.0=%9)0@!2%.(=**5#1 yNeef]@44-B-5'29A!0,50;,0=&3#.2:!/(2.:*19 fffa_u'' %(XNN+:!,6B#0*44?02?(5(5@.".-:!.9```_[i((:>3E)7$50?#1(8)<3(8%2#3)8-$5.<'X*\\\\]W vKJL[.=.=.A,:-=.?)<-?+:%3'9'4%5#5%0 w R`````_^P~~yzzzy u u t u to6d(  34  .h!34 :%&?kP[%Iz1.- @Ma}4e{Wc#,\%J s pm|OՉXiFlyvqOІ)OpJ} qp{Fˊ@S̲˩*l ;}ppI [PʥVf ;g`vw\UVXdc P)Vpnzd&D,[!Y^inN =uE_bg:S!$)#'#')/-6-:05 G s .eSVF&/&9%7%8#6#4"3$2CW }#=D.A'4'7&6%4%4$4&6&!Z]F E3j,1*6*6(6(3'3'4'1 U WTb7D/?,;,>)<)8'8):EWVU)-&$""-(0` % %! :Wq|saN:' +IAgcG/x_I4"  7[4].VwW{$@cB*qZE1 (FwCs{+SKd+wU<& lU@, 6U/W=~uT btAj=MlN6gP<+ .r:h&a^- Yi>\j-4 }hG1X T8c'ZdDM9+ Xi>Ys$0yeP 8g'L *QB/ Sc6}Pz{@eJr!-RE2M^-w }A eEl ,UG3r`S1La(clj ~"C eDk )VJ7to5I^$A{|ʼn+ais` ~"C eCk%-WO;#CVJy*X؈2theVVgV ~"C dBk%-YR>- BVOsGoֹ޹HRM ~"C cAj$+\UA0 AWPteFilWDC }"E c?j'-_\G3;QRqwE}GcB~S:9%F b?i'.O7 c;NSl!)~vAd'$Kv01%F a>h|~0)p DvB_uNa7[m?aP3 Bo+1%F a=hvz^MbvnjfvyotxrXwvd>\cR%@k*1%F aB>DFL?F=I4K5<4544./dbg { '<`XZ\]`bcefmY"DF)4@ ?I'2= 7B$0; 5?#0:0:&2:$AG%2=E&0SV%%P3d9q99 TSUWX[\^`cd'@954AJS$2>5@HP(-:7BJQ(*74?FM%$36ADK'.1<@H$)00YQce.. SOPRSVWY[b4f+('7-!3+"5&$5'&8)#4%%6&'7&/=&(7$(8 ,6 79i'vi_((!!BRKMNQRTYF $>E)4C'=K'5D &;I).= 9G '-= !;H),< !7E+2> 5<?'bh66 'MIGILMPP1D@AJKU %1?AIJR '*;BIGP)+AF3"$ 3@'.<2<$*1k*}e_00 4?<=:MI AJMWLW9BISKU 5?GRHR4=GPHR#-7AKDO#&1DK:A }B(a0h22 )9;U>;*9(6#-)1)6!0%/#+#0,%4 ."0*(1$*6(*3()5$.6 ) K6 ]d55I*+1RW(3>;F&4>AJ'3A$?I$-8 ?G&,8 ;D#,7"%YV\%%ybdFRT[>HBMQX5?AJKU 2@=GKR 3=sS% y2N_IO [}w2Oa KS> m wP(nJ+N21O_#QXB(((TTTrss}~~lmmKLL!!!Y w]J_G\ ~]]]ꓔQRRAAM񧤬bJ` ///ıxyz/Pj|-,,ɷ>>K }INqrsX UTTë==>(!!!L߿}svxPKKK())w ccc߽ܷڲٰددٰ۳ݸàIJLwwxײ߼۵׮ըңСООСңը׮۵ѪZ[]}~ΤخӦϝ͘˖˗˗˗˗˖̘ϞӦخΤ|^acvwwˤϞ̙˖͚НРѡѡРΝ͘˖̘ѡ۱[^_```ίċΚПҤԨժ֬֬իԨҤП̙˖ץ٥zGHIlJJJzԥԨ֭ڳڵ۶۶۵ز֮ӨҢϜ˒g!!">>>>,ңڴܷ߽޽ܸٲիڪsv{}AAANNNݺ}c00/CFFF@@@pppz]cee|GGGFFFBBB;´~ânkwz{ GGGGGGFFFDDD>> NGGGGGGGGGIIIMMMLLLKKK,WVVzjji݇}cccFEEL (  @ <<2%/* <;&inc  :.o j=D4 3| k?AŷzzB@>"#%7.&#mnqзYWT߻ڲ֪թ׬۴uܷϞ͙͙͚̙͚שݴzײ˔Ҥթ֫Өϟӝǘvo inqоѢؤ׬QRSU;=>EϷֵ۸뺗{665FJKmŰȴլ'+.::;;::FHICquwĚ򪛗\^` (0` % (%=kz[/ >gnzNp/Ai@ {z 6n\CiA ~$4AU|%FhA }"3ED )FgA }!2BU\ mLiJ ~"2CUd3x= NiE "3BUe3yIfPi@ }"3BTd3yLi RiA }"3BSd3zOi (5=A>6*dX:{!3BTf<Qi-IhhM1w$8v3 3CUd7Rh+ ['''<<\\\ŚҥӤϝ̘ʖ˗͘ΛΜϝϝϝΜΛ͙˖ʕ˗ΜҢըد޸~sk(((5RRRƣɗΛʖ˗͚ϝРѢңҤҥҥңѢСϞΛ˗ʖ͙Ѡԧگwyv(FFFж̘͗ϞСҤӧթժ֬֬֬իժԧҥѢϞ͚ʖ̗ѠӢd g@@@gxϛПңԧժ׭ذٱٳٳٳٲذ׮֬ԨҤРΛ˗ϛnYkklI CCC'hhhǕԧթ׮رڴ۷ܹݺݺݺܹ۸ڵٲ׮ժӦѢΜ͗ftn;;;-HHH{ٮװڴܸ޻߿߿޽ݹ۵ر֬ӧզmU\CCC2000) of waypoints --- 2010.05.10 --- Request #167: Dutch translation Request #168: Add gpsd support Request #169: Optimize map rendering for Garmin maps Request #171: Add selection for typ file if there are several --- 2010.04.03 --- Bug #157: Fixed: Bad zoom factor for "zoom to fit" Request #158: Sort list entries in tool views Request #159: Accept more formats for waypoint coords and related. Bug #160: Fixed: Typ file is not used in gmapsupp.img Request #161: Code map set name into gmapsupp.img Request #162: Allow use of *.hgt files to import elevation data Bug #163: Fixed: GDAL tools not found on OS X port Bug #164: Fixed: Endless loop on profile over time for tracks with no timestamp. Request #165: Revert track Request #166: Speed up loading of Garmin tiles. --- 2010.03.04 --- Bug #141: Fix: Raster map search does not work with map files containing multiple '.' Bug #142: Fix: Raster map search does not work with lon/lat WGS84 projection Request #143: Delete map while active/shown Request #144: Make scalebar work for maps with lat/lon projection Bug #145: Fix: Zoom to area does not work when using lon/lat DEM and Garmin maps Bug #146: Fix: qlb and sticky waypoint handling for qt4.6 Request #147: Hide / show tracks Request #148: Add zoom to fit for multiple selected tracks Request #149: Add zoom to fit for multiple selected waypoints Request #150: Rewrite 3D view Request #151: Add first person view to 3D view Request #152: Add point of view on track to 3D view Request #153: Add compass to 3D view Request #154: Add elevation meter to 3D view Request #155: Add artificial horizont to 3D view Request #156: Add zoom to fit for multiple selected overlays --- 2010.02.06 --- Bug #134: Fix: GPX has bad tag Bug #135: Fix: Missing polylines in openmtbmap Request #136: Update language files Bug #137: Fix bad syntax that makes GCC 4.5 to fail Bug #138: Fix: QLandkarte GT crashing on copy-n-paste track. (+ enhance copy-n-paste) Bug #139: Fix overflow in retrieving GPS position from exif data Request #140: Unify behavior when moving a waypoint and distance polyline point --- 2010.01.24 --- Bug #123: Fixes for big endian systems Bug #124: Fixes for OSX build system Request #125: Add Garmin custom icons Request #126: Add live log support for NMEA devices Request #127: Make character set selectable for Garmin devices Request #128: Rewrite TYP decoding Request #129: Rewrite render engine for Garmin maps to match better TYP decoding. Request #130: Add checkbox for Garmin night vision to statusbar Request #131: Move detail selection to statusbar for Garmin maps Request #132: Pimp up elevation plots Request #133: Fix GUI glitches --- 2009.12.21 --- Request #92: Rework gpx saving/loading to be standard compliant. Request #116: Add drag-n-drop for gpx et al Request #117: Add map names as tooltips in map list Request #118: Add list of recent loaded/saved geo data files Request #119: Add Spanish translation Request #120: Add track filter to change timestamps and to weed out track points. Request #121: Add download of routes to Garmin devices Request #122: Add command line options (use qlandkartegt --help for more information) --- 2009.10.26 --- Request #113: Add direction arrow to tracks Request #114: Add barcode to waypoint edit dialog Bug #115: Crash when deleting purged trackpoints --- 2009.09.18 --- Request #107: Remove copy of original track when splitting a track Bug #108: Purgeing trackpoints by del key is no toggle function anymore Request #109: Save 3D view as image file Request #110: Add device screenshot feature Request #111: Tweak rendering for Garmin maps to display latest OSM maps nicely Request #112: Accept any bitmap file type for referencing. --- 2009.08.17 --- Bug #100: Make arrow keys work on track edit again. Request #101: Add support for new Garmin map formats (latest ones still missing) Request #102: Save viewport and graphs as bitmap Request #104: Add waypoint support to 3D view (add, del, edit) Request #105: Add deselect for track Request #106: Open multiple files with geo data --- 2009.06.22 --- Bug #99: Fix corrupted Russian ts file --- 2009.06.22 --- Bug #99: Fix corrupted Russian ts file --- 2009.06.22 --- Bug #91: Crash with track cutting tool if last track point is selected. Request #93: Add klm to list of supported formats (via gpsbabel) Request #94: Convert track to distance polyline Request #96: Add waypoints from geo tagged images. Request #97: Restructure menus to be more flexible. --- 2009.05.20 --- Request #85: Garmin Maps: Draw lines with bitmaps form \*typ file Request #86: Add feature selection for Garmin maps. (context menu in the map list) Bug #87: Many small fixes for typ file icon decoding Bug #88: Crash on missing map Request #89: Map switching: Keep center of map if it is within the area of the new map. Request #90: Garmin maps: show type ids for polygons and points in info box --- 2009.05.05 --- Request #70: Waypoint tool view: convert multiple waypoints to route Request #77: Add support for 32bit RGB(A) raster maps. Request #78: move opened raster maps to center instead of top left corner Bug #79: Zoom snaps back to previous zoom level when zooming via F2 followed by mouse wheel Request #80: Add quadratic zoom as option to raster maps (single file and *qmap) Request #81: Convert distance polyline to track: make interval of track points selectable Request #82: Convert distance polyline to route Request #83: Upload tracks to Garmin device Request #84: Add route upload for Garmin devices --- 2009.04.14 --- Request #69: Italian translation Request #71: Add track graphs over distance and time Request #72: Group edit proximity distance Request #73: Load geo data (gpx, loc ...) from command line Request #74: Russian translation Bug #75: Length does not change while deleting points in distance polyline Bug #76: Loading single raster map file with long/lat projection gives bad coord. in status bar --- 2009.03.09 --- Bug #60: Distance line function wheel: remove lock when wheel is on and new line is added. Request #61: Distance line function wheel: add icons to add point at start/end of line Request #62: Add GUI to create GDAL WMS definition files Request #63: Make trackedit sortable Request #64: Add German translation Request #65: Add French translation Request #66: Add support for OSM tile server Bug #67: Map crashes on maps with polyline types > 0x2B Request #68: 3D view: fill complete skybox area with map --- 2009.02.06 --- Request #54: Garmin: Decode point icons of encoding type 0x20 Request #55: Delete waypoints by group Request #56: Optimize function wheel for distance points Request #57: Add zoom by area Request #58: Add real lightning to 3D view with variable light source Request #59: Add simple support for WMS maps via GDAL_WMS XML file (see http://www.gdal.org/frmt_wms.html) --- 2009.01.01 --- Request #51: Garmin: Show labels of urban points on all zoom levels Request #52: Garmin: fine tune detail level Request #53: Add false lightning to 3D via 2D map shading --- 2008.12.23 --- Request #44: Garmin: add typ file polygon type 7 Bug #45: Garmin: Crash with typ files that have empty sections Request #46: Garmin: Collect points/pois and polylines in SQLite database. Request #47: Garmin: search polylines and points by name Bug #48: Search and fix memory leaks. Request #49: Add clouds to 3D view. Request #50: Optimize 3D view creation for speed. --- 2008.12.05 --- Request #37: Garmin maps: Add text to polylines Request #38: Optimze DEM interpolation for faster 3D view. Request #39: Add positon bars to profile graph et al Request #40: Optimize track render Bug #41: Garmin maps: some intermediate maplevels are missing Request #42: Add sky to 3D view Request #43: Remove side information from QLandkarteGT.conf when deleting Garmin maps. --- 2008.11.24 --- Request #33: Garmin typ file support Request #34: Change render engine for Garmin maps to allow skinnig Request #35: Add typ file support to Garmin map upload Bug #36: Fixed: Garmin maps with same tdb name get same alias in map tool view --- 2008.11.13 --- Request #27: Restructure DEM data handling Request #28: Change map tool view to apply DEM data to all maps Request #29: Stack vector maps as overlay Request #30: Export Garmin maps to gmapsupp.img Request #31: Upload maps to Garmin devices Request #32: Add lefthand menu and eye candy to 3D view --- 2008.10.29 --- Request #22: Search for symbols on raster maps (\*.qmap) Request #23: 3D OpenGL track view Request #24: 3D OpenGL landscape model Request #25: Add Garmin map (\*tdb) support. Request #26: Load \*loc and \*gdb files via GPSBabel --- 2008.09.30 --- Request #12: Add icon wheel to search results Request #13: Reorganize track statistics graphs Request #14: Add shortterm average speed to track and graph Request #15: Read Garmin \*tcx Bug #16: Fix QT bug for floating point attributes in XML Request #17: Select trackpoints by rectangle on map Request #18: Add waypoint icons to profile graph Request #19: Add zoom to track statistic graphs Request #20: Combine tracks sorted either by timestamp or list order Bug #21: Fixed bug in "cut track" marker --- 2008.09.01 --- Request #6: Add distance polyline to olverlays Request #7: Convert distance overlay to track Request #8: Save / load distance overlay as qlb and qpx Request #9: Add device quick selection to left hand tool view. Request #10: Add track upload (QLandkarte M only) Request #11: Add icon wheel to select function to waypoints --- 2008.07.14 --- Request #1: Restart project management after crash Request #2: Add geo-referenced text box to overlays Request #3: Add "no map" to list of known maps Request #4: Add unit converter to use other units than metric Request #5: Add nautic units --- 2008.06.13 --- Request #50: Add ascend and descend values to secondary track information Request #51: Add eleveation from DEM data to elevation plot as reference Request #52: Add Mercator projection to NoMap to display overlays without map Request #53: Make mouse wheel direction an option Bug #54: fixed bug in coord. calc. for W1° < lon < 0, S1° < lat < 0 Request #55: Add handler for simple graphical elements (overlays) Request #56: Add a fixed text box to overlays --- 2008.05.30 --- Request #41: Add live log Bug #42: Fixed installer script for Win32, take FWTools out of binary Request #43: Improve map export for further needs Request #46: Buffer map to perform faster drawing operations on top of it Bug #44: Fixed bad track timestamps for Garmin devices Bug #45: Fixed bad total time for tracks longer a day Request #47: Clean up code, move drawing of overlays into DB objects Request #48: Convert search result to waypoint and copy to clipboard Request #49: Update elevation of a waypoint when moved (and DEM data is present) --- 2008.05.16 --- Request #23: Split a track Request #36: Add support for Garmin device driver plugins Request #37: Add down-/upload of waypoints to Garmin device Request #38: Add track download to Garmin device Request #39: Combine multiple tracks Request #40: Add "upload/download all" function --- 2008.05.06 --- Request #28: Printing diary: rotate map to fit the portrait page Bug #29: Empty diary is not detected as empty Request #30: Add elevation plot for tracks Request #31: Add speed plot for tracks Request #32: Support gray scale bitmaps Request #33: Allow the user to change the file name of a referenced file. Request #34: Load a single GeoTiff file (w/o \*.qmap) Request #35: Add win32 binary installer --- 2008.04.24 --- Bug #24: Modify flag was set when loading geo data with diary content. Request #25: Add project summary to left hand side splitter Bug #26: Add geo data erased diary with new data Request #27: Generate diary from loaded geo data --- 2008.04.19 --- Request #11: Suppress scalebar for bitmaps without georeferenceing information. Request #12: Implement sticky waypoints. Request #13: Add projection wizard to GeoTiff creation. Request #14: Add http link to waypoint Request #15: Add waypoint edit/copy position/delete to canvas context menu Request #16: Add move and add waypoint to context menu Request #17: Add edit track and copy trackpoint position to context menu Request #18: Probe for GDAL tools Request #19: Add a diary editor to document maps, tracks and waypoints. Request #20: Add loaded geo data file to title bar Request #21: Add modify flag to title bar Request #22: Ask user to save modified data before it is destroyed. --- 2008.03.28 --- Bug #4: Saving \*gcp with extension failed. Fixed. Bug #5: Keep selection marker for selected track points when selecting multiple points by mouse click. Request #6: Add start and end timestamp to track list label Request #7: Reset the track counter on clear all and load geo data Request #8: Add scalebar Request #9: Add waypoint projection. Bug #10: Fixed bad calculation of proximity circle size --- 2007.12.11 --- Request #1: Initial release qlandkartegt-1.7.5/DefineOptions.cmake000644 001750 000144 00000000233 12225261330 020740 0ustar00oeichlerusers000000 000000 option(WITH_LOG4C "Build csync without log4c" ON) option(UNIT_TESTING "Build with unit tests" OFF) option(MEM_NULL_TESTS "Enable NULL memory testing" OFF) qlandkartegt-1.7.5/cmake/Modules/DefineCMakeDefaults.cmake000644 001750 000144 00000001611 12225261330 024446 0ustar00oeichlerusers000000 000000 # Always include srcdir and builddir in include path # This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY} in # about every subdir # since cmake 2.4.0 set(CMAKE_INCLUDE_CURRENT_DIR ON) # Put the include dirs which are in the source or build tree # before all other include dirs, so the headers in the sources # are prefered over the already installed ones # since cmake 2.4.1 set(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON) # Use colored output # since cmake 2.4.0 set(CMAKE_COLOR_MAKEFILE ON) # Define the generic version of the libraries here set(GENERIC_LIB_VERSION "0.1.0") set(GENERIC_LIB_SOVERSION "0") # Set the default build type to release with debug info if (NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE ) endif (NOT CMAKE_BUILD_TYPE) qlandkartegt-1.7.5/cmake/Modules/FindDMTX.cmake000644 001750 000144 00000003425 12225261330 022245 0ustar00oeichlerusers000000 000000 # - Try to find DMTX # Once done this will define # # DMTX_FOUND - system has DMTX # DMTX_INCLUDE_DIRS - the DMTX include directory # DMTX_LIBRARIES - Link these to use DMTX # DMTX_DEFINITIONS - Compiler switches required for using DMTX # # Copyright (c) 2006 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (DMTX_LIBRARIES AND DMTX_INCLUDE_DIRS) # in cache already set(DMTX_FOUND TRUE) else (DMTX_LIBRARIES AND DMTX_INCLUDE_DIRS) find_path(DMTX_INCLUDE_DIRS NAMES dmtx.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include /usr/include/libdmtx /usr/local/include/libdmtx /opt/local/include/libdmtx /sw/include/libdmtx ../../tools/libdmtx ) # debian uses version suffixes # add suffix evey new release find_library(DMTX_LIBRARIES NAMES if (WIN32) libdmtx else (WIN32) dmtx endif (WIN32) PATHS /usr/lib64 /usr/lib /usr/local/lib /opt/local/lib /sw/lib ../../tools/libdmtx ) if (DMTX_INCLUDE_DIRS AND DMTX_LIBRARIES) set(DMTX_FOUND TRUE) endif (DMTX_INCLUDE_DIRS AND DMTX_LIBRARIES) if (DMTX_FOUND) if (NOT DMTX_FIND_QUIETLY) message(STATUS "Found DMTX: ${DMTX_LIBRARIES}") endif (NOT DMTX_FIND_QUIETLY) else (DMTX_FOUND) if (DMTX_FIND_REQUIRED) message(FATAL_ERROR "Could not find DMTX") endif (DMTX_FIND_REQUIRED) endif (DMTX_FOUND) # show the DMTX_INCLUDE_DIRS and DMTX_LIBRARIES variables only in the advanced view mark_as_advanced(DMTX_INCLUDE_DIRS DMTX_LIBRARIES) endif (DMTX_LIBRARIES AND DMTX_INCLUDE_DIRS) qlandkartegt-1.7.5/cmake/Modules/FindPROJ.cmake000644 001750 000144 00000003652 12225261330 022245 0ustar00oeichlerusers000000 000000 # - Try to find PROJ # Once done this will define # # PROJ_FOUND - system has PROJ # PROJ_INCLUDE_DIRS - the PROJ include directory # PROJ_LIBRARIES - Link these to use PROJ # PROJ_DEFINITIONS - Compiler switches required for using PROJ # # Copyright (c) 2009 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (PROJ_LIBRARIES AND PROJ_INCLUDE_DIRS) # in cache already set(PROJ_FOUND TRUE) else (PROJ_LIBRARIES AND PROJ_INCLUDE_DIRS) find_path(PROJ_INCLUDE_DIR NAMES proj_api.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include ${CMAKE_SOURCE_DIR}/Win32/GDAL/include PATH_SUFFIXES proj4 ) mark_as_advanced(PROJ_INCLUDE_DIR) find_library(LIBPROJ_LIBRARY NAMES proj proj_i PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ${CMAKE_SOURCE_DIR}/Win32/GDAL/lib ) mark_as_advanced(LIBPROJ_LIBRARY) if (LIBPROJ_LIBRARY) set(LIBPROJ_FOUND TRUE) endif (LIBPROJ_LIBRARY) set(PROJ_INCLUDE_DIRS ${PROJ_INCLUDE_DIR} ) if (LIBPROJ_FOUND) set(PROJ_LIBRARIES ${PROJ_LIBRARIES} ${LIBPROJ_LIBRARY} ) endif (LIBPROJ_FOUND) if (PROJ_INCLUDE_DIRS AND PROJ_LIBRARIES) set(PROJ_FOUND TRUE) endif (PROJ_INCLUDE_DIRS AND PROJ_LIBRARIES) if (PROJ_FOUND) if (NOT PROJ_FIND_QUIETLY) message(STATUS "Found PROJ: ${PROJ_LIBRARIES}") endif (NOT PROJ_FIND_QUIETLY) else (PROJ_FOUND) if (PROJ_FIND_REQUIRED) message(FATAL_ERROR "Could not find PROJ") endif (PROJ_FIND_REQUIRED) endif (PROJ_FOUND) # show the PROJ_INCLUDE_DIRS and PROJ_LIBRARIES variables only in the advanced view mark_as_advanced(PROJ_INCLUDE_DIRS PROJ_LIBRARIES) endif (PROJ_LIBRARIES AND PROJ_INCLUDE_DIRS) qlandkartegt-1.7.5/cmake/Modules/COPYING-CMAKE-SCRIPTS000644 001750 000144 00000002457 12225261330 022670 0ustar00oeichlerusers000000 000000 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 copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the 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 not 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. qlandkartegt-1.7.5/cmake/Modules/MacroCopyFile.cmake000644 001750 000144 00000002157 12225261330 023365 0ustar00oeichlerusers000000 000000 # - macro_copy_file(_src _dst) # Copies a file to ${_dst} only if ${_src} is different (newer) than ${_dst} # # Example: # macro_copy_file(${CMAKE_CURRENT_SOURCE_DIR}/icon.png ${CMAKE_CURRENT_BINARY_DIR}/.) # Copies file icon.png to ${CMAKE_CURRENT_BINARY_DIR} directory # # Copyright (c) 2006-2007 Wengo # Copyright (c) 2006-2008 Andreas Schneider # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING file. macro (macro_copy_file _src _dst) # Removes all path containing .svn or CVS or CMakeLists.txt during the copy if (NOT ${_src} MATCHES ".*\\.svn|CVS|CMakeLists\\.txt.*") if (CMAKE_VERBOSE_MAKEFILE) message(STATUS "Copy file from ${_src} to ${_dst}") endif (CMAKE_VERBOSE_MAKEFILE) # Creates directory if necessary get_filename_component(_path ${_dst} PATH) file(MAKE_DIRECTORY ${_path}) execute_process( COMMAND ${CMAKE_COMMAND} -E copy_if_different ${_src} ${_dst} OUTPUT_QUIET ) endif (NOT ${_src} MATCHES ".*\\.svn|CVS|CMakeLists\\.txt.*") endmacro (macro_copy_file) qlandkartegt-1.7.5/cmake/Modules/FindEXIF.cmake000644 001750 000144 00000003360 12225261330 022222 0ustar00oeichlerusers000000 000000 # - Try to find EXIF # Once done this will define # # EXIF_FOUND - system has EXIF # EXIF_INCLUDE_DIRS - the EXIF include directory # EXIF_LIBRARIES - Link these to use EXIF # EXIF_DEFINITIONS - Compiler switches required for using EXIF # # Copyright (c) 2006 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (EXIF_LIBRARIES AND EXIF_INCLUDE_DIRS) # in cache already set(EXIF_FOUND TRUE) else (EXIF_LIBRARIES AND EXIF_INCLUDE_DIRS) find_path(EXIF_INCLUDE_DIRS NAMES exif-data.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include /usr/include/libexif /usr/local/include/libexif /opt/local/include/libexif /sw/include/libexif ) # debian uses version suffixes # add suffix evey new release find_library(EXIF_LIBRARIES NAMES exif PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) if (EXIF_INCLUDE_DIRS AND EXIF_LIBRARIES) set(EXIF_FOUND TRUE) endif (EXIF_INCLUDE_DIRS AND EXIF_LIBRARIES) if (EXIF_FOUND) if (NOT EXIF_FIND_QUIETLY) message(STATUS "Found EXIF: ${EXIF_LIBRARIES}") endif (NOT EXIF_FIND_QUIETLY) else (EXIF_FOUND) if (EXIF_FIND_REQUIRED) message(FATAL_ERROR "Could not find EXIF") endif (EXIF_FIND_REQUIRED) endif (EXIF_FOUND) # show the EXIF_INCLUDE_DIRS and EXIF_LIBRARIES variables only in the advanced view mark_as_advanced(EXIF_INCLUDE_DIRS EXIF_LIBRARIES) endif (EXIF_LIBRARIES AND EXIF_INCLUDE_DIRS) if (WIN32) set(EXIF_FOUND TRUE) set(EXIF_LIBRARIES "") set(EXIF_INCLUDE_DIRS "") endif (WIN32) qlandkartegt-1.7.5/cmake/Modules/CMakeLists.txt000644 001750 000144 00000001555 12225261330 022430 0ustar00oeichlerusers000000 000000 # install the cmake files file(GLOB cmakeFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.cmake") set(module_install_dir ${DATA_INSTALL_DIR}/cmake/modules ) install( FILES ${cmakeFiles} DESTINATION ${module_install_dir} ) # the files listed here will be removed by remove_obsoleted_cmake_files.cmake, Alex set(FILES_TO_REMOVE ) install(SCRIPT ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake ) file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake "#generated by cmake, dont edit\n\n") foreach ( _current_FILE ${FILES_TO_REMOVE}) file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake "message(STATUS \"Removing ${module_install_dir}/${_current_FILE}\" )\n" ) file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/remove_files.cmake "exec_program( ${CMAKE_COMMAND} ARGS -E remove ${module_install_dir}/${_current_FILE} OUTPUT_VARIABLE _dummy)\n" ) endforeach ( _current_FILE) qlandkartegt-1.7.5/cmake/Modules/DefineCompilerFlags.cmake000644 001750 000144 00000000531 12225261330 024525 0ustar00oeichlerusers000000 000000 # define system dependent compiler flags include(CheckCXXCompilerFlag) # with -fPIC if(UNIX AND NOT WIN32) if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") check_cxx_compiler_flag("-fPIC" WITH_FPIC) if(WITH_FPIC) ADD_DEFINITIONS(-fPIC) endif(WITH_FPIC) endif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") endif(UNIX AND NOT WIN32) qlandkartegt-1.7.5/cmake/Modules/MacroEnsureOutOfSourceBuild.cmake000644 001750 000144 00000001227 12225261330 026227 0ustar00oeichlerusers000000 000000 # - MACRO_ENSURE_OUT_OF_SOURCE_BUILD() # MACRO_ENSURE_OUT_OF_SOURCE_BUILD() # Copyright (c) 2006, Alexander Neundorf, # # Redistribution and use is allowed according to the terms of the BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. macro (MACRO_ENSURE_OUT_OF_SOURCE_BUILD _errorMessage) string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" _insource) if (_insource) message(SEND_ERROR "${_errorMessage}") message(FATAL_ERROR "Remove the file CMakeCache.txt in ${CMAKE_SOURCE_DIR} first.") endif (_insource) endmacro (MACRO_ENSURE_OUT_OF_SOURCE_BUILD) qlandkartegt-1.7.5/cmake/Modules/FindGPSD.cmake000644 001750 000144 00000003353 12225261330 022226 0ustar00oeichlerusers000000 000000 # - Try to find GPSD # Once done this will define # # GPSD_FOUND - system has GPSD # GPSD_INCLUDE_DIRS - the GPSD include directory # GPSD_LIBRARIES - Link these to use GPSD # GPSD_DEFINITIONS - Compiler switches required for using GPSD # # Copyright (c) 2006 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (GPSD_LIBRARIES AND GPSD_INCLUDE_DIRS) # in cache already set(GPSD_FOUND TRUE) else (GPSD_LIBRARIES AND GPSD_INCLUDE_DIRS) find_path(GPSD_INCLUDE_DIRS NAMES gps.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include /usr/include/gps /usr/local/include/gps /opt/local/include/gps /sw/include/gps ) # debian uses version suffixes # add suffix evey new release find_library(GPSD_LIBRARIES NAMES gps PATHS /usr/lib64 /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) if (GPSD_INCLUDE_DIRS AND GPSD_LIBRARIES) set(GPSD_FOUND TRUE) endif (GPSD_INCLUDE_DIRS AND GPSD_LIBRARIES) if (GPSD_FOUND) if (NOT GPSD_FIND_QUIETLY) message(STATUS "Found GPSD: ${GPSD_LIBRARIES}") endif (NOT GPSD_FIND_QUIETLY) else (GPSD_FOUND) if (GPSD_FIND_REQUIRED) message(FATAL_ERROR "Could not find GPSD") endif (GPSD_FIND_REQUIRED) endif (GPSD_FOUND) # show the GPSD_INCLUDE_DIRS and GPSD_LIBRARIES variables only in the advanced view mark_as_advanced(GPSD_INCLUDE_DIRS GPSD_LIBRARIES) endif (GPSD_LIBRARIES AND GPSD_INCLUDE_DIRS) if (WIN32) set(GPSD_FOUND FALSE) set(GPSD_LIBRARIES "") set(GPSD_INCLUDE_DIRS "") endif (WIN32) qlandkartegt-1.7.5/cmake/Modules/FindQtSoap.cmake000644 001750 000144 00000003561 12225261330 022701 0ustar00oeichlerusers000000 000000 # - Try to find QtSoap # Once done this will define # # QTSOAP_FOUND - system has QTSOAP # QTSOAP_INCLUDE_DIRS - the QTSOAP include directory # QTSOAP_LIBRARIES - Link these to use QTSOAP # QTSOAP_DEFINITIONS - Compiler switches required for using QTSOAP # # Copyright (c) 2006 Andreas Schneider # updated for QtSoap by Dan Horák # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (QTSOAP_LIBRARIES AND QTSOAP_INCLUDE_DIRS) # in cache already set(QTSOAP_FOUND TRUE) else (QTSOAP_LIBRARIES AND QTSOAP_INCLUDE_DIRS) find_path(QTSOAP_INCLUDE_DIRS NAMES qtsoap.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include /usr/include/QtSoap /usr/local/include/QtSoap /opt/local/include/QtSoap /sw/include/QtSoap ) # debian uses version suffixes # add suffix evey new release find_library(QTSOAP_LIBRARIES NAMES qtsoap PATHS /usr/lib64 /usr/lib /usr/local/lib /opt/local/lib /sw/lib ) if (QTSOAP_INCLUDE_DIRS AND QTSOAP_LIBRARIES) set(QTSOAP_FOUND TRUE) endif (QTSOAP_INCLUDE_DIRS AND QTSOAP_LIBRARIES) if (QTSOAP_FOUND) if (NOT QTSOAP_FIND_QUIETLY) message(STATUS "Found QtSoap: ${QTSOAP_LIBRARIES}") endif (NOT QTSOAP_FIND_QUIETLY) else (QTSOAP_FOUND) if (QTSOAP_FIND_REQUIRED) message(FATAL_ERROR "Could not find QtSoap") endif (QTSOAP_FIND_REQUIRED) endif (QTSOAP_FOUND) # show the QTSOAP_INCLUDE_DIRS and QTSOAP_LIBRARIES variables only in the advanced view mark_as_advanced(QTSOAP_INCLUDE_DIRS QTSOAP_LIBRARIES) endif (QTSOAP_LIBRARIES AND QTSOAP_INCLUDE_DIRS) if (WIN32) set(QTSOAP_FOUND FALSE) set(QTSOAP_LIBRARIES "") set(QTSOAP_INCLUDE_DIRS "") endif (WIN32) qlandkartegt-1.7.5/cmake/Modules/FindGDAL.cmake000644 001750 000144 00000003724 12225261330 022202 0ustar00oeichlerusers000000 000000 # - Try to find GDAL # Once done this will define # # GDAL_FOUND - system has GDAL # GDAL_INCLUDE_DIRS - the GDAL include directory # GDAL_LIBRARIES - Link these to use GDAL # GDAL_DEFINITIONS - Compiler switches required for using GDAL # # Copyright (c) 2006 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (GDAL_LIBRARIES AND GDAL_INCLUDE_DIRS) # in cache already set(GDAL_FOUND TRUE) else (GDAL_LIBRARIES AND GDAL_INCLUDE_DIRS) find_path(GDAL_INCLUDE_DIR NAMES gdal.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include /usr/include/gdal /usr/local/include/gdal /opt/local/include/gdal /sw/include/gdal ${CMAKE_SOURCE_DIR}/Win32/GDAL/include PATH_SUFFIXES gdal ) # debian uses version suffixes # add suffix evey new release find_library(GDAL_LIBRARY NAMES gdal gdal1.3.2 gdal1.4.0 gdal1.5.0 gdal1.6.0 gdal1.7.0 gdal1.8.0 gdal gdal_i PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ${CMAKE_SOURCE_DIR}/Win32/GDAL/lib ) set(GDAL_INCLUDE_DIRS ${GDAL_INCLUDE_DIR} ) set(GDAL_LIBRARIES ${GDAL_LIBRARY} ) if (GDAL_INCLUDE_DIRS AND GDAL_LIBRARIES) set(GDAL_FOUND TRUE) endif (GDAL_INCLUDE_DIRS AND GDAL_LIBRARIES) if (GDAL_FOUND) if (NOT GDAL_FIND_QUIETLY) message(STATUS "Found GDAL: ${GDAL_LIBRARIES}") endif (NOT GDAL_FIND_QUIETLY) else (GDAL_FOUND) if (GDAL_FIND_REQUIRED) message(FATAL_ERROR "Could not find GDAL") endif (GDAL_FIND_REQUIRED) endif (GDAL_FOUND) # show the GDAL_INCLUDE_DIRS and GDAL_LIBRARIES variables only in the advanced view mark_as_advanced(GDAL_INCLUDE_DIRS GDAL_LIBRARIES) endif (GDAL_LIBRARIES AND GDAL_INCLUDE_DIRS) qlandkartegt-1.7.5/cmake/Modules/FindXercesC.cmake000644 001750 000144 00000004775 12225261330 023036 0ustar00oeichlerusers000000 000000 # - Try to find XercesC # Once done this will define # # XERCESC_FOUND - system has XercesC # XERCESC_INCLUDE_DIRS - the XercesC include directory # XERCESC_LIBRARIES - Link these to use XercesC # XERCESC_DEFINITIONS - Compiler switches required for using XercesC # # Copyright (c) 2009 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # if (XERCESC_LIBRARIES AND XERCESC_INCLUDE_DIRS) # in cache already set(XERCESC_FOUND TRUE) else (XERCESC_LIBRARIES AND XERCESC_INCLUDE_DIRS) find_path(XERCESC_INCLUDE_DIR NAMES xercesc/util/XercesVersion.hpp PATHS /usr/include /usr/local/include /opt/local/include /sw/include C:/progra~1/xerces-c_2_8_0/include ) mark_as_advanced(XERCESC_INCLUDE_DIR) find_library(XERCES-C_LIBRARY NAMES xerces-c xerces-c_2 PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib C:/progra~1/xerces-c_2_8_0/lib ) mark_as_advanced(XERCES-C_LIBRARY) find_library(XERCES-DEPDOM_LIBRARY NAMES xerces-depdom xerces-depdom_2 PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib C:/progra~1/xerces-c_2_8_0/lib ) mark_as_advanced(XERCES-DEPDOM_LIBRARY) if (XERCES-C_LIBRARY) set(XERCES-C_FOUND TRUE) endif (XERCES-C_LIBRARY) if (XERCES-DEPDOM_LIBRARY) set(XERCES-DEPDOM_FOUND TRUE) endif (XERCES-DEPDOM_LIBRARY) set(XERCESC_INCLUDE_DIRS ${XERCESC_INCLUDE_DIR} ) if (XERCES-C_FOUND) set(XERCESC_LIBRARIES ${XERCESC_LIBRARIES} ${XERCES-C_LIBRARY} ) endif (XERCES-C_FOUND) if (XERCES-DEPDOM_FOUND) set(XERCESC_LIBRARIES ${XERCESC_LIBRARIES} ${XERCES-DEPDOM_LIBRARY} ) endif (XERCES-DEPDOM_FOUND) if (XERCESC_INCLUDE_DIRS AND XERCESC_LIBRARIES) set(XERCESC_FOUND TRUE) endif (XERCESC_INCLUDE_DIRS AND XERCESC_LIBRARIES) if (XERCESC_FOUND) if (NOT XercesC_FIND_QUIETLY) message(STATUS "Found XercesC: ${XERCESC_LIBRARIES}") endif (NOT XercesC_FIND_QUIETLY) else (XERCESC_FOUND) if (XercesC_FIND_REQUIRED) message(FATAL_ERROR "Could not find XercesC") endif (XercesC_FIND_REQUIRED) endif (XERCESC_FOUND) # show the XERCESC_INCLUDE_DIRS and XERCESC_LIBRARIES variables only in the advanced view mark_as_advanced(XERCESC_INCLUDE_DIRS XERCESC_LIBRARIES) endif (XERCESC_LIBRARIES AND XERCESC_INCLUDE_DIRS) qlandkartegt-1.7.5/cmake/Modules/DefineInstallationPaths.cmake000644 001750 000144 00000007132 12225261330 025443 0ustar00oeichlerusers000000 000000 if (UNIX) IF (NOT APPLICATION_NAME) MESSAGE(STATUS "${PROJECT_NAME} is used as APPLICATION_NAME") SET(APPLICATION_NAME ${PROJECT_NAME}) ENDIF (NOT APPLICATION_NAME) STRING(TOLOWER ${APPLICATION_NAME} _APPLICATION_NAME) # Suffix for Linux SET(LIB_SUFFIX CACHE STRING "Define suffix of directory name (32/64)" ) SET(EXEC_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}" CACHE PATH "Base directory for executables and libraries" FORCE ) SET(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share" CACHE PATH "Base directory for files which go to share/" FORCE ) SET(DATA_INSTALL_PREFIX "${SHARE_INSTALL_PREFIX}/" CACHE PATH "The parent directory where applications can install their data" FORCE) # The following are directories where stuff will be installed to SET(BIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/bin" CACHE PATH "The ${_APPLICATION_NAME} binary install dir (default prefix/bin)" FORCE ) SET(SBIN_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/sbin" CACHE PATH "The ${_APPLICATION_NAME} sbin install dir (default prefix/sbin)" FORCE ) SET(LIB_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/lib${LIB_SUFFIX}" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is prefix/lib)" FORCE ) SET(LIBEXEC_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/libexec" CACHE PATH "The subdirectory relative to the install prefix where libraries will be installed (default is prefix/libexec)" FORCE ) SET(PLUGIN_INSTALL_DIR "${LIB_INSTALL_DIR}/${_APPLICATION_NAME}" CACHE PATH "The subdirectory relative to the install prefix where plugins will be installed (default is prefix/lib/${_APPLICATION_NAME})" FORCE ) SET(INCLUDE_INSTALL_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "The subdirectory to the header prefix (default prefix/include)" FORCE ) SET(DATA_INSTALL_DIR "${DATA_INSTALL_PREFIX}" CACHE PATH "The parent directory where applications can install their data (default prefix/share/${_APPLICATION_NAME})" FORCE ) SET(HTML_INSTALL_DIR "${DATA_INSTALL_PREFIX}/doc/HTML" CACHE PATH "The HTML install dir for documentation (default data/doc/html)" FORCE ) SET(ICON_INSTALL_DIR "${DATA_INSTALL_PREFIX}/icons" CACHE PATH "The icon install dir (default data/icons/)" FORCE ) SET(SOUND_INSTALL_DIR "${DATA_INSTALL_PREFIX}/sounds" CACHE PATH "The install dir for sound files (default data/sounds)" FORCE ) SET(LOCALE_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/locale" CACHE PATH "The install dir for translations (default prefix/share/locale)" FORCE ) SET(XDG_APPS_DIR "${SHARE_INSTALL_PREFIX}/applications/" CACHE PATH "The XDG apps dir" FORCE ) SET(XDG_DIRECTORY_DIR "${SHARE_INSTALL_PREFIX}/desktop-directories" CACHE PATH "The XDG directory" FORCE ) SET(SYSCONF_INSTALL_DIR "${EXEC_INSTALL_PREFIX}/etc" CACHE PATH "The ${_APPLICATION_NAME} sysconfig install dir (default prefix/etc)" FORCE ) SET(MAN_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/man" CACHE PATH "The ${_APPLICATION_NAME} man install dir (default prefix/man)" FORCE ) SET(INFO_INSTALL_DIR "${SHARE_INSTALL_PREFIX}/info" CACHE PATH "The ${_APPLICATION_NAME} info install dir (default prefix/info)" FORCE ) endif (UNIX) if (WIN32) # Same same SET(BIN_INSTALL_DIR .) SET(SBIN_INSTALL_DIR .) SET(LIB_INSTALL_DIR .) SET(PLUGIN_INSTALL_DIR plugins) SET(HTML_INSTALL_DIR doc/HTML) SET(ICON_INSTALL_DIR .) SET(SOUND_INSTALL_DIR .) SET(LOCALE_INSTALL_DIR lang) endif (WIN32) qlandkartegt-1.7.5/cmake/Modules/FindJPEG.cmake000644 001750 000144 00000004110 12225261330 022206 0ustar00oeichlerusers000000 000000 # - Try to find LIBJPEG # Once done this will define # # JPEG_FOUND - system has LIBJPEG # JPEG_INCLUDE_DIRS - the LIBJPEG include directory # JPEG_LIBRARIES - Link these to use LIBJPEG # JPEG_DEFINITIONS - Compiler switches required for using LIBJPEG # # Copyright (c) 2009 Andreas Schneider # # Redistribution and use is allowed according to the terms of the New # BSD license. # For details see the accompanying COPYING-CMAKE-SCRIPTS file. # # NOTE: For Windows, please adapt the path (currently E:/qlgt/tools/libjpeg/win32) # to your local installation directory if (JPEG_LIBRARIES AND JPEG_INCLUDE_DIRS) # in cache already set(JPEG_FOUND TRUE) else (JPEG_LIBRARIES AND JPEG_INCLUDE_DIRS) find_path(JPEG_INCLUDE_DIR NAMES jpeglib.h PATHS /usr/include /usr/local/include /opt/local/include /sw/include ${CMAKE_SOURCE_DIR}/Win32/GDAL/include ) mark_as_advanced(JPEG_INCLUDE_DIR) find_library(LIBJPEG_LIBRARY NAMES if (WIN32) libjpeg else (WIN32) jpeg endif (WIN32) PATHS /usr/lib /usr/local/lib /opt/local/lib /sw/lib ${CMAKE_SOURCE_DIR}/Win32/GDAL/lib ) mark_as_advanced(LIBJPEG_LIBRARY) if (LIBJPEG_LIBRARY) set(LIBJPEG_FOUND TRUE) endif (LIBJPEG_LIBRARY) set(JPEG_INCLUDE_DIRS ${JPEG_INCLUDE_DIR} ) if (LIBJPEG_FOUND) set(JPEG_LIBRARIES ${JPEG_LIBRARIES} ${LIBJPEG_LIBRARY} ) endif (LIBJPEG_FOUND) if (JPEG_INCLUDE_DIRS AND JPEG_LIBRARIES) set(JPEG_FOUND TRUE) endif (JPEG_INCLUDE_DIRS AND JPEG_LIBRARIES) if (JPEG_FOUND) if (NOT JPEG_FIND_QUIETLY) message(STATUS "Found LIBJPEG: ${JPEG_LIBRARIES}") endif (NOT JPEG_FIND_QUIETLY) else (JPEG_FOUND) if (JPEG_FIND_REQUIRED) message(FATAL_ERROR "Could not find LIBJPEG") endif (JPEG_FIND_REQUIRED) endif (JPEG_FOUND) # show the JPEG_INCLUDE_DIRS and JPEG_LIBRARIES variables only in the advanced view mark_as_advanced(JPEG_INCLUDE_DIRS JPEG_LIBRARIES) endif (JPEG_LIBRARIES AND JPEG_INCLUDE_DIRS) qlandkartegt-1.7.5/cmake/CMakeLists.txt000644 001750 000144 00000000032 12225261330 021005 0ustar00oeichlerusers000000 000000 add_subdirectory(Modules) qlandkartegt-1.7.5/srtmconvert.py000644 001750 000144 00000001260 12225261330 020131 0ustar00oeichlerusers000000 000000 #!python import os from string import join geotifs = [] for root, dirs, files in os.walk("./", topdown=False): for name in files: if os.path.splitext(name)[1] != ".hgt": continue filename = os.path.join(root, name) cmd = "gdalwarp -t_srs \"+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +datum=WGS84 +units=m +no_defs \" -r cubic %s %s.tif" % (filename, name[:-4]) os.system(cmd) geotifs.append(name[:-4] + ".tif") cmd = "gdalwarp -r cubic " + join(geotifs) + " tmp.tif" os.system(cmd) cmd = "gdal_translate -co tiled=yes -co blockxsize=256 -co blockysize=256 -co compress=deflate -co predictor=1 tmp.tif srtm.tif" os.system(cmd) qlandkartegt-1.7.5/include/garmin/IDevice.h000644 001750 000144 00000047006 12225261330 021562 0ustar00oeichlerusers000000 000000 /********************************************************************************************** Copyright (C) 2007 Oliver Eichler oliver.eichler@gmx.de This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Garmin and MapSource are registered trademarks or trademarks of Garmin Ltd. or one of its subsidiaries. **********************************************************************************************/ #ifndef IDEVICE_H #define IDEVICE_H // need integer type definitions with fixed width #ifdef HAVE_INTTYPES_H # include #elif HAVE_STDINT_H # include #elif WIN32 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; #else # error neither inttypes.h nor stdint.h are available #endif #include #include #include #include #include #ifndef _MKSTR_1 #define _MKSTR_1(x) #x #define _MKSTR(x) _MKSTR_1(x) #endif #define INTERFACE_VERSION "01.18" namespace Garmin { /// common waypoint structure application side /** This structure has to be used to exchange a waypoint to QLandkarte. If an item is missing you can simply add it. This structure must never be copied assuming a certain alignment. Most values are the same like the ones used in the waypoint data structures used by Garmin. */ struct Wpt_t { Wpt_t() : wpt_class(0) , dspl_color(0) , dspl_attr(0) , smbl(8287) , lat(1000.0f) , lon(1000.0f) , alt(1.0e25f) , dpth(1.0e25f) , dist(1.0e25f) , ete(0xFFFFFFFF) , temp(1.0e25f) , time(0xFFFFFFFF) , wpt_cat(0) { strncpy(state," ", 3); strncpy(cc," ",3); } /// same as Garmin spec. uint8_t wpt_class; /// bit 0..4 of dspl_color uint8_t dspl_color; /// bit 5..6 of dspl_color uint8_t dspl_attr; /// same as Garmin spec. uint16_t smbl; /// the latitude as degrees double lat; /// the longitude as degrees double lon; /// same as Garmin spec. float alt; /// same as Garmin spec. float dpth; /// same as Garmin spec. float dist; /// same as Garmin spec. char state[3]; /// same as Garmin spec. char cc[3]; /// same as Garmin spec. uint32_t ete; /// same as Garmin spec. float temp; /// same as Garmin spec. uint32_t time; /// same as Garmin spec. uint16_t wpt_cat; /// same as Garmin spec. std::string ident; /// same as Garmin spec. std::string comment; /// same as Garmin spec. std::string facility; /// same as Garmin spec. std::string city; /// same as Garmin spec. std::string addr; /// same as Garmin spec. std::string crossroad; }; /// common route point structure application side /** This structure has to be used to exchange a waypoint to QLandkarte. If an item is missing you can simply add it. This structure must never be copied assuming a certain alignment. Most values are the same like the ones used in the waypoint and route point data structures used by Garmin. It adds link information. For more complex route operations, it is critical to note that this refers to the link with the *previous* waypoint. For example, when a route is inverted, the link information must be transfered to the previous point first. */ struct RtePt_t : public Wpt_t { RtePt_t() : rte_class(3) , subclass_1(0x0000) , subclass_2(0x00000000) , subclass_3(0xFFFFFFFF) , subclass_4(0xFFFFFFFF) , subclass_5(0xFFFFFFFF) {} uint16_t rte_class; uint16_t subclass_1; uint32_t subclass_2; uint32_t subclass_3; uint32_t subclass_4; uint32_t subclass_5; std::string ident; }; /// common route structure application side /** This structure has to be used to exchange a track to QLandkarte. If an item is missing you can simply add it. This structure must never be copied assuming a certain alignment. Most values are the same like the ones used in the point data structures used by Garmin. */ struct Route_t { /// same as Garmin spec. std::string ident; /// route points std::vector route; }; /// common track point structure application side /** This structure has to be used to exchange a track point to QLandkarte. If an item is missing you can simply add it. This structure must never be copied assuming a certain alignment. Most values are the same like the ones used in the track point data structures used by Garmin. */ struct TrkPt_t { TrkPt_t() : lat(0.0) , lon(0.0) , time(0) , alt(1e25f) , dpth(1e25f) , distance(1e25f) , heart_rate(0xFF) , cadence(0xFF) , sensor(0xFF) { } /// the latitude as degrees double lat; /// the longitude as degrees double lon; /// the time in sec. as specified by Garmin uint32_t time; /// same as Garmin spec. float alt; /// same as Garmin spec. float dpth; float distance; uint8_t heart_rate; uint8_t cadence; uint8_t sensor; }; /// common track structure application side /** This structure has to be used to exchange a track to QLandkarte. If an item is missing you can simply add it. This structure must never be copied assuming a certain alignment. Most values are the same like the ones used in the point data structures used by Garmin. */ struct Track_t { Track_t() : dspl(true) , color(0xFF) { } /// same as Garmin spec. bool dspl; /// same as Garmin spec. uint8_t color; /// same as Garmin spec. std::string ident; /// trackpoints std::vector track; }; struct Map_t { std::string mapName; std::string tileName; }; struct Pvt_t { /// same as Garmin spec. float alt; /// same as Garmin spec. float epe; /// same as Garmin spec. float eph; /// same as Garmin spec. float epv; /// same as Garmin spec. uint16_t fix; /// same as Garmin spec. double tow; /// the latitude as degrees double lat; /// the longitude as degrees double lon; /// same as Garmin spec. float east; /// same as Garmin spec. float north; /// same as Garmin spec. float up; /// same as Garmin spec. float msl_hght; /// same as Garmin spec. int16_t leap_scnds; /// same as Garmin spec. uint32_t wn_days; }; struct Icon_t { Icon_t(){ memset(data,0,sizeof(data));} /// custom icon index (0..511) uint16_t idx; /// the bitmap's color table char clrtbl[0x400]; /// the bitmap's image data char data[0x100]; }; /// device property structure application side /** This structure is used to account for device properties such as the available memory and maximum number of maps. If a property is missing, it can be added. Both the item must be added and a still undefined bit in dev_property_list_t may have to be allocated to indicate that the property has indeed been set to a meaningful value. */ // boolean quantitities in the form of a bit field struct dev_property_list_t { uint32_t memory_limit: 1; uint32_t maps_limit: 1; uint32_t allow_duplicated_map_IDs: 1; uint32_t routes_limit: 1; uint32_t route_pts_limit: 1; uint32_t waypts_limit: 1; uint32_t tracks_limit: 1; uint32_t track_pts_limit: 1; uint32_t screen_size: 1; uint32_t pvt_requestable: 1; uint32_t custom_POI_limit: 1; uint32_t protocols_requestable: 1; uint32_t protocols_set: 1; uint32_t product_ID: 1; uint32_t product_string: 1; uint32_t read_trailing_packets: 1; uint32_t undefined: 15; uint32_t ext_dev_properties: 1; }; // make the bit field addressable as a single integer union device_properties_union_t { uint32_t all; dev_property_list_t item; }; // the device properties structure struct DevProperties_t { /// bit encoded list of properties that have been set by the driver device_properties_union_t set; /// maximum map upload (GMAPSUPP.IMG) size in bytes (0 for no upload) uint64_t memory_limit; /// maximum number of map tiles allowed for upload uint32_t maps_limit; /// maximum number of routes uint32_t routes_limit; /// maximum number of points in a route uint32_t route_pts_limit; /// maximum number of waypoints uint32_t waypts_limit; /// maximum number of tracks uint32_t tracks_limit; /// maximum number of track points uint32_t track_pts_limit; /// screen size uint32_t screenwidth, screenheight; /// screen pixel order uint32_t pixel_order; /// maximum number of POI uint32_t custom_POI_limit; /// official protocols uint32_t L_Link; uint32_t A_Cmd; uint32_t A_Wpt, D_Wpt[3]; uint32_t A_Prox_Wpt, D_Prox_Wpt[3]; uint32_t A_Rt, D_Rt[3]; uint32_t A_Trk, D_Trk[3]; uint32_t A_Pvt, D_Pvt[3]; /// inferred protocols uint32_t Q_Map_Limits; uint32_t Q_Map_Upload; uint32_t Q_Map_Info_Download; uint32_t Q_Screenshot; uint32_t Q_Custom_Icons; /// product_ID uint32_t product_ID; /// product_string const char * product_string; }; /// exception error code enum exce_e { errOpen ///< error during opening the link ,errSync ///< error during sync. up sequence ,errWrite ///< error during write access ,errRead ///< error during read access ,errNotImpl ///< error because of missing implementation ,errRuntime ///< error during operation ,errBlocked ///< error because access is blocked by another process }; /// exception type struct exce_t { exce_t(exce_e err, const std::string& msg) : err(err), msg(msg) {} exce_e err; std::string msg; }; /// interface class for device driver plugins /** This is the common interface to all devices. The application uses this definition to gain access to the plugin. Thus if you are an application programmer simply load the plugin, resolve and call the init function. The object you will get will be of type IDevice. There is no need to link against libgarmin.a. If you are a plugin programmer you will rather use IDeviceDefault, than IDevice. The inheritance chain will look like: IDevice -> IDefaultDevice -> CDevice Thus if you miss a public method you have to add it here as pure virtual and as a default implementation to IDeviceDefault. NOTE: If you change this interface you _must_ increment the version number defined by INTERFACE_VERSION. This is important to prevent crashes due to different interface definitions. Most likely your device driver will implement the protected methods with leading '_' of IDeviceDefault. */ class IDevice { public: IDevice() : _callback_(0), _self_(0){}; virtual ~IDevice(){}; /// setup gui callback for user interaction /** If you use the driver from a GUI you might want to react on some events or show the progress of the current operation. The registered callback will be for progress status as well as for user interaction depending on the parameters. The callback will require a progress dialog if the parameter "progress" is set to anthing else than -1. Developers using this callback to show a progress status should make sure: * The first call must have a progress of 0 and a title is set. * Subsequent calls have a progress from 0..100. The msg parameter can be set. * The last call must have a progress of 100. If you supply a pointer to a cancel variable from the first call on, you can cancel the operation if the value of the variable changes from 0 to 1. Developers implementing the callback function must make sure: * A progress of 0 will setup the progress dialog. Any subsequent progress of 0 is handled like any other progress. The dialog's title is set. If there is a pointer to a cancel variable the dialog should provide a way to cancel the operation. The dialog must make sure ther pointer is valid for subsequent calls. The operation is canceled if "*cancel = 1;" * Any subsequent call can have a message parameter, but it mustn't have one. * A progress of 100 should remove the progress dialog. There can be subsequent calls with a progress of 100. A progress of -1 will create a blocking message box. Depending on the pointers ok and cancel the dialog should show ok and cancel button. The integer variables will be set to true or false according to the button pressed. The supplied void pointer will be passed to every callback call and is free to be used by the GUI for what ever purpose it needs. */ void setGuiCallback(void (*func)(int /*progress*/, int * /*ok*/, int * /*cancel*/, const char * /*title*/, const char * /*msg*/, void * /*self*/), void * p) { _self_ = p; _callback_ = func; } /// upload a single map file to device /** This will handle just a single file. Map tiles must be concatenated into one big file (gmapsupp.img). If the file containes tiles with locked data an array of 25 ASCII digits has to be passed as key. @param mapdata pointer to the gmapsupp.img data array @param size the size of the gmapsupp.img data array @param key pointer to 25 digit key or 0 for no key */ virtual void uploadMap(const uint8_t * mapdata, uint32_t size, const char * key) = 0; /// alternative map uppload API /** This will handle just a single file. Map tiles must be concatenated into one big file (gmapsupp.img). If the file containes tiles with locked data an array of 25 ASCII digits has to be passed as key. @param mapdata pointer to the gmapsupp.img data array @param size the size of the gmapsupp.img data array @param key pointer to 25 digit key or 0 for no key */ virtual void uploadMap(const char * filename, uint32_t size, const char * key) = 0; /// query loaded map list /** This is not a real download of maps as just the information about the loaded maps is transfered. */ virtual void queryMap(std::list& maps) = 0; /// download waypoints from device /** @param waypoints list object to receive waypoints */ virtual void downloadWaypoints(std::list& waypoints) = 0; /// upload waypoints to device /** @param waypoints list of waypoints to send */ virtual void uploadWaypoints(std::list& waypoints) = 0; /// download track from device /** @param tracks list object to receive tracks */ virtual void downloadTracks(std::list& tracks) = 0; /// upload track to device /** @param tracks list of tracks to send */ virtual void uploadTracks(std::list& tracks) = 0; /// download routes from device /** @param routes list of routes */ virtual void downloadRoutes(std::list& routes) = 0; /// upload route to device /** @param routes list of routes */ virtual void uploadRoutes(std::list& routes) = 0; /// upload custom icons to device /** @param routes list of icons */ virtual void uploadCustomIcons(std::list& icons) = 0; /// download a screenshot from the device /** @param clrtbl a pointer reference to be set to the downloaded color table of size 0x100 @param data a pointer reference to be set to the downloaded image data array of size width x height @param width a integer reference to store the image width at @param height a integer reference to store the image height at */ virtual void screenshot(char *& clrtbl, char *& data, int& width, int& height) = 0; /// switch device into realtime position mode virtual void setRealTimeMode(bool on) = 0; /// request real time position virtual void getRealTimePos(Garmin::Pvt_t& pvt) = 0; /// get the device's properties. virtual void getDevProperties(Garmin::DevProperties_t& properties) = 0; /// get the copyright notice of this driver virtual const std::string& getCopyright() = 0; /// get reason string for last exception virtual const std::string& getLastError() = 0; /// set port string used for communication /** This should be called prior to an operation. As an operation will create a new ILink object, a changed port setting will apply imediately. If the ILink object does not need any port settings this value is ignored. */ virtual void setPort(const char * port) = 0; protected: /// see setGuiCallback() void (*_callback_)(int /*progress*/, int * /*ok*/, int * /*cancel*/, const char * /*title*/, const char * /*msg*/, void * /*self*/); /// see setGuiCallback() void * _self_; }; } #endif //IDEVICE_H qlandkartegt-1.7.5/include/libexif/exif-loader.h000644 001750 000144 00000005345 12225261330 022616 0ustar00oeichlerusers000000 000000 /*! \file exif-loader.h * \brief Defines the ExifLoader type */ /* * Copyright (c) 2003 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_LOADER_H__ #define __EXIF_LOADER_H__ #include #include #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef struct _ExifLoader ExifLoader; /*! Allocate a new ExifLoader * \returns the allocated ExifLoader */ ExifLoader *exif_loader_new (void); /*! Allocate a new ExifLoader using an ExifMem * \param[in] mem the ExifMem * \returns the allocated ExifLoader */ ExifLoader *exif_loader_new_mem (ExifMem *mem); /*! Increase the refcount of the ExifLoader * \param[in] loader the ExifLoader to increase the refcount of. */ void exif_loader_ref (ExifLoader *loader); /*! Decrease the refcount of the ExifLoader * \param[in] loader the ExifLoader to decrease the refcount of. * If the refcount reaches 0, the ExifLoader is freeed. */ void exif_loader_unref (ExifLoader *loader); /*! Write a file to the ExifLoader * \param[in] loader the loader * \param[in] fname the path to the file to read */ void exif_loader_write_file (ExifLoader *loader, const char *fname); /*! Write a buffer to the ExifLoader * \param[in] loader the loader to write too * \param[in] buf the buffer to read from * \param[in] sz the size of the buffer * \returns 1 while EXIF data is read (or while there is still hope that there will be EXIF data later on), 0 otherwise. */ unsigned char exif_loader_write (ExifLoader *loader, unsigned char *buf, unsigned int sz); /*! Reset the ExifLoader * \param[in] loader the loader */ void exif_loader_reset (ExifLoader *loader); /*! Get an ExifData out of an ExifLoader * \param[in] loader the loader * \returns and allocated ExifData */ ExifData *exif_loader_get_data (ExifLoader *loader); void exif_loader_log (ExifLoader *, ExifLog *); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_LOADER_H__ */ qlandkartegt-1.7.5/include/libexif/exif-log.h000644 001750 000144 00000005054 12225261330 022126 0ustar00oeichlerusers000000 000000 /*! \file exif-log.h * \brief log message infrastructure * * Copyright (c) 2004 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_LOG_H__ #define __EXIF_LOG_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #include typedef struct _ExifLog ExifLog; ExifLog *exif_log_new (void); ExifLog *exif_log_new_mem (ExifMem *); void exif_log_ref (ExifLog *log); void exif_log_unref (ExifLog *log); void exif_log_free (ExifLog *log); typedef enum { EXIF_LOG_CODE_NONE, EXIF_LOG_CODE_DEBUG, EXIF_LOG_CODE_NO_MEMORY, EXIF_LOG_CODE_CORRUPT_DATA } ExifLogCode; const char *exif_log_code_get_title (ExifLogCode); /* Title for dialog */ const char *exif_log_code_get_message (ExifLogCode); /* Message for dialog */ /** Log callback function prototype. */ typedef void (* ExifLogFunc) (ExifLog *log, ExifLogCode, const char *domain, const char *format, va_list args, void *data); /** Register log callback function. */ void exif_log_set_func (ExifLog *log, ExifLogFunc func, void *data); #ifndef NO_VERBOSE_TAG_STRINGS void exif_log (ExifLog *log, ExifLogCode, const char *domain, const char *format, ...) #ifdef __GNUC__ __attribute__((__format__(printf,4,5))) #endif ; #else #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define exif_log(...) do { } while (0) #elif defined(__GNUC__) #define exif_log(x...) do { } while (0) #else #define exif_log (void) #endif #endif void exif_logv (ExifLog *log, ExifLogCode, const char *domain, const char *format, va_list args); /* For your convenience */ #define EXIF_LOG_NO_MEMORY(l,d,s) exif_log ((l), EXIF_LOG_CODE_NO_MEMORY, (d), "Could not allocate %lu byte(s).", (unsigned long)(s)) #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_LOG_H__ */ qlandkartegt-1.7.5/include/libexif/exif-utils.h000644 001750 000144 00000006354 12225261330 022511 0ustar00oeichlerusers000000 000000 /* exif-utils.h * * Copyright (c) 2001 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_UTILS_H__ #define __EXIF_UTILS_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #include #include /* If these definitions don't work for you, please let us fix the * macro generating _stdint.h */ typedef unsigned char ExifByte; /* 1 byte */ typedef signed char ExifSByte; /* 1 byte */ typedef char * ExifAscii; typedef uint16_t ExifShort; /* 2 bytes */ typedef int16_t ExifSShort; /* 2 bytes */ typedef uint32_t ExifLong; /* 4 bytes */ /** EXIF Unsigned Rational */ typedef struct {ExifLong numerator; ExifLong denominator;} ExifRational; typedef char ExifUndefined; /* 1 byte */ typedef int32_t ExifSLong; /* 4 bytes */ /** EXIF Signed Rational. */ typedef struct {ExifSLong numerator; ExifSLong denominator;} ExifSRational; ExifShort exif_get_short (const unsigned char *b, ExifByteOrder order); ExifSShort exif_get_sshort (const unsigned char *b, ExifByteOrder order); ExifLong exif_get_long (const unsigned char *b, ExifByteOrder order); ExifSLong exif_get_slong (const unsigned char *b, ExifByteOrder order); ExifRational exif_get_rational (const unsigned char *b, ExifByteOrder order); ExifSRational exif_get_srational (const unsigned char *b, ExifByteOrder order); void exif_set_short (unsigned char *b, ExifByteOrder order, ExifShort value); void exif_set_sshort (unsigned char *b, ExifByteOrder order, ExifSShort value); void exif_set_long (unsigned char *b, ExifByteOrder order, ExifLong value); void exif_set_slong (unsigned char *b, ExifByteOrder order, ExifSLong value); void exif_set_rational (unsigned char *b, ExifByteOrder order, ExifRational value); void exif_set_srational (unsigned char *b, ExifByteOrder order, ExifSRational value); void exif_convert_utf16_to_utf8 (char *out, const unsigned short *in, int maxlen); /* Please do not use this function outside of the library. */ void exif_array_set_byte_order (ExifFormat, unsigned char *, unsigned int, ExifByteOrder o_orig, ExifByteOrder o_new); #undef MIN #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #undef MAX #define MAX(a, b) (((a) > (b)) ? (a) : (b)) /* For compatibility with older versions */ #define EXIF_TAG_SUBSEC_TIME EXIF_TAG_SUB_SEC_TIME #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_UTILS_H__ */ qlandkartegt-1.7.5/include/libexif/exif-data-type.h000644 001750 000144 00000002305 12225261330 023231 0ustar00oeichlerusers000000 000000 /* exif-data-tag.h * * Copyright (c) 2005 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_DATA_TYPE_H__ #define __EXIF_DATA_TYPE_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef enum { EXIF_DATA_TYPE_UNCOMPRESSED_CHUNKY = 0, EXIF_DATA_TYPE_UNCOMPRESSED_PLANAR, EXIF_DATA_TYPE_UNCOMPRESSED_YCC, EXIF_DATA_TYPE_COMPRESSED, EXIF_DATA_TYPE_COUNT } ExifDataType; #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_TAG_H__ */ qlandkartegt-1.7.5/include/libexif/exif-format.h000644 001750 000144 00000003054 12225261330 022633 0ustar00oeichlerusers000000 000000 /* exif-format.h * * Copyright (c) 2001 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_FORMAT_H__ #define __EXIF_FORMAT_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef enum { EXIF_FORMAT_BYTE = 1, EXIF_FORMAT_ASCII = 2, EXIF_FORMAT_SHORT = 3, EXIF_FORMAT_LONG = 4, EXIF_FORMAT_RATIONAL = 5, EXIF_FORMAT_SBYTE = 6, EXIF_FORMAT_UNDEFINED = 7, EXIF_FORMAT_SSHORT = 8, EXIF_FORMAT_SLONG = 9, EXIF_FORMAT_SRATIONAL = 10, EXIF_FORMAT_FLOAT = 11, EXIF_FORMAT_DOUBLE = 12 } ExifFormat; const char *exif_format_get_name (ExifFormat format); unsigned char exif_format_get_size (ExifFormat format); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_FORMAT_H__ */ qlandkartegt-1.7.5/include/libexif/exif-tag.h000644 001750 000144 00000017421 12225261330 022121 0ustar00oeichlerusers000000 000000 /* exif-tag.h * * Copyright (c) 2001 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_TAG_H__ #define __EXIF_TAG_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #include typedef enum { EXIF_TAG_INTEROPERABILITY_INDEX = 0x0001, EXIF_TAG_INTEROPERABILITY_VERSION = 0x0002, EXIF_TAG_NEW_SUBFILE_TYPE = 0x00fe, EXIF_TAG_IMAGE_WIDTH = 0x0100, EXIF_TAG_IMAGE_LENGTH = 0x0101, EXIF_TAG_BITS_PER_SAMPLE = 0x0102, EXIF_TAG_COMPRESSION = 0x0103, EXIF_TAG_PHOTOMETRIC_INTERPRETATION = 0x0106, EXIF_TAG_FILL_ORDER = 0x010a, EXIF_TAG_DOCUMENT_NAME = 0x010d, EXIF_TAG_IMAGE_DESCRIPTION = 0x010e, EXIF_TAG_MAKE = 0x010f, EXIF_TAG_MODEL = 0x0110, EXIF_TAG_STRIP_OFFSETS = 0x0111, EXIF_TAG_ORIENTATION = 0x0112, EXIF_TAG_SAMPLES_PER_PIXEL = 0x0115, EXIF_TAG_ROWS_PER_STRIP = 0x0116, EXIF_TAG_STRIP_BYTE_COUNTS = 0x0117, EXIF_TAG_X_RESOLUTION = 0x011a, EXIF_TAG_Y_RESOLUTION = 0x011b, EXIF_TAG_PLANAR_CONFIGURATION = 0x011c, EXIF_TAG_RESOLUTION_UNIT = 0x0128, EXIF_TAG_TRANSFER_FUNCTION = 0x012d, EXIF_TAG_SOFTWARE = 0x0131, EXIF_TAG_DATE_TIME = 0x0132, EXIF_TAG_ARTIST = 0x013b, EXIF_TAG_WHITE_POINT = 0x013e, EXIF_TAG_PRIMARY_CHROMATICITIES = 0x013f, EXIF_TAG_TRANSFER_RANGE = 0x0156, EXIF_TAG_SUB_IFDS = 0x014a, EXIF_TAG_JPEG_PROC = 0x0200, EXIF_TAG_JPEG_INTERCHANGE_FORMAT = 0x0201, EXIF_TAG_JPEG_INTERCHANGE_FORMAT_LENGTH = 0x0202, EXIF_TAG_YCBCR_COEFFICIENTS = 0x0211, EXIF_TAG_YCBCR_SUB_SAMPLING = 0x0212, EXIF_TAG_YCBCR_POSITIONING = 0x0213, EXIF_TAG_REFERENCE_BLACK_WHITE = 0x0214, EXIF_TAG_XML_PACKET = 0x02bc, EXIF_TAG_RELATED_IMAGE_FILE_FORMAT = 0x1000, EXIF_TAG_RELATED_IMAGE_WIDTH = 0x1001, EXIF_TAG_RELATED_IMAGE_LENGTH = 0x1002, EXIF_TAG_CFA_REPEAT_PATTERN_DIM = 0x828d, EXIF_TAG_CFA_PATTERN = 0x828e, EXIF_TAG_BATTERY_LEVEL = 0x828f, EXIF_TAG_COPYRIGHT = 0x8298, EXIF_TAG_EXPOSURE_TIME = 0x829a, EXIF_TAG_FNUMBER = 0x829d, EXIF_TAG_IPTC_NAA = 0x83bb, EXIF_TAG_IMAGE_RESOURCES = 0x8649, EXIF_TAG_EXIF_IFD_POINTER = 0x8769, EXIF_TAG_INTER_COLOR_PROFILE = 0x8773, EXIF_TAG_EXPOSURE_PROGRAM = 0x8822, EXIF_TAG_SPECTRAL_SENSITIVITY = 0x8824, EXIF_TAG_GPS_INFO_IFD_POINTER = 0x8825, EXIF_TAG_ISO_SPEED_RATINGS = 0x8827, EXIF_TAG_OECF = 0x8828, EXIF_TAG_EXIF_VERSION = 0x9000, EXIF_TAG_DATE_TIME_ORIGINAL = 0x9003, EXIF_TAG_DATE_TIME_DIGITIZED = 0x9004, EXIF_TAG_COMPONENTS_CONFIGURATION = 0x9101, EXIF_TAG_COMPRESSED_BITS_PER_PIXEL = 0x9102, EXIF_TAG_SHUTTER_SPEED_VALUE = 0x9201, EXIF_TAG_APERTURE_VALUE = 0x9202, EXIF_TAG_BRIGHTNESS_VALUE = 0x9203, EXIF_TAG_EXPOSURE_BIAS_VALUE = 0x9204, EXIF_TAG_MAX_APERTURE_VALUE = 0x9205, EXIF_TAG_SUBJECT_DISTANCE = 0x9206, EXIF_TAG_METERING_MODE = 0x9207, EXIF_TAG_LIGHT_SOURCE = 0x9208, EXIF_TAG_FLASH = 0x9209, EXIF_TAG_FOCAL_LENGTH = 0x920a, EXIF_TAG_SUBJECT_AREA = 0x9214, EXIF_TAG_TIFF_EP_STANDARD_ID = 0x9216, EXIF_TAG_MAKER_NOTE = 0x927c, EXIF_TAG_USER_COMMENT = 0x9286, EXIF_TAG_SUB_SEC_TIME = 0x9290, EXIF_TAG_SUB_SEC_TIME_ORIGINAL = 0x9291, EXIF_TAG_SUB_SEC_TIME_DIGITIZED = 0x9292, EXIF_TAG_XP_TITLE = 0x9c9b, EXIF_TAG_XP_COMMENT = 0x9c9c, EXIF_TAG_XP_AUTHOR = 0x9c9d, EXIF_TAG_XP_KEYWORDS = 0x9c9e, EXIF_TAG_XP_SUBJECT = 0x9c9f, EXIF_TAG_FLASH_PIX_VERSION = 0xa000, EXIF_TAG_COLOR_SPACE = 0xa001, EXIF_TAG_PIXEL_X_DIMENSION = 0xa002, EXIF_TAG_PIXEL_Y_DIMENSION = 0xa003, EXIF_TAG_RELATED_SOUND_FILE = 0xa004, EXIF_TAG_INTEROPERABILITY_IFD_POINTER = 0xa005, EXIF_TAG_FLASH_ENERGY = 0xa20b, EXIF_TAG_SPATIAL_FREQUENCY_RESPONSE = 0xa20c, EXIF_TAG_FOCAL_PLANE_X_RESOLUTION = 0xa20e, EXIF_TAG_FOCAL_PLANE_Y_RESOLUTION = 0xa20f, EXIF_TAG_FOCAL_PLANE_RESOLUTION_UNIT = 0xa210, EXIF_TAG_SUBJECT_LOCATION = 0xa214, EXIF_TAG_EXPOSURE_INDEX = 0xa215, EXIF_TAG_SENSING_METHOD = 0xa217, EXIF_TAG_FILE_SOURCE = 0xa300, EXIF_TAG_SCENE_TYPE = 0xa301, EXIF_TAG_NEW_CFA_PATTERN = 0xa302, EXIF_TAG_CUSTOM_RENDERED = 0xa401, EXIF_TAG_EXPOSURE_MODE = 0xa402, EXIF_TAG_WHITE_BALANCE = 0xa403, EXIF_TAG_DIGITAL_ZOOM_RATIO = 0xa404, EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM = 0xa405, EXIF_TAG_SCENE_CAPTURE_TYPE = 0xa406, EXIF_TAG_GAIN_CONTROL = 0xa407, EXIF_TAG_CONTRAST = 0xa408, EXIF_TAG_SATURATION = 0xa409, EXIF_TAG_SHARPNESS = 0xa40a, EXIF_TAG_DEVICE_SETTING_DESCRIPTION = 0xa40b, EXIF_TAG_SUBJECT_DISTANCE_RANGE = 0xa40c, EXIF_TAG_IMAGE_UNIQUE_ID = 0xa420, EXIF_TAG_GAMMA = 0xa500, EXIF_TAG_PRINT_IMAGE_MATCHING = 0xc4a5 } ExifTag; /* GPS tags overlap with above ones. */ #define EXIF_TAG_GPS_VERSION_ID 0x0000 #define EXIF_TAG_GPS_LATITUDE_REF 0x0001 /* INTEROPERABILITY_INDEX */ #define EXIF_TAG_GPS_LATITUDE 0x0002 /* INTEROPERABILITY_VERSION */ #define EXIF_TAG_GPS_LONGITUDE_REF 0x0003 #define EXIF_TAG_GPS_LONGITUDE 0x0004 #define EXIF_TAG_GPS_ALTITUDE_REF 0x0005 #define EXIF_TAG_GPS_ALTITUDE 0x0006 #define EXIF_TAG_GPS_TIME_STAMP 0x0007 #define EXIF_TAG_GPS_SATELLITES 0x0008 #define EXIF_TAG_GPS_STATUS 0x0009 #define EXIF_TAG_GPS_MEASURE_MODE 0x000a #define EXIF_TAG_GPS_DOP 0x000b #define EXIF_TAG_GPS_SPEED_REF 0x000c #define EXIF_TAG_GPS_SPEED 0x000d #define EXIF_TAG_GPS_TRACK_REF 0x000e #define EXIF_TAG_GPS_TRACK 0x000f #define EXIF_TAG_GPS_IMG_DIRECTION_REF 0x0010 #define EXIF_TAG_GPS_IMG_DIRECTION 0x0011 #define EXIF_TAG_GPS_MAP_DATUM 0x0012 #define EXIF_TAG_GPS_DEST_LATITUDE_REF 0x0013 #define EXIF_TAG_GPS_DEST_LATITUDE 0x0014 #define EXIF_TAG_GPS_DEST_LONGITUDE_REF 0x0015 #define EXIF_TAG_GPS_DEST_LONGITUDE 0x0016 #define EXIF_TAG_GPS_DEST_BEARING_REF 0x0017 #define EXIF_TAG_GPS_DEST_BEARING 0x0018 #define EXIF_TAG_GPS_DEST_DISTANCE_REF 0x0019 #define EXIF_TAG_GPS_DEST_DISTANCE 0x001a #define EXIF_TAG_GPS_PROCESSING_METHOD 0x001b #define EXIF_TAG_GPS_AREA_INFORMATION 0x001c #define EXIF_TAG_GPS_DATE_STAMP 0x001d #define EXIF_TAG_GPS_DIFFERENTIAL 0x001e typedef enum { EXIF_SUPPORT_LEVEL_UNKNOWN = 0, EXIF_SUPPORT_LEVEL_NOT_RECORDED, EXIF_SUPPORT_LEVEL_MANDATORY, EXIF_SUPPORT_LEVEL_OPTIONAL } ExifSupportLevel; ExifTag exif_tag_from_name (const char *); const char *exif_tag_get_name_in_ifd (ExifTag, ExifIfd); const char *exif_tag_get_title_in_ifd (ExifTag, ExifIfd); const char *exif_tag_get_description_in_ifd (ExifTag, ExifIfd); ExifSupportLevel exif_tag_get_support_level_in_ifd (ExifTag, ExifIfd, ExifDataType); /* Don't use these functions. They are here for compatibility only. */ const char *exif_tag_get_name (ExifTag tag); const char *exif_tag_get_title (ExifTag tag); const char *exif_tag_get_description (ExifTag tag); /* Don't use these definitions. They are here for compatibility only. */ #define EXIF_TAG_UNKNOWN_C4A5 EXIF_TAG_PRINT_IMAGE_MATCHING #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_TAG_H__ */ qlandkartegt-1.7.5/include/libexif/exif-data.h000644 001750 000144 00000007654 12225261330 022266 0ustar00oeichlerusers000000 000000 /*! \file exif-data.h * \brief Defines the ExifData type and the associated functions. * * \author Lutz Mueller * \date 2001-2005 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_DATA_H__ #define __EXIF_DATA_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include #include #include #include #include typedef struct _ExifData ExifData; typedef struct _ExifDataPrivate ExifDataPrivate; #include #include #include struct _ExifData { ExifContent *ifd[EXIF_IFD_COUNT]; unsigned char *data; unsigned int size; ExifDataPrivate *priv; }; ExifData *exif_data_new (void); ExifData *exif_data_new_mem (ExifMem *); /*! \brief load exif data from file * \param[in] path filename including path */ ExifData *exif_data_new_from_file (const char *path); ExifData *exif_data_new_from_data (const unsigned char *data, unsigned int size); void exif_data_load_data (ExifData *data, const unsigned char *d, unsigned int size); void exif_data_save_data (ExifData *data, unsigned char **d, unsigned int *size); void exif_data_ref (ExifData *data); void exif_data_unref (ExifData *data); void exif_data_free (ExifData *data); ExifByteOrder exif_data_get_byte_order (ExifData *data); void exif_data_set_byte_order (ExifData *data, ExifByteOrder order); ExifMnoteData *exif_data_get_mnote_data (ExifData *); void exif_data_fix (ExifData *); typedef void (* ExifDataForeachContentFunc) (ExifContent *, void *user_data); void exif_data_foreach_content (ExifData *data, ExifDataForeachContentFunc func, void *user_data); typedef enum { EXIF_DATA_OPTION_IGNORE_UNKNOWN_TAGS = 1 << 0, EXIF_DATA_OPTION_FOLLOW_SPECIFICATION = 1 << 1, EXIF_DATA_OPTION_DONT_CHANGE_MAKER_NOTE = 1 << 2 } ExifDataOption; const char *exif_data_option_get_name (ExifDataOption); const char *exif_data_option_get_description (ExifDataOption); void exif_data_set_option (ExifData *, ExifDataOption); void exif_data_unset_option (ExifData *, ExifDataOption); void exif_data_set_data_type (ExifData *, ExifDataType); ExifDataType exif_data_get_data_type (ExifData *); /* For debugging purposes and error reporting */ void exif_data_dump (ExifData *data); void exif_data_log (ExifData *data, ExifLog *log); /** convenience macro. */ #define exif_data_get_entry(d,t) \ (exif_content_get_entry(d->ifd[EXIF_IFD_0],t) ? \ exif_content_get_entry(d->ifd[EXIF_IFD_0],t) : \ exif_content_get_entry(d->ifd[EXIF_IFD_1],t) ? \ exif_content_get_entry(d->ifd[EXIF_IFD_1],t) : \ exif_content_get_entry(d->ifd[EXIF_IFD_EXIF],t) ? \ exif_content_get_entry(d->ifd[EXIF_IFD_EXIF],t) : \ exif_content_get_entry(d->ifd[EXIF_IFD_GPS],t) ? \ exif_content_get_entry(d->ifd[EXIF_IFD_GPS],t) : \ exif_content_get_entry(d->ifd[EXIF_IFD_INTEROPERABILITY],t) ? \ exif_content_get_entry(d->ifd[EXIF_IFD_INTEROPERABILITY],t) : NULL) #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_DATA_H__ */ qlandkartegt-1.7.5/include/libexif/_stdint.h000644 001750 000144 00000000455 12225261330 022060 0ustar00oeichlerusers000000 000000 /* This file is generated automatically by configure */ #ifdef WIN32 typedef __int8 int8_t; /* 1 byte */ typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; #else #include #endif qlandkartegt-1.7.5/include/libexif/exif-mem.h000644 001750 000144 00000004762 12225261330 022130 0ustar00oeichlerusers000000 000000 /*! \file exif-mem.h * \brief Define the ExifMem data type and the associated functions. * ExifMem defines the memory management functions used by the ExifLoader. */ /* exif-mem.h * * Copyright (c) 2003 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_MEM_H__ #define __EXIF_MEM_H__ #include #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /*! Should work like calloc() * \param[in] s the size of the block to allocate. * \returns the allocated memory and initialized. */ typedef void * (* ExifMemAllocFunc) (ExifLong s); /*! Should work like realloc() * \param[in] p the pointer to reallocate * \param[in] s the size of the reallocated block * \returns allocated memory */ typedef void * (* ExifMemReallocFunc) (void *p, ExifLong s); /*! Free method for ExifMem * \param[in] p the pointer to free * \returns the freed pointer */ typedef void (* ExifMemFreeFunc) (void *p); /*! ExifMem define a memory allocator */ typedef struct _ExifMem ExifMem; /*! Create a new ExifMem * \param[in] a the allocator function * \param[in] r the reallocator function * \param[in] f the free function */ ExifMem *exif_mem_new (ExifMemAllocFunc a, ExifMemReallocFunc r, ExifMemFreeFunc f); /*! Refcount an ExifMem */ void exif_mem_ref (ExifMem *); /*! Unrefcount an ExifMem * If the refcount reaches 0, the ExifMem is freed */ void exif_mem_unref (ExifMem *); void *exif_mem_alloc (ExifMem *m, ExifLong s); void *exif_mem_realloc (ExifMem *m, void *p, ExifLong s); void exif_mem_free (ExifMem *m, void *p); /*! The default ExifMem for your convenience * \returns return the default ExifMem */ ExifMem *exif_mem_new_default (void); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_MEM_H__ */ qlandkartegt-1.7.5/include/libexif/exif-byte-order.h000644 001750 000144 00000002236 12225261330 023420 0ustar00oeichlerusers000000 000000 /* exif-byte-order.h * * Copyright (c) 2002 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_BYTE_ORDER_H__ #define __EXIF_BYTE_ORDER_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef enum { EXIF_BYTE_ORDER_MOTOROLA, EXIF_BYTE_ORDER_INTEL } ExifByteOrder; const char *exif_byte_order_get_name (ExifByteOrder order); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_BYTE_ORDER_H__ */ qlandkartegt-1.7.5/include/libexif/exif-mnote-data.h000644 001750 000144 00000003616 12225261330 023400 0ustar00oeichlerusers000000 000000 /* exif-mnote-data.h * * Copyright (c) 2003 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_MNOTE_DATA_H__ #define __EXIF_MNOTE_DATA_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ #include typedef struct _ExifMnoteData ExifMnoteData; void exif_mnote_data_ref (ExifMnoteData *); void exif_mnote_data_unref (ExifMnoteData *); void exif_mnote_data_load (ExifMnoteData *, const unsigned char *, unsigned int); void exif_mnote_data_save (ExifMnoteData *, unsigned char **, unsigned int *); unsigned int exif_mnote_data_count (ExifMnoteData *); unsigned int exif_mnote_data_get_id (ExifMnoteData *, unsigned int); const char *exif_mnote_data_get_name (ExifMnoteData *, unsigned int); const char *exif_mnote_data_get_title (ExifMnoteData *, unsigned int); const char *exif_mnote_data_get_description (ExifMnoteData *, unsigned int); /* Returns NULL or val */ char *exif_mnote_data_get_value (ExifMnoteData *, unsigned int, char *val, unsigned int maxlen); void exif_mnote_data_log (ExifMnoteData *, ExifLog *); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_MNOTE_DATA_H__ */ qlandkartegt-1.7.5/include/libexif/exif-ifd.h000644 001750 000144 00000002354 12225261330 022107 0ustar00oeichlerusers000000 000000 /* exif-ifd.h * * Copyright (c) 2002 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_IFD_H__ #define __EXIF_IFD_H__ typedef enum { EXIF_IFD_0 = 0, /*!< */ EXIF_IFD_1, /*!< */ EXIF_IFD_EXIF, /*!< */ EXIF_IFD_GPS, /*!< */ EXIF_IFD_INTEROPERABILITY, /*!< */ EXIF_IFD_COUNT /*!< Not a real value, just (max_value + 1). */ } ExifIfd; const char *exif_ifd_get_name (ExifIfd ifd); #endif /* __EXIF_IFD_H__ */ qlandkartegt-1.7.5/include/libexif/exif-content.h000644 001750 000144 00000004771 12225261330 023024 0ustar00oeichlerusers000000 000000 /* exif-content.h * * Copyright (c) 2001 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_CONTENT_H__ #define __EXIF_CONTENT_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef struct _ExifContent ExifContent; typedef struct _ExifContentPrivate ExifContentPrivate; #include #include #include #include #include struct _ExifContent { ExifEntry **entries; unsigned int count; /* Data containing this content */ ExifData *parent; ExifContentPrivate *priv; }; /* Lifecycle */ ExifContent *exif_content_new (void); ExifContent *exif_content_new_mem (ExifMem *); void exif_content_ref (ExifContent *content); void exif_content_unref (ExifContent *content); void exif_content_free (ExifContent *content); void exif_content_add_entry (ExifContent *, ExifEntry *); void exif_content_remove_entry (ExifContent *, ExifEntry *); ExifEntry *exif_content_get_entry (ExifContent *, ExifTag); void exif_content_fix (ExifContent *); typedef void (* ExifContentForeachEntryFunc) (ExifEntry *, void *user_data); void exif_content_foreach_entry (ExifContent *content, ExifContentForeachEntryFunc func, void *user_data); /* For your convenience */ ExifIfd exif_content_get_ifd (ExifContent *); #define exif_content_get_value(c,t,v,m) \ (exif_content_get_entry (c,t) ? \ exif_entry_get_value (exif_content_get_entry (c,t),v,m) : NULL) void exif_content_dump (ExifContent *content, unsigned int indent); void exif_content_log (ExifContent *content, ExifLog *log); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_CONTENT_H__ */ qlandkartegt-1.7.5/include/libexif/exif-entry.h000644 001750 000144 00000005326 12225261330 022510 0ustar00oeichlerusers000000 000000 /*! \file exif-entry.h * \brief Handling EXIF entries * * Copyright (c) 2001 Lutz Mueller * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ #ifndef __EXIF_ENTRY_H__ #define __EXIF_ENTRY_H__ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ typedef struct _ExifEntry ExifEntry; typedef struct _ExifEntryPrivate ExifEntryPrivate; #include #include #include /*! */ struct _ExifEntry { ExifTag tag; ExifFormat format; unsigned long components; unsigned char *data; unsigned int size; /* Content containing this entry */ ExifContent *parent; ExifEntryPrivate *priv; }; /* Lifecycle */ /*! Reserve memory for and initialize new #ExifEntry* */ ExifEntry *exif_entry_new (void); ExifEntry *exif_entry_new_mem (ExifMem *); /*! Increase reference counter for #ExifEntry* */ void exif_entry_ref (ExifEntry *entry); /*! Decrease reference counter for #ExifEntry* */ void exif_entry_unref (ExifEntry *entry); /*! Actually free the #ExifEntry* * * \deprecated Should not be called directly. Use exif_entry_ref() and * exif_entry_unref() instead. */ void exif_entry_free (ExifEntry *entry); void exif_entry_initialize (ExifEntry *entry, ExifTag tag); void exif_entry_fix (ExifEntry *entry); /* For your convenience */ /*! Return the value of the EXIF entry * * CAUTION: The character set of the returned string is not defined. * It may be UTF-8, latin1, the native encoding of the * computer, or the native encoding of the camera. */ const char *exif_entry_get_value (ExifEntry *entry, char *val, unsigned int maxlen); /*! Dump text representation of #ExifEntry to stdout */ void exif_entry_dump (ExifEntry *entry, unsigned int indent); #define exif_entry_get_ifd(e) ((e)?exif_content_get_ifd((e)->parent):EXIF_IFD_COUNT) #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* __EXIF_ENTRY_H__ */ qlandkartegt-1.7.5/licensecheck.pl000755 001750 000144 00000051025 12225261330 020155 0ustar00oeichlerusers000000 000000 #!/usr/bin/perl # This script was originally based on the script of the same name from # the KDE SDK (by dfaure@kde.org) # # This version is # Copyright (C) 2007, 2008 Adam D. Barratt # Copyright (C) 2012 Francesco Poli # # 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, see . =head1 NAME licensecheck - simple license checker for source files =head1 SYNOPSIS B B<--help>|B<--version> B [B<--no-conf>] [B<--verbose>] [B<--copyright>] [B<-l>|B<--lines=>I] [B<-i>|B<--ignore=>I] [B<-c>|B<--check=>I] [B<-m>|B<--machine>] [B<-r>|B<--recursive>] I =head1 DESCRIPTION B attempts to determine the license that applies to each file passed to it, by searching the start of the file for text belonging to various licenses. If any of the arguments passed are directories, B will add the files contained within to the list of files to process. =head1 OPTIONS =over 4 =item B<--verbose>, B<--no-verbose> Specify whether to output the text being processed from each file before the corresponding license information. Default is to be quiet. =item B<-l=>I, B<--lines=>I Specify the number of lines of each file's header which should be parsed for license information. (Default is 60). =item B<-i=>I, B<--ignore=>I When processing the list of files and directories, the regular expression specified by this option will be used to indicate those which should not be considered (e.g. backup files, VCS metadata). =item B<-r>, B<--recursive> Specify that the contents of directories should be added recursively. =item B<-c=>I, B<--check=>I Specify a pattern against which filenames will be matched in order to decide which files to check the license of. The default includes common source files. =item B<--copyright> Also display copyright text found within the file =item B<-m>, B<--machine> Display the information in a machine readable way, i.e. in the form [] so that it can be easily sorted and/or filtered, e.g. with the B and B commands. Note that using the B<--verbose> option will kill the readability. =item B<--no-conf>, B<--noconf> Do not read any configuration files. This can only be used as the first option given on the command line. =back =head1 CONFIGURATION VARIABLES The two configuration files F<__SYSCONFDIR__/rpmdevtools/devscripts.conf> and F<~/.devscripts> are sourced by a shell in that order to set configuration variables. Command line options can be used to override configuration file settings. Environment variable settings are ignored for this purpose. The currently recognised variables are: =over 4 =item B If this is set to I, then it is the same as the B<--verbose> command line parameter being used. The default is I. =item B If this is set to a positive number then the specified number of lines at the start of each file will be read whilst attempting to determine the license(s) in use. This is equivalent to the B<--lines> command line option. =back =head1 LICENSE This code is copyright by Adam D. Barratt >, all rights reserved; based on a script of the same name from the KDE SDK, which is copyright by >. This program comes with ABSOLUTELY NO WARRANTY. You are free to redistribute this code under the terms of the GNU General Public License, version 2 or later. =head1 AUTHOR Adam D. Barratt =cut use strict; use warnings; use Getopt::Long qw(:config gnu_getopt); use File::Basename; my $progname = basename($0); # From dpkg-source my $default_ignore_regex = ' # Ignore general backup files (?:^|/).*~$| # Ignore emacs recovery files (?:^|/)\.#.*$| # Ignore vi swap files (?:^|/)\..*\.swp$| # Ignore baz-style junk files or directories (?:^|/),,.*(?:$|/.*$)| # File-names that should be ignored (never directories) (?:^|/)(?:DEADJOE|\.cvsignore|\.arch-inventory|\.bzrignore|\.gitignore)$| # File or directory names that should be ignored (?:^|/)(?:CVS|RCS|\.deps|\{arch\}|\.arch-ids|\.svn|\.hg|_darcs|\.git| \.shelf|_MTN|\.bzr(?:\.backup|tags)?)(?:$|/.*$) '; # Take out comments and newlines $default_ignore_regex =~ s/^#.*$//mg; $default_ignore_regex =~ s/\n//sg; my $default_check_regex = '\.(c(c|pp|xx)?|h(h|pp|xx)?|f(77|90)?|p(l|m)|xs|sh|php|py(|x)|rb|java|vala|el|sc(i|e)|cs|pas|inc|dtd|xsl|mod|m|tex|mli?)$'; my $modified_conf_msg; my %OPT=( verbose => '', lines => '', noconf => '', ignore => '', check => '', recursive => 0, copyright => 0, machine => 0, ); my $def_lines = 60; # Read configuration files and then command line # This is boilerplate if (@ARGV and $ARGV[0] =~ /^--no-?conf$/) { $modified_conf_msg = " (no configuration files read)"; shift; } else { my @config_files = ('__SYSCONFDIR__/rpmdevtools/devscripts.conf', '~/.devscripts'); my %config_vars = ( 'LICENSECHECK_VERBOSE' => 'no', 'LICENSECHECK_PARSELINES' => $def_lines, ); my %config_default = %config_vars; my $shell_cmd; # Set defaults foreach my $var (keys %config_vars) { $shell_cmd .= qq[$var="$config_vars{$var}";\n]; } $shell_cmd .= 'for file in ' . join(" ", @config_files) . "; do\n"; $shell_cmd .= '[ -f $file ] && . $file; done;' . "\n"; # Read back values foreach my $var (keys %config_vars) { $shell_cmd .= "echo \$$var;\n" } my $shell_out = `/bin/bash -c '$shell_cmd'`; @config_vars{keys %config_vars} = split /\n/, $shell_out, -1; # Check validity $config_vars{'LICENSECHECK_VERBOSE'} =~ /^(yes|no)$/ or $config_vars{'LICENSECHECK_VERBOSE'} = 'no'; $config_vars{'LICENSECHECK_PARSELINES'} =~ /^[1-9][0-9]*$/ or $config_vars{'LICENSECHECK_PARSELINES'} = $def_lines; foreach my $var (sort keys %config_vars) { if ($config_vars{$var} ne $config_default{$var}) { $modified_conf_msg .= " $var=$config_vars{$var}\n"; } } $modified_conf_msg ||= " (none)\n"; chomp $modified_conf_msg; $OPT{'verbose'} = $config_vars{'LICENSECHECK_VERBOSE'} eq 'yes' ? 1 : 0; $OPT{'lines'} = $config_vars{'LICENSECHECK_PARSELINES'}; } GetOptions(\%OPT, "help|h", "check|c=s", "copyright", "ignore|i=s", "lines|l=i", "machine|m", "noconf|no-conf", "recursive|r", "verbose!", "version|v", ) or die "Usage: $progname [options] filelist\nRun $progname --help for more details\n"; $OPT{'lines'} = $def_lines if $OPT{'lines'} !~ /^[1-9][0-9]*$/; $OPT{'ignore'} = $default_ignore_regex if ! length $OPT{'ignore'}; $OPT{'check'} = $default_check_regex if ! length $OPT{'check'}; if ($OPT{'noconf'}) { fatal("--no-conf is only acceptable as the first command-line option!"); } if ($OPT{'help'}) { help(); exit 0; } if ($OPT{'version'}) { version(); exit 0; } die "Usage: $progname [options] filelist\nRun $progname --help for more details\n" unless @ARGV; $OPT{'lines'} = $def_lines if not defined $OPT{'lines'}; my @files = (); my @find_args = (); my $files_count = @ARGV; push @find_args, qw(-maxdepth 1) unless $OPT{'recursive'}; push @find_args, qw(-follow -type f -print); while (@ARGV) { my $file = shift @ARGV; if (-d $file) { open my $FIND, '-|', 'find', $file, @find_args or die "$progname: couldn't exec find: $!\n"; while (<$FIND>) { chomp; next unless m%$OPT{'check'}%; # Skip empty files next if (-z $_); push @files, $_ unless m%$OPT{'ignore'}%; } close $FIND; } else { next unless ($files_count == 1) or $file =~ m%$OPT{'check'}%; push @files, $file unless $file =~ m%$OPT{'ignore'}%; } } while (@files) { my $file = shift @files; my $content = ''; my $copyright_match; my $copyright = ''; my $license = ''; my %copyrights; open (my $F, '<' ,$file) or die "Unable to access $file\n"; while (<$F>) { last if ($. > $OPT{'lines'}); $content .= $_; $copyright_match = parse_copyright($_); if ($copyright_match) { $copyrights{lc("$copyright_match")} = "$copyright_match"; } } close($F); $copyright = join(" / ", values %copyrights); print qq(----- $file header -----\n$content----- end header -----\n\n) if $OPT{'verbose'}; $license = parselicense(clean_comments($content)); if ($OPT{'machine'}) { print "$file\t$license"; print "\t" . ($copyright or "*No copyright*") if $OPT{'copyright'}; print "\n"; } else { print "$file: "; print "*No copyright* " unless $copyright; print $license . "\n"; print " [Copyright: " . $copyright . "]\n" if $copyright and $OPT{'copyright'}; print "\n" if $OPT{'copyright'}; } } sub parse_copyright { my $copyright = ''; my $match; my $copyright_indicator_regex = ' (?:copyright # The full word |copr\. # Legally-valid abbreviation |\x{00a9} # Unicode character COPYRIGHT SIGN |\xc2\xa9 # Unicode copyright sign encoded in iso8859 |\(c\) # Legally-null representation of sign )'; my $copyright_disindicator_regex = ' \b(?:info(?:rmation)? # Discussing copyright information |notice # Discussing the notice |and|or # Part of a sentence )\b'; if (m%$copyright_indicator_regex(?::\s*|\s+)(\S.*)$%ix) { $match = $1; # Ignore lines matching "see foo for copyright information" etc. if ($match !~ m%^\s*$copyright_disindicator_regex%ix) { # De-cruft $match =~ s/([,.])?\s*$//; $match =~ s/$copyright_indicator_regex//igx; $match =~ s/^\s+//; $match =~ s/\s{2,}/ /g; $match =~ s/\\@/@/g; $copyright = $match; } } return $copyright; } sub clean_comments { local $_ = shift or return q{}; my $first_match; # Remove generic comments: look for 4 or more lines beginning with # regular comment pattern and trim it. Fall back to old algorithm # if no such pattern found. if( 4 <= scalar(($first_match)=m{ ^\s* ([^a-zA-Z0-9\s]{1,3}) \s\w }xmg) ){ my $comment_length=length($first_match); my $comment_re=qr{\s* [$1]{${comment_length}} \s*}x; s/^$comment_re//mg; } # Remove Fortran comments s/^[cC] //gm; tr/\t\r\n/ /; # Remove C / C++ comments s#(\*/|/[/*])##g; tr% A-Za-z.,@;0-9\(\)/-%%cd; tr/ //s; return $_; } sub help { print <<"EOF"; Usage: $progname [options] filename [filename ...] Valid options are: --help, -h Display this message --version, -v Display version and copyright info --no-conf, --noconf Don't read devscripts config files; must be the first option given --verbose Display the header of each file before its license information --lines, -l Specify how many lines of the file header should be parsed for license information (Default: $def_lines) --check, -c Specify a pattern indicating which files should be checked (Default: '$default_check_regex') --machine, -m Display in a machine readable way (good for awk) --recursive, -r Add the contents of directories recursively --copyright Also display the file's copyright --ignore, -i Specify that files / directories matching the regular expression should be ignored when checking files (Default: '$default_ignore_regex') Default settings modified by devscripts configuration files: $modified_conf_msg EOF } sub version { print <<"EOF"; This is $progname, from the Debian devscripts package, version ###VERSION### Copyright (C) 2007, 2008 by Adam D. Barratt ; based on a script of the same name from the KDE SDK by . This program comes with ABSOLUTELY NO WARRANTY. You are free to redistribute this code under the terms of the GNU General Public License, version 2, or (at your option) any later version. EOF } sub parselicense { my ($licensetext) = @_; my $gplver = ""; my $extrainfo = ""; my $license = ""; if ($licensetext =~ /version ([^, ]+?)[.,]? (?:\(?only\)?.? )?(?:of the GNU (Affero )?(Lesser |Library )?General Public License )?(as )?published by the Free Software Foundation/i or $licensetext =~ /GNU (?:Affero )?(?:Lesser |Library )?General Public License (?:as )?published by the Free Software Foundation[;,] version ([^, ]+?)[.,]? /i) { $gplver = " (v$1)"; } elsif ($licensetext =~ /GNU (?:Affero )?(?:Lesser |Library )?General Public License, version (\d+(?:\.\d+)?)[ \.]/) { $gplver = " (v$1)"; } elsif ($licensetext =~ /either version ([^ ]+)(?: of the License)?, or \(at your option\) any later version/) { $gplver = " (v$1 or later)"; } if ($licensetext =~ /(?:675 Mass Ave|59 Temple Place|51 Franklin Steet|02139|02111-1307)/i) { $extrainfo = " (with incorrect FSF address)$extrainfo"; } if ($licensetext =~ /permission (?:is (also granted|given))? to link (the code of )?this program with (any edition of )?(Qt|the Qt library)/i) { $extrainfo = " (with Qt exception)$extrainfo" } if ($licensetext =~ /(All changes made in this file will be lost|DO NOT (EDIT|delete this file)|Generated (automatically|by|from)|generated.*file)/i) { $license = "GENERATED FILE"; } if ($licensetext =~ /((is free software.? )?you can redistribute (it|them) and\/or modify (it|them)|is licensed) under the terms of (version [^ ]+ of )?the (GNU (Library |Lesser )General Public License|LGPL)/i) { $license = "LGPL$gplver$extrainfo $license"; } if ($licensetext =~ /is free software.? you can redistribute (it|them) and\/or modify (it|them) under the terms of the (GNU Affero General Public License|AGPL)/i) { $license = "AGPL$gplver$extrainfo $license"; } if ($licensetext =~ /(is free software.? )?you (can|may) redistribute (it|them) and\/or modify (it|them) under the terms of (?:version [^ ]+ (?:\(?only\)? )?of )?the GNU General Public License/i) { $license = "GPL$gplver$extrainfo $license"; } if ($licensetext =~ /is distributed under the terms of the GNU General Public License,/ and length $gplver) { $license = "GPL$gplver$extrainfo $license"; } if ($licensetext =~ /is distributed.*terms.*GPL/) { $license = "GPL (unversioned/unknown version) $license"; } if ($licensetext =~ /This file is part of the .*Qt GUI Toolkit. This file may be distributed under the terms of the Q Public License as defined/) { $license = "QPL (part of Qt) $license"; } elsif ($licensetext =~ /may (be distributed|redistribute it) under the terms of the Q Public License/) { $license = "QPL $license"; } if ($licensetext =~ /opensource\.org\/licenses\/mit-license\.php/) { $license = "MIT/X11 (BSD like) $license"; } elsif ($licensetext =~ /Permission is hereby granted, free of charge, to any person obtaining a copy of this software and(\/or)? associated documentation files \(the (Software|Materials)\), to deal in the (Software|Materials)/) { $license = "MIT/X11 (BSD like) $license"; } elsif ($licensetext =~ /Permission is hereby granted, without written agreement and without license or royalty fees, to use, copy, modify, and distribute this software and its documentation for any purpose/) { $license = "MIT/X11 (BSD like) $license"; } if ($licensetext =~ /Permission to use, copy, modify, and(\/or)? distribute this software for any purpose with or without fee is hereby granted, provided.*copyright notice.*permission notice.*all copies/) { $license = "ISC $license"; } if ($licensetext =~ /THIS SOFTWARE IS PROVIDED .*AS IS AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY/) { if ($licensetext =~ /All advertising materials mentioning features or use of this software must display the following acknowledge?ment.*This product includes software developed by/i) { $license = "BSD (4 clause) $license"; } elsif ($licensetext =~ /(The name .*? may not|Neither the names? .*? nor the names of (its|their|other) contributors may) be used to endorse or promote products derived from this software/i) { $license = "BSD (3 clause) $license"; } elsif ($licensetext =~ /Redistributions of source code must retain the above copyright notice/i) { $license = "BSD (2 clause) $license"; } else { $license = "BSD $license"; } } if ($licensetext =~ /Mozilla Public License,? (Version|v\.) (\d+(?:\.\d+)?)/) { $license = "MPL (v$2) $license"; } if ($licensetext =~ /Released under the terms of the Artistic License ([^ ]+)/) { $license = "Artistic (v$1) $license"; } if ($licensetext =~ /is free software under the Artistic [Ll]icense/) { $license = "Artistic $license"; } if ($licensetext =~ /This program is free software; you can redistribute it and\/or modify it under the same terms as Perl itself/) { $license = "Perl $license"; } if ($licensetext =~ /under the Apache License, Version ([^ ]+)/) { $license = "Apache (v$1) $license"; } if ($licensetext =~ /(THE BEER-WARE LICENSE)/i) { $license = "Beerware $license"; } if ($licensetext =~ /This source file is subject to version ([^ ]+) of the PHP license/) { $license = "PHP (v$1) $license"; } if ($licensetext =~ /under the terms of the CeCILL /) { $license = "CeCILL $license"; } if ($licensetext =~ /under the terms of the CeCILL-([^ ]+) /) { $license = "CeCILL-$1 $license"; } if ($licensetext =~ /under the SGI Free Software License B/) { $license = "SGI Free Software License B $license"; } if ($licensetext =~ /is in the public domain/i) { $license = "Public domain $license"; } if ($licensetext =~ /terms of the Common Development and Distribution License(, Version ([^(]+))? \(the License\)/) { $license = "CDDL " . ($1 ? "(v$2) " : '') . $license; } if ($licensetext =~ /Microsoft Permissive License \(Ms-PL\)/) { $license = "Ms-PL $license"; } if ($licensetext =~ /Permission is hereby granted, free of charge, to any person or organization obtaining a copy of the software and accompanying documentation covered by this license \(the \"Software\"\)/ or $licensetext =~ /Boost Software License([ ,-]+Version ([^ ]+)?(\.))/i) { $license = "BSL " . ($1 ? "(v$2) " : '') . $license; } if ($licensetext =~ /PYTHON SOFTWARE FOUNDATION LICENSE (VERSION ([^ ]+))/i) { $license = "PSF " . ($1 ? "(v$2) " : '') . $license; } if ($licensetext =~ /The origin of this software must not be misrepresented.*Altered source versions must be plainly marked as such.*This notice may not be removed or altered from any source distribution/ or $licensetext =~ /see copyright notice in zlib\.h/) { $license = "zlib/libpng $license"; } elsif ($licensetext =~ /This code is released under the libpng license/) { $license = "libpng $license"; } if ($licensetext =~ /Do What The Fuck You Want To Public License, Version ([^, ]+)/i) { $license = "WTFPL (v$1) $license"; } if ($licensetext =~ /Do what The Fuck You Want To Public License/i) { $license = "WTFPL $license"; } if ($licensetext =~ /(License WTFPL|Under (the|a) WTFPL)/i) { $license = "WTFPL $license"; } $license = "UNKNOWN" if (!length($license)); # Remove trailing spaces. $license =~ s/\s+$//; return $license; } sub fatal { my ($pack,$file,$line); ($pack,$file,$line) = caller(); (my $msg = "$progname: fatal error at line $line:\n@_\n") =~ tr/\0//d; $msg =~ s/\n\n$/\n/; die $msg; }qlandkartegt-1.7.5/BCPP_HOWTO000644 001750 000144 00000000577 12225261330 016632 0ustar00oeichlerusers000000 000000 To beautify all source code do: cd src find ./ -name "*.h" -exec bcpp -fnc ../bcpp.config -fi {} \; find ./ -name "*.cpp" -exec bcpp -fnc ../bcpp.config -fi {} \; rm *.orig # or: cd src perl -e 'my @a=`svn st *.cpp *.h`; for my $b (@a) { $b =~ s/.......(.*)/$1/; print $b; system("bcpp -fnc ../bcpp.config -fi $b");}' # after making shure the operation did nothing eval: rm *.orig qlandkartegt-1.7.5/Win32/stdint.h000644 001750 000144 00000017060 12225261330 017556 0ustar00oeichlerusers000000 000000 // 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. // /////////////////////////////////////////////////////////////////////////////// #ifndef _MSC_VER // [ #error "Use this header only with Microsoft Visual C++ compilers!" #endif // _MSC_VER ] #ifndef _MSC_STDINT_H_ // [ #define _MSC_STDINT_H_ #if _MSC_VER > 1000 #pragma once #endif #include // For Visual Studio 6 in C++ mode and for many Visual Studio versions when // compiling for ARM we should wrap include with 'extern "C++" {}' // or compiler give many errors like this: // error C2733: second C linkage of overloaded function 'wmemchr' not allowed #ifdef __cplusplus extern "C" { #endif # include #ifdef __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 // Visual Studio 6 and Embedded Visual C++ 4 doesn't // realize that, e.g. char has the same size as __int8 // so we give up on __intX for them. #if (_MSC_VER < 1300) typedef signed char int8_t; typedef signed short int16_t; typedef signed int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; #else typedef signed __int8 int8_t; typedef signed __int16 int16_t; typedef signed __int32 int32_t; typedef unsigned __int8 uint8_t; typedef unsigned __int16 uint16_t; typedef unsigned __int32 uint32_t; #endif typedef signed __int64 int64_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 signed __int64 intptr_t; typedef unsigned __int64 uintptr_t; #else // _WIN64 ][ typedef _W64 signed 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 ] #endif // _MSC_STDINT_H_ ] qlandkartegt-1.7.5/Win32/README000644 001750 000144 00000000616 12225261330 016757 0ustar00oeichlerusers000000 000000 To compile the Win32 Port you have to checkout the GDAL sub-repo, too. The checkout has to be in the same directory as this file: svn co https://qlandkartegt.svn.sourceforge.net/svnroot/qlandkartegt/GDAL/ To run QLandkarte GT all files below the GDAL/bin path have to copied into the qlandkartegt.exe path. This GDAL version has been compiled by Tamas Szekeres http://www.gisinternals.com/sdk/.qlandkartegt-1.7.5/3rdparty/SerialPort/qextserialport.h000644 001750 000144 00000001231 12225261330 024262 0ustar00oeichlerusers000000 000000 #ifndef _QEXTSERIALPORT_H_ #define _QEXTSERIALPORT_H_ /*POSIX CODE*/ #ifdef _TTY_POSIX_ #include "posix_qextserialport.h" #define QextBaseType Posix_QextSerialPort /*MS WINDOWS CODE*/ #else #include "win_qextserialport.h" #define QextBaseType Win_QextSerialPort #endif class QextSerialPort: public QextBaseType { public: QextSerialPort(); QextSerialPort(const QString & name); QextSerialPort(PortSettings const& s); QextSerialPort(const QString & name, PortSettings const& s); QextSerialPort(const QextSerialPort& s); QextSerialPort& operator=(const QextSerialPort&); virtual ~QextSerialPort(); }; #endif qlandkartegt-1.7.5/3rdparty/SerialPort/qextserialport.cpp000644 001750 000144 00000006335 12225261330 024627 0ustar00oeichlerusers000000 000000 /*! \class QextSerialPort \version 1.0.0 \author Stefan Sander A cross-platform serial port class. This class encapsulates a serial port on both POSIX and Windows systems. The user will be notified of errors and possible portability conflicts at run-time by default - this behavior can be turned off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off portability warnings) in the project. \note On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can make no guarantees as to the quality of POSIX support under NT/2000 however. */ #include #include "qextserialport.h" /*! \fn QextSerialPort::QextSerialPort() Default constructor. Note that the naming convention used by a QextSerialPort constructed with this constructor will be determined by #defined constants, or lack thereof - the default behavior is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: \verbatim Constant Used By Naming Convention ---------- ------------- ------------------------ _TTY_WIN_ Windows COM1, COM2 _TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 _TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 _TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb _TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 _TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 _TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 Linux /dev/ttyS0, /dev/ttyS1 \endverbatim The object will be associated with the first port in the system, e.g. COM1 on Windows systems. See the other constructors if you need to use a port other than the first. */ QextSerialPort::QextSerialPort() : QextBaseType() {} /*! \fn QextSerialPort::QextSerialPort(const QString & name) Constructs a serial port attached to the port specified by name. name is the name of the device, which is windowsystem-specific, e.g."COM1" or "/dev/ttyS0". */ QextSerialPort::QextSerialPort(const QString & name) : QextBaseType(name) {} /*! \fn QextSerialPort::QextSerialPort(PortSettings const& settings) Constructs a port with default name and settings specified by the settings parameter. */ QextSerialPort::QextSerialPort(PortSettings const& settings) : QextBaseType(settings) {} /*! \fn QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings) Constructs a port with the name and settings specified. */ QextSerialPort::QextSerialPort(const QString & name, PortSettings const& settings) : QextBaseType(name, settings) {} /*! \fn QextSerialPort::QextSerialPort(const QextSerialPort& s) Copy constructor. */ QextSerialPort::QextSerialPort(const QextSerialPort& s) : QextBaseType(s) {} /*! \fn QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) Overrides the = operator. */ QextSerialPort& QextSerialPort::operator=(const QextSerialPort& s) { return (QextSerialPort&)QextBaseType::operator=(s); } /*! \fn QextSerialPort::~QextSerialPort() Standard destructor. */ QextSerialPort::~QextSerialPort() {} qlandkartegt-1.7.5/3rdparty/SerialPort/ManageSerialPort.h000644 001750 000144 00000021777 12225261330 024412 0ustar00oeichlerusers000000 000000 /******************************************************************************************************** * PROGRAM : QSerialPortTerminal * DATE - TIME : vendredi 03 octobre 2008 - 11h15 * AUTHOR : VIANNEY-LIAUD Philippe ( philippe.vianney.liaud gmail.com ) * FILENAME : ManageSerialPort.h * LICENSE : GPL * COMMENTARY : Manage qExtSerialPort ********************************************************************************************************/ #ifndef MANAGESERIALPORT_H #define MANAGESERIALPORT_H #include #include #include #include #include "qextserialport.h" Q_DECLARE_METATYPE(BaudRateType); Q_DECLARE_METATYPE(DataBitsType); Q_DECLARE_METATYPE(ParityType); Q_DECLARE_METATYPE(StopBitsType); Q_DECLARE_METATYPE(FlowType); class ThreadSend; class ThreadReceive; class ManageSerialPort : public QObject { Q_OBJECT public: //Constructeurs + destructeur ManageSerialPort(); ManageSerialPort(const QString &name, const BaudRateType baudRate, const DataBitsType dataBits,\ const ParityType parity, const StopBitsType stopBits, \ const FlowType flowControl, ulong seconds, ulong milliseconds); ~ManageSerialPort(); //General bool open(); bool open(const QString &name, const BaudRateType baudRate, const DataBitsType dataBits,\ const ParityType parity, const StopBitsType stopBits, \ const FlowType flowControl, ulong seconds, ulong milliseconds); bool isOpen(); void close(); //Sets the name of the device associated with the object, e.g. "COM1", or "/dev/ttyS0" void setPort(const QString &name); QString getPort(); /*Most used : '*' (POSTX & Windows) RATE Windows Speed POSIX Speed ----------- ------------- ----------- enum BaudRateType{ BAUD50 110 50 //POSIX ONLY BAUD75 110 75 //POSIX ONLY *BAUD110 110 110 BAUD134 110 134.5 //POSIX ONLY BAUD150 110 150 //POSIX ONLY BAUD200 110 200 //POSIX ONLY *BAUD300 300 300 *BAUD600 600 600 *BAUD1200 1200 1200 BAUD1800 1200 1800 //POSIX ONLY *BAUD2400 2400 2400 *BAUD4800 4800 4800 *BAUD9600 9600 9600 BAUD14400 14400 9600 //WINDOWS ONLY *BAUD19200 19200 19200 *BAUD38400 38400 38400 BAUD56000 56000 38400 //WINDOWS ONLY *BAUD57600 57600 57600 BAUD76800 57600 76800 //POSIX ONLY *BAUD115200 115200 115200 BAUD128000 128000 115200 //WINDOWS ONLY BAUD256000 256000 115200 //WINDOWS ONLY }*/ void setBaudRate(const BaudRateType baudRate); /*getBaudRate return "50"; return "75"; return "110"; return "134"; return "150"; return "200"; return "300"; return "600"; return "1200"; return "1800"; return "2400"; return "4800"; return "9600"; return "14400"; return "19200"; return "38400"; return "56000"; return "57600"; return "76800"; return "115200"; return "128000"; return "256000";*/ QString getBaudRate(); /*enum DataBitsType { DATA_5 DATA_6 DATA_7 DATA_8 };*/ void setDataBits(const DataBitsType dataBits); /*getDataBits return '5'; return '6'; return '7'; return '8';*/ QChar getDataBits(); /*enum ParityType { PAR_NONE //None means that no parity bit is sent at all PAR_ODD //Odd PAR_EVEN //Even PAR_MARK //Windows only : Mark parity means that the parity bit is always set to the mark signal condition (logical 1) PAR_SPACE //Space parity always sends the parity bit in the space signal condition };*/ void setParity(const ParityType parity); /*getParity return "None"; return "Odd"; return "Even"; return "Mark"; Windows only return "Space";*/ QString getParity(); /*enum StopBitsType { STOP_1 STOP_1_5 //WINDOWS ONLY STOP_2 };*/ void setStopBits(const StopBitsType stopBits); /*getStopBit return "1" return "1.5" return "2"*/ QString getStopBit(); /*enum FlowType { FLOW_OFF FLOW_HARDWARE FLOW_XONXOFF };*/ void setFlowControl(const FlowType flowControl); /*getFlowControl return "None" return "Hardware" return "Xon/Xoff"*/ QString getFlowControl(); void setTimeout(ulong seconds, ulong milliseconds); /*getLastErrorToString return "No Error has occured" return "Invalid file descriptor (port was not opened correctly)" return "Unable to allocate memory tables (POSIX)" return "Caught a non-blocked signal (POSIX)" return "Operation timed out (POSIX)" return "The file opened by the port is not a character device (POSIX)" return "The port detected a break condition" return "The port detected a framing error (usually caused by incorrect baud rate settings)" return "There was an I/O error while communicating with the port" return "Character buffer overrun" return "Receive buffer overflow" return "The port detected a parity error in the received data" return "Transmit buffer overflow" return "General read operation failure" return "General write operation failure"*/ /*QString getLastErrorToString();*/ /*getLastError return 0 : No Error has occured return 1 : Invalid file descriptor (port was not opened correctly) return 2 : Unable to allocate memory tables (POSIX) return 3 : Caught a non-blocked signal (POSIX) return 4 : Operation timed out (POSIX) return 5 : The file opened by the port is not a character device (POSIX) return 6 : The port detected a break condition" return 7 : The port detected a framing error (usually caused by incorrect baud rate settings) return 8 : There was an I/O error while communicating with the port return 9 : Character buffer overrun return 10 : Receive buffer overflow return 11 : The port detected a parity error in the received data return 12 : Transmit buffer overflow return 13 : General read operation failure return 14 : General write operation failure*/ /*ulong getLastError();*/ //Emission void enableSending(); void disableSending(); /*isSendingEnabled return 0 : sending is not enable return 1 : sending is enable*/ bool isSendingEnabled(); /*sendData return 1 : add OK return 2 : port is not open return 3 : sending is not enable*/ uchar sendData(QByteArray &dataToSend); void stopSending(); //Reception void enableReceiving(); void disableReceiving(); /*isReceivingEnabled return 0 : receiving is not enable return 1 : receiving is enable*/ bool isReceivingEnabled(); /*receiveData return 1 : start thread OK return 2 : port is not open return 3 : receiving is not enable*/ uchar receiveData(); void stopReceiving(); signals: void newDataReceived(const QByteArray &dataReceived); private: //Variables privees QextSerialPort extSerialPort; ThreadSend *threadSend; ThreadReceive *threadReceive; bool sendingEnabled; bool receivingEnabled; bool closeCalled; bool saveStateSendEnabled; bool saveStateReceivedEnabled; bool saveStateReceiveData; }; class ThreadSend : public QThread { Q_OBJECT public: ThreadSend(QextSerialPort &addressSerialPort); ~ThreadSend(); void addDataToSend(QByteArray &dataToAdd); void stopSending(); protected: void run(); private: QMutex mutexSend; QextSerialPort &extSerialPort; QQueue dataToSend; bool stopped; }; class ThreadReceive : public QThread { Q_OBJECT public: ThreadReceive(QextSerialPort &addressSerialPort); ~ThreadReceive(); void stopReceiving(); protected: void run(); private : QMutex mutexReceive; QextSerialPort &extSerialPort; bool stopped; signals: void newDataReceived(const QByteArray &dataReceived); }; #endif // MANAGESERIALPORT_H qlandkartegt-1.7.5/3rdparty/SerialPort/CMakeLists.txt000644 001750 000144 00000002053 12225261330 023566 0ustar00oeichlerusers000000 000000 project(SerialPort) # Required cmake version cmake_minimum_required(VERSION 2.6.0) set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) find_package(Qt4 REQUIRED) include(${QT_USE_FILE}) set(SRCS ManageSerialPort.cpp # posix_qextserialport.cpp qextserialbase.cpp qextserialport.cpp # win_qextserialport.cpp ) set(HDRS ManageSerialPort.h # posix_qextserialport.h qextserialbase.h qextserialport.h # win_qextserialport.h ) set(UIS ) set(RCS ) if(WIN32) set(SRCS ${SRCS} win_qextserialport.cpp) set(HDRS ${HDRS} win_qextserialport.h) else (WIN32) set(SRCS ${SRCS} posix_qextserialport.cpp) set(HDRS ${HDRS} posix_qextserialport.h) add_definitions(-D_TTY_POSIX_) endif(WIN32) qt4_wrap_cpp(MOC_SRCS ${HDRS}) qt4_wrap_ui(UI_HDRS ${UIS}) qt4_add_resources(RC_SRCS ${RCS}) include_directories( ) link_directories( ${CMAKE_BINARY_DIR}/lib ) add_library(SerialPort ${SRCS} ${HDRS} ${UI_HDRS} ${RC_SRCS} ${MOC_SRCS} ${QM_FILES} ) target_link_libraries( SerialPort ${QT_LIBRARIES} ) qlandkartegt-1.7.5/3rdparty/SerialPort/qextserialbase.cpp000644 001750 000144 00000015040 12225261330 024546 0ustar00oeichlerusers000000 000000 #include "qextserialbase.h" /*! \class QextSerialBase \version 1.0.0 \author Stefan Sander A common base class for Win_QextSerialBase, Posix_QextSerialBase and QextSerialPort. */ #ifdef QT_THREAD_SUPPORT QMutex* QextSerialBase::mutex=NULL; unsigned long QextSerialBase::refCount=0; #endif /*! \fn QextSerialBase::QextSerialBase() Default constructor. */ QextSerialBase::QextSerialBase() : QIODevice() { #ifdef _TTY_WIN_ setPortName("COM1"); #elif defined(_TTY_IRIX_) setPortName("/dev/ttyf1"); #elif defined(_TTY_HPUX_) setPortName("/dev/tty1p0"); #elif defined(_TTY_SUN_) setPortName("/dev/ttya"); #elif defined(_TTY_DIGITAL_) setPortName("/dev/tty01"); #elif defined(_TTY_FREEBSD_) setPortName("/dev/ttyd1"); #else setPortName("/dev/ttyS0"); #endif construct(); } /*! \fn QextSerialBase::QextSerialBase(const QString & name) Construct a port and assign it to the device specified by the name parameter. */ QextSerialBase::QextSerialBase(const QString & name) : QIODevice() { setPortName(name); construct(); } /*! \fn QextSerialBase::~QextSerialBase() Standard destructor. */ QextSerialBase::~QextSerialBase() { #ifdef QT_THREAD_SUPPORT refCount--; if (mutex && refCount==0) { delete mutex; mutex=NULL; } #endif } /*! \fn void QextSerialBase::construct() Common constructor function for setting up default port settings. (9600 Baud, 8N1, no flow control where supported, otherwise no flow control, and 20 ms timeout). */ void QextSerialBase::construct() { Settings.BaudRate=BAUD9600; Settings.DataBits=DATA_8; Settings.Parity=PAR_NONE; Settings.StopBits=STOP_1; Settings.FlowControl=FLOW_OFF; Settings.Timeout_Sec=0; Settings.Timeout_Millisec=20; #ifdef QT_THREAD_SUPPORT if (!mutex) { mutex=new QMutex( QMutex::Recursive ); } refCount++; #endif setOpenMode(QIODevice::NotOpen); } /*! \fn void QextSerialBase::setPortName(const QString & name) Sets the name of the device associated with the object, e.g. "COM1", or "/dev/ttyS0". */ void QextSerialBase::setPortName(const QString & name) { port = name; } /*! \fn QString QextSerialBase::portName() const Returns the name set by setPortName(). */ QString QextSerialBase::portName() const { return port; } /*! \fn BaudRateType QextSerialBase::baudRate(void) const Returns the baud rate of the serial port. For a list of possible return values see the definition of the enum BaudRateType. */ BaudRateType QextSerialBase::baudRate(void) const { return Settings.BaudRate; } /*! \fn DataBitsType QextSerialBase::dataBits() const Returns the number of data bits used by the port. For a list of possible values returned by this function, see the definition of the enum DataBitsType. */ DataBitsType QextSerialBase::dataBits() const { return Settings.DataBits; } /*! \fn ParityType QextSerialBase::parity() const Returns the type of parity used by the port. For a list of possible values returned by this function, see the definition of the enum ParityType. */ ParityType QextSerialBase::parity() const { return Settings.Parity; } /*! \fn StopBitsType QextSerialBase::stopBits() const Returns the number of stop bits used by the port. For a list of possible return values, see the definition of the enum StopBitsType. */ StopBitsType QextSerialBase::stopBits() const { return Settings.StopBits; } /*! \fn FlowType QextSerialBase::flowControl() const Returns the type of flow control used by the port. For a list of possible values returned by this function, see the definition of the enum FlowType. */ FlowType QextSerialBase::flowControl() const { return Settings.FlowControl; } /*! \fn bool QextSerialBase::isSequential() const Returns true if device is sequential, otherwise returns false. Serial port is sequential device so this function always returns true. Check QIODevice::isSequential() documentation for more information. */ bool QextSerialBase::isSequential() const { return true; } /*! \fn bool QextSerialBase::atEnd() const This function will return true if the input buffer is empty (or on error), and false otherwise. Call QextSerialBase::lastError() for error information. */ bool QextSerialBase::atEnd() const { if (size()) { return true; } return false; } /*! \fn qint64 QextSerialBase::readLine(char * data, qint64 maxSize) This function will read a line of buffered input from the port, stopping when either maxSize bytes have been read, the port has no more data available, or a newline is encountered. The value returned is the length of the string that was read. */ qint64 QextSerialBase::readLine(char * data, qint64 maxSize) { qint64 numBytes = bytesAvailable(); char* pData = data; if (maxSize < 2) //maxSize must be larger than 1 return -1; /*read a byte at a time for MIN(bytesAvail, maxSize - 1) iterations, or until a newline*/ while (pData<(data+numBytes) && --maxSize) { readData(pData, 1); if (*pData++ == '\n') { break; } } *pData='\0'; /*return size of data read*/ return (pData-data); } /*! \fn ulong QextSerialBase::lastError() const Returns the code for the last error encountered by the port, or E_NO_ERROR if the last port operation was successful. Possible error codes are: \verbatim Error Explanation --------------------------- ------------------------------------------------------------- E_NO_ERROR No Error has occured E_INVALID_FD Invalid file descriptor (port was not opened correctly) E_NO_MEMORY Unable to allocate memory tables (POSIX) E_CAUGHT_NON_BLOCKED_SIGNAL Caught a non-blocked signal (POSIX) E_PORT_TIMEOUT Operation timed out (POSIX) E_INVALID_DEVICE The file opened by the port is not a character device (POSIX) E_BREAK_CONDITION The port detected a break condition E_FRAMING_ERROR The port detected a framing error (usually caused by incorrect baud rate settings) E_IO_ERROR There was an I/O error while communicating with the port E_BUFFER_OVERRUN Character buffer overrun E_RECEIVE_OVERFLOW Receive buffer overflow E_RECEIVE_PARITY_ERROR The port detected a parity error in the received data E_TRANSMIT_OVERFLOW Transmit buffer overflow E_READ_FAILED General read operation failure E_WRITE_FAILED General write operation failure \endverbatim */ ulong QextSerialBase::lastError() const { return lastErr; } qlandkartegt-1.7.5/3rdparty/SerialPort/win_qextserialport.cpp000644 001750 000144 00000062752 12225261330 025511 0ustar00oeichlerusers000000 000000 /*! \class Win_QextSerialPort \version 1.0.0 \author Stefan Sander A cross-platform serial port class. This class encapsulates the Windows portion of QextSerialPort. The user will be notified of errors and possible portability conflicts at run-time by default - this behavior can be turned off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off portability warnings) in the project. Note that defining _TTY_NOWARN_ also defines _TTY_NOWARN_PORT_. \note On Windows NT/2000/XP this class uses Win32 serial port functions by default. The user may select POSIX behavior under NT, 2000, or XP ONLY by defining _TTY_POSIX_ in the project. I can make no guarantees as to the quality of POSIX support under NT/2000 however. */ #include #include "win_qextserialport.h" /*! \fn Win_QextSerialPort::Win_QextSerialPort() Default constructor. Note that the name of the device used by a Win_QextSerialPort constructed with this constructor will be determined by #defined constants, or lack thereof - the default behavior is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: \verbatim Constant Used By Naming Convention ---------- ------------- ------------------------ _TTY_WIN_ Windows COM1, COM2 _TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 _TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 _TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb _TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 _TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 _TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 Linux /dev/ttyS0, /dev/ttyS1 \endverbatim This constructor associates the object with the first port on the system, e.g. COM1 for Windows platforms. See the other constructor if you need a port other than the first. */ Win_QextSerialPort::Win_QextSerialPort():QextSerialBase() { Win_Handle=INVALID_HANDLE_VALUE; } /*!Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort&) Copy constructor. */ Win_QextSerialPort::Win_QextSerialPort(const Win_QextSerialPort& s):QextSerialBase(s.port) { Win_Handle=INVALID_HANDLE_VALUE; setOpenMode(s.openMode()); lastErr=s.lastErr; port = s.port; Settings.FlowControl=s.Settings.FlowControl; Settings.Parity=s.Settings.Parity; Settings.DataBits=s.Settings.DataBits; Settings.StopBits=s.Settings.StopBits; Settings.BaudRate=s.Settings.BaudRate; Win_Handle=s.Win_Handle; memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); } /*! \fn Win_QextSerialPort::Win_QextSerialPort(const QString & name) Constructs a serial port attached to the port specified by devName. devName is the name of the device, which is windowsystem-specific, e.g."COM2" or "/dev/ttyS0". */ Win_QextSerialPort::Win_QextSerialPort(const QString & name):QextSerialBase(name) { Win_Handle=INVALID_HANDLE_VALUE; } /*! \fn Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) Constructs a port with default name and specified settings. */ Win_QextSerialPort::Win_QextSerialPort(const PortSettings& settings) { Win_Handle=INVALID_HANDLE_VALUE; setBaudRate(settings.BaudRate); setDataBits(settings.DataBits); setStopBits(settings.StopBits); setParity(settings.Parity); setFlowControl(settings.FlowControl); setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); } /*! \fn Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) Constructs a port with specified name and settings. */ Win_QextSerialPort::Win_QextSerialPort(const QString & name, const PortSettings& settings) { Win_Handle=INVALID_HANDLE_VALUE; setPortName(name); setBaudRate(settings.BaudRate); setDataBits(settings.DataBits); setStopBits(settings.StopBits); setParity(settings.Parity); setFlowControl(settings.FlowControl); setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); } /*! \fn Win_QextSerialPort::~Win_QextSerialPort() Standard destructor. */ Win_QextSerialPort::~Win_QextSerialPort() { if (isOpen()) { close(); } } /*! \fn Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) overrides the = operator */ Win_QextSerialPort& Win_QextSerialPort::operator=(const Win_QextSerialPort& s) { setOpenMode(s.openMode()); lastErr=s.lastErr; port = s.port; Settings.FlowControl=s.Settings.FlowControl; Settings.Parity=s.Settings.Parity; Settings.DataBits=s.Settings.DataBits; Settings.StopBits=s.Settings.StopBits; Settings.BaudRate=s.Settings.BaudRate; Win_Handle=s.Win_Handle; memcpy(&Win_CommConfig, &s.Win_CommConfig, sizeof(COMMCONFIG)); memcpy(&Win_CommTimeouts, &s.Win_CommTimeouts, sizeof(COMMTIMEOUTS)); return *this; } /*! \fn bool Win_QextSerialPort::open(OpenMode mode) Opens a serial port. Note that this function does not specify which device to open. If you need to open a device by name, see Win_QextSerialPort::open(const char*). This function has no effect if the port associated with the class is already open. The port is also configured to the current settings, as stored in the Settings structure. */ bool Win_QextSerialPort::open(OpenMode mode) { unsigned long confSize = sizeof(COMMCONFIG); Win_CommConfig.dwSize = confSize; LOCK_MUTEX(); if (mode == QIODevice::NotOpen) return isOpen(); if (!isOpen()) { /*open the port*/ Win_Handle=CreateFileA(port.toAscii(), GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (Win_Handle!=INVALID_HANDLE_VALUE) { /*set open mode*/ QIODevice::open(mode); /*configure port settings*/ GetCommConfig(Win_Handle, &Win_CommConfig, &confSize); GetCommState(Win_Handle, &(Win_CommConfig.dcb)); /*set up parameters*/ Win_CommConfig.dcb.fBinary=TRUE; Win_CommConfig.dcb.fInX=FALSE; Win_CommConfig.dcb.fOutX=FALSE; Win_CommConfig.dcb.fAbortOnError=FALSE; Win_CommConfig.dcb.fNull=FALSE; setBaudRate(Settings.BaudRate); setDataBits(Settings.DataBits); setStopBits(Settings.StopBits); setParity(Settings.Parity); setFlowControl(Settings.FlowControl); setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } } UNLOCK_MUTEX(); return isOpen(); } /*! \fn void Win_QextSerialPort::close() Closes a serial port. This function has no effect if the serial port associated with the class is not currently open. */ void Win_QextSerialPort::close() { LOCK_MUTEX(); CloseHandle(Win_Handle); QIODevice::close(); UNLOCK_MUTEX(); } /*! \fn void Win_QextSerialPort::flush() Flushes all pending I/O to the serial port. This function has no effect if the serial port associated with the class is not currently open. */ void Win_QextSerialPort::flush() { LOCK_MUTEX(); if (isOpen()) { FlushFileBuffers(Win_Handle); } UNLOCK_MUTEX(); } /*! \fn qint64 Win_QextSerialPort::size() const This function will return the number of bytes waiting in the receive queue of the serial port. It is included primarily to provide a complete QIODevice interface, and will not record errors in the lastErr member (because it is const). This function is also not thread-safe - in multithreading situations, use Win_QextSerialPort::bytesAvailable() instead. */ qint64 Win_QextSerialPort::size() const { int availBytes; COMSTAT Win_ComStat; DWORD Win_ErrorMask=0; ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat); availBytes = Win_ComStat.cbInQue; return (qint64)availBytes; } /*! \fn qint64 Win_QextSerialPort::bytesAvailable() Returns the number of bytes waiting in the port's receive queue. This function will return 0 if the port is not currently open, or -1 on error. Error information can be retrieved by calling Win_QextSerialPort::getLastError(). */ qint64 Win_QextSerialPort::bytesAvailable() { LOCK_MUTEX(); if (isOpen()) { DWORD Errors; COMSTAT Status; bool success=ClearCommError(Win_Handle, &Errors, &Status); translateError(Errors); if (success) { lastErr=E_NO_ERROR; UNLOCK_MUTEX(); return Status.cbInQue + QIODevice::bytesAvailable(); } UNLOCK_MUTEX(); return (unsigned int)-1; } UNLOCK_MUTEX(); return 0; } /*! \fn void Win_QextSerialPort::translateError(ulong error) Translates a system-specific error code to a QextSerialPort error code. Used internally. */ void Win_QextSerialPort::translateError(ulong error) { if (error&CE_BREAK) { lastErr=E_BREAK_CONDITION; } else if (error&CE_FRAME) { lastErr=E_FRAMING_ERROR; } else if (error&CE_IOE) { lastErr=E_IO_ERROR; } else if (error&CE_MODE) { lastErr=E_INVALID_FD; } else if (error&CE_OVERRUN) { lastErr=E_BUFFER_OVERRUN; } else if (error&CE_RXPARITY) { lastErr=E_RECEIVE_PARITY_ERROR; } else if (error&CE_RXOVER) { lastErr=E_RECEIVE_OVERFLOW; } else if (error&CE_TXFULL) { lastErr=E_TRANSMIT_OVERFLOW; } } /*! \fn qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) Reads a block of data from the serial port. This function will read at most maxlen bytes from the serial port and place them in the buffer pointed to by data. Return value is the number of bytes actually read, or -1 on error. \warning before calling this function ensure that serial port associated with this class is currently open (use isOpen() function to check if port is open). */ qint64 Win_QextSerialPort::readData(char *data, qint64 maxSize) { LOCK_MUTEX(); int retVal=0; COMSTAT Win_ComStat; DWORD Win_BytesRead=0; DWORD Win_ErrorMask=0; ClearCommError(Win_Handle, &Win_ErrorMask, &Win_ComStat); if (Win_ComStat.cbInQue && (!ReadFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesRead, NULL) || Win_BytesRead==0)) { lastErr=E_READ_FAILED; retVal=-1; } else { retVal=((int)Win_BytesRead); } UNLOCK_MUTEX(); return retVal; } /*! \fn qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) Writes a block of data to the serial port. This function will write len bytes from the buffer pointed to by data to the serial port. Return value is the number of bytes actually written, or -1 on error. \warning before calling this function ensure that serial port associated with this class is currently open (use isOpen() function to check if port is open). */ qint64 Win_QextSerialPort::writeData(const char *data, qint64 maxSize) { LOCK_MUTEX(); int retVal=0; DWORD Win_BytesWritten; if (!WriteFile(Win_Handle, (void*)data, (DWORD)maxSize, &Win_BytesWritten, NULL)) { lastErr=E_WRITE_FAILED; retVal=-1; } else { retVal=((int)Win_BytesWritten); } UNLOCK_MUTEX(); flush(); return retVal; } /*! \fn void Win_QextSerialPort::ungetChar(char c) This function is included to implement the full QIODevice interface, and currently has no purpose within this class. This function is meaningless on an unbuffered device and currently only prints a warning message to that effect. */ void Win_QextSerialPort::ungetChar(char c) { /*meaningless on unbuffered sequential device - return error and print a warning*/ TTY_WARNING("Win_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); } /*! \fn void Win_QextSerialPort::setFlowControl(FlowType flow) Sets the flow control used by the port. Possible values of flow are: \verbatim FLOW_OFF No flow control FLOW_HARDWARE Hardware (RTS/CTS) flow control FLOW_XONXOFF Software (XON/XOFF) flow control \endverbatim */ void Win_QextSerialPort::setFlowControl(FlowType flow) { LOCK_MUTEX(); if (Settings.FlowControl!=flow) { Settings.FlowControl=flow; } if (isOpen()) { switch(flow) { /*no flow control*/ case FLOW_OFF: Win_CommConfig.dcb.fOutxCtsFlow=FALSE; Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE; Win_CommConfig.dcb.fInX=FALSE; Win_CommConfig.dcb.fOutX=FALSE; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); break; /*software (XON/XOFF) flow control*/ case FLOW_XONXOFF: Win_CommConfig.dcb.fOutxCtsFlow=FALSE; Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_DISABLE; Win_CommConfig.dcb.fInX=TRUE; Win_CommConfig.dcb.fOutX=TRUE; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); break; case FLOW_HARDWARE: Win_CommConfig.dcb.fOutxCtsFlow=TRUE; Win_CommConfig.dcb.fRtsControl=RTS_CONTROL_HANDSHAKE; Win_CommConfig.dcb.fInX=FALSE; Win_CommConfig.dcb.fOutX=FALSE; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); break; } } UNLOCK_MUTEX(); } /*! \fn void Win_QextSerialPort::setParity(ParityType parity) Sets the parity associated with the serial port. The possible values of parity are: \verbatim PAR_SPACE Space Parity PAR_MARK Mark Parity PAR_NONE No Parity PAR_EVEN Even Parity PAR_ODD Odd Parity \endverbatim */ void Win_QextSerialPort::setParity(ParityType parity) { LOCK_MUTEX(); if (Settings.Parity!=parity) { Settings.Parity=parity; } if (isOpen()) { Win_CommConfig.dcb.Parity=(unsigned char)parity; switch (parity) { /*space parity*/ case PAR_SPACE: if (Settings.DataBits==DATA_8) { TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Space parity with 8 data bits is not supported by POSIX systems."); } Win_CommConfig.dcb.fParity=TRUE; break; /*mark parity - WINDOWS ONLY*/ case PAR_MARK: TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: Mark parity is not supported by POSIX systems"); Win_CommConfig.dcb.fParity=TRUE; break; /*no parity*/ case PAR_NONE: Win_CommConfig.dcb.fParity=FALSE; break; /*even parity*/ case PAR_EVEN: Win_CommConfig.dcb.fParity=TRUE; break; /*odd parity*/ case PAR_ODD: Win_CommConfig.dcb.fParity=TRUE; break; } SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } UNLOCK_MUTEX(); } /*! \fn void Win_QextSerialPort::setDataBits(DataBitsType dataBits) Sets the number of data bits used by the serial port. Possible values of dataBits are: \verbatim DATA_5 5 data bits DATA_6 6 data bits DATA_7 7 data bits DATA_8 8 data bits \endverbatim \note This function is subject to the following restrictions: \par 5 data bits cannot be used with 2 stop bits. \par 1.5 stop bits can only be used with 5 data bits. \par 8 data bits cannot be used with space parity on POSIX systems. */ void Win_QextSerialPort::setDataBits(DataBitsType dataBits) { LOCK_MUTEX(); if (Settings.DataBits!=dataBits) { if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5)) { } else { Settings.DataBits=dataBits; } } if (isOpen()) { switch(dataBits) { /*5 data bits*/ case DATA_5: if (Settings.StopBits==STOP_2) { TTY_WARNING("Win_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); } else { Win_CommConfig.dcb.ByteSize=5; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } break; /*6 data bits*/ case DATA_6: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Win_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); } else { Win_CommConfig.dcb.ByteSize=6; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } break; /*7 data bits*/ case DATA_7: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Win_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); } else { Win_CommConfig.dcb.ByteSize=7; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } break; /*8 data bits*/ case DATA_8: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Win_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); } else { Win_CommConfig.dcb.ByteSize=8; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } break; } } UNLOCK_MUTEX(); } /*! \fn void Win_QextSerialPort::setStopBits(StopBitsType stopBits) Sets the number of stop bits used by the serial port. Possible values of stopBits are: \verbatim STOP_1 1 stop bit STOP_1_5 1.5 stop bits STOP_2 2 stop bits \endverbatim \note This function is subject to the following restrictions: \par 2 stop bits cannot be used with 5 data bits. \par 1.5 stop bits cannot be used with 6 or more data bits. \par POSIX does not support 1.5 stop bits. */ void Win_QextSerialPort::setStopBits(StopBitsType stopBits) { LOCK_MUTEX(); if (Settings.StopBits!=stopBits) { if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || (stopBits==STOP_1_5 && Settings.DataBits!=DATA_5)) { } else { Settings.StopBits=stopBits; } } if (isOpen()) { switch (stopBits) { /*one stop bit*/ case STOP_1: Win_CommConfig.dcb.StopBits=ONESTOPBIT; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); break; /*1.5 stop bits*/ case STOP_1_5: TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: 1.5 stop bit operation is not supported by POSIX."); if (Settings.DataBits!=DATA_5) { TTY_WARNING("Win_QextSerialPort: 1.5 stop bits can only be used with 5 data bits"); } else { Win_CommConfig.dcb.StopBits=ONE5STOPBITS; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } break; /*two stop bits*/ case STOP_2: if (Settings.DataBits==DATA_5) { TTY_WARNING("Win_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); } else { Win_CommConfig.dcb.StopBits=TWOSTOPBITS; SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } break; } } UNLOCK_MUTEX(); } /*! \fn void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) Sets the baud rate of the serial port. Note that not all rates are applicable on all platforms. The following table shows translations of the various baud rate constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * are speeds that are usable on both Windows and POSIX. \verbatim RATE Windows Speed POSIX Speed ----------- ------------- ----------- BAUD50 110 50 BAUD75 110 75 *BAUD110 110 110 BAUD134 110 134.5 BAUD150 110 150 BAUD200 110 200 *BAUD300 300 300 *BAUD600 600 600 *BAUD1200 1200 1200 BAUD1800 1200 1800 *BAUD2400 2400 2400 *BAUD4800 4800 4800 *BAUD9600 9600 9600 BAUD14400 14400 9600 *BAUD19200 19200 19200 *BAUD38400 38400 38400 BAUD56000 56000 38400 *BAUD57600 57600 57600 BAUD76800 57600 76800 *BAUD115200 115200 115200 BAUD128000 128000 115200 BAUD256000 256000 115200 \endverbatim */ void Win_QextSerialPort::setBaudRate(BaudRateType baudRate) { LOCK_MUTEX(); if (Settings.BaudRate!=baudRate) { switch (baudRate) { case BAUD50: case BAUD75: case BAUD134: case BAUD150: case BAUD200: Settings.BaudRate=BAUD110; break; case BAUD1800: Settings.BaudRate=BAUD1200; break; case BAUD76800: Settings.BaudRate=BAUD57600; break; default: Settings.BaudRate=baudRate; break; } } if (isOpen()) { switch (baudRate) { /*50 baud*/ case BAUD50: TTY_WARNING("Win_QextSerialPort: Windows does not support 50 baud operation. Switching to 110 baud."); Win_CommConfig.dcb.BaudRate=CBR_110; break; /*75 baud*/ case BAUD75: TTY_WARNING("Win_QextSerialPort: Windows does not support 75 baud operation. Switching to 110 baud."); Win_CommConfig.dcb.BaudRate=CBR_110; break; /*110 baud*/ case BAUD110: Win_CommConfig.dcb.BaudRate=CBR_110; break; /*134.5 baud*/ case BAUD134: TTY_WARNING("Win_QextSerialPort: Windows does not support 134.5 baud operation. Switching to 110 baud."); Win_CommConfig.dcb.BaudRate=CBR_110; break; /*150 baud*/ case BAUD150: TTY_WARNING("Win_QextSerialPort: Windows does not support 150 baud operation. Switching to 110 baud."); Win_CommConfig.dcb.BaudRate=CBR_110; break; /*200 baud*/ case BAUD200: TTY_WARNING("Win_QextSerialPort: Windows does not support 200 baud operation. Switching to 110 baud."); Win_CommConfig.dcb.BaudRate=CBR_110; break; /*300 baud*/ case BAUD300: Win_CommConfig.dcb.BaudRate=CBR_300; break; /*600 baud*/ case BAUD600: Win_CommConfig.dcb.BaudRate=CBR_600; break; /*1200 baud*/ case BAUD1200: Win_CommConfig.dcb.BaudRate=CBR_1200; break; /*1800 baud*/ case BAUD1800: TTY_WARNING("Win_QextSerialPort: Windows does not support 1800 baud operation. Switching to 1200 baud."); Win_CommConfig.dcb.BaudRate=CBR_1200; break; /*2400 baud*/ case BAUD2400: Win_CommConfig.dcb.BaudRate=CBR_2400; break; /*4800 baud*/ case BAUD4800: Win_CommConfig.dcb.BaudRate=CBR_4800; break; /*9600 baud*/ case BAUD9600: Win_CommConfig.dcb.BaudRate=CBR_9600; break; /*14400 baud*/ case BAUD14400: TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 14400 baud operation."); Win_CommConfig.dcb.BaudRate=CBR_14400; break; /*19200 baud*/ case BAUD19200: Win_CommConfig.dcb.BaudRate=CBR_19200; break; /*38400 baud*/ case BAUD38400: Win_CommConfig.dcb.BaudRate=CBR_38400; break; /*56000 baud*/ case BAUD56000: TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 56000 baud operation."); Win_CommConfig.dcb.BaudRate=CBR_56000; break; /*57600 baud*/ case BAUD57600: Win_CommConfig.dcb.BaudRate=CBR_57600; break; /*76800 baud*/ case BAUD76800: TTY_WARNING("Win_QextSerialPort: Windows does not support 76800 baud operation. Switching to 57600 baud."); Win_CommConfig.dcb.BaudRate=CBR_57600; break; /*115200 baud*/ case BAUD115200: Win_CommConfig.dcb.BaudRate=CBR_115200; break; /*128000 baud*/ case BAUD128000: TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 128000 baud operation."); Win_CommConfig.dcb.BaudRate=CBR_128000; break; /*256000 baud*/ case BAUD256000: TTY_PORTABILITY_WARNING("Win_QextSerialPort Portability Warning: POSIX does not support 256000 baud operation."); Win_CommConfig.dcb.BaudRate=CBR_256000; break; } SetCommConfig(Win_Handle, &Win_CommConfig, sizeof(COMMCONFIG)); } UNLOCK_MUTEX(); } /*! \fn void Win_QextSerialPort::setDtr(bool set) Sets DTR line to the requested state (high by default). This function will have no effect if the port associated with the class is not currently open. */ void Win_QextSerialPort::setDtr(bool set) { LOCK_MUTEX(); if (isOpen()) { if (set) { EscapeCommFunction(Win_Handle, SETDTR); } else { EscapeCommFunction(Win_Handle, CLRDTR); } } UNLOCK_MUTEX(); } /*! \fn void Win_QextSerialPort::setRts(bool set) Sets RTS line to the requested state (high by default). This function will have no effect if the port associated with the class is not currently open. */ void Win_QextSerialPort::setRts(bool set) { LOCK_MUTEX(); if (isOpen()) { if (set) { EscapeCommFunction(Win_Handle, SETRTS); } else { EscapeCommFunction(Win_Handle, CLRRTS); } } UNLOCK_MUTEX(); } /*! \fn ulong Win_QextSerialPort::lineStatus(void) returns the line status as stored by the port function. This function will retrieve the states of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned long with specific bits indicating which lines are high. The following constants should be used to examine the states of individual lines: \verbatim Mask Line ------ ---- LS_CTS CTS LS_DSR DSR LS_DCD DCD LS_RI RI \endverbatim This function will return 0 if the port associated with the class is not currently open. */ ulong Win_QextSerialPort::lineStatus(void) { unsigned long Status=0, Temp=0; LOCK_MUTEX(); if (isOpen()) { GetCommModemStatus(Win_Handle, &Temp); if (Temp&MS_CTS_ON) { Status|=LS_CTS; } if (Temp&MS_DSR_ON) { Status|=LS_DSR; } if (Temp&MS_RING_ON) { Status|=LS_RI; } if (Temp&MS_RLSD_ON) { Status|=LS_DCD; } } UNLOCK_MUTEX(); return Status; } /*! \fn void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec); Sets the read and write timeouts for the port to sec seconds and millisec milliseconds. */ void Win_QextSerialPort::setTimeout(ulong sec, ulong millisec) { LOCK_MUTEX(); Settings.Timeout_Sec=sec; Settings.Timeout_Millisec=millisec; if(isOpen()) { Win_CommTimeouts.ReadIntervalTimeout = sec*1000+millisec; Win_CommTimeouts.ReadTotalTimeoutMultiplier = sec*1000+millisec; Win_CommTimeouts.ReadTotalTimeoutConstant = 0; Win_CommTimeouts.WriteTotalTimeoutMultiplier = sec*1000+millisec; Win_CommTimeouts.WriteTotalTimeoutConstant = 0; SetCommTimeouts(Win_Handle, &Win_CommTimeouts); } UNLOCK_MUTEX(); } qlandkartegt-1.7.5/3rdparty/SerialPort/qextserialbase.h000644 001750 000144 00000011177 12225261330 024222 0ustar00oeichlerusers000000 000000 #ifndef _QEXTSERIALBASE_H_ #define _QEXTSERIALBASE_H_ #include #include #ifdef QT_THREAD_SUPPORT #include #include #endif /*if all warning messages are turned off, flag portability warnings to be turned off as well*/ #ifdef _TTY_NOWARN_ #define _TTY_NOWARN_PORT_ #endif /*macros for thread support*/ #ifdef QT_THREAD_SUPPORT #define LOCK_MUTEX() mutex->lock() #define UNLOCK_MUTEX() mutex->unlock() #else #define LOCK_MUTEX() #define UNLOCK_MUTEX() #endif /*macros for warning messages*/ #ifdef _TTY_NOWARN_PORT_ #define TTY_PORTABILITY_WARNING(s) #else #define TTY_PORTABILITY_WARNING(s) qWarning(s) #endif #ifdef _TTY_NOWARN_ #define TTY_WARNING(s) #else #define TTY_WARNING(s) qWarning(s) #endif /*line status constants*/ #define LS_CTS 0x01 #define LS_DSR 0x02 #define LS_DCD 0x04 #define LS_RI 0x08 #define LS_RTS 0x10 #define LS_DTR 0x20 #define LS_ST 0x40 #define LS_SR 0x80 /*error constants*/ #define E_NO_ERROR 0 #define E_INVALID_FD 1 #define E_NO_MEMORY 2 #define E_CAUGHT_NON_BLOCKED_SIGNAL 3 #define E_PORT_TIMEOUT 4 #define E_INVALID_DEVICE 5 #define E_BREAK_CONDITION 6 #define E_FRAMING_ERROR 7 #define E_IO_ERROR 8 #define E_BUFFER_OVERRUN 9 #define E_RECEIVE_OVERFLOW 10 #define E_RECEIVE_PARITY_ERROR 11 #define E_TRANSMIT_OVERFLOW 12 #define E_READ_FAILED 13 #define E_WRITE_FAILED 14 /*enums for port settings*/ enum NamingConvention { WIN_NAMES, IRIX_NAMES, HPUX_NAMES, SUN_NAMES, DIGITAL_NAMES, FREEBSD_NAMES, LINUX_NAMES }; enum BaudRateType { BAUD50, //POSIX ONLY BAUD75, //POSIX ONLY BAUD110, BAUD134, //POSIX ONLY BAUD150, //POSIX ONLY BAUD200, //POSIX ONLY BAUD300, BAUD600, BAUD1200, BAUD1800, //POSIX ONLY BAUD2400, BAUD4800, BAUD9600, BAUD14400, //WINDOWS ONLY BAUD19200, BAUD38400, BAUD56000, //WINDOWS ONLY BAUD57600, BAUD76800, //POSIX ONLY BAUD115200, BAUD128000, //WINDOWS ONLY BAUD256000 //WINDOWS ONLY }; enum DataBitsType { DATA_5, DATA_6, DATA_7, DATA_8 }; enum ParityType { PAR_NONE, PAR_ODD, PAR_EVEN, PAR_MARK, //WINDOWS ONLY PAR_SPACE }; enum StopBitsType { STOP_1, STOP_1_5, //WINDOWS ONLY STOP_2 }; enum FlowType { FLOW_OFF, FLOW_HARDWARE, FLOW_XONXOFF }; /*structure to contain port settings*/ struct PortSettings { BaudRateType BaudRate; DataBitsType DataBits; ParityType Parity; StopBitsType StopBits; FlowType FlowControl; ulong Timeout_Sec; ulong Timeout_Millisec; }; class QextSerialBase : public QIODevice { public: QextSerialBase(); QextSerialBase(const QString & name); virtual ~QextSerialBase(); virtual void construct(); virtual void setPortName(const QString & name); virtual QString portName() const; virtual void setBaudRate(BaudRateType)=0; virtual BaudRateType baudRate() const; virtual void setDataBits(DataBitsType)=0; virtual DataBitsType dataBits() const; virtual void setParity(ParityType)=0; virtual ParityType parity() const; virtual void setStopBits(StopBitsType)=0; virtual StopBitsType stopBits() const; virtual void setFlowControl(FlowType)=0; virtual FlowType flowControl() const; virtual void setTimeout(ulong, ulong)=0; virtual bool open(OpenMode mode=0)=0; virtual bool isSequential() const; virtual void close()=0; virtual void flush()=0; virtual qint64 size() const=0; virtual qint64 bytesAvailable()=0; virtual bool atEnd() const; virtual void ungetChar(char c)=0; virtual qint64 readLine(char * data, qint64 maxSize); virtual ulong lastError() const; virtual void translateError(ulong error)=0; virtual void setDtr(bool set=true)=0; virtual void setRts(bool set=true)=0; virtual ulong lineStatus()=0; protected: QString port; PortSettings Settings; ulong lastErr; #ifdef QT_THREAD_SUPPORT static QMutex* mutex; static ulong refCount; #endif virtual qint64 readData(char * data, qint64 maxSize)=0; virtual qint64 writeData(const char * data, qint64 maxSize)=0; }; #endif qlandkartegt-1.7.5/3rdparty/SerialPort/posix_qextserialport.cpp000644 001750 000144 00000077235 12225261330 026060 0ustar00oeichlerusers000000 000000 /*! \class Posix_QextSerialPort \version 1.0.0 \author Stefan Sander A cross-platform serial port class. This class encapsulates the POSIX portion of QextSerialPort. The user will be notified of errors and possible portability conflicts at run-time by default - this behavior can be turned off by defining _TTY_NOWARN_ (to turn off all warnings) or _TTY_NOWARN_PORT_ (to turn off portability warnings) in the project. Note that _TTY_NOWARN_ will also turn off portability warnings. */ #include #include "posix_qextserialport.h" /*! \fn Posix_QextSerialPort::Posix_QextSerialPort() Default constructor. Note that the name of the device used by a QextSerialPort constructed with this constructor will be determined by #defined constants, or lack thereof - the default behavior is the same as _TTY_LINUX_. Possible naming conventions and their associated constants are: \verbatim Constant Used By Naming Convention ---------- ------------- ------------------------ _TTY_WIN_ Windows COM1, COM2 _TTY_IRIX_ SGI/IRIX /dev/ttyf1, /dev/ttyf2 _TTY_HPUX_ HP-UX /dev/tty1p0, /dev/tty2p0 _TTY_SUN_ SunOS/Solaris /dev/ttya, /dev/ttyb _TTY_DIGITAL_ Digital UNIX /dev/tty01, /dev/tty02 _TTY_FREEBSD_ FreeBSD /dev/ttyd0, /dev/ttyd1 _TTY_LINUX_ Linux /dev/ttyS0, /dev/ttyS1 Linux /dev/ttyS0, /dev/ttyS1 \endverbatim This constructor assigns the device name to the name of the first port on the specified system. See the other constructors if you need to open a different port. */ Posix_QextSerialPort::Posix_QextSerialPort() : QextSerialBase() { Posix_File=new QFile(); } /*! \fn Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort&) Copy constructor. */ Posix_QextSerialPort::Posix_QextSerialPort(const Posix_QextSerialPort& s) : QextSerialBase(s.port) { setOpenMode(s.openMode()); port = s.port; Settings.BaudRate=s.Settings.BaudRate; Settings.DataBits=s.Settings.DataBits; Settings.Parity=s.Settings.Parity; Settings.StopBits=s.Settings.StopBits; Settings.FlowControl=s.Settings.FlowControl; lastErr=s.lastErr; Posix_File=new QFile(); Posix_File=s.Posix_File; memcpy(&Posix_Timeout, &s.Posix_Timeout, sizeof(struct timeval)); memcpy(&Posix_Copy_Timeout, &s.Posix_Copy_Timeout, sizeof(struct timeval)); memcpy(&Posix_CommConfig, &s.Posix_CommConfig, sizeof(struct termios)); } /*! \fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name) Constructs a serial port attached to the port specified by name. name is the name of the device, which is windowsystem-specific, e.g."COM1" or "/dev/ttyS0". */ Posix_QextSerialPort::Posix_QextSerialPort(const QString & name) : QextSerialBase(name) { Posix_File=new QFile(); } /*! \fn Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) Constructs a port with default name and specified settings. */ Posix_QextSerialPort::Posix_QextSerialPort(const PortSettings& settings) : QextSerialBase() { setBaudRate(settings.BaudRate); setDataBits(settings.DataBits); setParity(settings.Parity); setStopBits(settings.StopBits); setFlowControl(settings.FlowControl); Posix_File=new QFile(); setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); } /*! \fn Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) Constructs a port with specified name and settings. */ Posix_QextSerialPort::Posix_QextSerialPort(const QString & name, const PortSettings& settings) : QextSerialBase(name) { setBaudRate(settings.BaudRate); setDataBits(settings.DataBits); setParity(settings.Parity); setStopBits(settings.StopBits); setFlowControl(settings.FlowControl); Posix_File=new QFile(); setTimeout(settings.Timeout_Sec, settings.Timeout_Millisec); } /*! \fn Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) Override the = operator. */ Posix_QextSerialPort& Posix_QextSerialPort::operator=(const Posix_QextSerialPort& s) { setOpenMode(s.openMode()); port = s.port; Settings.BaudRate=s.Settings.BaudRate; Settings.DataBits=s.Settings.DataBits; Settings.Parity=s.Settings.Parity; Settings.StopBits=s.Settings.StopBits; Settings.FlowControl=s.Settings.FlowControl; lastErr=s.lastErr; Posix_File=s.Posix_File; memcpy(&Posix_Timeout, &(s.Posix_Timeout), sizeof(struct timeval)); memcpy(&Posix_Copy_Timeout, &(s.Posix_Copy_Timeout), sizeof(struct timeval)); memcpy(&Posix_CommConfig, &(s.Posix_CommConfig), sizeof(struct termios)); return *this; } /*! \fn Posix_QextSerialPort::~Posix_QextSerialPort() Standard destructor. */ Posix_QextSerialPort::~Posix_QextSerialPort() { if (isOpen()) { close(); } Posix_File->close(); delete Posix_File; } /*! \fn void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) Sets the baud rate of the serial port. Note that not all rates are applicable on all platforms. The following table shows translations of the various baud rate constants on Windows(including NT/2000) and POSIX platforms. Speeds marked with an * are speeds that are usable on both Windows and POSIX. \note BAUD76800 may not be supported on all POSIX systems. SGI/IRIX systems do not support BAUD1800. \verbatim RATE Windows Speed POSIX Speed ----------- ------------- ----------- BAUD50 110 50 BAUD75 110 75 *BAUD110 110 110 BAUD134 110 134.5 BAUD150 110 150 BAUD200 110 200 *BAUD300 300 300 *BAUD600 600 600 *BAUD1200 1200 1200 BAUD1800 1200 1800 *BAUD2400 2400 2400 *BAUD4800 4800 4800 *BAUD9600 9600 9600 BAUD14400 14400 9600 *BAUD19200 19200 19200 *BAUD38400 38400 38400 BAUD56000 56000 38400 *BAUD57600 57600 57600 BAUD76800 57600 76800 *BAUD115200 115200 115200 BAUD128000 128000 115200 BAUD256000 256000 115200 \endverbatim */ void Posix_QextSerialPort::setBaudRate(BaudRateType baudRate) { LOCK_MUTEX(); if (Settings.BaudRate!=baudRate) { switch (baudRate) { case BAUD14400: Settings.BaudRate=BAUD9600; break; case BAUD56000: Settings.BaudRate=BAUD38400; break; case BAUD76800: #ifndef B76800 Settings.BaudRate=BAUD57600; #else Settings.BaudRate=baudRate; #endif break; case BAUD128000: case BAUD256000: Settings.BaudRate=BAUD115200; break; default: Settings.BaudRate=baudRate; break; } } if (isOpen()) { switch (baudRate) { /*50 baud*/ case BAUD50: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 50 baud operation."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B50; #else cfsetispeed(&Posix_CommConfig, B50); cfsetospeed(&Posix_CommConfig, B50); #endif break; /*75 baud*/ case BAUD75: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 75 baud operation."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B75; #else cfsetispeed(&Posix_CommConfig, B75); cfsetospeed(&Posix_CommConfig, B75); #endif break; /*110 baud*/ case BAUD110: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B110; #else cfsetispeed(&Posix_CommConfig, B110); cfsetospeed(&Posix_CommConfig, B110); #endif break; /*134.5 baud*/ case BAUD134: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 134.5 baud operation."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B134; #else cfsetispeed(&Posix_CommConfig, B134); cfsetospeed(&Posix_CommConfig, B134); #endif break; /*150 baud*/ case BAUD150: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 150 baud operation."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B150; #else cfsetispeed(&Posix_CommConfig, B150); cfsetospeed(&Posix_CommConfig, B150); #endif break; /*200 baud*/ case BAUD200: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows does not support 200 baud operation."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B200; #else cfsetispeed(&Posix_CommConfig, B200); cfsetospeed(&Posix_CommConfig, B200); #endif break; /*300 baud*/ case BAUD300: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B300; #else cfsetispeed(&Posix_CommConfig, B300); cfsetospeed(&Posix_CommConfig, B300); #endif break; /*600 baud*/ case BAUD600: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B600; #else cfsetispeed(&Posix_CommConfig, B600); cfsetospeed(&Posix_CommConfig, B600); #endif break; /*1200 baud*/ case BAUD1200: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B1200; #else cfsetispeed(&Posix_CommConfig, B1200); cfsetospeed(&Posix_CommConfig, B1200); #endif break; /*1800 baud*/ case BAUD1800: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and IRIX do not support 1800 baud operation."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B1800; #else cfsetispeed(&Posix_CommConfig, B1800); cfsetospeed(&Posix_CommConfig, B1800); #endif break; /*2400 baud*/ case BAUD2400: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B2400; #else cfsetispeed(&Posix_CommConfig, B2400); cfsetospeed(&Posix_CommConfig, B2400); #endif break; /*4800 baud*/ case BAUD4800: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B4800; #else cfsetispeed(&Posix_CommConfig, B4800); cfsetospeed(&Posix_CommConfig, B4800); #endif break; /*9600 baud*/ case BAUD9600: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B9600; #else cfsetispeed(&Posix_CommConfig, B9600); cfsetospeed(&Posix_CommConfig, B9600); #endif break; /*14400 baud*/ case BAUD14400: TTY_WARNING("Posix_QextSerialPort: POSIX does not support 14400 baud operation. Switching to 9600 baud."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B9600; #else cfsetispeed(&Posix_CommConfig, B9600); cfsetospeed(&Posix_CommConfig, B9600); #endif break; /*19200 baud*/ case BAUD19200: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B19200; #else cfsetispeed(&Posix_CommConfig, B19200); cfsetospeed(&Posix_CommConfig, B19200); #endif break; /*38400 baud*/ case BAUD38400: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B38400; #else cfsetispeed(&Posix_CommConfig, B38400); cfsetospeed(&Posix_CommConfig, B38400); #endif break; /*56000 baud*/ case BAUD56000: TTY_WARNING("Posix_QextSerialPort: POSIX does not support 56000 baud operation. Switching to 38400 baud."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B38400; #else cfsetispeed(&Posix_CommConfig, B38400); cfsetospeed(&Posix_CommConfig, B38400); #endif break; /*57600 baud*/ case BAUD57600: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B57600; #else cfsetispeed(&Posix_CommConfig, B57600); cfsetospeed(&Posix_CommConfig, B57600); #endif break; /*76800 baud*/ case BAUD76800: TTY_PORTABILITY_WARNING("Posix_QextSerialPort Portability Warning: Windows and some POSIX systems do not support 76800 baud operation."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); #ifdef B76800 Posix_CommConfig.c_cflag|=B76800; #else TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); Posix_CommConfig.c_cflag|=B57600; #endif //B76800 #else //CBAUD #ifdef B76800 cfsetispeed(&Posix_CommConfig, B76800); cfsetospeed(&Posix_CommConfig, B76800); #else TTY_WARNING("Posix_QextSerialPort: Posix_QextSerialPort was compiled without 76800 baud support. Switching to 57600 baud."); cfsetispeed(&Posix_CommConfig, B57600); cfsetospeed(&Posix_CommConfig, B57600); #endif //B76800 #endif //CBAUD break; /*115200 baud*/ case BAUD115200: #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B115200; #else cfsetispeed(&Posix_CommConfig, B115200); cfsetospeed(&Posix_CommConfig, B115200); #endif break; /*128000 baud*/ case BAUD128000: TTY_WARNING("Posix_QextSerialPort: POSIX does not support 128000 baud operation. Switching to 115200 baud."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B115200; #else cfsetispeed(&Posix_CommConfig, B115200); cfsetospeed(&Posix_CommConfig, B115200); #endif break; /*256000 baud*/ case BAUD256000: TTY_WARNING("Posix_QextSerialPort: POSIX does not support 256000 baud operation. Switching to 115200 baud."); #ifdef CBAUD Posix_CommConfig.c_cflag&=(~CBAUD); Posix_CommConfig.c_cflag|=B115200; #else cfsetispeed(&Posix_CommConfig, B115200); cfsetospeed(&Posix_CommConfig, B115200); #endif break; } tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } UNLOCK_MUTEX(); } /*! \fn void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) Sets the number of data bits used by the serial port. Possible values of dataBits are: \verbatim DATA_5 5 data bits DATA_6 6 data bits DATA_7 7 data bits DATA_8 8 data bits \endverbatim \note This function is subject to the following restrictions: \par 5 data bits cannot be used with 2 stop bits. \par 8 data bits cannot be used with space parity on POSIX systems. */ void Posix_QextSerialPort::setDataBits(DataBitsType dataBits) { LOCK_MUTEX(); if (Settings.DataBits!=dataBits) { if ((Settings.StopBits==STOP_2 && dataBits==DATA_5) || (Settings.StopBits==STOP_1_5 && dataBits!=DATA_5) || (Settings.Parity==PAR_SPACE && dataBits==DATA_8)) { } else { Settings.DataBits=dataBits; } } if (isOpen()) { switch(dataBits) { /*5 data bits*/ case DATA_5: if (Settings.StopBits==STOP_2) { TTY_WARNING("Posix_QextSerialPort: 5 Data bits cannot be used with 2 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS5; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*6 data bits*/ case DATA_6: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Posix_QextSerialPort: 6 Data bits cannot be used with 1.5 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS6; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*7 data bits*/ case DATA_7: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Posix_QextSerialPort: 7 Data bits cannot be used with 1.5 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS7; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*8 data bits*/ case DATA_8: if (Settings.StopBits==STOP_1_5) { TTY_WARNING("Posix_QextSerialPort: 8 Data bits cannot be used with 1.5 stop bits."); } else { Settings.DataBits=dataBits; Posix_CommConfig.c_cflag&=(~CSIZE); Posix_CommConfig.c_cflag|=CS8; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; } } UNLOCK_MUTEX(); } /*! \fn void Posix_QextSerialPort::setParity(ParityType parity) Sets the parity associated with the serial port. The possible values of parity are: \verbatim PAR_SPACE Space Parity PAR_MARK Mark Parity PAR_NONE No Parity PAR_EVEN Even Parity PAR_ODD Odd Parity \endverbatim \note This function is subject to the following limitations: \par POSIX systems do not support mark parity. \par POSIX systems support space parity only if tricked into doing so, and only with fewer than 8 data bits. Use space parity very carefully with POSIX systems. */ void Posix_QextSerialPort::setParity(ParityType parity) { LOCK_MUTEX(); if (Settings.Parity!=parity) { if (parity==PAR_MARK || (parity==PAR_SPACE && Settings.DataBits==DATA_8)) { } else { Settings.Parity=parity; } } if (isOpen()) { switch (parity) { /*space parity*/ case PAR_SPACE: if (Settings.DataBits==DATA_8) { TTY_PORTABILITY_WARNING("Posix_QextSerialPort: Space parity is only supported in POSIX with 7 or fewer data bits"); } else { /*space parity not directly supported - add an extra data bit to simulate it*/ Posix_CommConfig.c_cflag&=~(PARENB|CSIZE); switch(Settings.DataBits) { case DATA_5: Settings.DataBits=DATA_6; Posix_CommConfig.c_cflag|=CS6; break; case DATA_6: Settings.DataBits=DATA_7; Posix_CommConfig.c_cflag|=CS7; break; case DATA_7: Settings.DataBits=DATA_8; Posix_CommConfig.c_cflag|=CS8; break; case DATA_8: break; } tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; /*mark parity - WINDOWS ONLY*/ case PAR_MARK: TTY_WARNING("Posix_QextSerialPort: Mark parity is not supported by POSIX."); break; /*no parity*/ case PAR_NONE: Posix_CommConfig.c_cflag&=(~PARENB); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*even parity*/ case PAR_EVEN: Posix_CommConfig.c_cflag&=(~PARODD); Posix_CommConfig.c_cflag|=PARENB; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*odd parity*/ case PAR_ODD: Posix_CommConfig.c_cflag|=(PARENB|PARODD); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; } } UNLOCK_MUTEX(); } /*! \fn void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) Sets the number of stop bits used by the serial port. Possible values of stopBits are: \verbatim STOP_1 1 stop bit STOP_1_5 1.5 stop bits STOP_2 2 stop bits \endverbatim \note This function is subject to the following restrictions: \par 2 stop bits cannot be used with 5 data bits. \par POSIX does not support 1.5 stop bits. */ void Posix_QextSerialPort::setStopBits(StopBitsType stopBits) { LOCK_MUTEX(); if (Settings.StopBits!=stopBits) { if ((Settings.DataBits==DATA_5 && stopBits==STOP_2) || stopBits==STOP_1_5) {} else { Settings.StopBits=stopBits; } } if (isOpen()) { switch (stopBits) { /*one stop bit*/ case STOP_1: Settings.StopBits=stopBits; Posix_CommConfig.c_cflag&=(~CSTOPB); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*1.5 stop bits*/ case STOP_1_5: TTY_WARNING("Posix_QextSerialPort: 1.5 stop bit operation is not supported by POSIX."); break; /*two stop bits*/ case STOP_2: if (Settings.DataBits==DATA_5) { TTY_WARNING("Posix_QextSerialPort: 2 stop bits cannot be used with 5 data bits"); } else { Settings.StopBits=stopBits; Posix_CommConfig.c_cflag|=CSTOPB; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } break; } } UNLOCK_MUTEX(); } /*! \fn void Posix_QextSerialPort::setFlowControl(FlowType flow) Sets the flow control used by the port. Possible values of flow are: \verbatim FLOW_OFF No flow control FLOW_HARDWARE Hardware (RTS/CTS) flow control FLOW_XONXOFF Software (XON/XOFF) flow control \endverbatim \note FLOW_HARDWARE may not be supported on all versions of UNIX. In cases where it is unsupported, FLOW_HARDWARE is the same as FLOW_OFF. */ void Posix_QextSerialPort::setFlowControl(FlowType flow) { LOCK_MUTEX(); if (Settings.FlowControl!=flow) { Settings.FlowControl=flow; } if (isOpen()) { switch(flow) { /*no flow control*/ case FLOW_OFF: Posix_CommConfig.c_cflag&=(~CRTSCTS); Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; /*software (XON/XOFF) flow control*/ case FLOW_XONXOFF: Posix_CommConfig.c_cflag&=(~CRTSCTS); Posix_CommConfig.c_iflag|=(IXON|IXOFF|IXANY); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; case FLOW_HARDWARE: Posix_CommConfig.c_cflag|=CRTSCTS; Posix_CommConfig.c_iflag&=(~(IXON|IXOFF|IXANY)); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); break; } } UNLOCK_MUTEX(); } /*! \fn void Posix_QextSerialPort::setTimeout(ulong sec, ulong millisec); Sets the read and write timeouts for the port to sec seconds and millisec milliseconds. Note that this is a per-character timeout, i.e. the port will wait this long for each individual character, not for the whole read operation. This timeout also applies to the bytesWaiting() function. \note POSIX does not support millisecond-level control for I/O timeout values. Any timeout set using this function will be set to the next lowest tenth of a second for the purposes of detecting read or write timeouts. For example a timeout of 550 milliseconds will be seen by the class as a timeout of 500 milliseconds for the purposes of reading and writing the port. However millisecond-level control is allowed by the select() system call, so for example a 550-millisecond timeout will be seen as 550 milliseconds on POSIX systems for the purpose of detecting available bytes in the read buffer. */ void Posix_QextSerialPort::setTimeout(ulong sec, ulong millisec) { LOCK_MUTEX(); Settings.Timeout_Sec=sec; Settings.Timeout_Millisec=millisec; Posix_Copy_Timeout.tv_sec=sec; Posix_Copy_Timeout.tv_usec=millisec; if (isOpen()) { tcgetattr(Posix_File->handle(), &Posix_CommConfig); Posix_CommConfig.c_cc[VTIME]=sec*10+millisec/100; tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } UNLOCK_MUTEX(); } /*! \fn bool Posix_QextSerialPort::open(OpenMode mode) Opens the serial port associated to this class. This function has no effect if the port associated with the class is already open. The port is also configured to the current settings, as stored in the Settings structure. */ bool Posix_QextSerialPort::open(OpenMode mode) { LOCK_MUTEX(); if (mode == QIODevice::NotOpen) return isOpen(); if (!isOpen()) { /*open the port*/ Posix_File->setFileName(port); if (Posix_File->open(QIODevice::ReadWrite|QIODevice::Unbuffered)) { /*set open mode*/ QIODevice::open(mode); /*configure port settings*/ tcgetattr(Posix_File->handle(), &Posix_CommConfig); /*set up other port settings*/ Posix_CommConfig.c_cflag|=CREAD|CLOCAL; Posix_CommConfig.c_lflag&=(~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ISIG)); Posix_CommConfig.c_iflag&=(~(INPCK|IGNPAR|PARMRK|ISTRIP|ICRNL|IXANY)); Posix_CommConfig.c_oflag&=(~OPOST); Posix_CommConfig.c_cc[VMIN]=0; Posix_CommConfig.c_cc[VINTR] = _POSIX_VDISABLE; Posix_CommConfig.c_cc[VQUIT] = _POSIX_VDISABLE; Posix_CommConfig.c_cc[VSTART] = _POSIX_VDISABLE; Posix_CommConfig.c_cc[VSTOP] = _POSIX_VDISABLE; Posix_CommConfig.c_cc[VSUSP] = _POSIX_VDISABLE; setBaudRate(Settings.BaudRate); setDataBits(Settings.DataBits); setParity(Settings.Parity); setStopBits(Settings.StopBits); setFlowControl(Settings.FlowControl); setTimeout(Settings.Timeout_Sec, Settings.Timeout_Millisec); tcsetattr(Posix_File->handle(), TCSAFLUSH, &Posix_CommConfig); } else { } } UNLOCK_MUTEX(); return isOpen(); } /*! \fn void Posix_QextSerialPort::close() Closes a serial port. This function has no effect if the serial port associated with the class is not currently open. */ void Posix_QextSerialPort::close() { LOCK_MUTEX(); Posix_File->close(); QIODevice::close(); UNLOCK_MUTEX(); } /*! \fn void Posix_QextSerialPort::flush() Flushes all pending I/O to the serial port. This function has no effect if the serial port associated with the class is not currently open. */ void Posix_QextSerialPort::flush() { LOCK_MUTEX(); if (isOpen()) { Posix_File->flush(); } UNLOCK_MUTEX(); } /*! \fn qint64 Posix_QextSerialPort::size() const This function will return the number of bytes waiting in the receive queue of the serial port. It is included primarily to provide a complete QIODevice interface, and will not record errors in the lastErr member (because it is const). This function is also not thread-safe - in multithreading situations, use Posix_QextSerialPort::bytesWaiting() instead. */ qint64 Posix_QextSerialPort::size() const { int numBytes; if (ioctl(Posix_File->handle(), FIONREAD, &numBytes)<0) { numBytes=0; } return (qint64)numBytes; } /*! \fn qint64 Posix_QextSerialPort::bytesAvailable() Returns the number of bytes waiting in the port's receive queue. This function will return 0 if the port is not currently open, or -1 on error. Error information can be retrieved by calling Posix_QextSerialPort::getLastError(). */ qint64 Posix_QextSerialPort::bytesAvailable() { LOCK_MUTEX(); if (isOpen()) { int bytesQueued; fd_set fileSet; FD_ZERO(&fileSet); FD_SET(Posix_File->handle(), &fileSet); /*on Linux systems the Posix_Timeout structure will be altered by the select() call. Make sure we use the right timeout values*/ //memcpy(&Posix_Timeout, &Posix_Copy_Timeout, sizeof(struct timeval)); Posix_Timeout = Posix_Copy_Timeout; int n=select(Posix_File->handle()+1, &fileSet, NULL, &fileSet, &Posix_Timeout); if (!n) { lastErr=E_PORT_TIMEOUT; UNLOCK_MUTEX(); return -1; } if (n==-1 || ioctl(Posix_File->handle(), FIONREAD, &bytesQueued)==-1) { translateError(errno); UNLOCK_MUTEX(); return -1; } lastErr=E_NO_ERROR; UNLOCK_MUTEX(); return bytesQueued + QIODevice::bytesAvailable(); } UNLOCK_MUTEX(); return 0; } /*! \fn void Posix_QextSerialPort::ungetChar(char) This function is included to implement the full QIODevice interface, and currently has no purpose within this class. This function is meaningless on an unbuffered device and currently only prints a warning message to that effect. */ void Posix_QextSerialPort::ungetChar(char) { /*meaningless on unbuffered sequential device - return error and print a warning*/ TTY_WARNING("Posix_QextSerialPort: ungetChar() called on an unbuffered sequential device - operation is meaningless"); } /*! \fn void Posix_QextSerialPort::translateError(ulong error) Translates a system-specific error code to a QextSerialPort error code. Used internally. */ void Posix_QextSerialPort::translateError(ulong error) { switch (error) { case EBADF: case ENOTTY: lastErr=E_INVALID_FD; break; case EINTR: lastErr=E_CAUGHT_NON_BLOCKED_SIGNAL; break; case ENOMEM: lastErr=E_NO_MEMORY; break; } } /*! \fn void Posix_QextSerialPort::setDtr(bool set) Sets DTR line to the requested state (high by default). This function will have no effect if the port associated with the class is not currently open. */ void Posix_QextSerialPort::setDtr(bool set) { LOCK_MUTEX(); if (isOpen()) { int status; ioctl(Posix_File->handle(), TIOCMGET, &status); if (set) { status|=TIOCM_DTR; } else { status&=~TIOCM_DTR; } ioctl(Posix_File->handle(), TIOCMSET, &status); } UNLOCK_MUTEX(); } /*! \fn void Posix_QextSerialPort::setRts(bool set) Sets RTS line to the requested state (high by default). This function will have no effect if the port associated with the class is not currently open. */ void Posix_QextSerialPort::setRts(bool set) { LOCK_MUTEX(); if (isOpen()) { int status; ioctl(Posix_File->handle(), TIOCMGET, &status); if (set) { status|=TIOCM_RTS; } else { status&=~TIOCM_RTS; } ioctl(Posix_File->handle(), TIOCMSET, &status); } UNLOCK_MUTEX(); } /*! \fn unsigned long Posix_QextSerialPort::lineStatus() returns the line status as stored by the port function. This function will retrieve the states of the following lines: DCD, CTS, DSR, and RI. On POSIX systems, the following additional lines can be monitored: DTR, RTS, Secondary TXD, and Secondary RXD. The value returned is an unsigned long with specific bits indicating which lines are high. The following constants should be used to examine the states of individual lines: \verbatim Mask Line ------ ---- LS_CTS CTS LS_DSR DSR LS_DCD DCD LS_RI RI LS_RTS RTS (POSIX only) LS_DTR DTR (POSIX only) LS_ST Secondary TXD (POSIX only) LS_SR Secondary RXD (POSIX only) \endverbatim This function will return 0 if the port associated with the class is not currently open. */ unsigned long Posix_QextSerialPort::lineStatus() { unsigned long Status=0, Temp=0; LOCK_MUTEX(); if (isOpen()) { ioctl(Posix_File->handle(), TIOCMGET, &Temp); if (Temp&TIOCM_CTS) { Status|=LS_CTS; } if (Temp&TIOCM_DSR) { Status|=LS_DSR; } if (Temp&TIOCM_RI) { Status|=LS_RI; } if (Temp&TIOCM_CD) { Status|=LS_DCD; } if (Temp&TIOCM_DTR) { Status|=LS_DTR; } if (Temp&TIOCM_RTS) { Status|=LS_RTS; } if (Temp&TIOCM_ST) { Status|=LS_ST; } if (Temp&TIOCM_SR) { Status|=LS_SR; } } UNLOCK_MUTEX(); return Status; } /*! \fn qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) Reads a block of data from the serial port. This function will read at most maxSize bytes from the serial port and place them in the buffer pointed to by data. Return value is the number of bytes actually read, or -1 on error. \warning before calling this function ensure that serial port associated with this class is currently open (use isOpen() function to check if port is open). */ qint64 Posix_QextSerialPort::readData(char * data, qint64 maxSize) { LOCK_MUTEX(); int retVal=0; retVal=Posix_File->read(data, maxSize); if (retVal==-1) lastErr=E_READ_FAILED; UNLOCK_MUTEX(); return retVal; } /*! \fn qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) Writes a block of data to the serial port. This function will write maxSize bytes from the buffer pointed to by data to the serial port. Return value is the number of bytes actually written, or -1 on error. \warning before calling this function ensure that serial port associated with this class is currently open (use isOpen() function to check if port is open). */ qint64 Posix_QextSerialPort::writeData(const char * data, qint64 maxSize) { LOCK_MUTEX(); int retVal=0; retVal=Posix_File->write(data, maxSize); if (retVal==-1) lastErr=E_WRITE_FAILED; UNLOCK_MUTEX(); flush(); return retVal; } qlandkartegt-1.7.5/3rdparty/SerialPort/posix_qextserialport.h000644 001750 000144 00000002731 12225261330 025512 0ustar00oeichlerusers000000 000000 #ifndef _POSIX_QEXTSERIALPORT_H_ #define _POSIX_QEXTSERIALPORT_H_ #include #include #include #include #include #include #include #include "qextserialbase.h" class Posix_QextSerialPort:public QextSerialBase { public: Posix_QextSerialPort(); Posix_QextSerialPort(const Posix_QextSerialPort& s); Posix_QextSerialPort(const QString & name); Posix_QextSerialPort(const PortSettings& settings); Posix_QextSerialPort(const QString & name, const PortSettings& settings); Posix_QextSerialPort& operator=(const Posix_QextSerialPort& s); virtual ~Posix_QextSerialPort(); virtual void setBaudRate(BaudRateType); virtual void setDataBits(DataBitsType); virtual void setParity(ParityType); virtual void setStopBits(StopBitsType); virtual void setFlowControl(FlowType); virtual void setTimeout(ulong, ulong); virtual bool open(OpenMode mode=0); virtual void close(); virtual void flush(); virtual qint64 size() const; virtual qint64 bytesAvailable(); virtual void ungetChar(char c); virtual void translateError(ulong error); virtual void setDtr(bool set=true); virtual void setRts(bool set=true); virtual ulong lineStatus(); protected: QFile* Posix_File; struct termios Posix_CommConfig; struct timeval Posix_Timeout; struct timeval Posix_Copy_Timeout; virtual qint64 readData(char * data, qint64 maxSize); virtual qint64 writeData(const char * data, qint64 maxSize); }; #endif qlandkartegt-1.7.5/3rdparty/SerialPort/win_qextserialport.h000644 001750 000144 00000002636 12225261330 025151 0ustar00oeichlerusers000000 000000 #ifndef _WIN_QEXTSERIALPORT_H_ #define _WIN_QEXTSERIALPORT_H_ #include "qextserialbase.h" /*if all warning messages are turned off, flag portability warnings to be turned off as well*/ #ifdef _TTY_NOWARN_ #define _TTY_NOWARN_PORT_ #endif #include class Win_QextSerialPort:public QextSerialBase { public: Win_QextSerialPort(); Win_QextSerialPort(Win_QextSerialPort const& s); Win_QextSerialPort(const QString & name); Win_QextSerialPort(const PortSettings& settings); Win_QextSerialPort(const QString & name, const PortSettings& settings); Win_QextSerialPort& operator=(const Win_QextSerialPort& s); virtual ~Win_QextSerialPort(); virtual bool open(OpenMode mode=0); virtual void close(); virtual void flush(); virtual qint64 size() const; virtual void ungetChar(char c); virtual void setFlowControl(FlowType); virtual void setParity(ParityType); virtual void setDataBits(DataBitsType); virtual void setStopBits(StopBitsType); virtual void setBaudRate(BaudRateType); virtual void setDtr(bool set=true); virtual void setRts(bool set=true); virtual ulong lineStatus(void); virtual qint64 bytesAvailable(); virtual void translateError(ulong); virtual void setTimeout(ulong, ulong); protected: HANDLE Win_Handle; COMMCONFIG Win_CommConfig; COMMTIMEOUTS Win_CommTimeouts; virtual qint64 readData(char *data, qint64 maxSize); virtual qint64 writeData(const char *data, qint64 maxSize); }; #endif qlandkartegt-1.7.5/3rdparty/SerialPort/ManageSerialPort.cpp000644 001750 000144 00000031415 12225261330 024733 0ustar00oeichlerusers000000 000000 /******************************************************************************************************** * PROGRAM : QSerialPortTerminal * DATE - TIME : vendredi 03 octobre 2008 - 11h15 * AUTHOR : VIANNEY-LIAUD Philippe ( philippe.vianney.liaud gmail.com ) * FILENAME : ManageSerialPort.cpp * LICENSE : GPL * COMMENTARY : ********************************************************************************************************/ #include #include "ManageSerialPort.h" /******************************************************************************************************** * Classe ManageSerialPort *****************************************************************************************************/ //Constructeur ManageSerialPort::ManageSerialPort() { //Init pointeur a NULL threadSend = NULL; threadReceive = NULL; //Init des bool sendingEnabled = false; receivingEnabled = false; closeCalled = false; saveStateSendEnabled = false; saveStateReceivedEnabled = false; saveStateReceiveData = false; } ManageSerialPort::ManageSerialPort(const QString &name, const BaudRateType baudRate, \ const DataBitsType dataBits, const ParityType parity, \ const StopBitsType stopBits, const FlowType flowControl, \ ulong seconds, ulong milliseconds) { //Init pointeur a NULL threadSend = NULL; threadReceive = NULL; //Init des bool sendingEnabled = false; receivingEnabled = false; closeCalled = false; saveStateSendEnabled = false; saveStateReceivedEnabled = false; saveStateReceiveData = false; setPort(name); setBaudRate(baudRate); setDataBits(dataBits); setParity(parity); setStopBits(stopBits); setFlowControl(flowControl); setTimeout(seconds, milliseconds); } //Destructeur ManageSerialPort::~ManageSerialPort() { if (threadSend != NULL) { delete threadSend; threadSend = NULL; } if (threadReceive != NULL) { delete threadReceive; threadReceive = NULL; } if (isOpen()) extSerialPort.close(); } bool ManageSerialPort::open() { bool res = extSerialPort.open(QIODevice::ReadWrite); if (closeCalled) { if (saveStateSendEnabled) enableSending(); if (saveStateReceivedEnabled) enableReceiving(); if (saveStateReceiveData) receiveData(); closeCalled = false; } return res; } bool ManageSerialPort::open(const QString &name, const BaudRateType baudRate, \ const DataBitsType dataBits,const ParityType parity, \ const StopBitsType stopBits, const FlowType flowControl, \ ulong seconds, ulong milliseconds) { setPort(name); setBaudRate(baudRate); setDataBits(dataBits); setParity(parity); setStopBits(stopBits); setFlowControl(flowControl); setTimeout(seconds, milliseconds); bool res = extSerialPort.open(QIODevice::ReadWrite); return res; } bool ManageSerialPort::isOpen() { return extSerialPort.isOpen(); } void ManageSerialPort::close() { closeCalled = true; saveStateSendEnabled = isSendingEnabled(); saveStateReceivedEnabled = isReceivingEnabled(); disableSending(); disableReceiving(); extSerialPort.close(); } void ManageSerialPort::setPort(const QString &name) { extSerialPort.setPortName(name); } QString ManageSerialPort::getPort() { return extSerialPort.portName(); } void ManageSerialPort::setBaudRate(const BaudRateType baudRate) { extSerialPort.setBaudRate(baudRate); } QString ManageSerialPort::getBaudRate() { switch (extSerialPort.baudRate()) { case BAUD50: return QString("50"); case BAUD75: return QString("75"); case BAUD110: return QString("110"); case BAUD134: return QString("134"); case BAUD150: return QString("150"); case BAUD200: return QString("200"); case BAUD300: return QString("300"); case BAUD600: return QString("600"); case BAUD1200: return QString("1200"); case BAUD1800: return QString("1800"); case BAUD2400: return QString("2400"); case BAUD4800: return QString("4800"); case BAUD9600: return QString("9600"); case BAUD14400: return QString("14400"); case BAUD19200: return QString("19200"); case BAUD38400: return QString("38400"); case BAUD56000: return QString("56000"); case BAUD57600: return QString("57600"); case BAUD76800: return QString("76800"); case BAUD115200: return QString("115200"); case BAUD128000: return QString("128000"); case BAUD256000: return QString("256000"); } return 0; } void ManageSerialPort::setDataBits(const DataBitsType dataBits) { extSerialPort.setDataBits(dataBits); } QChar ManageSerialPort::getDataBits() { switch (extSerialPort.dataBits()) { case DATA_5: return QChar('5'); case DATA_6: return QChar('6'); case DATA_7: return QChar('7'); case DATA_8: return QChar('8'); } return 0; } void ManageSerialPort::setParity(const ParityType parity) { extSerialPort.setParity(parity); } QString ManageSerialPort::getParity() { switch (extSerialPort.parity()) { case PAR_NONE: return QString(tr("None")); case PAR_ODD: return QString(tr("Odd")); case PAR_EVEN: return QString(tr("Even")); case PAR_MARK: return QString(tr("Mark")); case PAR_SPACE: return QString(tr("Space")); } return 0; } void ManageSerialPort::setStopBits(const StopBitsType stopBits) { extSerialPort.setStopBits(stopBits); } QString ManageSerialPort::getStopBit() { switch (extSerialPort.stopBits()) { case STOP_1: return QString("1"); case STOP_1_5: return QString("1.5"); case STOP_2: return QString("2"); } return 0; } void ManageSerialPort::setFlowControl(const FlowType flowControl) { extSerialPort.setFlowControl(flowControl); } QString ManageSerialPort::getFlowControl() { switch (extSerialPort.flowControl()) { case FLOW_OFF: return QString(tr("None")); case FLOW_HARDWARE : return QString(tr("Hardware")); case FLOW_XONXOFF : return QString(tr("Xon/Xoff")); } return 0; } void ManageSerialPort::setTimeout(ulong seconds, ulong milliseconds) { extSerialPort.setTimeout(seconds,milliseconds); } /* QString ManageSerialPort::getLastErrorToString() { ulong res = extSerialPort.lastError(); switch (res) { case E_NO_ERROR: return QString(tr("No Error has occured")); case E_INVALID_FD: return QString(tr("Invalid file descriptor (port was not opened correctly)")); case E_NO_MEMORY: return QString(tr("Unable to allocate memory tables (POSIX)")); case E_CAUGHT_NON_BLOCKED_SIGNAL: return QString(tr("Caught a non-blocked signal (POSIX)")); case E_PORT_TIMEOUT: return QString(tr("Operation timed out (POSIX)")); case E_INVALID_DEVICE: return QString(tr("The file opened by the port is not a character device (POSIX)")); case E_BREAK_CONDITION: return QString(tr("The port detected a break condition")); case E_FRAMING_ERROR: return QString(tr("The port detected a framing error (usually caused by incorrect baud rate settings)")); case E_IO_ERROR: return QString(tr("There was an I/O error while communicating with the port")); case E_BUFFER_OVERRUN: return QString(tr("Character buffer overrun")); case E_RECEIVE_OVERFLOW: return QString(tr("Receive buffer overflow")); case E_RECEIVE_PARITY_ERROR: return QString(tr("The port detected a parity error in the received data")); case E_TRANSMIT_OVERFLOW: return QString(tr("Transmit buffer overflow")); case E_READ_FAILED: return QString(tr("General read operation failure")); case E_WRITE_FAILED: return QString(tr("General write operation failure")); } return 0; }*/ /* ulong ManageSerialPort::getLastError() { return extSerialPort.lastError(); } */ void ManageSerialPort::enableSending() { if (!sendingEnabled && threadSend == NULL) //Si l'envoi n'est pas active && si threadSend n'est pas alloue { threadSend = new ThreadSend(extSerialPort); sendingEnabled = true; } } void ManageSerialPort::disableSending() { if (sendingEnabled && threadSend != NULL) //Si l'envoi est active && si threadSend est alloue { delete (threadSend); threadSend = NULL; sendingEnabled = false; } } bool ManageSerialPort::isSendingEnabled() { return sendingEnabled; } uchar ManageSerialPort::sendData(QByteArray &dataToSend) { if (!isOpen()) //Si le port n'est pas ouvert return 2; if (!sendingEnabled || threadSend == NULL) //Si l'envoi n'est pas active || si threadSend n'est pas alloue return 3; threadSend->addDataToSend(dataToSend); //Ajout des donnees a envoyer return 1; } void ManageSerialPort::stopSending() { if (!sendingEnabled || threadSend == NULL) //Si l'envoi n'est pas active || si threadSend n'est pas été alloue return; if (threadSend->isRunning()) //si un envoi est en cour { threadSend->stopSending(); //on donne l'ordre d'arreter l'envoi long tmp = ULONG_MAX; threadSend->wait(tmp); //on attend l'arret } } void ManageSerialPort::enableReceiving() { if (!receivingEnabled && threadReceive == NULL) //Si la reception n'est pas active && si threadReceive n'est pas alloue { threadReceive = new ThreadReceive(extSerialPort); connect(threadReceive, SIGNAL(newDataReceived(const QByteArray &)), this, SIGNAL(newDataReceived(const QByteArray &))); receivingEnabled = true; } } void ManageSerialPort::disableReceiving() { if (receivingEnabled && threadReceive != NULL) //Si la reception est pas active && si threadReceive est alloue { delete (threadReceive); threadReceive = NULL; receivingEnabled = false; } } bool ManageSerialPort::isReceivingEnabled() { return receivingEnabled; } uchar ManageSerialPort::receiveData() { if (!isOpen()) //Si le port n'est pas ouvert return 2; if (!receivingEnabled || threadReceive == NULL) //Si la reception n'est pas active || si threadReceive n'est pas été alloue return 3; if (!threadReceive->isRunning()) { saveStateReceiveData = true; threadReceive->start(); //Demarrage du thread de reception } return 1; } void ManageSerialPort::stopReceiving() { if (!receivingEnabled || threadReceive == NULL) //Si la reception n'est pas active || si threadReceive n'est pas alloue return; if (threadReceive->isRunning()) //Si le thread de reception est en fonctionnement { saveStateReceiveData = false; threadReceive->stopReceiving(); //on donne l'ordre d'arreter la reception long tmp = ULONG_MAX; threadReceive->wait(tmp); //on attend l'arret } } /******************************************************************************************************** * Classe ThreadSend *****************************************************************************************************/ ThreadSend::ThreadSend(QextSerialPort &addressSerialPort) : extSerialPort(addressSerialPort) { dataToSend.clear(); stopped=false; } ThreadSend::~ThreadSend() { if (isRunning()) { stopSending(); wait(); } } void ThreadSend::addDataToSend(QByteArray &dataToAdd) { QMutexLocker locker(&mutexSend); for (int i=0; i 0) { extSerialPort.read(data, numBytes); for (int xy=1; xy < numBytes; xy++) { if (data[xy] == 0) { data[xy] = 'a'; } } data[numBytes]='\0'; dataReceived = data; emit newDataReceived(dataReceived); } mutexReceive.unlock(); } } qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapTypeConstructorBase000644 001750 000144 00000000024 12225261330 025302 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapSimpleType000644 001750 000144 00000000024 12225261330 023413 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapNamespaces000644 001750 000144 00000000024 12225261330 023377 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapMessage000644 001750 000144 00000000024 12225261330 022704 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/qtsoap.cpp000644 001750 000144 00000254700 12225261330 022274 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 "qtsoap.h" #include #include #include /*! \page qtsoap-overview.html \title Qt SOAP component \tableofcontents \target overview \section1 Overview of the SOAP support in the QtSoap classes QtSoapMessage provides an interface for creating, inspecting and modifying SOAP messages. It has convenience functions for generating method requests and inspecting method response messages, and also functions that provide easy access to SOAP Fault messages. The QtSoapType class allows you to inspect SOAP messages with no knowledge of XML or DOM. Header and body items are all derived from QtSoapType, and through easy accessors and iterators, this class and its derivatives make it easy to build arrays (QtSoapArray), structs (QtSoapStruct) and simple types like String, Integer and Boolean (QtSoapSimpleType). Finally, QtSoapHttpTransport provides a convenient way to submit SOAP messages to a host via the HTTP protocol. \target classes \section1 The SOAP classes \table \header \i Class \i Short description \row \i \l QtSoapMessage \i Represents a SOAP message \row \i \l QtSoapQName \i Represents qualified names (QNames) \row \i \l QtSoapType \i A superclass for all data constructs in a SOAP message. \row \i \l QtSoapArray \i Represents a SOAP array \row \i \l QtSoapArrayIterator \i Lets you iterate over all the values in a SOAP array \row \i \l QtSoapStruct \i Represents a SOAP struct \row \i \l QtSoapStructIterator \i Lets you iterate over all the values in a SOAP array \row \i \l QtSoapSimpleType \i Represents simple SOAP types such as String, Integer and Boolean. \row \i \l QtSoapHttpTransport \i Provides a method for transmitting SOAP messages to an HTTP server and for getting the SOAP reply. \endtable \target partial \section1 Status of the SOAP component This is a partial implementation of the SOAP v1.1 protocol. \list \i Server side SOAP is not supported. \i References to values (id and href attributes) are not supported. \i Only arrays with less than 5 dimensions are supported. \i Namespaces for types are not checked. Only the type names are used. \i The encodingStyle attribute is ignored. The serialization and encoding rules from section 5 in the SOAP v1.1 specification are assumed regardless of the value of the encodingStyle attribute. \i QtSoapType does not have accessors for attributes, which means for example that actor, mustUnderstand and so on are not accessible in headers. \i The SOAP root attribute is not supported. \endlist */ namespace { QString localName(const QString &tagName) { int pos; if ((pos = tagName.indexOf(':'))) return tagName.right(tagName.length() - pos - 1); return tagName; } QString prefix(const QString &tagName) { int pos; if ((pos = tagName.indexOf(':'))) return tagName.left(pos); return tagName; } } /*! \class QtSoapQName qtsoap.h \brief The QtSoapQName class provides a wrapper for QNames (names with namespaces). This class is used extensively in QtSoap to define and identify header and body elements, including method and argument names. The QtSoapQName consists of a name and a URI. The URI is used as the name's namespace, i.e. the name is qualified (hence 'Q'-Name) by the URI. The name() and uri() functions return the QNames's name and URI. The QtSoapQName can be empty. It can also have just a name with no URI. Special handling is often applied to a QtSoapQName that has no URI. Typically, if a QName with no namespace is used in an element in a SOAP document that already has a default namespace defined, then that namespace will be applied to the QName. \code QtSoapMessage message; message.setMethod(QtSoapQName("sendMessage", "http://messenging.example.com/")); message.addMethodArgument(QtSoapSimpleType(QtSoapQName("a"), 15)); \endcode */ /*! Constructs a QName. Sets the QName name to \a name and the URI to \a uri. */ QtSoapQName::QtSoapQName(const QString &name, const QString &uri) : n(name), nuri(uri) { } /*! Destructs the QtSoapQName. */ QtSoapQName::~QtSoapQName() { } /*! Returns QName's name. */ QString QtSoapQName::name() const { return n; } /*! Returns the QName's URI. */ QString QtSoapQName::uri() const { return nuri; } /*! Sets the QName's name to \a s, and sets the URI to an empty string. */ QtSoapQName &QtSoapQName::operator =(const QString &s) { n = s; nuri = ""; return *this; } /*! \fn bool operator==(const QtSoapQName &s1, const QtSoapQName &s2) \relates QtSoapQName If \a s2 has a non-empty URI, this function returns true if the merge of the URI and the name of \a s1 is equal to that of \a s2; otherwise it returns false. If \a s2 has an empty URI, this function returns true if the name of \a s1 is equal to the name of \a s2; otherwise it returns false. The comparison is case-insensitive. */ bool operator ==(const QtSoapQName &s1, const QtSoapQName &s2) { if (s2.uri() == "") return s1.name().toLower() == s2.name().toLower(); return s1.name().toLower() == s2.name().toLower() && s1.uri().toLower() == s2.uri().toLower(); } /*! \fn bool operator<(const QtSoapQName &s1, const QtSoapQName &s2) \relates QtSoapQName If \a s2 has a non-empty URI, this function returns true if the merge of the URI and the name of \a s1 is lexically less than that of \a s2; otherwise it returns false. If \a s2 has an empty URI, this function returns true if the name of \a s1 is lexically less than the name of \a s2; otherwise it returns false. The comparison is case-insensitive. */ bool operator <(const QtSoapQName &s1, const QtSoapQName &s2) { if (s2.uri() == "") return s1.name().toLower() < s2.name().toLower(); return (s1.uri().toLower()+s1.name().toLower()) < (s2.uri().toLower()+s2.name().toLower()); } /*! \class QtSoapType qtsoap.h \brief The QtSoapType class is the base class for all SOAP types in QtSoap. Although it is not used to create data types, a QtSoapType reference can be conveniently used to inspect a tree of QtSoapType subclasses. Accessors from this base class, such as operator[](), allow safe navigation. \code const QtSoapType &root = message.returnValue(); if (root["fault"].isValid()) { qWarning("Warning: %s", root["fault"]["faultstring"].toString().toLatin1().constData()); } \endcode This class holds the name(), type(), id() and href() of all its derived types. If a QtSoapType reference or pointer points to a QtSoapStruct, a QtSoapArray or a QtSoapSimpleType, isValid() returns true. \sa QtSoapStruct, QtSoapArray, QtSoapSimpleType */ /*! \class QtSoapStruct qtsoap.h \brief The QtSoapStruct class is an implementation of the SOAP struct type. A SOAP struct is a dictionary of QtSoapTypes where entries are looked up by name. Entries in a struct can be of any QtSoapType type, such as QtSoapArray, QtSoapStruct or QtSoapSimpleType. The struct can be created in several ways. parse() generates a struct by analyzing a QDomNode. insert() is used to add items manually. \code QtSoapStruct myStruct(QtSoapQName("myStruct")); myStruct.insert(new QtSoapSimpleType(QtSoapQName("item1"), 5)); myStruct.insert(new QtSoapSimpleType(QtSoapQName("item2"), "hello")); myStruct.insert(new QtSoapSimpleType(QtSoapQName("item3"), true)); \endcode Use the operator[]() or at() when looking up entries in a struct by name. If the names are unknown, QtSoapStructIterator lets you iterate through all the items. \code QtSoapType &helloItem = myStruct["Hello"]; \endcode toDomElement() converts the QtSoapStruct to a DomElement. \sa QtSoapStructIterator, QtSoapType, QtSoapArray, QtSoapSimpleType */ /*! \class QtSoapStructIterator \brief The QtSoapStructIterator class provides an iterator for traversing the items in a QtSoapStruct. The iterator is created by passing a QtSoapStruct to the constructor. It it not defined which item the iterator initially will point to. Neither is the order in which the items are processed. key() returns the name of the current item. data() and current() return a pointer to the current item, or 0 if there is none. operator++() navigates to the next item in the struct. \code for (QtSoapStructIterator it(myStruct); it.current(); ++it) { QtSoapType *item = it.data(); // process item } \endcode \sa QtSoapArrayIterator */ /*! \class QtSoapArray qtsoap.h \brief The QtSoapArray class is an implementation of the SOAP array type. A SOAP array is a sequence of QtSoapType objects such as QtSoapArrays, QtSoapStructs or QtSoapSimpleTypes, and they are accessible through their ordinal position. An array can be consecutive (0, 1, 2, 3, ...) or sparse (1, 5, 6, 10, ...) and they can be multidimensional ((0, 0), (0, 1), ...). QtSoapArray supports arrays of up to 5 dimensions. The size and dimensions of the array are set in the constructor. The default constructor produces a one dimensional array, with an unset size, meaning that the array can grow as required. All elements in a SOAP array must be of the same type. Inserting different types will result in a run time error. The parse() function builds the array by analyzing a QDomNode from a SOAP document. count() returns the number of items in the array. Retrieve items in the array with at() or operator[](). Note that operator[]() only works with one dimensional arrays, but there are at() functions for arrays of up to 5 dimensions. QtSoapArrayIterator lets you iterate through all items in an array. Use insert() or append() to insert items into an array manually. append() only works with one dimensional arrays. toDomElement() returns a QDomElement representation of the SOAP array. \code QtSoapArray array; array.insert(0, new QtSoapSimpleType(QtSoapQName("Peter"), "peter")); array.insert(1, new QtSoapSimpleType(QtSoapQName("Lisa"), "lisa")); array.insert(2, new QtSoapSimpleType(QtSoapQName("Paul"), "paul")); array.insert(3, new QtSoapSimpleType(QtSoapQName("Heather"), "heather")); \endcode \sa QtSoapType, QtSoapStruct, QtSoapSimpleType */ /*! \class QtSoapArrayIterator qtsoap.h \brief The QtSoapArrayIterator class provides an iterator for traversing the items in a QtSoapArray. The items are traversed in ascending order of index position, depth first. \code // Construct a 2x2 array of Strings. QtSoapArray array("Array of strings", String, 2, 2); array.insert(0, 0, new QtSoapSimpleType(Q4SoapQName("top left"), "top left"); array.insert(0, 1, new QtSoapSimpleType(Q4SoapQName("top right"), "top right"); array.insert(1, 0, new QtSoapSimpleType(Q4SoapQName("bottom left"), "bottom left"); array.insert(1, 1, new QtSoapSimpleType(Q4SoapQName("bottom right"), "bottom right"); // Traverse all items. QtSoapArrayIterator it(array); while (!it.current()) { // Find the position of the current element. int pos1, pos2; it.pos(&pos1, &pos2); qDebug() << "Position (" << pos1 << ", " << pos2 << ") is " << "the " << it.current()->toString() << " coordinate of the grid." << endl; ++it; } \endcode */ /*! \class QtSoapSimpleType qtsoap.h \brief The QtSoapSimpleType class provides a container for all simple SOAP types, such as strings, integers and booleans. \sa QtSoapType, QtSoapStruct, QtSoapArray */ /*! \enum QtSoapType::Type SOAP supports the types described in XML Schema Part 2: Datatypes listed at \l http://www.w3.org/TR/xmlschema-2/. The following values are represented using QtSoapSimpleType, except where noted. \value AnyURI \value Array Represented by QtSoapArray \value Base64Binary \value Boolean \value Byte \value Date \value DateTime \value Decimal \value Double \value Duration \value ENTITY \value Float \value GDay \value GMonth \value GMonthDay \value GYear \value GYearMonth \value HexBinary \value ID \value IDREF \value Int \value Integer \value Language \value Long \value NCName \value NMTOKEN \value NOTATION \value Name \value NegativeInteger \value NonNegativeInteger \value NonPositiveInteger \value NormalizedString \value Other \value PositiveInteger \value QName \value Short \value String \value Struct Represented by QtSoapStruct \value Time \value Token \value UnsignedByte \value UnsignedInt \value UnsignedLong \value UnsignedShort */ /*! Constructs a QtSoapType. */ QtSoapType::QtSoapType() { t = Other; errorStr = "Unknown error"; } /*! Constructs a QtSoapType whose name is \a name and type is \a type. This contructor is usually only called by constructors in subclasses. */ QtSoapType::QtSoapType(const QtSoapQName &name, Type type) : t(type), n(name) { errorStr = "Unknown error"; } /*! Creates a QtSoapType copy of \a copy. */ QtSoapType::QtSoapType(const QtSoapType ©) : t(copy.t), errorStr(copy.errorStr), i(copy.i), n(copy.n), u(copy.u), h(copy.h) { } /*! Destructs a QtSoapType. */ QtSoapType::~QtSoapType() { } /*! Clears any contents. In this base implementation, clear() does nothing. */ void QtSoapType::clear() { } /*! Makes this QtSoapType equal to \a copy. */ QtSoapType &QtSoapType::operator =(const QtSoapType ©) { t = copy.t; errorStr = copy.errorStr; i = copy.i; n = copy.n; u = copy.u; h = copy.h; return *this; } /*! Returns true if this object is of type QtSoapStruct, QtSoapArray or QtSoapSimpletype; otherwise returns false. */ bool QtSoapType::isValid() const { return false; } /*! Returns the QString equivalent of type \a t. */ QString QtSoapType::typeToName(QtSoapType::Type t) { switch (t) { case Duration: return "duration"; case DateTime: return "dateTime"; case Time: return "time"; case Date: return "date"; case GYearMonth: return "gYearMonth"; case GYear: return "gYear"; case GMonthDay: return "gMonthDay"; case GDay: return "gDay"; case GMonth: return "gMonth"; case Boolean: return "boolean"; case Base64Binary: return "base64Binary"; case HexBinary: return "hexBinary"; case Float: return "float"; case Double: return "double"; case AnyURI: return "anyURI"; case QName: return "QName"; case NOTATION: return "NOTATION"; case String: return "string"; case NormalizedString: return "normalizedString"; case Token: return "token"; case Language: return "language"; case Name: return "name"; case NMTOKEN: return "NMToken"; case NCName: return "NCName"; case ID: return "ID"; case IDREF: return "IDREF"; case ENTITY: return "ENTITY"; case Decimal: return "decimal"; case Integer: return "integer"; case NonPositiveInteger: return "nonPositiveInteger"; case NegativeInteger: return "negativeInteger"; case Long: return "long"; case Int: return "int"; case Short: return "short"; case Byte: return "byte"; case NonNegativeInteger: return "nonNegativeInteger"; case UnsignedLong: return "unsignedLong"; case PositiveInteger: return "positiveInteger"; case UnsignedInt: return "unsignedInt"; case UnsignedShort: return "unsignedShort"; case UnsignedByte: return "unsignedByte"; case Array: return "array"; case Struct: return "struct"; default: return "other"; } } /*! Returns the QtSoapType::Type called \a name. */ QtSoapType::Type QtSoapType::nameToType(const QString &name) { const QString type = name.trimmed().toLower(); if (type == "string") return String; else if (type == "normalizedstring") return NormalizedString; else if (type == "token") return Token; else if (type == "language") return Language; else if (type == "name") return Name; else if (type == "ncname") return NCName; else if (type == "nmtoken") return NMTOKEN; else if (type == "id") return ID; else if (type == "idref") return IDREF; else if (type == "entity") return ENTITY; else if (type == "base64binary") return Base64Binary; else if (type == "hexBinary") return HexBinary; else if (type == "anyuri") return AnyURI; else if (type == "qname") return QName; else if (type == "notation") return NOTATION; else if (type == "duration") return Duration; else if (type == "datetime") return DateTime; else if (type == "time") return Time; else if (type == "date") return Date; else if (type == "gyearmonth") return GYearMonth; else if (type == "gyear") return GYear; else if (type == "gmonthday") return GMonthDay; else if (type == "gday") return GDay; else if (type == "gmonth") return GMonth; else if (type == "decimal") return Decimal; else if (type == "integer") return Integer; else if (type == "nonPositiveinteger") return NonPositiveInteger; else if (type == "negativeinteger") return NegativeInteger; else if (type == "long") return Long; else if (type == "int") return Int; else if (type == "short") return Short; else if (type == "byte") return Byte; else if (type == "nonnegativeinteger") return NonNegativeInteger; else if (type == "unsignedlong") return UnsignedLong; else if (type == "unsignedint") return UnsignedInt; else if (type == "unsignedshort") return UnsignedShort; else if (type == "unsignedbyte") return UnsignedByte; else if (type == "positiveinteger") return PositiveInteger; else if (type == "float") return Float; else if (type == "double") return Double; else if (type == "boolean") return Boolean; else return Other; } /*! Returns QString::null. */ QString QtSoapType::toString() const { return QString::null; } /*! Returns 0. */ int QtSoapType::toInt() const { return 0; } /*! Returns false. */ bool QtSoapType::toBool() const { return false; } /*! Returns the QDomElement representation of this QtSoapType as a child of \a document. */ QDomElement QtSoapType::toDomElement(QDomDocument document) const { Q_UNUSED(document); return QDomElement(); } /*! Returns the QString representation of this QtSoapType's type. */ QString QtSoapType::typeName() const { return QtSoapType::typeToName(type()); } /*! Returns the type as a QtSoapType::Type. */ QtSoapType::Type QtSoapType::type() const { return t; } /*! Returns the QName (qualified name) of this QtSoapType. */ QtSoapQName QtSoapType::name() const { return n; } /*! Returns the ID of this QtSoapType. */ QString QtSoapType::id() const { return i; } /*! Returns the href attribute of this QtSoapType. */ QString QtSoapType::href() const { return h; } /*! Sets the QName (qualified name) of this QtSoapType to \a name. */ void QtSoapType::setName(const QtSoapQName &name) { this->n = name; } /*! Sets the ID of this QtSoapType to \a i. */ void QtSoapType::setId(const QString &i) { this->i = i; } /*! Sets the href attribute of this QtSoapType to \a h. */ void QtSoapType::setHref(const QString &h) { this->h = h; } /*! Returns the value of this QtSoapType. In the base implementation, an invalid QVariant() is returned. */ QVariant QtSoapType::value() const { return QVariant(); } /*! Returns a human readable explanation of the most recent error. */ QString QtSoapType::errorString() const { return errorStr; } /*! Returns the number of child items in this QtSoapType. In the base implementation, this returns 0. */ int QtSoapType::count() const { return 0; } /*! Returns a reference to the child item at ordinal position \a pos. If no item exists at this position, returns an empty QtSoapType. */ QtSoapType &QtSoapType::operator [](int /* pos */ ) { static QtSoapType NIL; return NIL; } /*! \overload Returns a reference to the child item whose QName (qualified name) is \a key. If no item exists with this key an empty QtSoapType is returned. */ QtSoapType &QtSoapType::operator [](const QtSoapQName & /* key */) { static QtSoapType NIL; return NIL; } /*! \overload Returns a reference to the child item whose QName (qualified name) is \a key, regardless of the qualified name's URI. If no item exists with this key, an empty QtSoapType is returned. */ QtSoapType &QtSoapType::operator [](const QString & /* key */) { static QtSoapType NIL; return NIL; } /*! \overload Returns a reference to the child item at ordinal position \a pos. If no item exists at this position, returns an empty QtSoapType. */ const QtSoapType &QtSoapType::operator [](int /* pos */) const { static QtSoapType NIL; return NIL; } /*! \overload Returns a reference to the child item whose QName (qualified name) is \a key. If no item exists with this key, returns an empty QtSoapType. */ const QtSoapType &QtSoapType::operator [](const QtSoapQName & /* key */) const { static QtSoapType NIL; return NIL; } /*! \overload Returns a reference to the child item whose QName (qualified name) is \a key, regardless of the qualified name's URI. If no item exists with this key, returns an empty QtSoapType. */ const QtSoapType &QtSoapType::operator [](const QString & /* key */) const { static QtSoapType NIL; return NIL; } /*! Attempts to interpret \a node as a QtSoapType, and returns true if successful. This base implementation always returns false. */ bool QtSoapType::parse(QDomNode /* node */) { return false; } /*! \overload Constructs an empty one dimensional QtSoapArray whose element type is undefined. The first insert will decide what type of elements the array can contain. */ QtSoapArray::QtSoapArray() : QtSoapType(QtSoapQName(), Array), arrayType(Other), order(1) { lastIndex = 0; siz0 = 0; siz1 = 0; siz2 = 0; siz3 = 0; siz4 = 0; } /*! Constructs an empty QtSoapArray whose QName (qualified name) is \a name, that contains elements of type \a type, and whose dimensions are given by \a size0, \a size1, \a size2, \a size3 and \a size4. To construct a one dimensional array of size 5, set \a size0 = 5. To create a two dimensional array of size 5x10, set \a size0 = 5 and \a size1 = 10. The maximum dimension of a QtSoapArray is 5. */ QtSoapArray::QtSoapArray(const QtSoapQName &name, QtSoapType::Type type, int size0, int size1, int size2, int size3, int size4) : QtSoapType(name, Array), lastIndex(0), arrayType(type), siz0(size0), siz1(size1), siz2(size2), siz3(size3), siz4(size4) { if (size4 != -1) order = 5; else if (size3 != -1) order = 4; else if (size2 != -1) order = 3; else if (size1 != -1) order = 2; else order = 1; } /*! Create a QtSoapArray that is a copy of \a copy. */ QtSoapArray::QtSoapArray(const QtSoapArray ©) : QtSoapType(copy) { *this = copy; } /*! Destructs the QtSoapArray. */ QtSoapArray::~QtSoapArray() { } /*! Clears the contents, and the dimensions of the QtSoapArray. */ void QtSoapArray::clear() { array.clear(); lastIndex = 0; arrayType = Other; siz0 = siz1 = siz2 = siz3 = siz4 = 0; order = -1; } /*! Makes this QtSoapArray a copy of \a copy. */ QtSoapArray &QtSoapArray::operator = (const QtSoapArray ©) { if (this == ©) return *this; t = copy.t; errorStr = copy.errorStr; i = copy.i; n = copy.n; u = copy.u; h = copy.h; lastIndex = copy.lastIndex; order = copy.order; siz0 = copy.siz0; siz1 = copy.siz1; siz2 = copy.siz2; siz3 = copy.siz3; siz4 = copy.siz4; array = copy.array; return *this; } /*! Appends the QtSoapType \a item to the end of this array, which must be one dimensional. \sa insert() */ void QtSoapArray::append(QtSoapType *item) { if (order != 1) { qWarning("Attempted to insert item at position (%i) in %i-dimensional QtSoapArray.", lastIndex, order); return; } if (array.count() == 0) { array.insert(0, item); } else { array.insert(lastIndex + 1, item); ++lastIndex; } } /*! Inserts the QtSoapType \a item at the absolute position \a pos in the array. Note that this function can be used to insert items into arrays with any number of dimensions. If the array is one dimensional, then \a pos is simply the index position in the array. But if the array is multi-dimensional then \a pos is the absolute position. For example, if we have a two dimensional array [['a', 'b'], ['c', 'd'], ['e', 'f']], the element at position 0 is 'a', at position 1 is 'b', at position 2 is 'c', and so on. (There are other insert() overloads that allow for each dimension to be specified individually.) */ void QtSoapArray::insert(int pos, QtSoapType *item) { if (arrayType == Other) arrayType = item->type(); if (item->type() != arrayType) { qWarning("Attempted to insert item of type \"%s\" in QtSoapArray of type \"%s\".", item->typeName().toLatin1().constData(), QtSoapType::typeToName(arrayType).toLatin1().constData()); return; } if (order == -1) order = 1; else if (order == 1 && pos > lastIndex) lastIndex = pos; array.insert(pos, item); } /*! \overload Insert the QtoSoapType \a item at position \a pos0 x \a pos1 in a two dimensional array. */ void QtSoapArray::insert(int pos0, int pos1, QtSoapType *item) { if (order != 2) { qWarning("Attempted to insert item at position (%i, %i)" " in %i-dimensional QtSoapArray.", pos0, pos1, order); return; } if (pos0 < 0 || pos0 >= siz0 || pos1 < 0 || pos1 >= siz1) { qWarning("Attempted to insert item at position (%i, %i)" " when range of QtSoapArray is (0..%i, 0..%i)", pos0, pos1, siz0 - 1, siz1 - 1); return; } insert((pos0 * siz1) + pos1, item); } /*! \overload Insert the QtoSoapType \a item at position \a pos0 x \a pos1 x \a pos2 in a three dimensional array. */ void QtSoapArray::insert(int pos0, int pos1, int pos2, QtSoapType *item) { if (order != 3) { qWarning("Attempted to insert item at position (%i, %i, %i)" " in %i-dimensional QtSoapArray.", pos0, pos1, pos2, order); return; } if (pos0 < 0 || pos0 >= siz0 || pos1 < 0 || pos1 >= siz1 || pos2 < 0 || pos2 >= siz2) { qWarning("Attempted to insert item at position (%i, %i, %i)" " when range of QtSoapArray is (0..%i, 0..%i, 0..%i)", pos0, pos1, pos2, siz0 - 1, siz1 - 1, siz2 - 1); return; } insert((pos0 * siz2 * siz1) + (pos1 * siz2) + pos2, item); } /*! \overload Insert the QtoSoapType \a item at position \a pos0 x \a pos1 x \a pos2 x \a pos3 in a four dimensional array. */ void QtSoapArray::insert(int pos0, int pos1, int pos2, int pos3, QtSoapType *item) { if (order != 4) { qWarning("Attempted to insert item at position (%i, %i, %i, %i)" " in %i-dimensional QtSoapArray.", pos0, pos1, pos2, pos3, order); return; } insert((pos0 * siz3 * siz2 * siz1) + (pos1 * siz3 * siz2) + (pos2 * siz3) + pos3, item); } /*! \overload Insert the QtoSoapType \a item at position \a pos0 x \a pos1 x \a pos2 x \a pos3 x \a pos4 in a five dimensional array. */ void QtSoapArray::insert(int pos0, int pos1, int pos2, int pos3, int pos4, QtSoapType *item) { if (order != 5) { qWarning("Attempted to insert item at position (%i, %i, %i, %i, %i)" " in %i-dimensional QtSoapArray.", pos0, pos1, pos2, pos3, pos4, order); return; } insert((pos0 * siz4 * siz3 * siz2 * siz1) + (pos1 * siz4 * siz3 * siz2) + (pos2 * siz4 * siz3) + (pos3 * siz4) + pos4, item); } /*! \internal Given the size and dimensions of the array, generates a string used to represent the array in XML. For example, a 1-dimensional array of size 5 would get [5], a 2-dimensional array of size 5x10 would get [5,10]. */ QString QtSoapArray::arraySizeString() const { QString arraySize = "["; if (siz0 != -1) { arraySize += QString::number(siz0); if (order > 1) arraySize += "," + QString::number(siz1); if (order > 2) arraySize += "," + QString::number(siz2); if (order > 3) arraySize += "," + QString::number(siz3); if (order > 4) arraySize += "," + QString::number(siz4); } arraySize += "]"; return arraySize; } /*! \internal Recursively inspects the items and any child arrays' items to generate the aggregate type of items in this array. It the array contains ints, returns "int[5]", but if the array is of arrays of arrays of ints, the function returns "int[][][5]". */ QString QtSoapArray::arrayTypeString() const { if (arrayType != Array) return QtSoapType::typeToName(arrayType); QString atString; QtSoapArray *ar = const_cast(this); do { if (ar->count() == 0) break; atString += ar->arraySizeString(); QtSoapArrayIterator it(*const_cast(this)); if (it.data()->type() != Array) break; ar = (QtSoapArray *)it.data(); } while (ar); QtSoapArrayIterator it(*const_cast(this)); if (ar->count() == 0) atString = QtSoapSimpleType::typeToName(Int) + atString; else atString = it.data()->typeName() + atString; return atString; } /*! Returns the QDomElement representation of this QtSoapArray. The returned QDomElement is created using \a doc. */ QDomElement QtSoapArray::toDomElement(QDomDocument doc) const { QString prefix = QtSoapNamespaces::instance().prefixFor(n.uri()); QDomElement a = n.uri() == "" ? doc.createElement( n.name()) : doc.createElementNS(n.uri(), prefix + ":" + n.name()); QString schemaprefix = QtSoapNamespaces::instance().prefixFor(XML_SCHEMA_INSTANCE); a.setAttributeNS(XML_SCHEMA_INSTANCE, schemaprefix + ":type", "xsd:Array"); QString encprefix = QtSoapNamespaces::instance().prefixFor(SOAPv11_ENCODING); a.setAttributeNS(SOAPv11_ENCODING, encprefix + ":arrayType", "xsd:" + arrayTypeString()); for (QtSoapArrayIterator i(*const_cast(this)); !i.atEnd(); ++i) { QDomElement item = i.data()->toDomElement(doc); item.setTagName("item"); int pos0, pos1, pos2, pos3, pos4; i.pos(&pos0, &pos1, &pos2, &pos3, &pos4); QString position = "[" + QString::number(pos0); if (order > 1) position += "," + QString::number(pos1); if (order > 2) position += "," + QString::number(pos2); if (order > 3) position += "," + QString::number(pos3); if (order > 4) position += "," + QString::number(pos4); position += "]"; QString envprefix = QtSoapNamespaces::instance().prefixFor(SOAPv11_ENVELOPE); item.setAttributeNS(SOAPv11_ENVELOPE, envprefix + ":position", position); a.appendChild(item); } return a; } /*! \reimp For this class, always returns true. */ bool QtSoapArray::isValid() const { return true; } /*! Inspects \a node and builds the content of the QtSoapArray if \a node qualifies as a SOAP array. Returns true if it does; otherwise returns false. */ bool QtSoapArray::parse(QDomNode node) { if (node.isNull() || !node.isElement()) return false; QDomElement e = node.toElement(); QDomAttr typeattr = e.attributeNode("type"); if (!typeattr.isNull() && (localName(typeattr.value()).toLower() != "array")) return false; QDomNodeList children = e.childNodes(); int c = children.count(); array.clear(); // ### array.resize(c); int pos = 0; for (int i = 0; i < c; ++i) { QDomNode n = children.item(i); if (n.isComment()) continue; if (!n.isElement()){ // ### An error in the soap document. return false; } QDomElement elem = n.toElement(); QtSmartPtr type = QtSoapTypeFactory::instance().soapType(elem); if (!type.ptr()) { // ### An error in the soap document. return false; } // ### Check namespace QDomAttr posattr = elem.attributeNode("position"); if (!posattr.isNull()) pos = posattr.value().toInt(); array.insert(pos, type); ++pos; } setName(QtSoapQName(localName(e.tagName()), e.namespaceURI())); return true; } /*! Returns the number of items in the array. Note that this is not the same as the size of the array, because the array may be sparse. */ int QtSoapArray::count() const { return array.count(); } /*! Returns a reference to the item at ordinal position \a pos. If there is no item at position \a pos, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::operator [](int pos) { return at(pos); } /*! \overload Returns a reference to the child item whose local name is \a s. If there is no item with this local name, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::operator [](const QString &s) { return QtSoapType::operator[](s); } /*! \overload Returns a reference to the child item whose QName (qualified name) is \a s. If there is no item with this name, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::operator [](const QtSoapQName &s) { return QtSoapType::operator[](s); } /*! \overload Returns a reference to the item at ordinal position \a pos. If there is no item at position \a pos, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::operator [] (int pos) const { return at(pos); } /*! \overload Returns a reference to the child item whose local name is \a s. If there is no item with this local name, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::operator [](const QString &s) const { return QtSoapType::operator[](s); } /*! \overload Returns a reference to the child item whose QName (qualified name) is \a s. If there is no item with this name, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::operator [](const QtSoapQName &s) const { return QtSoapType::operator[](s); } /*! Returns a reference to the item at ordinal position \a pos. If there is no item at position \a pos, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::at(int pos) { static QtSoapType NIL; if (array.find(pos) != array.end()) return *array[pos]; else return NIL; } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 in a two dimensional array. If there is no such item, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::at(int pos0, int pos1) { return at(pos0 * siz1 + pos1); } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 x \a pos2 in a three dimensional array. If there is no such item, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::at(int pos0, int pos1, int pos2) { return at((pos0 * siz2 * siz1) + (pos1 * siz2) + pos2); } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 x \a pos2 x \a pos3 in a four dimensional array. If there is no such item, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::at(int pos0, int pos1, int pos2, int pos3) { return at((pos0 * siz3 * siz2 * siz1) + (pos1 * siz3 * siz2) + (pos2 * siz3) + pos3); } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 x \a pos2 x \a pos3 x \a pos4 in a five dimensional array. If there is no such item, returns an empty QtSoapType. */ QtSoapType &QtSoapArray::at(int pos0, int pos1, int pos2, int pos3, int pos4) { return at((pos0 * siz4 * siz3 * siz2 * siz1) + (pos1 * siz4 * siz3 * siz2) + (pos2 * siz4 * siz3) + (pos3 * siz4) + pos4); } /*! \overload Returns a reference to the item at ordinal position \a pos. If there is no item at position \a pos, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::at(int pos) const { static QtSoapType NIL; if (array.find(pos) != array.end()) return *array[pos]; else return NIL; } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 in a two dimensional array. If there is no such item, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::at(int pos0, int pos1) const { return at(pos0 * siz1 + pos1); } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 x \a pos2 in a three dimensional array. If there is no such item, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::at(int pos0, int pos1, int pos2) const { return at((pos0 * siz2 * siz1) + (pos1 * siz2) + pos2); } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 x \a pos2 x \a pos3 in a four dimensional array. If there is no such item, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::at(int pos0, int pos1, int pos2, int pos3) const { return at((pos0 * siz3 * siz2 * siz1) + (pos1 * siz3 * siz2) + (pos2 * siz3) + pos3); } /*! \overload Returns a reference to the item at ordinal position \a pos0 x \a pos1 x \a pos2 x \a pos3 x \a pos4 in a five dimensional array. If there is no such item, returns an empty QtSoapType. */ const QtSoapType &QtSoapArray::at(int pos0, int pos1, int pos2, int pos3, int pos4) const { return at((pos0 * siz4 * siz3 * siz2 * siz1) + (pos1 * siz4 * siz3 * siz2) + (pos2 * siz4 * siz3) + (pos3 * siz4) + pos4); } /*! Constructs a QtSoapArrayIterator on \a array, initializing the iterator to point to the first element. */ QtSoapArrayIterator::QtSoapArrayIterator(QtSoapArray &array) : it(array.array.begin()), arr(&array) { } /*! Constructs a QtSoapArrayIterator that is a copy of \a copy. */ QtSoapArrayIterator::QtSoapArrayIterator(const QtSoapArrayIterator ©) : it(copy.it), arr(copy.arr) { } /*! Returns false if this iterator points to an item in the array, otherwise true. */ bool QtSoapArrayIterator::atEnd() const { return (it == arr->array.end()); } /*! Assignment operator of QtSoapArrayIterator. Makes this iterator a copy of \a copy. */ QtSoapArrayIterator &QtSoapArrayIterator::operator =(const QtSoapArrayIterator ©) { it = copy.it; arr = copy.arr; return *this; } /*! Destructs the QtSoapArrayIterator. */ QtSoapArrayIterator::~QtSoapArrayIterator() { } /*! \overload Returns the ordinal position of the iterator. Works for arrays of any dimension, but is only useful for one dimensional arrays. */ int QtSoapArrayIterator::pos() const { return it.key(); } /*! Populates the arguments \a pos0, \a pos1, \a pos2, \a pos3 and \a pos4 with the coordinate of the current position of the iterator. For a one dimensional array, only \a pos0 is populated. For a two dimensional array, \a pos0 and \a pos1 are populated, and so on. Any of the arguments that are 0-pointers are ignored. */ void QtSoapArrayIterator::pos(int *pos0, int *pos1, int *pos2, int *pos3, int *pos4) const { const int key = it.key(); switch (arr->order) { case 1: if (pos0) *pos0 = key; break; case 2: { const int tmp = key / arr->siz1; if (pos0) *pos0 = tmp; if (pos1) *pos1 = key - (tmp * arr->siz1); } break; case 3: { const int tmp0 = key / (arr->siz2 * arr->siz1); const int tmp1 = key - (tmp0 * (arr->siz2 * arr->siz1)); const int tmp2 = tmp1 / arr->siz2; if (pos0) *pos0 = tmp0; if (pos1) *pos1 = tmp2; if (pos2) *pos2 = tmp1 - (tmp2 * arr->siz2); } break; case 4: { const int tmp0 = key / (arr->siz3 * arr->siz2 * arr->siz1); const int tmp1 = key - (tmp0 * (arr->siz3 * arr->siz2 * arr->siz1)); const int tmp2 = tmp1 / (arr->siz3 * arr->siz2); const int tmp3 = tmp1 - (tmp2 * (arr->siz3 * arr->siz2)); const int tmp4 = tmp3 / arr->siz3; const int tmp5 = tmp3 - (tmp4 * arr->siz3); if (pos0) *pos0 = tmp0; if (pos1) *pos1 = tmp2; if (pos2) *pos2 = tmp4; if (pos3) *pos3 = tmp5; } break; case 5: { const int tmp0 = key / (arr->siz4 * arr->siz3 * arr->siz2 * arr->siz1); const int tmp1 = key - (tmp0 * (arr->siz4 * arr->siz3 * arr->siz2 * arr->siz1)); const int tmp2 = tmp1 / (arr->siz4 * arr->siz3 * arr->siz2); const int tmp3 = tmp1 - (tmp2 * (arr->siz4 * arr->siz3 * arr->siz2)); const int tmp4 = tmp3 / (arr->siz4 * arr->siz3); const int tmp5 = tmp3 - (tmp4 * arr->siz4 * arr->siz3); const int tmp6 = tmp5 / arr->siz3; const int tmp7 = tmp5 - (tmp6 * arr->siz3); if (pos0) *pos0 = tmp0; if (pos1) *pos1 = tmp2; if (pos2) *pos2 = tmp4; if (pos3) *pos3 = tmp6; if (pos4) *pos4 = tmp7; } break; default: break; } } /*! Returns a reference to the item that the iterator is currently pointing to. */ QtSoapType *QtSoapArrayIterator::data() { if (it == arr->array.end()) return 0; return it.value().ptr(); } /*! Returns a reference to the item that the iterator is currently pointing to. */ const QtSoapType *QtSoapArrayIterator::current() const { if (it == arr->array.end()) return 0; return it.value().ptr(); } /*! Moves the iterator position to the next item in the array. */ void QtSoapArrayIterator::operator ++() { ++it; } /*! Returns true if this Iterator's position is not equal to the position of \a j; otherwise returns false. */ bool QtSoapArrayIterator::operator != (const QtSoapArrayIterator &j) const { return it != j.it; } /*! Returns true if this Iterator's position is equal to the position of \a j; otherwise returns false. */ bool QtSoapArrayIterator::operator == (const QtSoapArrayIterator &j) const { return it == j.it; } /*! Constructs an empty QtSoapStruct. */ QtSoapStruct::QtSoapStruct() : QtSoapType(QtSoapQName(), Struct) { } /*! Constructs an empty QtSoapStruct and sets its QName (qualified name) to \a name. */ QtSoapStruct::QtSoapStruct(const QtSoapQName &name) : QtSoapType(name, Struct) { } /*! Constructs a QtSoapStruct that is a copy of \a copy. */ QtSoapStruct::QtSoapStruct(const QtSoapStruct ©) : QtSoapType(copy) { *this = copy; } /*! Destructs the QtSoapStruct. */ QtSoapStruct::~QtSoapStruct() { } /*! Removes all items from the struct. */ void QtSoapStruct::clear() { dict.clear(); } /*! Makes this struct a copy of \a copy. */ QtSoapStruct &QtSoapStruct::operator =(const QtSoapStruct ©) { if (this == ©) return *this; t = copy.t; errorStr = copy.errorStr; i = copy.i; n = copy.n; u = copy.u; h = copy.h; i = copy.i; dict = copy.dict; return *this; } /*! Inserts the QtSoapType \a item into this struct. Any existing item with the same QName (qualified name) will be erased. */ void QtSoapStruct::insert(QtSoapType *item) { dict.append(item); } /*! Generates the QDomElement representation of this struct. The returned QDomElement is created using \a doc. */ QDomElement QtSoapStruct::toDomElement(QDomDocument doc) const { QString prefix = QtSoapNamespaces::instance().prefixFor(n.uri()); QDomElement a = n.uri() == "" ? doc.createElement(n.name()) : doc.createElementNS(n.uri(), prefix + ":" + n.name()); for (QtSoapStructIterator i(*const_cast(this)); i.data(); ++i) a.appendChild(i.data()->toDomElement(doc)); return a; } /*! \reimp */ bool QtSoapStruct::isValid() const { return true; } /*! Inspects \a node and constructs the equivalent QtSoapStruct if \a node qualifies as a SOAP struct. Returns true if it does; otherwise returns false. */ bool QtSoapStruct::parse(QDomNode node) { if (node.isNull() || !node.isElement()) return false; QDomElement e = node.toElement(); QDomNodeList children = e.childNodes(); int c = children.count(); dict.clear(); for (int i = 0; i < c; ++i) { QDomNode n = children.item(i); if (n.isComment()) continue; if (!n.isElement()){ errorStr = "In the struct element " + e.tagName(); errorStr += ", the " + QString::number(i) + "th child "; errorStr += "is not an element."; return false; } QtSmartPtr type = QtSoapTypeFactory::instance().soapType(n.toElement()); if (!type.ptr()) { errorStr = "In the struct element " + e.tagName(); errorStr += ", child #" + QString::number(i) + ", "; errorStr += n.toElement().tagName() + ", was not recognized as a SOAP type."; return false; } dict.append(type); } setName(QtSoapQName(localName(e.tagName()), e.namespaceURI())); return true; } /*! Returns the number of items in this struct. */ int QtSoapStruct::count() const { return dict.count(); } /*! Returns a reference to the item in this struct whose QName (qualified name) is \a key. If no such item exists, an empty QtSoapType is returned. */ QtSoapType &QtSoapStruct::operator [](const QtSoapQName &key) { return at(key); } /*! \overload Returns a reference to the item in this struct whose QName (qualified name) is \a key. If no such item exists, an empty QtSoapType is returned. */ const QtSoapType &QtSoapStruct::operator [](const QtSoapQName &key) const { return at(key); } /*! \overload Returns a reference to the item in this struct whose QName (qualified name) is \a key. If no such item exists, an empty QtSoapType is returned. */ QtSoapType &QtSoapStruct::operator [](const QString &key) { return at(QtSoapQName(key, "")); } /*! \overload Returns a reference to the item in this struct whose QName (qualified name) is \a key. If no such item exists, an empty QtSoapType is returned. */ const QtSoapType &QtSoapStruct::operator [](const QString &key) const { return at(QtSoapQName(key, "")); } /*! \overload Returns a reference to item number \a i in this struct. If no such item exists, an empty QtSoapType is returned. The items are ordered in the sequence in which they were inserted, starting from 0. */ QtSoapType &QtSoapStruct::operator [](int i) { static QtSoapType NIL; if (i < 0 || i >= dict.count()) return NIL; return *dict[i].ptr(); } /*! \overload Returns a reference to item number \a i in this struct. If no such item exists, an empty QtSoapType is returned. The items are ordered in the sequence in which they were inserted, starting from 0. */ const QtSoapType &QtSoapStruct::operator [](int i) const { static QtSoapType NIL; if (i < 0 || i >= dict.count()) return NIL; return *dict[i].ptr(); } /*! Returns a reference to the item in this struct whose QName (qualified name) is \a key. If no such item exists, an empty QtSoapType is returned. */ QtSoapType &QtSoapStruct::at(const QtSoapQName &key) { static QtSoapType NIL; QListIterator > it(dict); while (it.hasNext()) { QtSoapType *ret = it.next().ptr(); if (ret->name() == key) return *ret; } return NIL; } /*! \overload Returns a reference to the item in this struct whose QName (qualified name) is \a key. If no such item exists, an empty QtSoapType is returned. */ const QtSoapType &QtSoapStruct::at(const QtSoapQName &key) const { static QtSoapType NIL; for (QtSoapStructIterator i(*const_cast(this)); i.current(); ++i) if (i.key() == key) return *i.current(); return NIL; } /*! Constructs a QtSoapStructIterator and initializes it to point to the first element in the struct \a s. */ QtSoapStructIterator::QtSoapStructIterator(QtSoapStruct &s) : it(s.dict.begin()), itEnd(s.dict.end()) { } /*! Destructs the QtSoapStructIterator. */ QtSoapStructIterator::~QtSoapStructIterator() { } /*! Returns the QName (qualified name) of the current item. */ QtSoapQName QtSoapStructIterator::key() const { if (it == itEnd) return QtSoapQName(); return (*it)->name(); } /*! Returns a pointer to the current item, or 0 if there is none. */ QtSoapType *QtSoapStructIterator::data() { if (it == itEnd) return 0; return it->ptr(); } /*! Returns a pointer to the current item, or 0 if there is none. */ const QtSoapType *QtSoapStructIterator::current() const { if (it == itEnd) return 0; return it->ptr(); } /*! Moves the iterator to the next item in the struct. */ void QtSoapStructIterator::operator ++() { if (it == itEnd) return; ++it; } /*! Returns true if this iterator's position is not equal to that of \a j; otherwise returns false. */ bool QtSoapStructIterator::operator !=(const QtSoapStructIterator &j) const { return it != j.it; } /*! Returns true if this iterator's position is equal to that of \a j; otherwise returns false. */ bool QtSoapStructIterator::operator ==(const QtSoapStructIterator &j) const { return it == j.it; } /*! Constructs an empty QtSoapSimpleType. */ QtSoapSimpleType::QtSoapSimpleType() { } /*! \overload Constructs an empty QtSoapSimpleType, and sets its QName (qualified name) to \a name. */ QtSoapSimpleType::QtSoapSimpleType(const QtSoapQName &name) : QtSoapType(name) { } /*! \overload Constructs a QtSoapSimpleType of type Int. Sets its QName (qualified name) to \a name and its value to \a n. */ QtSoapSimpleType::QtSoapSimpleType(const QtSoapQName &name, int n) : QtSoapType(name, Int), v(QVariant(n)) { } /*! \overload Constructs a QtSoapSimpleType of type Boolean. Sets its QName (qualified name) to \a name and its value to \a n. \a dummy is an unused variable that should be set to 0; it is needed for older compilers that cannot distinguish between bool and int. */ QtSoapSimpleType::QtSoapSimpleType(const QtSoapQName &name, bool n, int) : QtSoapType(name, Boolean), v(QVariant(n)) { } /*! \overload Constructs a QtSoapSimpleType of type String. Sets its QName (qualified name) to \a name and its value to \a n. */ QtSoapSimpleType::QtSoapSimpleType(const QtSoapQName &name, const QString &n) : QtSoapType(name, String), v(QVariant(n)) { } /*! Constructs a QtSoapSimpleType that is a copy of \a copy. */ QtSoapSimpleType::QtSoapSimpleType(const QtSoapSimpleType ©) : QtSoapType(copy), v(copy.v) { } /*! Destructs the QtSoapSimpleType. */ QtSoapSimpleType::~QtSoapSimpleType() { } /*! Erases the value of this QtSoapSimpleType. */ void QtSoapSimpleType::clear() { v.clear(); } /*! Returns the QDomElement representation of this QtSoapSimpleType. The returned QDomElement is created using \a doc. */ QDomElement QtSoapSimpleType::toDomElement(QDomDocument doc) const { QString prefix = QtSoapNamespaces::instance().prefixFor(n.uri()); QDomElement a = n.uri() == "" ? doc.createElement(n.name()) : doc.createElementNS(n.uri(), prefix + ":" + n.name()); QString schemaprefix = QtSoapNamespaces::instance().prefixFor(XML_SCHEMA_INSTANCE); a.setAttributeNS(XML_SCHEMA_INSTANCE, schemaprefix + ":type", "xsd:" + typeName()); a.appendChild(doc.createTextNode(v.toString())); return a; } /*! \reimp */ bool QtSoapSimpleType::isValid() const { return true; } /*! Makes this QtSoapSimpleType a copy of \a copy. */ QtSoapSimpleType &QtSoapSimpleType::operator =(const QtSoapSimpleType ©) { t = copy.t; errorStr = copy.errorStr; i = copy.i; n = copy.n; u = copy.u; h = copy.h; v = copy.v; return *this; } /*! Inspects \a node and constructs the QtSoapSimpleType content if \a node qualifies as a SOAP simple type. Returns true if it does; otherwise returns false. */ bool QtSoapSimpleType::parse(QDomNode node) { if (node.isNull() || !node.isElement()) return false; QDomElement e = node.toElement(); QDomAttr typeattr = e.attributeNode("type"); QString type = typeattr.isNull() ? QString("string") : localName(typeattr.value()).toLower(); t = QtSoapType::nameToType(type); switch (t) { case Duration: case DateTime: case Time: case Date: case GYearMonth: case GYear: case GMonthDay: case GDay: case GMonth: case Base64Binary: case HexBinary: case AnyURI: case QName: case NOTATION: case String: case NormalizedString: case Token: case Language: case Name: case NMTOKEN: case NCName: case ID: case IDREF: case ENTITY: v = QVariant(e.text()); break; case Float: v = QVariant(e.text().toFloat()); break; case Double: v = QVariant(e.text().toDouble()); break; case Decimal: case Integer: case NonPositiveInteger: case NegativeInteger: case Long: case Int: case Short: case Byte: case NonNegativeInteger: case UnsignedLong: case PositiveInteger: case UnsignedInt: case UnsignedShort: case UnsignedByte: if (e.text() == "" || (e.text() != "" && (e.text()[0].isNumber() || e.text()[0] == '-'))) v = QVariant(e.text().toInt()); else { errorStr = "Type error at element \"" + e.tagName() + "\""; return false; } break; case Boolean: { QString val = e.text().trimmed().toLower(); if (val == "false") v = QVariant(false); else if (val == "true") v = QVariant(true); } break; default: v = e.text(); break; } setName(QtSoapQName(localName(e.tagName()), e.namespaceURI())); return true; } /*! Returns the value of the simple type as a QString. */ QString QtSoapSimpleType::toString() const { return v.toString(); } /*! Returns the value of the simple type as an int. */ int QtSoapSimpleType::toInt() const { return v.toInt(); } /*! Returns the value of the simple type as a bool. */ bool QtSoapSimpleType::toBool() const { return v.toBool(); } /*! Returns the QVariant value of this QtSoapSimpleType. */ QVariant QtSoapSimpleType::value() const { return v; } /*! \class QtSoapMessage qtsoap.h \brief The QtSoapMessage class provides easy access to SOAP messages. With this class, you can create and inspect any SOAP message. There are convenience functions available for generating the most common types of SOAP messages, and any other messages can be constructed manually using addBodyItem(). Use setMethod() and addMethodArgument() to construct a method request. The return value of a method response is available from returnValue(). Use setFaultCode(), setFaultString() and addFaultDetail() to construct a Fault message. To inspect a Fault message, use faultCode(), faultString() and faultDetail(). To add items to the body part of the SOAP message, use addBodyItem(). To add items to the header, use addHeaderItem(). toXmlString() returns a QString XML representation of the SOAP message. clear() resets all content in the message, creating an empty SOAP message. \code QtSoapMessage message; message.setMethod("getTemperature", "http://weather.example.com/temperature"); message.addMethodArgument("city", "Oslo"); // Get the SOAP message as an XML string. QString xml = message.toXmlString(); \endcode QtSoap provides a partial implementation of version 1.1 of the SOAP protocol as defined in \l http://www.w3.org/TR/SOAP/. \list \i Server side SOAP is not supported. \i References to values (id and href attributes) are not supported. \i Arrays support a maximum of five dimensions. \i Namespaces for types are not checked. Only the type names are used. \i The encodingStyle attribute is ignored. The serialization and encoding rules from section 5 in the SOAP v1.1 specification are assumed regardless of the value of the encodingStyle attribute. \i QtSoapType does not have accessors for attributes, which means for example that actor, mustUnderstand and so on are not accessible in headers. \i The SOAP root attribute is not supported. \endlist \sa QtSoapType, QtSoapQName, QtSoapHttpTransport */ /*! \enum QtSoapMessage::FaultCode This enum describes all the supported SOAP Fault codes: \value VersionMismatch The namespace for the Envelope element was unrecognized by the remote SOAP server. This usually means that the remote server does not support version 1.1 of the SOAP protocol. \value MustUnderstand One of the header items in the SOAP message with a "MustUnderstand" attribute was not recognized by the remote server. \value Client An error in the SOAP message or transport prevents further processing by the remote SOAP server. \value Server An error in the remote SOAP server prevents it from processing the SOAP message. \omitvalue Other */ /*! \enum QtSoapMessage::MessageType \value Fault \value MethodRequest \value MethodResponse \value OtherType */ /*! Constructs an empty QtSoapMessage. The message only contains the Envelope element, with no header and no body. */ QtSoapMessage::QtSoapMessage() : type(OtherType), envelope(QtSoapQName("Envelope", SOAPv11_ENVELOPE)) { init(); } /*! Constructs a copy of \a copy. */ QtSoapMessage::QtSoapMessage(const QtSoapMessage ©) : type(copy.type), envelope(copy.envelope), m(copy.m), margs(copy.margs), errorStr(copy.errorStr) { init(); } /*! Destructs a QtSoapMessage. */ QtSoapMessage::~QtSoapMessage() { } /*! \internal Registers the standard SOAP namespaces with prefixes. */ void QtSoapMessage::init() { QtSoapNamespaces::instance().registerNamespace("SOAP-ENV", SOAPv11_ENVELOPE); QtSoapNamespaces::instance().registerNamespace("SOAP-ENC", SOAPv11_ENCODING); QtSoapNamespaces::instance().registerNamespace("xsi", XML_SCHEMA_INSTANCE); QtSoapNamespaces::instance().registerNamespace("xsd", XML_SCHEMA); } /*! Clears the content of the SOAP message. */ void QtSoapMessage::clear() { type = OtherType; envelope.clear(); m = QtSoapQName(); margs.clear(); errorStr = "Unknown error"; } /*! Makes this message a copy of \a copy. */ QtSoapMessage &QtSoapMessage::operator =(const QtSoapMessage ©) { envelope = copy.envelope; m = copy.m; margs = copy.margs; errorStr = copy.errorStr; return *this; } /*! Imports the QDomDocument \a d if it validates as a SOAP message. Any existing message content is replaced. If the import fails, this message becomes a Fault message. Returns true if the import succeeds, otherwise false. */ bool QtSoapMessage::setContent(QDomDocument &d) { if (isValidSoapMessage(d)) { clear(); QDomNode node = d.firstChild(); if (!node.isElement()) node = node.nextSibling(); if (envelope.parse(node)) return true; } return false; } /*! \overload Parses the XML document in \a buffer. Imports the document if it validates as a SOAP message. Any existing message content is replaced. If the import fails, this message becomes a Fault message. Returns true if the import succeeds, otherwise false. */ bool QtSoapMessage::setContent(const QByteArray &buffer) { int errorLine, errorColumn; QString errorMsg; QDomDocument doc; if (!doc.setContent(buffer, true, &errorMsg, &errorLine, &errorColumn)) { QString s; s.sprintf("%s at line %i, column %i", errorMsg.toLatin1().constData(), errorLine, errorColumn); setFaultCode(VersionMismatch); setFaultString("XML parse error"); addFaultDetail(new QtSoapSimpleType(QtSoapQName("ParseError"), s)); return false; } if (!isValidSoapMessage(doc)) return false; QDomNode node = doc.firstChild(); if (!node.isElement()) node = node.nextSibling(); bool res = envelope.parse(node); if (!res) qDebug("QtSoapMessage::setContent(), parsing failed: %s", envelope.errorString().toLatin1().constData()); return res; } /*! Validates the QDomDocument \a candidate using some simple heuristics. Returns true if the document is a valid SOAP message; otherwise returns false. */ bool QtSoapMessage::isValidSoapMessage(const QDomDocument &candidate) { QDomNode tmp = candidate.firstChild(); if (tmp.isNull()) return false; // Skip the initial processing instruction if there is one. Most // likely this isn't actually a processing instruction, but rather // the initial xml declaration (node); fault.insert(new QtSoapSimpleType(QtSoapQName("Faultcode"), codeStr)); } /*! Sets the Fault faultstring of the SOAP Fault message to \a s. */ void QtSoapMessage::setFaultString(const QString &s) { if (type != Fault && type != OtherType) { clear(); type = Fault; } if (!body()[QtSoapQName("Fault", SOAPv11_ENVELOPE)].isValid()) addBodyItem(new QtSoapStruct(QtSoapQName("Fault", SOAPv11_ENVELOPE))); QtSoapType &node = body()[QtSoapQName("Fault", SOAPv11_ENVELOPE)]; QtSoapStruct &fault = reinterpret_cast(node); fault.insert(new QtSoapSimpleType(QtSoapQName("Faultstring"), s)); } /*! Adds the QtSoapType \a detail to the end of the list of faultdetail items in a SOAP Fault message. */ void QtSoapMessage::addFaultDetail(QtSoapType *detail) { if (type != Fault && type != OtherType) { clear(); type = Fault; } if (!body()[QtSoapQName("Fault", SOAPv11_ENVELOPE)].isValid()) addBodyItem(new QtSoapStruct(QtSoapQName("Fault", SOAPv11_ENVELOPE))); QtSoapType &node = body()[QtSoapQName("Fault", SOAPv11_ENVELOPE)]; QtSoapStruct &fault = reinterpret_cast(node); if (!fault[QtSoapQName("Faultdetail", SOAPv11_ENVELOPE)].isValid()) fault.insert(new QtSoapStruct(QtSoapQName("Faultdetail", SOAPv11_ENVELOPE))); QtSoapType &node2 = fault[QtSoapQName("Faultdetail", SOAPv11_ENVELOPE)]; QtSoapStruct &fdetail = reinterpret_cast(node2); fdetail.insert(detail); } /*! Returns the method of a SOAP method request or response as a QtSoapType. */ const QtSoapType &QtSoapMessage::method() const { static QtSoapType NIL; if (body().count() == 0) return NIL; QtSoapStructIterator it(body()); return *it.data(); } /*! Sets the QName (qualified name) of the method to call in a SOAP method request to \a meth. This function \e must be called before calling addMethodArgument(). */ void QtSoapMessage::setMethod(const QtSoapQName &meth) { if (type != MethodRequest && type != OtherType) { clear(); type = MethodRequest; } addBodyItem(new QtSoapStruct(meth)); } /*! \overload Sets the method name to \a name and uri to \a uri. */ void QtSoapMessage::setMethod(const QString &name, const QString &uri) { setMethod(QtSoapQName(name, uri)); } /*! Adds argument \a arg to the list of arguments that are passed in a SOAP method request. \warning setMethod() must be called before calling this function. */ void QtSoapMessage::addMethodArgument(QtSoapType *arg) { if (body().count() == 0) { qWarning("Attempted to add argument (%s:%s) without first setting method", arg->name().uri().toLatin1().constData(), arg->name().name().toLatin1().constData()); return; } QtSoapStructIterator it(body()); QtSoapType &node = *it.data(); QtSoapStruct &meth = static_cast(node); meth.insert(arg); } /*! \overload Adds an argument called \a name with a uri of \a uri. The type of the argument is QtSoapType::String and its value is \a value. */ void QtSoapMessage::addMethodArgument(const QString &name, const QString &uri, const QString &value) { addMethodArgument(new QtSoapSimpleType(QtSoapQName(name, uri), value)); } /*! \overload Adds an argument called \a name with a uri of \a uri. The type of the argument is QtSoapType::Boolean and its value is \a value. The \a dummy argument is used to distinguish this function from the overload which takes an int. */ void QtSoapMessage::addMethodArgument(const QString &name, const QString &uri, bool value, int dummy) { addMethodArgument(new QtSoapSimpleType(QtSoapQName(name, uri), value, dummy)); } /*! \overload Adds an argument called \a name with a uri of \a uri. The type of the argument is QtSoapType::Integer and its value is \a value. */ void QtSoapMessage::addMethodArgument(const QString &name, const QString &uri, int value) { addMethodArgument(new QtSoapSimpleType(QtSoapQName(name, uri), value)); } /*! Constructs a QtSoapTypeFactory and initializes it with all the known SOAP types. */ QtSoapTypeFactory::QtSoapTypeFactory() { QtSoapTypeConstructor *structConstructor = new QtSoapTypeConstructor(); deleteList.append(structConstructor); QtSoapTypeConstructor *arrayConstructor = new QtSoapTypeConstructor(); deleteList.append(arrayConstructor); QtSoapTypeConstructor *basicTypeConstructor = new QtSoapTypeConstructor(); deleteList.append(basicTypeConstructor); registerHandler("struct", structConstructor); registerHandler("array", arrayConstructor); registerHandler("string", basicTypeConstructor); registerHandler("normalizedstring", basicTypeConstructor); registerHandler("token", basicTypeConstructor); registerHandler("language", basicTypeConstructor); registerHandler("name", basicTypeConstructor); registerHandler("ncname", basicTypeConstructor); registerHandler("id", basicTypeConstructor); registerHandler("idref", basicTypeConstructor); registerHandler("entity", basicTypeConstructor); registerHandler("nmtoken", basicTypeConstructor); registerHandler("nmtokens", basicTypeConstructor); registerHandler("boolean", basicTypeConstructor); registerHandler("decimal", basicTypeConstructor); registerHandler("integer", basicTypeConstructor); registerHandler("nonpositiveinteger", basicTypeConstructor); registerHandler("negativeinteger", basicTypeConstructor); registerHandler("int", basicTypeConstructor); registerHandler("long", basicTypeConstructor); registerHandler("short", basicTypeConstructor); registerHandler("byte", basicTypeConstructor); registerHandler("nonnegativeinteger", basicTypeConstructor); registerHandler("unsignedlong", basicTypeConstructor); registerHandler("unsignedint", basicTypeConstructor); registerHandler("unsignedshort", basicTypeConstructor); registerHandler("unsignedbyte", basicTypeConstructor); registerHandler("positiveinteger", basicTypeConstructor); registerHandler("float", basicTypeConstructor); registerHandler("double", basicTypeConstructor); registerHandler("other", structConstructor); } /*! Destructs the QtSoapTypeFactory. This destructor is called when the application exits. */ QtSoapTypeFactory::~QtSoapTypeFactory() { QLinkedList::ConstIterator it = deleteList.begin(); while (it != deleteList.end()) { delete *it; ++it; } } /*! Returns a reference to the QtSoapTypeFactory singleton. */ QtSoapTypeFactory &QtSoapTypeFactory::instance() { static QtSoapTypeFactory factory; return factory; } /*! Registers a handler \a handler for a QtSoapType called \a name. */ bool QtSoapTypeFactory::registerHandler(const QString &name, QtSoapTypeConstructorBase *handler) { if (typeHandlers.find(name) != typeHandlers.end()) { errorStr = "A handler for " + name + " is already registered."; return false; } typeHandlers.insert(name, handler); return true; } /*! \internal */ QtSmartPtr QtSoapTypeFactory::soapType(QDomNode node) const { if (node.isNull() || !node.isElement()) return QtSmartPtr(); QDomElement elem = node.toElement(); QDomAttr attr = elem.attributeNode("type"); QtSoapTypeConstructorBase *constructor = 0; if (!attr.isNull()) { QHash::ConstIterator it; it = typeHandlers.find(localName(attr.value().toLower())); if (it != typeHandlers.end()) constructor = *it; } if (attr.isNull() || !constructor) { QHash::ConstIterator it; if (node.firstChild().isElement()) { if (localName(node.nodeName().toLower()) == "array") { it = typeHandlers.find("array"); } else it = typeHandlers.find("struct"); } else it = typeHandlers.find("string"); if (it != typeHandlers.end()) constructor = *it; } if (!constructor) { return QtSmartPtr(); } QtSoapType *type = constructor->createObject(node); if (!type) errorStr = constructor->errorString(); return QtSmartPtr(type); } /*! Returns a human readable interpretation of the last error that occurred. */ QString QtSoapTypeFactory::errorString() const { return errorStr; } /*! \class QtSoapHttpTransport \brief The QtSoapHttpTransport class provides a mechanism for transporting SOAP messages to and from other hosts using the HTTP protocol. Use this class to submit SOAP messages to a web service. Set the hostname of the SOAP server with setHost(). Some servers also require the SOAPAction header to be set, and you can do this with setAction(). Next, submit the request with submitRequest(), passing the message to submit together with the path that you want to submit the message to. The responseReady() signal is emitted when a response has been received. Call getResponse() to get the reponse from the service. QtSoapHttpTransport usage example: If a SOAP weather service was running on the host weather.example.com, the following code might be used to find the temperature in any given city: \code void WeatherFetcher::findTemperature(const QString &city) { QtSoapMessage message; message.setMethod("getTemperature", "http://weather.example.com/temperature"); message.setMethodArgument("city", "", city); // transport is a private member of WeatherFetcher, of type QtSoapHttpTransport transport.setHost("www.example.com"); connect(&transport, SIGNAL(responseReady()), SLOT(readResponse())); transport.submitRequest(message, "/weatherfetcher/fetch.asp"); } \endcode This is an example implementation of the readResponse() slot in the WeatherFetcher class: \code void WeatherFetcher::readResponse() { const QtSoapMessage &response = transport.getResponse(); if (response.isFault()) { cout << response.faultString().toString().toLatin1().constData() << endl; return; } const QtSoapType &returnValue = response.returnValue(); if (returnValue["temperature"].isValid()) { cout << "The current temperature is " << returnValue["temperature"].toString().toLatin1().constData() << " degrees Celcius." << endl; } \endcode \sa QtSoapMessage, QtSoapType */ /*! \fn void QtSoapHttpTransport::responseReady() This signal is emitted when a SOAP response is received from a remote peer. \sa getResponse() */ /*! \fn void QtSoapHttpTransport::responseReady(const QtSoapMessage &response) This signal is emitted when a SOAP response is received from a remote peer. The received response is available in \a response. This signal is emitted in tandem with the argument-less responseReady() signal. \sa responseReady() */ /*! Constructs a QtSoapHttpTransport object. Passes \a parent to QObject's constructor. */ QtSoapHttpTransport::QtSoapHttpTransport(QObject *parent) : QObject(parent), networkMgr(this) { connect(&networkMgr, SIGNAL(finished(QNetworkReply *)), SLOT(readResponse(QNetworkReply *))); } /*! Destructs a QtSoapHttpTransport. */ QtSoapHttpTransport::~QtSoapHttpTransport() { } /*! \obsolete */ void QtSoapHttpTransport::setHost(const QString &host, int port) { setHost(host, false, port); } /*! Sets the \a host this transport should connect to. The transport mode will be HTTP, unless \a useSecureHTTP is set, in which case it will be HTTPS. This transport will connect to the well-known ports by default (80 for HTTP, 443 for HTTPS), unless a different, non-zero port is specified in \a port. */ void QtSoapHttpTransport::setHost(const QString &host, bool useSecureHTTP, int port) { url.setHost(host); url.setScheme(useSecureHTTP ? QLatin1String("https") : QLatin1String("http")); if (port) url.setPort(port); else url.setPort(useSecureHTTP ? 443 : 80); } /*! Sets the HTTP header SOAPAction to \a action. */ void QtSoapHttpTransport::setAction(const QString &action) { soapAction = action; } /*! Submits the SOAP message \a request to the path \a path on the HTTP server set using setHost(). */ void QtSoapHttpTransport::submitRequest(QtSoapMessage &request, const QString &path) { QNetworkRequest networkReq; networkReq.setHeader(QNetworkRequest::ContentTypeHeader, QLatin1String("text/xml;charset=utf-8")); networkReq.setRawHeader("SOAPAction", soapAction.toAscii()); url.setPath(path); networkReq.setUrl(url); soapResponse.clear(); networkRep = networkMgr.post(networkReq, request.toXmlString().toUtf8().constData()); } /*! Returns the most recently received response SOAP message. This message could be a Fault message, so it is wise to check using QtSoapMessage::isFault() before processing the response. */ const QtSoapMessage &QtSoapHttpTransport::getResponse() const { return soapResponse; } /*! Returns a pointer to the QNetworkAccessManager object used by this transport. This is useful if the application needs to connect to its signals, or set or read its cookie jar, etc. */ QNetworkAccessManager *QtSoapHttpTransport::networkAccessManager() { return &networkMgr; } /*! Returns a pointer to the QNetworkReply object of the current (or last) request, or 0 if no such object is currently available. This is useful if the application needs to access the raw header data etc. */ QNetworkReply *QtSoapHttpTransport::networkReply() { return networkRep; } /*! */ void QtSoapHttpTransport::readResponse(QNetworkReply *reply) { networkRep = reply; switch (reply->error()) { case QNetworkReply::NoError: case QNetworkReply::ContentAccessDenied: case QNetworkReply::ContentOperationNotPermittedError: case QNetworkReply::ContentNotFoundError: case QNetworkReply::UnknownContentError: { soapResponse.setContent(reply->readAll()); int httpStatus = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); if (httpStatus != 200 && httpStatus != 100) { if (soapResponse.faultCode() == QtSoapMessage::Other) soapResponse.setFaultCode(QtSoapMessage::Client); /* QString httpReason = reply->attribute(QNetworkRequest::HttpReasonPhraseAttribute).toString(); soapResponse.setFaultString(QString("HTTP status %2 (%3).\n%1").arg(soapResponse.faultString().toString()).arg(httpStatus).arg(httpReason)); */ } } break; default: { soapResponse.setFaultCode(QtSoapMessage::Client); soapResponse.setFaultString(QString("Network transport error (%1): %2").arg(reply->error()).arg(reply->errorString())); } break; } emit responseReady(); emit responseReady(soapResponse); reply->deleteLater(); } /*! \class QtSoapNamespaces qtsoap.h \brief The QtSoapNamespaces class provides a registry for XML namespaces and prefixes for use in QtSoap. When a QtSoapMessage is converted to XML via QtSoapMessage::toXmlString(), this class is used to find appropriate XML namespace prefixes for the QNames (qualified names) in the message. To register a namespace with a prefix, call register(). prefixFor() will then return the prefix that is registered for the given namespace, if any. To access the QtSoapNamespaces registry, call QtSoapNamespaces::instance(). \code QtSoapNamespaces ®istry = QtSoapNamespaces::instance(); registry.register("pre", "http://www.example.com/"); QString prefix = registry.prefixFor("http://www.example.com/"); // returns "pre" \endcode \sa QtSoapMessage */ /*! Returns a reference to the QtSoapNamespaces singleton. */ QtSoapNamespaces &QtSoapNamespaces::instance() { static QtSoapNamespaces ns; return ns; } /*! \internal Constructs a QtSoapNamespaces object. */ QtSoapNamespaces::QtSoapNamespaces() { } /*! Registers the namespace \a uri with the prefix \a prefix. */ void QtSoapNamespaces::registerNamespace(const QString &prefix, const QString &uri) { namespaces.insert(uri, prefix); } /*! Returns the prefix for the namespace \a uri, or an empty string if no prefix has been registered for \a uri. */ QString QtSoapNamespaces::prefixFor(const QString &uri) { return namespaces.value(uri); } qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapTypeFactory000644 001750 000144 00000000024 12225261330 023571 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapArray000644 001750 000144 00000000024 12225261330 022376 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/qtsoap.h000644 001750 000144 00000036361 12225261330 021742 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 QTSOAP_H #define QTSOAP_H #include #include #include #include #include #include #include #include #if defined(Q_WS_WIN) # if !defined(QT_QTSOAP_EXPORT) && !defined(QT_QTSOAP_IMPORT) # define QT_QTSOAP_EXPORT # elif defined(QT_QTSOAP_IMPORT) # if defined(QT_QTSOAP_EXPORT) # undef QT_QTSOAP_EXPORT # endif # define QT_QTSOAP_EXPORT __declspec(dllimport) # elif defined(QT_QTSOAP_EXPORT) # undef QT_QTSOAP_EXPORT # define QT_QTSOAP_EXPORT __declspec(dllexport) # endif #else # define QT_QTSOAP_EXPORT #endif #define SOAPv11_ENVELOPE "http://schemas.xmlsoap.org/soap/envelope/" #define SOAPv11_ENCODING "http://schemas.xmlsoap.org/soap/encoding/" #define SOAPv11_ACTORNEXT "http://schemas.xmlsoap.org/soap/actor/next" #define XML_SCHEMA "http://www.w3.org/1999/XMLSchema" #define XML_SCHEMA_INSTANCE "http://www.w3.org/1999/XMLSchema-instance" #define XML_NAMESPACE "http://www.w3.org/XML/1998/namespace" template class QtSmartPtr { public: inline QtSmartPtr(T *data = 0) { d = data; r = new int; *r = 1; } inline QtSmartPtr(const QtSmartPtr ©) { if (*copy.r != 0) ++(*copy.r); r = copy.r; d = copy.d; } inline ~QtSmartPtr() { if ((*r) == 0) delete r; else if ((*r) != 0 && --(*r) == 0) { delete r; if (d) delete d; } } inline QtSmartPtr &operator =(const QtSmartPtr ©) { if (*copy.r != 0) ++(*copy.r); if ((*r) == 0) delete r; else if ((*r) != 0 && --(*r) == 0) { delete r; if (d) delete d; } r = copy.r; d = copy.d; return *this; } inline T &operator *() const { return *d; } inline T *operator ->() const { return d; } inline T *ptr() const { return d; } inline T &ref() const { return *d; } inline T *releasedPtr() const { (*r) = 0; return d; } inline bool isNull() const { return d == 0; } private: int *r; T *d; }; class QT_QTSOAP_EXPORT QtSoapQName { public: QtSoapQName(const QString &name = QString::null, const QString &uri = QString::null); ~QtSoapQName(); QtSoapQName &operator =(const QString &s); QString name() const; QString uri() const; private: QString n; QString nuri; }; bool operator ==(const QtSoapQName &n1, const QtSoapQName &n2); bool operator <(const QtSoapQName &n1, const QtSoapQName &n2); class QT_QTSOAP_EXPORT QtSoapType { public: enum Type { Duration, DateTime, Time, Date, GYearMonth, GYear, GMonthDay, GDay, GMonth, Boolean, Base64Binary, HexBinary, Float, Double, AnyURI, QName, NOTATION, String, NormalizedString, Token, Language, Name, NMTOKEN, NCName, ID, IDREF, ENTITY, Decimal, Integer, NonPositiveInteger, NegativeInteger, Long, Int, Short, Byte, NonNegativeInteger, UnsignedLong, PositiveInteger, UnsignedInt, UnsignedShort, UnsignedByte, Array, Struct, Other }; QtSoapType(); QtSoapType(const QtSoapQName &name, Type t = Other); QtSoapType(const QtSoapType ©); QtSoapType &operator =(const QtSoapType ©); virtual ~QtSoapType(); virtual void clear(); virtual bool parse(QDomNode); virtual bool isValid() const; virtual int count() const; virtual QVariant value() const; virtual QtSoapType &operator [](int); virtual QtSoapType &operator [](const QtSoapQName &s); virtual QtSoapType &operator [](const QString &name); virtual const QtSoapType &operator [](int) const; virtual const QtSoapType &operator [](const QtSoapQName &s) const; virtual const QtSoapType &operator [](const QString &name) const; virtual QDomElement toDomElement(QDomDocument) const; virtual Type type() const; virtual QString id() const; virtual QString href() const; virtual QString typeName() const; virtual QtSoapQName name() const; virtual QString toString() const; virtual int toInt() const; virtual bool toBool() const; void setName(const QtSoapQName &); void setId(const QString &); void setHref(const QString &); QString errorString() const; static QString typeToName(QtSoapType::Type t); static Type nameToType(const QString &); protected: Type t; QString errorStr; QString i; QtSoapQName n; QString u; QString h; }; class QtSoapArrayIterator; class QT_QTSOAP_EXPORT QtSoapArray : public QtSoapType { public: QtSoapArray(); QtSoapArray(const QtSoapQName &name, QtSoapType::Type type = Other, int size0 = -1, int size1 = -1, int size2 = -1, int size3 = -1, int size4 = -1); QtSoapArray(const QtSoapArray ©); QtSoapArray &operator = (const QtSoapArray ©); ~QtSoapArray(); void clear(); bool parse(QDomNode node); bool isValid() const; int count() const; QtSoapType &at(int pos0); QtSoapType &at(int pos0, int pos1); QtSoapType &at(int pos0, int pos1, int pos2); QtSoapType &at(int pos0, int pos1, int pos2, int pos3); QtSoapType &at(int pos0, int pos1, int pos2, int pos3, int pos4); QtSoapType &operator [](int i); QtSoapType &operator [](const QString &); QtSoapType &operator [](const QtSoapQName &); const QtSoapType &at(int pos) const; const QtSoapType &at(int pos0, int pos1) const; const QtSoapType &at(int pos0, int pos1, int pos2) const; const QtSoapType &at(int pos0, int pos1, int pos2, int pos3) const; const QtSoapType &at(int pos0, int pos1, int pos2, int pos3, int pos4) const; const QtSoapType &operator [](int i) const; const QtSoapType &operator [](const QString &) const; const QtSoapType &operator [](const QtSoapQName &) const; void append(QtSoapType *item); void insert(int pos0, QtSoapType *item); void insert(int pos0,int pos1, QtSoapType *item); void insert(int pos0,int pos1,int pos2, QtSoapType *item); void insert(int pos0,int pos1,int pos2,int pos3, QtSoapType *item); void insert(int pos0,int pos1,int pos2,int pos3,int pos4, QtSoapType *item); QDomElement toDomElement(QDomDocument doc) const; friend class QtSoapArrayIterator; protected: QString arraySizeString() const; QString arrayTypeString() const; QHash > array; int lastIndex; private: Type arrayType; int order; int siz0, siz1, siz2, siz3, siz4; }; class QT_QTSOAP_EXPORT QtSoapArrayIterator { public: QtSoapArrayIterator(QtSoapArray &); QtSoapArrayIterator(const QtSoapArrayIterator ©); QtSoapArrayIterator &operator =(const QtSoapArrayIterator &j); ~QtSoapArrayIterator(); int pos() const; void pos(int *pos0, int *pos1 = 0, int *pos2 = 0, int *pos3 = 0, int *pos4 = 0) const; QtSoapType *data(); const QtSoapType *current() const; void operator ++(); bool operator !=(const QtSoapArrayIterator &j) const; bool operator ==(const QtSoapArrayIterator &j) const; bool atEnd() const; private: QHash >::Iterator it; QtSoapArray *arr; }; class QtSoapStructIterator; class QT_QTSOAP_EXPORT QtSoapStruct : public QtSoapType { public: QtSoapStruct(); QtSoapStruct(const QtSoapQName &name); QtSoapStruct(const QtSoapStruct ©); QtSoapStruct &operator =(const QtSoapStruct ©); ~QtSoapStruct(); void clear(); bool parse(QDomNode node); bool isValid() const; int count() const; QtSoapType &at(const QtSoapQName &key); const QtSoapType &at(const QtSoapQName &key) const; QtSoapType &operator [](int); QtSoapType &operator [](const QtSoapQName &key); QtSoapType &operator [](const QString &key); const QtSoapType &operator [](int) const; const QtSoapType &operator [](const QtSoapQName &key) const; const QtSoapType &operator [](const QString &key) const; void insert(QtSoapType *item); QDomElement toDomElement(QDomDocument doc) const; friend class QtSoapStructIterator; protected: QList > dict; }; class QT_QTSOAP_EXPORT QtSoapStructIterator { public: QtSoapStructIterator(QtSoapStruct &); ~QtSoapStructIterator(); QtSoapQName key() const; QtSoapType *data(); const QtSoapType *current() const; void operator ++(); bool operator !=(const QtSoapStructIterator &j) const; bool operator ==(const QtSoapStructIterator &j) const; private: QList >::Iterator it; QList >::Iterator itEnd; }; class QT_QTSOAP_EXPORT QtSoapSimpleType : public QtSoapType { public: QtSoapSimpleType(); QtSoapSimpleType(const QtSoapQName &name); QtSoapSimpleType(const QtSoapQName &name, int n); QtSoapSimpleType(const QtSoapQName &name, bool n, int dummy); QtSoapSimpleType(const QtSoapQName &name, const QString &n); QtSoapSimpleType(const QtSoapSimpleType ©); QtSoapSimpleType &operator =(const QtSoapSimpleType ©); ~QtSoapSimpleType(); void clear(); bool parse(QDomNode node); bool isValid() const; QString toString() const; int toInt() const; bool toBool() const; QVariant value() const; QDomElement toDomElement(QDomDocument doc) const; protected: QVariant v; }; class QT_QTSOAP_EXPORT QtSoapMessage { friend class QtSoapHttpServer; public: QtSoapMessage(); QtSoapMessage(const QtSoapMessage ©); ~QtSoapMessage(); QtSoapMessage &operator =(const QtSoapMessage ©); bool setContent(const QByteArray &buffer); bool setContent(QDomDocument &d); void addBodyItem(QtSoapType *); void addHeaderItem(QtSoapType *); // Method and response const QtSoapType &method() const; const QtSoapType &returnValue() const; void setMethod(const QtSoapQName &); void setMethod(const QString &name, const QString &url = QString::null); void addMethodArgument(QtSoapType *); void addMethodArgument(const QString &uri, const QString &name, const QString &value); void addMethodArgument(const QString &uri, const QString &name, bool value, int dummy); void addMethodArgument(const QString &uri, const QString &name, int value); // Fault enum FaultCode { VersionMismatch, MustUnderstand, Client, Server, Other }; bool isFault() const; FaultCode faultCode() const; const QtSoapType &faultString() const; const QtSoapType &faultDetail() const; void setFaultCode(FaultCode code); void setFaultString(const QString &fstring); void addFaultDetail(QtSoapType *detail); // Generating void clear(); QString toXmlString(int indent = 0) const; // Errors QString errorString() const; protected: enum MessageType { Fault, MethodRequest, MethodResponse, OtherType }; bool isValidSoapMessage(const QDomDocument &candidate); QtSoapStruct &body() const; QtSoapStruct &header() const; void init(); private: MessageType type; mutable QtSoapStruct envelope; QtSoapQName m; QtSoapStruct margs; QString errorStr; }; class QT_QTSOAP_EXPORT QtSoapTypeConstructorBase { public: inline QtSoapTypeConstructorBase() { } virtual inline ~QtSoapTypeConstructorBase() { } virtual QtSoapType *createObject(QDomNode) = 0; virtual QString errorString() const = 0; }; template class QT_QTSOAP_EXPORT QtSoapTypeConstructor : public QtSoapTypeConstructorBase { public: QtSoapTypeConstructor() { } QtSoapType *createObject(QDomNode node) { T *t = new T(); if (t->parse(node)) { return t; } else { errorStr = t->errorString(); delete t; return 0; } } QString errorString() const { return errorStr; } private: mutable QString errorStr; }; class QT_QTSOAP_EXPORT QtSoapTypeFactory { private: QtSoapTypeFactory(); public: ~QtSoapTypeFactory(); static QtSoapTypeFactory &instance(); bool registerHandler(const QString &name, QtSoapTypeConstructorBase *handler); QtSmartPtr soapType(QDomNode node) const; QString errorString() const; private: mutable QString errorStr; QHash typeHandlers; QLinkedList deleteList; }; class QT_QTSOAP_EXPORT QtSoapNamespaces { public: void registerNamespace(const QString &prefix, const QString &uri); QString prefixFor(const QString &ns); static QtSoapNamespaces &instance(); private: QMap namespaces; QtSoapNamespaces(); }; class QT_QTSOAP_EXPORT QtSoapHttpTransport : public QObject { Q_OBJECT public: QtSoapHttpTransport(QObject *parent = 0); ~QtSoapHttpTransport(); void setHost(const QString &host, bool useSecureHTTP = false, int port = 0); void setHost(const QString &host, int port); //obsolete void setAction(const QString &action); void submitRequest(QtSoapMessage &request, const QString &path); const QtSoapMessage &getResponse() const; QNetworkAccessManager *networkAccessManager(); QNetworkReply *networkReply(); Q_SIGNALS: void responseReady(); void responseReady(const QtSoapMessage &response); private Q_SLOTS: void readResponse(QNetworkReply *reply); private: QNetworkAccessManager networkMgr; QPointer networkRep; QUrl url; QString soapAction; QtSoapMessage soapResponse; }; #endif qlandkartegt-1.7.5/3rdparty/qtsoap/CMakeLists.txt000644 001750 000144 00000001107 12225261330 023010 0ustar00oeichlerusers000000 000000 project(qtsoap) # Required cmake version cmake_minimum_required(VERSION 2.6.0) set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib) find_package(Qt4 REQUIRED) include(${QT_USE_FILE}) set(SRCS qtsoap.cpp ) set(HDRS qtsoap.h ) set(UIS ) set(RCS ) qt4_wrap_cpp(MOC_SRCS ${HDRS}) qt4_wrap_ui(UI_HDRS ${UIS}) qt4_add_resources(RC_SRCS ${RCS}) include_directories( ) link_directories( ${CMAKE_BINARY_DIR}/lib ) add_library(qtsoap ${SRCS} ${HDRS} ${UI_HDRS} ${RC_SRCS} ${MOC_SRCS} ${QM_FILES} ) target_link_libraries( qtsoap ${QT_LIBRARIES} ) qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapHttpTransport000644 001750 000144 00000000024 12225261330 024154 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/examples/easter/easter.h000644 001750 000144 00000004340 12225261330 025007 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 EASTER_H #define EASTER_H #include class Easter : public QObject { Q_OBJECT public: Easter(short year, QObject *parent = 0); private slots: void getResponse(const QtSoapMessage &); private: QtSoapHttpTransport http; int year; }; #endif qlandkartegt-1.7.5/3rdparty/qtsoap/examples/easter/easter.pro000644 001750 000144 00000000215 12225261330 025355 0ustar00oeichlerusers000000 000000 TEMPLATE = app INCLUDEPATH += . CONFIG += console include(../../src/qtsoap.pri) # Input HEADERS += easter.h SOURCES += main.cpp easter.cpp qlandkartegt-1.7.5/3rdparty/qtsoap/examples/easter/easter.cpp000644 001750 000144 00000006174 12225261330 025351 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 "easter.h" Easter::Easter(short year, QObject *parent) : QObject(parent), http(this) { connect(&http, SIGNAL(responseReady(const QtSoapMessage &)), this, SLOT(getResponse(const QtSoapMessage &))); QtSoapMessage request; request.setMethod("GetEaster", "http://www.27seconds.com/Holidays/US/Dates/"); request.addMethodArgument("year", "", year); http.setHost("www.27seconds.com"); http.setAction("http://www.27seconds.com/Holidays/US/Dates/GetEaster"); http.submitRequest(request, "/Holidays/US/Dates/USHolidayDates.asmx"); qDebug("Looking up the date of easter in %i...", year); this->year = year; } void Easter::getResponse(const QtSoapMessage &message) { if (message.isFault()) { qDebug("Error: %s", qPrintable(message.faultString().toString())); } else { QString res = message.returnValue().toString(); QDateTime dt = QDateTime::fromString(res, Qt::ISODate); if (dt.isValid()) res = QLocale::c().toString(dt.date()); qDebug("Easter is: %s", res.toLatin1().constData()); } QCoreApplication::quit(); } qlandkartegt-1.7.5/3rdparty/qtsoap/examples/easter/main.cpp000644 001750 000144 00000004721 12225261330 025006 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 example shows QtSoap with a SOAP::Lite web service. Returns the date of easter in a given year. */ #include #include #include #include "easter.h" int main(int argc, char **argv) { if (argc < 2) { qDebug("XMethods' interface to Easter Dates with a SOAP::Lite service."); qDebug("usage: %s ", argv[0]); qDebug(" "); return 1; } QCoreApplication app(argc, argv); Easter easter(atoi(argv[1]), 0); return app.exec(); } qlandkartegt-1.7.5/3rdparty/qtsoap/examples/google/google.qdoc000644 001750 000144 00000005167 12225261330 025500 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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." ** ****************************************************************************/ /*! \page google-example.html \title Using SOAP with the Google API This example shows how to use the SOAP component to submit searches via the Google SOAP API. Testing this example requires a valid license key, which is available for free from http://api.google.com/. \raw HTML
\endraw examples/google/google.h: \quotefile google.h \raw HTML
\endraw examples/google/google.cpp: \quotefile google.cpp \raw HTML
\endraw examples/google/main.cpp: \quotefile ../google/main.cpp \raw HTML
\endraw examples/google/google.pro: \quotefile google.pro */ qlandkartegt-1.7.5/3rdparty/qtsoap/examples/google/google.pro000644 001750 000144 00000000173 12225261330 025342 0ustar00oeichlerusers000000 000000 TEMPLATE = app INCLUDEPATH += . include(../../src/qtsoap.pri) # Input HEADERS += google.h SOURCES += google.cpp main.cpp qlandkartegt-1.7.5/3rdparty/qtsoap/examples/google/google.cpp000644 001750 000144 00000017454 12225261330 025336 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 "google.h" Google::Google(QWidget *parent) : QWidget(parent), http(this) { // Generate the GUI. quitButton = new QPushButton("&Quit", this); searchString = new QLineEdit(this); resultView = new QTextBrowser(this); QVBoxLayout *layout = new QVBoxLayout(this); QLabel *gLabel = new QLabel("Google Web APIs license key: ", this); googleKey = new QLineEdit(this); QHBoxLayout *topBar = new QHBoxLayout(); topBar->addWidget(gLabel); topBar->addWidget(googleKey); layout->addLayout(topBar); QLabel *sLabel = new QLabel("Search string: ", this); QPushButton *searchButton = new QPushButton("Search!", this); QHBoxLayout *searchBar = new QHBoxLayout(); searchBar->addWidget(sLabel); searchBar->addWidget(searchString); searchBar->addWidget(searchButton); layout->addLayout(searchBar); layout->addWidget(resultView); layout->addWidget(quitButton); // Connect signals to slots. Note the submitRequest() slots. connect(&http, SIGNAL(responseReady()), SLOT(getResponse())); connect(quitButton, SIGNAL(clicked()), SLOT(close())); connect(searchString, SIGNAL(returnPressed()), SLOT(submitRequest())); connect(searchButton, SIGNAL(clicked()), SLOT(submitRequest())); connect(googleKey, SIGNAL(returnPressed()), SLOT(submitRequest())); // Pressing enter should trigger a search, unless focus has been // explicitly moved. searchButton->setDefault(true); // Prepare to submit request. http.setAction("urn:GoogleSearchAction"); http.setHost("api.google.com"); } void Google::submitRequest() { // Check that the license key is set. if (googleKey->text() == "") { QMessageBox::warning(this, tr("Missing license key"), tr("Please enter your Google Web APIs license key." " If you do not have one, you can visit
" " http://api.google.com/ and create a Google" " account to obtain a license key.")); return; } // Check that we have a search string. if (searchString->text() == "") { QMessageBox::warning(this, tr("Missing search string"), tr("Please enter a search string.")); return; } // Generate request. Details about how to generate a proper // request are available from http://api.google.com/. The results // are always fetched as latin1 in this example, but this can be // easily changed (see the "ie" and "oe" arguments below). QtSoapMessage request; request.setMethod(QtSoapQName("doGoogleSearch", "urn:GoogleSearch")); request.addMethodArgument("key", "", googleKey->text()); request.addMethodArgument("q", "", searchString->text()); request.addMethodArgument("start", "", 0); request.addMethodArgument("maxResults", "", 10); request.addMethodArgument("filter", "", false, 0); request.addMethodArgument("restrict", "", ""); request.addMethodArgument("safeSearch", "", false, 0); request.addMethodArgument("lr", "", ""); request.addMethodArgument("ie", "", "latin1"); request.addMethodArgument("oe", "", "latin1"); // Submit the method request to the web service. http.submitRequest(request, "/search/beta2"); // Set the cursor to wait mode. QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); } void Google::getResponse() { // Set cursor back to normal shape. QApplication::restoreOverrideCursor(); // Reset resultView. resultView->clear(); // Get the response, check for error. const QtSoapMessage &resp = http.getResponse(); if (resp.isFault()) { resultView->setHtml(tr("Query failed: ") + resp.faultString().value().toString()); return; } // Extract the return value from this method response, check for // errors. const QtSoapType &res = resp.returnValue(); if (!res.isValid()) { resultView->append(tr("Invalid return value")); return; } // Generate resultView output. Make it resemble the actual web // output from http://www.google.com/. QString header(tr("Searched the web for %1, results %2 - %3 " "of about %4. Search took %5 seconds.

") .arg(res["searchQuery"].toString()) .arg(res["startIndex"].toInt()) .arg(res["endIndex"].toInt()) .arg(res["estimatedTotalResultsCount"].toInt()) .arg(res["searchTime"].value().toDouble(), 0, 'f', 2)); const QtSoapType &resultElements = res["resultElements"]; QString allElements; for (int i = 0; i < resultElements.count(); ++i) { const QtSoapType &resultElement = res["resultElements"][i]; QString cat = resultElement["directoryCategory"]["fullViewableName"].toString(); QString summary = resultElement["summary"].toString(); QString title = resultElement["title"].toString(); QString snippet = resultElement["snippet"].toString(); QString url = resultElement["URL"].toString(); QString cachedSize = resultElement["cachedSize"].toString(); QString thisElement = "
"; if (!title.isEmpty()) { thisElement += "" + title + "
"; } else { thisElement += "" + url + "
"; } if (!snippet.isEmpty()) thisElement += snippet + "
"; if (!summary.isEmpty()) { thisElement += "Description: " + summary + "
"; } if (!cat.isEmpty()) { thisElement += "Category: " + cat + "
"; } if (!title.isEmpty()) { thisElement += "" + url + " - " + cachedSize + "
"; } allElements += thisElement; } // Update the resultView. resultView->setHtml(header + allElements); } qlandkartegt-1.7.5/3rdparty/qtsoap/examples/google/google.h000644 001750 000144 00000004722 12225261330 024775 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 GOOGLE_H_INCLUDED #define GOOGLE_H_INCLUDED #include #include class QLineEdit; class QTextBrowser; class QPushButton; class Google : public QWidget { Q_OBJECT public: Google(QWidget *parent = 0); private slots: void submitRequest(); void getResponse(); private: QtSoapHttpTransport http; QLineEdit *searchString; QLineEdit *googleKey; QTextBrowser *resultView; QPushButton *quitButton; QPushButton *searchButton; QString key; }; #endif qlandkartegt-1.7.5/3rdparty/qtsoap/examples/google/main.cpp000644 001750 000144 00000004202 12225261330 024771 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 "google.h" int main(int argc, char **argv) { QApplication app(argc, argv); Google google; google.show(); return app.exec(); } qlandkartegt-1.7.5/3rdparty/qtsoap/examples/population/population.h000644 001750 000144 00000004331 12225261330 026625 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 POPULATION_H #define POPULATION_H #include class Population : public QObject { Q_OBJECT public: Population(const QString &country, QObject *parent = 0); private slots: void getResponse(); private: QtSoapHttpTransport http; }; #endif qlandkartegt-1.7.5/3rdparty/qtsoap/examples/population/population.pro000644 001750 000144 00000000215 12225261330 027173 0ustar00oeichlerusers000000 000000 TEMPLATE = app INCLUDEPATH += . CONFIG += console include(../../src/qtsoap.pri) HEADERS += population.h SOURCES += main.cpp population.cpp qlandkartegt-1.7.5/3rdparty/qtsoap/examples/population/population.cpp000644 001750 000144 00000007100 12225261330 027155 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 "population.h" Population::Population(const QString &country, QObject *parent) : QObject(parent), http(this) { // Connect the HTTP transport's responseReady() signal. connect(&http, SIGNAL(responseReady()), this, SLOT(getResponse())); // Construct a method request message. QtSoapMessage request; // Set the method and add one argument. request.setMethod("getPopulation", "http://www.abundanttech.com/WebServices/Population"); request.addMethodArgument("strCountry", "", country); // Submit the request the the web service. http.setHost("www.abundanttech.com"); http.setAction("http://www.abundanttech.com/WebServices/Population/getPopulation"); http.submitRequest(request, "/WebServices/Population/population.asmx"); qDebug("Looking up population of %s...", country.toLatin1().constData()); } void Population::getResponse() { // Get a reference to the response message. const QtSoapMessage &message = http.getResponse(); // Check if the response is a SOAP Fault message if (message.isFault()) { qDebug("Error: %s", message.faultString().value().toString().toLatin1().constData()); } else { // Get the return value, and print the result. const QtSoapType &response = message.returnValue(); qDebug("%s has a population of %s (last updated at %s)", response["Country"].value().toString().toLatin1().constData(), response["Pop"].value().toString().toLatin1().constData(), response["Date"].value().toString().toLatin1().constData()); } qApp->quit(); } qlandkartegt-1.7.5/3rdparty/qtsoap/examples/population/main.cpp000644 001750 000144 00000005171 12225261330 025715 0ustar00oeichlerusers000000 000000 /**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of a Qt Solutions component. ** ** You may use this file under the terms of the BSD license as follows: ** ** "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 Nokia Corporation and its Subsidiary(-ies) 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 example shows QtSoap with a .NET web service. Gets the US Census Bureau population from any of 227 countries, the daily world population estimate, and the list of available countries. */ #include #include "population.h" #define USAGE1 QT_TRANSLATE_NOOP("Population::main", "XMethods' interface to a World Population .NET service.") #define USAGE2 QT_TRANSLATE_NOOP("Population::main", "usage: %s ") int main(int argc, char **argv) { if (argc < 2) { qDebug(USAGE1); qDebug(USAGE2, argv[0]); qDebug(" "); return 1; } QApplication app(argc, argv, false); Population pop(argv[1], 0); return app.exec(); } qlandkartegt-1.7.5/3rdparty/qtsoap/examples/examples.pro000644 001750 000144 00000000067 12225261330 024432 0ustar00oeichlerusers000000 000000 TEMPLATE = subdirs SUBDIRS = google population easter qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapTypeConstructor000644 001750 000144 00000000024 12225261330 024507 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/qtsoap.pri000644 001750 000144 00000000575 12225261330 022303 0ustar00oeichlerusers000000 000000 include(../common.pri) INCLUDEPATH += $$PWD DEPENDPATH += $$PWD QT += xml network qtsoap-uselib:!qtsoap-buildlib { LIBS += -L$$QTSOAP_LIBDIR -l$$QTSOAP_LIBNAME } else { SOURCES += $$PWD/qtsoap.cpp HEADERS += $$PWD/qtsoap.h } win32 { contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSOAP_EXPORT else:qtsoap-uselib:DEFINES += QT_QTSOAP_IMPORT } qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapStruct000644 001750 000144 00000000024 12225261330 022604 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapQName000644 001750 000144 00000000024 12225261330 022321 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapStructIterator000644 001750 000144 00000000024 12225261330 024316 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapType000644 001750 000144 00000000024 12225261330 022241 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/qtsoap/QtSoapArrayIterator000644 001750 000144 00000000024 12225261330 024110 0ustar00oeichlerusers000000 000000 #include "qtsoap.h" qlandkartegt-1.7.5/3rdparty/getopt/CGetOpt.h000644 001750 000144 00000010140 12225261330 021716 0ustar00oeichlerusers000000 000000 /********************************************************************** * Copyright (c) 2003, 2004, froglogic Porten & Stadlbauer GbR * 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 froglogic 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 GETOPT_H #define GETOPT_H #include #include #include class CGetOpt { public: CGetOpt(); CGetOpt( int offset ); CGetOpt( int argc, char *argv[] ); CGetOpt( const QStringList &a ); QString appName() const { return aname; } // switch (no arguments) void addSwitch( const QString &lname, bool *b ); void addSwitch( char sname, const QString &lname, bool *b ); // options (with arguments, sometimes optional) void addOption( char s, const QString &l, QString *v ); void addVarLengthOption( const QString &l, QStringList *v ); void addRepeatableOption( char s, QStringList *v ); void addRepeatableOption( const QString &l, QStringList *v ); void addOptionalOption( const QString &l, QString *v, const QString &def ); void addOptionalOption( char s, const QString &l, QString *v, const QString &def ); // bare arguments void addArgument( const QString &name, QString *v ); void addOptionalArgument( const QString &name, QString *v ); void addOptionalArguments( const QString &name, QStringList *v ); bool parse( bool untilFirstSwitchOnly ); bool parse() { return parse( false ); } bool isSet( const QString &name ) const; int currentArgument() const { return currArg; } private: enum OptionType { OUnknown, OEnd, OSwitch, OArg1, OOpt, ORepeat, OVarLen }; struct Option; friend struct Option; struct Option { Option( OptionType t = OUnknown, char s = 0, const QString &l = QString::null ) : type( t ), sname( s ), lname( l ), boolValue( 0 ) { } OptionType type; char sname; // short option name (0 if none) QString lname; // long option name (null if none) union { bool *boolValue; QString *stringValue; QStringList *listValue; }; QString def; }; QList